Code Arduino / VB.net Quadrupède pour apprentissage

Publié le par ludovic

Je profite d'un instant de libre pour reprendre la gestion du robot à 4 pattes.

Comme vu précédemment, l'idée et de mouvoir une par une les pattes du robot avec Visual Basic. Les angles (ou signal PWM) sont enregistrées sur VB. Une fois les mouvements souhaités enregistrés, un transfert dans la mémoire de l'arduino permettra d'exploiter ces séquences (mouvements).

A ce jour, la communication entre arduino et VB fonctionne. Le code ci dessous permet de communiquer et de mouvoir le servomoteur sélectionné.

La trame 'serie' est de la forme xPPPP ou x représente une lettre entre 'a' et 'l' et PPPP représente la valeur PWM du servo entre 1000 et 2000. 1500 étant le neutre.

Il y a 4 pattes x 3 servos, donc 12 servos en tout. Chaque lettre désigne une patte, 'a' la hanche de la première patte, 'b' le fémur de la première patte, etc.

Code arduino :

#include <Wire.h>
#include <LiquidCrystal.h>

#define SD21 0x61 //SD21 I2C Address, shifted by one bit from original 0xC2:sta

char Buffer[6];
char FilterBuffer[6];
char BufferPwm[5];
unsigned int OutPwm=1500;
byte Patte = 4; // Patte 1 femur par defaut
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("Initialisation");
  delay(1000);
}

void loop() {
  if (Serial.available() >= 1) { // read 5 bytes, the VB trame is composed to : letterPatte and 4 numeric for pwm value. The trame is in ASCII
    Serial.readBytes(Buffer, 5); // Lit 5 char ASCII
    if (Buffer[0] > 96 && Buffer[0] < 109) { // ascii a=>97, l=>108
     for (byte i=1; i<=4; i++) { BufferPwm[i-1] = Buffer[i]; }// extract letterPatte of the trame for extract only numeric pwm value
     OutPwm = atoi(BufferPwm); // convert char in integer. Now OutPwm is integer format
     OutPwm = constrain(OutPwm, 1000, 2000);
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("Patte : ");
     lcd.print(Buffer[0]);
     lcd.setCursor(0, 1);
     lcd.print(Buffer); lcd.print(" - "); lcd.print(OutPwm);
     switch (Buffer[0]) {
       case 'a' : Patte = 1; break;
       case 'b' : Patte = 4; break;
       case 'c' : Patte = 7; break;
       case 'd' : Patte = 10; break;
       case 'e' : Patte = 13; break;
       case 'f' : Patte = 16; break;
       case 'g' : Patte = 19; break;
       case 'h' : Patte = 22; break;
       case 'i' : Patte = 25; break;
       case 'j' : Patte = 28; break;
       case 'k' : Patte = 31; break;
       case 'l' : Patte = 34; break;
       default : 4;
     }
     Wire.beginTransmission(SD21); Wire.write(Patte); 
     Wire.write(lowByte(OutPwm));  Wire.endTransmission();  
     Wire.beginTransmission(SD21); Wire.write(Patte+1); 
     Wire.write(highByte(OutPwm)); Wire.endTransmission();
    }
  }
}

Code VB.Net :

Le principe est le suivant :

Il faut incorporer un objet SerialPort appelé par exemple SP1.

Il faut ensuite importer avant la Public Class :

Imports System.IO.Ports
Imports System.Diagnostics

-------------------

Ensuite il faut configurer le port USB, le code est à mettre par exemple dans le load de la form principale ou à configurer directement dans la fenêtre des priorités de l'objet SP1  :

SP1.Close()
SP1.PortName = "com32"  'com32 est à adapter en fonction de votre port com où est brancher arduino
SP1.BaudRate = 9600 '14400 '9600 '38400
SP1.DataBits = 8
 SP1.Parity = Parity.None 'None
SP1.StopBits = StopBits.One
SP1.Handshake = Handshake.None
SP1.Encoding = System.Text.Encoding.Default
SP1.Open()
SP1.RtsEnable = True

-------------------

Enfin, pour communiquer envoyer des données dans l'arduino :

SP1.Write(TextBox1.Text & HScrollBar1.Value)

Où textbox1 représente la lettre (entre a et l qui correspond à un servo) et le scrollbar1 qui peut prendre pour valeur 1000 à 2000. Ce chiffre représente le pwm.

Par exemple SP1.Write(a1300) envoi sur la 1° patte 1300ms de pwm. Arduino récupère cette trame dans Buffer qui accepte 5 octets. En fait il y en a 6 de 0 à 5 mais le dernier correspond à un caractère non exploiter pour le programme (retour à la ligne ou espace, je ne me rappelle plus).

Publié dans Arduino

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article