ho ricontrollato più volte il circuito(mi sembra tutto esatto) però il motorino gira per un paio di secondi quando carico il programma e poi ancora quanto apro il monitor seriale.Una cosa strana però c'è: Ho provato a mettere una stampa del valore letto dal potenziometro e questa dava valori da 1 a 8 man mano che giravo la vite; tanto per provare ho provato a cambiare il potenziometro ma comunque stesso problema
Vi posto il programma.
Non ha molto senso la logica che hai implementato. Quel codice non fa quello che ti aspetti. la while() è bloccante.
Alla partenza del programma il motore deve girare o devi aspettare da seriale w ?
void loop()
{ if(Serial.available()>0) // se c'e' un dato lo leggo altrimenti azione rimane il valore precedente
{ azione=Serial.read ();
}
vel = analogRead (letpot);
Serial.println (vel);
if (azione == 'w')
{ avanti (vel);
}
if (azione == 's')
{ indietro (vel);
}
}
Se alla partenza deve andare avanti allora nelle variabili globali inizializza azione a w
Tieni conto che quando arriva w o s ad Arduino, finchè non mandi altri comandi azione varrà sempre quel carattere.
Perciò di continuo esegue avanti() o indietro()
Non mi ricordo come funzia il ponte H, devi di continuo mandare segnali sui pin?
Se non è necessario allora azzera il comando dopo avanti e indietro:
if (azione == 'w')
{ avanti (vel);
azione=' '; // azzera il comando
}
In teoria non è necessario mandare di continuo segnali sui pin (dovrebbe tenere "in memoria" finche non dai un nuovo comando), ed è quello che avevo intenzione di fare.
int letpot=A0;
int vel;
char azione;
int avantisx=13; //motore sx
int indietrosx=12; // motore sx
int velocita=11;
void setup ()
{
pinMode (avantisx, OUTPUT);
pinMode (indietrosx, OUTPUT);
pinMode (velocita, OUTPUT);
pinMode (letpot, INPUT);
Serial.begin(9600);
}
void loop ()
{
if (Serial.available()>0) // leggo qualcosa
{
azione=Serial.read (); // leggo un carattere: decido il verso di rotazione
}
if (azione == 'w') // verso avanti
{
avanti ();
}
if (azione == 's') // verso indietro
{
indietro ();
}
}
void avanti ()
{
// MOTORE
digitalWrite (avantisx, HIGH); // abilito i pin dell'integrato per far girare il motore in un verso
digitalWrite (indietrosx, LOW);
int v;
v=map(letpot, 0, 1023, 0, 255);
int a=analogRead (letpot);
Serial.println(a);
analogWrite (velocita, v); // do un valore da 1 a 255 sul pin 1 dell'integrato (indico la velocità con cui deve girare il motore)
//Serial.println(z);
}
void indietro ()
{
digitalWrite (avantisx, LOW);// abilito i pin dell'integrato per far girare il motore in un verso
digitalWrite (indietrosx, HIGH);
int v;
v=map(letpot, 0, 1023, 0, 255);
analogWrite (velocita, v);// do un valore da 1 a 255 sul pin 1 dell'integrato (indico la velocità con cui deve girare il motore)
Serial.println("indietro\n");
}
ho riscontrato ancora 2 problemi di cui non riesco a capirne il motivo:
mettendo una stampa della variabile a (nella funzione avanti() ) sul monitor visualizza(ruotando il potenziometro) numeri da o a 638; non dovrebbe essere da 0 a 1023? (al potenziometro non sono state aggiunte resistenze in serie).
la funzione map mi restituisce sempre il valore 3
grazie
Se vuoi questo è il codice che io uso per comandare un motore DC attraverso L293D e un Joystick
byte motor1Pin1 = 3; // pin 2 on L293D
byte motor1Pin2 = 4; // pin 7 on L293D
byte enablePin = 9; // pin 1 on L293D
int value = 512;
void setup() {
// set the switch as an input:
Serial.begin(9600);
// set all the other pins you're using as outputs:
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enablePin, OUTPUT);
// set enablePin high so that motor can turn on:
digitalWrite(enablePin, HIGH);
}
void loop() {
// if the switch is high, motor will turn on one direction:
value = analogRead(A0);
Serial.println(value);
if (value > 505) {
value = map (value, 520, 1023, 40, 255);
value = 255 - value;
analogWrite(motor1Pin1, value); // set pin 2 on L293D low
digitalWrite(motor1Pin2, HIGH); // set pin 7 on L293D high
}
// if the switch is low, motor will turn in the opposite direction:
else if (value < 495){
value = map (value, 0, 504, 40, 255);
value = 255 - value;
analogWrite(motor1Pin1, value); // set pin 2 on L293D high
digitalWrite(motor1Pin2, LOW); // set pin 7 on L293D low
}
else{
digitalWrite(motor1Pin1, HIGH); // set pin 2 on L293D high
digitalWrite(motor1Pin2, HIGH);
}
delay(10);
}