cR_17_lezione 11

by / martedì, 14 febbraio 2017 / Published in Archivio Robotica

 

 

 

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:

 

Variabili:

n  Tipo (intero, reale, carattere, etc.)

n  Nome (caratteri alfanumerici)

 

Principali comandi:

Assegnazione

n  Si calcola l’espressione a sinistra ed il risultato viene assegnato alla variabile a destra

Count = count +1

IN/OUT

n  Istruzioni per immettere o prelevare dei dati

digitalWrite(pin1,LOW)

Test

n  Viene eseguito il test (vero o falso) e secondo il valore viene eseguita l’istruzione seguente

If (count <= soglia)

Istruzione1

istruzione2

Cicli

n  Vengono eseguite ripetutamente un gruppo di istruzioni

For (x=0;x==9;x++)

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

 

 

(55)

TOP