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).



Référence:  Arduino Playground

Yves Pelletier (Twitter:  @ElectroAmateur)

jeudi 20 mars 2014

Lecture de capteurs analogiques sur le Raspberry Pi

Article mis à jour le 2 mars 2020: modification au script, qui ne fonctionnait plus convenablement.

Lors d'une récente rubrique, nous avons appris comment utiliser les broches GPIO du Raspberry Pi pour lire des signaux numériques.  Toutefois, contrairement à l'Arduino, le Raspberry Pi ne comporte pas la moindre entrée analogique.  Et pourtant, lire un signal analogique (provenant d'un potentiomètre, d'une photorésistance, d'une thermistance, etc.), ça peut être drôlement pratique...

Évidemment, il existe une solution à ce problème: l'utilisation d'un convertisseur numérique-analogique externe (ou ADC, pour analog to digital converter).  J'ai utilisé le MCP3008 de Microchip, qui est un ADC à 8 canaux, ce qui signifie que vous pouvez y brancher pas moins de 8 capteurs analogiques simultanément (si vos besoins sont plus modestes, vous pouvez vous rabattre sur le MCP3004, qui ne comporte que 4 canaux).

Le rôle du MCP3008 sera donc de transmettre au Raspberry Pi  un signal numérique entre 0 et 1023 qui sera la traduction du signal analogique (qui, lui, peut prendre n'importe quelle valeur située entre 0 et 3,3 V).

Interface SPI matérielle ou logicielle?

Puisque que le MCP3008 utilise le protocole SPI, nous avons le choix entre une approche matérielle (hardware SPI) ou logicielle (bit banged SPI).  L'approche logicielle consiste à gérer nous-mêmes le signal d'horloge et le chip select  à l'intérieur de notre script.  C'est un peu plus lent que le "hardware SPI", et ça nécessite des scripts un peu plus complexes.  Par contre, on peut utiliser n'importe quelle broche GPIO.  Pour un exemple de ce type, vous pouvez consulter l'adaptation que Dominique Meurisse de MC Hobby a faite du tutoriel d'Adafruit.

J'ai plutôt opté pour l'utilisation de l'interface SPI matérielle du Raspberry Pi:   ça facilite le codage, mais nous sommes obligés d'utiliser les broches GPIO qui sont dédiées au SPI (CE0, CE1, MOSI, MISO et SCLK):


Activation du protocole SPI

Par défaut, le protocole SPI est désactivé sur votre Raspberry Pi. Pour l'activer, vous devez ouvrir "Configuration du Raspberry Pi", dans la section "Préférences" du menu.


Dans l'onglet "Interfaces", vous activer "SPI" et vous redémarrez votre Raspberry Pi.




Le circuit

Le schéma ci-contre, issu de la fiche technique, montre le brochage du MCP3008.  Les 8 entrées analogiques sont alignées du côté gauche. Le côté droit comporte l'alimentation (VDD), la tension de référence (VREF), la masse du signal analogique (AGND) et celle du signal numérique (DGND), l'horloge (CLK), la sortie des données numériques vers le Raspberry Pi (DOUT) et l'entrée des données numériques en provenance du Raspberry Pi (DIN), le "chip select" (CS/SHDN) qui doit être au niveau logique bas pour que l'ADC soit actif.

Comme d'habitude, si votre capteur analogique est une résistance variable, vous la placez en série avec une résistance fixe afin que le signal acheminé à l'entrée analogique soit une tension variable:

Puisque je voulais seulement explorer les possibilités de mesurer des valeurs analogiques, j'ai utilisé deux potentiomètres reliés respectivement au canal 0 (pin 1) et au canal 1 (pin 2) du MCP3008 (c'est plus simple de tourner le bouton d'un potentiomètre que de changer la température dans l'environnement d'une thermistance...).


Les connexions entre le MCP3008 et le Raspberry Pi sont les suivantes:

MCP3008 VDD (broche 16)   →  Raspberry 3,3 V
MCP3008 VREF (broche5)   →  Raspberry 3,3 V
MCP3008 AGND (broche 14)  →;  Raspberry GND
MCP3008 CLK (broche 13)   →  Raspberry SCLK
MCP3008 DOUT (broche 12)   →  Raspberry MISO
MCP3008 DIN (broche 11)   →  Raspberry MOSI
MCP3008 CS (broche 10)   →  Raspberry CE0
MCP3008 DGND (broche 9)  →   Raspberry GND

Le code

Comme vous pouvez le constater, la routine ReadChannel se charge, en trois lignes de code, de toute la communication entre le Raspberry Pi et le MCP3008.   À partir du moment où vous l'incluez dans votre script, le reste n'est guère plus compliqué qu'utiliser AnalogRead avec Arduino.



Référence

Je n'ai pas trouvé ça tout seul!   Un article du blog Raspberry-Spy m'a été très utile.

Yves Pelletier (Twitter:  @ElectroAmateur)

vendredi 14 mars 2014

Transformation d'un vieil écran d'ordinateur portable en moniteur HDMI-VGA-DVI

D'une part, j'avais encore ce vieil ordinateur portable (un Powerbook G3 Wallstreet) qui avait cessé de fonctionner il y a quelques années:  je trouvais bien dommage que son écran LCD ne serve plus à rien.

D'autre part, j'avais besoin d'un moniteur HDMI  pour mon Raspberry Pi:  de préférence pas trop cher, et pas trop encombrant...de la taille de mon écran d'ordinateur portable, par exemple...

J'ai donc transformé l'écran LCD du vieil ordinateur portable en un moniteur muni d'une entrée VGA, d'une entrée DVI et d'une entrée HDMI:  je peux donc y brancher mon Raspberry Pi, ou n'importe quel autre ordinateur.

J'aurais bien aimé vous impressionner en vous racontant comment j'ai réussi cet exploit en contrôlant le moniteur au moyen d'un Arduino judicieusement programmé et d'une poignée de composants passifs, mais non, c'est beaucoup moins héroïque que ça:  je me suis procuré un circuit tout fait.

On peut effectivement trouver sur eBay des kits nommés "HDMI+VGA+DVI+Audio LCD controller board for lcd panel DIY LCD monitor" pour la somme d'environ $40 (30 euros), incluant les frais de port (il est possible d'acheter une version uniquement VGA  pour beaucoup moins cher, mais je tenais au HDMI pour y brancher facilement mon Raspberry Pi).  J'ai acheté le mien du vendeur chinatobby2011.

Le kit contient:

1)   un contrôleur d'écran LCD (modèle M.NT68676.2A), qui interprétera les signaux HDMI, DVI ou VGA qui proviennent de l'ordinateur:



2) un onduleur (inverter) qui est responsable d'alimenter le rétroéclairage:                                                                                                                                         


3)  un module comportant 5 boutons poussoir (pour que l'utilisateur puisse contrôler le contraste, la luminosité, etc.)


...et tout le câblage nécessaire pour relier tout ça à votre écran LCD.

Vous devrez vous-mêmes fournir l'alimentation de 12 V et le câble HDMI, DVI ou VGA qui servira à relier l'ordinateur au moniteur.

Au moment où vous commandez le contrôleur, vous devez spécifier au vendeur le numéro de modèle de votre écran LCD, qui est indiqué sur une étiquette située à l'arrière de l'écran.  Pour accéder à cette étiquette, vous devez démonter le cadre qui supporte l'écran.  Dans mon cas, il s'agissait de retirer quelques vis qui étaient dissimulées par des capuchons de caoutchouc.  Une fois l'écran sorti de son cadre, j'ai pu constater qu'il s'agissait d'un Samsung LT141X2-124.

Deux semaines plus tard, le kit était chez moi (c'est drôlement rapide pour une commande en provenance de Chine, habituellement c'est le double).  Comme il fallait s'y attendre, on ne m'a pas fourni le moindre soupçon de manuel d'instruction... Mais heureusement, les trois cartes étaient déjà reliées entre elles.  Il ne me restait donc qu'à brancher l'onduleur et le connecteur LVDS (low voltage differential signaling):  aucune soudure n'est nécessaire.

L'onduleur était déjà muni d'une paire de fils (un rose et un blanc):  je les ai retirés et j'ai branché ceux du moniteur au même endroit, en respectant les couleurs.

Pour le connecteur LVDS, c'était un brin plus délicat, car rien n'indiquait dans quel sens le connecteur devait être inséré.  Alors j'ai essayé un peu au hasard, en espérant qu'en cas d'erreur il ne se produirait rien de trop grave (c'était le bon sens, donc j'ignore toujours ce qui serait arrivé si j'avais fait le mauvais choix).

Puis il restait à trouver une alimentation de 12 volts (centre positif):  j'ai pris une alimentation ATX d'ordinateur en attendant de trouver un adapteur mural moins encombrant.  J'ai mesuré une intensité de courant d'environ 750 mA pendant le fonctionnement du moniteur, je vais donc partir à la recherche d'une alimentation d'au moins 1 A.

On branche le Raspberry Pi au moyen d'un câble HDMI, et voilà!  Ça marche!


Reste à faire quelques réglages pour optimiser la qualité de l'image au moyen des boutons poussoirs qui viennent avec le contrôleur.

Est-ce que ça vaut le coup?  À vous de voir:  30 euros, c'est moins cher qu'un moniteur neuf et vous avez la satisfaction d'avoir prolongé la vie utile de votre écran LCD.  Puisque le circuit est déjà tout fait à l'avance, l'aspect DIY du projet se limite essentiellement à la construction  d'un cadre/support pour votre écran (moi, j'ai remis l'écran dans son cadre initial (celui de l'ordinateur portable) et j'ai vissé les cartes à l'arrière.  Il me reste à lui ajouter un petit machin à l'arrière pour qu'il tienne debout tout seul.  L'aspect final ne sera ni professionnel, ni esthétique...

Yves Pelletier (Twitter:  @ElectroAmateur)