Sommario:

Il Robot Burro: Il Robot Arduino Con Crisi Esistenziale: 6 Passaggi (Illustrato)
Il Robot Burro: Il Robot Arduino Con Crisi Esistenziale: 6 Passaggi (Illustrato)

Video: Il Robot Burro: Il Robot Arduino Con Crisi Esistenziale: 6 Passaggi (Illustrato)

Video: Il Robot Burro: Il Robot Arduino Con Crisi Esistenziale: 6 Passaggi (Illustrato)
Video: Robot 6 Assi Arduino 2024, Dicembre
Anonim
Image
Image

Questo progetto è basato sulla serie animata "Rick and Morty". In uno degli episodi, Rick crea un robot il cui unico scopo è portare il burro. Come studenti di Bruface (Facoltà di Ingegneria di Bruxelles) abbiamo un incarico per il progetto di meccatronica che consiste nel costruire un robot basato su un argomento suggerito. L'incarico per questo progetto è: creare un robot che serva solo burro. Può avere una crisi esistenziale. Ovviamente il robot nell'episodio di Rick and Morty è un robot abbastanza complesso e vanno fatte alcune semplificazioni:

Poiché il suo unico scopo è portare il burro, ci sono alternative più semplici. Invece di fare in modo che il robot guardi e afferri il burro, prima che lo porti alla persona giusta, il robot può portare il burro tutto il tempo. L'idea principale è quindi quella di realizzare un carrello che trasporti il burro dove deve essere.

Oltre a trasportare il burro, il robot deve sapere dove deve portare il burro. Nell'episodio, Rick usa la sua voce per chiamare e comandare il robot. Ciò richiede un costoso sistema di riconoscimento vocale e sarebbe troppo complicato. Invece, tutti al tavolo ricevono un pulsante: una volta attivato questo pulsante, il robot può individuare questo pulsante e muoversi verso di esso.

Per ricapitolare, il robot deve soddisfare i seguenti requisiti:

  • Ha bisogno di essere sicuro: deve evitare gli ostacoli e impedirsi di cadere dal tavolo;
  • Il robot deve essere piccolo: lo spazio sul tavolo è limitato e nessuno vorrebbe un robot che serva il burro ma è grande la metà del tavolo stesso;
  • Il funzionamento del robot non può dipendere dalle dimensioni o dalla forma del tavolo, in questo modo può essere utilizzato su tavoli diversi;
  • Ha bisogno di portare il burro alla persona giusta a tavola.

Passaggio 1: concetto principale

I requisiti sopra menzionati possono essere soddisfatti utilizzando diverse tecniche. Le decisioni sul progetto principale che sono state prese sono spiegate in questo passaggio. I dettagli su come vengono implementate queste idee possono essere trovati nei passaggi seguenti.

Per compiere il suo dovere, il robot deve muoversi fino a raggiungere la destinazione. Considerando l'applicazione del robot è immediato che utilizzando le ruote invece di un movimento "a piedi" è meglio farlo muovere. Poiché un tavolo è una superficie piana e il robot non raggiunge velocità molto elevate, due ruote azionate e una sfera orientabile sono la soluzione più semplice e facile da controllare. Le ruote azionate devono essere azionate da due motori. I motori devono avere una grande coppia ma non devono raggiungere un'alta velocità, ecco perché verranno utilizzati servomotori continui. Un altro vantaggio dei servomotori è la semplicità d'uso con un Arduino.

Il rilevamento degli ostacoli può essere effettuato utilizzando un sensore ad ultrasuoni che misura la distanza, collegato ad un servomotore per scegliere la direzione della misurazione. I bordi possono essere rilevati utilizzando sensori LDR. L'utilizzo di sensori LDR richiederà la costruzione di un dispositivo che contenga sia una luce led che un sensore LDR. Un sensore LDR misura la luce riflessa e può essere visto come una sorta di sensore di distanza. Lo stesso principio esiste con la luce infrarossa. Esistono alcuni sensori di prossimità a infrarossi che hanno un'uscita digitale: chiudi o non chiudi. Questo è esattamente ciò di cui il robot ha bisogno per rilevare i bordi. Combinando 2 sensori per bordi posizionati come due antenne per insetti e un sensore a ultrasuoni attivato, il robot dovrebbe essere in grado di evitare ostacoli e bordi.

Il rilevamento dei pulsanti può essere effettuato anche utilizzando sensori IR e led. Il vantaggio dell'IR è che è invisibile, il che ne rende l'utilizzo non disturbante per le persone a tavola. Potrebbero essere usati anche i laser, ma la luce sarebbe visibile e anche pericolosa quando qualcuno punta il laser nell'occhio di un'altra persona. Inoltre, l'utente dovrebbe indirizzare i sensori sul robot solo con un sottile raggio laser, il che sarebbe piuttosto fastidioso. Dotando il robot di due sensori IR e costruendo il pulsante con un led IR, il robot sa in quale direzione deve andare seguendo l'intensità della luce IR. Quando non c'è nessun pulsante il robot può girarsi finché uno dei led non cattura il segnale da uno dei pulsanti.

Il burro viene messo in uno scomparto sulla parte superiore del robot. Questo vano può essere costituito da una scatola e da un coperchio azionato per l'apertura della scatola. Per aprire il coperchio e spostare il sensore ad ultrasuoni per scansionare e rilevare gli ostacoli abbiamo bisogno di due motori e per questo scopo, i servomotori non continui sono più adatti perché i motori devono andare in una certa posizione e mantenere quella posizione.

Un'ulteriore caratteristica del progetto è stata quella di interagire con l'ambiente esterno con una voce robotica. Un cicalino è semplice e adatto a questo scopo, ma non può essere utilizzato in qualsiasi momento perché il tiraggio attuale è alto.

La principale difficoltà del progetto risiede nella codifica, in quanto la parte meccanica è piuttosto semplice. Molti casi devono essere presi in considerazione per evitare che il robot si blocchi o faccia qualcosa di indesiderato. I problemi principali che dobbiamo risolvere sono perdere il segnale IR a causa di un ostacolo e fermarsi quando arriva al pulsante!

Passaggio 2: materiali

Parti meccaniche

  • Stampante 3D e macchina da taglio laser

    • Il PLA verrà utilizzato per la stampa 3D ma puoi anche utilizzare l'ABS
    • Per il taglio laser verrà utilizzata una lastra di multistrato di betulla da 3 mm in quanto dà la possibilità di apportare modifiche in seguito facilmente, si può utilizzare anche il plexiglas ma è più difficile modificarlo una volta tagliato al laser senza distruggerlo
  • Bulloni, dadi, rondelle

    La maggior parte dei componenti è tenuta insieme utilizzando bulloni a testa tonda M3, rondelle e dadi, ma alcuni di essi richiedono un set di bulloni M2 o M4. La lunghezza dei bulloni è compresa tra 8 e 12 mm

  • Distanziali PCB, 25 mm e 15 mm
  • 2 Servomotori con ruote compatibili
  • Un filo di metallo spesso di circa 1-2 mm di diametro

Parti elettroniche

  • Microcontrollore

    1 scheda arduino UNO

  • Servomotori

    • 2 grandi servomotori: Feetech continuo 6Kg 360 gradi
    • 2 micro servomotori: Feetech FS90
  • Sensori

    • 1 sensore a ultrasuoni
    • 2 sensori di prossimità IR
    • 2 fotodiodi IR
  • batterie

    • 1 portabatteria da 9V + batteria
    • 1 portabatterie 4AA + batterie
    • 1 scatola batteria 9V + batteria
  • Componenti aggiuntivi

    • Alcuni fili di salto, fili e piastre di saldatura
    • Alcuni resistori
    • 1 LED IR
    • 3 interruttori
    • 1 cicalino
    • 1 pulsante
    • 1 connettore per batteria da Arduino a 9V

Passaggio 3: test dell'elettronica

Testare l'elettronica
Testare l'elettronica
Testare l'elettronica
Testare l'elettronica

Creazione del pulsante:

Il pulsante è costituito semplicemente da un interruttore, un LED a infrarossi e una resistenza da 220 Ohm in serie, alimentata da una batteria da 9V. Questo è inserito in un pacco batteria da 9 V per un design compatto e pulito.

Creazione dei moduli ricevitore infrarossi:

Questi moduli sono realizzati con schede di saldatura a foro passante, che verranno successivamente fissate con viti al robot. I circuiti di questi moduli sono illustrati negli schemi generali. Il principio è misurare l'intensità della luce infrarossa. Per migliorare le misurazioni, è possibile utilizzare collimatori (realizzati con tubi termoretraibili) per concentrarsi su una determinata direzione di interesse.

I diversi requisiti del progetto devono essere realizzati utilizzando dispositivi elettronici. Il numero di dispositivi dovrebbe essere limitato per mantenere una complessità relativamente bassa. Questo passaggio contiene gli schemi di cablaggio e ogni codice per testare tutte le parti separatamente:

  • Servomotori continui;
  • Sensore ultrasonico;
  • Servomotori non continui;
  • Cicalino;
  • Rilevamento della direzione del pulsante IR;
  • Rilevamento dei bordi tramite sensori di prossimità;

Questi codici possono aiutare a comprendere i componenti all'inizio, ma sono anche molto utili per il debug nelle fasi successive. Se si verifica un determinato problema, il bug può essere rilevato più facilmente testando tutti i componenti separatamente.

Passaggio 4: progettazione di pezzi stampati in 3D e tagliati al laser

Progettazione di pezzi stampati in 3D e tagliati al laser
Progettazione di pezzi stampati in 3D e tagliati al laser
Progettazione di pezzi stampati in 3D e tagliati al laser
Progettazione di pezzi stampati in 3D e tagliati al laser
Progettazione di pezzi stampati in 3D e tagliati al laser
Progettazione di pezzi stampati in 3D e tagliati al laser

Pezzi tagliati al laser

Il gruppo è costituito da tre piastre orizzontali principali tenute insieme da distanziatori PCB per ottenere un design aperto che fornisce un facile accesso all'elettronica, se necessario.

Quelle piastre devono avere i fori necessari per avvitare i distanziali e altri componenti per l'assemblaggio finale. Principalmente, tutte e tre le piastre hanno fori nella stessa posizione per i distanziatori e fori specifici per l'elettronica fissati rispettivamente su ciascuna piastra. Notare che la piastra centrale ha un foro per il passaggio dei fili nel mezzo.

I pezzi più piccoli vengono tagliati alle dimensioni del servo grande per fissarli al gruppo.

Pezzi stampati in 3D

Oltre al taglio laser, alcuni pezzi dovranno essere stampati in 3D:

  • Il supporto per il sensore ad ultrasuoni, che lo collega ad un braccio del micro servomotore
  • Il supporto per la ruota orientabile e i due sensori per bordi IR. Il particolare design del tipo di estremità scatolare del pezzo per i sensori IR fungono da schermo per evitare interferenze tra il pulsante che emette segnale IR e i sensori IR che devono concentrarsi solo su ciò che accade a terra
  • Il supporto per il micro servomotore aprendo il coperchio
  • E infine il coperchio stesso, realizzato in due pezzi per avere un angolo di lavoro maggiore evitando la collisione con il micro servomotore che apre il coperchio:

    • Quello inferiore che sarà fissato alla piastra superiore
    • E la parte superiore che è collegata alla parte inferiore da una cerniera e azionata dal servo tramite un grosso filo di metallo. Abbiamo deciso di aggiungere un po' di personalità al robot dandogli una testa.

Una volta progettati tutti i pezzi ed esportati i file nel formato corretto per le macchine utilizzate, i pezzi possono essere effettivamente realizzati. Tieni presente che la stampa 3D richiede molto tempo, soprattutto con le dimensioni della parte superiore del coperchio. Potrebbero essere necessari uno o due giorni per stampare tutti i pezzi. Il taglio laser, tuttavia, è solo una questione di minuti.

Tutti i file SOLIDWORKS possono essere trovati nella cartella compressa.

Passaggio 5: montaggio e cablaggio

Image
Image
Assemblaggio e cablaggio
Assemblaggio e cablaggio
Assemblaggio e cablaggio
Assemblaggio e cablaggio
Assemblaggio e cablaggio
Assemblaggio e cablaggio

L'assemblaggio sarà un mix di cablaggio e avvitamento dei componenti, partendo dal basso verso l'alto.

Piastra inferiore

La piastra inferiore è assemblata con il pacco batterie 4AA, i servomotori, la parte stampata (attaccando la ruota a sfera sotto la piastra), i due sensori di bordo e 6 distanziali maschio-femmina.

Piatto centrale

Successivamente, è possibile montare la piastra centrale, comprimendo i servomotori tra le due piastre. Questa piastra può quindi essere fissata mettendo un altro set di distanziali sopra di essa. Alcuni cavi possono essere fatti passare attraverso il foro centrale.

Il modulo a ultrasuoni può essere collegato a un servo non continuo, che è fissato sulla piastra centrale con Arduino, il pacco batteria da 9 V (che alimenta l'arduino) e i due moduli ricevitore a infrarossi nella parte anteriore del robot. Questi moduli sono realizzati con schede di saldatura a foro passante e fissati con viti alla piastra. I circuiti per questi moduli sono illustrati negli schemi generali.

Piatto superiore

In questa parte del montaggio gli interruttori non sono fissi ma il robot può già fare tutto tranne le azioni che richiedono il coperchio, quindi ci permette di fare qualche prova per correggere la soglia, adattare il codice del movimento e avere un facile accesso ai porti dell'arduino.

Una volta ottenuto tutto ciò, la piastra superiore può essere fissata con distanziali. Gli ultimi componenti che sono i due interruttori, il pulsante, il servo, il cicalino e il sistema del coperchio possono essere infine fissati alla piastra superiore per completare l'assemblaggio.

L'ultima cosa da testare e correggere è l'angolo del servo per aprire correttamente il coperchio.

La soglia dei sensori per bordi deve essere adattata con il potenziometro incluso (usando un cacciavite piatto) per diverse superfici del tavolo. Ad esempio, un tavolo bianco dovrebbe avere una soglia inferiore rispetto a un tavolo marrone. Anche l'altezza dei sensori influenzerà la soglia necessaria.

Alla fine di questo passaggio, l'assemblaggio è terminato e l'ultima parte rimanente sono i codici mancanti.

Passaggio 6: codifica: mettere tutto insieme

Tutto il codice necessario per far funzionare il robot si trova nel file zippato scaricabile. Il più importante è il codice "principale" che include il setup e il loop funzionale del robot. La maggior parte delle altre funzioni sono scritte in sottofile (anche nella cartella zippata). Questi file secondari dovrebbero essere salvati nella stessa cartella (che si chiama "main") dello script principale prima di caricarlo su Arduino

Per prima cosa viene definita la velocità generale del robot insieme alla variabile "ricorda". Questo "ricorda" è un valore che ricorda in quale direzione stava girando il robot. Se "ricorda = 1", il robot stava/sta girando a sinistra, se "ricorda = 2", il robot stava/sta girando a destra.

velocità int = 9; // Velocità generale del robot

int ricorda = 1; // Direzione iniziale

Nella configurazione del robot vengono inizializzati i diversi sottofile del programma. In questi sottofile vengono scritte le funzioni base sul controllo dei motori, sensori, …. Inizializzandoli nella configurazione, le funzioni descritte in ciascuno di questi file possono essere utilizzate nel ciclo principale. Attivando la funzione r2D2(), il robot emetterà un rumore simile al robot R2D2 della serie di film di Star Wars quando si avvia. Qui la funzione r2D2() è disabilitata per evitare che il buzzer assorba troppa corrente.

//Setup @ reset//----------------

void setup(){ initialize_IR_sensors(); initialize_obstacles_and_edges(); inizializza_movimento(); inizializza_lid(); inizializza_cicalino(); //r2D2(); int ricorda = 1; // direzione iniziale Starter(ricorda); }

La funzione Starter (ricorda) viene prima richiamata nel setup. Questa funzione fa girare il robot e cerca il segnale IR di uno dei pulsanti. Una volta trovato il pulsante, il programma uscirà dalla funzione Starter modificando la variabile 'cond' in false. Durante la rotazione il robot deve essere consapevole del suo ambiente: deve rilevare bordi e ostacoli. Questo viene controllato ogni volta prima che continui a girare. Una volta che il robot rileva un ostacolo o un bordo, verrà eseguito il protocollo per evitare questi ostacoli o bordi. Questi protocolli verranno spiegati più avanti in questo passaggio. La funzione Starter ha una variabile che è la variabile di promemoria discussa in precedenza. Assegnando il valore di promemoria alla funzione Starter, il robot sa in quale direzione deve girare per cercare il pulsante.

//Starter Loop: girati e cerca il pulsante//------------------------------------ ----------------

void Starter(int promemoria) { if (isedgeleft() || isedgeright()) { // Rileva i bordi edgeDetected(remind); } else { bool cond = vero; while (cond == true) { if (buttonleft() == false && buttonright() == false && isButtonDetected() == true) { cond = false; } else { if (ricorda == 1) { // Stavamo girando a sinistra if (isobstacleleft()) { stopspeed(); evita_ostacolo(ricorda); } else if (isedgeleft() || isedgeright()) { // Rileva i bordi edgeDetected (ricorda); } else { sinistra(velocità); } } else if (ricorda == 2) { if (isobstacleright()) { stopspeed(); evita_ostacolo(ricorda); } else if (isedgeleft() || isedgeright()) { // Rileva i bordi edgeDetected (ricorda); } else { svolta a destra (velocità); } } } } } }

Se il robot trova il pulsante, si esce dal primo ciclo di avvio e inizia il ciclo principale e funzionale del robot. Questo ciclo principale è piuttosto complesso poiché ogni volta il robot deve rilevare se c'è o meno un ostacolo o un bordo davanti ad esso. L'idea principale è che il robot segua il pulsante trovandolo e perdendolo ogni volta. Utilizzando due sensori IR, possiamo distinguere tre situazioni:

  • la differenza tra la luce IR rilevata dal sensore sinistro e destro è maggiore di una certa soglia, ed è presente un pulsante.
  • la differenza di luce IR è inferiore alla soglia e c'è un pulsante davanti al robot.
  • la differenza di luce IR è inferiore alla soglia e NON c'è NESSUN pulsante davanti al robot.

Il modo in cui funziona la routine di tracciamento è il seguente: quando viene rilevato il pulsante, il robot si sposta verso il pulsante ruotando nella stessa direzione in cui stava girando (utilizzando la variabile di promemoria) e nello stesso tempo si sposta leggermente in avanti. Se il robot gira troppo, il pulsante andrà perso di nuovo, ea questo punto il robot si ricorderà che deve girare nella direzione opposta. Questo viene fatto anche andando un po' avanti. In questo modo il robot gira costantemente a sinistra e gira a destra, ma nel frattempo continua ad avanzare verso il pulsante. Ogni volta che il robot trova il pulsante, continua a girare finché non lo perde, nel qual caso inizia a muoversi nella direzione opposta. Notare la differenza nelle funzioni che vengono utilizzate nel loop Starter e nel loop principale: il loop Starter utilizza "turnleft()" o "turnright()", mentre il ciclo principale usa "moveleft()" e "moveright()". Le funzioni moveleft/right non solo fanno girare il robot ma lo fanno anche avanzare contemporaneamente.

/* Functional loop ---------------------------- Qui c'è solo la routine di traccia */

int perso = 0; // Se perso = 0 il pulsante viene trovato, se perso = 1 il pulsante è perso void loop() { if (isedgeleft() || isedgeright()) {

if (!isostacolo()) {

andare avanti (velocità); ritardo(5); } else {evita_ostacolo(ricorda); } else {if (ricorda == 1 && perso == 1) { // Stavamo girando a sinistra stopspeed(); if (!isobstacleright()) { moveright(velocità); // Girati per trovare il pulsante } else { Avoid_obstacle(remind); } ricorda = 2; } else if (ricorda == 2 && perso == 1) { stopspeed(); if (!isobstacleleft()) { moveleft(speed); // Stavamo girando a destra } else { Avoid_obstacle(remind); } ricorda = 1; }else if (perso == 0) { if (ricorda == 1) { // Stavamo girando a sinistra if (!isobstacleleft()) { moveleft(speed); //Stavamo girando a destra } else { stopspeed(); evita_ostacolo(ricorda); } // } else if (ricorda == 2) { if (!isobstacleright()) { moveright(speed); // Girati per trovare il pulsante } else { stopspeed(); evita_ostacolo(ricorda); } } } ritardo(10); perso = 0; } } //} }

Ora viene data una piccola spiegazione delle due routine più complesse:

Evita i bordi

Il protocollo per evitare i bordi è definito in una funzione chiamata "edgeDetection()" che è scritta nel sottofile "movimento". Questo protocollo si basa sul fatto che il robot dovrebbe incontrare un bordo solo quando ha raggiunto la sua destinazione: il pulsante. Una volta che il robot rileva un bordo, la prima cosa che fa è tornare un po' indietro per essere a distanza di sicurezza dal bordo. Fatto ciò, il robot attende 2 secondi. Se qualcuno preme il pulsante nella parte anteriore del robot in quei due secondi, il robot sa di aver raggiunto la persona che vuole il burro e apre lo scomparto del burro e presenta il burro. A questo punto qualcuno può prendere il burro dal robot. Dopo pochi secondi il robot si stancherà di aspettare e chiuderà semplicemente il coperchio del burro. Una volta chiuso il coperchio, il robot eseguirà il ciclo Starter per cercare un altro pulsante. Se accade che il robot incontri un bordo prima di raggiungere la sua destinazione e il pulsante sulla parte anteriore del robot non viene premuto, il robot non aprirà il coperchio del burro ed eseguirà immediatamente il ciclo di avvio.

Evita gli ostacoli

Anche la funzione evitare_obstacle() si trova nel sottofile "movimento". La parte difficile dell'evitare gli ostacoli è il fatto che il robot ha un punto cieco piuttosto grande. Il sensore a ultrasuoni è posizionato nella parte anteriore del robot, il che significa che può rilevare gli ostacoli, ma non sa quando lo supera. Per risolvere questo problema, viene utilizzato il seguente principio: una volta che il robot incontra un ostacolo, utilizza la variabile reming per girare nella direzione opposta. In questo modo il robot evita di urtare l'ostacolo. Il robot continua a girare finché il sensore a ultrasuoni non rileva più l'ostacolo. Durante la rotazione del robot viene incrementato un contatore fino a quando l'ostacolo non viene più rilevato. Questo contatore fornisce quindi un'approssimazione della lunghezza dell'ostacolo. Spostandosi poi in avanti e contemporaneamente diminuendo il contatore si evita l'ostacolo. Una volta che il contatore raggiunge lo 0, la funzione Starter può essere utilizzata nuovamente per riposizionare il pulsante. Ovviamente il robot esegue la funzione Starter girando nella direzione in cui ricordava di andare prima di incontrare l'ostacolo (sempre usando la variabile di promemoria).

Ora che hai compreso appieno il codice, puoi iniziare a usarlo!

Assicurati di adattare le soglie al tuo ambiente (la riflessione IR è più alta sui tavoli bianchi, ad esempio) e di adattare i diversi parametri alle tue esigenze. Inoltre, grande attenzione dovrebbe essere data all'alimentazione dei diversi moduli. È di fondamentale importanza che i servomotori non siano alimentati dalla porta Arduino 5V, poiché assorbono molta corrente (questo potrebbe danneggiare il microcontrollore). Se per i sensori viene utilizzata la stessa fonte di alimentazione di quella per alimentare i servi, si potrebbero riscontrare alcuni problemi di misurazione.

Consigliato: