Me revoilà aujourd’hui avec une création totalement inutile, d’où ce titre « The Unnecessary Bubble ».

The Unnecessary Bubble

Le matériel nécessaire: Une carte arduino, 3 résistances 150 ohms, 1 led RGB, 1 capteur de proximité SHARP G2D120 ou équivalent, une balle de ping-pong.

La led RGB est branchée sur la masse (GND), et sur les ports 9, 10, 11 de l’arduino au travers des résistances de 150 ohms. La balle de ping-pong percée d’un trou de 5mm sert de diffuseur à la led.

Le capteur SHARP est branché sur l’entrée analogique 0, VCC (5v) et la masse (GND).

Sur le principe l’arduino change de couleur toutes les 100 ms ( ce qui permet de faire varier les tons de couleurs assez rapidement). Si vous approchez un objet ou votre main de la boite, le capteur évalue la distance, plus celle-ci et faible et plus le cycle des couleurs est rapide. Si vous vous éloignez, le cycle de couleur reprend sa vitesse normale.

The Unnecessary Bubble The Unnecessary Bubble The Unnecessary Bubble The Unnecessary Bubble The Unnecessary Bubble

Voilà le code source:

[code]

#define PIN_RED           10
#define PIN_GREEN        9
#define PIN_BLUE          11
#define PIN_SHARP       0
#define WAIT              100

int waiting = WAIT;

void color(int r, int g, int b)
{
analogWrite(PIN_RED,   r);
analogWrite(PIN_GREEN, g);
analogWrite(PIN_BLUE,  b);
}

void setup()
{

pinMode(PIN_RED,   OUTPUT);
pinMode(PIN_GREEN, OUTPUT);
pinMode(PIN_BLUE,  OUTPUT);
pinMode(PIN_SHARP,INPUT);
}

void loop()
{

for (int i = 0; i < 256; i++){
color(255, i, 0);
set_delay();
delay(waiting);
}

for (int i = 0; i < 256; i++){
color(255 - i, 255, 0);
set_delay();
delay(waiting);
}

for (int i = 0; i < 256; i++){
color(0, 255, i);
set_delay();
delay(waiting);
}

for (int i = 0; i < 256; i++){
color(0, 255 - i, 255);
set_delay();
delay(waiting);
}

for (int i = 0; i < 256; i++){
color(i, 0, 255);
set_delay();
delay(waiting);
}

for (int i = 0; i < 256; i++){
color(255, 0, 255 - i);
set_delay();
delay(waiting);
}
}

void set_delay()
{
int analogValue1 = analogRead(PIN_SHARP);
if (  analogValue1 < 100 )
{
waiting = WAIT;
}
else
{
waiting = WAIT / (analogValue1 / 10);
}

}
[/code]

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.

06082008157 USB / Serial TTL converter Tux exploded 8x8 led display Moisture sensor diy arduino and led display Testing sensor and led Testing sensor some test with arduino board some test with arduino board

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]

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

Me revoilà avec mon routeur et sa nouvelle sortie USB. Je viens d’aller acheter une clef USB audio ~15 €.

UsbKey

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.

Without cover :-)

Ensuite quelques coups de fer à souder vont me permettre de déporter la sortie audio et la led d’alimentation de la clef.

extend audio output

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

in place

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.

audio output

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.

OpenWrt Kamikaze

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…

© 2010 EquinoxeFR Suffusion WordPress theme by Sayontan Sinha