-

hey viewer, we're moving!

We are currently transitioning to a new web system, so we are not updating this wikisite anymore.

The public part of the new web system is available at http://www.ira.disco.unimib.it


INFIND2011/12 Rover Robot

From Irawiki

Jump to: navigation, search

Students working on this project:

Contents

Introduzione

Vista frontale robot Vista posteriore robot


Lo scopo di questo progetto è la realizzazione di un rover robot equipaggiato con sensori di prossimità utilizzati per evitare gli ostacoli.

Il progetto comprende:

  • Controllo 4 motori in corrente continua indipendenti tramite segnali PWM.
  • Lettura e gestione di informazioni di distanza provenienti da sensori IR e ad ultrasuoni.
  • Controllo da PC tramite comunicazione seriale basata su moduli XBee.

Relazione

Suddivisione dei compiti

  • Progettazione iniziale condivisa
  • Merli: Ultrasuoni
  • Piccoli: IR Sharp
  • Podgoriga: Software di controllo lato PC
  • Podgoriga - Prisciantelli - Ventimiglia: Controllo motori, Connessione seriale XBee e comportamento generale robot
  • Integrazione finale condivisa

Base robotica

Sensori/attuatori utilizzati

Sensori

Sensori ad infrarossi

Sensore ad infrarossi
  • Sharp IR RF 2D120x => 5-30cm | 5Vcc | -30°C/+70°C | λ = 850nm \pm 70nm
  • Sharp IR RF 2Y0A02 => 20-150cm | 5Vcc | -30°C/+70°C | λ = 850nm \pm 70nm

Sono composti da due unità affiancate, una di emissione di segnale ad infrarosso, l'altra di rilevamento del segnale ir di ritorno, che viene riflesso da eventuali oggetti dislocati lungo l'asse orizzontale del sensore a seguito dell'irraggiamento da parte della prima unità. La potenza del segnale di ritorno, che si degrada quadraticamente rispetto alla distanza con l'ostacolo, determina la distanza a cui l'oggetto irradiato è posizionato. La risposta in frequenza della superficie dell'ostacolo può causare una sensibile attenuazione del segnale, causando una sottostima della distanza. Entrambi i sensori necessitano una alimentazione di 5V e forniscono in output un voltaggio nel range [0 3.3] V. La prima misura del sensore, che dura 38.3\pm9.6ms, è l'unica nel ciclo operativo che fornisce un output non stabile, pertanto sarà necessario scartarla.

Schema sensore ad infrarossi
Schema sensore ad infrarossi

Ultrasonic sensors HC-SR04

Sensore ad ultrasuoni

Caratteristiche Tecniche:

  • Range di misurazione: 2-400 cm
  • Accuratezza 0.3 cm
  • Angolo di rilevazione: 15 gradi
  • Alimentazione 5V
  • Consumo 15mA

Il sensore ad ultrasuoni HC-sr04 è costituito da due capsule, una trasmittente e l'altra ricevente. La capsula trasmittente genera una serie di pulsazioni ultrasoniche a 40KHz. L'onda generata di infrange contro l'ostacolo e viene riflessa verso la capsula ricevente. La distanza tra il sensore e l'oggetto è calcolata misurando il tempo di volo dell'onda sonora di ritorno.


Percorso onda sonora
Percorso onda sonora

Il funzionamento è il seguente:

  • Si tiene a livello basso il pin di TRIGGER.
  • Viene fornito un impulso a livello alto della durata di almeno 10µs e successivamente viene riportato a livello basso.
    • In questo modo viene generato una sequenza di livelli alti/bassi a circa 40Khz
  • L'onda ultrasonica colpisce il bersaglio: il segnale di ritorno viene captato dal modulo ricevente.
  • Il microcontrollore a bordo del sensore calcola il tempo di andata e ritorno del segnale ed emette sul pin di ECHO un segnale a livello alto di durata direttamente proporzionale alla distanza rilevata.
Segnali
Segnali

La relazione tra la distanza dall'ostacolo e la lunghezza dell'impulso sul pin di echo è lineare. Con ottima approssimazione, il calcolo della distanza in cm avviene dividendo il valore della lunghezza dell'impulso sul pin di echo per 58.


Attuatori

4x Motoriduttori

Micro Motoriduttore DFRobot

Un motoriduttore è un motore in continua fornito di un'apposita scatola di riduzione. Le caratteristiche tecniche del motoriduttore presente nel kit del robot sono le seguenti:

  • Gear Ratio 1:120;
  • Velocità a vuoto 100rpm (a 3V) - 200rpm (a 6V);
  • Corrente a vuoto 60mA (a 3V) - 71mA (a 6V);
  • Corrente di stallo 260mA (a 3V) - 470mA (a 6V);
  • Coppia 1.2Kgcm (a 3V) - 1.92Kgcm (a 6V);
  • Dimensioni del motore 55 x 48.3 x 23 mm;
  • Peso 45 g
Motore in continua a magnete permanente


Motore in corrente continua (DC motor)

Un motore DC è un motore elettrico che trasduce l'energia elettrica generata in energia meccanica. L'applicazione dell'alimentazione elettrica provoca la rotazione continua dell'albero motore; la rotazione dell'albero si interrompe solo quando si toglie l'alimentazione oppure quando si trova in stallo. Alcuni motori DC sono detti reversibili (come quello utilizzato) poiché se viene invertito il senso di scorrimento della corrente il motore gira in senso contrario.

  • Tensione di funzionamento.I motori DC, per applicazioni non professionali, sfruttano intervalli di tensione [1.5V, 6V]. La velocità di rotazione del motore risulta essere direttamente proporzionale alla tensione di alimentazione fornita. I motori in DC sono in grado di funzionare anche con tensioni superiori al 30% di quella nominale; conviene evitare questa situazione di lavoro poiché gli avvolgimenti potrebbero surriscaldarsi e provocare danni irreparabili.
  • Assorbimento di corrente.L'assorbimento di corrente da parte di un motore che gira liberamente (senza carico) può essere abbastanza piccolo. Quando invece il motore è collegato per esempio ad una ruota, che a sua volta fa muovere il robot, l'assorbimento di corrente può aumentare facilmente del 300%, del 400% fino al 1000%.
  • Velocità.La velocità di rotazione viene espressa in rpm (giri per minuto). La maggior parte dei motori in continua prevede una velocità di rotazione compresa tra [4000, 7000] rpm. Per le applicazioni robotiche, queste velocità sono decisamente troppo alte. Solitamente vengono ridotte sui 150 rpm utilizzando un sistema ad ingranaggi. Per questo motivo nel kit del robot sono presenti dei motori DC con scatole di riduzione.

Ci sono diversi modi per costruire un motore in corrente continua (DC motor). Il più comune è quello a magnete permanente. Prende questo nome poiché utilizza due o più magneti permanenti per realizzare uno statore. L'albero che gira nel motore, o rotore, è composto da avvolgimenti che vengono collegati ad un commutatore di tipo meccanico. All'interno del motore ci sono delle spazzole in metallo che forniscono il punto di contatto che consente alla corrente che fa girare il motore di scorrere. Grazie alle spazzole, i rotori vengono magnetizzati e generano una forza di attrazione verso i rispettivi poli del magnete permanente e la conseguente rotazione dell'albero del motore. La disposizione dei commutatori e delle spazzole fa in modo che gli avvolgimenti del motore cambino polarità durante il movimento del rotore.


Scatola di riduzione

Le scatole di riduzione servono per ridurre la velocità di rotazione di un motore. Il loro utilizzo evita che il robot subisca delle brusche accelerazioni e che si possa muovere a scatti. Il motoriduttore utilizzato ha una riduzione 1:120 in metallo che permette al motore stesso di sprigionare una coppia fino a 18.8 Ncm e sostenere una velocità a vuoto fino a 200 rpm (rotazioni per minuto).

Elettronica di supporto

Scheda controllo motori

Scheda controllo motori

Questo circuito è stato creato su una scheda prototipale millefori con l'obiettivo di poter alloggiare i 2 "Pololu TB6612FNG Dual Motor Driver Carrier" e facilitarne il collegamento con la scheda del microcontrollore ed i motori.

Pololu TB6612FNG Dual Motor Driver Carrier

Le schede della Pololu offrono un modo semplice per utilizzare il driver motori TB6612FNG prodotto dalla Toshiba, il quale può controllare indipendentemente due motori in corrente continua oppure un motore passo-passo bipolare. La tensione di alimentazione dei motori compresa tra 4.5V e 13.5 V, e la corrente di picco di 3A per canale (1A continui) fanno di questa scheda un'ottimo driver per motori di bassa potenza come i nostri. Il Ponte-H integrato è basato su tecnologia MOSFET. Questa scheda da diretto accesso a tutte le funzionalità del TB6612FNG ed aggiunge il condensatore sull'alimentazione dei motori e la loro protezione dall'inversione di polarità (note: non c'è protezione da inversione di polarità sulla Vcc della scheda). Nelle applicazioni tipiche, le connessioni di potenza sono fatte da un lato della scheda e le connessioni di controllo sono invece realizzate dall'altro lato. Tutti gli input di controllo hanno il pull-down. Ciascuno dei due canali hanno due pin per il controllo della direzione di rotazione del motore e un pin per in controllo della velocità che accetta in ingresso un segnale PWM con frequenza fino a 100 kHz. Il pin STBY deve essere posto a livello logico alto per tenere la scheda fuori dalla modalità standby.

Noi utilizziamo questi circuiti per controllare:

  • 2 motoriduttori del lato destro;
  • 2 motoriduttori del lato sinistro;

In questo modo riusciamo a gestire meglio le rotazioni sul posto grazie alla simmetria nel controllo tra asse anteriore e posteriore.


Ponte-H

Controllare i motori con funzione di reverse sarebbe impossibile senza il ponte-h. Quest'ultimo, grazie a 4 MOSFET, è in grado di invertire l'alimentazione al motore per farlo girare anche in verso antiorario. La configurazione a ponte H consente solamente a due transistor alla volta di funzionare. Quando i transistor Q1 e Q4 sono in saturazione, il motore gira in una direzione; se vengono invece mandati in saturazione i transistor Q2 e Q3, il motore gira nella direzione opposta.

H-SW Operating Description TB6612FNG

Esistono diverse tipologie di ponte-h ed ognuna di queste implementa diverse modalità di comando. I ponti-h presenti nel Pololu implementano le funzionalità descritte nella tabella sotto.

Control Function TB6612FNG

Inoltre, è possibile controllare la velocità di rotazione del motore sfruttando il controllo tramite PWM (Pulse With Modulation). Modificando il duty cycle è possibile gestire il voltaggio massimo da mandare in ingresso ai morsetti del motore.

Circuito di alimentazione

Il circuto di alimentazione è stato realizzato con lo scopo di:

  • fornire 7.5V dal pacco batterie ai motori;
  • convertire i 7.5V provenienti dalle batterie in 5V per i sensori. Per questa funzionalità è stato utilizzato un regolatore di tensione.

Regolatore di tensione

Esempio utilizzo PTR08100w

Il regolatore di tensione utilizzato è il seguente : PTR08100w. Il PTR08100W è un modulo altamente integrato e a basso costo del regolatore di commutazione che trasporta fino a 10 A della corrente d'uscita. La zona approssimativa d'occupazione del PWB TO-220 di un regolatore lineare standard CI. La dimensione è molto piccola: 0.65 x 0.41 cm. La gamma di tensione in ingresso del PTR08100W può essere da 4.5V a 14 V. La tensione di uscita può essere registrata a tutte la tensioni sopra la gamma, 0V . Lo schema elettrico generale di utilizzo è visibile nella figura a destra. Per il nostro progetto è stato utilizzato con lo scopo di ricavare 5V provenienti dal pacco batterie(che eroga 7.5V).

Comunicazione seriale: Modulo XBee

Scheda controllo motori

I moduli radio XBee 802.15.4 sono una soluzione embedded per l'interconessione wireless dei dispositivi elettronici. La comunicazione digitale con il modulo avviente tramite porta seriale, con i segnali TX, RX ed eventualmente aggiungendo il controllo di flusso; la comunicazione wireless è gestita automaticamente dal modulo ed è funzionante da subito: basta collegare due moduli alle due schede che si vogliono mettere in comunicazione e le due si vedranno collegate come se avessero un cavo seriale sulle loro porte. È necessaria una rapida procedura di configurazione tramite il programma X-CTU. Questi moduli utilizzano il protocollo di rete IEEE 802.15.4 nella banda ISM 2.4 GHz per realizzare connessioni point-to-multipoint e peer-to-peer molto veloci. Sono progettate per applicazioni ad alto trasferimento di dati che richiedono bassa latenza e tempi di comunicazione noti.

Esistono principalmente 2 modelli di XBee:

  • Standard ==> modello più economico usato per questo progetto
  • PRO ==> Prestazioni nettamente superiori

Inoltre, abbiamo scelto di adoperare il modello con antenna integrata per evitare eventuali problemi di danneggiamento involontari.

Alcune delle caratteristiche tecniche del modello scelto possono così riassunte: Performance: XBee

  • Power output:: 1mW (+0 dBm) North American & International version
  • Indoor/Urban range: Up to 100 ft (30 m)
  • Outdoor/RF line-of-sight range: Up to 300 ft (90 m)
  • RF data rate: 250 Kbps
  • Interface data rate: Up to 115.2 Kbps
  • Operating frequency: 2.4 GHz
  • Receiver sensitivity: -92 dBm

Networking

  • Spread Spectrum type: DSSS (Direct Sequence Spread Spectrum)
  • Networking topology: Point-to-point, point-to-multipoint, & peer-to-peer
  • Error handling: Retries & acknowledgements
  • Filtration options: PAN ID, Channel, and 64-bit addresses
  • Channel capacity: 16 Channels
  • Addressing: 65,000 network addresses available for each channel

Power

  • Supply voltage: 2.8 - 3.4 VDC ==> noi lo alimenteremo a 3V3 sfruttando i piedini della board
  • Transmit current: 45 mA (@ 3.3 V) boost mode 35 mA (@ 3.3 V) normal mode
  • Receive current: 50 mA (@ 3.3 V)
  • Power-down sleep current: <10 µA at 25° C

General

  • Frequency band: 2.4000 - 2.4835 GHz
  • Interface options: 3V CMOS UART

Physical Properties

  • Size: 0.960 in x 1.087 in (2.438 cm x 2.761 cm)
  • Weight: 0.10 oz (3g)
  • Antenna: Chip antenna
  • Operating temperature: -40° C to 85° C (industrial)

Periferiche utilizzate

Timers

I timer sono contatori a 16 bit: essi hanno molteplici usi, come per esempio la la misurazione di lunghezze di pulsazioni di input o la generazione di onde quadre. Tali dati possono essere manipolati mediante l'utilizzo di un prescaler e di un controllore del clock. Ogni timer ha fino a 4 canali indipendenti.

Timer-Motori

Duty cycle

Per il controllo dei motori è stata utilizzata la modalità PWM. Nello specifico si è utilizzato il TIMER 3, la cui frequenza è di 36 MHz.

Questa modalità di funzionamento, una volta configurati tutti gli opportuni registri, consente di:

  • modificare la frequenza settando il valore del registro TIM3_ARR;
  • modificare il duty cycle (percentuale di tempo in cui il segnale rimane altro rispetto al periodo totale considerato) settando il registro TIM3_CCRx(dove x identifica il canale del timer).

Il PWM viene utilizzato per modificare il duty cycle da inviare al ponte-H. Modificando il duty cycle si varia il voltaggio che viene inviato al motore e di conseguenza la sua velocità di rotazione.

La frequenza scelta per controllare i motori è di 18 KHz. Il valore viene impostato tramite il prescaler, ovvero settandolo a TIM3->PSC = 2 (contiamo fino a 1000). Dovendo controllare 4 motori sono stati sfruttati tutti e 4 i canali in modo da poter generare 4 PWM indipendenti tra loro. Le altre impostazioni utilizzate nella configurazione del PWM mode sono:

  • Full remap per sfruttare i PIN CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9;
  • PWM mode 1.
  • Timer in upcountig da TIM3->CNT = 0 a TIM3->ARR = 999.

Timer-Sonar

Per quanto riguarda la gestione del sonar, viene utilizzato il Timer 4. In particolare esso viene utilizzato sia per la funzione di emissione del burst sonoro (trigger) sia per la misurazione della lunghezza dell'impulso in entrata. Più specificatamente:

  • per la funzione di triggering è stata utilizzata la modalità di Output Compare sul registro 4 di Capture/Compare mediante la quale è stato possibile generare una emissione sonora di 10 µs. (In particolare è stato necessario configurare il registro come PWM input mode 1, con direzione di conteggio crescente).
    • Il Pin sul quale la modalità è stata configurata è PB9, Canale 4.
  • Per la funzione di echo, è stata utilizzata la modalità Input Capture: con questa configurazione il timer è in grado di rilevare due segnali di input aventi polarità inverse. In questo modo, il timer può memorizzare nei registri Capture/Compare il periodo ed il duty cycle delle catture effettuare. (Uno dei due eventi costituisce il segnale di attivazione)
    • Il Pin sul quale la modalità è stata configurata è PB6, Canale 1.

ADC1 & DMA1

L'ADC (Analogic to Digital Converter) è un dispositivo che campiona nel tempo e discretizza in livelli un segnale analogico in ingresso, fornendo in output una parola di bit corrispondente al livello letto. La risoluzione di un ADC dipende dal numero di livelli utilizzati, che vengono rappresentati da stringhe di bit. Nell'STM32 sono presenti diversi ADC. L'ADC numero 1 (ADC1) viene utilizzato per leggere ciclicamente il voltaggio in ingresso (proveniente dai sensori infrarossi) sui pin PC2 e PC3, che corrispondono ai canali IN12 e IN13 dell'ADC1. L'ADC converte il voltaggio ad una risoluzione di 12bit, e cioè in un valore compreso tra 0 e 4095 (212 − 1). Per ottenere il voltaggio in ingresso data la stringa di 12bit dell'ADC, è sufficiente normalizzare secondo il valore massimo ottenibile con 12bit meno uno e moltiplicare per il massimo valore in Volt che si puo leggere dall'ADC, ossia:

 V_{in}=\frac{valoreADC}{4095}\times3.3V

L'ADC1 è connesso con il DMA1 tramite il canale 1. Ad esso trasmette tutti i valori letti. Il DMA (Dynamic Memory Access) è un dispositivo che permette di interfacciarsi con la memoria senza dover passare tramite la CPU. Quando il DMA riceve 128 valori da ciascun sensore, per un totale quindi di 256 trasferimenti, scatena un interrupt che viene gestito da una routine ad-hoc. In questa routine si toglie al DMA1 la possibilità di scatenare un interrupt e si alza un flag. Successivamente, nel ciclo centrale del processo, se il flag è alzato, si fa la media dei 128 valori, si converte tale media grazie alla funzione sopra descritta, si salva il valore in una variabile leggibile dall'esterno ed infine si riabilita la possibilità per il DMA di scatenare interrupt. Questa procedura apparentemente più complicata del previsto è stata fatta per spostare la computazione al di fuori dell'interrupt, in modo tale che se nel frattempo si verificano altri interrupt, essi vengono gestiti all'istante, senza che vi sia la necessità di aspettare la fine della computazione.

DMA1 canale 4

Direct Memory Access è un meccanismo che consente ad alcune periferiche di accedere direttamente alla memoria di sistema per scambiarsi dati, oppure leggere o scrivere, senza chiamare in causa la CPU per ogni byte trasferito tramite il meccanismo usuale dell'interrupt e la successiva richiesta di operazione desiderata, ma generando un singolo interrupt per blocco trasferito. In questo progetto abbiamo creato un'apposita struttura dati di tipo FIFO che gestire il trasferimento di stringhe, tramite DMA, dal microcontrollore al PC. Il DMA viene attivato solamente quando c'è una stringa pronta da trasferire. A questo punto viene scatenato un interrupt che avvia il trasferimento.

USART

Per implementare la comunicazione seriale è stata utilizzata la USART1(Universal Synchronous Asynchronous Receiver Transmitter). Per gestire l'invio di stringhe viene utilizzato il DMA1 canale 4. Il funzionamento in ricezione è il seguente:

  1. alla ricezione di un carattere viene generato un interrupt;
  2. il carattere viene memorizzato in una struttura dati FIFO;
  3. il carattere viene mantenuto nell'array fino a quando non viene letto dal microcontrollore.

Il funzionamento in trasmissione è il seguente:

  1. si configura il DMA1 channel 4 memory address register con il puntatore alla stringa che deve essere invita;
  2. si imposta la lunghezza della stringa da inviare;
  3. si attiva il DMA;
  4. viene scatenato l'interrupt per l'invio della stringa

Struttura del firmware

Moduli

Il software è stato suddiviso in componenti semplici e separati tra loro. Ognuna delle diverse cartelle presenti nel progetto fa riferimento alle funzionalità di un sensore/attuatore e le sue periferiche sul microcontrollore. E' presente anche una cartella contenente gli "unit test" per i singoli sensori/attuatori ed una cartella per l'applicazione completa del robot. Il software è suddiviso come nella tabella sottostante.

Moduli Contenuto del modulo
global.h Contenitore delle variabili globali di sistema
highLevelFeatures
  • application.h: Contiene l'applicativo di navigazione del Rover Bot
init
  • clock_init.h: file di inizializzazione del clock di sistema
IRSensor
  • ir_functionality.h: contiene le funzioni di inizializzazione e gestione dei sensori ad infrarossi
motors
  • init_motors.h: inizializzazione motori dei pin e dei PWM
  • action_motors.h: contiene le funzioni di attuazione per i motori e la rinominazione dei pin in base alla funzionalità.
sonar
  • ir_functionality.h: contiene le funzioni di inizializzazione e gestione del sonar
test
  • test_IR.h : : test acquisizione delle distanze tramite gli IR (long e short)
  • test_navigazione.h : test di navigazione senza sensori
  • test_Ruote.h : test per i movimenti delle singole ruote
  • test_Seriale.h : test invio messaggio al pc
  • test_Sonar.h : test acquisizione delle distanze tramite il Sonar
xbee
  • dma_xbee.h: Configurazione DMA per Xbee
  • functionality_xbee.h: funzionalità per la l'invio e la ricezione tramite Xbee
  • init_xbee.h: inizializzazione delle periferiche di comunicazione per la comunicazione seriale

Logica di controllo

Lo schema al lato illustra il funzionamento generale del robot. I passi da seguire sono i seguenti:

  1. Il robot attende un comando;
  2. Verifica che non siano presenti ostacoli lungo la traiettoria desiderata;
  3. Se non è presente alcun ostacolo vengono attuati i motori per il eseguire il movimento desiderato, altrimenti ritorna al passo 1;
  4. Durante il movimento, i sensori continuano ad effettuare nuove misurazioni e a valutare l'eventuale presenza di ostacoli lungo la traiettoria;
  5. Se viene individuato un ostacolo improvviso il robot ferma, altrimenti ritorna al passo 4;
  6. Se c'è un ostacolo o più di un ostacolo, il robot si ferma e ritorna al step iniziale (passo 1);
  7. Se l'utente ha inviato una nuova azione di controllo il robot ritorna al passo 2, altrimenti ritorna al passo 4.
Logica di controllo del robot
Logica di controllo del robot

Macchina a stati finiti

La tabella sottostante mostra gli input e le transizioni che possono verificarsi durante la modalità di navigazione (ovvero quella in cui tutte le componenti del robot sono attive). Inoltre, è possibile osservare la rappresentazione della tabella nella figura contenente la macchina a stati finiti.

Tabella transizioni

Macchina a stati finiti

Configurazione del DMA1 e dell'ADC1

Nella funzione di init_IR() imposto l'ADC1 e il DMA1, che cooperano nella lettura dei sensori ad infrarosso.

Il DMA1, abbinato all'ADC1, viene configurato nel seguente modo:

  • imposto il numero di trasferimenti al termine del quale scatenare un interrupt
  • si imposta l'indirizzo di memoria della periferica dalla quale andare a prendere i dati
  • si imposta l'indirizzo di memoria dell'array su cui verranno salvati i dati
  • impongo che la dimensione del trasferimento sia di 16bit
  • scelgo il tipo di interrupt, in questo caso interrupt di trasferimento completato
  • abilito la modalità circolare, ovvero quando l'array è stato riempito riparto dall'inizio con i dati più nuovi
  • abilito l'auto incremento del puntatore nell'array nel quale salvo i valori
  • dico quale funzione sarà adibita a gestire l'interrupt

//imposto il numero di trasferimenti da eseguire (128*2)
DMA1_Channel1->CNDTR = num_trasferimenti;
//imposto l'indirizzo di memoria della periferica CPAR a quello del data register dell'ADC1
DMA1_Channel1->CPAR = (uint32_t) &(ADC1->DR);
//imposto l'indirizzo di memoria sul quale salvare i dati a quello di un array creato ad-hoc
DMA1_Channel1->CMAR = (uint32_t) &buffer;
//imposto la dimensione del trasferimento a 16bit
DMA1_Channel1->CCR |= DMA_CCR1_PSIZE_0;
DMA1_Channel1->CCR |= DMA_CCR1_MSIZE_0;
//abilito l'interrupt di trasfer complete (TCIE)
DMA1_Channel1->CCR |= DMA_CCR1_TCIE;
//abilito la modalità circolare
DMA1_Channel1->CCR |= DMA_CCR1_CIRC;
//abilito l'auto incremento del puntatore sull'indirizzo di memoria
DMA1_Channel1->CCR |= DMA_CCR1_MINC
//abilito l'interrupt e definisco l'override della funzione di handle
NVIC_SetPriority(DMA1_Channel1_IRQn, 2);
NVIC_EnableIRQ(DMA1_Channel1_IRQn);


Per quanto riguarda l'ADC1, che raccoglie i valori dai sensori infrarossi:

  • abbiamo impostato il tempo di campionamento a 239.5 cicli di clock. Da tener presente che il tempo totale di acquisizione di un campione è di (239.5 cicli + 1us).
  • esprimo quante acquisizioni voglio fare ad ogni ciclo, due nel nostro caso, una per ogni sensore
  • determino dove eseguire la prima e la seconda conversione
  • imposto la modalità continua, per far si che il processo di acquisizione venga reiterato
  • abilito l'utilizzo del DMA1
  • calibro il DMA1 e lo accendo per la prima volta (power on)

//imposto il tempo di campionamento a 239.5 cicli (111)
ADC1->SMPR1 |= ADC_SMPR1_SMP13_2 | ADC_SMPR1_SMP13_1 | ADC_SMPR1_SMP13_0;
//impongo che vengano effettuate 2 conversioni nei canali regolari ad ogni ciclo
ADC1->SQR1 |= ADC_SQR1_L_0;
//seleziono canale 13 (pin13 - 1101) come prima conversione
ADC1->SQR3 |= ADC_SQR3_SQ1_3 | ADC_SQR3_SQ1_2 | ADC_SQR3_SQ1_0;
//seleziono canale 12 (pin12 - 1100) come seconda conversione
ADC1->SQR3 |= ADC_SQR3_SQ2_3 | ADC_SQR3_SQ2_2;
//imposto la modalità continua
ADC1->CR2 |= ADC_CR2_CONT;
//abilito l'utilizzo del DMA
ADC1->CR2 |= ADC_CR2_DMA;
//accendo l'ADC
ADC1->CR2 |= ADC_CR2_ADON;
//resetto il registro di calibrazione
ADC1->CR2 |= ADC_CR2_RSTCAL;
//abilito lo scan mode
ADC1->CR1 |= ADC_CR1_SCAN;
//calibro l'ADC
ADC1->CR2 |= ADC_CR2_CAL;


Quando l'ADC è stato calibrato:

  • lo abilito
  • lo accendo per la seconda volta per far partire le acquisizioni

//abilito il DMA
DMA1_Channel1->CCR |= DMA_CCR1_EN;
//accendo l'ADC per la seconda volta per far iniziare le conversioni
ADC1->CR2 |= ADC_CR2_ADON;


Nella funzione di callback che viene chiamata allo scatenarsi dell'interrupt

  • spengo l'ADC1
  • imposto un flag di nuovo dato

La procedura di gestione del nuovo dato verrà eseguita all'interno del ciclo principale, in modo tale da non risultare bloccante rispetto alla richiesta di interrupt da parte di altre entità.



Protocollo di comunicazione seriale

Comandi utilizzabili, struttura del parser, formato dei dati trasmessi, etc etc

PC => Robot (Modalità navigazione e test navigazione)

Comando Carattere trasmesso Parametri Note
Incrementa velocità '+' 1 char
Decrementa velocità '-' 1 char
Avanti w 1 char
Indietro s 1 char
Ruota sul posto a sinistra a 1 char
Ruota sul posto a destra d 1 char
Stop p 1 char Viene inviato quando un tasto di comando viene rilasciato
Svolta a sinistra q 1 char
Svolta a destra e 1 char
Ritornare al menù principale 0 1 char


PC => Robot (Modalità test seriale)

Comando Carattere trasmesso Parametri Note
Il PC chiede al microcontrollore di inviargli una stringa di prova w 1 char
Ritornare al menù principale 0 1 char

PC => Robot (Modalità test sonar)

Comando Carattere trasmesso Parametri Note
Il PC chiede al microcontrollore di inviargli una stringa contenente l'ultima acquisizione del sonar w 1 char
Ritornare al menù principale 0 1 char


PC => Robot (Modalità test IR)

Comando Carattere trasmesso Parametri Note
Il PC chiede al microcontrollore di inviargli una stringa contenente l'ultima acquisizione dell'IR short s 1 char
Il PC chiede al microcontrollore di inviargli una stringa contenente l'ultima acquisizione dell'IR long l 1 char
Ritornare al menù principale 0 1 char


PC => Robot (Modalità test singole ruote)

Comando Carattere trasmesso Parametri Note
Rotazione avanti posteriore sx w 1 char
Rotazione indietro posteriore sx s 1 char
Rotazione indietro anteriore sx a 1 char
Rotazione avanti anteriore sx q 1 char
Interruzione del movimento ==> Stop p 1 char
Rotazione indietro anteriore destra d 1 char
Rotazione avanti anteriore destra e 1 char
Rotazione indietro posteriore destra f 1 char
Rotazione avanti posteriore destra r 1 char
Ritornare al menù principale 0 1 char

Risultati e conclusioni

A seguito di un numeroso set di prove sperimentali di diversa natura si è verificato che:

  • Il robot risponde in modo corretto ad ogni input utente, facendo corrispondere ad essi le funzionalità associate.
  • Il condizionamento dei movimenti da parte dei sensori avviene in modo preciso, accurato e soprattutto tempestivo.
  • Gli interrupt sono stati gestiti in modo tale che non risultino bloccanti.
  • Il robot riesce a frenare in tempo, con ampi margini di distanza dall'ostacolo, anche se lanciato a velocità massima contro di esso. La frenata a massima velocità richiede uno spazio di frenata compreso tra i 4 ed i 6 cm (dipende dall'attrito della superficie di contatto)

Nonostante alcuni problemi, che hanno rallentato il lavoro, siamo riusciti a raggiungere gli obiettivi che ci eravamo preposti.

Problemi riscontrati

Durante lo svolgimento di questo progetto i problemi riscontrati sono stati molteplici:

  1. abbiamo riscontrato una serie di problemi con la strumentazione in fase di programmazione. In alcuni casi la scheda ha necessitato di reset, l'ST-LINK si è bloccata da solo ed Eclipse talvota necessitava di qualche riavvio.
  2. il problema principale è stato riscontrato nella fase finale del progetto. Una volta che tutte le parti funzionavano correttamente singolarmente, abbiamo provveduto ad integrarle tra loro. Volendo alimentare tutti i componenti con il pacco batterie, si è riscontrato che l'alimentazione non era sufficiente per l'obiettivo che ci si era preposti. L'attuazione contemporanea dei 4 motori, causava errate misurazioni del sonar a causa della mancanza di corrente sufficiente per tutte le componenti. Per questo motivo si è deciso di:
    • alimentare i motori direttamente dal pacco batterie;
    • alimentare i sensori e la scheda con un'alimentazione alternativa. Purtroppo, non avendo a disposizione un ulteriore pacco batterie, i 5V necessari ad alimentarli sono stati ricavati dalla porta USB del PC. Il PC viene collegato ad una delle 2 porte USB, nella seconda porta della scheda viene collegato un altro cavo USB diretto alla "ciabatta pin" ideata appositamente(sulla scheda di alimentazione) per l'alimentazione dei sensori.
  3. quando le batterie sono nuove, ognuna di esse fornisce 1.6V (8V in totale). Ciò non dovrebbe creare problemi ai ponti-h, ma i motori potrebbero danneggiarsi a causa del surriscaldamento. Inoltre, sempre nel caso di batterie cariche ed impostazione velocità massima di rotazione per tutti i motori, potrebbe capitare che il software venga interrotto bruscamente. Nel caso di batterie nuove, conviene non impostare velocità superiori all'80%.
  4. dal momento che la calibrazione delle ruote è stata effettuata con una carica delle pile dell'80%, i movimenti risultano meno fluidi con una carica inferiore.
  5. l'IR sulla lunga distanza, per misurazioni superiori ai 60 cm, inizia a fornire misurazioni poco precise. In realtà, ciò corrisponde alle nostre esigente, poiché preferiamo che le misurazioni siano più precise in prossimità di ostacoli.

Sviluppi futuri

  • Attualmente il robot effettua azioni di controllo dei motori in anello aperto. Sarebbe più opportuno, per migliorare la precisione dei movimenti, passare ad un controllo in anello chisuo tramite l'utilizzo di encoders.
  • Inserire un secondo pacco batterie per rendere il robot totalmente indipendente dall'alimentazione proveniente dall'USB del PC.
  • Creare un software per la navigazione autonoma, eventualmente aumentando la sensoristica di bordo.
  • Tramite la navigazione autonoma sarebbe possibile creare un gioco stile "guardia e ladri" per l'intrattenimento dei bambini. A tale scopo sarebbe preferibile montare una telecamera di bordo per valutare la presenza del giocatore, traccarne il movimento e valutarne le azioni che compie.
  • Sulla base del tipo di superficie di contatto (marmo, asfalto, piastrelle, tappeti, etc.) si potrebbero effettuare diverse calibrazioni dei movimenti. L'utente potrebbe così scegliere dinamicamente la configurazione meglio si adatta alle condizioni ambientali.

Manuale utente

Collegamenti hardware

Schema elettrico Rover Robot

Lo schema al lato illustra a livello logico lo schema elettrico del robot.

Pile

L'alimentazione necessaria al funzionamento viene fornita dal pacco batterie con un alloggio per 5 pile di tipo AA. Inizialmente, la scelta del tipo di batterie era ricaduta su:

  1. pile "Alcaline di qualità" da 1.5V;
  2. pile ricaricabili Nichel cadmio.

Le pile di tipologia 2 erogano una tensione nominale da 1.2V. Questa tensione avrebbe generato 6V ed avrebbe creato dei problemi con il regolatore di tensione sfruttato per generare i 5V a partire dai 7.5V. Per questo motivo sono state alloggiate 5 pile "Alcaline di qualità". Ciò non toglie che si possano usare delle batterie più costose di tipo LiFeS2 che garantirebbero una durata di circa 7 volte superiore.


I motori sono gli unici ad essere alimentati direttamente dal pacco batterie. Gli altri dispositivi sfruttano tutti quanti un'alimentazione a 5V proveniente dal circuito di alimentazione e nello specifico dal regolatore di tensione.







La tabella sotto illustra le connessioni hardware effettuate tra la board, i sensori e le altre schede prototipali sviluppate.


Dispositivo Tipo PIN PIN
IR IN12 e IN13 dell'ADC1 - V_{in}^{max} = 3.3V
  • PC2 ==> Medium Distance IR Sensor 20cm - 150cm
  • PC3 ==> Short Distance IR Sensor 5cm - 30cm
SONAR PWM -> TIM4
  • PB9 ==> Trigger
  • PB6 ==> Echo
PONTI-H PWM -> TIM3 (il circuito di controllo motori accetta max 100 KHz di PWM)
  • PC6 CH1 (1)==> PWM ruota posteriore sx
  • PC7 CH2 (7)==> PWM ruota anteriore sx
  • PC8 CH3 (8)==> PWM ruota posteriore dx
  • PC9 CH4 (14)==> PWM ruota anteriore dx
PONTI-H I/O GENERICI

I numeri indicati dentro la parentesi tonda indicano il pin di collegamento sulla scheda controllo motori

Ruota posteriore sx

  • PD11 (3) ==> IN1
  • PD5 (2) ==> IN2

Ruota anteriore sx

  • PD14 (5) ==> IN1
  • PD15 (6) ==> IN2

Ruota posteriore dx

  • PD8 (10) ==> IN1
  • PD9 (9) ==> IN2

Ruota anteriore dx

  • PD10 (12) ==> IN1
  • PD7 (13) ==> IN2

Stanby lato sx

  • PD4 (4)

Stanby lato dx

  • PD1 (11)


XBEE Minimum connections: VCC, GND, DOUT & DIN
  • PA9 ==> USART1_TX
  • PA10 ==> USART1_RX
  • In alternativa è possibile sfruttare i canali appositi della porta seriale/USB di tipo B alloggiata sulla board. Ciò è possibile poiché anche la seriale sfrutta il PA9 ed il PA10.

Procedura di accensione

Calibrazioni iniziali

Procedura di calibrazione dei sensori ad infrarossi

Una volta terminata la configurazione dell'ADC1 e del DMA, si passa alla procedura di calibrazione. Per ogni sensore è necessario stimare la funzione che, dato un voltaggio in input dal sensore, sia in grado di stimare con un ragionevole grado di accuratezza la distanza corrispondente. Tale funzione sarà pertanto del tipo: distanza = f(V). Da notare che tale funzione deve essere iniettiva, altrimenti si avrà che almeno per un valore di y, coincideranno due elementi di x. Sebbene entrambi i sensori, nella prima parte della curva, non presentano tale proprietà, è possibile ovviare a tale limitazione vincolando la distanza minima rilevabile al punto in cui la funzione diventa iniettiva. Per la stima di tale funzione sono stati acquisiti 21 campioni dal sensore a media distanza 2Y0A02 e 20 campioni dal sensore a corto raggio 2D120x, scelti in modo tale da coprire al meglio sia il dominio (V) che il codominio (cm), per rendere il più accurato possibile tale processo. Le acquisizioni dei campioni sono state eseguite in un ambiente controllato. Successivamente, con l'ausilio di Matlab abbiamo stimato le funzioni caratteristiche dei due sensori, facendo attenzione al tipo di curva impiegata per evitare i fenomeni di overfitting e underfitting. Per entrambi i sensori si è scelto di utilizzare una approssimazione polinomiale di quinto grado avente forma:

y = p1x5 + p2x4 + p3x3 + p4x2 + p5x + p6;

Per quanto riguarda il sensore a media distanza i valori stimati dei coefficienti p1-p6 sono:

   p1 = 14.165;
   p2 = -115.57;
   p3 = 332.53;
   p4 = -356.17;
   p5 = -17.117;
   p6 = 225.35;
Funzione caratteristica del sensore Sharp 2Y0A02
Campioni acquisiti e funzione caratteristica stimata per il sensore Sharp 2Y0A02


mentre per quanto riguarda il sensore a corto raggio i valori sono:

   p1 = -2.6008;
   p2 = 22.78;
   p3 = -79.379;
   p4 = 140.43;
   p5 = -133.32;
   p6 = 65.203;
Funzione caratteristica del sensore Sharp 2D120x
Campioni acquisiti e funzione caratteristica stimata per il sensore Sharp 2D120x


Le funzioni caratteristiche ricavate in questo processo permettono una stima molto accurata della distanza.


Configurazione moduli XBee

La procedura di configurazione dei moduli XBee è ampiamente e dattagliatamente spiegata nel seguente video.


Procedura di calibrazione motori

I motori utilizzati funzionano in anello aperto. Dal momento che non sfruttiamo degli enconders la procedura di calibrazione è stata svolta in modo approssimativo. Le calibrazioni che sono state effettuate sono le seguenti:

  1. A causa di alcuni problemi di costruzione, non tutti i motori, alimentati alla stessa tensione, forniscono in output la stessa velocità di rotazione. Per questo motivo bisogna cercare di aggiungere dei set-points per calibrare le ruote e forzarle a muoversi tutte quante alla stessa velocità. Per questa procedura abbiamo segnato delle tacchette sulle ruote tramite nastro adesivo. Attraverso le diverse azioni di controllo abbiamo potuto notare che la ruota anteriore destra è più lenta delle altre 3. Per questa prima calibrazione, dopo diverse prove sperimentali, abbiamo deciso di sottrarre alle altre 3 ruote un valore pari a 10 nel TIM3->CCRx.
  1. La seconda calibrazione è stata effettuata per rendere la dinamica delle rotazioni sul posto e delle curvature più fluide. Anche in questo caso sono state svolte diverse prove sperimentali. La procedura di calibrazione è fortemente influenzata dal voltaggio fornito ai motori e quindi dalla carica delle batterie. La nostra calibrazione è stata effettuata con una tensione di 7.48V, ovvero nel caso di batterie quasi totalmente cariche.

Allegati

Codice sorgente del Firmware

Software microcontrollore File:Project rover robot esame .zip

Codice sorgente di eventuali applicazioni lato PC

Applicativo PC - Rover Bot Controller File:RBC.zip

Documentazione Doxygen

File:Documentazione Rover Bot.zip

Materiale utile

Xbee

IR range finders:

Ultrasonic sensors:

Ponte H

PWM

Regolatore di tensione 5V

Personal tools