
LEZIONE n° 11 – messa a punto ROBOT
(CONTARE GLI URTI)
Con questa lezione cominciare a programmare il robot.
RICORDIAMO I PRINCIPI DELLA PROGRAMMAZIONE DI ARDUINO:
n Variabili:
n Tipo (intero, reale, carattere, etc.)
n Nome (caratteri alfanumerici)
n Principali comandi:
n Assegnazione
n Si calcola l’espressione a sinistra ed il risultato viene assegnato alla variabile a destra
n Count = count +1
n IN/OUT
n Istruzioni per immettere o prelevare dei dati
n digitalWrite(pin1,LOW)
n Test
n Viene eseguito il test (vero o falso) e secondo il valore viene eseguita l’istruzione seguente
n If (count <= soglia)
n Istruzione1
n istruzione2
n Cicli
n Vengono eseguite ripetutamente un gruppo di istruzioni
n For (x=0;x==9;x++)
n istruzione1
ESTENDERE A TUTTI GLI URTI la parte proposta – copiare il listato (colorato in rosso) ed incollarlo in un editor di solo testo [Notepad ad esempio]
la parte in (blu) serve per contare gli urti
parte del listato del programma di un ROBOT CHE CONTA GLI URTI:
/*
programma per BIG MAC versione 1
ultimo agg. 14.02.2017
*/
/***************************************************************
Variabili da tarare
***************************************************************/
int sogliaSx = 500; //soglie luce sinistra //luce alta
int sogliaDx = 500; //soglie luce destra
int TEMPO_DX1 = 600; //tempo rotazione dopo urto centro
int TEMPO_SX1 = 300; //tempo rotazione dopo urto a destra
int TEMPO_SX2 = 550; //tempo rotazione dopo urto a destra
int TEMPO_CX1 = 600; //tempo rotazione dopo urto al centro
int TEMPO_D1 = 350; //tempo rotazione dopo urto al centro
/**************************************************************
Variabili da non modificare
***************************************************************/
int urto_AVSX = 11; // digital pin 11
int urto_AVDX = 10; // digital pin 10
int TEMPO_MIN = 6; //tempo di attesa dopo lettura sens0ri
int value_urto_AVSX; //PWM control for motor outputs 1 and 2 is on digital pin 10
int value_urto_AVDX; //PWM control for motor outputs 3 and 4 is on digital pin 11
int contaurtiS = 0; //contatore per i sensori di urto
void avanti() // direzione AVANTI
{
digitalWrite(dir_a, HIGH); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, HIGH); //Set motor direction, 3 high, 4 low
}
void dietro() // direzione DIETRO
{
digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low
}
void destra() // direzione DESTRA
{
digitalWrite(dir_a, HIGH); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low
}
void sinistra() // direzione SINISTRA
{
digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, HIGH); //Set motor direction, 3 high, 4 low
}
void stop_Motori() // FERMARE MOTORI DIETRO PER POCO
{
// dietro();
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
delay(TEMPO_MIN);
}
void setup()
{
Serial.begin(9600);
pinMode(urto_AVSX, INPUT); //Set control pins to be inputs
pinMode(urto_AVDX, INPUT);
}
void loop()
{
// vado AVANTI SE NON CI SONO OSTACOLI
avanti(); // direzione AVANTI
analogWrite(pwm_a, loop_speed_a);
analogWrite(pwm_b, loop_speed_b);
delay(TEMPO_MIN);
value_urto_AVDX = digitalRead(urto_AVDX);
delay(TEMPO_MIN);
value_urto_AVSX = digitalRead(urto_AVSX);
delay(TEMPO_MIN);
// URTO AVANTI SINISTRA
if ((value_urto_AVSX == HIGH)&&(magic==1))
{
contaurtiS = contaurtiS + 1;
stop_Motori();
dietro();
analogWrite(pwm_a, loop_speed_a);
analogWrite(pwm_b, loop_speed_b);
delay(TEMPO_D1);
if (contaurtiS < 3 )
{
destra();
analogWrite(pwm_a, loop_speed_a);
analogWrite(pwm_b, loop_speed_b);
delay(TEMPO_SX1);
}
else
{
contaurtiS = 0;
destra();
analogWrite(pwm_a, loop_speed_a);
analogWrite(pwm_b, loop_speed_b);
delay(TEMPO_SX1*1.5);
}
avanti();
analogWrite(pwm_a, loop_speed_a);
analogWrite(pwm_b, loop_speed_b);
}
}
// END PROGRAM
La prima istruzione (blu) definisce la variabile usata come contatore
La seconda istruzione (blu) incrementa il contatore
Il terzo blocco (blu) controlla il valore del contatore e se non è raggiunto il numero di urti fissato RUOTA IL ROBOT PER IL TEMPO TEMPO_SX1. Quando si raggiunge la soglia resetta il contatore ed aumenta il tempo del 50%.
di seguito le slide della lezione








(58)