Taula de continguts:

Programació d'un robot: Bit Robot i Joystick: controlador de bits amb MicroPython: 11 passos
Programació d'un robot: Bit Robot i Joystick: controlador de bits amb MicroPython: 11 passos

Vídeo: Programació d'un robot: Bit Robot i Joystick: controlador de bits amb MicroPython: 11 passos

Vídeo: Programació d'un robot: Bit Robot i Joystick: controlador de bits amb MicroPython: 11 passos
Vídeo: Control a distancia con gestos. #microbit #arduino #ironman #robotica #robotics #steameducation 2024, De novembre
Anonim
Programació d'un robot: Bit Robot i joystick: controlador de bits amb MicroPython
Programació d'un robot: Bit Robot i joystick: controlador de bits amb MicroPython

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.

tria el mode
tria el mode

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:

  1. Deseu el fitxer Raw a l'ordinador i, a continuació, carregueu-lo a Mu:
  2. Copieu i enganxeu tot el codi donat en un fitxer nou a Mu.
desa el fitxer en brut
desa el fitxer en brut

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:

intercanviar variables de pin
intercanviar variables de pin

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.

obriu el REPL
obriu el REPL

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.

Imatge
Imatge

Hauríeu de veure que alguns valors porten "imprès" a la pantalla:

valors al terminal
valors al terminal

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.

diagrama
diagrama

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í:

Valors REPL
Valors REPL

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: