Taula de continguts:

El robot Butter: el robot Arduino amb crisi existencial: 6 passos (amb imatges)
El robot Butter: el robot Arduino amb crisi existencial: 6 passos (amb imatges)

Vídeo: El robot Butter: el robot Arduino amb crisi existencial: 6 passos (amb imatges)

Vídeo: El robot Butter: el robot Arduino amb crisi existencial: 6 passos (amb imatges)
Vídeo: Robots testing the Bulletproof #cybertruck 2024, Juliol
Anonim
Image
Image

Aquest projecte es basa en la sèrie animada "Rick and Morty". En un dels episodis, Rick fa un robot l'únic propòsit del qual és portar mantega. Com a estudiants de Bruface (Facultat d’Enginyeria de Brussel·les), tenim una tasca per al projecte de mecatrònica que consisteix a construir un robot basat en un tema suggerit. La tasca d’aquest projecte és: Feu un robot que només serveixi mantega. Pot tenir una crisi existencial. Per descomptat, el robot de l’episodi de Rick i Morty és un robot força complex i cal fer algunes simplificacions:

Com que l’únic propòsit és portar mantega, hi ha alternatives més senzilles. En lloc de fer que el robot sembli i agafi la mantega, abans que la porti a la persona adequada, el robot pot portar la mantega tot el temps. La idea principal és, doncs, fabricar un carro que transporti la mantega fins on hagi d’estar.

A part de transportar la mantega, el robot ha de saber on ha de portar la mantega. En l'episodi, Rick utilitza la seva veu per trucar i manar al robot. Això requereix un sistema de reconeixement de veu car i seria molt complicat. En canvi, tothom a la taula rep un botó: un cop activat aquest botó, el robot pot localitzar aquest botó i moure’s cap a ell.

Per resumir, el robot ha de complir els requisits següents:

  • Ha de ser segur: ha d’evitar obstacles i evitar la caiguda de la taula;
  • El robot ha de ser petit: l’espai de la taula és limitat i ningú voldria un robot que serveixi mantega, però que tingui la meitat de la mida de la taula;
  • El funcionament del robot no pot dependre de la mida o la forma de la taula, de manera que es pot utilitzar en diferents taules;
  • Ha de portar la mantega a la persona adequada a la taula.

Pas 1: concepte principal

Els requisits esmentats anteriorment es poden complir mitjançant diferents tècniques. Les decisions sobre el disseny principal que es van prendre s’expliquen en aquest pas. Podeu trobar detalls sobre com s’implementen aquestes idees en els passos següents.

Per complir el seu deure, el robot ha de moure’s fins a arribar a la destinació. Tenint en compte l’aplicació del robot, és senzill que fer servir les rodes en lloc d’un moviment “a peu” és millor fer-lo moure. Com que una taula és una superfície plana i el robot no assolirà velocitats molt altes, dues rodes accionades i una bola de rodes són la solució més senzilla i fàcil de controlar. Les rodes accionades han de ser alimentades per dos motors. Els motors han de tenir un parell gran, però no han d’arribar a una velocitat elevada, per això s’utilitzaran servomotors continus. Un altre avantatge dels servomotors és la simplicitat d'ús amb un Arduino.

La detecció d'obstacles es pot fer mitjançant un sensor d'ultrasons que mesura la distància, connectat a un servomotor per triar la direcció de la mesura. Les vores es poden detectar mitjançant sensors LDR. L’ús de sensors LDR requerirà la construcció d’un dispositiu que contingui una llum LED i un sensor LDR. Un sensor LDR mesura la llum reflectida i es pot veure com un tipus de sensor de distància. El mateix principi existeix amb la llum infraroja. Hi ha alguns sensors de proximitat d'infrarojos que tenen una sortida digital: tancats o no tancats. Això és exactament el que necessita el robot per detectar les vores. Combinant 2 sensors de vora situats com dues antenes d’insectes i un sensor d’ultrasons accionat, el robot hauria de poder evitar obstacles i vores.

La detecció de botons també es pot fer mitjançant l'ús de sensors i leds IR. L’avantatge dels IR és que és invisible, cosa que fa que l’ús no sigui molest per a la gent de la taula. També es podrien utilitzar làsers, però la llum seria visible i també seria perillosa quan algú apuntés el làser cap a un altre ull. A més, l’usuari hauria d’orientar els sensors del robot només amb un feix làser prim, cosa que seria molt molest. En equipar el robot amb dos sensors IR i construir el botó amb un led IR, el robot sap en quina direcció ha d’anar seguint la intensitat de la llum IR. Quan no hi ha cap botó, el robot pot girar fins que un dels leds capti el senyal d'un dels botons.

La mantega es posa en un compartiment situat a la part superior del robot. Aquest compartiment pot estar format per una caixa i una tapa accionada per obrir la caixa. Per obrir la tapa i moure el sensor d'ultrasons per escanejar i detectar els obstacles necessitem dos motors i, amb aquest propòsit, els servomotors no continus estan més adaptats perquè els motors han d'anar en una posició determinada i mantenir aquesta posició.

Una característica addicional del projecte era interactuar amb l’entorn extern amb una veu de robot. Un brunzidor és senzill i adaptat per a aquest propòsit, però no es pot utilitzar en cap moment, ja que el nivell actual és elevat.

Les principals dificultats del projecte es basen en la codificació, ja que la part mecànica és bastant senzilla. Cal tenir en compte molts casos per evitar que el robot s’enganxi o faci alguna cosa no desitjat. Els principals problemes que hem de resoldre són perdre el senyal IR a causa d’un obstacle i aturar-se quan arriba al botó.

Pas 2: materials

Peces mecàniques

  • Impressora 3D i màquina de tall per làser

    • El PLA s’utilitzarà per a la impressió 3D, però també podeu utilitzar ABS
    • S'utilitzarà una placa de fusta contraxapada de bedoll de 3 mm per tallar amb làser, ja que dóna la possibilitat de fer modificacions fàcilment més endavant, també es pot utilitzar plexiglàs, però és més difícil modificar-lo un cop tallat amb làser sense destruir-lo
  • Perns, femelles, volanderes

    La majoria dels components es mantenen units mitjançant cargols, rondelles i femelles de capçalera de botó M3, però alguns d’ells requereixen un muntatge de cargols M2 o M4. La longitud dels parabolts oscil·la entre els 8 i els 12 mm

  • Espaciadors PCB de 25 mm i 15 mm
  • 2 servomotors amb rodes compatibles
  • Alguns fils metàl·lics gruixuts d’uns 1-2 mm de diàmetre

Peces electròniques

  • Microcontrolador

    1 placa UNO arduino

  • Servomotors

    • 2 servomotors grans: Feetech continu 6Kg 360 graus
    • 2 micro servomotors: Feetech FS90
  • Sensors

    • 1 sensor d'ultrasons
    • 2 sensors de proximitat IR
    • 2 fotodíodes IR
  • Bateries

    • 1 suport de bateria de 9V + bateria
    • 1 porta bateries 4AA + bateries
    • 1 caixa de bateries de 9V + bateria
  • Components addicionals

    • Alguns cables de salt, cables i plaques de soldadura
    • Algunes resistències
    • 1 LED IR
    • 3 interruptors
    • 1 brunzidor
    • 1 botó
    • 1 connector de bateria Arduino a 9V

Pas 3: provar l'electrònica

Provant l'electrònica
Provant l'electrònica
Provant l'electrònica
Provant l'electrònica

Creació del botó:

El botó es fa simplement mitjançant un interruptor, un LED d’infrarojos i una resistència de 220 Ohm en sèrie, alimentada per una bateria de 9 V. Es posa en una bateria de 9V per a un disseny compacte i net.

Creació dels mòduls receptors d'infrarojos:

Aquests mòduls es fabriquen amb taulers de soldadura de forats passants, que posteriorment es fixaran amb cargols al robot. Els circuits per a aquests mòduls es mostren als esquemes generals. El principi és mesurar la intensitat de la llum infraroja. Per millorar les mesures, es poden utilitzar colimadors (fets amb tubs retràctils) per centrar-se en una determinada direcció d’interès.

Cal complir diferents requisits del projecte mitjançant dispositius electrònics. Cal limitar el nombre de dispositius per mantenir una complexitat relativa baixa. Aquest pas conté els esquemes de cablejat i cada codi per provar totes les parts per separat:

  • Servomotors continus;
  • Sensor d'ultrasons;
  • Servomotors no continus;
  • Zumbador;
  • Detecció de direcció del botó IR;
  • Detecció de vores mitjançant sensors de proximitat;

Aquests codis poden ajudar a entendre els components al principi, però també són molt útils per a la depuració en fases posteriors. Si es produeix un problema determinat, es pot detectar l’error més fàcilment provant tots els components per separat.

Pas 4: disseny de peces impreses en 3D i tallades per làser

Disseny de peces impreses en 3D i tallades per làser
Disseny de peces impreses en 3D i tallades per làser
Disseny de peces impreses en 3D i tallades per làser
Disseny de peces impreses en 3D i tallades per làser
Disseny de peces impreses en 3D i tallades per làser
Disseny de peces impreses en 3D i tallades per làser

Peces tallades amb làser

El conjunt està format per tres plaques horitzontals principals unides per separadors de PCB per obtenir un disseny obert que faciliti l'accés a l'electrònica si cal.

Aquestes plaques han de tenir els forats necessaris tallats per cargolar els separadors i altres components per al muntatge final. Principalment, les tres plaques tenen forats al mateix lloc per als separadors i forats específics per a l'electrònica fixats respectivament a cada placa. Fixeu-vos que la placa central té un forat per passar cables al centre.

Les peces més petites es tallen a les dimensions del servo gran per fixar-les al conjunt.

Peces impreses en 3D

A més del tall per làser, cal imprimir algunes peces en 3D:

  • El suport per al sensor d'ultrasons, que el vincula a un braç de micro servomotor
  • El suport de la roda i els dos sensors de vora IR. El disseny particular del tipus d’extrems en forma de caixa de la peça per als sensors d’IR actua com una pantalla per evitar interferències entre el botó que emet senyal d’IR i els sensors d’IR que necessiten centrar-se només en el que passa a terra.
  • El suport per al micro servomotor que obre la tapa
  • I, finalment, la tapa mateixa, formada per dues peces per tenir un angle de funcionament més gran, evitant la col·lisió amb el micro servomotor que obre la tapa:

    • El inferior que es fixarà a la placa superior
    • I la part superior que està unida a la part inferior per una frontissa i accionada pel servo mitjançant un fil metàl·lic gruixut. Vam decidir afegir una mica de personalitat al robot donant-li un cap.

Un cop dissenyades totes les peces i exportats els fitxers en el format correcte per a les màquines utilitzades, es poden fabricar les peces. Tingueu en compte que la impressió 3D requereix molt de temps, sobretot amb les dimensions de la part superior de la tapa. És possible que necessiteu un o dos dies per imprimir totes les peces. El tall per làser, però, és només qüestió de minuts.

Tots els fitxers SOLIDWORKS es poden trobar a la carpeta comprimida.

Pas 5: Muntatge i cablejat

Image
Image
Muntatge i cablejat
Muntatge i cablejat
Muntatge i cablejat
Muntatge i cablejat
Muntatge i cablejat
Muntatge i cablejat

El conjunt serà una barreja de cablejat i cargolat dels components, començant de baix a dalt.

Placa inferior

La placa inferior s’uneix amb el paquet de bateries 4AA, els servomotors, la part impresa (fixació de la roda de bola per sota de la placa), els dos sensors de vora i 6 separadors femella-femella.

Plat del mig

A continuació, es pot muntar la placa central comprimint els servomotors entre les dues plaques. A continuació, es pot fixar aquesta placa posant-hi un altre conjunt de separadors. Alguns cables es poden passar pel forat central.

El mòdul d'ultrasons es pot connectar a un servo no continu, que es fixa a la placa central amb l'Arduino, el paquet de bateries de 9 V (alimentant l'arduino) i els dos mòduls de receptor d'infrarojos a la part frontal del robot. Aquests mòduls es fabriquen amb taulers de soldadura de forats passants i s’uneixen amb cargols a la placa. Els circuits per a aquests mòduls es mostren als esquemes generals.

Plat superior

En aquesta part del muntatge, els interruptors no estan fixats, però el robot ja pot fer-ho tot excepte les accions que requereixin la tapa, de manera que ens permet fer una prova per corregir el límit, adaptar el codi del moviment i tenir accés als ports de l'arduino.

Quan s’aconsegueix tot això, la placa superior es pot fixar amb separadors. Els darrers components que són els dos interruptors, el botó, el servo, el brunzidor i el sistema de tapa es poden fixar finalment a la placa superior per acabar el muntatge.

L’últim que cal provar i corregir és l’angle del servo per obrir correctament la tapa.

El llindar dels sensors de vora s’ha d’adaptar amb el potenciòmetre inclòs (mitjançant un tornavís pla) per a diferents superfícies de taula. Una taula blanca hauria de tenir un llindar inferior a una taula marró, per exemple. També l'alçada dels sensors influirà en el llindar necessari.

Al final d'aquest pas, el muntatge ha finalitzat i l'última part restant són els codis que falten.

Pas 6: Codificació: ajuntar-ho tot

Tot el codi necessari per fer funcionar el robot es troba al fitxer comprimit que es pot descarregar. El més important és el codi "principal" que inclou la configuració i el bucle funcional del robot. La majoria de les altres funcions s’escriuen en subarxius (també a la carpeta comprimida). Aquests subarxius s'han de desar a la mateixa carpeta (que s'anomena "principal") que l'script principal abans de penjar-lo a l'Arduino

Primer es defineix la velocitat general del robot juntament amb la variable "recordar". Aquest "recordatori" és un valor que recorda en quina direcció gira el robot. Si "recorda = 1", el robot gira a l'esquerra, si "recorda = 2", el robot gira a la dreta.

velocitat int = 9; // Velocitat general del robot

int remind = 1; // Direcció inicial

A la configuració del robot, s’inicialitzen els diferents subarxius del programa. En aquests subarxius, s'escriuen les funcions bàsiques sobre el control dels motors, sensors, …. En inicialitzar-los a la configuració, les funcions que es descriuen en cadascun d’aquests fitxers es poden utilitzar al bucle principal. En activar la funció r2D2 (), el robot farà un soroll com el robot R2D2 de la franquícia de la pel·lícula Star Wars quan es posa en marxa. Aquí la funció r2D2 () està desactivada per evitar que el brunzidor tregui massa corrent.

// Configuració @ restabliment // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); inicialitzar_tapa (); initialize_buzzer (); // r2D2 (); int remind = 1; // direcció inicial Arrencador (recordar); }

La funció d’inici (recordatori) es fa servir per primera vegada a la configuració. Aquesta funció fa que el robot giri i busqui el senyal IR d’un dels botons. Un cop hagi trobat el botó, el programa sortirà de la funció Starter canviant la variable "cond" a false. Durant la rotació del robot ha de ser conscient del seu entorn: ha de detectar vores i obstacles. Això es comprova cada vegada abans que continuï girant. Un cop el robot detecti un obstacle o una vora, s’executarà el protocol per evitar aquests obstacles o vores. Aquests protocols s’explicaran més endavant en aquest pas. La funció d’inici té una variable que és la variable de recordatori que s’ha comentat abans. En donar el valor de recordatori a la funció Starter, el robot sap en quina direcció ha de girar per buscar el botó.

// Starter Loop: gireu-vos i cerqueu el botó // ------------------------------------ ----------------

void Starter (int remind) {if (isedgeleft () || isedgeright ()) {// Detecta les vores edgeDetected (recorda); } else {bool cond = true; while (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (remind == 1) {// Estàvem girant a l'esquerra if (isobstacleleft ()) {stopspeed (); evitar_obstacle (recordar); } else if (isedgeleft () || isedgeright ()) {// Detecta les vores edgeDetected (recorda); } else {turnleft (speed); }} else if (recordar == 2) {if (isobstacleright ()) {stopspeed (); evitar_obstacle (recordar); } else if (isedgeleft () || isedgeright ()) {// Detecta les vores edgeDetected (recorda); } else {turnright (speed); }}}}}}

Si el robot troba el botó, aleshores surt el primer bucle d’inici i comença el bucle principal i funcional del robot. Aquest bucle principal és força complex, ja que cada vegada que el robot ha de detectar si hi ha un obstacle o una vora al davant, la idea principal és que el robot segueixi el botó trobant-lo i perdent-lo cada vegada. En utilitzar dos sensors IR, podem distingir tres situacions:

  • la diferència entre la llum IR detectada pel sensor esquerre i dret és més gran que un llindar determinat i hi ha un botó.
  • la diferència de llum IR és menor que el llindar i hi ha un botó davant del robot.
  • la diferència de llum IR és menor que el llindar i no hi ha cap botó davant del robot.

La manera com funciona la rutina de la pista és la següent: quan es detecta el botó, el robot es mou cap al botó girant en la mateixa direcció que girava (mitjançant la variable de recordatori) i, al mateix temps, avança una mica. Si el robot gira massa, es tornarà a perdre el botó i, en aquest moment, el robot recorda que ha de girar en l’altra direcció. Això també es fa tot avançant una mica. Fent això, el robot gira constantment a l'esquerra i gira a la dreta, però mentrestant avança cap al botó. Cada vegada que el robot troba el botó, continua girant fins que l’ha perdut, en aquest cas comença a moure’s en l’altra direcció. Observeu la diferència de funcions que s’utilitzen al bucle d’inici i al bucle principal: el bucle d’inici utilitza "turnleft ()" o "turnright ()", mentre que el bucle principal utilitza "moveleft ()" i "moveright ()". Les funcions esquerra / dreta no només fan girar el robot, sinó que també el fan avançar alhora.

/ * Bucle funcional ---------------------------- Aquí, només hi ha la rutina de la pista * /

int perdut = 0; // Si es perd = 0 es troba el botó, si es perd = 1 es perd el botó void loop () {if (isedgeleft () || isedgeright ()) {

if (! isobstacle ()) {

avançar (velocitat); retard (5); } else {evitar_obstacle (recordar); } else {if (remind == 1 && lost == 1) {// Giràvem a l'esquerra stoppeed (); if (! isobstacleright ()) {moveright (velocitat); // Doneu la volta per trobar el botó} else {evite_obstacle (recordar); } recordar = 2; } else if (recordar == 2 && lost == 1) {stopspeed (); if (! isobstacleleft ()) {moveleft (velocitat); // Estàvem girant a la dreta} else {avoid_obstacle (remind); } recordar = 1; } else if (lost == 0) {if (remember == 1) {// Estàvem girant a l'esquerra if (! isobstacleleft ()) {moveleft (speed); // Estàvem girant a la dreta} else {stopspeed (); evitar_obstacle (recordar); } //} else if (recordar == 2) {if (! isobstacleright ()) {moveright (velocitat); // Doneu la volta per trobar el botó} else {stopspeed (); evitar_obstacle (recordar); }}} retard (10); perdut = 0; }} //}}

Ara es dóna una petita explicació de les dues rutines més complexes:

Eviteu les vores

El protocol per evitar vores es defineix en una funció anomenada "edgeDetection ()" que s'escriu al subarxiu "moviment". Aquest protocol es basa en el fet que el robot només hauria de trobar un avantatge quan hagi arribat al seu destí: el botó. Un cop el robot detecta una vora, el primer que fa és retrocedir una mica per estar a una ditància segura des de la vora. Un cop fet això, el robot espera 2 segons. Si algú prem el botó a la part frontal del robot en aquests dos segons, el robot sap que ha arribat a la persona que vol la mantega i obre el compartiment de la mantega i presenta la mantega. En aquest moment, algú pot treure mantega del robot. Al cap d’uns segons, el robot es cansarà d’esperar i només tancarà la tapa de la mantega. Un cop tancada la tapa, el robot executarà el bucle d'inici per buscar un altre botó. Si el robot es troba amb una vora abans d’arribar al seu destí i no es prem el botó de la part frontal del robot, el robot no obrirà la tapa de mantega i executarà immediatament el bucle d’arrencada.

Eviteu obstacles

La funció evite_obstacle () també es troba al subarxiu "moviment". El més difícil d’evitar obstacles és que el robot té un punt cec bastant gran. El sensor d'ultrasons es col·loca a la part frontal del robot, cosa que significa que pot detectar obstacles, però no sap quan se'l passa. Per solucionar-ho, s’utilitza el següent principi: Un cop el robot troba un obstacle, utilitza la variable reming per girar en l’altra direcció. D'aquesta manera, el robot evita colpejar l'obstacle. El robot continua girant fins que el sensor d'ultrasons ja no detecta l'obstacle. Durant el temps que gira el robot, augmenta el comptador fins que l’obstacle ja no es detecta. Aquest comptador dóna llavors una aproximació de la longitud de l'obstacle. Avançant i disminuint al mateix temps el comptador, es pot evitar l'obstacle. Un cop el comptador arriba a 0, es pot tornar a utilitzar la funció Starter per canviar el botó. Per descomptat, el robot fa la funció d’arrencada girant en la direcció que recordava que anava abans de trobar-se amb l’obstacle (de nou amb la variable de recordatori).

Ara que enteneu completament el codi, podeu començar a utilitzar-lo.

Assegureu-vos d’adaptar els llindars al vostre entorn (per exemple, la reflexió IR és més alta a les taules blanques) i adapteu els diferents paràmetres a les vostres necessitats. A més, s’ha de prestar molta atenció a l’alimentació dels diferents mòduls. És de gran importància que els servomotors no estiguin alimentats pel port Arduino 5V, ja que prenen molta corrent (això podria danyar el microcontrolador). Si s’utilitza la mateixa font d’energia per als sensors que la que alimenta els servos, es podrien trobar alguns problemes de mesura.

Recomanat: