Non è da molto tempo che la Raspberry PI Fondation ha cominciato a distribuire una nuova scheda la PICO, basata su una MCU di loro progettazione il cui cuore è comunque un processore ARM dual-core Cortex M0+. Tutte le caratteristiche, e le informazioni per utilizzarla, le trovare nel sito https://www.raspberrypi.org/products/raspberry-pi-pico/, quindi non sto qui a soffermarmi nei dettagli.

Il Robot SERPICO

Ma veniamo direttamente al progetto, come membro di Officine Robotiche il primo progetto che potevo realizzare con la PICO secondo voi poteva non essere un Robot? Direi proprio di no, e devo dire che sono rimasto anche sorpreso dalle caratteristiche della MCU RP2040, perché presenta delle funzionalità che ben si adattano alla realizzazione di un Robot.

Il nome del Robot è S.E.R.PICO, che come avrete già capito, altro non è che l’acronimo di: Studying Electronics and Robotics with PICO.

Tutto il codice è altre informazioni sono disponibili nel seguente repository: https://github.com/bobboteck/SERPICO

The English version of this article is available on my personal website: https://bobboteck.github.io/robots/serpico

Semplicità costruttiva, è la parola d’ordine

Non vorrei dare troppe illusioni con la parola semplicità, quindi vi dico subito che servirà usare un saldatore, ma ho cercato di realizzare SERPICO usando quanto di più semplice avevo in casa, e senza la necessità di dover stampare qualcosa in 3D. Vediamo l’elenco dei componenti necessari per la realizzazione:

  • Raspberry PI PICO (mi sembra ovvio)
  • base per Robot in kit (cercare “Robot Car Chassis Kit” su internet)
  • un pezzo di PVC espanso o un altro piano uguale a quello del Robot
  • dei distanziatori in nylon o metallo
  • una breadboard
  • driver motori basato su DRV8833
  • sensore Ultrasuoni HC-SR04 e relativo supporto
  • due resistenze (una da … e una da …)
  • fili per i collegamenti sulla breadboard
  • powerbank con due uscite
  • un cavo USB da tagliare

Il kit per la base del Robot, è una scelta per sopperire al classico tallone d’Achille per chi si approccia per la prima volta alla realizzazione di un Robot, e non dispone di strumenti/attrezzature particolari (vedi stampante 3D, CNC, taglio laser, …). Sempre in rete si possono trovare singole basi senza tutto il kit, per realizzare il piano superiore, io in alternativa ho usato un pezzo di PVC espanso, che si può tagliare facilmente anche con il taglierino (mi raccomando fate comunque attenzione) e forare con un cacciavite. Ho usato questo secondo piano come supporto della breadboard, mentre su quello del kit ho ancorato il powerbank.

Il KIT utilizzato per realizzare il Robot

Il circuito

Assemblare il circuito è molto semplice, dopo aver saldato le due file di connettori a pettine sulla PICO inserirla nella breadboard.

ATTENZIONE!!! Controllate bene i collegamenti che andate a fare sulla breadboard, evitando di creare dei cortocircuiti, che potrebbero danneggiare le porte USB del vostro computer. Un consiglio che potrei darvi per non correre rischi, è di programmare la scheda prima di assemblare il resto del circuito, in modo da poterne provare le singole parti utilizzando anche un vecchio powerbank. Una volta programmata la PICO, come prima cosa farà lampeggiare il led 5 volte, già questo è un buon sintomo che sta funzionando.

Schema di assemblaggio

Per prima cosa colleghiamo il secondo cavo USB ad uno dei lati che portano l’alimentazione della breadboard, nel disegno per dare l’idea di cosa andava fatto ho messo un connettore micro USB, da cui prende i due segnali del +5V e GND. Io, ad esempio, ho utilizzato un vecchio cavo USB con il connettore rotto da un lato, quindi dal lato USB A lo uso per collegarlo al PowerBank, sull’altro lato l’ho tagliato e preso i due fili Rosso e Nero per collegarli con due pin da inserire nella breadboard. Successivamente si può collegare il sensore ultrasuoni, come si può vedere dallo schema di montaggio l’alimentazione del sensore va collegata alla linea 5 Volt che viene dal PowerBank. Il pin del Trigger può essere pilotato direttamente dalla PICO, mentre l’uscita del sensore (Echo) che anche lei a 5 Volt non può essere inviata direttamente alla PICO, ma utilizziamo un partitore di tensione per fare in modo che i 5 Volt diventino circa 3,3. Collegando questa volta al PowerBank sia la PICO, che il connettore per i 5 Volt, dopo il lampeggio del led sulla PICO, dovreste sentire un leggerissimo click emesso dal sensore HC-SR05. Se non ci sono problemi potreste poi collegare la PICO al PC, aprire un terminale sulla Seriale e vedere a video la misura letta dal sensore. Dopo aver scollegato i cavi USB, dal PowerBank o dal PC, continuate completando i collegamenti del modulo con il DRV8833 e i motori. Collegando di nuovo i cavi USB all’alimentazione, le due ruote cominceranno a girare, quindi prestate attenzione. Se anche le ruote girano complimenti il vostro Robot sta funzionando.

Le periferiche

Quello che vorrei evidenziare è una delle possibilità che ci offre la MCU RP2040, riguardo la generazione dei segnali PWM che vengono utilizzati per pilotare i due motori. In pratica la RP2040 ha ben 8 periferiche capaci di generare segnali PWM chiamate Slice, ognuna di queste dispone di due uscite, identificate con lettere A e B, e collegate a due GPIO. Se volete leggere qualche dettaglio in più vi rimando all’articolo del nostro amico Giovanni Bernardo di Settorezero https://www.settorezero.com/wordpress/raspberry-pi-pico-gestione-del-pwm-in-micropython/. Oltre alla configurazione dei vari parametri, per determinare la modalità di funzionamento e la frequenza del segnale generato da ogni slice è possibile stabilire la polarità delle due uscite A e B. E sufficiente impostare l’uscita B come invertita per avere i due segnali PWM in opposizione di fase, perfetti per pilotare un Ponte H in modalità LAP, in questo modo avremo che con il Duty Cycle al 50% il motore resta fermo, mentre andrà alla velocità massima in un verso o nell’altro con il Duty Cycle allo 0% o al 100%. Non è scontato trovare questa modalità in un microcontrollore, ad esempio nei PIC è presente solo nei modelli realizzati appositamente per il controllo motori. Aggiungo solo che per ottenere una frequenza di 20KHz, viene impostato il registro TOP a 5000, quindi potremmo variare il registro (CC), usato per comparare il valore del contatore, che stabilisce il Duty Cycle del PWM da 0 a 5000. Ricordandoci che con 5000 avremo la massima velocità in avanti, con 0 la massima velocità indietro, mentre impostando il registro a metà (2500) i motori saranno fermi. Avrete modo di sperimentare anche empiricamente, che potrebbe essere necessario un valore superiore a 3000 per far cominciare a girare il motore, il perché è un’altra storia che magari avremo modo di approfondire in altre occasioni.

Il programma

Non vorrei entrare nel dettaglio di ogni singola riga di codice, se guardate il programma completo è ben commentato e dovrebbe essere abbastanza facile da leggere. Le prime righe del main servono a configurare i GPIO utilizzati, in particolare la configurazione dei due Slice PWM. La parte principale del programma, è tutta contenuta nel loop infinito, realizzato tramite l’istruzione:

while(1){  }

Per prima cosa viene effettuata una misura della distanza con il sensore HC-SR04 con la funzione usMeter(), di cui dopo vediamo qualche dettaglio, se la distanza misurata è maggiore di 10 cm, viene applicata una semplice formula per impostare il valore duty cycle del PWM, per avere una velocità proporzionale allo spazio libero di fronte al Robot. Altrimenti se la distanza è minore o uguale a 10 viene chiamata la funzione turn() che, ferma i motori, li fa ruotare in senso opposto per un secondo e poi li ferma di nuovo.

Vediamo ora come viene calcolato il valore per il registro CC. Ipotizzando che la distanza massima misurabile dal sensore a ultrasuoni sia di 200 centimetri (2 metri), che il valore minimo del registro CC per far muovere le ruote in avanti è di 3000 e 5000 è il valore massimo, per come sono stati configurati gli Slice in questo caso, abbiamo la possibilità di sfruttare una variazione di:

5000 - 3000 = 2000

Se rapportiamo questo valore calcolato (2000), con il numero massimo di centimetri che abbiamo definito che possiamo misurare (200), abbiamo come risultato 10, da queste considerazioni possiamo definire la seguente formula:

pwmDuty = (obstacleDistance * 10) + 3000

Sarà sufficiente applicare questo valore a tutti i registri CC, di entrambi i canali dei due Slice, per farlo basterà usare queste due istruzioni:

pwm_set_both_levels(slice0, pwmDuty, pwmDuty);
pwm_set_both_levels(slice1, pwmDuty, pwmDuty);

La funzione che gestisce il sensore a ultrasuoni HC-SR04, è molto semplice, rispecchia quelle che sono le indicazioni riportate nel Data Sheet del sensore. Viene da prima inviato un impulso della giusta durata sul pin Trigger, poi viene preso il tempo, in microSecondi, in cui il pin Echo passa allo stato logico 1, successivamente aspetta che torni allo stato logico 0 per prendere di nuovo il tempo, o in alternativa attende per un massimo di 11600 microsecondi, che corrispondono ad una misura di circa 198 cm. In questo modo qualsiasi misura oltre i due metri viene troncata, semplificando la gestione del sensore e del Robot stesso, e poi una misura di 2 metri circa è più che sufficiente per i nostri scopi. Questa funzione potrà avere diversi difetti, ma il più grande è quello di bloccare la CPU durante il tempo di attesa di risposta del sensore, per un tempo massimo di circa 12 millisecondi, che a noi può sembrare niente, ma per una CPU di questo tipo è un tempo enorme.

Qualcuno si starà domandando perché 198 e non 200, visto quello che ho scritto prima, semplicemente perché ho considerato come velocità di propagazione del suono 0.0343 cm/uS, e quindi:

11600 * 0.0343 = 397.88 cm

che però dobbiamo dividere per 2, visto che misuriamo sia l’andata che il ritorno dell’onda sonora ci da:

397.88 / 2 = 198.94

Un valore accettabile per i nostri scopi, considerando poi che la velocità di propagazione del suono può essere influenzata, anche se leggermente, da diversi fattori tra cui temperatura e umidità dell’aria, direi che non ha senso andare a cercare un valore preciso al millimetro senza pensare di compensare tutti questi altri fattori.

C’è ancora tanto da poter fare Se siete arrivati a leggere fin qui, grazie, se avete anche realizzato il Robot posso dirvi che avete soltanto cominciato a giocare, perché se siete curiosi di capire quali altre cose ha da offrirvi la PICO ci sono tanti aspetti che potrebbero essere approfonditi, per migliorare il funzionamento del Robot, eccone giusto un paio per incuriosirvi un po’ di più:

  • Capire se è possibile utilizzare una delle periferiche HW della PICO, per gestire il sensore HC-SR04, in modo da non occupare tempo CPU
  • Utilizzare il secondo Core, ad esempio per generare le rampe, e il primo Core per gestire i controlli di navigazione

Se vi vengono in mente altre idee, e magari le implementate pure fatemi sapere, potete contattarmi direttamente o tramite i canali di Officine Robotiche.

Video

In questo video è possibile vedere SERPICO in azione:

Il Robot è stato presentato anche durante un OR-Aperitech, dove sono state raccontate tutte le caratteristiche e altri particolari:

Buon divertimento!

Aggiornato: