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.

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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************************** | |
* 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