Sommario:

UCL Embedded - B0B the Linefollower: 9 passaggi
UCL Embedded - B0B the Linefollower: 9 passaggi

Video: UCL Embedded - B0B the Linefollower: 9 passaggi

Video: UCL Embedded - B0B the Linefollower: 9 passaggi
Video: Human vs Robot | Artificial Intelligence 2024, Dicembre
Anonim
UCL Embedded - B0B the Linefollower
UCL Embedded - B0B the Linefollower

Questo è B0B.*

B0B è un'auto radiocomandata generica, che serve temporaneamente la base di un robot che segue la linea.

Come tanti robot che seguono la linea prima di lui, farà del suo meglio per rimanere su una linea causata da una transizione tra il pavimento e un materiale contrastante, nel nostro caso del nastro adesivo.

A differenza di tanti altri robot che seguono la linea, anche B0B raccoglie dati e li invia tramite WiFi.

Completamente eccessivo per un progetto di hobby, coinvolge una serie di argomenti che potresti trovare interessanti. Questa guida descrive la sua nascita, le sue funzioni e come realizzarne uno proprio come lui.

Implica anche essere arrabbiati con vari dispositivi elettronici per non funzionare come volevamo e i passi che abbiamo preso per superare queste difficoltà (ti sto guardando ESP 8266-01).

Ci sono 2 codici per far funzionare il progetto. Il primo codice è per il modulo ESP8266 che usiamo Arduino come programmatore e il secondo codice verrà eseguito su Arduino.

Passaggio 1: componenti

Per questo progetto avrai bisogno di:

Hardware:

• 1x auto radiocomando, (deve avere ESC e servosterzo).

Stavamo usando un Traxxas 1/16 E-Revo VXL principalmente di serie, soprattutto perché era quello che avevamo, ed eravamo abbastanza fiduciosi che saremmo stati in grado di controllarlo con un Arduino. Anche perché finirà per trasportare una quantità non trascurabile di hardware extra, eravamo fiduciosi che questo non sarebbe stato un problema per l'E-Revo 1/16.

Tuttavia, la maggior parte delle auto radiocomandate (che possono essere facilmente smontate) potrebbero essere probabilmente utilizzate al loro posto e il processo sarà molto simile.

• Una tonnellata di nastro adesivo.

Il colore dovrebbe contrastare il più possibile il pavimento. Nel nostro ambiente di test abbiamo utilizzato del nastro adesivo bianco su un pavimento scuro.

• 1x Arduino Mega 2560.

Probabilmente anche Arduino più piccoli vanno bene, ma verrai pressato per i pin.

• 1x tagliere grande.

Uno è sufficiente, ma ne avevamo anche uno più piccolo per separare le altre linee elettriche di tensione per ridurre il rischio di errore dell'utente.

• 1x sensore analogico IR TCRT5000 (utilizzato per evitare collisioni).

La marca/modello esatto non importa se è compatibile con Arduino e misura la distanza. Cerca parole chiave come “Distanza”, sensore “ostacolo”. Tecnicamente un sensore digitale funzionerebbe anche con piccole modifiche al codice, ma ne stiamo usando uno analogico.

• Gravità 1x o 2x: sensore analogico scala di grigi v2

Uno è una necessità per il seguace di linea. Il modello esatto non ha importanza, purché osservi l'intensità della luce riflessa e emetta un segnale analogico. Il secondo per il rilevamento della "stanza" non funzionava come previsto e può essere omesso, oppure è possibile trovare un'alternativa, come un sensore di colore RGB, presumibilmente per un effetto migliore. Dobbiamo ancora testarlo.

• 1 x ESP 8266-01.

Sono disponibili molte versioni dell'ESP 8266. Abbiamo esperienza solo con 8266-01 e non possiamo garantire che il codice ESP funzionerà con una versione diversa.

• 1 x schermo Wi-Fi ESP8266-01.

Tecnicamente facoltativo, ma se non lo usi, tutto ciò che riguarda il modulo Wi-Fi diventerà molto più complicato. La guida, tuttavia, presumerà che tu abbia questo (in caso contrario, trova le guide online per il cablaggio corretto dell'ESP-01 nell'Arduino), poiché farlo in modo errato può e probabilmente danneggerà il modulo.

• Batterie per il veicolo stesso e batterie per alimentare l'elettronica aggiuntiva.

Abbiamo usato una coppia di 2,2 AH di capacità, batterie Lipo da 7,4 V in parallelo per alimentare tutto. Dovresti essere in grado di utilizzare qualsiasi batteria che useresti normalmente con il tuo veicolo preferito. Se sei superiore a 5 V ma inferiore a 20 V, la capacità è più importante della tensione nominale.

• Molti cavi jumper.

Ho rinunciato a contare il numero esatto di questi. Se pensi di averne abbastanza, probabilmente non lo fai.

• Infine, per collegare il tutto, dovrai montare Arduino, i sensori, la(e) breadboard(i) e il modulo Wi-Fi sul veicolo di tua scelta. Il tuo risultato varierà a seconda di cosa stai usando come base e di quali materiali sono disponibili.

Abbiamo usato:

• Fascette.

• Un po' di super colla.

• Piccoli pezzi di carta straccia/tubo di resina che avevamo con un diametro adeguato.

• Una vecchia piastra posteriore in masonite da una cornice, tagliata a misura.

• Un po' più di nastro adesivo.

• Tutti gli strumenti necessari per lavorare sulla tua auto radiocomandata preferita.

Per lo più usavamo un piccolo set di cacciaviti con più punte, ma occasionalmente dovevamo estrarre il set di strumenti di serie fornito con l'auto.

Software:

• Nodo rosso

Una parte importante della raccolta dei dati.

• Un server MQTT.

L'intermediario tra il nostro veicolo e Node-red. Inizialmente, per i test, abbiamo usato test.mosquitto.org

Successivamente abbiamo utilizzato:

• CloudMQTT.com

Questo era molto più affidabile, il che ha più che compensato l'essere leggermente più complicato da configurare.

• WampServer.

L'ultima parte della raccolta dei dati. In particolare, utilizzeremo il suo database SQL per archiviare i nostri dati raccolti.

Passaggio 2: schema elettrico

Schema elettrico
Schema elettrico

Passaggio 3: costruzione fisica

Costruzione fisica
Costruzione fisica
Costruzione fisica
Costruzione fisica
Costruzione fisica
Costruzione fisica

La nostra soluzione ha un approccio diretto all'assemblaggio fisico.

Il ricevitore originale e la sua custodia impermeabile sono stati rimossi dall'auto RC, in quanto non necessari.

Abbiamo scoperto che c'era una posizione adatta tra le ruote anteriori per il nostro sensore di inseguimento di linea, quindi l'abbiamo tenuto in posizione avvolgendo una fascetta sopra la piastra paramotore anteriore.

Il sensore che usiamo per l'anti-collisione è in qualche modo incastrato dietro il paraurti anteriore. È ancora protetto dagli urti e il suo attrito si adatta. Finisce per guardare in avanti con un angolo verso l'alto sempre così leggero. Questo è perfetto.

La lastra di masonite, (piastra di supporto di una vecchia cornice), sulla parte superiore ha piccole sezioni di tubo di carta/resina tagliate a misura e incollate sul fondo. Questi si allineano con i supporti per i montanti del corpo e si posizionano semplicemente sopra, tenendo tutto saldamente. Supponendo che la colla che fissa il tubo alla piastra regga e che non si inclini eccessivamente, questa rimarrà in posizione. Vale anche la pena notare che la piastra è all'interno della sfera protettiva delle ruote e dei paraurti. L'Arduino Mega e le due breadboard sono state fissate alla piastra con nastro biadesivo o con un anello di nastro adesivo avvolto intorno, incollato.

Non sono state prese misure speciali per proteggere il modulo WiFi. Non è nostro, quindi incollarlo o fissarlo con del nastro adesivo è stato ritenuto non necessario in quanto è così leggero che non si muoverà molto e i fili sono sufficienti per tenerlo in posizione.

Infine, abbiamo un sensore per il rilevamento delle "stanze" che è stato collegato ai componenti delle sospensioni da una delle ruote posteriori. Durante il funzionamento, questo deve essere lontano dalla linea di marcatura utilizzata dal veicolo per navigare.

Passaggio 4: modulo ESP8266

Modulo ESP8266
Modulo ESP8266
Modulo ESP8266
Modulo ESP8266

Il modulo WiFi, ESP8266, richiede due diverse configurazioni di pin. Una configurazione deve essere utilizzata quando si esegue il flashing del modulo con un nuovo programma e si utilizza Arduino Mega 2560 come programmatore. L'altra configurazione è per il modulo quando è in uso e invia informazioni al broker MQTT.

Usando Arduino IDE per caricare il codice sul modulo ESP8266 dovrai installare un gestore di schede e un gestore di schede aggiuntivo

Sotto il gestore della scheda installa il gestore della scheda esp8266. Sarà facilmente reperibile cercando "esp". È fondamentale installare la versione 2.5.0, non più vecchia, non più recente.

Sotto le impostazioni negli URL aggiuntivi del gestore delle schede, copia in questa riga:

arduino.esp8266.com/stable/package_esp8266c…

Per poter caricare qualsiasi cosa sul modulo ESP8266 dovrai utilizzare una configurazione pin specifica in modo da poter eseguire il flashing del modulo. Questa operazione deve essere eseguita ogni volta che si desidera apportare una modifica al codice corrente in esecuzione sul modulo. Non dimenticare di selezionare il modulo ESP8266 corretto dal gestore della scheda prima di eseguire il flashing del modulo. In questo progetto abbiamo scelto la scheda ESP8266 generica. La configurazione dei pin per il lampeggio del modulo si trova nella prima immagine di questo segmento.

Dopo aver lampeggiato il modulo ESP8266 è necessario cambiare la configurazione dei pin. Puoi anche scegliere di utilizzare un adattatore per semplificare la configurazione. In questo progetto abbiamo scelto di avere un adattatore ogni volta che avevamo il modulo in esecuzione. La configurazione dei pin con l'adattatore si trova nella seconda immagine di questo segmento.

Il codice da flashare sul modulo ESP8266 configura la connessione a un WiFi e un broker MQTT, in questo caso con nome utente e password, ma può essere fatto senza se si apportano le modifiche necessarie descritte nei commenti del codice. Per questo progetto il nostro Broker ha richiesto un nome utente e una password per funzionare. Il modulo legge i messaggi in arrivo dalla porta seriale a cui è connesso. Leggerà ogni nuova riga creata dal codice Arduino, decifrerà il messaggio e ricreerà il messaggio. Successivamente invia il messaggio al broker MQTT che è stato specificato nel codice. Il codice per il modulo ESP8266:

Passaggio 5: Arduino

Dopo aver configurato il modulo WiFi, esaminiamo il programma che verrà utilizzato per controllare il motore e il servo dell'auto RC. L'auto reagirà in base a un'informazione in scala di grigi proveniente dal sensore centrale, noto anche come "Line Detector" in questo progetto. Chiaramente mira a mantenere le informazioni dal Line Detector vicino a un valore preimpostato che è uguale alle informazioni registrate al cambio tra chiaro e scuro o in questo progetto, bianco e nero. Quindi, se il valore si discosta troppo, l'uscita corrispondente al servo sterzerà l'auto vicino al valore preimpostato della linea.

Il programma ha due pulsanti che funzionano come pulsante di avvio e arresto per l'auto RC. Tecnicamente il pulsante "stop" è un pulsante "arma" che in termini equivale a un valore PWM inviato al motore che provoca l'arresto dell'auto RC. Il pulsante di avvio invia un valore PWM che è uguale all'auto RC che si muove a malapena in avanti poiché guiderà troppo velocemente se guadagna troppo slancio.

Un rilevatore di prevenzione delle collisioni viene aggiunto alla parte anteriore dell'auto RC per rilevare se la strada da percorrere è libera o bloccata. Se è bloccato, l'auto RC si fermerà fino a quando l'ostacolo non sarà sparito/rimosso. Il segnale analogico del rilevatore viene utilizzato per determinare se qualcosa sta bloccando o meno la strada ed è un criterio per poter andare avanti oltre che fermarsi.

Un sensore secondario in scala di grigi, "Room Detector", viene utilizzato per rilevare in quale stanza è entrata l'auto RC. Funziona su un principio simile al Line Detector, ma non cerca il cambiamento tra chiaro e scuro, ma piuttosto valori all'interno di un intervallo specifico che corrisponde a stanze diverse a seconda del valore visto dal Room Detector.

Infine il programma crea una linea di informazioni dai sensori per il modulo WiFi da leggere e successivamente inviare al Broker MQTT. La linea di informazioni viene creata come una stringa e scritta sul seriale corrispondente a cui è connesso il modulo WiFi. È importante che la scrittura sulla seriale avvenga solo tutte le volte che il modulo WiFi può leggere il messaggio in arrivo, ma ricorda di non utilizzare ritardi in questo codice poiché interferirà con la capacità dell'auto RC di seguire la linea. Usa invece "millis" poiché consentirà al programma di funzionare senza ritardi ma dopo una quantità definita di millis passati dall'accensione di Arduino, scriverà un messaggio sul seriale senza bloccare il codice allo stesso modo del ritardo.

Il codice per Arduino Mega 2560:

Passaggio 6: database MySQL

WampServer è un ambiente di sviluppo web per Windows che ci permette di creare applicazioni con PHP e un database MySQL. PhpMyAdmin ci permette di gestire i nostri database in modo semplice.

Per iniziare vai su:

In questo progetto utilizziamo la versione 3.17 x64 bit per Windows. Dopo l'installazione, assicurati che tutti i servizi siano in esecuzione, il che significa che la piccola icona diventa verde anziché rossa o arancione. Se l'icona è verde, puoi accedere a PhpMyAdmin per gestire il tuo database MySQL.

Accedi a MySQL utilizzando PhpMyAdmin e crea un nuovo database. Chiamalo con qualcosa di appropriato che puoi ricordare, in questo progetto è stato chiamato "line_follow_log". Dopo aver creato il database, è necessario creare una tabella nel database. Assicurati che il numero di colonne corrisponda. Nel progetto usiamo 4 colonne. Una colonna è per un timestamp e le ultime tre vengono utilizzate per memorizzare i dati del veicolo. Utilizzare un tipo di dati appropriato per ogni colonna. Abbiamo usato "longtext" per la colonna timestamp e "mediumtext" per il resto.

Questo dovrebbe essere tutto ciò che devi fare in PhpMyAdmin e MySQL. Ricorda il tuo database e la tabella per la sezione su Node-Red.

Passaggio 7: nodo rosso

Per gestire la raccolta dei dati, utilizzeremo un flusso abbastanza semplice in Node-red. Si connette al nostro server MQTT e scrive nel nostro database MYSQL.

Per fare ciò, abbiamo bisogno di alcune tavolozze per far funzionare varie funzioni e abbiamo bisogno di un codice effettivo per l'esecuzione.

Cominciando dall'inizio. Avremo bisogno dei seguenti pallet.

Node-red-contrib-mqtt-broker: questa è la connessione al nostro broker MQTT.

Node-red-dashboard: la nostra Dashboard, necessaria per rappresentare visivamente i dati raccolti.

Node-red-node-mysql: la nostra connessione al database SQL.

Questa non vuole essere una guida completa a Node-red, ma spiegherò cosa fa il flusso Node-red.

All'inizio, abbiamo avuto problemi con la morte/disconnessione del nostro server MQTT preferito, apparentemente a caso, il che ha reso le modifiche uno sforzo frustrante in quanto non era chiaro se le modifiche fossero state utili o meno quando non siamo riusciti a vedere il risultato. Quindi il pulsante 'Il server è morto?' inietta 'No' il seguente blocco lo inietta al nostro server MQTT. Se non è morto, apparirà 'No' nella finestra Debug. Questo viene fatto non solo per testare, ma per forzare Node-red a tentare di riconnettersi al server MQTT.

La 'Test string' invia una stringa di costume al broker MQTT. Abbiamo formattato questa stringa in modo che fosse simile a quella che otterremmo da Arduino. Questo per semplificare la configurazione della rete che decodifica i messaggi, senza la necessità di far funzionare il progetto, raccogliendo dati.

L'ultimo flusso nell'area di lavoro può essere diviso in due segmenti. Il ramo in basso legge semplicemente i messaggi in arrivo, li invia alla finestra di debug e li salva sul server SQL.

La grande rete di switch collegati segue un nodo funzionale se dove avviene la vera 'magia'.

La funzione di avanzamento legge la stringa in ingresso, la suddivide con ogni punto e virgola e passa le sezioni su ciascuna delle uscite. Le opzioni seguenti cercano una delle due diverse informazioni in entrata. Un'informazione specifica viene sempre passata da un output, l'altra opzione esce dal secondo output. Successivamente, c'è un secondo gruppo di blocchi di interruttori. Si attiveranno solo con un input specifico e produrranno qualcos'altro.

Un esempio, 'ostacolo', come tutti gli altri sono una scelta binaria, o è chiaro da guidare, oppure non lo è. Quindi riceverà uno 0, o un 1. Uno 0 sarà inviato al ramo 'clear', un 1 sarà inviato al ramo 'Obstructed'. Gli interruttori 'Clear', 'Obstructed', se attivati, produrranno rispettivamente qualcosa di specifico, Clear o ostruito. I blocchi di procedura verdi verranno pubblicati nella finestra di debug, il blu scriverà nella nostra dashboard.

I rami "stato" e "posizione" funzionano esattamente allo stesso modo.

Passaggio 8: broker MQTT

Un broker è un server che instrada i messaggi dai client ai client di destinazione appropriati. Un broker MQTT è uno in cui i client utilizzano una libreria MQTT per connettersi al broker su una rete.

Per questo progetto abbiamo creato un Broker MQTT utilizzando il servizio CloudMQTT con l'abbonamento gratuito per una versione "Cute Cat". Ha i suoi limiti, ma non li superiamo in questo progetto. Il modulo WiFi può connettersi al broker e il broker quindi instrada i messaggi a un client di destinazione appropriato. In questo caso il cliente è il nostro Node-Red. Il servizio CloudMQTT imposta un nome utente e una password per il loro server, quindi ci viene garantita una maggiore sicurezza. Fondamentalmente significa che solo quelli con nome utente e password possono accedere a questo specifico servizio CloudMQTT. Il nome utente e la password sono fondamentali quando si imposta la connessione sul codice ESP8266 e su Node-Red.

Le statistiche in corso per i messaggi ricevuti dal Broker sono una caratteristica piacevole, che può essere utilizzata per vedere come il tuo piano di abbonamento sta gestendo le informazioni che instrada.

Una bella caratteristica è la possibilità di inviare messaggi dal Broker al modulo WiFi ma non li abbiamo usati in questo progetto.

Passaggio 9: elettronica per hobby

Prima di iniziare sapevamo da un progetto passato che il servo dello sterzo di serie poteva essere controllato da un Arduino con un segnale PWM, con cablaggio simile e collegandolo a canali diversi sullo stesso ricevitore radio di serie, abbiamo assunto il controllo elettronico della velocità, (ESC da ora in poi), che controlla il motore, potrebbe essere controllato in modo simile tramite PWM da Arduino.

Per testare questa teoria, elaboriamo un piccolo schizzo Arduino. Lo sketch legge un input analogico da un potenziometro, rimappa il valore da 0, 1024 a 0, 255 e invia il valore risultante a un pin PWM, usando analogWrite() mentre aveva l'auto R/C su una piccola scatola e aveva il ruote rimosse.

Dopo aver esplorato l'intervallo sul misuratore di potenza, l'ESC sembrava "svegliarsi" e potevamo accelerarlo su e giù, abbiamo anche fatto stampare ad Arduino i valori sulla connessione seriale in modo da poterli monitorare.

L'ESC sembrava non gradire i valori al di sotto di una certa soglia, in questo caso 128. Ha visto il segnale 191 come acceleratore neutro e 255 come acceleratore massimo.

Non avevamo bisogno di variare la velocità del veicolo e lo stavamo facendo muovere perfettamente alla velocità più bassa che lo avrebbe fatto muovere. 192 era il valore più basso che avrebbe fatto girare il motore, tuttavia dobbiamo ancora assemblare tutto e non siamo sicuri che questa uscita sarebbe sufficiente per spostare il veicolo dopo l'assemblaggio finale, tuttavia inserire un valore leggermente più grande dovrebbe essere banale.

Eludere il potenziometro e inserire un valore fisso nel codice, tuttavia, non ha funzionato. L'ESC di serie lampeggiava semplicemente e non faceva girare il motore, "regolava il trim dell'acceleratore" secondo il manuale.

La risoluzione dei problemi furiosa, l'utilizzo di vari valori, l'utilizzo di cavi diversi e persino la sperimentazione di modificare la frequenza PWM utilizzata da Arduino hanno portato a più stranezze.

Sembrava essere un problema intermittente, a volte funzionava, altre volte si rifiutava di fare qualsiasi cosa. Continuò semplicemente a lampeggiare. Un test con il controller e il ricevitore originali ha confermato che l'ESC funzionava ancora esattamente come previsto, il che ha reso i problemi ancora più strani. Valori più alti, ha ignorato e ha continuato a lampeggiare, valori più bassi l'ESC è tornato a brillare di un verde felice, ma ancora non si è girato.

Cosa c'era di diverso dalla configurazione con il potenziometro, o il trasmettitore e il ricevitore di serie, e la versione che forniva valori fissi?

A volte lavorare come previsto e lavorare come previsto non si sovrappone molto sul diagramma di Venn. In questo caso, trattandosi di un giocattolo, non dovrebbe esserci alcuna possibilità che il modello si stacchi semplicemente o si rompa le dita o rimanga impigliato dei capelli nelle ruote o nella trasmissione mentre il modello si accende, anche se qualcosa come tenere il trasmettitore stranamente ha l'acceleratore in qualsiasi altra posizione che non sia neutrale.

'Regola il trim dell'acceleratore', questo è esattamente ciò che significa. L'ESC si aspetta un segnale neutro quando si accende, prima di ottenere che non farà nulla. Normalmente il trasmettitore sarebbe sempre in folle quando l'ESC è acceso e da lì guiderà felicemente. In caso contrario, è probabile che sia tornato in folle almeno una volta quando il modello è saldamente a terra e l'operatore si sente pronto per la gara.

Mentre usavamo il potenziometro, stavamo "spulciando" attraverso gli intervalli, e poi avrebbe iniziato a funzionare. Si è semplicemente armato mentre il potenziometro ha superato la posizione neutra, e poi ha funzionato.

Gli intervalli più bassi, tuttavia, sembravano ancora dispiacere all'ESC. Questo risulta essere un prodotto dei cicli di lavoro PWM.

Sia per progettazione che per motivi tecnici, sia il servo dello sterzo che l'ESC ignorano i segnali al di sotto del 50% dei cicli di lavoro. Questo potrebbe accadere nel caso in cui il ricevitore/trasmettitore smetta di funzionare o si esaurisca, il modello tornerà in folle e non decollerà in lontananza con la massima retromarcia. Allo stesso modo, il servo ruota solo di 180 gradi e non ha bisogno dell'intera gamma.

Con questa nuova conoscenza in mano, è stato creato un nuovo sketch Arduino. La versione iniziale accetta stringhe immesse nel monitor seriale, lo converte in un numero intero e lo sposta sul pin PWM, utilizzando la libreria servo e write()*. Se viene immesso un nuovo valore nel monitor seriale, il valore write() viene aggiornato.

Durante i test, l'ESC Traxxas di serie è stato sostituito con un Mtroniks G2 Micro, tuttavia dovrebbero funzionare allo stesso modo, anche se i valori esatti potrebbero essere leggermente diversi.

Questa libreria tratta l'ESC come un servo, a quanto pare va bene. La funzione write() dalla libreria Servo.h va da 0 a 180, il segnale di attivazione previsto dovrebbe essere intorno alla metà.

Il G2 Micro si arma a write() in un intervallo di valori vicino a 90, tuttavia è stato difficile da individuare in quanto sembra "ricordare" di essere stato armato.

Il Traxxas VXL-s3 dovrebbe armarsi con un valore write() di 91.

Dopo il segnale di attivazione, entrambi gli ESC hanno accettato felicemente i segnali PWM, indipendentemente dalle funzioni Arduino chiamate per generarli, e controllano il motore di conseguenza.

Parlando di funzioni; lo standard analogWrite(), così come write() e writeMicroseconds() dalla libreria Servo.h possono essere tutti usati in modo intercambiabile, basta tenere a mente cosa fa cosa, e alla fine nient'altro che il ciclo di lavoro conta. WriteMicroseconds() potrebbe essere utilizzato se è richiesta una maggiore granularità, tieni presente che l'intervallo qui è compreso tra 1000 e 2000, con inserimento o "neutro" previsto a 1500. Con lo standard analogWrite() si prevede che l'intervallo utilizzabile essere da 128 a 255 con circa 191 neutrali.

Consigliato: