Voici un petit gadget pour amuser les enfants: une souris d’ordinateur transformée en souris… mécanique…
C’est aussi pour moi l’occasion de tester un nouveau média, la diffusion de vidéo. Si ça se passe bien, je compte faire de temps en temps des vidéos sur le démontage ou la modification d’objets courants, un peu comme les modifs faites sur le routeur WL500GP.
Pour réaliser ce petit robot, j’ai farfouillé dans mon sac de récupération. Il faut:
- 1 µC ATEMGA8 ou équivalent
- 1 télémètre à IR sharp
- 2 condensateurs
- 1 régulateur LM78L05
- 1 H-bridge L298
- 1 pile 9V
- 2 moteurs DC
- Une vieille souris à martyriser.
- 2 LED + 1 résistance de 150 ohms
Voilà, un bon fer à souder, une dremel et un peu de patience… et vous voilà partis. C’est amusant à construire et ça plait beaucoup aux enfants
J’ai du modifier la configuration du compilateur Arduino pour qu’il supporte mon ATMEGA8 cadencé à 8MHz au lieu de 16 et dont la programmation se fait en SPI et non en série.
Voilà un gadget plutôt marrant. J’ai récupéré un jouet cassé qui partait à la poubelle. Un jouet en forme de tux, ça ne se jette pas ! Pourquoi ne pas le transformer en une sentinelle qui veille sur vos plantes pour voir si elles sont bien arrosées…
Dans mes cartons, j’ai quelques arduinos qui trainent, une matrice de led, et quelques autres composants. Aller, en avant, au fer à souder
Hop, on vide le jouet à coups de Dremel pour faire de la place. Le clavier est découpé pour laisser place à la matrice de led.
Le système se compose d’un contrôleur arduino qui pilote une matrice de 64 leds au travers d’un MAX7219. Le capteur, lui est basé sur deux tiges métalliques, la résistivité de la terre variant avec l’eau, elle est amplifiée par un transistor 2N2222 avant de se connecter à une entrée analogique de l’arduino.
La plante est heureuse lorsqu’on l’arrose. Pour vous remercier de cette eau providentielle, la sentinelle tux affiche des petits coeurs pendant quelques secondes avant de sourire. Dès que l’humidité baisse (simulé en enlevant la sonde) tux fait la tête, il est temps d’arroser
Le tout est relié au PC pour l’alimentation en 5V et la programmation de l’arduino (et le débug dans minicom). On pourrait très bien imaginer mettre un relais avec une pompe sur le µC pour arroser automatiquement vos plantes. Ce n’est pas le but ici mais c’est simple à faire, une résistance, un relais, un transistor et une diode suffisent à rajouter cette fonctionnalité. On peut aussi mettre plusieurs capteurs dans les pots de fleurs.
Je n’ai pas mis de schéma, mon circuit est largement inspiré de ce qui se fait chez botanicalls. Si quelqu’un veut le détail exact, je peux vous le faire avec un coup de Kicad
Pour ceux qui se posent la question, oui c’est totalement inutile… donc parfaitement indispensable
EDIT (18/10/2008)
Voilà le code vite fait qui pilote la matrice de led.
[code]
#include <Binary.h>
#include <Sprite.h>
#include <Matrix.h>
Matrix myMatrix = Matrix(2, 4, 3);
int analogPin = 5;
int val = 0;
int oldval = 1000;
Sprite smile = Sprite(
8, 8,
B00000000,
B00000000,
B00100100,
B00000000,
B01000010,
B00100100,
B00011000,
B00000000
);
Sprite bad = Sprite(
8, 8,
B00000000,
B00000000,
B00100100,
B00000000,
B00011000,
B00100100,
B01000010,
B00000000
);
Sprite nosmile = Sprite(
8, 8,
B00000000,
B00000000,
B01000010,
B00000000,
B00000000,
B00000000,
B00111100,
B00000000
);
Sprite love = Sprite(
8, 8,
B00000000,
B01100110,
B01011010,
B01000010,
B01000010,
B00100100,
B00011000,
B00000000
);
void setup()
{
Serial.begin(9600); // setup serial
myMatrix.clear(); // clear display
}
void loop()
{
val = analogRead(analogPin); // read the input pin
Serial.print("Sensor level: ");
Serial.println(val); // debug value
if (val > (oldval + 40))
{
for (int i=0;i<10;i++)
{
myMatrix.clear(); // clear display
delay(1000);
myMatrix.write(0, 0, love);
delay(1000);
}
}
if (val > 700)
{
myMatrix.clear(); // clear display
myMatrix.write(0, 0, smile);
delay(10000);
}
else
{
if (val > 400 && val <=700)
{
myMatrix.clear(); // clear display
myMatrix.write(0, 0, nosmile);
delay(10000);
}
else
{
if (val <= 400)
{
myMatrix.clear(); // clear display
myMatrix.write(0, 0, bad);
delay(10000);
}
}
}
oldval = val;
}
[/code]
Me revoilà avec mon routeur légèrement bricolé
Pour ceux qui n’ont pas suivi, voilà la partie 1 et la partie 2.
La dernière fois, je m’étais arrêté sur un problème d’espace disque.
ipkg: write error: No space left on device
Heureusement, il me reste en interne un port USB pour pouvoir ajouter un peu de mémoire. J’ai retrouvé une clef usb obsolète de 128Mo.
Je l’ai démonté pour en retirer la petite carte électronique.
Pour les premier tests, je démarre le routeur sans fixer la clef définitivement. Ca ne fait pas pfffttt
c’est déjà bon signe. J’attends que le routeur boote avant de me connecter en ssh. Un petit dmesg me rassure.
SCSI subsystem driver Revision: 1.00
hub.c: new USB device 01:03.1-1, assigned address 2
usb.c: USB device 2 (vend/prod 0xd8c/0xc) is not claimed by any active driver.
Initializing USB Mass Storage driver…
usb.c: registered new driver usb-storage
USB Mass Storage support registered.
hub.c: new USB device 01:03.1-2, assigned address 3
scsi0 : SCSI emulation for USB Mass Storage devices
Vendor: PIXIKA Model: USB Flash Drive Rev: 4.00
Type: Direct-Access ANSI SCSI revision: 02
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
SCSI device sda: 255231 512-byte hdwr sectors (131 MB)
sda: Write Protect is off
Partition check:
/dev/scsi/host0/bus0/target0/lun0: p1
WARNING: USB Mass Storage data integrity not assured
USB Mass Storage device found at 3
Voilà, on peut maintenant la coller définitivement.
Le test avec mon eeepc fraichement installé sous ubuntu.
On peut maintenant se lancer sereinement dans l’installation des utilitaires qui nous manquent.
Un petit coup de fdisk, une pincée de mkfs.ext2 et nous voilà avec un beau filesystem de 128Mo tout prêt à acceuillir le Python récalcitrant.
root@OpenWrt:~# mkfs.ext3 /dev/scsi/host0/bus0/target0/lun0/part1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
16000 inodes, 127472 blocks
6373 blocks (5.00%) reserved for the super user
First data block=1
16 block groups
8192 blocks per group, 8192 fragments per group
1000 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
j’ai ajouté un script de montage de la partition dans le /etc/init.d
root@OpenWrt:/opt# df -h
Filesystem Size Used Available Use% Mounted on
none 14.9M 36.0k 14.9M 0% /tmp
/dev/mtdblock/4 6.0M 5.8M 236.0k 96% /jffs
mini_fo:/jffs 1.2M 1.2M 0 100% /
/dev/scsi/host0/bus0/target0/lun0/part1 122.5M 4.0M 112.2M 3% /opt
il n’y a plus qu’à ajouter « dest opt /opt » dans le fichier /etc/ipkg.conf et à utiliser ipkg avec l’option « -d opt »
root@OpenWrt:/etc/rc.d# ipkg install -d opt mpd
Installing mpd (0.13.0-1) to opt…
Downloading http://downloads.openwrt.org/kamikaze/packages/mipsel/./mpd_0.13.0-1_mipsel.ipk
Configuring mpd
Done.root@OpenWrt:/etc/rc.d# ipkg install -d opt /tmp/python_2.5.1-2_mipsel.ipk
Installing python (2.5.1-2) to opt…
Configuring python
Done.
Cool
Maintenant la suite, installons wymypy. Le site de l’auteur indique qu’il faut utiliser easy_install pour installer son programme.
root@OpenWrt:/opt# python ez_setup.py –install-dir=/opt
Traceback (most recent call last):
File « ez_setup.py », line 267, in <module>
main(sys.argv[1:])
File « ez_setup.py », line 198, in main
egg = download_setuptools(version, delay=0)
File « ez_setup.py », line 120, in download_setuptools
import urllib2, shutil
File « /opt/usr/lib/python2.5/urllib2.py », line 87, in <module>
import base64
File « /opt/usr/lib/python2.5/base64.py », line 9, in <module>
import struct
File « /opt/usr/lib/python2.5/struct.py », line 30, in <module>
from _struct import Struct, error
ImportError: No module named _struct
Au secours !!!
Bon un peu de google me dit qu’il manque _struct.so a cause de mauvais chemins.
Je mets donc un PYTHONPATH=/opt/usr/lib/python2.5 et un PYTHONHOME=/opt/usr/
Allez, on progresse, il me dit qu’il lui manque le module md5… C’est sans fin…
La suite au prochain numéro
Me revoilà avec mon routeur et sa nouvelle sortie USB. Je viens d’aller acheter une clef USB audio ~15 €.
A peine rentré, direction la table de torture pour la désosser. Le capot se retire facilement, il n’est même pas collé, juste glissé en force.
Ensuite quelques coups de fer à souder vont me permettre de déporter la sortie audio et la led d’alimentation de la clef.
Une fois cette étape terminée, je branche la clef sur le routeurs et hop un coup de lsusb pour vérifier:
root@OpenWrt:~# lsusb
Bus 003 Device 001: ID 0000:0000
Bus 003 Device 002: ID 0d8c:000c C-Media Electronics, Inc. Audio Adapter
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
Voilà la clef en place avec la sortie audio déportée. Au début je voulais mettre 2 prises RCA au lieu d’un jack 3.5mm mais elles ne retraient pas sur la face arrière. Du coup j’ai choisi le jack. Je l’ai installé dans l’espace vide entre le switch et le port WAN.
Voilà pour cette partie du hardware, maintenant voyons un peu côté soft. Le datasheet du routeur indique 32Mo de ram alors que seulement 16 sont disponibles. Le site d’openwrt donne la méthode pour rendre disponible les 32Mo de ram. La voici:
nvram set sdram_init=0x0009 nvram set sdram_ncdl=0x10308 nvram commit reboot
Le système est prêt, il ne reste plus qu’à installer les modules et divers utilitaires:
ipkg install kmod-sound-core sox kmod-alsa alsa-utils
voilà pour ce qui est du support de l’audio. Maintenant, pour lire des MP3, il nous faut mpd. Le serveur s’installe facilement avec un coup de
ipkg install mpd
Ensuite il nous faut un frontend pour utiliser mpd. Il en existe pas mal pour tous les OS. Mon choix s’est porté sur un script python wymypy qui permet de piloter MPD avec un naviguateur web ( sans avoir à installer lighthttpd ou apache). Pour l’utiliser, il faut commencer par installer python. Le problème c’est que le paquet python dispo dans les dépots d’Openwrt Kamikaze est cassé.
root@OpenWrt:~# ipkg install python
Installing python (2.5.1-1) to root…
Downloading http://downloads.openwrt.org/kamikaze/packages/mipsel/./python_2.5.1-1_mipsel.ipk
Nothing to be done
An error ocurred, return value: 1.
Collected errors:
ERROR: Cannot satisfy the following dependencies for python:
libreadline
Pour résoudre ce problème un petit tour sur le net nous dit qu’il faut recompiler le paquet python en modifiant le Makefile. J’avais déjà le kit de développement OpenWrt du temps ou je jouais avec la station météo et la fonera. Il ne me reste plus qu’à cocher les bonnes options et hop, on compile.
Ca y est, on peut installer:
root@OpenWrt:~# ipkg install python_2.5.1-2_mipsel.ipk
Installing python (2.5.1-2) to root…
ipkg: write error: No space left on device
et zut… il va falloir utiliser le second port usb interne pour coller de la mémoire flash dans le boitier… la suite au prochain numéro
P.S: Qu’est ce que l’on peut s’amuser avec ces boiboites « open »
merci aux constructeurs qui ont compris que mettre notre tux dans leur matériel présentait bien des avantages…






























Commentaires récents