Salve atutti.
Premetto che nonostante sia un appassionato di modellismo dinamico da poco mi sono adentrato nel mondo della programmazione.
Utilizzo arduino uno,un modulo HC-SR04 e una motor shield adafruit.
Il mio intento è quello di misurare la distanza da un determinato oggetto,fatto questo il valore letto (convertito in cm) va a regolare la direzione e la velocità di un motore controllato tramite la motor shield.
Il problema è che il motore non si muove,ho fatto un controllo tramite tester e posso notare che effettivamente una tensione arriva,ma è estremamente bassa (intorno a 0,20V).
Il problema è sicuramente nella regolazione della velocità,dato che settando il motore a 255 (al posto di motorSpeed) il circuito funzionava senza problemi.
Posto di seguito lo sketch:
#include <AFMotor.h>
#define MAXSPEED 200
int triggerPort = A0;
int echoPort = A1;
AF_DCMotor motor1(1, MOTOR12_64KHZ);
void setup()
{
Serial.begin(9600);
pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
scan();
delay(3000);
}
void loop()
{
int distanza; // distanza letta dal sensore
int errore;
int motorSpeed;
motor1.setSpeed(motorSpeed);
#define soglia 10 //distanza desiderata 10cm
distanza = scan();
errore = soglia - distanza;
motorSpeed = (abs(errore) * 20);
motorSpeed = constrain(motorSpeed, 0, MAXSPEED);
if ( errore > 0)
{
motor1.run(BACKWARD);
}
if (errore < 0)
{
motor1.run(FORWARD);
}
}
long scan()
{
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 2 );
digitalWrite( triggerPort, LOW );
long duration = pulseIn( echoPort, HIGH );
long r = 0.034 * duration / 2;
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
return(r);
//aspetta 1.5 secondi
delay( 500 );2;
}
Grazie in anticipo.