Bonjour à tous,
Après une petite pause pour m'occuper d'autres projets terminés, je poste ici les extraits et le principe des codes adoptés pour l'échange Arduino / VB.net.
Ca peut être réutilisé pour d'autres applications.
Le principe est simple. Un programme sous VB.net envoie une trame sur le port série. Cette trame correspond à la valeur pwm que doit prendre le servo ciblé. Le ciblage du servo est désigné par une lettre allant de 'a' à 'l' afin d'atteindre l'un des 12 servos du robot.
La trame a donc la forme suivante 'a1250'. Où 'a' est la lettre désignant un des douze servos et 1250 est le pwm en millisecondes.
Sous VB.net, le code peut être simple. Une form, un textbox pour la lettre et un scrollbar pour le pwm. On insère l'objet SerialPort (SP1 pour l'exemple qui suit).
On écrit dans le serialport la trame à chaque action sur le scrollbar, par exemple d1300 pour le 4° servo et 1300ms.
Ne pas oublier d'importer ce qu'il faut dans la form pour utiliser le seriaport.
à placer en tête de ficheir VB.net :
Imports System.IO.Ports
Imports System.Diagnostics
A paramétrer dans les propriétés du SP1 ou à écrire dans le load de la form.
SP1.Close()
SP1.PortName = "com34" ' à adapter pour utiliser le port connecté à la carte arduino
SP1.BaudRate = 4800 '9600, etc.
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
Envoi de la trame à cahque évolution du scrollbar :
Private Sub VS_H_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles VS_H.Scroll
If SP1.IsOpen = True Then
SP1.Write(Lbl_H1.Text & VS_H.Value)
System.Threading.Thread.Sleep(20) ' pause nécessaire pour éviter saturation en bougeant trop rapidement le scrollbar
End If
End Sub
Coté Arduino, voici le code complet qui est court et qui permet juste d'animer tel ou tel servo. Voici le minimum pour commencer et faire évoluer le programme :
#include <Wire.h>
#define SD21 0x61 //SD21 I2C Address
char Buffer[6];
char BufferPwm[5];
unsigned int OutPwm=1500;
byte Patte = 4; // Patte 1 femur par defaut
void setup()
{
Wire.begin();
Serial.begin(4800); //9600
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);
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(); // communication avec la carte SD21 de pilotage des servos, cf. data de la SD21
Wire.beginTransmission(SD21); Wire.write(Patte+1); Wire.write(highByte(OutPwm)); Wire.endTransmission();
}
}
}
En espérant que cela puisse aider qqu un jour pour un autre projet.
@++ ludovic