Taula de continguts:
- Subministraments
- Pas 1: Configuració del robot
- Pas 2: configuració del joystick
- Pas 3: comprovació dels valors del joystick
- Pas 4: ajust de les variables X i Y
- Pas 5: convertir X i Y en valors per als motors esquerre i dret
- Pas 6: enviament dels valors com a missatges de ràdio
- Pas 7: rebre els missatges al vostre robot
- Pas 8: utilitzar els missatges entrants per controlar els motors del robot
- Pas 9: utilitzar els botons: rebre missatges addicionals
- Pas 10: enviament de missatges addicionals mitjançant els botons del controlador
- Pas 11: passos següents
Vídeo: Programació d'un robot: Bit Robot i Joystick: controlador de bits amb MicroPython: 11 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:13
Per a Robocamp 2019, el nostre campament de robòtica d’estiu, els joves de 10 a 13 anys estan soldant, programant i construint un “robot antweight” basat en micro: bits de la BBC, a més de programar un micro: bit per utilitzar-lo com a control remot.
Si esteu actualment a Robocamp, aneu al pas 3, ja que hem fet els dos primers passos com a grup
Aquesta és una guia pas a pas per aconseguir que un robot micro: bits es comuniqui amb un joystick: controlador de bits.
No es fa la ruta més ràpida perquè tot funcioni, sinó que prova les coses en petits trossos perquè pugueu provar el codi a mesura que aneu, posar-hi el vostre segell i entendre per què fem les coses que fem. !
Per a aquesta activitat, fem servir el nostre propi robot personalitzat, però funcionarà amb qualsevol robot que faci servir un controlador de motor similar, com ara un L9110.
Els fitxers de disseny del nostre robot es poden trobar aquí:
Aquesta guia està escrita per a principiants, però si mai no heu utilitzat un micro: bit amb MicroPython, us recomanem que proveu primer un programa més senzill, com ara la nostra insígnia. -Microbit-Nam …
Subministraments
2x BBC micro: bit
Robot que funciona amb un micro: bit de la BBC (vegeu l'explicació anterior)
joystick: controlador de bits (tenim el nostre de Cool Components)
Pas 1: Configuració del robot
Teniu algunes opcions per escriure el codi MicroPython per al vostre micro: bit:
- Mu, que podeu descarregar i instal·lar des d’aquí:
- L'editor en línia, que podeu trobar aquí:
Aquestes instruccions suposen que utilitzeu Mu
Obriu Mu i connecteu el micro: bit a l'ordinador. Mu hauria de reconèixer que esteu fent servir un micro: bit i seleccionar "Mode" de micro: bit, però si no ho feu, canvieu-lo manualment.
Obteniu una còpia del codi de prova del motor del robot des d’aquí:
Si no esteu acostumat a Github, pot ser poc intuïtiu. Dues maneres fàcils d'obtenir aquest codi són:
- Deseu el fitxer Raw a l'ordinador i, a continuació, carregueu-lo a Mu:
- Copieu i enganxeu tot el codi donat en un fitxer nou a Mu.
Ara feu clic al botó "Flash" de la barra d'eines de Mu per enviar el vostre nou codi al micro: bit.
Això no funcionarà tret que el micro: bit estigui endollat
La llum groga de la part posterior del micro: bit començarà a parpellejar. Quan hagi acabat, el vostre codi s'ha transferit.
CONFIGURACIÓ DE LES DIRECCIONS DEL MOTOR
Aquest programa engegarà els motors en diferents direccions quan premeu el botó "A" del micro: bit.
El que voleu que passi és:
- Quan es mostra "A", deixeu el motor esquerre cap endavant
- Quan es mostra "B", deixeu el motor cap enrere cap enrere
- Quan es mostra "C", el motor dret cap endavant
- Quan es mostra "D", motor dret cap enrere
Probablement no serà així, ja que depèn de com hàgiu connectat el robot.
A la part superior del codi, trobareu una llista de variables que determinen quin pin del micro: bit controla quina direcció del motor.
Si feu servir un dels nostres robots (fitxers), canvieu els noms de les variables per fer que el robot es mogui en les direccions correctes:
Si utilitzeu un robot propi, comproveu a quins pins està connectat el controlador del motor abans d’editar el codi.
PROVAR EL DRIVE
Ara comproveu com funciona el vostre robot substituint el codi de prova del bucle principal per un codi propi.
Digueu al robot que condueixi trucant a la funció drive (). Això necessita dos arguments: un valor per al motor esquerre i un valor per als motors adequats, entre 0 (apagat) i 1023 (velocitat màxima).
En trucar a la unitat (500, 500), per exemple, indiqueu a tots dos motors que s’encenguin, en direcció endavant, aproximadament a la meitat de la velocitat.
Proveu algunes opcions per obtenir una idea de la velocitat de conducció i del rendiment.
Suggeriment: les proves del motor es trobaven dins d'un bucle True mentre, i de la sentència if: els motors no girarien fins que no premés el botó A del bit micro: i sempre es comprova si heu premut el botó A.
Consell: els motors no s'apagaran fins que no els ho digueu. Sempre continuaran fent la seva última instrucció.
OPCIONAL: MILLORAR LA CONDUCCIÓ EN LÍNIA DIRECTA
Si el robot no circula en línia recta, és possible que un dels motors giri més ràpid que l’altre.
Després de comprovar que no hi ha res que impedeixi que la roda giri lliurement, podeu editar el codi a la funció de tracció per reduir la velocitat del motor més ràpid.
Desplaceu-vos cap amunt per trobar la definició de la funció de la unitat i mireu les dues instruccions principals:
unitat de def (L, R):
# A continuació es mostra un ajust per corregir la discrepància de la velocitat del motor L = int (L * 1) R = int (R * 1)
Actualment, aquestes dues línies prenen el valor de L i R, les multipliquen per 1 i, a continuació, assegureu-vos que continuen sent nombres enters (int).
Per exemple, si el motor esquerre és més ràpid, canvieu el * 1 de la seva línia a * 0,9 i comproveu si això millora les coses.
No el podreu fer perfecte, però podeu continuar ajustant fins que es condueixi més recte.
CONFIGURACIÓ DE LA RÀDIO
Ara configureu la ràdio afegint les línies següents a la part superior del codi:
importar ràdio
radio.config (canal = 7, grup = 0, cua = 1) radio.on ()
Això permetrà que el vostre robot rebi instruccions d’un altre micro: bit, però de moment rebrà instruccions de qualsevol altre micro: bit.
Això es deu al fet que el canal 7 i el grup 0 són els canals predeterminats.
Canvieu aquests números, escollint un canal entre 0-82 i un grup entre 0-255. Ara el vostre micro: bit només rebrà instruccions d'altres persones amb la mateixa informació de configuració.
cua = 1 significa que el micro: bit només conservarà un missatge entrant a la vegada; això proporciona un temps de resposta una mica més ràpid que el valor per defecte, que és 3.
Ara heu d’editar el codi del bucle principal per, en lloc d’executar instruccions quan premeu un botó, espereu un missatge de ràdio entrant i responeu adequadament.
Proveu el següent codi com a prova (no farà res fins que no hàgiu configurat el joystick al pas 2):
mentre que és cert:
message = radio.receive () if message == 'forward': drive (500, 500)
Pas 2: configuració del joystick
Desconnecteu el micro: bit del vostre robot i, al seu lloc, connecteu-lo al joystick
Obteniu una còpia del codi de configuració del joystick des d’aquí:
Configureu la ràdio utilitzant la mateixa configuració (número de canal i grup) que vau fer per al robot; això permetrà que els dos es comuniquin entre ells.
Al final del programa, inicieu el bucle principal:
mentre que és cert:
si button_a.was_pressed (): radio.send ('endavant')
Aquest codi encara no utilitza el joystick: bit. Utilitza el botó A del micro: bit per enviar un missatge.
Assegureu-vos que el robot i el controlador micro: bits tinguin alimentació i premeu el botó per enviar el missatge.
Si el missatge es rep amb èxit i el vostre robot es mou … ben fet! Heu acabat amb les instruccions de configuració.
CONSELLS PER A LA RESOLUCIÓ DE PROBLEMES
Si rebeu un missatge d'error al controlador micro: bit … depureu el codi del controlador
Si rebeu un missatge d'error al robot micro: bit … el vostre missatge de ràdio s'ha enviat correctament. Però el robot no ho pot entendre, així que comproveu que coincideixin el missatge que heu enviat i el missatge que heu dit al robot.
Si no passa res
- Assegureu-vos que heu llançat el codi correcte a cada micro: bit: és fàcil llançar accidentalment el malament.
- Assegureu-vos que el número de canal i de grup coincideixi amb cada micro: bit
Pas 3: comprovació dels valors del joystick
Els següents passos es faran amb el codi del controlador
Abans d’utilitzar el joystick del controlador, heu de saber quins tipus de valors obteniu en prémer el pal.
Substituïu el bucle principal pel codi següent:
mentre que és cert:
joystick = joystick_push () imprimir (joystick) sleep (500)
Feu clic amb aquest codi al vostre micro: bit i, a continuació, feu clic al botó REPL a la barra d'eines de Mu. Això obrirà un terminal a la part inferior de l'editor, que us proporcionarà un enllaç en temps real al micro: bit.
Això no funcionarà tret que el micro: bit estigui endollat
Amb el REPL obert, premeu el botó de restabliment a la part posterior del vostre micro: bit.
Hauríeu de veure que alguns valors porten "imprès" a la pantalla:
Premeu el pal del joystick i veureu què passa amb els números.
Anoteu els valors donats quan el joystick està a la posició central, en el meu cas (518, 523).
Torneu a fer clic al botó REPL de la barra d'eines de Mu per tancar-lo; no podreu llançar codi nou al micro: bit mentre estigui obert.
Pas 4: ajust de les variables X i Y
Voleu canviar els valors donats per la funció joystick, de manera que:
- al centre és zero
- pujar és positiu
- baix és negatiu.
Això coincideix amb les instruccions que necessita el robot: un número positiu per conduir cap endavant i un número negatiu per conduir cap enrere.
Mireu els números que heu obtingut a l’últim pas. El primer número és x i el segon número és y.
Editeu la definició de joystick_push () que ja està al programa, per menys els valors de l'original:
def joystick_push ():
x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 retorna x, y
Utilitzeu els vostres propis números, poden ser diferents dels meus
Feu clic al vostre nou codi, obriu el REPL, premeu el botó de restabliment del micro: bit i comproveu els vostres valors.
Reps (0, 0)?
Pas 5: convertir X i Y en valors per als motors esquerre i dret
De moment, aquest joystick no serà molt útil per conduir un robot. Avançat tot el camí, obtindreu un valor com (0, 500).
Si donés aquests números al robot, encendria el motor dret, però no el esquerre, que no és el que voleu que passi.
Aquest diagrama mostra què passa amb els valors xyy quan es mou el joystick i què volem que faci el robot quan es mou el joystick.
Heu d’utilitzar algunes matemàtiques per barrejar els valors x i y, per donar-vos alguna cosa més útil.
n
ELS MÀTICS
Comencem per empènyer el joystick tot el camí cap endavant.
Un exemple dels valors que podeu obtenir és:
x = 0
y = 500
Per ser útil al robot, voleu obtenir valors com aquests:
esquerre = 500
dreta = 500
Intentem afegir xey de diferents maneres per veure quins números obtenim:
x + y = 0 + 500 = 500
x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500
Ara anem a veure què passa si empenyem el joystick fins a la dreta.
Un exemple dels valors que podeu obtenir és:
x = 500
y = 0
Per fer que el robot giri a la dreta, voleu que el motor esquerre es condueixi cap endavant i que el motor dret passi cap enrere:
esquerre = 500
dreta = -500
Tornem a provar la nostra fórmula:
x + y = 500 + 0 = 500
x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500
Compareu els dos conjunts de fórmules per esbrinar quina opció us donarà el valor esquerre correcte i quina opció us donarà el valor correcte.
Proveu-ho amb alguns dels valors que obteniu del vostre propi joystick, per assegurar-vos que la fórmula que trieu funcioni tot el temps.
n
AMPLIACIÓ DE LA FUNCIÓ DE JOYSTICK
Amplieu i editeu la funció del joystick per crear dues variables noves per a l'esquerra i la dreta i per retornar aquests valors en lloc de x i y:
def joystick_push ():
x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 left = right = return left, right
Feu clic al vostre nou codi, obriu el REPL, premeu el botó de restabliment del micro: bit i comproveu els vostres valors.
Esteu obtenint els valors que espereu?
Si necessiteu més ajuda, consulteu el nostre codi d'exemple aquí:
Pas 6: enviament dels valors com a missatges de ràdio
Ara teniu alguns valors a punt per enviar al vostre robot.
Editeu el bucle principal perquè comprovi els valors del joystick, però, en lloc d’imprimir-los, els prepararà per enviar-los com a missatge de ràdio.
mentre que és cert:
joystick = joystick_push () missatge = str (joystick [0]) + "" + str (joystick [1])
Això encara no enviarà el missatge.
Què passa en aquesta nova línia de codi?
- joystick [0] significa el primer bit d'informació que surt de la funció joystick (esquerra)
- el joystick [1] és el següent bit d'informació (dreta)
- str () converteix aquests dos números en format de cadena (text en lloc de números); això és necessari per poder enviar la informació per ràdio.
Estareu acostumats a veure + per significar addició: tant pot afegir nombres com concatenar cadenes, cosa que significa que unirà els dos bits d'informació.
Exemple:
150 + 100 = 250
str (150) + str (100) = 150100
Així, la concatenació unirà els vostres valors esquerre i dret.
Per forçar una separació entre els dos bits d'informació (perquè el robot sàpiga que són dos bits d'informació), concateneu una cadena addicional entre ells mitjançant "". Les marques de parla al voltant de l’espai vol dir que ja és una cadena.
Finalment, amplieu el codi per enviar aquest missatge de nova creació per ràdio:
radio.send (missatge)
dormir (10)
La son retarda l’enviament de missatges perquè el micro: bit receptor no es sobrecarregui amb massa informació.
Feu passar aquest codi al vostre controlador micro: bit i depureu-ne els errors abans de passar al següent pas
Pas 7: rebre els missatges al vostre robot
Torneu al vostre codi del robot des del principi; recordeu que heu de desconnectar el controlador micro: bit perquè no hi torneu el codi de manera accidental
Desplaceu-vos cap avall fins al bucle principal: traieu el codi de prova i afegiu-lo en lloc d'això:
mentre que és cert:
message = radio.receive () print (missatge) sleep (100)
Això estableix una variable igual al missatge entrant i imprimeix el missatge al REPL, per comprovar que els missatges arribin tal com s’esperava.
Feu clic al vostre nou codi, connectat al REPL i, a continuació, premeu el joystick.
Hauríeu d'obtenir alguna cosa així:
CONSELLS PER A LA RESOLUCIÓ DE PROBLEMES
Si rebeu un missatge d'error al controlador micro: bit … depureu el codi del controlador
Si rebeu un missatge d'error al robot micro: bit … el vostre missatge de ràdio s'ha enviat correctament. Però el robot no ho pot entendre, així que comproveu que coincideixin el missatge que heu enviat i el missatge que heu dit al robot.
Si no passa res
- Assegureu-vos que heu llançat el codi correcte a cada micro: bit: és fàcil llançar accidentalment el codi equivocat.
- Assegureu-vos que el número de canal i de grup coincideixi amb cada micro: bit
Pas 8: utilitzar els missatges entrants per controlar els motors del robot
Ara s’estan enviant dos números per la ràdio com una cadena.
Heu de dividir aquest missatge en dues cadenes, després tornar-les a convertir en números i passar-la a la funció de la unitat. Moltes coses a la vegada!
Abans de fer-ho, heu de comprovar que el missatge que rebeu tingui el format correcte.
Si no s’envia cap missatge, rebrà "Cap". Si proveu de dividir això, rebreu un missatge d'error.
mentre que és cert:
message = radio.receive () si el missatge no és Cap: message = message.split () drive (int (missatge [0]), int (missatge [1]))
Què passa aquí?
- El nou codi s'executarà si el missatge és diferent de "Cap".
- message.split () comprova si hi ha un espai al missatge (que hem afegit a l'últim pas) i l'utilitza per dividir el missatge en dos.
- int (missatge [0]), int (missatge [1]) fa el contrari del que vam fer al pas anterior: obté cada informació individualment i la converteix en un enter (un nombre enter).
- int (missatge [0]) s'utilitza com a valor del motor esquerre a la funció de transmissió i int (missatge [1]) s'utilitza com a valor del motor dret.
Comproveu que funcioni: giren els motors quan premeu el joystick?
Si no, és hora de depurar.
Si és així, fantàstic! Teniu un robot de control remot que funciona!
Dediqueu una mica de temps a practicar amb el vostre robot abans de passar al següent pas. Condueix com esperes?
Els passos següents us mostraran com utilitzar els botons del joystick per afegir funcionalitat addicional al vostre robot
Si voleu veure la nostra versió d’aquest codi fins ara:
- Robot:
- Controlador:
Pas 9: utilitzar els botons: rebre missatges addicionals
De moment, el vostre codi intentarà dividir qualsevol missatge que no sigui Cap. Això significa que si rep, per exemple, "hola", rebreu un missatge d'error.
Per permetre que el vostre micro: bit pugui interpretar altres missatges, primer haurà de comprovar cada missatge esperat i, a continuació, dividir el missatge només si no se li ha dit que faci res més.
Amplieu el codi així:
si el missatge no és Cap:
if message == 'hola': display.show (Image. HAPPY) elif message == 'duck': display.show (Image. DUCK) else: message = message.split () drive (int (message [0]), int (missatge [1]))
En primer lloc, comprovarà si ha rebut el missatge "hola". Si és així, mostrarà una imatge feliç i tornarà a la part superior del bucle i comprovarà el següent missatge.
Si el missatge no és hola, després comprovarà si el missatge és "duck".
Si el missatge no és "hola" O "ànec", farà l'últim de la llista: dividir el missatge i engegar els motors. No intentarà dividir el missatge si ha rebut "hola" o "duck", és a dir, no rebreu cap missatge d'error de cap d'aquests dos missatges.
El signe doble igual és important: significa "és igual a", en comparació amb un signe igual, que estableix alguna cosa (per tant, missatge = "hola" significa que estem establint la variable a "hola", missatge == "hola" vol dir que estem preguntant si el missatge és igual a "hola").
Proveu-ho amb només dues opcions per ara, per provar-ho: podeu afegir tants altres missatges com vulgueu més endavant.
Enllaç al codi de treball:
Pas 10: enviament de missatges addicionals mitjançant els botons del controlador
Desconnecteu el micro: bit del vostre robot i, al seu lloc, connecteu-lo al joystick
Torneu al codi del controlador per editar-lo.
De manera similar al codi del robot, volem que el controlador comprovi si voleu enviar altres missatges abans d’enviar els valors del joystick.
A la part superior del bucle, encara volem que comprovi els valors actuals del joystick, però també volem que comprovi si s'està pressionant un botó:
mentre que és cert:
joystick = joystick_push () button = button_press ()
button_press () retorna un valor A, B, C, D, E o F en funció del botó que s'està pressionant actualment (si no es prem res, no retorna cap).
Ara podem fer una declaració if-elif-else, tal com vam fer per al codi del robot: mitjançant dos botons i enviant el valor del joystick si no es prem cap botó.
si el botó == "A":
radio.send ('hola') sleep (500) elif button == 'B': radio.send ('duck') sleep (500) else: message = str (joystick [0]) + "" + str (joystick [1]) radio.send (missatge) dormir (10)
Quan es prem un botó, envieu un dels missatges que heu indicat al robot que ha de mirar al pas anterior.
El missatge s'enviarà sempre que es prem el botó i els ordinadors són molt més ràpids que les persones. Per tant, pot ser que envieu el missatge moltes vegades abans d’haver aconseguit treure el dit del botó.
La sonoritat després d’enviar el missatge l’alenteix, de manera que no tornarà a comprovar el botó tan ràpidament; proveu uns quants números aquí per obtenir el temps perfecte per a vosaltres, massa lentament i tampoc no respondrà. ràpidament i el vostre robot rebrà tants missatges de botó que pot deixar de respondre al joystick.
Funciona?
Si rebeu missatges d'error, penseu bé en què acabeu de canviar i què passa.
Si apareix un error al robot quan premeu un botó del controlador, ja sabeu que el missatge es transmet, però confon el robot. Comproveu que el missatge que heu enviat i el missatge que heu dit al robot que siguin els mateixos.
Enllaç al codi de treball:
Pas 11: passos següents
Ara teniu els coneixements necessaris per treballar amb els motors del vostre robot i amb el vostre joystick: controlador de bits
Utilitzeu aquests coneixements per millorar els dos programes i fer-los vostres. Algunes idees a continuació!
Teniu sis botons al controlador. Què vols que facin?
- Què hi ha de programar una rutina de ball perquè el vostre robot faci per ordre? Escriviu un algorisme d’ordres drive (), separades per ordres sleep ().
- Voleu canviar la direcció en què es mou el robot perquè pugui circular fàcilment de cap per avall? Penseu en els valors x i y del vostre joystick. Què representen i com podeu manipular-los?
- El vostre robot té (o podríeu afegir!) Funcions addicionals com ara LEDs, altaveus o sensors?
Idees per millorar el codi
- Podríeu ajudar el vostre robot a fer front a missatges desconeguts mitjançant el codi try / except?
- Les matemàtiques que s’utilitzen per calcular els valors esquerre i dret del joystick no ens proporcionen el rang complet de valors (la unitat del robot pot acceptar un número fins a 1023). Podeu editar aquest codi per obtenir un millor rang?
- Hi ha altres mètodes per barrejar els valors del joystick: es pot trobar una manera millor de fer-ho?
Recomanat:
Cable de programació de bricolatge amb Arduino Uno - Baofeng UV-9R Plus: 6 passos (amb imatges)
Cable de programació de bricolatge mitjançant Arduino Uno - Baofeng UV-9R Plus: Ei, tothom, aquesta és una guia senzilla sobre com convertir el cable per a auriculars / auriculars Baofeng UV-9R (o més) en un cable de programació mitjançant un Ardunio UNO com a USB Convertidor de sèrie. [EXCLUSIÓ DE RESPONSABILITAT] No em faig responsable de cap dany causant
Rellotge i programació de seguiment d'activitats vibrants portables ATtiny85 ATtiny85 amb Arduino Uno: 4 passos (amb imatges)
Rellotge i programació de seguiment d'activitats vibrants portables ATtiny85 ATtiny85 amb Arduino Uno: Com fer que el rellotge de seguiment d'activitat portable? Es tracta d’un gadget usable dissenyat per vibrar quan detecta l’estancament. Passes la major part del temps a l’ordinador com jo? Estàs assegut durant hores sense adonar-te’n? Llavors, aquest dispositiu és f
Robot Arduino amb controlador PS2 (joystick PlayStation 2): 10 passos (amb imatges)
Robot Arduino amb controlador PS2 (joystick PlayStation 2): en aquest tutorial us mostraré com utilitzar un joystick sense fils Playstation 2 (PS2) per pilotar un tanc robotitzat. El nucli d’aquest projecte es va utilitzar una placa Arduino Uno. Rep ordres del controlador sense fils i estableix la velocitat dels motors
Servo controlat per Joystick mitjançant Arduino (amb programació): 4 passos
Servo controlat per joystick mitjançant Arduino (amb programació): en aquest tutorial farem un servo control de joystick mitjançant Arduino Uno. El servei es mourà segons el moviment del joystick
Mods útils per a la banda de rodament Leatherman (millor ajust, afegir bits, convertir un controlador de femella): 14 passos (amb imatges)
Mods útils per a la banda de rodament Leatherman (millor ajust, afegir bits, convertidor de control de femella): aquest instuctible supera les 3 modificacions de la Leatherman TreadModification # 1: obtenir un millor ajustament al canell Modificació # 2: utilitzar la banda de rodament com a portador de bits i DriverModification # 3 - Convertir un controlador de femelles a una mida més petita