CR18_lez07 Robot Avanzato
LEZIONE n° 7
– ROBOT AVANZATO –
Con questa lezione cominciamo a gestire il robot in una maniera “avanzata”. Per prima cosa dobbiamo organizzare l’hardware e seconda del tipo di robot (2 o 4 ruote) e del numero dei sensori. Dovremo porre particolare attenzione al collegamento dei vari blocchi elettrici del robot. Dopo aver collegato in modo adeguato tutti i blocchi potremmo cominciare ad organizzare la gestione del robot.
Dovremo porre particolare attenzione alla programmazione di Arduino e quindi:
RICORDIAMO I PRINCIPI DELLA PROGRAMMAZIONE DI ARDUINO:
per ulteriori informazioni: http://www.iduesarchiaponi.com/cominciamo-ad-usare-arduino/
- Variabili:
- Tipo (intero, reale, carattere, etc.)
- Nome (caratteri alfanumerici)
- Strutture (corso avanzato)
- Principali comandi:
- Assegnazione
- Si calcola l’espressione a sinistra ed il risultato viene assegnato alla variabile a destra
- Assegnazione
-
-
- Count = count +1
-
-
- IN/OUT
- Istruzioni per immettere o prelevare dei dati
- IN/OUT
-
-
- digitalWrite(pin1,LOW)
-
-
- Test
- Viene eseguito il test (vero o falso) e secondo il valore viene eseguita l’istruzione seguente
- Test
-
-
- If (count <= soglia)
- Istruzione1
- istruzione2
- If (count <= soglia)
- Cicli
- Vengono eseguite ripetutamente un gruppo di istruzioni
- For (x=0;x==9;x++)
- istruzione1
-
Come visto nella lezione precedente per il robot che vogliamo realizzare (explorer junior) avremo almeno bisogno di:
MOTORI (2 + ball caster) = permettono, se opportunamente comandati, di dirigere il robot in ogni direzione ottenendo la NAVIGAZIONE all’interno del labirinto. La ball caster serve a rendere nonostante il movimento il robot stabile.
SENSORI DI URTO (2 + baffi) = con due sensori e con i baffi incrociati possiamo facilmente gestire tre tipi di urto (sinistra, destra e centro). Si possono usare anche dei sensori di distanza agli ultrasuoni ma la loro affidabilità non è molto elevata.
SENSORI DI LUCE (2 o più) = il numero dei sensori di luce dipende molto dal numero dei piedini di Arduino rimasti liberi dopo che sono stati montati gli urti ed i motori. Per gli explorer junior è più semplice poiché avremo un solo tipo di sensori analogici.
DISPOSITIVI DI SEGNALAZIONE = il più semplice è sicuramente il LED, si potrebbe usare anche un display ma richiede un numero elevato di piedini per la sua gestione
Il programma (in ordine) del Robot deve:
MANDARLO AVANTI
GESTIRE GLI URTI
GESTIRE LE LUCI
ricordiamo che un Robot base è formato da:
2 |
MOTORI |
![]() |
2 |
SENSORI DI URTO DIGITALI |
![]() |
1 |
SENSORE DI LUCE |
![]() |
1 |
LED |
![]() |
Il Robot Avanzato , oltre alle dotazioni base, può avere:
SENSORI DI URTO A DISTANZA
VARI SENSORE DI LUCE
ALCUNI LED o un DISPLAY
Il software per il Robot Avanzato , oltre alle dotazioni base, può gestire:
L’USCITA da una TRAPPOLA (CONTARE gli URTI)
TROVARE la LUCE da LONTANO
SEGUIRE i BORDI
MOTORI: OPERAZIONI da FARE:
1) variare la velocità dei motori
URTI: OPERAZIONI da FARE:
1) contare gli urti per uscire dalle trappole
2) contarli separatamente
SUGGERIMENTI:
Fissare un contatore (aumentarlo per ogni urto fino al valore fissato)
al valore scelto cambiare il tempo
Provare la navigazione in una “trappola”
URTI: Provare i cambiamenti
LUCI: OPERAZIONI da FARE:
1) Trovare la luce da LONTANO
SUGGERIMENTI:
Eseguire la taratura (hardware) una volta e non modificarla più
Adattare la soglia (software) alla luce ambiente
LUCI: Provare i cambiamenti
inoltre potremmo fare al Robot Avanzato:
ALTRE POSSIBILTA’:
SEGUIRE I BORDI
Categoria SENIOR
etc. etc.
LISTATO DI UN ROBOT – Per provare a fare le modifiche proposte copiare il listato (colorato in rosso) ed incollarlo in un editor di solo testo [Notepad ad esempio]
/////////////////////////////////////////////////////////////////////
// i tempi per le varie operazioni sono stati fissati TUTTI ad UN SECONDO
// il contatore è stato inserito nell’URTO SINISTRO
//////////////// CORSO ROBOT 2018-19 LEZIONE n° — 7 — ESERCIZIO n° 17
int TIME_BACK = 1000;
int TIME_SIDE = 1000;
int TIME_SIDE_LUX = 1000;
int TIME_FORWARD_LUX = 1000;
float MOD_TIME_SIDE = 1.35;
int TEMPO_MIN = 6;
int TEMPO_LUX = 3000;
int tempo = 500;
int THRESHOLD_POT_HIGH = 250;
int speed_motor = 75;
int urto_DX = 9;
int urto_SX = 8;
int value_urto_DX = 0;
int value_urto_SX = 0;
int sensorPinLux = A0;
int value_sensorPinLux = 0;
int THRESHOLD_LUX_NEAR = 150;
int THRESHOLD_LUX_FAR = 100;
magic=1;
// vado AVANTI SE NON CI SONO OSTACOLI
avanti(); // direzione AVANTI
Serial.print(” SPEED = ” );
Serial.print(speed_motor);
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
value_urto_DX = digitalRead(urto_DX);
delay(TEMPO_MIN);
value_urto_SX = digitalRead(urto_SX);
delay(TEMPO_MIN);
Serial.print(” URTO DX = ” );
Serial.print(value_urto_DX );
Serial.print(” SX = ” );
Serial.print(value_urto_SX );
// URTO CENTRALE
if ((value_urto_DX == LOW) && (value_urto_SX == LOW))
{
Serial.print(” URTO CENTRO ” );
stop_Motori();
dietro();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_BACK);
destra();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_SIDE);
avanti();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
magic = 0;
}
// URTO SINISTRA
if ((value_urto_SX == LOW) && (magic==1))
{
if (CountBumpLefth<5)
{
Serial.print(” count n°= ” );
Serial.print(CountBumpLefth);
Serial.print(” LEFT BUMP ” );
stop_Motori();
dietro();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_BACK);
destra();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_SIDE);
avanti();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
CountBumpLefth = CountBumpLefth +1;
}
else
{
CountBumpLefth = 0;
Serial.print(” count n°= ” );
Serial.print(CountBumpLefth);
Serial.print(” MODIFICATED LEFT BUMP ” );
stop_Motori();
dietro();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_BACK);
destra();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_SIDE*MOD_TIME_SIDE); // more time for around
avanti();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
}
}
// URTO DESTRA
if ((value_urto_DX == LOW)&&(magic==1))
{
Serial.print(” URTO DESTRA ” );
stop_Motori();
dietro();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_BACK);
sinistra();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_SIDE);
avanti();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
}
/****************************************************
* GESTIONE LUCE
****************************************************/
value_sensorPinLux = analogRead(sensorPinLux);
delay(TEMPO_MIN);
Serial.print(” sensor LUCE = ” );
Serial.print(value_sensorPinLux);
Serial.print(“\n “);
// LUCE VICINA SENSORE
if (value_sensorPinLux >= THRESHOLD_LUX_NEAR)
{
stop_robot();
digitalWrite(led_RGB_G,HIGH);
Serial.print(” TROVATA LUCE SENSORE UNICO \n ” );
delay(TEMPO_LUX);
digitalWrite(led_RGB_G,LOW);
destra();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_SIDE_LUX);
avanti();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_FORWARD_LUX);
}
// LUCE LONTANA SENSORE
if ((value_sensorPinLux <= THRESHOLD_LUX_NEAR)&&(value_sensorPinLux >= THRESHOLD_LUX_FAR))
{
stop_robot();
digitalWrite(led_RGB_R,HIGH);
Serial.print(” TROVATA LUCE SENSORE UNICO DA LONTANO \n ” );
// delay(TEMPO_LUX);
destra();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_SIDE_LUX);
avanti();
analogWrite(pwm_a, speed_motor);
analogWrite(pwm_b, speed_motor);
delay(TIME_FORWARD_LUX);
digitalWrite(led_RGB_R,LOW);
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/*************************************************************
END PROGRAM
*************************************************************/
di seguito le slide della lezione
(13)
Articolo in Evidenza
Le categorie
- .Dicono di NOI
- Album fotografici Francesco
- Album Fotografici Iduesarchiaponi
- Album Fotografici Paolo
- Alta Fotografia
- Altro
- Antichi eserciti ed armi
- Archeologia
- Archeologia1
- Archeologia2
- Archivio Robotica
- Circuiti per Robotica
- Città Fantasma
- Collaboratori
- Corso Robotica 19-20
- Didattica
- Didattica a distanza
- Esempi di Robotica
- Eventi
- Fotografia
- Francesco
- Francesco e Paolo
- Gallerie Fotografiche Francesco
- Gare di Robotica
- Gli Svaghi nel mondo Antico
- I Cibi Romani
- Il blog
- L'Italia che non ti aspetti
- Laboratorio Robotica
- Le sette Meraviglie del mondo
- Le Sette meraviglie del Mondo moderne
- Lezioni On-line
- Link Utili
- Miti e Leggende
- Mitologia Norena
- Notizie
- Paolo
- Per non dimenticare
- Popoli e Civiltà
- Robotica
- Roma Nascosta
- Scrittori e Poeti Antichi
- Scuola
- Si dice… Perchè
- Soluzioni didattica a distanza
- Storie e Personaggi Romani
- Teatro
- Viaggiando …..
- Viaggiare
- Video