Puissance 4 …robotisé…

IMG_0400

Le puissance 4….un grand classique de notre enfance et un projet qui a muri  presque 3 ans !

Tout a commencé en 2011 quand j’ai fais l’acquisition d’un bras robotisé piloté par une carte lynxmotion SSC-32. Cette carte à la particularité d’accepter en entrée un ensemble de commandes textuelles via un port série, et en sortie de piloter jusqu’à 32 servomoteurs (type modélisme). Le commandes sont très simples et prennent la forme suivante:
par exemple pour déplacer le servo n°2 à la position 750 (0.75ms soit 45°), il suffit de passer le séquence suivante « #2 P750 T1000 » (T<duree> représente le temps en ms que le servo prendra pour effectuer le mouvement). un peu de théorie sur la commande des servomoteurs: ici
De son coté, le bras est constitué d’un ensemble de 6 servos, il comprend une épaule (2 axes), un avant bras (1 axe), un bras un poignet (1 axe), et une pince (1 axe).

Mon premier projet était de faire commander le bras par ma réplique d’Apple I, et de laisser cette antique bécane gérer la logique des mouvements et l’IA. Bon, c’était sans compter sur sa terrifiante puissance de calcul à 1mhz. Sachant que je suis une tanche en assembleur, le programme devait tourner en basic, donc en interprété….résultat très décevant: juste pour l’IA il fallait de 1 à 3 min pour déterminer le coup à jouer.
Néanmoins, en faisant tourner le programme sur mon macbook, on pouvait obtenir ceci:

Avec un embryon de plateau de jeu réalisé avec des glissières en alu….

Ok, ce n’est pas l’idéal…. il était temps de réfléchir à quelque chose de plus « pro » qui utilise le vrai plateau de jeu d’un puissance 4, d’un distributeur de jeton (en prenant en compte le coté « rugueux » des jetons d’origine). Bref, du boulot en perspective….et puis d’autre projets sont apparus (domotique, radio, machine inutile + plein d’autres choses….).
2 ans et demi plus tard, après quelques tentatives infructueuses, j’ai décidé de reprendre le projet de zéro:

1) utiliser un plateau de jeu d’origine

La seule solution a été de surélever considérablement le bras pour que celui-ci domine le plateau et qu’il puisse déposer convenablement les jetons dans chacune des têtes de colonne. Solution mise en pratique par l’utilisation de pieds de table en acier de chez « Lee Roy Mèreline »
IMG_0409

 

2) les jetons et les distributeurs de jetons

Concernant les jetons, j’ai rapidement abandonné ceux d’origine pour un ensemble de cylindre que j’ai fait découper au laser dans le l’acrylique de 5mm d’épaisseur (formulor.de).
Le gros avantage réside dans le fait de pouvoir, dans une pile,  faire glisser sans difficultés le jeton du bas sans frottement (pour peu que la dite pile soit maintenue bien évidement).  Le distributeur pouvant, dans ce cas, prendre simplement la forme d’un parallélépipède vertical contenant la pile  et possédant une ouverture en bas suffisante pour en saisir un.
Ce qui donne:

3) L’électronique

Ayant pris un peu d’assurance avec les arduino’s, j’ai abandonné interfaçage avec mon « Apple I » et je suis parti sur une solution à base de « micro » (toujours pour son coté compacte). L’arduino micro étant comme tous ses grands frères très à l’aise pour communiquer sur un port série, il n’y avait donc aucun soucis à piloter la carte SSC-32 avec cette solution.

IMG_0398

3) L’IHM

Interaction minimaliste mais fonctionnelle au maximum…donc un afficheur LCD 4×20 (sur bus I2c) pour indiquer les phases du jeu, et un ensemble « LED + bouton poussoir » au pied de chaque colonne numérotée de 1 à 7.
Pour intégrer le tout, je me suis à nouveau appuyé sur les possibilités offertes par formulor.de, j’ai donc dessiné et fait découper un assemblage de plaques d’acrylique de 3mm qui forment un réceptacle à jetons sous le plateau et qui se termine en console abritant les boutons et les leds, coté joueur. Les LEDs sont pilotées chacune individuellement par une sortie numérique. Les boutons poussoirs, pour leur part, sont montés sur des ponts diviseurs de tension et reliés en sortie à une unique entrée analogique de l’arduino (pour faire simple bouton1=0.5V, bouton2=1V, bouton3=1.5V, etc..)
IMG_0407
une petite démonstration par la pratique??

une partie gagnée

comme d’hab, un petit lien vers le source hébergé sur GitHub: https://github.com/Chnalex/arduino/blob/master/puissance4.ino

Radioduino !!

radio-011-Large.jpg

Après le bureau, la cuisine !!!!
En trainant mes guetres sur le site de sparkfun, j’ai repéré un tuner FM piloté un bus I2C (changement de fréquence, recherche auto de station, données RDS), une nouvelle idée farfelue à germée….Réaliser une radio FM pour la cuisine avec pele-mèle: Un barometre, une horloge temps reel, un decodeur RDS avancé (refonte en profondeur de la bibliothèque d’origine fournie par sparkfun), un compte minute pour cuisiner, un ampli audio commandé par un simple potard, un joystick comme moyen d’interagir……et bien-sur, tout ça devant tenir dans un boitier de moins d’un mètre cube!!!!!!!!!!!!!

Pour changer un peu, j’ai utilisé un nouveau venu: l’arduino Micro, qui se distingue du nano par le fait qu’il intégrè le même microcontrôleur que l’arduino leonardo – un ATmega32u4. Cette puce a le gros avantage d’intégrer un port usb natif évitant de passer par un convertisseur série/usb, donc moins de composants sur le PCB. L’ATmega32u4 et sa gestion de l’usb permet aussi à l’arduino micro de simuler un clavier ou une souris.

radio 008 (Medium)

D’un point de vue composants/modules, beaucoup de déjà vu: horloge temps réel I2C snootlab, capteur de pression atmo Bosch BMP085, écran  LCD 4×20 sur bus I2C.

les trois nouveautés sont:
– le tuner FM I2C Si4703
– l’ampli miniature a base d’un TPA2005D1
joystick analogique avec click provenant des manettes de PS2

Pas de grand mystère pour le joystick, il est composé de deux potentiomètres dont on récupère la valeur de la tension issue du pont diviseur sur une entrée analogique de l’arduino.
Concernant le tuner FM, beaucoup de travail concernant la bibliothèque de traitement des signaux RDS. Celle fournie par sparkfun étant plutôt embryonnaire, il a fallu que je me plonge dans les spécifications de la norme RDS, afin de développer ma propre version de la bibliothèque pour afficher le RadioText en plus de la station (et pour ne pas m’arrêter en si bon chemin, j’ai implémenté la quasi totalité des fonctions RDS possibles AF-TA-PS-CT-RT-PI-TP-PTY). La bibliothèque est un fork de l’originale: https://github.com/Chnalex/Si4703_FM_Tuner_Evaluation_Board/tree/master/Libraries/Si4703_Breakout
elle est en court d’intégration dans le source initial….mais ce n’est pas très réactif coté sparkfun….. 😉
L’ampli, pour sa part,  est très simple d’emploi (entrée,sortie, emplacement pour un potentiomètre, alim). Il est de classe D, il fonctionne comme une alimentation à découpage (signal PWM comme pour l’horloge à galva) la bobine de l’HP servant à lisser le signal. Ce qui donne une très bonne qualité de restitution pour un ampli de cette taille (2cm X 2cm, conso quelques dizaines de mA, rendu 1.4W, rapport signal/bruit 97Db), et surtout sans effet de chauffe.

radio 007 (Medium)

La façade… c’est aussi une des composantes de la réussite du projet. J’ai trouvé sur un forum une référence à un site en Allemagne permettant de concevoir en ligne (via une appli web type CAO) des objets en 2D (découpe et gravure) sur différents matériaux :
http://www.formulor.de/createDesign
pour la façade, j’ai choisi une plaque d’acrylique très fine (1.5mm) de couleur noire

radio 005 (Medium)

un peu de scotch double-face avant d’appliquer la façade sur le boitier

 

 

radio 004 (Medium)

 

 

 

 

la façade avant

radio 006 (Medium)

 

 

 

 

 

le résultat ….

 

 

 

 

 

une petite vidéo du démarrage (init, splashscreen, infos RDS ->PS puis RT)

 

vidéo du fonctionnement  du compte-minutes ….. 😉

comme toujours, un petit tour par le source:

https://github.com/Chnalex/arduino/blob/master/radioduino.ino

 

Horloge à galvanomètres

IMG_0848

Quoi de mieux qu’une petite horloge de bureau atypique, avec un look analogique (comble de la supercherie totalement numérique dans les faits).
Et comme afficher l’heure c’est bien mais que donner un semblant de prévision météo c’est mieux, pourquoi ne pas y adjoindre un capteur de pression atmosphérique ainsi qu’un capteur de température.

comme toujours, un arduino nano sera au cœur du montage pour son coté compact. Le pilotage des trois  galvanomètres (heures, minutes, secondes) est assuré par les sorties « analogiques » (qui n’ont d’analogique que le nom, puisqu’il s’agit de sorties PWM en réalité  <- modulation de largeur d’impulsion 0-5V avec une fréquence d’environ 500Hz). Mais, oh miracle de l’électronique à l’ancienne, le galvanomètre étant composé d’une bobine (et souvent d’une résistance en plus), celle-ci lisse le signal pour donner une valeur continue (l’idéal eut été d’y adjoindre un petit condensateur…mais cela fonctionne parfaitement sans). Pour la partie, horloge temps réel le même Module I2C pour pour la domotique est utilisé, idem pour le capteur de température où un DS18B20 Onewire sera installé.
IMG_0852

La petite nouveauté réside dans l’utilisation d’un capteur I2C BMP085 de chez Bosh (module bleu vertical à droite de l’image)

Donc au final beaucoup d’analogique piloté, une pincé d’I2C, un soupçon de Onewire,
ce qui donne ça… dans le boitier définitif:

IMG_0851

les trois boutons poussoirs visibles sur le dessus sont là pour régler/recaler manuellement l’horloge interne (cf code source), ils sont alimentés en +5V et chacun ferme un circuit de pont diviseur. La lecture de la valeur étant effectuée sur l’une des entrées analogiques.

Le source sur GitHub: https://github.com/Chnalex/arduino/blob/master/horloge-galvanometre.ino

 

Domotique – où comment gérer mes volets et ma chaudière…..

IMG_0378

La machine inutile n’était qu’un galop d’essai pour aborder l’arduino… pour  notre nouvelle maison, j’avais comme projet de gérer la future chaudière à granulés ainsi que l’ensemble des volets roulants (à commandes radios – cf photo)

– pour gérer la chaudière, un ou deux capteurs de température font l’affaire (un par étage, pour leur facilité d’utilisation et un nbr restreint de fils -2- j’ai opté pour des capteur DS18B20 sur bus Dallas Onewire). La commande de son coté est gérée par un simple relais. La chaudière à granulés ayant une inertie importante (mise en route sur 10minutes, temps de chauffe d’au moins 3/4 d’heure, extinction en 15 minutes), une régulation évoluée est inadaptée et pour tout dire, plutôt néfaste à ce type d’installation, donc pas de PID mais une simple régulation par hystérésis (ex: pour une consigne à 19°, déclenchement à 18.5° et arrêt à 19.5°)
– pour gérer les volets…rien de plus simple, en tout cas sur le papier ! Les télécommandes comprennent trois boutons poussoirs (monter-arret-descendre) donc 3 relais par télécommande, mais comme il y a 9 télécommandes….il faut 27 relais !!!!! Il est temps de IMG_0382penser à industrialiser les relais….le choix c’est donc porté sur deux cartes 16 relais pour microcontrôleur. Achat bien pratique sur Ebay, par contre le gros défaut est quelles fonctionnent en logique inversée. Il faut penser dès l’initialisation de l’arduino à placer toutes les sorties pilotant les cartes en HIGH, ce qui place les relais en OFF (un peu bête quand même)
Maintenant que la gestion de fond est faite, il est temps de penser à l’IHM…..est surtout d’éviter de poluer le salon (où se trouve la chaudière/poêle à granulés) avec des fils, des cartes, des alims et autre relais et LEDs. Un panneau de commande décorrélé de la partie « électronique » est la meilleure solution. Toujours dans un soucis de simplicité d’esthétique et d’utilisation, j’ai préféré me tourner vers un simple moniteur 10 pouces 16/9eme équipé d’un touchscreen resistif. Bon ok pour le touchscreen, le concept n’est pas trop compliqué, 4 fils à alimenter d’une certaine manière pour obtenir la valeur en X et d’une autre manière pour obtenir la valeur en Y en fonction de l’endroit où se situe la pression sur la dalle. Les convertisseurs analogique->numérique (ADC) des arduino’s savent très bien lire une valeur de tension en entrée (pont de résistance -> diviseur de tension généré par le touchscreen). Le problème est comment envoyer un signal sur le moniteur (qui accepte du composite, VGA ou HDMI). Là, oh miracle, d’autres ont déjà résolus le problème !!!! Il s’agit de la carte vidéo la plus basique du monde :  la Tellymate de chez Batsocks. Le concept est d’une simplicité déconcertante: on envoie sur un port série les textes à afficher (ainsi que leur emplacement sur une grille 38×25 caractères) et en sortie un signal vidéo composite est généré. Ce n’est pas très sexy, plutôt TTY, mais efficace (je pense néanmoins à faire évoluer la chose en utilisant un raspberry Pi en guise de carte video HDMI. l’article qui m’a mis la puce à l’oreille ).

Assez de blabla… un peu de photos

IMG_0377

– un arduino mega (bcp de ram de flash et surtout suffisamment d’entrées/sorties pour gérer les 32 relais)
– une horloge temps réel sur bus I2C de chez snootlab à  très faible dérive (10sec à 1minute max de décalage par an). Ce n’est pas le point fort des arduino, il faut donc en passer par là.

– un petit afficheur LCD 4×20 sur bus I2C, comme répéteur des infos vitales (puisque nous ne sommes pas dans la même pièce que le panneau de commande…).
– une carte vidéo tellymate
– 2 carte 16 relais
– 2 capteurs de température DS18B20

IMG_0380

le répéteur LCD

IMG_0381

un petit zoom, à droite l’horloge temps réel

Comme le programme est conséquent (un peu plus de 2700 lignes), il pèse 38ko compilé.
le code source sur mon espace GitHub: https://github.com/Chnalex/arduino/blob/master/domotique.ino

une petite vidéo de démo de l’IHM:

useless machine – le grand n’importe quoi …

 

tout a commencé le jour où j’ai reçu un lien vers cette video : https://www.youtube.com/watch?v=Z86V_ICUCD4&html5=1&noredirect=1

je l’avoue, j’ai voulu faire la mienne…. c’était l’occasion rêvée pour commencer une première réalisation à base d’arduino

Photo 023 (Medium)La machine inutile par excellence…
– 1 arduino nano (pour le coté compacte)
-1 inter
-1 servomoteur avec un bras permettant d’action l’inter
– un afficheur LCD (encore plus inutile), histoire de tester la librairie LiquidCrytal
– un boitier fait maison en contreplaqué teinté façon 70’s

Photo 027 (Medium)

l’intérieur de la bête un peu fouillis…

 

 

 

Photo 026 (Medium)

 

 

Le bras prêt à surgir….

 

 

 

Photo 028 (Medium)

 

 

 

Le servomoteur

 

 

 

une petite vidéo de démo qui parle d’elle même pour ceux qui n’auraient pas encore saisi le concept.

 

le code source (d’une grande complexité 😉 ) qui fait un petit 9ko compilé
a retrouver sur mon espace sur GitHub: https://github.com/Chnalex/arduino/blob/master/useless-machine.ino