samedi 22 mars 2014

Arduino et souris PS/2

Lire une souris d'ordinateur avec un Arduino, c'est tout à fait possible. Mais attention:  il faut que ce soit une souris de type PS/2:  il s'agit des anciens modèles munis d'un connecteur de forme circulaire à six pins:

Connecteur PS/2

Numéro des broches du connecteur mâle
Le schéma ci-contre montre le brochage du connecteur PS/2 mâle de la souris.

Pin 1:  Données (data) → Arduino 5
Pin 2:  Pas utilisée
Pin 3:  GND → Arduino GND
Pin 4:  Vcc → Arduino 5V
Pin 5:  Horloge (clock) → Arduino 6
Pin 6:  Pas utilisée

Ne disposant pas d'un connecteur PS/2 femelle, j'ai simplement coupé le câble de la souris pour me débarrasser de ce connecteur mâle et brancher les 4 fils conducteurs directement aux entrées/sorties de l'Arduino.  

La souris branchée à l'Arduino

Ensuite on installe la bibliothèque PS2 mais attention:  à moins que vous utilisiez une version vraiment très ancienne du logiciel (IDE) Arduino, vous devrez modifier le fichier "ps2.h" de façon à remplacer la mention "WProgram.h" par la mention "Arduino.h".


Le sketch ci-dessous est inspiré de l'exemple qui accompagne la bibliothèque.   La position de la souris (coordonnées x et y) ainsi que l'état de ses deux boutons s'affiche dans le moniteur série (il ne semble pas possible de détecter une rotation de la molette, toutefois).


/**********************************************************
*
* Affiche la position et l'état des boutons d'une souris PS/2
* branchée à l'Arduino.
* Nécessite la biblothèque ps2 disponible ici:
* http://playground.arduino.cc/ComponentLib/Ps2mouse#.Uy4yTajozE1
*
* http://electroniqueamateur.blogspot.com/2014/03/arduino-et-souris-ps2.html
*
************************************************************/
#include <ps2.h>
// Connexions: Data: pin 5 Clock: pin 6
PS2 mouse(6, 5);
// variables globales: la position de la souris
int positionx = 0;
int positiony = 0;
// Initialisation de la souris.
void mouse_init()
{
mouse.write(0xff); // reset
mouse.read(); // ack byte
mouse.read(); // blank
mouse.read(); // blank
mouse.write(0xf0); // remote mode
mouse.read(); // ack
}
void setup()
{
Serial.begin(9600); // pour l'affichage au moniteur serie
mouse_init();
}
void loop()
{
char mstat;
char mx;
char my;
// échange de données avec la souris
mouse.write(0xeb); // on demande à la souris de nous envoyer les données
mouse.read(); // ignore ack
mstat = mouse.read(); // état de la souris
mx = mouse.read(); // variation de x
my = mouse.read(); // variation de y
// calcul de la position absolue
positionx = positionx + mx;
positiony = positiony + my;
// affichage des résultats dans le moniteur série
Serial.print("X= ");
Serial.print(positionx, DEC);
Serial.print(" Y= ");
Serial.print(positiony, DEC);
if ( mstat & (1 << 0)) // si le bouton gauche est enfoncé
{
Serial.print(" Clic gauche!");
}
if ( mstat & (1 << 1)) // si le bouton droit est enfoncé
{
Serial.print(" Clic droit!");
}
Serial.println();
}
view raw souris_ps2.ino hosted with ❤ by GitHub

Référence:  Arduino Playground

Yves Pelletier (Twitter:  @ElectroAmateur)

1 commentaire:

  1. J'ai un petit problème.
    Je souhaiterait utiliser une souris ps2 avec mon arduino
    mais elle n'a plus son cable, je ne parvient pas à différencier
    les 4 broches de la souris. Aurait-tu la solution ?

    RépondreSupprimer