Mercredi, avril 6 2011

Etiquette électronique, partie 1

Aujourd’hui nous allons nous pencher sur un petit bidule électronique qui ne demande qu’à se faire ouvrir en deux pour révéler ses entrailles. Voici le client:C’est un « pricer », une étiquette électronique comme on trouve partout désormais. Pour vous en procurer un: démerdez-vous, je ne vais pas vous faire un dessin non plus! N’allez pas en piquer dans un magasin non plus, mais si on réfléchit c’est assez facile d’en trouver un…

Première partie: comment ça fonctionne. Tout ce qui suit est basé sur des documents glanés ici et là sur le site du fabricant (tapez « pricer » sur google), mais en gros ces étiquettes électroniques sont contrôlées par IR, à distance donc. D’après ce que j’ai compris de la démo du commercial neurasthénique de chez Pricer, une interface Web couplée à une grappe d’émetteurs IR permet de mettre à jour les étiquettes à distance, instantanément et de façon groupée à partir d’un unique poste de contrôle. C’est réellement intéressant comme système!

Au niveau de l’aspect extérieur, nous avons en façade un écran LCD, un capteur IR sur la droite. Derrière on aperçoit 3 piles 2023 3V…ca peut toujours servir!

Maintenant, les entrailles. Ca y est, vous avez votre Pricer? Alors le TP d’aujourd’hui va consister à ouvrir le boîtier pour vois comment hacker le tout. Perso j’y suis allé au Dremel, car je n’ai pas l’impression qu’il soit possible d’ouvrir le boîtier sans y aller comme une brute. Allez-y doucement, c’est pas fait pour être ouvert alors ca risque d’être un peu tendu!

Une fois ouvert, voici ce qui reste:


Rien ne vous choque à cet instant?

non?

Pourtant l’écran est toujours allumé, alors que les piles ont été enlevées! Intéressant, non? Ca s’explique simplement par le fait que cet écran est en fait un e-paper, ses pixels sont en fait de petites billes blanches d’un côté, noires de l’autre, que l’on fait pivoter électriquement. De ce fait, les pixels gardent leur étant même lorsqu’on coupe le jus. Excellent choix, avec 3 piles bouton on peut du coup obtenir une longévité hors du commun, car cet écran ne consomme de l’énergie que lorsque l’on change l’affichage!

Passons à la suite, examinons le circuit:

Ahah, voilà qui est intéressant! Trois puces, dont une noyée dans la résine. Rien à faire pour celle-là, concentrons-nous sur les deux autres. Si vous dégainez votre loupe, vous verrez que la première est un ATMEL ATMEGA16L, la seconde un ATMEL952 25128AN.

Deux recherches sur google et deux datasheets plus tard (ici et ici), voici ce qu’on peut apprendre:
- la première (le 16L) est un micro-contrôleur, de la même famille que ceux présents sur les Arduinos
- la seconde (la 25128) est une EEPROM de 128k contrôlable par SPI.

Que du bonheur tout ca! Et si nous allions voir ce qu’elle contient cette EEPROM? Jetons un coup d’oeil à la datasheet:

Notre puce est un 8-lead SOIC (8-lead pour 8 pattes, SOIC pour Small Outline Integrated Circuit). Maintenant le détail des pattes:
- /CS: Chip Select. Si cette entrée est à 0, alors la puce est sélectionnée. Ceci permet d’utiliser plusieurs puces de mémoire. Pour de plus amples explications: Wikipedia, page sur le SPI.
- SO: Serial Out, là où vont sortir les données
- /WP: Write Protect, pour mettre la puce en lecture-seule
- GND: la masse
- SI: Serial Input, là où l’on va injecter les données
- SCK: l’horloge du SPI. Là encore -> Wikipedia.
- /HOLD: pour suspendre les communications.
- VCC: +5V.

Maintenant, dégainez votre meilleur ami, l’Arduino.

Après quelques recherches, j’ai trouvé cette page où est expliqué en détail comment communiquer avec une EEPROM SPI et, suprême coup de bol, tout est expliqué en détail, même le code à envoyer à l’arduino. On gagne du temps! Pour plus de détails, rendez-vous à la page 11 de la datasheet où se trouvent les datagrammes permettant de lire/écrire la mémoire. En gros on bascule /CS, on envoie l’instruction (READ ou WRITE), l’adresse, puis on lis/écrit les données. Pratique, la puce continue à envoyer des données (en mode LECTURE) ou à attendre de nouvelles données tant qu’on n’a pas rebasculé /CS. Même pas besoin d’incrémenter l’adresse!

Enfin bon, c’est beau tout ca, mais va falloir y accéder à la puce, non?!

C’est là qu’on dégaine notre deuxième meilleur pote, le fer à souder. Je recommande vivement la troisième main, sans quoi vous allez vous arracher les cheveux. Utilisez aussi du fil mono-brin, c’est beaucoup plus facile à mettre en place.

On connecte le tout à l’arduino:

Et hop, il n’y à plus qu’à prier!

J’ai un peu modifié le code donné sur le site Arduino pour:
- ne pas écrire par dessus les données qu’on veut lire, bordel de merde!
- mettre les données lues en forme

Ca donne ca:

#define DATAOUT 11//MOSI
#define DATAIN  12//MISO
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss

//opcodes
#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2

byte eeprom_output_data;
byte eeprom_input_data=0;
byte clr;
int address=0;

char spi_transfer(volatile char data) {
 SPDR = data;                    // Start the transmission
 while (!(SPSR & (1< return SPDR;   // return the received byte
}

void setup() {
 Serial.begin(9600);

 pinMode(DATAOUT, OUTPUT);
 pinMode(DATAIN, INPUT);
 pinMode(SPICLOCK,OUTPUT);
 pinMode(SLAVESELECT,OUTPUT);
 digitalWrite(SLAVESELECT,HIGH); //disable device
}

byte read_eeprom(int EEPROM_address) {
 //READ EEPROM
 int data;
 digitalWrite(SLAVESELECT,LOW);
 spi_transfer(READ); //transmit read opcode
 spi_transfer((char)(EEPROM_address>>8));   //send MSByte address first
 spi_transfer((char)(EEPROM_address));      //send LSByte address
 data = spi_transfer(0xFF); //get data byte
 digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
 return data;
}

void loop() {
 eeprom_output_data = read_eeprom(address);
 //Serial.print("At 0x");
 //Serial.print(address, HEX);
 //Serial.print(" = ");
 Serial.print("0x");
 Serial.print(eeprom_output_data,HEX);
 address++;
 //when finished dump, enter infinite loop
 if (address == 0x4000) {
 Serial.println("};");
 while(1);
 }
 Serial.print(", ");
 if (!(address%20)) Serial.println("");
 //delay(50); //pause for readability
}

Si tout fonctionne bien:
Petite précision: la valeur 0×4000 correspond à la taille de notre EEPROM, soit 128ko.

Voilà, c’est terminé pour cette première partie. Dans la suivante si tout se passe bien (comprendre: « si j’y arrive! »), nous verrons comment est structuré le contenu de cette petite ROM, comment le modifier etc…

Lundi, février 28 2011

Arduino &amp; Joystick

Tonight we’ll learn how to use a joystick with an arduino. This is the kind of device that’s extremely simple to use and can be of great service. With such equipment, you can control a robot, a car, an airplane or even your recently robotized grandmother…

The material:
- a joystick. I got one from home Adafruit for $5. Afterwards, if you get a Playstation joystick, you will find two almost identical inside.
- an arduino, regardless of which
- Done!

A little theory:
What is a joystick? Nothing more than two potentiometers: one for the front/rear axis, one for the left/right axis.

The schematic:
On the joystick you will see several indications:
- GND:  to the ground
- L/R+: +5V (or other, see the datasheet with your joystick). This is feeding left/right pot
- L/R: will go on an analog input on the arduino
Repeat the last two steps for the U/D+ and U/D pins.

Once everything is wired properly, you should get something like this:

Now the source code. Here again simple, but it’s only a base:

[cpp]
void setup() {
Serial.begin(9600);
}

void loop() {
int lr = analogRead(A0);
int ud = analogRead(A1);
Serial.print("lr=");
Serial.print(lr, DEC);
Serial.print("/");
Serial.print("ud=");
Serial.print(ud, DEC);
Serial.println("");
}
[/cpp]

A short capture of the serial monitor

capture

Mercredi, février 23 2011

Arduino et Joystick

Ce soir, nous allons apprendre comment utiliser un joystick avec un arduino. C’est le genre de périphérique extrêmement simple à utiliser et qui peut rendre de grands services. Avec ce genre de matériel, vous pourrez commander un robot, une voiture, un avion, votre grand-mère récemment robotisée…

Le matériel:
- un joystick. Perso j’utilise celui de chez Adafruit pour 5$. Après, si vous récupérez une manette de playstation, vous en trouverez deux quasiment identiques à l’intérieur.
- un arduino, peu importe lequel
- c’est tout!

Un peu de théorie:
En quoi consiste un joystick? Ni plus ni moins que deux potentiomètres: un pour l’axe avant/arrière, un pour l’axe gauche/droite.

Le schéma:
Sur le joystick vous verrez plusieurs indications:
- GND: ira à la masse
- L/R+ : +5V (ou autre, à voir avec la datasheet de votre joystick). Ceci est l’alimentation du potard gauche/droite
- L/R : ira sur une entrée analogique sur l’arduino
Répétez les deux derniers points pour les broches U/D+ et U/D.

Une fois le tout câblé correctement, vous devriez obtenir quelque chose comme ceci:

Maintenant, les source. Simples, là aussi, mais ce n’est qu’une base:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int lr = analogRead(A0);
  int ud = analogRead(A1);
  Serial.print("lr=");
  Serial.print(lr, DEC);
  Serial.print("/");
  Serial.print("ud=");
  Serial.print(ud, DEC);
  Serial.println("");
}

Une petite vidéo du Serial Monitor:

capture

Valà, vous voilà savant!

Lundi, décembre 21 2009

Librairie Arduino pour afficheur Oled : Oled4d

Voici une librairie libre de gestion d'afficheur OLED de la société 4D Systems pour Arduino.

Comme leur nom l'indique très bien, ils utilisent la technologie OLED avec tous les avantages de cette technologie : pas besoin d'un rétroéclairage, ils ont un angle de vue de 180°, bonne consommation, très bon contraste, vous pouvez les trouver entre autres chez Lextronic ou encore chez Sparkfun.

Le jeu d'instructions n'est pas toujours très logique mais est assez complet, le principal défaut de ces afficheurs est le prix, à 65€ l'unité, j'imagine mal comment espérer faire de la petite série...

Ces afficheurs sont pilotables directement par le biais d'une connection série dans lequel on envoie directement des commandes d'assez hauts niveaux :

  • Set Background Color
  • Put Pixel
  • Erase Screen
  • Draw Rectangle
  • Place String of ASCII Text
  • ...

Ils disposent également d'un port microSD permettant ainsi de charger des images ou encore des bouts de programmes, attention cependant, car n'espérez pas mettre des images jpg dans la microSD ou autre et les afficher comme ça, d'un coup, ça ne fonctionnera pas, tout d'abord, car le chip de 4D ne gère pas les images compressées mais uniquement des champs de bits et surtout car il n'y a aucune gestion de FAT gérée par le controleur, ainsi, il est possible d'accéder au contenu de la microSD depuis votre programme mais uniquement en brut : à nous de gérer la couche du système de fichiers...

Tester la libraire

Voici la marche à suivre pour tester cette librairie avec Arduino (la librairie peut parfaitement fonctionner hors du projet Arduino...) :

  1. Créer un dossier Oled4d dans le dossier Libraries de votre installation Arduino et copiez dedans le fichier Oled4d.h.
  2. Créez un nouveau projet Arduino et copiez le contenu du fichier oled4d.pde dedans.
  3. Compilez le source, envoyez dans la cible et voilà, vous devriez avoir quelque chose de ce genre s'afficher :

Oui, il s'agit bien de Tux ! ;)

Comment ça fonctionne ?

Voici un petit bout de code :

// Créer l'objet en interface série logiciel
Oled4dSoft oled = Oled4dSoft(serial, 8);

// Pour utiliser l'uart « hardware », procéder ainsi :
//Oled4dHard oled = Oled4dHard(Serial, OLED_RESET_PIN);

// Initialise l'écran
oled.init();

// Efface l'écran
oled.clear();

// Dessine un cercle
oled.drawCircle(64, 64, 20, RGB(255, 255, 0));

// Affiche du texte
oled.drawText(1, 3, SMALL, GREEN, "Hello world !");

Voilà, je pense que l'exemple est assez explicite et logique...

Vour remarquerez qu'il est possible de passer par l'uart intégré à l'Atmel ou de passer par l'uart logiciel avec la libraire NewSoftSerial (cette librairie dispose de fonctions avancées et est bien supérieure à la librairie d'uart fourni par défaut dans le projet Arduino).

Démo

Voici une petite démo affichant en vrac des lignes, des triangles, des cercles, des polygones, des rectangles...
La vidéo reflète assez mal les couleurs de l'écran qui sont bien vives en réel.

Écran Oled de 4D System piloté par Arduino

Futures évolutions

Actuellement, cette librairie supporte uniquement les instructions standards (General Command Set), les autres (Extended Command Set), qui permettent entre autre un accès au contenu de la microsd, ne sont pas encore gérées mais le plus gros du travail est fait...

Téléchargement

Cette librairie est mise à disposition sous license GPL.
Vous pouvez télécharger la toute dernière version de cette librairie depuis mon compte GitHub à l'adresse suivante : http://github.com/hugokernel/Oled4D

Je mettrai à jour également la page sur le wiki : http://www.digitalspirit.org/wiki/projets/oled4d.

Vendredi, août 21 2009

Prochaine projet DIY : Table a matrice de LED

Ca faisait quelques temps que je n'avais pas entreprit un nouveau projet DIY.
Après les enceintes satellites qui fonctionnent à merveille, je pensais me lancer dans la construction d'une enceinte centrale.
Mais finalement, je ne pense pas avoir la place pour cela dans mon petit appart' pour l'instant, je reporte donc ce projet à plus tard.

Pour changer du DIY audio, je vais me lancer dans la construction d'une table basse illuminée par 8x8 Leds commandées par un Arduino.

J'en dirais plus quand j'aurais finit la conception, voici un exemple de réalisation d'une table à café "Geek" qui m'a beaucoup inspiré ...