giovedì 10 luglio 2014

Arduino Tutorial 18: Controllare un Motore DC con un ponte H (L293D)

con il componente L293D è possibile controllare fino a due motori in corrente continua ad una tensione che va da 4,5v a 36v.
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.
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.

2 commenti:

  1. Salve,
    avrei 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.

    RispondiElimina
  2. Ciao ShutUp MashUp,

    modificando "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....

    RispondiElimina

Commenta