Sadržaj:

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

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

Video: Programiranje Micro: Bit robota i joystick: Bit Controller sa MicroPythonom: 11 koraka
Video: Arduino project 😎^ Arduino #arduino #2022 #2021 #2023 #dc #arduinoproject #diy #foryou 2024, Novembar
Anonim
Programiranje Micro: Bit Robot & Joystick: Bit Controller sa MicroPythonom
Programiranje Micro: Bit Robot & Joystick: Bit Controller sa MicroPythonom

Za Robocamp 2019, naš ljetni kamp robotike, mladi ljudi u dobi od 10 do 13 godina lemlje, programiraju i grade BBC mikro: bit bazirani 'antweight robot', kao i programiraju micro: bit za upotrebu kao daljinski upravljač.

Ako ste trenutno u Robocampu, preskočite na korak 3, jer smo prva dva koraka uradili 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 vlastitog prilagođenog robota, ali on će raditi sa bilo kojim robotom koji koristi sličan upravljački program motora, poput L9110s.

Dizajn datoteke za našeg robota možete pronaći ovdje:

Ovaj vodič je 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…

Supplies

2x BBC mikro: bit

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

joystick: bit 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čunar. 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 testiranje motora robota odavde:

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

  1. Sačuvajte sirovu datoteku na računaru, a zatim je učitajte u Mu:
  2. Kopirajte i zalijepite sav navedeni kod u novu datoteku u Mu.
sačuvati neobrađenu datoteku
sačuvati neobrađenu datoteku

Sada kliknite na dugme 'Flash' na Mu -ovoj traci sa alatkama da biste poslali novi kôd na micro: bit.

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

Žuto svetlo na zadnjoj strani mikro: bita će početi da treperi. Kada završi, vaš kôd je 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:

  • Kada se prikaže 'A', lijevi motor prema naprijed
  • Kada se prikaže 'B', ostavite motor unazad
  • Kada se prikaže 'C', motor desno
  • Kada 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 nekog 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 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 pogona (500, 500) govorite da se oba motora uključe u smjeru naprijed, otprilike upola manje brzine.

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

Savjet: testovi motora su bili unutar True petlje i if naredbe - 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 uputstvo.

NEOBVEZNO: POBOLJŠANJE VOŽNJE RAVNOM LINIJOM

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

Nakon provjere 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 prema gore da pronađete definiciju funkcije pogona i pogledajte gornja dva uputstva:

def pogon (L, R):

# Ispod je podešavanje za ispravljanje nesklada u brzini motora L = int (L*1) R = int (R*1)

Ove dvije linije trenutno uzimaju 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 stanje.

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

POSTAVLJANJE RADIJA

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

uvoz radio

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

Ovo će omogućiti vašem robotu da prima upute s drugog mikro: bita, ali trenutno će primati upute sa bilo kojeg drugog mikro: bita.

To je zato što su kanal 7 i grupa 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 sa 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 dugme, sač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 True:

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

Korak 2: Postavljanje džojstika

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

Preuzmite kopiju koda za postavljanje džojstika odavde:

Postavite radio koristeći istu konfiguraciju (broj kanala i grupe) kao i za robota - to će omogućiti njima dvojici da međusobno komuniciraju.

Na kraju programa pokrenite svoju glavnu petlju:

dok je True:

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

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

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

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

SAVJETI ZA RJEŠAVANJE PROBLEMA

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

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

Ako se ništa ne dogodi

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

Korak 3: Provjerite vrijednosti džojstika

Sljedećih nekoliko koraka koristi kontrolni 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 True:

joystick = joystick_push () ispis (joystick) sleep (500)

Prenesite ovaj kôd na svoj micro: bit, a zatim kliknite na dugme REPL na Mu -ovoj traci sa alatkama. 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 uključen

Dok je REPL otvoren, pritisnite dugme za poništavanje na zadnjoj strani vašeg micro: bita.

Image
Image

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

vrijednosti u terminalu
vrijednosti u terminalu

Pritisnite štap džojstika i pogledajte šta će se dogoditi sa brojevima.

Zabeležite vrednosti date kada je džojstik u središnjem položaju - u mom slučaju (518, 523).

Pritisnite dugme REPL na Mu -ovoj traci sa alatkama da biste je zatvorili - nećete moći da prebacite novi kod u micro: bit dok je otvoren.

Korak 4: Podešavanje X i Y varijabli

Želite promijeniti vrijednosti date funkcijom džojstika, tako da:

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

Ovo se podudara s uputama koje su potrebne robotu - pozitivan broj za vožnju prema 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 originala:

def joystick_push ():

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

Koristite svoje brojeve, možda se razlikuju od mojih

Ubacite novi kôd, otvorite REPL, pritisnite dugme za resetovanje mikro: bita i proverite svoje vrednosti.

Dobivate li (0, 0)?

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

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

Ako date te brojeve robotu, on bi uključio desni motor, ali ne i lijevi, što ne želite da se dogodi!

Ovaj dijagram prikazuje šta se dešava sa vrijednostima x i y pri pomicanju joystick -a, i šta želimo da robot radi kada pomaknete joystick.

dijagram
dijagram

Morate koristiti neke matematike za miješanje x i y vrijednosti, kako biste dobili nešto korisnije.

n

MATEMATIKA

Počnimo tako što ćemo džojstik pritisnuti do kraja.

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 da vidimo 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 šta će se dogoditi ako pritisnete džojstik skroz 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 ponovo s našom formulom:

x + y = 500 + 0 = 500

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

Uporedite dva seta formula da biste utvrdili koja će vam opcija dati ispravnu lijevu vrijednost, a koja opciju ispravnu desnu vrijednost.

Isprobajte neke od vrijednosti koje dobivate vlastitim džojstikom 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

Ubacite novi kôd, otvorite REPL, pritisnite dugme za resetovanje mikro: bita i proverite svoje vrednosti.

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 joystick -a, ali umjesto da ispisuje vrijednosti, sprema ih za slanje kao radio poruku.

dok je True:

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

Ovo zapravo još neće poslati poruku!

Šta se dešava u ovoj novoj liniji koda?

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

Naviknut ćete vidjeti + da znači sabiranje - 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 informacije), 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 primajući micro: bit ne bude preopterećen s previše informacija!

Prenesite ovaj kôd na mikro: bit kontrolera i otklonite greške prije nego prijeđete na sljedeći korak

Korak 7: Primanje poruka na robotu

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

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

dok je True:

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

Ovo postavlja varijablu jednaku dolaznoj poruci i ispisuje poruku u REPL - kako bi provjerio da li poruke dolaze prema očekivanjima.

Trepćite svoj novi kôd, povezan sa REPL -om, a zatim pritisnite navigator.

Trebali biste nabaviti ovako nešto:

REPL vrijednosti
REPL vrijednosti

SAVJETI ZA RJEŠAVANJE PROBLEMA

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

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

Ako se ništa ne dogodi

  • Uvjerite se da ste svakom mikro: bitu dodali ispravan kôd - lako je slučajno umetnuti pogrešan!
  • Uvjerite se da se brojevi kanala i grupa podudaraju 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 na dva niza, zatim ponovo pretvoriti nizove u brojeve i proslijediti ih u funkciju pogona. Mnogo toga se dešava 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 grešci.

dok je True:

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

Šta 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 - uzima svaki podatak pojedinačno i pretvara ga u cijeli broj (cijeli broj).
  • int (poruka [0]) se koristi kao vrijednost za lijevi motor u funkciji pogona, a int (poruka [1]) se koristi kao vrijednost za desni motor.

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

Ako ne - vrijeme je za malo otklanjanja grešaka!

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

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

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

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

  • Robot:
  • Kontroler:

Korak 9: Upotreba dugmadi - 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 grešci.

Da 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 greš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 postavljamo varijablu na "zdravo", poruka == "zdravo" znači da pitamo je li poruka jednaka 'zdravo').

Isprobajte za sada samo dvije opcije, da biste je isprobali - kasnije možete dodati onoliko drugih poruka koliko vam se sviđa.

Veza do radnog koda:

Korak 10: Slanje dodatnih poruka pomoću dugmadi kontrolera

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

Vratite se na kod kontrolera za uređivanje.

Slično kodu robota, želimo da kontroler 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 joystick -a, ali isto tako želimo da provjeri da li se trenutno pritisne dugme:

dok je True:

joystick = joystick_push () dugme = button_press ()

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

Sada možemo dati if-elif-else izjavu, kao što smo učinili za kod robota-pomoću dva dugmeta i slanjem vrijednosti džojstika ako se ne pritisne nijedno dugme.

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 (poruka) sleep (10)

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

Poruka će biti poslana kad god pritisnete dugme, a računari su mnogo brži od ljudi! Tako bi mogao poslati poruku mnogo puta prije nego što uspijete maknuti prst s dugmeta.

Spavanje nakon slanja poruke usporava ga, tako da neće ponovo provjeriti dugme 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?

Ako dobivate poruke o grešci, dobro razmislite o tome šta ste upravo promijenili i šta se dešava.

Ako dobijete grešku na robotu kada pritisnete dugme na kontroleru - 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 do radnog koda:

Korak 11: Sljedeći koraci

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

Iskoristite ovo znanje da poboljšate dva programa i učinite ih svojim. Nekoliko ideja ispod!

Na kontroleru imate šest tastera! Šta želite da urade?

  • Kako bi bilo programirati plesnu rutinu koju bi vaš robot mogao izvoditi po komandi? Napišite algoritam naredbi drive (), odvojenih naredbama sleep ()!
  • Želite li promijeniti smjer kretanja robota tako da može lako voziti naglavačke? Razmislite o x i y vrijednostima džojstika. Šta predstavljaju i kako biste mogli manipulirati njima?
  • Ima li vaš robot (ili biste mogli dodati!) Dodatne funkcije 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 koristeći kod pokušaj/osim?
  • Matematika koja se koristi za izračunavanje lijeve i desne vrijednosti pomoću 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 džojstika - možete li smisliti bolji način za to?

Preporučuje se: