My Free Time

Arduino et les moteurs avec le module L293D

Autre module qui sert à piloter des moteurs, le L293D (D car il y a des diodes à l'intérieur).

il peut piloter 2 moteurs à courant continu.

Les tutoriaux ne manquent pas sur le web mais ici on va voir comment le piloter depuis VB.net.

Arduino et le 74HC595

Comment ça se branche ?

Pour tester ce module avec VB.net j'ai fait le montage simple ci-dessous :

Ci-dessous le programme à injecter dans l'Arduino :

Pour rappel la fonction parseInt prend une chaine avec un délimiteur, exemple une virgule, et la divise en plusieurs "morceaux".

Par exemple si la chaine qui arrive est 200,1,0 alors parseInt la divise en trois, quand on fait :

byte a=Serial.parseInt();

byte m=Serial.parseInt();

byte n=Serial.parseInt();

on place 200 dans la variable a, 1 dans la variable m, 0 dans la variable n.

la chaine aurait pu être 200;1;0 ou 200/1/0 le résultat serait le même.

Ici le 200 sera la valeur PWM c'est à dire la vitesse du moteur (de 0 à 255).

Le 1 pour HIGH et le 0 pour LOW ce qui détermine la direction de rotation du moteur.


int enA = 9;
int in1 = 2;
int in2 = 4;

void setup()
{
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  Serial.begin(57600);
}

void loop()
{
  if (Serial.available() > 0) {
    byte a = Serial.parseInt();
    byte m = Serial.parseInt();
    byte n = Serial.parseInt();

    analogWrite(enA, a);
    digitalWrite(in1,  m);
    digitalWrite(in2,  n);
  }
}

Pour la partie VB.net, il faut :

  • une Form
  • un SerialPort (vitesse 57600, port COM de la carte Arduino)
  • un Timer (Timer1)
  • une TrackBar nommé EnA, avec un minimum de 1, maximum de 250.
  • deux CheckBox nommées in1, in2.

Puis le programme ci-dessous :


  Public Class Form1

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

          SerialPort1.Close()
          Try
              SerialPort1.Open()
          Catch ex As Exception
              MsgBox(ex.Message)
          End Try

          Timer1.Start()

      End Sub

      Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
          SerialPort1.WriteLine(EnA.Value & "," & In1.CheckState & "," & In2.CheckState)
      End Sub
  End Class

Construction de l'appli VB en vidéo :

Pour 2 moteurs :


  int enA = 9;
  int in1 = 2;
  int in2 = 4;
  
  int enB = 5;
  int in3 = 7;
  int in4 = 8;
  
  void setup()
  {
    pinMode(enA, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
  
    pinMode(enB, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
  
    Serial.begin(57600);
  }
  
  void loop()
  {
    if (Serial.available() > 0) {
      byte a = Serial.parseInt();
      byte m = Serial.parseInt();
      byte n = Serial.parseInt();
  
      byte b = Serial.parseInt();
      byte o = Serial.parseInt();
      byte p = Serial.parseInt();
  
      analogWrite(enA, a);
      digitalWrite(in1,  m);
      digitalWrite(in2,  n);
  
      analogWrite(enB, b);
      digitalWrite(in3, o);
      digitalWrite(in4, p);
    }
  }

Programme VB.net :


Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        InitArduino()
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        SerialPort1.WriteLine(EnA.Value & "," & In1.CheckState & "," & In2.CheckState & "," & EnB.Value & "," & In3.CheckState & "," & In4.CheckState)
    End Sub

    Private Sub InitArduino()
        SerialPort1.Close()
        Try
            SerialPort1.Open()
        Catch ex As Exception
            MsgBox("La carte Arduino n'est peut-être pas branchée, ou le port COM n'est pas le bon." & vbCrLf & "Port déclaré actuellement : " & SerialPort1.PortName, MsgBoxStyle.Exclamation, "Problème")
            End
        End Try
    End Sub

End Class