Buonasera.
Ritorno su questo tema perchè avrei realizzato artigianalmente una scheda con a bordo un Arduino v4 e uno shield L298N collegato in modo che, una volta staccato il PC, il driver possa alimentare anche Arduino.
MI ritrovo un problema al quale, dopo un giorno di prove, non sono riuscito a venire a capo.
Allego qui sotto la scheda con i dispositivi installati.
Ovviamente, prima dei collegamenti, sono stati testati con cura gli isolamenti reciproci delle zone 12v, 5v e ground.
E qui lo schema che ho seguito (lo vedete diverso dall’immagine sopra perché lo schema è stato tracciato sulla parte ramata sottostante).
Qui sotto lo sketch.
```cpp
// GestCCMotor_L298N
// Controllo motore in CC con driver L298N per piattaforma di inversione tramite
// quattro pulsanti.
/* Se la piattaforma è in posizione di transito la variabile "posizione" vale 1.
Se la piattaforma è in posizione deviata la variabile "posizione" vale 2.
Il programma in partenza considera il ponte in posizione 1, se così non è
perchè si è verificata una disalimentazione della piattaforma col ponte in
una qualche altra posizione, alla ripartenza del sistema di controllo si
può riallineare correttamente la piattaforma in posizione 1 il tasto 3.
Casi.
Posizione Tasto Posizione
piattaforma premuto Rotazione successiva
1 1 180° antioraria 1
1 2 15° antioraria 2
2 1 15° oraria 1
2 2 165° antioraria 1
- 3 rotazione continua in senso orario -
- 4 rotazione continua in senso antiorario -
*/
int motorPin1 = 11;
int motorPin2 = 12;
int Pinvelocita = 9;
int posizione = 1;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
//int buttonState5 = 0;
// Assegnazione numeri pin:
const int buttonPin2 = 2; // nome pulsante e pin associato
const int buttonPin4 = 4; // nome pulsante e pin associato
const int buttonPin5 = 5; // nome pulsante e pin associato
const int buttonPin6 = 6; // nome pulsante e pin associato
//const int buttonPin7 = 7; // nome pulsante e pin associato
//const int gradi180 = 44100; // numero di millisecondi per una rotazione di 180°
const int gradi180 = 5000; // numero di millisecondi per una rotazione di 180°
const int gradi15 = gradi180 / 180 * 15; // numero di millisecondi per una rotazione di 15°
const int gradi165 = gradi180 / 180 * 165; // numero di millisecondi per una rotazione di 165°
const int step = 3; // numero di millisecondi step rotazione continua
const int velocita = 70; // Settaggio velocità di rotazione
void setup()
{
//Definizione pin di I/O
pinMode(buttonPin2, INPUT);
pinMode(buttonPin4, INPUT);
pinMode(buttonPin5, INPUT);
pinMode(buttonPin6, INPUT);
//pinMode(buttonPin7, INPUT);
pinMode(Pinvelocita, OUTPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
//inizializzo la comunicazione seriale cosi da mostrare i valori nel Monitor Seriale
Serial.begin(9600);
}
// Loop principale
void loop()
{
/*Invio i dati letti al Monitro seriale, cosi da poterli vedere a video
Serial.print("Posizione = ");
Serial.println(posizione);
*/
// Leggi stato del bottone 1
buttonState1 = digitalRead(buttonPin2);
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("Bottone1 = ");
Serial.println(buttonState1);
*/
// Controlla se il bottone 1 è stato premuto (valore HIGH)
if (buttonState1 == HIGH)
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState1 = ");
Serial.println(buttonState1);
if (posizione == 1)
{
//Aziona il motore per 180° senso antiorario
//scrivi stato LOW/HIGH nei due pin di moto del motore
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,velocita); //ENA pin
// Millisecondi di durata rotazione - Valore da verificare.
delay(gradi180);
//attiva freno
// digitalWrite(motorPin1, HIGH);
// digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,0); //ENA pin
}
else
{
//Aziona il motore per 15° senso orario
//scrivi stato HIGH/LOW nei due pin di moto del motore
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
analogWrite(Pinvelocita,velocita); //ENA pin
delay(gradi15);
//attiva freno
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,0); //ENA pin
posizione = 1;
}
buttonState1 = 0;
}
// Leggi stato del bottone 2
buttonState2 = digitalRead(buttonPin4);
// Controlla se il bottone 2 è stato premuto (valore HIGH)
if (buttonState2 == HIGH)
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState2 = ");
Serial.println(buttonState2);
if (posizione == 1)
{
//Aziona il motore per 15° senso antiorario
//scrivi stato HIGH/LOW nei due pin di moto del motore
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,velocita); //ENA pin
// Millisecondi di durata rotazione - Valore da verificare.
delay(gradi15);
//attiva freno
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,0); //ENA pin
posizione = 2;
}
else
{
//Aziona il motore per 165° senso antiorario
//scrivi stato HIGH/LOW nei due pin di moto del motore
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,velocita); //ENA pin
// Millisecondi di durata rotazione - Valore da verificare.
delay(gradi165);
//attiva freno
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,0); //ENA pin
posizione = 1;
}
buttonState2 = 0;
}
// Leggi stato del bottone 3
buttonState3 = digitalRead(buttonPin5);
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("Bottone3 = ");
Serial.println(buttonState3);
*/
// Controlla se il bottone 3 è stato premuto (valore HIGH).
if (buttonState3 == HIGH)
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonstate3 = ");
Serial.println(buttonState3);
//Aziona il motore in rotazione oraria continua fino al rilascio del pulsante
//La variabile "posizione" mantiene il valore che aveva
//Scrivi stato HIGH/LOW nei due pin di moto del motore
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
analogWrite(Pinvelocita,velocita); //ENA pin
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("Velocita(p3)= ");
Serial.println(velocita);
*/
//Ciclo con minimo delay per avere la massima precisione nel posizionamento
while (buttonState3==HIGH)
{
delay(step);
buttonState3 = digitalRead(buttonPin5);
}
//attiva freno
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,0); //ENA pin
buttonState3 = 0;
}
// Leggi stato del bottone 4
buttonState4 = digitalRead(buttonPin6);
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("Bottone4 = ");
Serial.println(buttonState4);
*/
// Controlla se il bottone 4 è stato premuto (valore HIGH).
if (buttonState4 == HIGH)
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonstate4 = ");
Serial.println(buttonState4);
//Aziona il motore in rotazione antioraria continua fino al rilascio del pulsante
//La variabile "posizione" mantiene il valore che aveva
//Scrivi stato LOW/HIGH nei due pin di moto del motore
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,velocita); //ENA pin
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("Velocita(p4)= ");
Serial.println(velocita);
*/
//ciclo con minimo delay per avere la massima precisione nel posizionamento
while (buttonState4==HIGH)
{
delay(step);
buttonState4 = digitalRead(buttonPin6);
}
//attiva freno
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
analogWrite(Pinvelocita,0); //ENA pin
buttonState4 = 0;
// posizione = 1;
}
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
}
```
Come già scrissi in un precedente thread, uso 4 pulsanti per far ruotare in vari modi una piattaforma girevole.
Nello sketch ho messo dei “serial.print” per vedere il pulsante che viene premuto.
I pulsanti 1, 2 e 3 fanno quello che devono fare ma, premendo il pulsante 4, a volte il pulsante mostrato risulta essere il 4, a volte l’1 con i corretti movimenti corrispondenti.
Qui sotto il risultato dell’output del serial print premendo 5 volte il pulsante 4.
Alla prima pressione lo sketch passa dal ramo “If” come se avesse intercettato la pressione del pulsante 1 (buttonstate1) invece che 4 (buttonState4).
Alla seconda, terza e quarta lo sketch rileva correttamente la pressione del pulsate 4 (buttonstate4) e passa dal ramo ”If” giusto.
Alla quinta pressione ancora una volta lo sketch rileva la pressione del pulsante 1 (buttonstate1) invece che 4 (buttonState4).
Questo comportamento non si verifica premendo i pulsanti 2 e 3 e, quando avevo testato il l’impianto con la breadboard, non avevo rilevato questo comportamento.
Mi potete dare una dritta?
Grazie.
Massimo.



