Je suis en ce moment en train de travailler sur un petit projet de régulateur PID universel avec une carte Arduino. Je souhaite pouvoir contrôler mon régulateur via une interface "user-friendly" sur un écran tactile. La carte Arduino n'étant pas vraiment à la base taillé pour l'affichage graphique, il n'existe pas de bibliothèque simple d'utilisation pour ce genre d'usage. J'en ai donc rédigé une. ;-)
Elle n'est clairement pas encore terminé mais si j’attends que ce soit parfait pour la mettre en ligne ..., bref, voila le code !
En l'état actuel elle peut déjà rendre des service et elle convient parfaitement à l'usage que j'en ai (ce qui explique que je ne soit pas chaud bouillant pour la perfectionner ;-)).
**
/!\ Disclaimer : C'est un travail en cours faut pas espérer que tout marche parfaitement du premier coup.
Il y a deux gros points noirs à améliorer :
tester la librairie avec un autre type d'interface que celle que j'utilise dans mon programme (3 onglets, un clavier sur le premier et des boutons sur les autres). J'ai écrit la libraire en tentant de généraliser le code de l'interface mais avec comme objectif principal de réaliser d'abord mon interface.
uniformiser les appels de fonctions. Cette librairie à été écrite au fil de l'eau au fur et a mesurer que le besoin s'en faisait sentir et l'ordre des paramètres ne suis pas de vrai logique
**
Utilisation de la librairie
Je mettrai une doc fonction par fonction sur mon wiki mais voici le principe d'après lequel je suis parti pour la librairie.
L'interface est tout d'abord divisé en onglets. Ca marche très bien avec 3 mais ca devrait marcher avec n'importe quel nombre. Chaque onglet possède un titre et une zone cliquable en haut de l'écran.
On peut ajouter du texte et des boutons sur chaque onglet. Les boutons renvoient au main leur numéros ce qui permet de savoir quel bouton à été cliqué.
On peut associer une fonction aux boutons pour qu'elle soit exécutée lorsque l'ont clique sur le bouton. Il faut fournir un pointeur vers cette fonction au constructeur du bouton. Cela permet de réaliser des claviers.
On peut modifier le texte écrit sur les onglet si l'ont a stocké le numéros renvoyé lors de sa création dans une variable.
J'ai récupéré à mon club robotique un grand morceau de ruban de LED RGB inutilisé. J'ai eu l'idée d'en faire un clone d'ambilight (lumière d'ambiance adaptative au contenu de l'écran) pour mon grand écran de PC. Je pensais qu'avec quelques lignes de Python et une Arduino le problème serai vite réglé. J'ai en fait rencontré deux principaux obstacles, la génération d'une consigne pour le ruban et le pilotage du ruban en lui-même. Je poste donc ici la solution si jamais quelqu'un rencontre le même problème.
Génération de la consigne
Je pensais naïvement que la détermination de la couleur moyenne d'une image se faisait simplement en faisant une moyenne par composante de chaque pixel d'une image. PAS DU TOUT ! ;-)
La couleur obtenue avec cette technique étant désespérément gris~marron, j'ai réfléchi un peu et je me suis rendu compte que le mieux était non pas de faire la moyenne des couleurs mais de chercher la couleur dominante de l'image pour déterminer la couleur de l'ambiance. Là encore, ce n'est pas facile à déterminer, comme l'explique assez bien ce site, la détection de la couleur perçue comme étant la couleur dominante est plus compliqué que de chercher la couleur la plus présente dans l'image.
Au passage un autre [site intéressant]( http://charlesleifer.com/blog/using-python-and-k-means-to-find-the-dominant-colors-in-images/) sur la question présentant un algorithme un peu différent et la
bibliothèque que j'ai utilisé en python pour faire mes tests.
In fine (on ne dit pas au final ...;-)), j'ai réussi à avoir un programme donnant des résultats satisfaisants pour une capture d'écran et là .... katastroph ! Lorsque je fais boucler le script, pour prendre une capture, analyser, envoyer la couleur au ruban la couleur n'est mise à jour qu'un peu plus d'une fois par seconde et un cœur de mon processeur est monopolisé à 100%.
Même en optimisant le code et en repartissant sur plusieurs threads pour améliorer l'utilisation des cœurs, je sentais que mon script resterait lent et consommateur de ressources. Avant d'envisager la réécriture en C, j'ai voulu regarder "ce qui ce faisait ailleurs et comment ça ce faisait" (Note à moi-même : la prochaine fois, COMMENCER par étudier l'état de l'art !).
Je suis tombé (sans me faire mal !) sur le projet Adalight (Opensource !) qui bien que n'étant pas compatible avec mon ruban (évidement, c'est compatible avec leur ruban :-)) correspondait exactement à ce que je souhaitais faire.
Avec en plus comme bonus non négligeable la gestion du multi-écran et le traitement de l'image de l'écran de façon à faire correspondre la couleur du morceau de ruban avec la couleur du bout d'écran accolé (pas clair) ce qui correspondait à la deuxième étape (laborieuse) de mon projet.
Le script tournant sous processing, il était donc de plus théoriquement compatible Linux (évidement) et Windows ce qui pouvait être sympa pour quand je reboot sous Windows.
Lien du dépôt Github avec le code
J'ai donc décidé d'utiliser le script d'Adafruit avec quelques modifications.
ATTENTION : Ce script ne fonctionne correctement qu'avec Processing 2.X.X
Personnellement je n'ai aucun soucis avec Processing 2.2.1, il ne fonctionne par contre plus avec Processing 3.
Pilotage du ruban
Ayant décidé d’utiliser le code d'Adalight, il me fallait du coup coder un script Arduino compatible avec le WS2811, le driver de mon ruban. Le script d'Adalight permettait le controle d'un ruban en SPI tandis que le WS2811 se comporte plutôt comme un shift register.
Le code est fortement inspiré du code original d'Adafruit et d'exemples d'utilisation de la librairie FastLed trouvés sur internet (je sais plus ou :-°).
Les deux scripts dans le dépôts fonctionnement parfaitement ensemble, si vous cherchez à faire un Adalight, vous ne devriez avoir à modifier que la définition de votre écran dans le script Processing.
Lien du dépôt Github avec le code
Sur mon i5 de 4ème génération, le programme consomme environ 10% de ressources, c'est beaucoup mais ça reste raisonnable et surtout le rafraîchissement est plutôt rapide (comme on peut le voir dans la vidéo).
Adafruit propose de beaux shields écran pour Arduino mais il sont un peu chers. OpenSmart vend des clones compatibles (dans une certaine mesure) avec les bibliothèques d'Adafruit. Néanmoins, sur mon écran, les couleurs ne s'affichaient pas correctement et de plus, je trouvais le choix de couleur proposé dans les exemples Adafruit un peu maigre.
Voici comment corriger le problème des couleurs inversées sur certains écrans LCD et étoffer la gamme de couleurs disponibles.
Depuis que j'ai mon Raspberry Pi, je me suis rendu compte qu'avec un peu de persévérance et d'astuce, on peut vraiment tout faire avec son mini ordinateur.
Voila donc la liste des meilleurs programmes et logiciels pour le Raspberry Pi. Il sont tous utilisables au quotidien si on accepte le fait que le Raspberry Pi n'est pas un "foudre de guerre".
Les programmes sont rangé par catégories et sont installable via "sudo apt-get install nomduprog" en console ou via Synaptic qui tourne sur le Raspberry Pi mais qui est lent.
Vous ne savez pas quoi faire avec votre Raspberry Pi ? C'est étonnant, le Raspberry Pi offre tellement de possibilités ! Pour changer un peu des Media-Centers et des tutoriels expliquant comment préparer la carte SD, je vais vous présenter mon projet d'imprimante 3D entièrement conçue avec des matériaux de récupérations (bien que commandée par un Raspberry Pi). Cela peut vous paraître impossible mais il est relativement facile d'obtenir de modestes résultats sans gros investissements financiers.
Je vais donc vous présenter, étape par étape, avec les codes sources et des photos, comment j'ai réalisé mon prototype.
ATTENTION! : Mon projet n'est pas encore totalement abouti mais il est en très bonne voie. Les instructions complètes seront publiées quand j'en aurai le temps et quand tout fonctionnera parfaitement. En attendant, voila déjà un début pour vous donner une idée du projet et pour ceux qui sont pressés, voici un pack contenant mes codes sources:imprimante_arduino_4.zip.