CR18_lez05 motori

by / mercoledì, 12 Dicembre 2018 / Published in Archivio Robotica, Francesco

 

 

LEZIONE n° 5

MOTORI CORRENTE CONTINUA

 

La lezione CORSO DI ROBOTICA del 2018-19 è sui motori in corrente continua e sulla loro gestione. Premettiamo che per analizzare i risultati utilizzeremo il monitor o dei LED.

I motori che vediamo in questa lezione sono i motori in CORRENTE CONTINUA.

 

Per usare i motori abbiamo bisogno di una shield di controllo degli stessi (in pratica stiamo usando l’equivalente di un “ponte H”, il vecchio integrato 298) che dovremo acquistare a parte da Arduino. Inoltre per far funzionare i motori sarà necessaria una potenza superiore a quella che possiamo prelevare dalla porta USB del PC e dovremo necessariamente utilizzare un generatore esterno.

Arduino, per la sua struttura, permette di comandare, con delle librerie precompilate, due motori in corrente continua utilizzando 4 piedini di controllo (2 per ogni motore) chiamati DIRA e PWMA. Entrambi i piedini sono di tipo digitale.

DIRA = selezione il verso di rotazione del motore

PWMA = gestisce la velocità del motore con un valore compreso tra 0 e 255 utilizzando la modulazione PWM (Pulse Wide Modulation).

Bisogna prestare attenzione alla shield di controllo per gestire i corretti pin che spesso sono selezionabili da dei jamper che troviamo sulla shield.

 

Cominciamo a vedere, ma ovviamente approfondiremo, dei semplici rudimenti di programmazione per poter gestire nelle migliori condizioni il robot.

 

RICORDIAMO I PRINCIPI DELLA PROGRAMMAZIONE DI 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
      • Count = count +1
    • IN/OUT
      • Istruzioni per immettere o prelevare dei dati
      • digitalWrite(pin1,LOW)
    • Test
      • Viene eseguito il test (vero o falso) e secondo il valore viene eseguita l’istruzione seguente
      • If (count <= soglia)
        • Istruzione1
        • istruzione2
    • Cicli
      • Vengono eseguite ripetutamente un gruppo di istruzioni
      • For (x=0;x==9;x++)
        • istruzione1

 

Per provare a fare le modifiche proposte copiare il listato (colorato in rosso) ed incollarlo in un editor di solo testo [Notepad ad esempio]

listato programma esempio numero 13:

//////////////// CORSO ROBOT 2018-19 LEZIONE n° — 5 — ESERCIZIO n° 13

int tempo = 5000;

int THRESHOLD_POT_HIGH = 250;

int Pot_value = 0;

int potentiometerA = A3;

Pot_value = analogRead(potentiometerA);

Serial.print(” Pot.Value = ” );

Serial.print(Pot_value);

Serial.print(“\n”);

if (Pot_value >= THRESHOLD_POT_HIGH)

{

Serial.print(” AVANTI \n ” );

delay(10);

digitalWrite (led_RGB_G,HIGH);

digitalWrite (led_RGB_R,LOW);

digitalWrite(dir_a, HIGH); //Set motor direction, 1 low, 2 high

digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low

analogWrite(pwm_a, speedL); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, speedL);

digitalWrite(led_Y,LOW);

Serial.print(“velocita motore A & B = ” );

Serial.print(speedL);

delay(10);

Serial.print(“\n “);

delay(tempo);

analogWrite(pwm_a, speedH); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, speedH);

digitalWrite(led_Y,HIGH);

Serial.print(“velocita motore A & B = ” );

Serial.print(speedH);

delay(10);

Serial.print(“\n “);

delay(tempo);

}

else

{

Serial.print(” INDIETRO \n ” );

delay(10);

digitalWrite (led_RGB_R,HIGH);

digitalWrite (led_RGB_G,LOW);

digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high

digitalWrite(dir_b, HIGH); //Set motor direction, 3 high, 4 low

analogWrite(pwm_a, speedL); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, speedL);

digitalWrite(led_Y,LOW);

Serial.print(“velocita motore A & B = ” );

Serial.print(speedL);

delay(10);

Serial.print(“\n “);

delay(tempo);

analogWrite(pwm_a, speedH); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, speedH);

digitalWrite(led_Y,HIGH);

Serial.print(“velocita motore A & B = ” );

Serial.print(speedH);

delay(10);

Serial.print(“\n “);

delay(tempo);

}

/////////////////////////////////////////////////////////////////////

 

Modifiche proposte:

Fissare 2 Soglie (fare 3 azioni diverse)

SUGGERIMENTI

Fissare 2 soglie (e le tre Azioni da fare)

(Avanti piano/Avanti veloce/Dietro)

Provare i cambiamenti

listato programma esempio numero 14:

//////////////// CORSO ROBOT 2018-19 LEZIONE n° — 5 — ESERCIZIO n° 14

int tempo = 1000;

int THRESHOLD_POT_HIGH = 250;

int PotA_value = 0;

int potentiometerA = A3;

int PotB_value = 0;

int potentiometerB = A5;

int PotB_value_m = 0;

PotA_value = analogRead(potentiometerA);

Serial.print(” Pot.Value ‘A’ = ” );

Serial.print(PotA_value);

PotB_value = analogRead(potentiometerB);

PotB_value_m = map(PotB_value,0,450,50,200);

Serial.print(” Pot.Value ‘B’ = ” );

Serial.print(PotB_value);

Serial.print(” Pot.MOD ‘B’ = ” );

Serial.print(PotB_value_m);

// Serial.print(“\n”);

if (PotA_value >= THRESHOLD_POT_HIGH)

{

Serial.print(” AVANTI ” );

delay(10);

digitalWrite (led_RGB_G,HIGH);

digitalWrite (led_RGB_R,LOW);

digitalWrite(dir_a, HIGH); //Set motor direction, 1 low, 2 high

digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low

analogWrite(pwm_a, PotB_value_m); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, PotB_value_m);

digitalWrite(led_Y,LOW);

Serial.print(“velocita motore A & B = ” );

Serial.print(PotB_value_m);

delay(10);

Serial.print(“\n “);

delay(tempo);

}

else

{

Serial.print(” INDIETRO ” );

delay(10);

digitalWrite (led_RGB_R,HIGH);

digitalWrite (led_RGB_G,LOW);

digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high

digitalWrite(dir_b, HIGH); //Set motor direction, 3 high, 4 low

analogWrite(pwm_a, PotB_value_m); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, PotB_value_m);

digitalWrite(led_Y,LOW);

Serial.print(“velocita motore A & B = ” );

Serial.print(PotB_value_m);

delay(10);

Serial.print(“\n “);

delay(tempo);

}

/////////////////////////////////////////////////////////////////////

Modifiche proposte:

Fare lampeggiare il Led

Cambiare colore al Led

 

SUGGERIMENTI

Fissare il tempo di accensione e spegnimento, eseguire in sequenza le operazioni

Cambiare il pin

Provare i cambiamenti

listato programma esempio numero 15 (di questo listato vengono omesse alcune parti per stimolare la creatività):

//////////////// CORSO ROBOT 2018-19 LEZIONE n° — 5 — ESERCIZIO n° 15

Serial.print(” ciclo = ” );

Serial.print(ciclo);

if(ciclo<Num_ciclo)

{

PotA_value = analogRead(potentiometerA);

Serial.print(” Pot.Value ‘A’ = ” );

Serial.print(PotA_value);

PotB_value = analogRead(potentiometerB);

PotB_value_m = map(PotB_value,0,550,50,200);

Serial.print(” Pot.Value ‘B’ = ” );

Serial.print(PotB_value);

Serial.print(” Pot.MOD ‘B’ = ” );

Serial.print(PotB_value_m);

if (PotA_value >= THRESHOLD_POT_HIGH)

{

Serial.print(” AVANTI ” );

delay(10);

digitalWrite (led_RGB_G,HIGH);

digitalWrite (led_RGB_R,LOW);

digitalWrite(dir_a, HIGH); //Set motor direction, 1 low, 2 high

digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low

analogWrite(pwm_a, PotB_value_m); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, PotB_value_m);

digitalWrite(led_Y,LOW);

Serial.print(“velocita motore A & B = ” );

Serial.print(PotB_value_m);

delay(10);

Serial.print(“\n “);

delay(tempo);

}

else

{

Serial.print(” INDIETRO ” );

delay(10);

digitalWrite (led_RGB_R,HIGH);

digitalWrite (led_RGB_G,LOW);

digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high

digitalWrite(dir_b, HIGH); //Set motor direction, 3 high, 4 low

analogWrite(pwm_a, PotB_value_m); //set both motors to run at 100% duty cycle (fast)

analogWrite(pwm_b, PotB_value_m);

digitalWrite(led_Y,LOW);

Serial.print(“velocita motore A & B = ” );

Serial.print(PotB_value_m);

delay(10);

Serial.print(“\n “);

delay(tempo);

}

/////////////////////////////////////////////////////////////////////

Modifiche proposte:

Cambiare il numero dei cicli

Accendere il LED solo nei cicli di valore PARI

 

SUGGERIMENTI

Trovare il valore della variabile di controllo e cambiarlo

scoprire se il valore della variabile ci controllo è PARI

(confronto con se stesso diviso e moltiplicato per 2)

Provare i cambiamenti

 

di seguito le slide della lezione

(17)

Lascia un commento

TOP