Il pilotaggio di motori in corrente continua è una delle applicazioni usate nell'IoT per la movimentazione di oggetti, robot ed altro.
Naturalmente, per effettuare in modo conveniente e con tecnica "generale" il pilotaggio dei motori in DC occorre predisporre un "Ponte ad H". Il ponte ad H è chiamato così per la sua tipica configurazione, a forma di H, dove il carico occupa una diagonale. Con opportuni comandi si può inviare al carico una tensione positiva o negativa.
Come al solito, il programma è "strutturato" e presenta delle routine che, svolgendo le operazioni ripetitive, semplificano l'implementazione di tutti i comandi.
Lascio all'utente l'onere e l'onore di prevedere un comando con funzione di ARRESTO MOTORE.
Prima di invertire il senso di marcia è sempre consigliabile passare per il comando di arresto!
Nota importante: questo programma NON è adatto per i motori che hanno una eccitazione indipendente ma, nel caso. si potrebbe adattare facilmente.
/* -------------------- Inizio Programma --------------------------
Pilotaggio motore in DC con ponte H
Achille De Santis - V3 del 27-06-2019
Subroutine per motore avanti/indietro.
*/
// ------------------------- I/O ----------------------------------------
#define switchPin 2 // comando verso di rotazione
#define motor1Pin 3 // H-bridge morsetto 1 (pin 2, 1A)
#define motor2Pin 4 // H-bridge morsetto 2 (pin 7, 2A)
#define enablePin 9 // H-bridge enable pin
#define ledPin 13 // LED
//----------------------------------------------------------------------
void blink(int whatPin, int howManyTimes, int milliSecs) // blinks an LED
{
int i=0;
for (i=0; i<howManyTimes; i++)
{
digitalWrite(whatPin, HIGH); delay(milliSecs/2);
digitalWrite(whatPin, LOW); delay(milliSecs/2);
}
}
void motore(boolean M1, boolean M2) // comanda il motore
{
digitalWrite(motor1Pin, M1); // predispone il morsetto 1 del ponte H
digitalWrite(motor2Pin, M2); // predispone il morsetto 2 del ponte H
}
void avanti() { motore(0,1); } // fa girare il motore in avanti
void indietro() { motore(1,0); } // fa girare il motore all'indietro
void setup()
{
pinMode(switchPin, INPUT); // predispone switch come input, gli altri pin in uso come output.
pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(enablePin, HIGH); // inizializza enablePin alto, abilita ponte H:
// lampeggia LED 3 volte. Questo succede una sola volta.
// Se vedi lampeggiare il LED 3 volte, il modulo si è resettato,
// probabilmente perché il motore ha causato un brown-out o un cortocircuito.
blink(ledPin, 3, 100);
}
void loop()
{
boolean x = digitalRead(switchPin);
switch (x)
{
case 1: avanti(); break; // se lo switch è "alto" il motore girerà in una direzione,
case 0: indietro(); break; // se lo switch è "basso" il motore girerà in direzione opposta.
}
}
// ------------- Fine programma ---------------------------------------------------------------------------
Argomenti correlati:
Naturalmente, per effettuare in modo conveniente e con tecnica "generale" il pilotaggio dei motori in DC occorre predisporre un "Ponte ad H". Il ponte ad H è chiamato così per la sua tipica configurazione, a forma di H, dove il carico occupa una diagonale. Con opportuni comandi si può inviare al carico una tensione positiva o negativa.
Come al solito, il programma è "strutturato" e presenta delle routine che, svolgendo le operazioni ripetitive, semplificano l'implementazione di tutti i comandi.
Lascio all'utente l'onere e l'onore di prevedere un comando con funzione di ARRESTO MOTORE.
Prima di invertire il senso di marcia è sempre consigliabile passare per il comando di arresto!
Nota importante: questo programma NON è adatto per i motori che hanno una eccitazione indipendente ma, nel caso. si potrebbe adattare facilmente.
/* -------------------- Inizio Programma --------------------------
Pilotaggio motore in DC con ponte H
Achille De Santis - V3 del 27-06-2019
Subroutine per motore avanti/indietro.
*/
// ------------------------- I/O ----------------------------------------
#define switchPin 2 // comando verso di rotazione
#define motor1Pin 3 // H-bridge morsetto 1 (pin 2, 1A)
#define motor2Pin 4 // H-bridge morsetto 2 (pin 7, 2A)
#define enablePin 9 // H-bridge enable pin
#define ledPin 13 // LED
//----------------------------------------------------------------------
void blink(int whatPin, int howManyTimes, int milliSecs) // blinks an LED
{
int i=0;
for (i=0; i<howManyTimes; i++)
{
digitalWrite(whatPin, HIGH); delay(milliSecs/2);
digitalWrite(whatPin, LOW); delay(milliSecs/2);
}
}
void motore(boolean M1, boolean M2) // comanda il motore
{
digitalWrite(motor1Pin, M1); // predispone il morsetto 1 del ponte H
digitalWrite(motor2Pin, M2); // predispone il morsetto 2 del ponte H
}
void avanti() { motore(0,1); } // fa girare il motore in avanti
void indietro() { motore(1,0); } // fa girare il motore all'indietro
void setup()
{
pinMode(switchPin, INPUT); // predispone switch come input, gli altri pin in uso come output.
pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(enablePin, HIGH); // inizializza enablePin alto, abilita ponte H:
// lampeggia LED 3 volte. Questo succede una sola volta.
// Se vedi lampeggiare il LED 3 volte, il modulo si è resettato,
// probabilmente perché il motore ha causato un brown-out o un cortocircuito.
blink(ledPin, 3, 100);
}
void loop()
{
boolean x = digitalRead(switchPin);
switch (x)
{
case 1: avanti(); break; // se lo switch è "alto" il motore girerà in una direzione,
case 0: indietro(); break; // se lo switch è "basso" il motore girerà in direzione opposta.
}
}
// ------------- Fine programma ---------------------------------------------------------------------------
Argomenti correlati:
Nessun commento:
Posta un commento