Processing & Mobile, 2 platerformes de développement autour de JAVA

Il y a quelques temps j’avais présenté les micro controleurs Arduino, objet assez génial, pas cher ( <30€ ) avec une plateforme de développement openSource, disponible pour Linux, MacOS et Windows.

Arduino

Ils ont permis d’ouvrir aux artistes, bricoleurs, enseignants, le monde des µC avec une certaine simplicité d’accès. Et bien voilà, côté développement PC, il y a aussi processing, un language tournant autour de java avec de nombreuses librairies pour faciliter les interactions avec l’utilisateur.

Processing

Les programmes compilés sont des .JAR multi plateformes qui simplifient grandement la diffusion. Il ne s’agit pas d’un language permettant de créer de grosse applications, mais plutôt de petits programmes pour un usage ciblé: reconnaissance de couleur avec une webcam, pilotage du PC avec une manette de WII…

Processing

Processing est inter connectable avec un arduino, on peut ainsi agir sur le micro contrôleur depuis le PC ou bien l’inverse. De quoi ouvrir la voie à de nombreuses expérimentations: robotique, capteurs…

Plus récemment, un nouvel IDE est sorti, tout droit dérivé de processing. Il s’agit de Mobile, la version pour téléphones de processing.

Mobile

J’ai testé, c’est impressionnant, en un rien de temps, vous pouvez sortir une application pour votre téléphone, utilisant le réseau, le bluetooth, l’affichage… La version mobile n’est livrée pour le moment que pour Windows et OsX mais une personne sur le forum propose déjà un paquet tgz pour linux 🙂

Mobile

Pour finir, ceux qui veulent se lancer dans le monde de l’Arduino et du « controle des objets », peuvent regarder un ouvrage très bien chez O’reilly: « Making things talk ».

Making the things talk

Vous pouvez acheter le bouquin ou le PDF (sans drm ) ici.

Bon développement 🙂

Arduino Tux prend soin de vos plantes ;-)

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.

[youtube:http://fr.youtube.com/watch?v=9DGADNzL1Pw]

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]

Arduino PhotoLab

Ca y est, je viens de terminer la mise au point de la première version de mon « Arduino PhotoLab », derrière ce nom se cache un petit circuit fait maison qui permet de piloter mon EOS 400D pour prendre des photos à haute vitesse ( goutte d’eau, orage, bris de verre…).

Voilà un exemple de mes tests du jour avec de gouttes d’eau et d’huile:

Impact ! (Serie)

Impact ! (Serie)

Impact ! (Serie)

Le cœur du circuit est un ATMEGA 168 avec le firmware Arduino. Le boitier dispose d’une LED  de contrôle, d’un écran LCD pour le paramétrage et de 4 boutons.

Arduino PhotoLab

L’intérieur de la boite. C’est mal rangé mais ça marche 😉

Arduino PhotoLab

Le boitier dispose de 5 entrées / sorties:

  1. un port série pour mettre à jour le firmware
  2. une sortie pour le premier servomoteur
  3. une sortie pour le deuxième servomoteur
  4. une sortie pour une commande de flash
  5. une entrée pour un capteur analogique. actuellement j’ai fait 3 capteurs: un de contact, un capteur sonore et un capteur IR.

Arduino PhotoLab

Arduino PhotoLab

Voilà la zone de test :-). J’ai fabriqué une boite en carton peinte en blanc pour la prise des photos. Un goutte est projetée avec une seringue, lors de la traversée de la demi-sphère rouge, elle est détectée par une barrière IR. Le PhotoLab attend alors un délai réglable (ici 305ms)  avant de déclencher le flash.

Arduino PhotoLab

Principe de fonctionnement:

  1. On place la pièce dans le noir.
  2. L’appareil photo est déclenché manuellement avec une télécommande. Il est paramétré pour une pose de 4 seconde. Le temps de faire tomber une goutte.
  3. On appuie sur la seringue pour lacher une goutte.
  4. La goutte est détectée. le photolab attend quelques milli secondes.
  5. Le flash est déclenché. Il illumine la pièce et fige la photo.
  6. Les 4 secondes sont écoulées, l’appareil photo referme l’obturateur.

Le système est assez basique actuellement mais ça fonctionne, j’arrive a prendre en photo trois gouttes sur cinq à peu près. Par la suite, de simple mise à jour du logiciel me permettront de contrôler 2 servomoteurs pour effectuer de grosses photos panoramiques automatiquement. J’ai commandé 2 servos d’une puissance de 10Kg pour ça 😉

Si ça intéresse quelqu’un, je peux mettre le schéma en ligne (enfin il faut d’abord que je le fasse…).

Bricolage autour d’un routeur Asus WL500Gp – Partie 3

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.

exploded usbkey

Je l’ai démonté pour en retirer la petite carte électronique.

Connector removed

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

Testing on router

Voilà, on peut maintenant la coller définitivement.

Memory hot glued on motherboard

Le test avec mon eeepc fraichement installé sous ubuntu.

checking with my eeepc

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, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This 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 🙂