samedi 7 janvier 2012

Véhicule piloté au moyen d'un joystick

Ce projet consistait à brancher un joystick à ma base de robot de façon à contrôler son mouvement.

Il s'agissait de ma première expérience avec un joystick.  Rien de bien compliqué:  il s'agit simplement de deux potentiomètres actionnés par une même manette.  L'inclinaison de la manette dans une direction (gauche ou droite) contrôle un premier potentiomètre, alors que son inclinaison dans l'autre direction (avant ou arrière) contrôle un deuxième potentiomètre.  Lorsque le joystick est à sa position médiane, les deux potentiomètres ont la moitié de leur résistance maximale.

J'avais acheté un petit joystick (genre PlayStation 2) sur eBay.  Pour que ce soit plus pratique je l'ai installé sur une carte perforée, et pour acheminer le signal jusqu'à l'Arduino (qui se trouve sur la base de robot), j'ai choisi un câble de téléphone résidentiel d'environ 1 mètre (le câble comporte 4 conducteurs, ce qui répondait parfaitement à mes besoins).  Ce n'est pas tout à fait aussi pratique qu'un véhicule téléguidé, puisqu'il faut constamment le suivre en évitant que le câble s'emmêle...


Mon programme consiste donc à faire tourner les moteurs en marche avant lorsque la manette est poussée vers l'avant (avec une vitesse maximale quand la manette est poussée à fond), à faire tourner les moteurs en marche arrière lorsque la manette est tirée vers l'arrière. Pour faire tourner le véhicule, il s'agit évidemment pousser la manette vers la gauche ou vers la droite:  les roues tournent alors à des vitesses différentes de façon à obliger le véhicule à tourner dans la direction désirée.

/**************************************************************
* Contrôle d'un véhicule "smart car" au moyen d'un joystick
* 3-7 janvier 2012
*
* https://electroniqueamateur.blogspot.com/2012/01/vehicule-pilote-au-moyen-dun-joystick.html
*
*************************************************************/
#define motorPin1a 3 // Marche avant du premier moteur
#define motorPin1b 4 // Marche arrière du premier moteur
#define speedPin1 9 // L293D enable pin pour le premier moteur
#define motorPin2a 5 // Marche avant du deuxième moteur
#define motorPin2b 6 // Marche arrière du deuxième moteur
#define speedPin2 10 // L293D enable pin pour le deuxième moteur
#define JoyStickPin1 1 //analog 1
#define JoyStickPin2 2 //analog 2
int Mspeed= 0;
int Mspeed1 = 0;
int Mspeed2 = 0;
unsigned long time;
void setup() {
// réglage des broches à output
pinMode(motorPin1a, OUTPUT);
pinMode(motorPin1b, OUTPUT);
pinMode(speedPin1, OUTPUT);
pinMode(motorPin2a, OUTPUT);
pinMode(motorPin2b, OUTPUT);
pinMode(speedPin2, OUTPUT);
}
void loop() {
Mspeed1 = (analogRead(JoyStickPin1)-511)/2;
Mspeed1 = Mspeed1 - (analogRead(JoyStickPin2)-511)/2;
if (Mspeed1 > 255) {
Mspeed1 = 255;
}
if (Mspeed1 < -255) {
Mspeed1 = -255;
}
Mspeed2 = (analogRead(JoyStickPin1)-511)/2;
Mspeed2 = Mspeed2 + (analogRead(JoyStickPin2)-511)/2;
if (Mspeed2 > 255) {
Mspeed2 = 255;
}
if (Mspeed2 < -255) {
Mspeed2 = -255;
}
if (Mspeed1 > 0) // donc marche arrière
{
analogWrite(speedPin1, abs(Mspeed1));
digitalWrite(motorPin1a, LOW);
digitalWrite(motorPin1b, HIGH);
}
else { // donc marche avant (ou repos)
analogWrite(speedPin1, abs(Mspeed1));
digitalWrite(motorPin1a, HIGH);
digitalWrite(motorPin1b, LOW);
}
if (Mspeed2 > 0) // donc marche arrière
{
analogWrite(speedPin2, abs(Mspeed2));
digitalWrite(motorPin2a, LOW);
digitalWrite(motorPin2b, HIGH);
}
else // donc marche avant (ou repos)
{
analogWrite(speedPin2, abs(Mspeed2));
digitalWrite(motorPin2a, HIGH);
digitalWrite(motorPin2b, LOW);
}
}


Mise à jour (août 2012):  le véhicule est maintenant téléguidé par ondes radio (sans fil).


Aucun commentaire:

Enregistrer un commentaire