Piloter l'éclairage d'un aquarium avec un Arduino
22/12/2016 ⋅ 11 commentaires
J'en avais parlé au début de ce blog, ça devait se faire avec un RaspberryPi. Au final ça tourne sur 3 pattes sur un Arduino depuis ce temps avec un tas de problèmes, résolus au fil du temps et des petites erreurs de conception, que je vais donc rel…
On en était resté à allumer une LED avec un RaspberryPi. Alors le RaspberryPi, c'est bien, mais ça coûte un peu plus de sous qu'une autre carte capable de faire ça aussi : l'Arduino. Cette dernière est en plus nettement plus simple à prendre en main, avec bien moins de question à se poser.
Qui plus est, l'Arduino dispose de plus de possibilité d'entrées/sorties, bref, c'est un peu plus fait pour faire de l'automatisme, et surtout, il est possible de fabriquer sa propre carte à base de très peu de composant acheté au détail. C'est donc le choix que j'ai fait (et on verra plus tard que ça n'est pas forcément le meilleur).
Le cahier des charges
Commençons donc d'abord par décrire le projet.
Je souhaite réaliser un éclairage d'aquarium dont l'intensité varie dans le temps en fonction de l'heure, de manière à simuler la course du soleil. Les horaires sont légèrement différentes entre la semaine et le Week-End pour profiter du spectacle aux heures où il y a du monde.
Les contraintes aquariophiles
Niveau aquariophilie, il s'agit d'un bac Tanganyika (un des grands lacs Africain), non planté. Il n'y a donc pas de soucis de quantité de lumière ou de longueur d'onde histoire qu'elles poussent bien. Dans le cas contraire, ça aurait été un facteur à prendre en compte. Au passage, c'est super intéressant cette partie là, jouer avec les nanomètres, les candelas, les Lux et autres Lumens.
Le bac est un bac fermé, donc l'éclairage ne se voit pas (pas de contraintes esthétiques donc), mais doit être parfaitement étanche (condensation).
Le projet 1 : les rubans de LED
Puisque la lumière doit changer en fonction de l'heure, il faut une référence à l'heure, ce dont ne dispose pas l'Arduino (ni le RPI d'ailleurs). Pour cela, un composant appelé Real Time Clock (RTC), permettant de conserver l'heure même en cas de coupure de l'alimentation. Ce composant communique avec l'Arduino via le protocole i2c.
A la place d'une seule LED (bah oui, il fait 1 mètre de long le bac quand même), j'avais choisi en premier lieu des rubans de LED étanches. Il s'agit en fait de petites LED (60 par mètre de ruban, pour un flux lumineux de l'ordre de 200 lumens) avec leurs résistances le tout noyé dans du silicone transparent. Ca s'alimente en 12V et se comporte comme une LED et sa résistance. La consommation étant de 600mA par mètre, un simple transistor 2N222 et sa résistance sur la base, histoire de limiter le courant y circulant.
Je suis parti sur l'idée d'utiliser deux températures de couleur. L'une chaude, qui simulera l'aube et l'aurore (ça sera donc le premier à s'allumer, et le dernier à s'éteindre, sa croissance/décroissance étant assez rapide), et l'autre froide pour la lumière du jour (qui croit et décroît lentement). J'ai donc pris un ruban de LED Blanc chaud avec une température de couleur d'environ 2000 Kelvin, et un froid d'environ 5000K.
D'un point de vue mécanique, j'avais simplement fixé ces rubans sur des baguettes en aluminium, glissées dans un tuyau transparent et mis à la place des néons dans les douilles.
Bref, au final, ça donnait ça
J'ai donc refait une carte Arduino simplifiée avec des trucs de récups, mais pas que :
- Un Atemga 328P et bootloader Arduino 6€
- Un régulateur de tension 5V et ses condensateurs 2€
- Un cristal 16MHz et ses condos 3€
- Une platine d'essai 8€
- Des connecteurs de récup pour programmer le microcontroleur
- La RTC 10€
- Les 2N222 et leurs resistances 1€
- Des borniers à vis 3€
Je n'ai pas cherché à tirer les prix, j'ai acheté pas mal de trucs au revendeur du coin, ou sur Internet, mais dans des boutiques françaises. Ça fait une carte aux alentours de 34€, dont 19€ pour faire fonctionner le microcontrolleur (avec pas mal de récup la dedans). La partie Arduino n'est donc pas hyper intéressante, puisque c'est le même prix qu'une carte toute faite, en moins pratique (puisque pas de convertisseur USB/Série pour la programmation par exemple). Bref, si c'était à refaire, je ne me prendrais pas la tête, et j'opterais pour un shield de prototypage dans les 5€, genre ça
Mais, là n'est pas le problème majeur. Le plus gros soucis, c'est que les différents rubans de LED ont une durée de vie très faible, qui dépasse à peine 6 mois.
J'ai donc décidé de changer de technologie, et passer des rubans aux LED de puissance.
Le projet 2 : LED de puissance et driver
Quezako une LED de puissance ?
Photo par Gophi CC-BY-SA-3.0 sur Wikimedia
Il s'agit d'une LED très lumineuse (en centaines de lumens, à comparer aux moins de 1 lumen d'une LED 5mm), dans laquelle peut circuler un courant très important (en milliers de mA, à comparé au 20mA d'une LED 5mm). Il en faut donc nettement moins pour éclairer autant. Dans mon cas, 4 LED remplacent 2 mètres de ruban (120 LED donc). Bon, ça n'est pas sans contrepartie.
D'abord, ça chauffe (ceci-dit, c'est probablement aussi vrai avec les rubans dans une moindre mesure, ce qui expliquerait leur faible durée de vie). Si cette chaleur n'est pas dissipée, la LED crâme en quelques secondes. Il faut donc penser à un système de refroidissement. Comme j'ai besoin de très peu de LED, je les ai simplement vissées sur des U en alu de la longueur du bac (avec de la graisse thermique pour le contact). Le supportage est donc assuré aussi comme ça, mais, s'il y avait eu plus de LED, il aurait fallu passer à des profilés spécialement conçus pour le refroidissement. J'ai collé un capot en polycarbonate alvélolé avec du silicone aquarium autour de chaque LED pour l'étanchéité et voilà.
Le second problème, c'est qu'une LED de puissance ne se branche pas avec une simple résistance en série. Pourquoi ? Tout d'abord, parce qu'avec le courant qui y circule, il faudrait une résistance de très forte puissance (ben oui, l'ordre de grandeur du courant étant de 1A, le moindre Volt aux bornes de la résistance lui impose donc de dissiper 1W. Or les résistances classiques sont dites quart de Watt (c'est la puissance qu'elles peuvent dissiper sans claquer). Même s"il en existe de plus grosses, elles vont consommer de l'énergie inutilement. Ensuite, parce que du simple fait des tolérances sur la valeur des résistances, ou de la chute de tension des LED, on a vite fait de se retrouver hors des caractéristiques des composants. Pour plus de précision, un petit tour sur Sonelec
C'est pour cela qu'on utilise un driver pour alimenter ce genre de LED. Il s'agit d'un composant qui va délivrer un courant constant quelque soit la chute de tension des LED qui y sont raccordées.
Il en existe une multitude, et certains sont dimmables grâce à un signal PWM, c'est à dire qu'on peut grâce à eux faire varier la luminosité des LED qu'ils pilotent, en hachant la tension qu'on leur envoi à une certaine fréquence.
J'ai choisi des drivers de marque Meanwell, modèle LDD700HW (de l'ordre de 8€ pièces), munis de fils pour faciliter le cablage, étant donné que mon alimentation 12DC était suffisante par rapport au nombre de LED raccordé par driver (2 seulement). S'il avait fallu changer d'alimentation, j'aurais probablement pris un modèle permettant de convertir directement le secteur en continu.
Il y a un forum comunautaire très chouette spécialisé dans l'éclairage d'aquarium, et en particulier avec des LED, qui s'appelle Aquaohm. Il y a notamment un super outil qui permet de dimensionner l'éclairage, tant sur la partie optique qu'électronique. Et l'admin du site est en plus très disponible et sympathique.
Voilà donc le schéma de la carte, et la photo du montage
Voilà donc environ 2 ans que ça tourne comme ça, et pas de soucis de lampe. En reste encore un cependant, le programme d'origine : a chaque coupure de courant, la RTC perd l'heure. Un peu logique, puisque l'heure est réglée à chaque démarrage en prenant en compte le moment où le programme est compilé. De ce fait, chaque coupure implique la ré-injection du programme. Pas terrible lorsqu'on voit la façon dont cette opération doit être faite.
Il faudrait pouvoir régler cette heure indépendamment, et donc, créer une Interface Homme/Machine, dont on va parler maintenant.
Projet 3 : l'interface Homme/Machine
Le choix le plus évident (et le moins onéreux ?) avec un Arduino reste l'écran LCD avec des boutons, même si d'autres peuvent probablement être faits (écran tactile, carte réseau avec implémentation d'un serveur Web, carte bluetooth et écriture d'une application cliente sur le PC ...). Pour ma première IHM, je suis donc parti sur le plus évident : l'écran
Seul problème, un écran LCD nécessite 6 sorties de l'Arduino. Si on ajoute au moins 3 boutons (+ - valid), ça fait 9. Ça aurait commencé à faire un petit peu de monde sur le montage, limitant aussi le nombre d'entrées/sortie disponibles si je souhaite ajouter des fonctionalités (température, niveau d'eau, plus de drivers LED ...). Comme en plus, ça n'est pas le soudure qui me plait le plus dans ce genre de réalisation, j'ai cherché une solution plus clé en main.
J'ai donc utilisé un shield disposant d'un écran LCD et de 5 boutons, communiquant via le bus i2c. Ainsi, pas d'entrées/sorties supplémentaires utilisées, puisque ça se raccorde en parallèle de l'horloge RTC.
On ne va donc pas trop commenter la partie matériel qui change assez peu. Je mets malgré tout le schéma, fait sous Fritzing (pour changer).
Le programme a été refait de fond en comble, puisqu'en plus de l'heure et la date, il permet de régler tout ce qui est réglable :
- la valeur maximal du signal PWM
- les heures et minutes d'allumage et d'extinction en semaine et en Week-end des 2 canaux
- le pilotage manuel des 2 canaux (pour allumer en dehors des heures par exemple)
Il y a aussi possibilité de sauvegarder les valeurs réglées dans l'EEPROM.
Le programme utilise des bibliothèques pour mettre en œuvre le RTC et le shield écran+boutons. Il est disponible sur gogs là (avec les bibliothèques et le fichier Fritzing). Il est vraiement adapté au fonctionnement que j'avais en tête, donc peut-être pas utilisable directement ailleurs. Ceci-dit, on y trouve les exemples de trucs pratiques suivants :
- La détection de front montant lors de l'appui des boutons (facilement adaptable à d'autres matériel)
- La détection d'un appui long sur un bouton (idem)
- Des temporisations
- la mise en place d'un menu de réglage de valeur, inspiré de cet article
- l'utilisation de la fonction map, bien pratique pour faire des remises à l'échelle de valeurs et des interpolations linéaires.
Voilà donc à quoi ça ressemble. Il reste à ajouter un joli capot pour le planquer, mais ça ne saurait tarder.
C'est fini ?
Et voilà. J'ai donc à présent un chouette contrôleur d'éclairage d'aquarium libre, très formateur à bien des points de vue, tant informatique qu'aquariophile, complètement ouvert à des évolutions futures, qui ne manqueront probablement pas d'intervenir lorsque l'envie m'en reprendra. N'hésitez donc pas à utiliser le programme, à le modifier (puisqu'il l'est librement utilisable et modifiable), à le commenter si vous y voyez des horreurs, ou des trucs pas mal (c'est mon deuxième vrai programme seulement), ou à poser des questions si vous en avez ?