Genèse et objectif du projet
Dans l'optique d'améliorer mes connaissances de l'univers des microcontrôleurs et des nano-ordinateurs à des fins professionnelles (je souhaite créer des escapes games et des installations interactives pour mes clients), je me suis fabriqué un petit pense-bête avec un Raspberry pi Zero W et un Keybow pour me rappeler de quelques tâches régulières. J'ai en effet tendance à oublier d'arroser les plantes, nettoyer la litière... Le fonctionnement est simple, il suffit de cliquer sur le bon bouton quand on a réalisé une tâche, et il s'allumera quand la tâche devra de nouveau être complétée.
Qu'est-ce que le Keybow
Le keybow est un mini clavier macro livré avec son propre OS permettant de créer des raccourcis claviers pour son PC et ses logiciels préférés. Il se présente sous la forme d'un clavier de 3 à 12 touches lumineuses dont on peut personnaliser la couleur qui vient se poser sans soudure au dessus du RPI Zero. On peut par exemple, lancer un script sur Photoshop d'un seul clic, modifier sa voix lors d'un stream, lancer un programme ou pourquoi pas allumer la lumière de la pièce. Le Keybow OS vient avec une API en LUA permettant de programmer ses macros très facilement. Un autre avantage de Keybow OS comparé à Raspberry Pi OS est qu'il se lance nativement en mode ramdisk, ce qui évite toute manipulation de la carte SD après le boot, et donc permet de débrancher son appareil sans avoir besoin de l'éteindre. Il est en effet fortement déconseillé de débrancher son RPI sans l'éteindre au préalable afin d'éviter toute corruption de la carte SD sur laquelle se trouve l'OS. Je vous invite à consulter le tutoriel de montage du constructeur, qui est très accessible comme le montage du RPI 3 a pu l'être.
Code
Le code est très simple, il compte le temps qui passe au fur et à mesure et allume une touche quand nécessaire. Quand on clique, on éteint la lumière et on recommence à compter...
require "keybow" | |
time = 0 | |
isKeyDown_00 = false | |
isKeyDown_01 = false | |
isKeyDown_02 = false | |
hasPipiTop = true | |
timer_00 = 0 | |
timer_00b = 0 | |
timer_01 = 0 | |
timer_02 = 0 | |
maxTime_00 = 23 * 60 * 60 * 1000 | |
maxTime_00b = 21 * 24 * 60 * 60 * 1000 | |
maxTime_01 = 30 * 24 * 60 * 60 * 1000 | |
maxTime_02 = 2 * 24 * 60 * 60 * 1000 | |
-- maxTime_00 = 10000 | |
-- maxTime_00b = 30 * 1000 | |
-- maxTime_01 = 60 * 1000 | |
-- maxTime_02 = 10 * 1000 | |
function setup() | |
keybow.use_mini() | |
keybow.auto_lights(false) | |
keybow.clear_lights() | |
keybow.set_pixel(0, 240, 195, 0) | |
keybow.set_pixel(1, 0, 0, 255) | |
keybow.set_pixel(2, 31, 200, 85) | |
end | |
function tick() | |
time = time + 1 | |
-- change color | |
if time > timer_00 and timer_00 > 0 then | |
keybow.set_pixel(0, 240, 195, 0) | |
timer_00 = 0 | |
hasPipiTop = true | |
end | |
if time > timer_00b and timer_00b > 0 then | |
keybow.set_pixel(0, 173, 79, 9) | |
timer_00b = 0 | |
hasPipiTop = false | |
end | |
if time > timer_01 and timer_01 > 0 then | |
keybow.set_pixel(1, 0, 0, 255) | |
timer_01 = 0 | |
end | |
if time > timer_02 and timer_02 > 0 then | |
keybow.set_pixel(2, 31, 200, 85) | |
timer_02 = 0 | |
end | |
end | |
-- Standard number pad mapping -- | |
-- Key mappings -- | |
function handle_minikey_00(pressed) | |
--litiere | |
if pressed then | |
if hasPipiTop and timer_00 == 0 then | |
timer_00 = time + maxTime_00 | |
hasPipiTop = false | |
elseif timer_00b == 0 then | |
timer_00b = time + maxTime_00b | |
hasPipiTop = true | |
end | |
if timer_00 > 0 and timer_00b > 0 then | |
keybow.set_pixel(0, 0, 0, 0) | |
elseif timer_00b > 0 then | |
keybow.set_pixel(0, 240, 195, 0) | |
elseif timer_00 > 0 then | |
keybow.set_pixel(0, 173, 79, 9) | |
end | |
end | |
isKeyDown_00 = pressed | |
end | |
function handle_minikey_01(pressed) | |
--filtre eau | |
if pressed and timer_01 == 0 then | |
keybow.set_pixel(1, 0, 0, 0) | |
timer_01 = time + maxTime_01 | |
end | |
isKeyDown_01 = pressed | |
end | |
function handle_minikey_02(pressed) | |
-- eau plante | |
if pressed and timer_02 == 0 then | |
keybow.set_pixel(2, 0, 0, 0) | |
timer_02 = time + maxTime_02 | |
end | |
isKeyDown_02 = pressed | |
end |
Et après ?
J'ai pensé à me faire une impression 3d pour faire une jolie coque, mais finalement je vais plutôt mettre mes enfants à contribution, je vais leur proposer de réaliser une mise en scène en Lego !
J'étudie la possibilité d'y ajouter une petite batterie ou un capteur solaire. Cela dit, l'utilisation du RPI Zero reste trop gourmande en ressource et chauffe trop à mon goût (on est obligé de le garder constamment allumé pour que le chronomètre fonctionne). Il faudrait adapter le projet pour un Raspberry Pi Pico qui est un microcontrôleur et non un nano-ordinateur. La différence principale est que le microcontrôleur n'a pas besoin d'OS et qu'il est dédié à une seule tâche. Cela permettrait de diviser la consommation électrique par au moins 5 quand l'appareil est allumé mais aussi de le mettre en veille si besoin. Pour la réalisation de ce nouveau prototype, il faudra également bien choisir ses boutons comme ceux du keybow vendus séparément ou ceux-là, et enfin monter et souder le tout dans un boitier.