Sadržaj:

Programiranje Micro: Bit robota i joystick: Bit Controller s MicroPythonom: 11 koraka
Programiranje Micro: Bit robota i joystick: Bit Controller s MicroPythonom: 11 koraka

Video: Programiranje Micro: Bit robota i joystick: Bit Controller s MicroPythonom: 11 koraka

Video: Programiranje Micro: Bit robota i joystick: Bit Controller s MicroPythonom: 11 koraka
Video: PLAYSTATION - ТЕЛЕФОН! 2024, Studeni
Anonim
Programiranje Micro: Bit robota i joystick: Bit Controller s MicroPythonom
Programiranje Micro: Bit robota i joystick: Bit Controller s MicroPythonom

Za Robocamp 2019, naš ljetni kamp robotike, mladi ljudi u dobi od 10 do 13 godina lemlje, programiraju i izrađuju 'robote protiv težine' temeljene na BBC-u na mikro: bit, kao i programiraju mikro: bit za korištenje kao daljinski upravljač.

Ako ste trenutno u Robocampu, prijeđite na korak 3, jer smo prva dva koraka učinili kao grupa

Ovo je korak-po-korak vodič za to da mikro: bit robot komunicira s joystick: bit kontrolerom.

Ne treba najbrži put da bi sve funkcioniralo, već isprobava stvari u malim komadima kako biste mogli testirati kôd dok idete, staviti vlastiti pečat na njega i razumjeti zašto radimo stvari koje radimo !

Za ovu aktivnost koristimo vlastiti prilagođeni robot, ali on će raditi sa bilo kojim robotom koji koristi sličan upravljački program motora, poput L9110.

Datoteke dizajna za našeg robota mogu se pronaći ovdje:

Ovaj je vodič napisan za početnike, ali ako nikada prije niste koristili micro: bit s MicroPythonom, preporučujemo da prvo isprobate jednostavniji program, poput naše značke s imenom Instructable: https://www.instructables.com/id/Felt -Microbit-Nam …

Pribor

2x BBC mikro: bit

Robot koji radi s BBC micro: bit (vidi gore objašnjenje)

joystick: bitni kontroler (naš smo dobili od Cool Components)

Korak 1: Postavljanje robota

Imate nekoliko mogućnosti za pisanje MicroPython koda za svoj micro: bit:

  • Mu, koju možete preuzeti i instalirati ovdje:
  • Mrežni uređivač koji možete pronaći ovdje:

Ove upute pretpostavljaju da koristite Mu

Otvorite Mu i priključite svoj micro: bit u računalo. Mu bi trebao prepoznati da koristite micro: bit i odabrati "Mode" micro: bit, ali ako se to ne dogodi, promijenite ga ručno.

odaberite način rada
odaberite način rada

Preuzmite kopiju koda za ispitivanje motora robota odavde:

Ako niste navikli na Github, to može biti neintuitivno! Dva jednostavna načina za dobivanje ovog koda su:

  1. Spremite sirovu datoteku na računalo, a zatim je učitajte u Mu:
  2. Kopirajte i zalijepite sav zadani kôd u novu datoteku u Mu.
spremiti neobrađenu datoteku
spremiti neobrađenu datoteku

Sada kliknite gumb 'Flash' na Muovoj alatnoj traci da biste poslali novi kôd u micro: bit.

Ovo neće raditi ako mikro: bit nije priključen

Žuto svjetlo na stražnjoj strani micro: bita počet će bljeskati. Kada završi, vaš je kôd prebačen.

POSTAVLJANJE SMJERA MOTORA

Ovaj program će uključiti motore u različitim smjerovima kada pritisnete tipku 'A' na micro: bitu.

Ono što želite da se dogodi je:

  • Kad se prikaže 'A', lijevi motor prema naprijed
  • Kad se prikaže 'B', ostavite motor unatrag
  • Kad se prikaže 'C', desni motor prema naprijed
  • Kad se prikaže 'D', motor desno unatrag

To vjerojatno neće biti slučaj jer ovisi o tome kako ste povezali svog robota!

Na vrhu koda pronaći ćete popis varijabli koje određuju koji pin na micro: bit kontrolira smjer motora.

Ako koristite jednog od naših robota (datoteka), zamijenite nazive varijabli kako bi se robot kretao u ispravnim smjerovima:

zamijeni pin varijable
zamijeni pin varijable

Ako koristite vlastitog robota, prije uređivanja koda provjerite na koje je pinove spojen upravljački program motora.

TESTIRANJE POGONA

Sada provjerite kako vaš robot vozi zamjenom testnog koda u glavnoj petlji nekim vlastitim kodom.

Robotu kažete da vozi tako što pozivate funkciju drive (). Za to su potrebna dva argumenta - vrijednost za lijevi motor i vrijednost za desne motore, između 0 (isključeno) i 1023 (maksimalna brzina).

Na primjer, pozivom na pogon (500, 500), govorite da se oba motora uključe, u smjeru naprijed, približno pola brzine.

Isprobajte nekoliko opcija kako biste osjetili koliko ravno vozi i koliko dobro okreće.

Savjet: testovi motora bili su u neko vrijeme u True petlji i u if naredbi - motori se neće okretati sve dok ne pritisnete tipku A na micro: bitu, i zauvijek provjerava jeste li pritisnuli tipku A.

Savjet: motori se neće isključiti dok im to ne kažete! Uvijek će nastaviti izvršavati svoje zadnje upute.

NEOBVEZNO: POBOLJŠANJE VOŽNJE RAVNOM LINIJOM

Ako vaš robot neće voziti ravno, jedan od vaših motora mogao bi se okretati brže od drugog.

Nakon što provjerite da ništa fizički ne sprječava slobodno okretanje kotača, možete urediti kôd u funkciji pogona kako biste smanjili brzinu bržeg motora.

Pomaknite se gore da biste pronašli definiciju funkcije pogona i pogledajte gornje dvije upute:

def pogon (L, R):

# Ispod je prilagodba za ispravljanje razlika u brzini motora L = int (L*1) R = int (R*1)

Ove dvije linije trenutno imaju vrijednost L i R, pomnožite ih s 1, a zatim provjerite jesu li još uvijek cijeli brojevi (int).

Na primjer, ako je vaš lijevi motor brži, promijenite *1 na liniji na *0,9 i provjerite poboljšava li to stvari.

Nećete ga moći učiniti savršenim, ali se možete nastaviti prilagođavati sve dok se ne uspravi.

POSTAVLJANJE RADIJA

Sada postavite radio dodavanjem sljedećih redaka na vrh koda:

uvoz radio

radio.config (kanal = 7, grupa = 0, red = 1) radio.on ()

To će omogućiti vašem robotu da prima upute s drugog micro: bita, ali trenutno će primati upute iz bilo kojeg drugog micro: bita.

To je zato što su kanal 7 i skupina 0 zadani kanali.

Promijenite ove brojeve odabirom kanala između 0-82 i grupe između 0-255. Sada će vaš micro: bit primati samo upute od drugih s istim podacima o konfiguraciji.

queue = 1 znači da će micro: bit zadržati samo jednu dolaznu poruku - to daje nešto brže vrijeme odziva od zadanog, što je 3.

Sada morate urediti kôd glavne petlje kako biste umjesto pokretanja uputa kada pritisnete gumb, pričekali dolaznu radio poruku i na odgovarajući način odgovorili.

Isprobajte sljedeći kôd kao test (neće ništa učiniti dok ne postavite joystick u 2. koraku):

dok je istina:

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

Korak 2: Postavljanje joystick-a

Isključite mikro: bit vašeg robota, a umjesto toga priključite mikro: bit na džojstiku

Preuzmite kopiju koda za postavljanje upravljačke palice odavde:

Postavite radio koristeći istu konfiguraciju (broj kanala i grupe) kao i za robota - to će omogućiti međusobnu komunikaciju.

Na kraju programa pokrenite svoju glavnu petlju:

dok je istina:

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

Ovaj kôd još ne koristi joystick: bit. Za slanje poruke koristi gumb A na micro: bitu.

Uvjerite se da i vaš robot i vaš kontroler micro: bitovi imaju snagu, a zatim pritisnite gumb za slanje poruke.

Ako je poruka uspješno primljena i vaš se robot kreće … bravo! Završili ste s uputama za postavljanje.

SAVJETI ZA RJEŠAVANJE PROBLEMA

Ako dobijete poruku o pogrešci na vašem kontroleru micro: bit … otklonite pogreške u kodu vašeg kontrolera

Ako dobijete poruku o pogrešci na svom robotu micro: bit … vaša je radio poruka uspješno poslana! Ali robot to ne može razumjeti, pa provjerite odgovaraju li poruka koju ste poslali i poruka koju ste rekli robotu da posluša.

Ako se uopće ništa ne dogodi

  • Provjerite jeste li svakom mikro: bit -u ubacili ispravan kôd - lako je slučajno umetnuti pogrešan!
  • Provjerite podudaraju li se brojevi vaših kanala i grupa na svakom mikro: bitu

Korak 3: Provjerite vrijednosti upravljačke palice

Sljedećih nekoliko koraka koristi upravljački kod

Prije nego što možete koristiti joystick na svom kontroleru, morate znati koje vrijednosti dobivate kada pritisnete štapić.

Zamijenite svoju glavnu petlju sljedećim kodom:

dok je istina:

joystick = joystick_push () ispis (joystick) spavanje (500)

Umetnite ovaj kôd u svoj micro: bit, a zatim kliknite gumb REPL na Mu -ovoj alatnoj traci. Ovo će otvoriti terminal na dnu uređivača, koji vam daje vezu u stvarnom vremenu na micro: bit.

otvorite REPL
otvorite REPL

Ovo neće raditi ako mikro: bit nije priključen

Dok je REPL otvoren, pritisnite gumb za poništavanje na stražnjoj strani micro: bita.

Slika
Slika

Trebali biste vidjeti da neke vrijednosti donose "ispisano" na vaš zaslon:

vrijednosti u terminalu
vrijednosti u terminalu

Pritisnite palicu upravljačke palice i pogledajte što će se dogoditi s brojevima.

Zabilježite vrijednosti date kada je upravljačka palica u središnjem položaju - u mom slučaju (518, 523).

Ponovno kliknite gumb REPL na Muovoj alatnoj traci da biste je zatvorili - nećete moći prenijeti novi kôd u micro: bit dok je otvoren.

Korak 4: Podešavanje X i Y varijabli

Želite promijeniti vrijednosti date funkcijom upravljačke palice tako da:

  • u centru je nula
  • gore je pozitivno
  • dolje je negativno.

To odgovara uputama koje su potrebne robotu - pozitivan broj za vožnju naprijed, a negativan broj za vožnju unatrag.

Pogledajte brojeve koje ste dobili u posljednjem koraku. Prvi broj je x, a drugi broj y.

Uredite definiciju joystick_push () koja je već u programu, tako da umanjite vrijednosti iz izvornika:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 return x, y

Koristite vlastite brojeve, oni bi se mogli razlikovati od mojih

Bljesnite svoj novi kôd, otvorite REPL, pritisnite tipku za resetiranje micro: bita i provjerite svoje vrijednosti.

Dobivate li (0, 0)?

Korak 5: Pretvaranje X i Y u vrijednosti za lijevi i desni motor

Trenutno ovaj joystick neće biti od velike koristi za vožnju robotom. Do kraja gurnuti naprijed dobit ćete vrijednost kao što je (0, 500).

Da ste te brojeve dali robotu, on bi uključio desni motor, ali ne i lijevi, što nije ono što želite da se dogodi!

Ovaj dijagram prikazuje što se događa s vrijednostima x i y kad pomaknete joystick, te što želimo da robot učini kad pomaknete joystick.

dijagram
dijagram

Morate upotrijebiti matematiku za miješanje vrijednosti x i y kako biste dobili nešto korisnije.

n

MATEMATIKA

Počnimo gurnuti joystick do kraja naprijed.

Primjer vrijednosti koje biste mogli dobiti je:

x = 0

y = 500

Da biste robotu bili od koristi, želite dobiti vrijednosti poput ovih:

lijevo = 500

desno = 500

Pokušajmo zbrajati x i y na različite načine kako bismo vidjeli koje brojeve dobivamo:

x + y = 0 + 500 = 500

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

Sada da vidimo što će se dogoditi ako joystick pomaknemo do kraja udesno.

Primjer vrijednosti koje biste mogli dobiti je:

x = 500

y = 0

Da bi robot skrenuo udesno, želite da lijevi motor vozi naprijed, a desni da vozi unatrag:

lijevo = 500

desno = -500

Pokušajmo ponovno formulu:

x + y = 500 + 0 = 500

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

Usporedite dva skupa formula kako biste utvrdili koja će vam opcija dati ispravnu lijevu vrijednost, a koja opciju ispravnu desnu vrijednost.

Isprobajte neke od vrijednosti koje dobivate vlastitim upravljačkim palicom kako biste bili sigurni da formula koju odaberete djeluje cijelo vrijeme.

n

PROŠIRENJE JOYSTICK FUNKCIJE

Proširite i uredite funkciju upravljačke palice da napravite dvije nove varijable za lijevu i desnu stranu i da vratite te vrijednosti umjesto x i y:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 lijevo = desno = povratak lijevo, desno

Bljesnite svoj novi kôd, otvorite REPL, pritisnite tipku za resetiranje micro: bita i provjerite svoje vrijednosti.

Dobivate li vrijednosti koje očekujete?

Ako vam je potrebna dodatna pomoć, pogledajte naš primjer koda ovdje:

Korak 6: Slanje vrijednosti kao radio poruka

Sada imate neke vrijednosti spremne za slanje svom robotu.

Uredite svoju glavnu petlju tako da provjerava vrijednosti upravljačke palice, ali umjesto da ispisuje vrijednosti, sprema ih za slanje kao radio poruku.

dok je istina:

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

Ovo zapravo još neće poslati poruku!

Što se događa u ovom novom retku koda?

  • joystick [0] znači prvi dio informacija koji izlazi iz funkcije upravljačke palice (lijevo)
  • joystick [1] je sljedeći bit informacija (desno)
  • str () pretvara oba ova broja u format niza (tekst umjesto brojeva) - to je potrebno za slanje informacija putem radija.

Naviknut ćete vidjeti + da znači zbrajanje - može i zbrajati brojeve i spajati nizove, što znači da će spojiti dva bita informacija.

Primjer:

150 + 100 = 250

str (150) + str (100) = 150100

Tako će spajanje spojiti vaše lijeve i desne vrijednosti zajedno.

Da biste prisilili razdvajanje dva bita informacija (tako da robot zna da su to dva bita informacija), spojite dodatni niz između njih pomoću "". Govorne oznake oko razmaka znače da je to već niz.

Na kraju, proširite svoj kôd za slanje ove novostvorene poruke putem radija:

radio.send (poruka)

spavati (10)

Spavanje usporava slanje poruka tako da mikro: bit koji prima ne bude preopterećen s previše informacija!

Prijenesite ovaj kôd na svoj kontroler micro: bit i otklonite pogreške prije nego prijeđete na sljedeći korak

Korak 7: Primanje poruka na robotu

Vratite se svom robotskom kodu od početka - ne zaboravite isključiti kontroler micro: bit kako ne biste slučajno prenijeli kôd robota na njega

Pomaknite se dolje do glavne petlje - uklonite kôd za testiranje i umjesto toga dodajte ovo:

dok je istina:

message = radio.receive () ispis (poruka) sleep (100)

Time se postavlja varijabla jednaka dolaznoj poruci, a poruka se ispisuje u REPL - kako bi se provjerilo da li poruke dolaze prema očekivanjima.

Trepćite svoj novi kôd, spojen na REPL, a zatim pritisnite navigacijsku tipku.

Trebali biste dobiti ovako nešto:

REPL vrijednosti
REPL vrijednosti

SAVJETI ZA RJEŠAVANJE PROBLEMA

Ako dobijete poruku o pogrešci na vašem kontroleru micro: bit … otklonite pogreške u kodu vašeg kontrolera

Ako dobijete poruku o pogrešci na svom robotu micro: bit … vaša je radio poruka uspješno poslana! Ali robot to ne može razumjeti, pa provjerite odgovaraju li poruka koju ste poslali i poruka koju ste rekli robotu da posluša.

Ako se uopće ništa ne dogodi

  • Uvjerite se da ste svakom mikro: bitu dodali ispravan kôd - lako je slučajno umetnuti pogrešan!
  • Provjerite podudaraju li se brojevi vaših kanala i grupa na svakom mikro: bitu

Korak 8: Korištenje dolaznih poruka za upravljanje motorima robota

Sada dobivate dva broja koja se šalju putem radija kao niz.

Morate podijeliti ovu poruku u dva niza, zatim ponovno pretvoriti nizove u brojeve i proslijediti to u funkciju pogona. Puno se događa odjednom!

Prije nego što to učinite, morate provjeriti je li poruka koju primate u ispravnom formatu.

Ako se ne šalju poruke, umjesto toga ćete primiti 'Ništa'. Ako ovo pokušate podijeliti, dobit ćete poruku o pogrešci.

dok je istina:

poruka = radio.receive () ako poruka nije Ništa: message = message.split () pogon (int (poruka [0]), int (poruka [1]))

Što se ovdje događa?

  • Novi kôd će se pokrenuti ako je poruka bilo što drugo osim "Ništa".
  • message.split () provjerava ima li mjesta u poruci (što smo dodali u posljednjem koraku) i koristi ovo za podjelu poruke na dva dijela.
  • int (poruka [0]), int (poruka [1]) čini suprotno od onoga što smo učinili u prethodnom koraku - dobiva svaki podatak pojedinačno i pretvara ga u cijeli broj (cijeli broj).
  • int (poruka [0]) koristi se kao vrijednost za lijevi motor u pogonskoj funkciji, a int (poruka [1]) kao vrijednost za desni motor.

Provjerite radi li - okreću li se motori kad pritisnete joystick?

Ako ne - vrijeme je za neke pogreške!

Ako da, fantastično! Imate robota na daljinsko upravljanje koji radi!

Provedite neko vrijeme vježbajući sa svojim robotom prije nego prijeđete na sljedeći korak. Vozi li se onako kako očekujete?

Sljedeći koraci pokazat će vam kako pomoću gumba na upravljačkoj palici dodati dodatnu funkcionalnost svom robotu

Ako do sada želite vidjeti našu verziju ovog koda:

  • Robot:
  • Kontroler:

Korak 9: Korištenje gumba - primanje dodatnih poruka

Trenutno će vaš kôd pokušati podijeliti svaku poruku koja nije Ništa. To znači da ako primite, na primjer, "zdravo", dobit ćete poruku o pogrešci.

Kako bi vaš micro: bit mogao tumačiti druge poruke, morat će prvo provjeriti svaku očekivanu poruku, a zatim je podijeliti samo ako joj nije rečeno da s njom učini bilo što drugo.

Proširite svoj kod na sljedeći način:

ako poruka nije Ništa:

if message == 'hello': display.show (Image. HAPPY) elif message == 'patka': display.show (Image. DUCK) else: message = message.split () pogon (int (poruka [0]), int (poruka [1]))

Prvo će provjeriti je li primio poruku "zdravo". Ako ima, prikazat će sretnu sliku, a zatim se vratite na vrh petlje i provjerite ima li sljedeće poruke.

Ako poruka nije zdravo, sljedeća će provjeriti je li poruka "patka".

Ako poruka nije ni "zdravo" ILI "patka", učinit će posljednju stvar na popisu, koja će podijeliti poruku i uključiti motore. Neće pokušati podijeliti poruku ako je primila "zdravo" ili "patka", što znači da nećete dobiti poruku o pogrešci ni od jedne od ove dvije poruke.

Dvostruki znak jednakosti je važan - znači "jednako je", u usporedbi s jednim znakom jednakosti, koji nešto postavlja (pa poruka = "zdravo" znači da varijablu postavljamo na "zdravo", poruka == "zdravo" znači da pitamo je li poruka jednaka 'zdravo').

Isprobajte ga za sada s samo dvije mogućnosti, da biste ga isprobali - kasnije možete dodati onoliko drugih poruka koliko vam se sviđa.

Veza do radnog koda:

Korak 10: Slanje dodatnih poruka pomoću gumba na upravljaču

Isključite mikro: bit vašeg robota, a umjesto toga priključite mikro: bit na džojstiku

Vratite se na kod kontrolera za uređivanje.

Slično kodu robota, želimo da kontrolor provjeri pokušavate li poslati bilo koju drugu poruku, prije nego što pošaljete vrijednosti upravljačke palice.

Na vrhu petlje i dalje želimo da provjeri trenutne vrijednosti upravljačke palice, ali isto tako želimo da provjeri je li trenutno pritisnuta tipka:

dok je istina:

joystick = joystick_push () gumb = button_press ()

button_press () vraća vrijednost A, B, C, D, E ili F ovisno o tome koja je tipka trenutno pritisnuta (ako se ništa ne pritisne, vraća None).

Sada možemo dati if-elif-else izjavu, kao što smo učinili za kod robota-pomoću dva gumba i slanjem vrijednosti upravljačke palice ako se ne pritisne nijedan gumb.

if button == 'A':

radio.send ('hello') sleep (500) elif button == 'B': radio.send ('patck') sleep (500) else: message = str (joystick [0]) + "" + str (joystick [1]) radio.send (message) sleep (10)

Kad pritisnete gumb, pošaljite jednu od poruka na koje ste rekli robotu da pazi u prethodnom koraku.

Poruka će se poslati kad god se pritisne gumb, a računala su mnogo brža od ljudi! Tako bi mogao poslati poruku mnogo puta prije nego što uspijete maknuti prst s gumba.

Spavanje nakon slanja poruke usporava ga, tako da neće ponovno provjeriti gumb tako brzo - pokušajte s nekoliko brojeva ovdje kako biste dobili savršeno vrijeme za vas - presporo i neće reagirati brzo i vaš će robot primiti toliko poruka o gumbima da bi mogao prestati reagirati na joystick!

Radi li to?

Ako dobivate poruke o pogrešci, dobro razmislite o tome što ste upravo promijenili i što se događa.

Ako dobijete pogrešku na robotu kada pritisnete gumb na upravljaču - znate da poruka prolazi, ali zbunjuje robota. Provjerite jesu li poruke koje ste poslali i poruka koju ste rekli robotu da traži iste.

Veza na radni kod:

Korak 11: Sljedeći koraci

Sada imate znanje koje vam je potrebno za rad s motorima vašeg robota i s vašom joystickom: bitnim kontrolerom

Iskoristite to znanje za poboljšanje dva programa i učinite ih svojim. Nekoliko ideja u nastavku!

Na kontroleru imate šest tipki! Što želite da učine?

  • Kako bi bilo programirati plesnu rutinu koju bi vaš robot mogao izvoditi po naredbi? Napišite algoritam naredbi drive (), odvojenih naredbama sleep ()!
  • Želite li promijeniti smjer u kojem se robot kreće tako da može lako voziti naopačke? Razmislite o x i y vrijednostima upravljačke palice. Što predstavljaju i kako biste s njima mogli manipulirati?
  • Ima li vaš robot (ili biste mogli dodati!) Dodatne značajke poput LED dioda, zvučnika ili senzora?

Ideje za poboljšanje koda

  • Možete li pomoći svom robotu da se nosi s nepoznatim porukama pomoću koda try/except?
  • Matematika koja se koristi za izračunavanje lijeve i desne vrijednosti s upravljačke palice ne daje nam cijeli raspon vrijednosti (pogon robota može prihvatiti broj do 1023). Možete li urediti ovaj kôd da biste dobili bolji raspon?
  • Postoje i druge metode miješanja vrijednosti upravljačke palice - možete li smisliti bolji način za to?

Preporučeni: