dimanche 14 mai 2023

Joystick pour accessoires

 Les télécommandes sont toujours utiles pour des applications très variées en modélisme (ex: la commande de portique). Nous nous sommes intéressés à une télécommande de type Joystick. Certes, il en existe toute faite et qui fonctionnent très bien mais nous allons voir comment en faire une à partir d'éléments Arduino.


Le Principe:

Le montage sera très simple puisqu'il consiste à assembler un module Arduino Méga et le module Joystick Shield. A noter que l'on peut aussi utiliser un Arduino Uno. Peu de chance de se tromper lorsque l'on assemble les deux modules mais pour éviter toute mauvaise surprise une petite astuce: les alimentations 5V et 3,3V sont repérées sur le module Joystick Shield (en bas à gauche sur la photo ci-après) et aussi sur les connecteurs de l'Arduino. Il suffit de les faire coïncider (alimentation externe et prise USB à gauche sur la photo ci-après). Bien mettre l'interrupteur en bas à gauche du module Joystick Shield sur 3,3V.

L'ensemble des modules est alimenté par l'Arduino (prise externe ou par USB). Une LED témoin indique que le module Joystick Shield est sous tension.

Vue de l'ensemble Arduino Méga et du Joystick Shield

Pour notre exemple, nous avons câblé deux servo-moteurs (deux modèles différents) sur les sorties D9 et D10 du Joystick Shield (en haut à gauche sur la photo). Les alimentations 3,3V et GND pour les servos sont prises sur le même connecteur du module Shield.

Vue du montage avec les deux servos

Il nous reste plus qu'à écrire le petit programme pour piloter ces servos.

Le code:

Il faut utiliser la librairie servo pour initialiser et commander ceux-ci. Les boutons (de couleur jaune et bleu) sont définis en fonctions des directions (UP = HAUT, DOWN = BAS, LEFT = GAUCHE, RIGHT = DROITE). A noter qu'il y a deux boutons E et F de réserve (en noir à gauche de boutons de couleur). Les axes X et Y du Joystick sont les entrées analogiques A0 et A1 (défini par câblage). La fonction map est importante car elle adapte l'échelle de conversion des valeurs analogique en numérique pour assurer un contrôle adapté.

[code]
#include <Servo.h>

// define global variables for analog pins.
Servo myservo_x;
Servo myservo_y;
int value_x = 0;
int value_y = 0;
// X values will be read from pin 0 and Y from pin 1

#define PIN_ANALOG_X A0
#define PIN_ANALOG_Y A1
#define BUTTON_UP 2
#define BUTTON_RIGHT 3
#define BUTTON_DOWN 4
#define BUTTON_LEFT 5
#define BUTTON_E 6
#define BUTTON_F 7
#define DELAY 500
#define PIN_SERVO_X 9
#define PIN_SERVO_Y 10

void setup() {
 // Start serial because we will observe values at serial monitor
 Serial.begin(9600);
 // to enable pull up resistors first write pin mode
 // and then make that pin HIGH

 pinMode(BUTTON_UP, INPUT);
 digitalWrite(BUTTON_UP, HIGH);
 pinMode(BUTTON_RIGHT, INPUT);
 digitalWrite(BUTTON_RIGHT, HIGH);
 pinMode(BUTTON_DOWN, INPUT);
 digitalWrite(BUTTON_DOWN, HIGH);
 pinMode(BUTTON_LEFT, INPUT);
 digitalWrite(BUTTON_LEFT, HIGH);
 pinMode(BUTTON_E, INPUT);
 digitalWrite(BUTTON_E, HIGH);
 pinMode(BUTTON_F, INPUT);
 digitalWrite(BUTTON_F, HIGH);

 myservo_x.attach(PIN_SERVO_X);
 myservo_x.write(180);
 delay (1500);
 myservo_y.write(0);
 myservo_y.attach(PIN_SERVO_Y);
 myservo_y.write(180);
 delay (1500);
 myservo_y.write(0);
}

void loop() {
 // Print x axis values
 Serial.print("x: ");
 value_x = analogRead(PIN_ANALOG_X);
 value_x = map(value_x ,0, 1023, 0, 180);
 Serial.println(value_x);
 myservo_x.write(value_x);
 delay(DELAY);
 // Print y axis values
 Serial.print("y: ");
 value_y = analogRead(PIN_ANALOG_Y);
 value_y = map(value_y ,0, 1023, 0, 180);
 Serial.println(value_y);
 myservo_y.write(value_y);
 // Some delay to clearly observe your values on serial monitor.
 if(digitalRead(BUTTON_UP) == LOW) {
   Serial.println("Button A is pressed");
   myservo_y.write(180);
   delay(DELAY);
  }
  else if(digitalRead(BUTTON_RIGHT) == LOW) {
    Serial.println("Button B is pressed");
    myservo_x.write(180);
    delay(DELAY);
  }
  else if(digitalRead(BUTTON_DOWN) == LOW) {
   Serial.println("Button C is pressed");
   myservo_y.write(0);
   delay(DELAY);
  }
  else if(digitalRead(BUTTON_LEFT) == LOW) {
   Serial.println("Button D is pressed");
   myservo_y.write(0);
   delay(DELAY);
 }
}
[/code]

Vous pouvez observer les valeurs avec la console série.

Une petite vidéo pour illustrer :


A vous de jouer!