Fisiologia del nostro robot



Похожие документы
Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Automobile Bluetooth

Esercitazione Monitoraggio temperatura via WEB mediante Arduino YUN

Progetti reali con ARDUINO

Università degli studi di Roma LA SAPIENZA

Arduino: Programmazione

// Controllo remoto 05/05/2012 // poichè sono ancora ai primi passi ho usato // a larghe mani idee e listati di altri. Ringrazio tutti loro.

8^ parte : Pilotare Motori passo-passo bipolari usando l integrato L298N. Author: Ing. Sebastiano Giannitto (ITIS M.

11^ parte : Come gestire i servomotori con Arduino. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Progetto Esami Di Stato Anno 2014/2015

Allocazione dinamica della memoria - riepilogo

6^ parte : Acquisizione della temperatura con LM35. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Arduino. Laboratorio Arduino Base. HackLab Terni. Laboratorio aperto a tutti di elettronica, scienza e arte. hacklabterni.

Esercitazione Controllo di un motore DC mediante Arduino YUN

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Rendering air show e verifica della sincronizzazione

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

Inizializzazione, Assegnamento e Distruzione di Classi

Telecontrollo escavatore LEGO con board Arduino

I/O su Socket TCP: read()

Istruzioni di messa in servizio rapida per. Flying shear Taglio al volo lineare

Controllo di un Motore Elettrico in Corrente Continua

Introduzione alla programmazione in C

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Corso di Robotica Autonoma Esperienza 1

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

ARCHITETTURA DI RETE FOLEGNANI ANDREA

Fisica, tecnologia, scienze applicate: ulab2, un laboratorio portatile basato su arduino e due piccoli robot, LEMU e MOMOLAB, vanno a scuola

ITC FOSSATI- DA PASSANO. Progetto sonar. A cura di: Bamonte Davide Bertagna Davide Canaccini Alessandro Celi Andrea Conti Thomas Filattiera Lorenzo

Progetto di Domotica

Rossetto Flavio a.s. 2011/2012 classe 5E 2

Descrizione e modalità d uso del telecontrollo big-wifi

Reti di Telecomunicazione Lezione 8

FINALMENTE SUL TREPPIEDE WINDOWS con PREGEO, AutoCAD, PFCAD e tutto quello che serve per la massima autonomia ed efficienza in campagna.

Gestione dei File in C

FrerEnergy: PROGRAMMA PER LA SUPERVISIONE DEI CONSUMI DI ENERGIA ELETTRICA

Manuale Terminal Manager 2.0

Tutorial 3DRoom. 3DRoom

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

NTC E MISURA DELLA TEMPERATURA CON ARDUINO

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

Realizzazione di un Autocorrelatore a Singolo Impulso a DYE

Incident Management. Obiettivi. Definizioni. Responsabilità. Attività. Input

CANPC-S1. Programmable CanBus-PC interface

Cenni sui trasduttori. Con particolare attenzione al settore marittimo

MOTORIZZAZIONI PASSO-PASSO Motori, motori con driver integrati e software di configurazione

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

MT2 e MT3: Schede e sistemi di controllo motori passo passo

Manuale d'uso HERE Maps

IL CONTROLLO AUTOMATICO: TRASDUTTORI, ATTUATORI CONTROLLO DIGITALE, ON-OFF, DI POTENZA

Classificazione dei Sensori. (raccolta di lucidi)

VRbot e ROBONOVA-I (rev. 1.2)

Descrizione del Test Range della Società SAMA

Introduzione all analisi dei segnali digitali.

MANUALE CONFIGURAZIONE ED UTILIZZO GATEWAY MBUS-MODBUS (RTU/TCP) MODELLO PiiGAB M900

Rete Internet Prova in Itinere Mercoledì 23 Aprile 2008

Laboratorio Progettazione Web PHP e FORMs HTML. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2013/2014

SymCAD/C.A.T.S. modulo Canali Schema

ICARO Terminal Server per Aprile

Modifiche nelle funzioni software dell AURORA 9 nell aggiornamento 1.08

GESTIONE INFORMATICA DEI DATI AZIENDALI

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Do-Dots Protocollo di comunicazione

Manuale di programmazione BerMar_Drive_Software

Relazione Release Alpha 2.0

Sensori di Pressione Piezoresistivi

Variabili e tipi di dato

Sensori di temperatura a termocoppia K Guida Utente

8^ parte : Motor shield FE e motore passo-passo bipolare. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

12 - timer da cucina display a 4 cifre

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1

Input/Output. Moduli di Input/ Output. gestiscono quantità di dati differenti a velocità diverse in formati diversi. n Grande varietà di periferiche

Introduzione al linguaggio C Gli array

La prove dinamiche sugli edifici II parte strumentazione e analisi dei segnali

SAE J1939. PROGETTO FMS Gestione dati del Veicolo. FMS progettata da Runtek s.r.l. Codice RK

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

STRUTTURE DEI SISTEMI DI CALCOLO

IRSplit. Istruzioni d uso 07/10-01 PC

Introduzione al Linguaggio C

Programmazione di Base Variabili Array Funzioni Strutture di controllo. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Sensori a effetto Hall bipolari con ritenuta stabilizzati e non stabilizzati con circuito chopper

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

SPRING SQ COMUNICAZIONE OPERAZIONI IVA NON INFERIORI A 3000 EURO PER L ANNO 2011

MANUALE D USO DELLA PIATTAFORMA ITCMS

Arduino Quick Ethernet library Reference

Semplice progetto con Arduino simpatico G-meter col quale misurare e registrare le accelerazioni del proprio veicolo

Argo Palm Manuale utente Versione del

Esercizi di programmazione in C

SOLUZIONI PER IL CONTROLLO DELLA QUALITA DELL ARIA NEGLI AMBIENTI CHIUSI

GESTIONE DEI PROCESSI

DATA LOGGER. Modello LR8410/20 LR8400/20 LR8401/20 LR8402/20 LR8431/ Portate: K, J, E, T, N, R, S, B, W, da -200 C a C

Firewall e Abilitazioni porte (Port Forwarding)

14^ parte : Sensore a ultrasuoni HC SR04 e Arduino. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

P1 Verificatore di codici a barre IN LINEA

IL RISPARMIO ENERGETICO E GLI AZIONAMENTI A VELOCITA VARIABILE L utilizzo dell inverter negli impianti frigoriferi.

Транскрипт:

arduino e robotica in laboratorio hands on: Fisiologia del nostro robot Daniele Grosso (1) 1. Dipartimento di Fisica (Università di Genova) Scuola Estiva Genova AIF-DIFI Piano Lauree Scientifiche, modulo di formazione insegnanti in laboratorio

Obbiettivi prendere confidenza con i sensori esplorare le potenzialità del robot comprendere come vengono acquisite le informazioni dai sensori e la loro natura fisica verificare come leggere e trasmettere informazioni dal robot al PC

Traccia 1. leggiamo la distanza da un ostacolo con il sensore ad ultrasuoni 2. leggiamo la distanza da un ostacolo con il sensore analogico ad infrarossi 3. Leggiamo la temperatura con LM35 4. sensori digitali ad infrarosso laterali e anticaduta 5. Controlliamo i motori 6. Controlliamo i servomotori 7. Rileviamo la velocità di rotazione con gli encoder

Materiali arduino (per i test) robot oppure robot con sensori connessi attraverso la protoshield

Sensore US il sensore tramite una delle due capsule ultrasoniche, sparerà un treno di 8 impulsi di ultrasuoni Gli impulsi rimbalzeranno sull'ostacolo più vicino e ritorneranno indietro per essere captati dall'altra capsula Il circuito interno del sensore lo normalizzerà e lo elaborerà restituendoci un impulso squadrato e filtrato

Misurare tempi per misurare distanze la velocità del suono nell'aria è di circa 343m/s (corrispondenti a 0.0343 cm/us) D(cm) = T(us) * 0.0343/2 = T(us) / 58.30 #define SONAR_TRIGGER_PIN 2 #define SONAR_ECHO_PIN 3 unsigned int measure_distance() { // Trigger the SRF05: digitalwrite(sonar_trigger_pin, HIGH); delaymicroseconds(10); digitalwrite(sonar_trigger_pin, LOW); // Wait for Echo Pulse unsigned long pulse_length = pulsein(sonar_echo_pin, HIGH); // Convert Pulse to Distance // pulse_length/58 = cm return( (unsigned int) (pulse_length / 58) ); void setup() { pinmode(sonar_trigger_pin, OUTPUT); pinmode(sonar_echo_pin, INPUT); Serial.begin(9600); void loop() { unsigned int current_distance = measure_distance(); Serial.println(current_distance); delay(125);

Sensore IR sharp #define sensorir float sensorvalue, cm; void setup() { Dal datasheet o Serial.begin(9600); da misure!!! void loop() { sensorvalue = analogread(sensorir); cm = 10650.08 * pow(sensorvalue,-0.935) - 10; // fit from data. delay(100); Serial.println(cm);

Funzionamento del sensore IR Il sensore GP2Y0A02YK lavora nel range 20-150cm Il sensore genera un fascio IR (concentrato mediante una lente) il fascio viene riflesso da un ostacolo e insiste sul CCD del sensore Misurando l angolo di incidenza è possibile operare una triangolazione Oltre 150cm non è più in grado di effettuare una triangolazione accurata, inoltre L intensità della luce riflessa è molto bassa e il segnale sarebbe rumoroso

Temperatura con LM35 //declare variables float tempc; int temppin = 0; void setup() { Serial.begin(9600); void loop() { tempc = analogread(temppin); //convert the analog data to temperature tempc = (5.0 * tempc * 100.0)/1024.0; Serial.print((byte)tempC); //send the data to the computer delay(100);

Controllo motori Prima di effettuare test assicurarsi che il robot sia su piattaforma (e che le ruote siano libere) Impostare la velocità a 0 nel setup Decelerare e accelerare lentamente Per un controllo accurato serve un feedback! int pwm_a = 3; int pwm_b = 9; int dir_a = 2; int dir_b = 8; void setup() { pinmode(pwm_a, OUTPUT); pinmode(pwm_b, OUTPUT); pinmode(dir_a, OUTPUT); pinmode(dir_b, OUTPUT); analogwrite(pwm_a, 0); analogwrite(pwm_b, 0); void loop() { digitalwrite(dir_a, LOW); digitalwrite(dir_b, LOW); delay(1000); analogwrite(pwm_a, 128); analogwrite(pwm_b, 128); delay(1000); digitalwrite(dir_a, HIGH); digitalwrite(dir_b, HIGH); delay(1000); analogwrite(pwm_a, 128); analogwrite(pwm_b, 128); delay(1000);

H bridge Problema: decidere il verso di rotazione di un motore avendo un solo generatore a disposizione Soluzione: il circuito h bridge COMBINAZIONE POLARITÀ EFFETTO A & D avanti il motore gira in avanti B & C indietro il motore gira all'indietro A & B C & D Nessuna bloccato bloccato libero motore frenato motore frenato motore in folle A & C corto circuito B & D corto circuito http://www.parallax.com/dl/docs/cols/nv/vol1/col/nv23.pdf Evitare come la peste!!!

Controllo servomotori 2 servo => 2 angoli (pan & tilt) attendere che il servo raggiunga la posizione prima di cambiarla fino a quando il servo è alimentato bloccato nella posizione impostata #include <Servo.h> Servo myservo; int pos = 0; void setup() { myservo.attach(9); void loop() { for(pos = 0; pos < 180; pos += 1) { myservo.write(pos); delay(15); for(pos = 180; pos>=1; pos-=1) { myservo.write(pos); delay(15);

encoder questa tecnica è basata sugli interrupt utilizziamo il polling...? Codice gray #define LEFT 0 #define RIGHT 1 long coder[2] = {0,0; int lastspeed[2] = {0,0; void setup(){ Serial.begin(9600); attachinterrupt(left, LwheelSpeed, CHANGE); attachinterrupt(right, RwheelSpeed, CHANGE); void loop(){ static unsigned long timer = 0; //print manager timer if(millis() - timer > 100) { Serial.print("Coder value: "); Serial.print(coder[LEFT]); Serial.print("[Left Wheel] "); Serial.print(coder[RIGHT]); Serial.println("[Right Wheel]"); lastspeed[left] = coder[left]; lastspeed[right] = coder[right]; coder[left] = 0; //clear the data buffer coder[right] = 0; timer = millis(); void LwheelSpeed() { coder[left] ++; void RwheelSpeed() { coder[right] ++;

Impacchettare più bit in un byte per rendere più efficiente la trasmissione 4 sensori digitali infrarosso anticollisione 2 sensori digitali infrarosso anticaduta Un byte è più che sufficiente per 6 bit!!! Funzioni arduino per la gestione di bit bitread bitwrite bitset bitclear

Sensori gas A temperatura ambiente l'elemento sensibile presenta una resistenza elevatissima a causa dell'alta resistività del materiale A caldo (400 gradi), in presenza di un gas riducente, la resistività cambia... Un progetto interessante: monitorare fughe di gas con arduino int gassensor = 0; int val = 0; void setup() { Serial.begin(9600); void loop() { val = analogread(gassensor); Serial.println( val ); delay(100);

Meccanica dual drive Per la stabilità servono almeno 3 punti di appoggio: 2 ruote indipendenti e ball caster Il controllo proporzionale (oppure on-off) avviene mediante encoder

Dual drive: spostamento lineare Per misure di distanza percorsa e per stabilizzare la traiettoria occorre: convertire la rotazione delle ruote in un movimento lineare compensare la diversa velocità di rotazione dei motori

Dual drive: spostamento Dato il numero di impulsi registrati dall encoder è possibile determinare il tratto percorso ( misure!)

Dual drive: orientamento La variazione di orientamento e quindi l orientamednto del robot (rispetto all istante iniziale in cui è stato attivato) si possono ottenere dalle relazioni: Integrazione

Odometria e determinazione della traiettoria errori casuali e sistematici, correzione con data fusion Odometria: valutare lo spostamento sommare lo spostamento attuale al precedente per ottenere la traiettoria Problema: l accumolo degli errori casuali la presenza di errori sistematici Tecnica di test: programmare ilmovimento lungo il perimetro di un quadrato effettuare misure per la calibrazione Compensazione degli errori mediante la data fusion: La traiettoria viene corretta con informazioni provenienti da fonti indipendenti; bussola, gps, triangolazione, mappe

Triangolazione di landmark Landmark: punti di riferimento di posizione nota Mediante triangolazione (o multilaterazione) si stima la posizione del robot relativamente ai landmark

Navigazione e mappe In alternativa e/o a complemento dei landmark si usano le mappe dell ambiente (note a priori o costruite dinamicamente) Si determina la propria posizione relativamente alla mappa e si aggiorna la mappa mentre si cerca di raggiungere un target

Trasmissione BT Stabilire la connessione PC-seeduino via BT Utilizzare la libreria software seriale per trasmettere le informazioni da seeduino a PC trasmettere un carattere da PC a seeduino per controllare il robot Stabilire un protocollo asimmetrico EFFICIENTE!! Controllo heartbeat: in assenza di comandi, dopo un certo tempo, può essere disattivato il robot (per sicurezza) oppure entrare in modalità autonoma )? wifi? TCP? UDP? bluetooth?? Xbee? radio?

Telemetria e controllo remoto Il robot acquisisce dati sull ambiente attraverso i sensori Le informazioni sono trasmesse attraverso la connessione BT Una apposita funzione del programma di controllo remoto del robot (ad es realizzato con processing), rimane in ascolto sul canale seriale BT legge i dati dei sensori (immessi in una stringa di testo tab delimited (oppure in una sequenza di byte di lunghezza prefissata) estrae i dati di ciascun sensore e aggiorna un vettore di stato (che rappresenta lo stato interno del robot) Una funzione del programma decide quali comandi inviare al robot (è sufficiente un carattere per 256 stati!) (1) Una funzione invia i comandi al robot attraverso BT definire un protocollo comune efficiente non è facile imparare a parlare non è facile insegnare una lingua non è facile ci vuole tanta PAZIENZA! BT

Lato robot (arduino seeduino ) #include <SoftwareSerial.h> //Software Serial Port #define RxD 4 #define TxD 5 #define DEBUG_ENABLED 1 SoftwareSerial bluetoothserial(rxd,txd); char incoming; char InternalStatus[50]; int databt=38400; void setup() { Serial.begin(9600); pinmode(rxd, INPUT); pinmode(txd, OUTPUT); setupbluetoothconnection(); void setupbluetoothconnection() { bluetoothserial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400 delay(1000); sendbluetoothcommand("\r\n+stwmod=0\r\n"); sendbluetoothcommand("\r\n+stna=wally\r\n"); // CAMBIA IL NOME DEL TUO ROBOT sendbluetoothcommand("\r\n+stauto=0\r\n"); sendbluetoothcommand("\r\n+stoaut=1\r\n"); sendbluetoothcommand("\r\n +STPIN=0000\r\n"); delay(2000); // This delay is required. sendbluetoothcommand("\r\n+inq=1\r\n"); delay(2000); // This delay is required. //Checks if the response "OK" is received void CheckOK() { char a,b; while(1) { if(bluetoothserial.available()) { a = bluetoothserial.read(); if('o' == a) { // Wait for next character K. available() is required in some cases, as K is not immediately available. while(bluetoothserial.available()) { b = bluetoothserial.read(); break; if('k' == b) { break; while( (a = bluetoothserial.read())!= -1) { //Wait until all other response chars are received void sendbluetoothcommand(char command[]) { bluetoothserial.print(command); //CheckOK(); void loop() { updatestatus(); bluetoothserial.println(internalstatus); // get character incoming=bluetoothserial.read(); if (incoming!=-1) { Serial.println(incoming); // dump everything // decide what to do with it switch (incoming) { case '1': Serial.println("[1]"); // insert here your code break; case '2': Serial.println("[2]"); // insert here your code break; case '3': Serial.println("[3]"); // insert here your code break; delay(100); // may be removed void updatestatus(void) { char status[16]; int A0=analogRead(A0); int A1=analogRead(A1); int A2=analogRead(A2); int A3=analogRead(A3); int A4=analogRead(A4); int A5=analogRead(A5); sprintf(internalstatus, "%d\t%d\t%d\t%d\t%d\t%d\t\n ", A0, A1, A2, A3, A4, A5);

Lato processing import processing.serial.*; Serial myport; // Create object from Serial class int val; // Data received from the serial port void setup() { size(200, 200); // List all the available serial ports println(serial.list()); String portname = Serial.list()[12]; myport = new Serial(this, portname, 38400); void draw() { while (myport.available() > 0) { String inbuffer = myport.readstring(); if (inbuffer!= null) { println("bt: "+inbuffer); // dump everything int [] nums; String [] splits = split(inbuffer, "\t"); // split nums = new int[splits.length]; // create a target array for(int i = 0; i < splits.length; i++){ nums[i] = int(splits[i]); // insert into numbers print(" <"); // begin for(int i = 0; i < splits.length; i++){ print(nums[i]+" "); // dump one by one println(" >"); // end Perchè Processing possa utilizzare le seriali (USB, BT dopo il pairing) occorre: Identificare il numero ID assegnato alla porta Associare una porta in serial list ad un oggetto specifico (una istanza di Serial)

Gestire e monitorare la connessione Utilizzare: terminal nell ide di arduino per monitorare la connessione USB un emulatore terminale, ad esempio X-CTU, uno strumento molto utile! (http://ftp1.digi.com/support/utilities/40002637_c.exe) per monitorare la connessione BT Riferimenti utili: http://www.westernwillow.com/cms/blog/franco/creating-bluetooth-serial-port-ubuntu http://askubuntu.com/questions/2977/how-to-assign-a-serial-port-to-my-bluetooth-phone http://scottada.ms/article/adding-so-called-virtual-bluetooth-serial-port-ubuntu-1110-usingatheros-ar3011-based-usb http://www.thinkwiki.org/wiki/how_to_setup_bluetooth http://www.broadcom.com/support/bluetooth/update.php http://www.ladyada.net/make/xbee/configure.html Perdita di connessione? Il robot commuta su autonomo stop search and connect mode