Obsah:

Programování Micro: Bit Robot & Joystick: Bit Controller s MicroPython: 11 kroků
Programování Micro: Bit Robot & Joystick: Bit Controller s MicroPython: 11 kroků

Video: Programování Micro: Bit Robot & Joystick: Bit Controller s MicroPython: 11 kroků

Video: Programování Micro: Bit Robot & Joystick: Bit Controller s MicroPython: 11 kroků
Video: 5 Years of Coding in under a Minute #shorts 2024, Listopad
Anonim
Programování Micro: Bit Robot & Joystick: Bit Controller s MicroPython
Programování Micro: Bit Robot & Joystick: Bit Controller s MicroPython

Na Robocampu 2019, našem letním robotickém táboře, mladí lidé ve věku 10-13 let pájí, programují a staví „antweight robot“na bázi micro: bit na bázi BBC a také programují micro: bit, který se používá jako dálkové ovládání.

Pokud jste právě na Robocampu, přejděte ke kroku 3, protože první dva kroky jsme provedli ve skupině

Toto je podrobný průvodce k získání mikro: bitového robota, který komunikuje pomocí ovladače joystick: bit.

Aby vše fungovalo, nezabere to nejrychlejší cestu, ale zkouší věci po malých částech, abyste mohli kód testovat za pochodu, dát mu vlastní razítko a pochopit, proč děláme věci, které děláme !

Pro tuto aktivitu používáme vlastního robota, ale bude fungovat s jakýmkoli robotem s podobným ovladačem motoru, jako je L9110s.

Soubory návrhů pro našeho robota najdete zde:

Tato příručka je napsána pro začátečníky, ale pokud jste nikdy předtím nepoužívali micro: bit s MicroPythonem, doporučujeme nejprve vyzkoušet jednodušší program, jako je náš odznak s názvem Instructable: https://www.instructables.com/id/Felt -Microbit-Nam…

Zásoby

2x BBC micro: bit

Robot, který pracuje s BBC micro: bitem (viz vysvětlení výše)

joystick: bitový ovladač (ten náš máme od Cool Components)

Krok 1: Nastavení robota

Máte několik možností pro psaní kódu MicroPython pro váš micro: bit:

  • Mu, který si můžete stáhnout a nainstalovat zde:
  • Online editor, který najdete zde:

Tyto pokyny předpokládají, že používáte Mu

Otevřete Mu a zapojte micro: bit do počítače. Mu by měl rozpoznat, že používáte mikro: bit, a vybrat mikro: bit „Režim“, ale pokud tomu tak není, změňte to ručně.

vyberte režim
vyberte režim

Získejte kopii testovacího kódu motoru robota odtud:

Pokud nejste na Github zvyklí, může to být neintuitivní! Dva snadné způsoby, jak tento kód získat, jsou:

  1. Uložte surový soubor do počítače a poté jej načtěte do Mu:
  2. Zkopírujte a vložte celý daný kód do nového souboru v Mu.
uložit surový soubor
uložit surový soubor

Nyní klikněte na tlačítko 'Flash' na liště nástrojů Mu a odešlete svůj nový kód na micro: bit.

To nebude fungovat, pokud není zapojen micro: bit

Na zadní straně mikro: bitu začne blikat žluté světlo. Po dokončení byl váš kód přenesen.

NASTAVENÍ SMĚRŮ MOTORU

Tento program zapne motory v různých směrech, když stisknete tlačítko 'A' na mikro: bitu.

Co chcete, aby se stalo:

  • Když se zobrazí 'A', levý motor vpřed
  • Když se zobrazí 'B', levý motor dozadu
  • Když se zobrazí 'C', pravý motor vpřed
  • Když se zobrazí 'D', pravý motor dozadu

Pravděpodobně tomu tak nebude, protože záleží na tom, jak jste svého robota zapojili!

V horní části kódu najdete seznam proměnných, které určují, který pin na mikro: bitu ovládá, kterým směrem motoru.

Pokud používáte některého z našich robotů (souborů), prohoďte názvy proměnných, aby se robot pohyboval správnými směry:

swap pin variables
swap pin variables

Pokud používáte vlastního robota, zkontrolujte před úpravou kódu, ke kterým kolíkům je připojen ovladač motoru.

TESTOVÁNÍ DISKU

Nyní zkontrolujte, jak váš robot jezdí, nahrazením testovacího kódu v hlavní smyčce nějakým vlastním kódem.

Robotu řeknete, aby řídil, zavoláním funkce drive (). To vyžaduje dva argumenty - hodnotu pro levý motor a hodnotu pro pravé motory mezi 0 (vypnuto) a 1023 (maximální rychlost).

Voláním pohonu (500, 500) například řeknete oběma motorům, aby se zapnuly, ve směru dopředu, přibližně poloviční rychlostí.

Vyzkoušejte několik možností, abyste získali představu o tom, jak přímo jede a jak dobře zatáčí.

Nápověda: testy motoru byly jak ve smyčce True, tak v příkazu if - motory se neotáčejí, dokud nestisknete tlačítko A na mikro: bitu, a neustále kontroluje, zda jste stiskli tlačítko A.

Tip: motory se nevypnou, dokud jim to neřeknete! Vždy budou pokračovat v posledním pokynu.

VOLITELNÉ: ZLEPŠENÍ JÍZDY V PŘÍMÉ LINE

Pokud váš robot nepojede po přímce, jeden z vašich motorů se může otáčet rychleji než druhý.

Po kontrole, zda nic fyzicky nebrání tomu, aby se kolo volně otáčelo, můžete upravit kód ve funkci pohonu a snížit tak otáčky rychlejšího motoru.

Přejděte nahoru, abyste našli definici funkce pohonu, a podívejte se na dva nejlepší pokyny:

def pohon (L, R):

# Níže je úprava, která má opravit nesoulad otáček motoru L = int (L*1) R = int (R*1)

Tyto dva řádky aktuálně nabývají hodnoty L a R, vynásobte je 1 a poté se ujistěte, že jsou stále celá čísla (int).

Pokud je váš levý motor například rychlejší, změňte *1 na jeho řádku na *0,9 a zjistěte, zda to věci zlepšuje.

Nedokážete to udělat dokonalým, ale můžete pokračovat v úpravách, dokud to nepůjde rovněji.

NASTAVENÍ RÁDIA

Nyní nastavte rádio přidáním následujících řádků do horní části kódu:

importovat rádio

radio.config (kanál = 7, skupina = 0, fronta = 1) radio.on ()

To umožní vašemu robotu přijímat pokyny z jiného mikro: bitu, ale v tuto chvíli bude přijímat pokyny z jakéhokoli jiného mikro: bitu.

Důvodem je, že kanál 7 a skupina 0 jsou výchozí kanály.

Změňte tato čísla výběrem kanálu mezi 0-82 a skupiny mezi 0-255. Nyní bude váš micro: bit přijímat pokyny pouze od ostatních se stejnými konfiguračními informacemi.

queue = 1 znamená, že mikro: bit uchová vždy jen jednu příchozí zprávu - to poskytuje o něco rychlejší dobu odezvy než výchozí, což je 3.

Nyní musíte upravit kód své hlavní smyčky, abyste místo spouštění pokynů při stisknutí tlačítka čekali na příchozí rozhlasovou zprávu a odpovídajícím způsobem reagovali.

Vyzkoušejte následující kód jako test (nic neudělá, dokud nenastavíte joystick v kroku 2):

zatímco pravda:

message = radio.receive () if message == 'forward': drive (500, 500)

Krok 2: Nastavení joysticku

Odpojte robot: micro: bit a místo toho zapojte micro: bit svého joysticku

Získejte kopii kódu pro nastavení joysticku zde:

Nastavte rádio pomocí stejné konfigurace (číslo kanálu a skupiny) jako u robota - umožní vám to mezi sebou komunikovat.

Na konci programu spusťte hlavní smyčku:

zatímco pravda:

if button_a.was_pressed (): radio.send ('forward')

Tento kód ještě nepoužívá joystick: bit. K odeslání zprávy používá tlačítko A na mikro: bitu.

Ujistěte se, že váš robot i řídicí jednotka micro: bits mají energii, a poté stisknutím tlačítka odešlete zprávu.

Pokud je zpráva úspěšně přijata a váš robot se pohybuje … dobře! Dokončili jste pokyny k nastavení.

TIPY PRO ODSTRAŇOVÁNÍ PROBLÉMŮ

Pokud se vám na ovladači zobrazí chybová zpráva micro: bit … ladění kódu ovladače

Pokud se na vašem robotu zobrazí chybová zpráva micro: bit … vaše rádiová zpráva byla úspěšně odeslána! Robot to však nedokáže pochopit, proto zkontrolujte, zda se shodují zprávy, které jste poslali, a zprávy, které jste robotovi řekli.

Pokud se vůbec nic nestane

  • Ujistěte se, že jste do každého micro: bitu vložili správný kód - je snadné omylem bliknout nesprávný!
  • Zajistěte, aby se čísla vašeho kanálu a skupiny shodovala na každém mikro: bitu

Krok 3: Kontrola hodnot joysticku

Dalších několik kroků je pomocí kódu ovladače

Než budete moci používat joystick na ovladači, musíte vědět, jaké hodnoty získáte, když stisknete páčku.

Nahraďte hlavní smyčku následujícím kódem: Replace your main loop with the following code:

zatímco pravda:

joystick = joystick_push () tisk (joystick) spánek (500)

Vložte tento kód na svůj micro: bit a poté klikněte na tlačítko REPL na liště nástrojů Mu. Tím se ve spodní části editoru otevře terminál, který vám poskytne odkaz na micro: bit v reálném čase.

otevřete REPL
otevřete REPL

To nebude fungovat, pokud není zapojen micro: bit

Když je REPL otevřený, stiskněte tlačítko reset na zadní straně vašeho micro: bitu.

obraz
obraz

Měli byste vidět, jak některé hodnoty přivedou na obrazovku „vytištěné“:

hodnoty v terminálu
hodnoty v terminálu

Stiskněte páčku joysticku a uvidíte, co se stane s čísly.

Poznamenejte si hodnoty uvedené, když je joystick ve střední poloze - v mém případě (518, 523).

Opětovným kliknutím na tlačítko REPL na liště nástrojů Mu jej zavřete - nový kód nebudete moci blikat na micro: bit, když je otevřený.

Krok 4: Nastavení proměnných X a Y

Chcete změnit hodnoty dané funkcí joysticku, aby:

  • uprostřed je nula
  • nahoru je pozitivní
  • dolů je negativní.

To odpovídá pokynům, které robot potřebuje - kladné číslo pro jízdu vpřed a záporné číslo pro jízdu vzad.

Podívejte se na čísla, která jste dostali v posledním kroku. První číslo je x a druhé číslo je y.

Upravte definici joystick_push (), která je již v programu, a odečtěte své hodnoty od originálu:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 návrat x, y

Použijte svá vlastní čísla, mohou se lišit od mých

Nahrajte svůj nový kód, otevřete REPL, stiskněte resetovací tlačítko micro: bit a zkontrolujte své hodnoty.

Dostáváte (0, 0)?

Krok 5: Převod X a Y na hodnoty pro levý a pravý motor

V tuto chvíli nebude tento joystick příliš užitečný k řízení robota. Při úplném posunutí vpřed získáte hodnotu, jako je (0, 500).

Pokud byste robotovi dali tato čísla, zapnul by pravý motor, ale ne levý, což se vám stát nechce!

Tento diagram ukazuje, co se stane s hodnotami x a y, když pohybujete joystickem, a co chceme, aby robot dělal, když pohybujete joystickem.

diagram
diagram

K smíchání hodnot x a y musíte použít nějakou matematiku, abyste získali něco užitečnějšího.

n

MATHY

Začněme tím, že joystick zatlačíme úplně dopředu.

Příklad hodnot, které můžete získat, je:

x = 0

y = 500

Abyste byli robotovi užiteční, chcete získat hodnoty jako tyto:

vlevo = 500

vpravo = 500

Zkusme přidat x a y různými způsoby, abychom zjistili, jaká čísla dostaneme:

x + y = 0 + 500 = 500

x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500

Nyní se podívejme, co se stane, když joystick zatlačíme úplně doprava.

Příklad hodnot, které můžete získat, je:

x = 500

y = 0

Aby robot zabočil doprava, chcete, aby levý motor jel dopředu a pravý motor dozadu:

vlevo = 500

vpravo = -500

Vyzkoušejte náš vzorec znovu:

x + y = 500 + 0 = 500

x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500

Porovnejte dvě sady vzorců a zjistěte, která možnost vám poskytne správnou levou hodnotu a která možnost vám poskytne správnou správnou hodnotu.

Zkuste to s některými hodnotami, které získáte z vlastního joysticku, abyste se ujistili, že vámi zvolený vzorec funguje po celou dobu.

n

ROZŠÍŘENÍ FUNKCE JOYSTICK

Rozbalte a upravte funkci joysticku a vytvořte dvě nové proměnné vlevo a vpravo a vraťte tyto hodnoty místo xay:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 vlevo = vpravo = návrat vlevo, vpravo

Nahrajte nový kód, otevřete REPL, stiskněte resetovací tlačítko micro: bit a zkontrolujte své hodnoty.

Dostáváte hodnoty, které očekáváte?

Pokud potřebujete další pomoc, podívejte se na náš ukázkový kód zde:

Krok 6: Odeslání hodnot jako rozhlasových zpráv

Nyní máte připraveny nějaké hodnoty, které můžete odeslat svému robotovi.

Upravte svou hlavní smyčku tak, aby zkontrolovala hodnoty joysticku, ale místo aby je vytiskla, připraví je k odeslání jako rozhlasové zprávy.

zatímco pravda:

joystick = joystick_push () message = str (joystick [0]) + "" + str (joystick [1])

To ještě ve skutečnosti zprávu neodesílá!

Co se děje v tomto novém řádku kódu?

  • joystick [0] znamená první bit informací, které vycházejí z funkce joysticku (vlevo)
  • joystick [1] je další bit informací (vpravo)
  • str () převádí obě tato čísla do řetězcového formátu (místo čísel text) - je to nutné k odeslání informací přes rádio.

Budete zvyklí na to, že + znamená sčítání - může sčítat čísla dohromady a spojovat řetězce, což znamená, že spojí dva bity informací dohromady.

Příklad:

150 + 100 = 250

str (150) + str (100) = 150100

Zřetězení tedy spojí vaše levé a pravé hodnoty dohromady.

Chcete -li vynutit oddělení mezi dvěma bity informací (aby robot věděl, že jsou to dva bity informací), spojte mezi nimi řetězec navíc pomocí „“. Řečové značky kolem mezery znamenají, že se již jedná o řetězec.

Nakonec rozšířte svůj kód a odešlete tuto nově vytvořenou zprávu přes rádio:

radio.send (zpráva)

spát (10)

Spánek zpomaluje odesílání zpráv, takže přijímací micro: bit není přetížen příliš mnoha informacemi!

Než přejdete k dalšímu kroku, zašifrujte tento kód na micro: bit a ladění případných chyb

Krok 7: Příjem zpráv na vašem robotu

Vraťte se ke kódu robota od začátku - nezapomeňte odpojit mikroprocesor ovladače, abyste na něj omylem nezapojili kód robota

Přejděte dolů do hlavní smyčky - odeberte testovací kód a místo toho přidejte tento:

zatímco pravda:

message = radio.receive () print (message) sleep (100)

Tím nastavíte proměnnou rovnou příchozí zprávě a vytisknete zprávu na REPL - abyste zkontrolovali, že zprávy přicházejí podle očekávání.

Blikejte novým kódem připojeným k REPL a poté stiskněte joystick.

Měli byste dostat něco takového:

Hodnoty REPL
Hodnoty REPL

TIPY PRO ODSTRAŇOVÁNÍ PROBLÉMŮ

Pokud se vám na ovladači zobrazí chybová zpráva micro: bit … ladění kódu ovladače

Pokud se na vašem robotu zobrazí chybová zpráva micro: bit … vaše rádiová zpráva byla úspěšně odeslána! Robot to však nemůže pochopit, proto zkontrolujte, zda se shodují zprávy, které jste poslali, a zprávy, které jste robotovi řekli.

Pokud se vůbec nic nestane

  • Ujistěte se, že jste na každý micro: bit vložili správný kód - je snadné omylem bliknout nesprávný!
  • Zajistěte, aby se čísla vašeho kanálu a skupiny shodovala na každém mikro: bitu

Krok 8: Použití příchozích zpráv k ovládání motorů robota

Nyní dostáváte přes rádio dvě čísla jako řetězec.

Tuto zprávu musíte rozdělit na dva řetězce, poté je znovu převést na čísla a předat je do funkce pohonu. Hodně se děje najednou!

Než to provedete, musíte zkontrolovat, zda je zpráva, kterou přijímáte, ve správném formátu.

Pokud nejsou odesílány žádné zprávy, obdržíte místo toho „Žádný“. Pokud to zkusíte rozdělit, zobrazí se chybová zpráva.

zatímco pravda:

message = radio.receive () pokud zpráva není None: message = message.split () drive (int (message [0]), int (message [1]))

Co se tady děje?

  • Nový kód se spustí, pokud je zpráva cokoli jiného než 'Žádný'.
  • message.split () zkontroluje, zda je ve zprávě mezera (kterou jsme přidali v posledním kroku), a použije ji k rozdělení zprávy na dvě části.
  • int (zpráva [0]), int (zpráva [1]) dělá opak toho, co jsme dělali v předchozím kroku - získá každou informaci samostatně a převede ji na celé číslo (celé číslo).
  • int (zpráva [0]) se používá jako hodnota pro levý motor ve funkci pohonu a int (zpráva [1]) se používá jako hodnota pro pravý motor.

Zkontrolujte, zda funguje - otáčejí se motory při stisknutí joysticku?

Pokud ne - čas na nějaké ladění!

Pokud ano, fantastické! Máte fungujícího robota na dálkové ovládání!

Věnujte nějaký čas procvičování se svým robotem, než přejdete k dalšímu kroku. Jezdí tak, jak očekáváte?

Následující kroky vám ukážou, jak pomocí tlačítek na joysticku přidat robotovi další funkce

Pokud chcete zatím vidět naši verzi tohoto kódu:

  • Robot:
  • Ovladač:

Krok 9: Používání tlačítek - přijímání dalších zpráv

V tuto chvíli se váš kód pokusí rozdělit jakoukoli zprávu, která není Žádná. To znamená, že pokud obdrží například „ahoj“, zobrazí se chybová zpráva.

Aby váš micro: bit mohl interpretovat jiné zprávy, bude muset nejprve zkontrolovat každou očekávanou zprávu a poté ji rozdělit, pouze pokud jí nebylo řečeno, aby s ní dělal něco jiného.

Rozbalte svůj kód takto:

pokud zpráva není Žádná:

if message == 'hello': display.show (Image. HAPPY) elif message == 'duck': display.show (Image. DUCK) else: message = message.split () drive (int (message [0]), int (zpráva [1]))

Nejprve zkontroluje, zda obdržel zprávu „ahoj“. Pokud ano, zobrazí šťastný obrázek, pak se vraťte zpět na začátek smyčky a zkontrolujte další zprávu.

Pokud zpráva není ahoj, příště zkontroluje, zda je zpráva „kachna“.

Pokud zpráva není „ahoj“NEBO „kachna“, provede poslední věc v seznamu, kterou je rozdělení zprávy a zapnutí motorů. Nebude se pokoušet rozdělit zprávu, pokud obdržela „ahoj“nebo „kachna“, což znamená, že z žádné z těchto dvou zpráv neobdržíte chybovou zprávu.

Znaménko dvojité rovnosti je důležité - znamená „rovná se“ve srovnání s jediným znaménkem rovnosti, které něco nastavuje (takže zpráva = „ahoj“znamená, že proměnnou nastavujeme na „ahoj“, zpráva == „ahoj“znamená, že se ptáme, zda se zpráva rovná 'ahoj').

Vyzkoušejte to prozatím jen se dvěma možnostmi, abyste to otestovali - později můžete přidat tolik dalších zpráv, kolik chcete.

Odkaz na pracovní kód:

Krok 10: Odesílání dalších zpráv pomocí tlačítek ovladače

Odpojte robot: micro: bit a místo toho zapojte micro: bit svého joysticku

Vraťte se zpět ke kódu svého ovladače, který chcete upravit.

Podobně jako u kódu robota chceme, aby ovladač před odesláním hodnot joysticku zkontroloval, zda se pokoušíte odeslat další zprávy.

V horní části smyčky stále chceme, aby zkontroloval aktuální hodnoty joysticku, ale také chceme, aby zkontrolovalo, zda je aktuálně stisknuto tlačítko:

zatímco pravda:

joystick = joystick_push () button = button_press ()

button_press () vrací hodnotu A, B, C, D, E nebo F podle toho, které tlačítko právě stisknete (pokud není stisknuto nic, vrátí None).

Nyní můžeme provést příkaz if-elif-else, jako jsme to udělali pro kód robota-pomocí dvou tlačítek a odeslání hodnoty joysticku, pokud není stisknuto žádné tlačítko.

if button == 'A':

radio.send ('ahoj') sleep (500) elif button == 'B': radio.send ('duck') sleep (500) else: message = str (joystick [0]) + "" + str (joystick [1]) radio.send (zpráva) spánek (10)

Po stisknutí tlačítka odešlete jednu ze zpráv, o kterých jste v předchozím kroku řekli, že si má robot dávat pozor.

Zpráva bude odeslána při každém stisknutí tlačítka a počítače jsou mnohem rychlejší než lidé! Může tedy poslat zprávu mnohokrát, než se vám podaří sundat prst z tlačítka.

Spánek po odeslání zprávy ji zpomalí, takže tlačítko nebude tak rychle znovu kontrolovat - zkuste sem zadat několik čísel, abyste pro vás získali perfektní čas - příliš pomalu a nebude reagovat ani on rychle a váš robot bude přijímat tolik zpráv s tlačítky, že by mohl přestat reagovat na joystick!

Funguje to?

Pokud se vám zobrazují chybové zprávy, dobře si promyslete, co jste právě změnili a co se děje.

Pokud se vám při stisknutí tlačítka na ovladači zobrazí chyba robota - víte, že se zpráva zobrazuje, ale robota je matoucí. Zkontrolujte, že zpráva, kterou jste odeslali, a zpráva, které jste řekli robotovi, aby ji vyhledal, jsou stejné.

Odkaz na pracovní kód:

Krok 11: Další kroky

Nyní máte znalosti, které potřebujete pro práci s motory vašeho robota a s joystickem: bitovým ovladačem

Využijte tyto znalosti ke zlepšení těchto dvou programů a jejich přizpůsobení. Několik nápadů níže!

Na ovladači máte šest tlačítek! Co chcete, aby dělali?

  • Co takhle naprogramovat taneční rutinu, kterou má váš robot dělat na povel? Napište algoritmus příkazů drive (), oddělený příkazy sleep ()!
  • Chcete změnit směr, kterým se robot pohybuje, aby mohl snadno řídit vzhůru nohama? Zamyslete se nad hodnotami x a y joysticku. Co představují a jak byste s nimi mohli manipulovat?
  • Má váš robot (nebo byste mohli přidat!) Další funkce, jako jsou LED diody, reproduktor nebo senzory?

Nápady na vylepšení kódu

  • Mohli byste svému robotu pomoci vyrovnat se s neznámými zprávami pomocí kódu try/kromě kódu?
  • Matematika použitá k výpočtu levé a pravé hodnoty z joysticku nám neposkytuje celý rozsah hodnot (pohon robota může přijmout číslo až 1023). Můžete tento kód upravit, abyste získali lepší dosah?
  • Existují i jiné způsoby míchání hodnot joysticku - můžete přijít s lepším způsobem, jak to udělat?

Doporučuje: