corso 2018 L7

by / lunedì, 18 dicembre 2017 / Published in Archivio Robotica

 

LEZIONE n° 7 – ROBOT

 

 

Con questa lezione cominciamo a gestire tutto il robot. Per prima cosa dobbiamo organizzare l’hardware e seconda del tipo di robot (2 o 4 ruote) e 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/ (clicca per aprire)

 

  • 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 12: leggere gli urti del robot – ACCENDERE UN LED DIVERSO SECONDO L’URTO – CONTARE L’URTO E VERIFICARE SE IL CONTATORE E’ PARI O DISPARI

/*

gestioni urti ROBOT (con conteggio e verifica)

*/

int urtoSX=5;

int urtoDX=6;

int led_urtoSX=2;

int led_urtoDX=8;

int led_urtoCX=9;

int tempo_led=250; // SE IL VALORE E’ PICCOLO SI HANNO VARI RIMBALZI

int val_urtoSX;

int val_urtoDX;

int contaurtiSX = 0;

int contaurtiDX = 0;

int contaurtiCX = 0;

void setup()

{

Serial.begin(9600);

pinMode (urtoSX,INPUT);

pinMode (urtoDX,INPUT);

pinMode (led_urtoSX,OUTPUT);

pinMode (led_urtoDX,OUTPUT);

pinMode (led_urtoCX,OUTPUT);

digitalWrite(led_urtoSX,LOW); // SPEGNI LED

digitalWrite(led_urtoDX,LOW); // SPEGNI LED

digitalWrite(led_urtoCX,LOW); // SPEGNI LED

delay(500);

}

void loop()

{

val_urtoSX=digitalRead(urtoSX);

val_urtoDX=digitalRead(urtoDX);

if ((val_urtoSX==HIGH)&&(val_urtoDX==HIGH)) // URTO CENTRO

{

Serial.println(” “);

Serial.println(” URTO CENTRO “);

contaurtiCX++;

Serial.print(” valore contatore Urto centro = “);

Serial.print(contaurtiCX);

if(contaurtiCX==(contaurtiCX/2)*2)

Serial.print(” contatore PARI “);

else

Serial.print(” contatore DISPARI “);

digitalWrite(led_urtoCX,HIGH); // ACCENDI LED

delay(tempo_led);

digitalWrite(led_urtoCX,LOW); // SPEGNI LED

}

if ((val_urtoSX==HIGH)&&(val_urtoDX==LOW)) // URTO SINISTRO

{

Serial.println(” “);

Serial.println(” URTO SINISTRO “);

contaurtiSX++;

Serial.print(” valore contatore Urto sinistro = “);

Serial.print(contaurtiSX);

if(contaurtiSX==(contaurtiSX/2)*2)

Serial.print(” contatore PARI “);

else

Serial.print(” contatore DISPARI “);

digitalWrite(led_urtoSX,HIGH); // ACCENDI LED

delay(tempo_led);

digitalWrite(led_urtoSX,LOW); // SPEGNI LED

}

if ((val_urtoSX==LOW)&&(val_urtoDX==HIGH)) // URTO DESTRO

{

Serial.println(” “);

Serial.println(” URTO DESTRO “);

contaurtiDX++;

Serial.print(” valore contatore Urto destro = “);

Serial.print(contaurtiDX);

if(contaurtiDX==(contaurtiDX/2)*2)

Serial.print(” contatore PARI “);

else

Serial.print(” contatore DISPARI “);

digitalWrite(led_urtoDX,HIGH); // ACCENDI LED

delay(tempo_led);

digitalWrite(led_urtoDX,LOW); // SPEGNI LED

}

}

Modifiche proposte:

 

  • Contare tutti gli urti insieme
  • Accendere led diversi secondo il valore del contatore (PARI = VERDE, DISPARI = ROSSO)

 

Provare a fare le modifiche in modo autonomo altrimenti sfruttare i seguenti

SUGGERIMENTI:

1) definire un contatore TOTALE

2) sommare ogni URTO il contatore parziale a quello Totale

 

di seguito le slide della lezione

 

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]

IL ROBOT HA:

  • DUE SENSORI DI URTO
  • UN LED PER SEGNALARE LA LUCE
  • DUE MOTORI IN CORRENTE CONTINUA
  • UN SENSORE DI LUCE

 

 

 

/*
LISTATO DI UN ROBOT

IL ROBOT HA:
DUE SENSORI DI URTO
UN LED PER SEGNALARE LA LUCE
DUE MOTORI IN CORRENTE CONTINUA
UN SENSORE DI LUCE
*/

int TEMPO = 500; //soglia

//********************** SOGLIA CON POCA LUCE
int sogliaLux = 400; //soglie luce
int speedMotori = 100; //speed

int sensorPin = A5;
int pwm_a = 3; //PWM control for motor outputs 1 and 2 is on digital pin 10
int pwm_b = 11; //PWM control for motor outputs 3 and 4 is on digital pin 11
int dir_a = 12; //direction control for motor outputs 1 and 2 is on digital pin 12
int dir_b = 13; //direction control for motor outputs 3 and 4 is on digital pin 13

const int led = 2; // the number of the LED pin
int urto_DX =6;
int urto_SX =5;

int value_urto_DX;
int value_urto_SX;

int sensorValue = 0; // variable to store the value coming from the sensor
int TEMPO_MIN = 3;
int TEMPO_LUX = 3000;

int magic;

void avanti() // direzione AVANTI
{
digitalWrite(dir_a, HIGH); //Set motor direction
digitalWrite(dir_b, LOW); //Set motor direction
}

void dietro() // direzione DIETRO
{
digitalWrite(dir_a, LOW); //Set motor direction
digitalWrite(dir_b, HIGH); //Set motor direction
}

void destra() // direzione DESTRA
{
digitalWrite(dir_a, LOW); //Set motor direction,
digitalWrite(dir_b, LOW); //Set motor direction,
}

void sinistra() // direzione SINISTRA
{
digitalWrite(dir_a, HIGH); //Set motor direction,
digitalWrite(dir_b, HIGH); //Set motor direction,
}

void stop_Motori() // FERMARE MOTORI DIETRO PER POCO
{
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
}

void stop_robot() // FERMARE MOTORI DIETRO PER POCO
{

digitalWrite(dir_a, LOW);
digitalWrite(dir_b, HIGH);
delay(100);
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
dietro();
delay(100);
}

void setup()
{
Serial.begin(9600);
pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
pinMode(pwm_b, OUTPUT);
pinMode(dir_a, OUTPUT);
pinMode(dir_b, OUTPUT);
// initialize the LED pin as an output:
pinMode(led, OUTPUT);
pinMode(urto_DX, INPUT);
pinMode(urto_SX, INPUT);
analogWrite(pwm_a, speedMotori); //set both motors to run
analogWrite(pwm_b, speedMotori);
}

void loop()
{
magic=1;
// vado AVANTI SE NON CI SONO ASTACOLI
avanti(); // direzione AVANTI

Serial.print(” velocità motori = ” );
Serial.print(speedMotori);
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);

value_urto_DX = digitalRead(urto_DX);
delay(TEMPO_MIN);
value_urto_SX = digitalRead(urto_SX);
delay(TEMPO_MIN);

// URTO CENTRALE
if ((value_urto_DX == HIGH) && (value_urto_SX == HIGH))
{
Serial.print(” valore sensore URTO CENTRO (DX più SX) ” );
Serial.print(value_urto_DX );
Serial.print(” URTO CENTRO \n ” );
stop_Motori();
dietro();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

destra();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

avanti();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
magic = 0;
}

// URTO SINISTRA
if ((value_urto_SX == HIGH) && (magic==1))
{
Serial.print(” valore sensore URTO SINISTRA ” );
Serial.print(value_urto_SX );
Serial.print(” URTO SINISTRA \n ” );
// delay(TEMPO_MIN);
stop_Motori();
dietro();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

destra();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

avanti();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
}

// URTO DESTRA
if ((value_urto_DX == HIGH)&&(magic==1))
{
Serial.print(” valore sensore URTO DESTRA ” );
Serial.print(value_urto_DX );
Serial.print(” URTO DESTRA \n ” );
// delay(TEMPO_MIN);
stop_Motori();

dietro();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

sinistra();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

avanti();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
}

/****************************************************
* GESTIONE LUCE
****************************************************/
sensorValue = analogRead(sensorPin);
delay(TEMPO_MIN);

Serial.print(” sensor LUCE = ” );
Serial.print(sensorValue);
Serial.print(“\n “);

// LUCE SENSORE
if (sensorValue <= sogliaLux)
{
stop_robot();
digitalWrite(led,HIGH);
Serial.print(” TROVATA LUCE SENSORE UNICO \n ” );
delay(TEMPO_LUX);
digitalWrite(led,LOW);

destra();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

avanti();
analogWrite(pwm_a, speedMotori);
analogWrite(pwm_b, speedMotori);
// delay(TEMPO);

}
}

 

 

(27)

Tagged under: , ,

Lascia un commento

TOP