Cette fois-ci, j’ai décidé d’implémenter le jeu Pong sur un écran LCD à 2×16 caractères.
J’ai développé cela dans le train, en écrivant d’abord un émulateur d’afficheur dont les API sont compatibles avec le composant LiquidCrystal d’Arduino, puis écrit le moteur en C++.
Ce soir, en rentrant, Pong fonctionnait parfaitement dans mon émulateur.
Et le passage à un sketch arduino s’est fait en quelques instants !
Pour le moment, l’Arduino simule des actions alternées “haut/bas” des paddles, et relance le jeu en cas de balle perdue.
Et ça a marché du premier coup:
Les étapes suivantes : connecter des contrôleurs de jeu (un joystick et des boutons) et brancher un petit haut-parleur, afin de rendre le jeu un peu plus interactif.
Voici mon premier projet Arduino : utiliser un afficheur LCD à 7 segments:
Le making off : la caméra d’un Acer Aspire One soudée sur un câble USB, montée sur un support en LEGO, filmée par guvcview, éditée par Avidemux sous Gentoo Linux, le tout sous l’oeil bienveillant de Caroline.
Arduino, Webcam et Caroline
Et le code associé
/*
7-Segments display example
by Xavier Miller https://www.xaviermiller.be
It displays 16 hex digits from 0 to F and dot.
Setup:
LCD display:
G F (Com) A B
| | | | |
+-----------+
| A |
| +---+ |
| F| G |B |
| + - + |
| E| |C |
| +---+ . |
| D |
+-----------+
| | | | |
E D (COM) C Dot
Arduino:
A = 2;
B = 3;
C = 4;
D = 5;
E = 6;
F = 7;
G = 8;
Dot = 9;
+ 330 ohms resistance to ground
*/
const byte pinStart = 2;
byte masks[] =
{
//GFEDCBA
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111, // 9
B01110111, // A
B01111100, // b
B00111001, // C
B01011110, // d
B01111001, // E
B01110001 // F
};
void ShowDigit(byte value, byte dot)
{
// guard
if (value > sizeof(masks))
value = 0;
// get digit
byte mask = masks[value];
// apply dot
if (dot)
mask |= 128;
// display each segment
for (byte b = 0; b < 8; b++)
digitalWrite(b + pinStart, (mask & (1 << b)) ? HIGH : LOW);
}
void setup()
{
for (byte pin = 0; pin < 8; pin++)
pinMode(pin + pinStart, OUTPUT);
}
void loop()
{
for (byte dot = 0; dot < 2; dot++)
for (byte digit = 0; digit < sizeof(masks); digit++)
{
ShowDigit(digit, dot);
delay(500);
}
}
Windows XP ne gère pas le contrôle du ventilateur de l’Acer Aspire One A110, ce qui fait que l’utilisation sous Windows est assez fatigante à cause du bourdonnement constant du ventilateur.
J’ai essayé AA1FanControl et a1ctl, mais tous deux crashent avec une version récente de Windows XP Service Pack 3 et le BIOS v0.3310.
Heureusement, il y a moyen de paramétrer a1ctl pour être compatible avec le BIOS v0.3310, comme indiqué dans un le commentaire 308:
For all those with the unexpected shutdown problem, here is what helped me (AAO 110 with BIOS 3310):
– go to “Configure” and there to Enable controller values
– tick “Enable custom EC values”
– set Fan stop to CF
– set Fan slow to 4
– set Fan auto to 0
Thanks to PavelD and pc.
Et ça marche enfin !
Bien, il ne reste plus qu’à attendre que le module acerhdf pour linux fonctionne avec le kernel >= 3.6 (solution temporaire: initialiser le statut du ventilateur à “OFF” au démarrage).
EDIT 2013-03-21: il existe une nouvelle version du module acerhdf sur le site officiel 🙂
Ceci est un “Floppy Drive Emulator”, un appareil qui remplace un lecteur de disquettes, sur lequel on branche une clef USB qui peut contenir jusqu’à 100 images de disquettes. Le PC hôte n’y voit que du feu, l’appareil se comporte comme un lecteur de disquettes.
Les images sont stockées en “RAW”, chacune à un multiple de 0x180 000.
Ouf, je vais pouvoir formater ces 100 disquettes via un petit script (merci dd et mtools ;))
Quelle va en être l’utilité ? La suite pour bientôt (avec les photos de la “victime”… qui n’est pas un PC)
Il est actuellement impossible de cross-compiler un environnement de type “desktop”, car la plupart des paquets “user interface” se basent sur Perl et/ou Python, qui tous deux sont (mal) torchés, de telle façon qu’il est impossible de les cross-compiler ainsi que toutes leurs dépendances.
Une alternative est d’utiliser distcc. Avec distcc, tout passe, sauf java (du moins IcedTea).
Il faut juste éviter de faire surchauffer le processeur, en limitant entre autres la compilation de GCC sur un job.
Prochain défi : faire fonctionner le son correctement. L’image de test donne un son impeccable, mais je n’arrive pas à trouver quel jeu de patches appliquer aux sources du noyau. Affaire en cours !
Suite à un message sur la mailing list des développeurs Gentoo, je suis tombé sur un article : PORTING-HOWTO (from vapier). Cette méthode est mieux documentée que mon “Gentoo From Scratch”, ce qui fait que j’ai désactivé la publication de mon script. Tant pis pour les 0,22 personnes qui auraient pu l’utiliser 😉
De toutes façons, je ne prévoyais pas de maintenir ce script, et avec le temps, il commençait à devenir obsolète (nouvelle versions de LinuxFromScratch, de Portage, …).
Mes prochaines élucubrations tourneront probablement autour de PureData