La prima operazione da fare è collegare un interruttore al pin 2 di arduino come in figura 1.
Come funziona un ponte H?
L'L293NE/SN754410 é un ponte-H molto semplice. E' costituito da due "ponti", uno sul lato sinistro del chip ed uno sul lato destro, e può controllare 2 motori. Può controllare dino ad 1 ampere di corrente, e funziona tra i 4.5 V e i 36 V.
I pin del ponte H:
- Pin 1 (1,2EN) attiva/disattiva il nostro motore a seconda che sia HIGH o LOW
- Pin 2 (1A) é un pin logico per il nostro motore (ppuò essere HIGH o LOW)
- Pin 3 (1Y) é uno dei due poin a cui metteremo il motore (motor terminals)
- Pin 4-5 sono per la massa (GND)
- Pin 6 (2Y) é per l'altro motor terminal
- Pin 7 (2A)é un pin logico per il nostro motore (ppuò essere HIGH o LOW)
- Pin 8 (VCC2) é l'alimentazione per il nostor motore, a cui dovremmo dare il voltaggio giusto per il nostro motore
- Pin 9-11 non sono utilizzati (stiamo controllando solo un motore in questa lezione)
- Pin 12-13sono per la massa (GND)
- Pin 14-15 non sono connessi
- Pin 16 (VCC1) é connesso a 5V
Qui sotto c'é un diagramma sui pin che useremo e su come li useremo nel nostro esempio. Nella tabella sottostante potete vedere il comportamento del motore seconda si come vengono settati i pin dell'integrato (controllati da Arduino).
Per questa lezione controlleremo l'EN pin del chip con un pin digitale di Arduino: settandolo HIGH o LOW accennderemo o spegneremo il motore. anche i pin logici del chip saranno connessi a dei pin digitali di Arduino, in modo da andare in una direzione con HIGH e LOW, nella direzione opposta con LOW e HIGH. L'alimentazione del motore é comunemente esterna. Seil motore che usate può andare a 5V e a meno di 500 mA potete usare i 5V di Arduino. Questo é molto raro.
Connettiamo il motore al Ponte H
Se avete bisogno di un'alimentazione esterna, potete usare una fonte di energia 9 - 15V (se compatibile con il vostro motore).
Attaccate un alimentazion esterna ad Arduino. Potete mantenere l'Arduino attaccato via USb al computer per riprogrammare velocemente il microcontrollore. Qualunque motore usiate, assicuratevi che sia compatibile con l'alimentazione (e.g. non usate batterie da 9V con un motore sa 3V!). Il pin Vin restituisce il valore dell'alimentazione esterna.
Se notate che il vostro microcontrollore va in reset quando il motore si accende, aggiungete in condensatore tra alimentazione e massa vicino al motore. Il condensatore spianerà lo sbalzo elettrico che avviene quando il motore si accende.
Alimentazione Esterna
Il codice:
controlla il motore tramite l'interruttore
const
int
switchPin = 2;
// switch input
const
int
motor1Pin = 3;
// H-bridge leg 1 (pin 2, 1A)
const
int
motor2Pin = 4;
// H-bridge leg 2 (pin 7, 2A)
const
int
enablePin = 9;
// H-bridge enable pin
const
int
ledPin = 13;
// LED
void
setup
() {
// set the switch as an input:
pinMode
(switchPin,
INPUT
);
// set all the other pins you're using as outputs:
pinMode
(motor1Pin,
OUTPUT
);
pinMode
(motor2Pin,
OUTPUT
);
pinMode
(enablePin,
OUTPUT
);
pinMode
(ledPin,
OUTPUT
);
// set enablePin high so that motor can turn on:
digitalWrite
(enablePin,
HIGH
);
// blink the LED 3 times. This should happen only once.
// if you see the LED blink three times, it means that the module
// reset itself,. probably because the motor caused a brownout
// or a short.
blink(ledPin, 3, 100);
}
void
loop
() {
// if the switch is high, motor will turn on one direction:
if
(
digitalRead
(switchPin) ==
HIGH
) {
digitalWrite
(motor1Pin,
LOW
);
// set leg 1 of the H-bridge low
digitalWrite
(motor2Pin,
HIGH
);
// set leg 2 of the H-bridge high
}
// if the switch is low, motor will turn in the other direction:
else
{
digitalWrite
(motor1Pin,
HIGH
);
// set leg 1 of the H-bridge high
digitalWrite
(motor2Pin,
LOW
);
// set leg 2 of the H-bridge low
}
}
/*
blinks an LED
*/
void
blink(
int
whatPin,
int
howManyTimes,
int
milliSecs) {
int
i = 0;
for
( i = 0; i < howManyTimes; i++) {
digitalWrite
(whatPin,
HIGH
);
delay
(milliSecs/2);
digitalWrite
(whatPin,
LOW
);
delay
(milliSecs/2);
}
}
Codice test motori via seriale
Controllo motore tramite monitor seriale digitando: "H", "J", "L"
Usando analogWrite() sul pin 9, il pin di attivazione (Enable) del chip e potrete variare la velocità del motore.
Usando analogWrite() sul pin 9, il pin di attivazione (Enable) del chip e potrete variare la velocità del motore.
Codice:
// testing motors
//
const
int
motor1Pin = 3;
// H-bridge leg 1 (pin 2, 1A)
const
int
motor2Pin = 4;
// H-bridge leg 2 (pin 7, 2A)
const
int
enablePin = 9;
// H-bridge enable pin
const
int
ledPin = 13;
// LED
int
incomingByte;
// a variable to read incoming serial data into
void
setup
() {
Serial.begin(9600);
// open serial port to receive data
// set all the other pins you're using as outputs:
pinMode
(motor1Pin,
OUTPUT
);
pinMode
(motor2Pin,
OUTPUT
);
pinMode
(enablePin,
OUTPUT
);
pinMode
(ledPin,
OUTPUT
);
// set enablePin high so that motor can turn on:
digitalWrite
(enablePin,
LOW
);
}
void
loop
() {
// see if there's incoming serial data:
if
(Serial.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if
(incomingByte ==
'H'
) {
digitalWrite
(enablePin,
HIGH
);
// accende il motore
digitalWrite
(motor1Pin,
LOW
);
// set leg 1 of the H-bridge low
digitalWrite
(motor2Pin,
HIGH
);
// set leg 2 of the H-bridge high
}
else
if
(incomingByte ==
'J'
) {
digitalWrite
(enablePin,
HIGH
);
// accende il motore,
digitalWrite
(motor1Pin,
HIGH
);
// set leg 1 of the H-bridge low
digitalWrite
(motor2Pin,
LOW
);
// set leg 2 of the H-bridge high
}
else
if
(incomingByte ==
'L'
) {
digitalWrite
(enablePin,
LOW
);
// spegne il motore
}
}
}
modificando "HIGH" con un valore che va da 0 a 255 si può agire sulla velocità
digitalWrite
(enablePin,
HIGH
);
adesso non vi resta che sperimentare ed adattarlo alle vostre esigenze.
Se avete dei problemi a far funzionare il circuito commentate o scrivete sul forum.
Salve,
RispondiEliminaavrei bisogno di un aiuto nell'interpretrare il seguente concetto :
Controllo motore tramite monitor seriale digitando: "H", "J", "L"
Usando analogWrite() sul pin 9, il pin di attivazione (Enable) del chip e potrete variare la velocità del motore...
scusate ma stò imparando da autodidatta e molti concetti ho difficoltà ad apprenderli da solo...
attendo pazientemente
grazie in anticipo e Buon lavoro
PS: il circuito funziona perfettamente ma non riesco a variare la velocità del motore ho provato a farlo con altri progetti dotati di potenziometro ma ho bisogno di provare a farlo funzionare tramite monitor seriale.
Ciao ShutUp MashUp,
RispondiEliminamodificando "HIGH" con un valore che va da 0 a 255 si può agire sulla velocità
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, 100); //dove 0 è fermo e 255 massimo
lo devi impostare in fase di upload e rimarra fisso....