Le porte di uscita della scheda Arduino che andranno a collegarsi con i sensori sono i seguenti:
Sensore ultrasuoni destra PIN 13
Sensore ultrasuoni centro PIN 12
Sensore ultrasuoni sinistra PIN 11
Mentre il piedino per il trigger di tutti e tre i sensori è:
Trigger ultrasuoni PIN 3
Non è necessario usare 3 piedini per generare gli impulsi sul trigger perchè questi vengono inviati uno per volta, quindi è sufficiente unire i 3 trigger ad un unico cavo.
Una soluzione potrebbe essere quella in foto.
L'istruzione che genera l'impulso sul trigger è la seguente:
digitalWrite(UltrasTr, HIGH ); //Alzo il livello a uno
delayMicroseconds( 10 ); //Attendo 10 microsecondi
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
Mentre l'istruzione che preleva il tempo in cui il piedino è a livello alto è la seguente:
TempoechoSx = pulseIn( UltrasSx, HIGH,38000 );
Il codice test completo è il seguente:
//***************************************************************************
//Programma test per il robot Poor versione 2
//Setto le porte di uscita per le funzioni:
//Integrato trovato sulla macchinetta SM6135W oppure RX2-C
//Avanti PIN 10 ---- Integrato 10
//Indietro PIN 9 ---- Integrato 11
//Destra PIN 5 ---- Integrato 6
//Sinistra PIN 6 ---- Integrato 7
//Sensore ultrasuoni destra PIN 13
//Sensore ultrasuoni centro PIN 12
//Sensore ultrasuoni sinistra PIN 11
//Trigger ultrasuoni PIN 3
//
//Realizzato da: Daniele Loddo alias Ivotek
//Data: 07/12/2015
//Web: www.mignololab.org www.ivotek.it
//Email: info@mignololab.org ivotek@gmail.com
//***************************************************************************
//Dichiaro le variabili per utilizzare i nomi al posto dei numeri
//Spreco memoria ma il codice risulta leggibile al principiante
int Destra = 5;
int Sinistra = 6;
int Avanti = 10;
int Indietro = 9;
int UltrasDx = 13;
int UltrasSx = 11;
int UltrasCx = 12;
int UltrasTr = 3;
//Variabili per contenere i valori dei sensori
int vUltrasDx;
int vUltrasSx;
int vUltrasCx;
//Variabili per contenere il tempo dell'eco
long TempoechoDx;
long TempoechoSx;
long TempoechoCx;
//Variabili per la conversione in centimetri
long centimetriD;
long centimetriS;
long centimetriC;
void setup() {
//Setto i PIN come out o in per pilotare i motori e i sensori di linea del robot.
pinMode(Avanti,OUTPUT); //Setto la porta Avanti come uscita
pinMode(Indietro,OUTPUT); //Setto la porta Indietro come uscita
pinMode(Destra,OUTPUT); //Setto la porta Destra come uscita
pinMode(Sinistra,OUTPUT); //Setto la porta Sinistra come uscita
pinMode(UltrasDx, INPUT); //Setto la porta UltrasDx come ingresso
pinMode(UltrasSx, INPUT); //Setto la porta UltrasSx come ingresso
pinMode(UltrasCx, INPUT); //Setto la porta UltrasCx come ingresso
pinMode(UltrasTr, OUTPUT); //Setto la porta UltrasT come uscita
}
void loop() {
//Genero un impulso di 10 micro secondi per il trigger
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
delayMicroseconds(3); //Attendo 3 microsecondi
digitalWrite(UltrasTr, HIGH ); //Alzo il livello a uno
delayMicroseconds( 10 ); //Attendo 10 microsecondi
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
//Prelevo il tempo dai sensori
TempoechoDx = pulseIn( UltrasDx, HIGH,38000 );
delay(10);
//Genero un impulso di 10 micro secondi per il trigger
digitalWrite(UltrasTr, HIGH ); //Alzo il livello a uno
delayMicroseconds( 10 ); //Attendo 10 microsecondi
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
TempoechoSx = pulseIn( UltrasSx, HIGH,38000 );
delay(10);
//Genero un impulso di 10 micro secondi per il trigger
digitalWrite(UltrasTr, HIGH ); //Alzo il livello a uno
delayMicroseconds( 10 ); //Attendo 10 microsecondi
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
TempoechoCx = pulseIn( UltrasCx, HIGH,38000 );
//delay(100);
//Converto il tempo in centimetri
centimetriD = 0.034 * TempoechoDx / 2;
centimetriS = 0.034 * TempoechoSx / 2;
centimetriC = 0.034 * TempoechoCx / 2;
//I sensori sono tutte e tre senza ostacoli
if (centimetriD > 15 and centimetriS > 15 and centimetriC > 15 )
{
//Il robot va avanti, cambiare il numero 255 per variare la velocità
analogWrite(Avanti, 255); // Il robot cammina alla massima velocità
analogWrite(Indietro, 0); // Il robot cammina alla massima velocità
//Lo sterzo è dritto
digitalWrite(Destra, LOW);
digitalWrite(Sinistra, LOW);
}
else if (centimetriD < 15 and centimetriD > 0) // C'è un ostacolo a destra
{
//Il robot gira a sinistra andando sempre avanti
digitalWrite(Destra, LOW);
digitalWrite(Sinistra, HIGH); // Il robot gira tutto a sinistra
//Il robot va avanti, cambiare il numero 255 per variare la velocità
analogWrite(Avanti, 255); // Il robot cammina alla massima velocità
analogWrite(Indietro, 0); // Il robot cammina alla massima velocità
}
else if (centimetriS < 15 and centimetriS > 0) // C'è un ostacolo a sinistra
{
//Il robot gira a destra andando sempre avanti
digitalWrite(Sinistra, LOW);
digitalWrite(Destra, HIGH); // Il robot gira tutto a destra
//Il robot va avanti, cambiare il numero 255 per variare la velocità
analogWrite(Avanti, 255); // Il robot cammina alla massima velocità
analogWrite(Indietro, 0); // Il robot cammina alla massima velocità
}
else if (centimetriC < 15 and centimetriC > 0) // C'è un ostacolo al centro
{
//Il robot si ferma
digitalWrite(Destra, LOW); // Il robot ha lo sterzo diritto
digitalWrite(Sinistra, LOW);
//Il robot si ferma
analogWrite(Avanti, 0);
analogWrite(Indietro, 0);
}
}
Aggiunta il link al corso Linux Uno su Udemy.
Aggiunto il tutorial per la realizzazionedi un Arcade con materiale di riciclo.
Aggiunta la sezione corsi.
Aggiunto il programma sulla telemetria (in fase di sviluppo).