Jeudi, décembre 4 2014

Un char pour les filles

Bonjour à tous,

je vous présente aujourd'hui, un petit bricolage sympa: c'est une remorque à vélo pour enfant où l'enfant se tient debout:

Mes filles l'adorent. Sur cette photo, elle n'est pas terminée: j'ai rajouté depuis des renforts et une chaîne de sécurité au niveau de l'attache. Dès que la remorque sera peinte, je mettrai les nouvelles photos. Si vous voulez voir les étapes de la réalisation: c'est par ici:
J'ai d'abord commencé par récupérer le matériel: des vélos pour enfant en 14 pouces à la déchetterie et une chute de contreplaqué:


et un vieux portail:

Première étape: démontage et découpe


Calage des pièces, découpes et soudures:

 2 fourches avant de vélo sont les pièces principales du char




Découpe de la barre pour avoir une extrémité moins saillante

Repliage avant soudure puis meulage

Découpe du plancher dans une chute de CP 15mm:

J'ai fait le patron sur PC à partir d'une forme de bodyboard
(avec la même technique que pour le skate: ici)


ça commence à prendre forme


J'ai soudé ensuite la barre horizontale et une potence de récup pour pouvoir y mettre mon guidon steampunk en attendant d'en faire un spécifique qui sera en rapport avec l'esprit surf du plancher.

La remorque est super solide (j'ai testé avec moi dessus en mode "cross") et les filles peuvent même monter à deux dessus. Elles s'éclatent et moi aussi (même si c'est un peu plus dur pour moi que pour elles)


A+


Jeudi, octobre 30 2014

Une Borne d'Arcade maison, nouveau panel

Je continue dans ma série d'upgrade plus ou moins cosmétiques sur ma borne.

foret.jpg

Cette fois on n'usine pas ça avec de simples outils du dimanche, il est impératif d'avoir de l'outillage conséquent !

- Pour la découpe, à défaut de mieux, une scie sauteuse puissante et sa robuste lame à métal. On finira le travail long et fastidieux à la lime.
- Afin de pouvoir faire les trous de très grands diamètres (24 et 30 mm), il faut une perceuse à colonne capable de tourner très lentement (autour de 100 tr/min), un onéreux forêt à étage, et de l'huile de coupe.

Voici le résultat après quelques jours de travail… Oui ce fût un peu long, car j'ai profité de l'accès aux outils pour en faire deux, une pour la borne donc et une seconde pour un hypothétique SuperGun imprimé en 3D, mais que pour le moment mon imprimante est trop petite…


  • Comme le métal a eu le temps le s'oxyder un peu, j'ai d'abord procédé à un ponçage en règle, avec du papier 400 et de l'eau.

dsc00189.jpg dsc00192.jpg

  • Puis j'ai mis en place et serré très fort les boulons de fixation des sticks.

Il ne sont pas destinés à être enlevés, mais à devenir solidaire de la plaque de métal.
dsc00195.jpg dsc00193.jpg dsc00212.jpg

Ceci, afin de servir de base à une cale imprimée 3D, sur laquelle on viendra mettre le stick, qu'on pourra alors visser a ce montage.
Le but est ici de pouvoir régler la hauteur du stick Sanwa sous la ball-top, à l'aide de cales de différentes épaisseurs. Pour plus d'informations, voir ce billet d'époque.
Les cales sont téléchargeables en annexe du billet[1] où sur ma page Thingiverse.
Voilà donc montée une cale de 3,5 mm, puis une 6 mm.
dsc00197.jpg dsc00198.jpg

Avec cette dernière on obtient une hauteur sous la boule de 23 mm.
dsc00199.jpg dsc00200.jpg dsc00210.jpg

  • Bien, on ne va pas laisser ces vis comme ça, car ce serait disgracieux une fois le décor en vinyle collé par dessus.

C'est donc au mastic Sintofer standard que j'ai rebouché les trous sur les têtes de vis, puis effectué le ponçage.
dsc00214.jpg dsc00216.jpg dsc00217.jpg

  • Voilà donc la plaque prête pour être mise en peinture.

dsc00219.jpg dsc00221.jpg

C'est une sous-couche en bombe, de couleur grise et aux propriétés antirouille .
dsc00223.jpg dsc00224.jpg dsc00226.jpg dsc00228.jpg

  • Voici un essai de mise en place sur borne.

dsc00229.jpg dsc00230.jpg

  • Enfin, j'utilise la cale imprimée de 3,5 mm car j'ai décidé de continuer à utiliser le plexis pour permettre l'échange facile de la déco du panel.

J'opterais pour du vinyle avec le panel du SuperGun
dsc00233.jpg dsc00235.jpg dsc00236.jpg dsc00242.jpg

Note

[1] voir ci-dessous

Samedi, octobre 25 2014

WebRadioRéveilWifi -0-

  • Déjà deux billets écrits et toujours pas de présentation du projet !

Ça n'est vraiment pas convenable pour qui voudrait suivre et comprendre les quelques infos tombées de nulle part, je vais maintenant donc tâcher de décrire mon truc…

  • L'idée d'un tel appareil était là depuis longtemps, et c'est l'arrivée du Raspberry Pi qui l'a fait ressurgir comme réalisable. En effet, comme son nom l'indique, on va réaliser une webradio, et c'est donc le Raspberry qui va se charger de cette tâche. Ceci associé à un réveil avec de gros afficheurs 7 segments, et on a notre base de départ…
Pourquoi ne pas acheter un webradio-réveil tout fait ?

Tout simplement car ça n'existe pas…
Où plutôt un système libre n'existe pas, car Orange vend quelques appareils moche et assez cher (autour de 150€) qui ont l’extrême inconvénient de voir la gestion des stations de webradio être basé sur un service en ligne propriétaire.
Non seulement on ne peut écouter que les stations webradio proposées par le service, sans pouvoir en ajouter, mais en plus, si le service venait à disparaître, ce qui est fortement probable à très court terme, on se retrouverait alors avec un simple réveil…
J'ai aussi découvert que Logitech proposait ce type de produit, mais que ce n'est désormais plus proposé à la vente.
Bref, « Fait le toi même » :)


Diagramme :

DiagrammeWebRadioReveilWifi.png

Ébauches et tests :

dsc09788.jpg dsc00080.jpg Comme vu précédemment donc, j'ai commencé à travailler sur la partie WebRadio.

Puis sur la partie Horloge/Alarme.

Ce ne sont que des ébauches de base qui vont être amenées à évoluer vers un premier prototype.

Fonctionnalités :

  • Une base, car rapidement les idées de fonctionnalités fusent de partout et continuent de se rajouter à cette liste qu'il faudra que j'écourte si je ne veux pas me retrouver avec un « maître d'hôtel cybernétique » qui me servirait de nounou…
  • Fonctions automatiques :

- Pas de sonnerie, déclenchement web-radio à horaire prés-déterminé.
- Plusieurs alarmes pré-déterminées sélectionnables.
- Bouton activer/désactiver alarme (parlant?).
- Déclenchement web-radio, sur la dernière station jouée la veille au soir.
- Déclenchement web-radio, de la station préférée du matin.
- Déclenchement web-radio, augmentation progressive du volume.
- Déclenchement d'une playlist MP3.
- Déclenchement d'une playlist MP3 en cas de coupure internet ou réseau wifi.
- Gérer en auto heure d'hivers/été.
- Ajustement de l'intensité lumineuse de l'horloge en automatique par un capteur photosensible.
- Capteur le mouvement pour couper les afficheurs 7 segments lorsque personne n'est présent.
- Couper l'énergie de l'ampli audio quand la radio est non-utilisée.
- Bip tous les 1/4 d'heures en mode radio, pour signifier au dormeur qu'il doit se réveiller…
- Ajustement automatique du volume de la radio.
- Mise à l'heure automatique : Le raspi est mis à l'heure par le web. l'horloge va chercher l'heure sur le raspi seulement si la comparaison entre heure raspi et heure Chronodot est différente.
- Station radio annoncée par synthèse vocale ou wav.
- Module horloge séparé sur Arduino, avantage, si raspi down, l'heure est tjrs là.

  • Fonctions manuelles :

- Bouton SLEEP : 1 pression = power on Radio sur station préférée du matin pour 30 min ; 1 pression de plus ajoute 15 min. Lorsque la durée arrive à son terme, compte à rebord sur afficheur depuis 59 sec.
- Bouton Alarme VITE : 1 pression longue et l'heure défile très vite. 1 pression brève, affiche l'heure de l'alarme durant 5 sec.
- Bouton Alarme LENT : 1 pression longue et l'heure défile lentement. 1 pression brève, égrène les minutes.
- Potard de volume.
- Bouton play radio.
- Bouton Station Radio suivante.
- Bouton Station Radio précédente.
- Bouton SHIFT : Shift + Sleep = power off Radio.
- Appuie long et court pour les fcts supplémentaires.
- Bouton shift pour des fcts supplémentaires.

  • Fonctions supplémentaires :

- Commandes vocales.
- Écran LCD pour XBMC médiacenter.
- Commandes infrarouge.

Design :

Pour le moment j'ai réalisé quelques dessins de ce que à quoi pourrait ressembler l'appareil.
Les idées ne manquent pas et c'est l'imprimante 3D qui travaillera pour moi… Enfin, une fois que j'aurais arrêté un choix et modélisé la 3D.

  • Cependant je retarde cette étape de fait, car n'étant pas encore sûr des composants finaux qui seront utilisés ou pas (taille et forme des haut parleur, écran LCD, etc).

 À suivre…

Lundi, octobre 20 2014

Seeedstudio Limite Perçage

Petit article juste pour vous parler d’un bonne surprise, la qualité des pcb SeeedStudio semble avoir été vraiment améliorée, vous pouvez voir en exemple un des plus « mauvais » via que j’ai trouvé sur ce batch.

Le via doivent normalement avoir une pastille de 0.8mm mais avec une pastille à 0.6mm et un perçage à 0.3mm le via est correcte.

Pour comparaison voila une analyse d’un PCB produit par le même service en 2012.

seeedstudio_2012_analysis


Classé dans:Microscope, PCB

Vendredi, octobre 17 2014

Régulation PID, faire de jolis graphiques 2/2

La dernière fois, je vous ai présenté une méthode essentiellement graphique, permettant une bonne approximation des paramètres PID de votre régulateur. Encore faut-il savoir comment tracer les graphiques, c’est ce que je me propose de vous expliquer dans cet article. Il est bien sûr évident que cette méthode peut être utilisée pour tracer des graphiques à partir de tout type de données, du moment que les données arrivent via un port série.
La première étape va consister à récupérer les données du port série sur un PC. Comme souvent, il existe plusieurs façon de faire, je vous présenterais celle que j’ai utilisé ici : un petit script python.

import serial
import sys

serialport = serial.Serial("/dev/ttyACM0", 9600, timeout=1)
line = []

while True:
    for c in serialport.read():
        line.append(c)
        if c == '\n':
            for s in line:
                f=open('myfile','a')
                sys.stdout.write(s)
                f.write(s)
                f.close
            line = []
            break

serialport.close()

Ce petit script prend les caractères arrivant sur le port série, jusqu’au caractère marquant la fin de ligne, puis écrit la ligne dans un fichier. Ca peut éventuellement suffire pour tracer un graphique… Mais dans ce cas précis, on veut pouvoir également envoyer une consigne au régulateur, la modifier afin de suivre la réaction de ce dernier. Problème : comment envoyer des données sans perturber la lecture des données et ne pas sauter de mesure ?
Là encore, il y a plusieurs méthodes possibles, certaines plus complexes que d’autres. Celle que j’ai choisi permet de garder un programme simple, mais ne fonctionnera que sous linux. Ceux sous un autre système chercheront du côté du multithreading…

import serial
import sys
import select

serialport = serial.Serial("/dev/ttyACM0", 9600, timeout=1)
line = []

while True:
        while sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
          ligne = sys.stdin.readline()
          if ligne:
            print(ligne)
            serialport.write(ligne+'\r\n')
          else: # an empty line means stdin has been closed
            print('eof')
            exit(0)
        else:
            for c in serialport.read():
                    line.append(c)
                    if c == '\n':
                        for s in line:
                                f=open('myfile','a')
                                sys.stdout.write(s)
                                f.write(s)
                                f.close
                                line = []
                    break

serialport.close()

Ah oui, j’ouvre et ferme le fichier a chaque écriture, de manière à pouvoir accéder aux données pendant l’exécution du programme. Ca permet de visualiser l’évolution du graphique en temps réel.
Les données sont envoyées par le microcontrolleur sous la forme . Je n’ai pas de mesure de temps, chaque échantillon étant pris à un intervalle d’une seconde, il suffit de compter les échantillons pour connaître le temps écoulé.

Passons maintenant au graphique lui-même. Pour cela, j’utilise le logiciel Gnuplot, outil très puissant de tracé de courbes dont nous n’utiliseront ici qu’une infime quantité de ses possibilités. Lorsque vous lancez gnuplot en ligne de commande, vous vous retrouvez avec un shell dans lequel vous pourrez lancer vos commandes gnuplot.

plot 'myfile' using 1 smooth bezier title 'temperature', 
'myfile' using 2  with line title 'CO', 
'myfile' using 3 with line title 'Setpoint'
 plot 'myfile' using 1 

Indique que l’on va tracer une courbe correspondant aux données de la première colonne du fichier

smooth bezier

Indique que l’on veut lisser les données. Il n’est pas toujours intéressant de lisser les données, par exemple, ici la colonne 3 correspondant à la consigne n’est pas lissée, ce qui permet de visualiser le moment exact du changement de consigne. Par contre, dans le cas des valeurs mesurées, cela permet de s’affranchir du bruit sur les mesures.

title 'temperature'

Légende de la courbe. Pratique dès qu’il y a plus d’une courbe.

Par défaut, gnuplot va afficher le résultat à l’écran. Pour pouvoir enregistrer le résultat dans un fichier il faut taper les instructions suivantes :

set terminal "png"
set output "monfichier.png"
replot

Nota : avec la commande replot (ou avec le bouton replot de la gui), vous pouvez rafraîchir les données affichées, de manière à visualiser en continu vos données…
Il y a certainement plein d’amélioration possibles à ma méthode, mais je vous la présente car elle a le mérite d’être simple et rapide à mettre en oeuvre, tout en fournissant de bons résultats :)

Jeudi, octobre 2 2014

De la déco avec des éléments de Stick Arcade

  • Quand on a sous la main la collection de toutes les Ball Top Seimitsu et qu'on se dit que c'est trop bête de ranger celles dont on ne se sert pas sur les sticks de la borne, on imagine alors une sorte de présentoir percé de vis bien alignées, sur lesquelles on viendrait visser les boules, juste comme ça, pour faire joli…

Et puis on fait un proto en bois vite fait, et de constater que pour faire quelque chose d'esthétique qui se marie bien avec le design de la borne, il va y avoir du boulot, sans compter qu'on aimerait bien que tout ça s'illumine de mille feux !
Et c'est alors que : l'imprimante 3D !

Bah oui, ça serait bien dommage de ne pas remettre en question toutes les techniques que j'employais jusqu'alors afin d'en rajouter une dans le shaker et voir quoi de bon pourrait en sortir !


Concept et principe :

dsc00332.jpg

  • Voici une photo des croquis vite fait, qui m'ont servi lors de la réflexion, puis de la modélisation 3D.

Il s'agit donc de concevoir une surface percée de 9 trous qui accueilleront des vis à têtes hexagonales. Face à chaque trous, une fente permettra le passage de LEDS électronique.
Sous la structure, une gorge est formée par y passer les câbles.
Une glissière viendra refermer l'objet, et servira également de butée pour maintenir les LEDS en place, dont on aura plié les pattes.

La principale contrainte a été de calculer les dimensions de l'objet pour un compromis entre harmonie des formes de celui-ci, et sa bonne tenue sur la surface d'impression maximale de 19,4x19,4cm.
J'ai donc coupé l'objet en deux parties qu'il faut assembler avec de la colle.

Étant donné que je voulais essayer le soft, c'est cette fois sur Sketchup 8 que j'ai modélisé mon idée.
C'est pas libre et en plus ça ne fonctionne pas sous GNU/Linux, sauf via PlayOnLinux. Cependant le module d'export en .STL ne fonctionne pas, j'ai été obligé de passer par un Windows®.
Voici les plugins qui m'ont été utiles, disponibles en annexe :

- TT_Lib2-2.9.9, nécessaire au fonctionnement de tt_solid_inspector-1.2.0, outil permettant d'examiner le modèle 3D à la recherche de surface « non-manifold ».
Il s'agit de faces qu'on aurait oublié de fermer lors de la modélisation, qu'il faut alors corriger, car une fois le modèle exporté en STL et chargé dans le logiciel d'impression, celui-ci refusera d'imprimer un volume ouvert (genre un cube à 7 faces), ou une surface plane (un simple rectangle sans épaisseur).
- sketchup-stl-2.1.4, pour exporter le modèle 3D en fichier imprimable.


Impression 3D :

  • L'impression doit donc être faite en disposant l'objet en diagonale dans un carré de 194x194mm.

Avec les quatre fichiers STL que j'ai généré[1], rien à faire, chaque objet est déjà placé dans la diagonale.
Rien de spécial à dire sur les réglages d'impression…

  • Mais une précaution à prendre, pour décoller les objets de la surface d'impression : attendre le refroidissement complet !

dsc00270.jpg dsc00271.jpg
dsc00272.jpg dsc00275.jpg
dsc00276.jpg Trop pressé, j'ai eu la mauvaise idée de décoller les trois premiers objets quelques minutes après la fin de l'impression (j'imprimais en PLA, à froid sur de la bande de masquage), chose pas facile du tout d'ailleurs, et de constater qu'ils se sont tordu, surement sous la contrainte mécanique que j'ai exercé en tirant fortement dessus…
Pour rattraper ça, j'ai donc du jouer du décapeur thermique, et placer les objets sous presse pour leurs redonner une forme bien droite.
Pour le quatrième objet ce fut inutile, étant donné que ça ne s'est pas produit car je lui avait laissé le temps de refroidir.
Le décapeur fait ramollir très vite le plastique, il faut donc y aller mollo, et la presse doit être dosée, pour ne pas écraser l'objet, sinon les déformations pourraient se révéler très gênante, soit la surface se dégrade, et ça se voit sur les photos ou l'on y voit le plastique qui s'est affaissé sur le nid d'abeille sous l'effet de la chaleur, soit l'objet se déforme, et avec la glissière à faire passer, où les vis à rentrer, ça ne va pas être simple.

Essais :

  • Avant d'aller plus loin, j'ai procédé à un assemblage complet de tous les éléments, afin de vérifier la cohérence de l'ensemble.

dsc00268.jpg dsc00267.jpg
dsc00259.jpg dsc00258.jpg
dsc00266.jpg dsc00265.jpg dsc00264.jpg Les vis font 15mm de long et 6mm de diamètre.
C'est à ce moment là qu'on ressent la satisfaction du créateur, contemplant le bidule complexe et pourtant pas très utile, en se disant que oué, ça l'fait, les calculs étaient exact, la preuve devant soit.

Réalisation :

Les trucs imprimés c'est bien, mais l'aspect de surface n'est pas jolie.

  • De plus, forcements la jointure entre les deux parties est très visible, donc après avoir collé les deux parties à la cyanolite, allons-y pour un masticage en règle, avec du mastic standard de marque Sintofer.

Puis étape de ponçage, avec du papier abrasif 400 et de l'eau, ça évite d'avoir de la poussière partout et rend le ponçage plus doux.
dsc00280.jpg dsc00281.jpg

  • Ensuite une sous-couche blanche à la bombe avant de peindre l'ensemble à l'aérographe, avec la même peinture acrylique brillante que j'ai utilisé pour la borne, diluée au liquide vitre (oui oui, le truc bleu nettoyant).

dsc00283.jpg dsc00284.jpg

Câblage électrique :

  • L'éclairage est réalisé avec des LEDs crystal blanche qui éclaire à 1000mcd pour 3,2V@20mA.

dsc00286.jpg dsc00291.jpg

  • J'avais prévu de les disposer à la verticale, et de peindre en noir le dessus pour éviter d'éclairer le plafond, mais finalement, après essais, l'illumination rend mieux avec la LED orientée vers le centre de la boule, on arrange ça en courbant les pattes comme ceci :

dsc00299.jpg dsc00302.jpg

  • Le câblage en lui même peut être facilement calculé à l'aide de cet outil en ligne très pratique, sachant que le montage sera alimenté par le 12V provenant de la borne.

J'ai donc câblé en parallèle 3 lots de 3 LEDs en série, chacun protégés par une résistance de 120Ω.
Les câbles sont placés dans la gorge et les pattes des LEDs replié dans celle-ci, pour qu'à la fermeture de la glissière elles soient en appuie à la bonne hauteur pour éclairer la boule.
dsc00303.jpg dsc00306.jpg

Mise en situation :

  • Voila, donc on peut par exemple poser le bidule sur le dessus de la borne, et le raccorder au 12V de celle-ci.

dsc00326.jpg dsc00307.jpg dsc00324.jpg

Hop, on va allumer la lumière… Oula, ça éclaire fort, voyons ça dans le noir en réglant correctement d'exposition de l'appareil photo :
dsc00317.jpg dsc00308.jpg dsc00318.jpg dsc00319.jpg dsc00320.jpg

Note

[1] voir en annexe, ci-dessous ou sur thingiverse

Mardi, septembre 30 2014

Le poulailler connecté

Grâce à une campagne de test concernant la réduction des déchets à laquelle j'ai participé, j'ai maintenant 2 poules et un poulailler (c'est d'ailleurs le nom de la campagne : « deux poules et un poulailler pour réduire nos déchets »).
L'opération consistait à nourrir les poules avec un maximum de déchets qui finissent habituellement dans les poubelles ou au mieux dans un composteur. Plus de 6 mois se sont écoulés, l'opération est maintenant finie et je trouvais qu'il serait intéressant, et surtout amusant de mettre quelques capteurs dans le poulailler.

Cot ! Les poules

Après la brosse à dents connectée ou le produit qui va totalement révolutionner vos WC : SmartPQ, le premier rouleau de papier de toilette connecté et surfant sur cette vague de bullshit créativité, j'ai décidé de me lancer dans une première mondiale : ami des gallinacées, je vous présente le premier poulailler connecté !

Twitter @LaVieDePoule

Fonctionnalités du bestiau :

  • Prise de photos infrarouges, détection des œufs
  • Prise de température / luminosité / capteur mouvement / capteurs d'ouverture
  • Surveillance de la température, de la tension d'alimentation et du courant consommé
  • Alertes via Twitter et SMS (API Free Mobile) si certains seuils sont dépassés (température, alimentation)

Le tout est articulé autour d'un Raspberry et d'une carte fille RaspiO'Mix armée de capteurs :

  • Température de l'enceinte du poulailler
  • Température de chaque nid
  • Détecteur de mouvement IR
  • Caméra infrarouge
  • Capteur de luminosité extérieure
  • 3 capteurs sur tous les accès du poulailler (basse-cour, porte jardin et collecteur d’œufs)
  • Mesure de la tension d'alimentation et du courant consommé

2 sorties sont également pilotables et sont utilisées pour la led témoin et le relais pilotant les leds infrarouges.

Le tout en 1 image :
Vue des entrées / sorties

Le poulailler

Le poulailler fourni dispose de 2 portes et d'un collecteur d'oeufs, sur l'un des côtés disposant d'une ouverture, on vient coller une sorte de cage (à gauche sur la photo) disposant elle-même d'une ouverture permettant l'accès à une éventuelle basse-cour, dans la configuration actuelle, la seconde porte sert à faire sortir les poules directement dans le jardin (la porte devant).

Vue du poulailler

Le boitier et son logement

Afin de protéger l'électronique contre les conditions qui seront certainement rudes en pleine hiver, le tout est logé dans un boitier de répartition étanche.

Le coffret étanche

Détails techniques

Caméra

J'utilise Pi Noir (la caméra officielle de Raspberry sans le filtre infra-rouge), elle est placée face aux 2 nids et sa focale permet d'avoir une vue parfaite sur les poulettes.
Pour les photos de nuit, un relais pilote un anneau de leds infra-rouges permettant d'illuminer le poulailler afin d'y voir quelque chose et ça marche plutôt bien :

ir_0.jpg ir_1.jpg ir_2.jpg ir_3.jpg

La caméra (en noir à droite) et l'éclairage infrarouge situé à la verticale des nids
Le capteur infrarouge à gauche et la caméra Noir à droite Les leds infrarouges

Le principal intérêt de la caméra concerne la détection des œufs via OpenCV. À intervalle régulier, je prends une photo de la scène et je cherche des éventuels œufs après une succession de traitement sur l'image.

Pour le moment, la détection des œufs ne se lance pas automatiquement car j'ai encore un peu de développement à faire pour améliorer l’algorithme qui affiche pour le moment un taux de succès inférieur à 42%.

Pour pouvoir tester l'algorithme de détection, j'ai collecté des images en provenance de la caméra sur lesquelles apparaissent ou non des œufs, le nom des fichiers indique le nombre d’œufs présents (0_1.jpg signifie 1 œuf, il faut ignorer le premier numéro), ainsi, une fois l'image analysé, je peux savoir si le résultat est bon ou non, si tous les œufs de l'image ont bien été trouvés.

Un exemple d'utilisation :

$ python eggcounter.py --export=tests/export tests/with/*
Open tests/with/0_1.jpg [Ok]
Open tests/with/10_2.jpg [Error]
Open tests/with/11_1.jpg [Ok]
Open tests/with/11_2.jpg [Error]
Open tests/with/1_1.jpg [Ok]
Open tests/with/12_2.jpg [Error]
Open tests/with/13_1.jpg [Error]
Open tests/with/14_1.jpg [Error]
Open tests/with/15_1.jpg [Error]
Open tests/with/16_1.jpg [Error]
Open tests/with/2_1_highlight.jpg [Ok]
Open tests/with/3_1.jpg [Ok]
Open tests/with/5_1.jpg [Ok]
Open tests/with/6_1.jpg [Ok]
Open tests/with/7_2_highlight.jpg [Error]
Open tests/with/9_2_highlight.jpg [Error]
Result: 42% (7/16)
- Extra egg detected : 5
- Missed egg : 11
$ 

42%, ce n'est pas énorme mais c'est une partie que j'ai peu travaillé, le score ne peut donc que s'améliorer...

Notez que je lance le même test avec des images sans œuf, le résultat est meilleur (84%) mais ça signifie tout de même que j'arrive à trouver des œufs ou il n'y en a pas ;).

Enfin, je n'ai pas testé d'image depuis que l'éclairage infrarouge est installé, je pense que ça devrait grandement améliorer la détection.

Les différentes étapes de la détection
  1. On part de l'image source
  2. On applique 2 transformations (erode et dilate)
  3. Modification des niveaux (threshold)
  4. Le résultat : 1 œuf trouvé !

Tout ceci en image :
Image originale Erode / Dilate Niveaux Oeuf trouvé !

Capteur de mouvements IR

L'idée est de repérer les mouvements dans l'enceinte du poulailler afin de savoir si les poules sont dedans ou non lorsque les portes extérieures sont ouvertes.

J'utilise un capteur de type PIR HC-SR501 qui possède 3 broches, 2 d'alimentation et une de sortie. Le souci avec ce module est qu'il possède son propre régulateur 3V (à faible chute de tension), or, je l'alimente en 5V et j'ai besoin d'une tension de sortie de 5V pour un niveau haut (3V pourrait être pris un niveau indéterminé par l'adaptateur de niveau de la carte RaspiO'Mix #vécuInside, enfin, je ne souhaite pas le brancher en direct sur les IO du Raspberry), j'ai donc ajouté un petit montage avec un transistor et une résistance faisant office d’adaptateur de niveau (0V -> 5V, 3V -> 0V).

Le capteur étant assez sensible et surtout pas vraiment adapté à ce genre d'utilisation (dans un environnement aussi confiné), le logiciel gère en grande partie ces insuffisances (debouncer et compteur d'impulsions) et ça marche assez bien.

Le capteur infrarouge à gauche et la caméra RaspberryPi Noir à droite
Le capteur infrarouge à gauche et la caméra Noir à droite

Capteur de luminosité extérieure

Il est constitué d'une simple photorésistance (LDR) dont le principe de fonctionnement est une modification de la résistance à ces bornes proportionnellement à la luminosité (plus l'éclairage est fort, plus la résistance diminue).
Ce capteur permet de donner des indications sur l'heure de coucher des poules car le rythme de ces dernières est totalement calé sur celui du Soleil, d’où l'expression se coucher à l'heure des poules...

La LDR est utilisée avec un pont diviseur de tension qui attaque directement une des entrées analogiques de la carte RaspiO'Mix.

La LDR (à droite) et un capteur de température à gauche (DS1820)
La LDR (à droite) et un capteur de température à gauche

Capteur d'accès

Aux nombres de 3 et disposés sur toutes les ouvertures, ils sont simplement constitués de microswitch, à chaque changement d'état de l'entrée associée au capteur, un évènement est généré dans le code et une action est générée (Tweet, etc...), l'anti-rebond est géré du côté logiciel.

Les accès :

  • Basse court
  • Jardin entier
  • Collecteur d’œufs

Capteur d'ouverture basse-cour Capteur d'ouverture jardin Capteur d'ouverture collecteur oeufs

Mesures de tension et courant

La valeur de la tension d'entrée (environ 12V) juste avant le régulateur à découpage est présentée via un pont diviseur de tension à une des entrées analogiques du RaspiO'Mix, la seconde mesure concernant la courant consommé par le dispositif.

Le but serait d'alimenter le tout par panneau solaire, cela explique aussi la présence de ces 2 capteurs.

Les sondes de température

Le capteur de l'enceinte du poulailler est basé sur un simple LM35 connecté sur une des entrées analogiques de la carte RaspiO'Mix, au niveau logiciel, je lis très simplement cette valeur, la multiple par 100 (1 degré = 10mV) et l'affiche dans les log ou la publie sur Twitter, dans la configuration (config/general.py), il est possible de définir des seuils acceptables (3 à 32 degré C) au delà desquels une alerte est générée et un twit m'est directement adressé pour me prévenir que mes poulettes ont froid ou trop chaud...

La prise de température de chaque nid est un peu plus complexe que pour l'enceinte, la distance entre le Raspberry et les nids étant plus grande, un capteur analogique n'aurait pas été très précis, ainsi, afin d'avoir une mesure fiable, j'ai utilisé des sondes OneWire DS1820 qui autorisent de grande distance de câble sans perte de précision (et puis de toute façon, je n'avais plus d'entrées analogiques disponibles).

Ces 2 sondes n'utilisent que 2 fils (mode parasite), la masse et le tension / signal :

Screen_Shot_2014-08-13_at_14.45.41.png

Au niveau logiciel, afin de fonctionner correctement, ces sondes ont besoin des modules suivants avec les paramètres qui vont bien :

$ modprobe w1-gpio gpiopin=25 pullup=1
$ modprobe w1-therm
$ 

Une fois les modules chargés, ils vont "pouller" à intervalle régulier le bus afin de découvrir et lire les valeurs des capteurs connectés sur le bus, pour les découvrir, une petite commande suffit :

$ ls /sys/bus/w1/devices/
10-0008008ba2a9  10-0008008bceb5  w1_bus_master1
$ cat 10-0008008ba2a9/w1_slave
1b 00 4b 46 ff ff 01 10 23 : crc=23 YES
1b 00 4b 46 ff ff 01 10 23 t=13687
$ 

Le fichier w1_slave contient toutes les informations qui nous intéressent, il est à parser et c'est la fonction read_w1_temperature qui s'en occupe et pas folle la guêpe, en cas d'erreur de lecture sur le bus, une nouvelle tentative est faite...

Durant le développement, un bug dans le pilote w1 foutait la brouille sur le bus i2c et empêchait la caméra de fonctionner correctement, il n'était donc pas possible d'utiliser conjointement la caméra et les capteurs de température, si je voulais utiliser ces derniers, j'étais obligé de rebooter en activant les modules, la caméra devenant alors inaccessible, pour l'avoir, il fallait rebooter et bien entendu, ne pas charger les modules w1 (plus d'informations à propos de ce problème sur GitHub).

J'ai réglé ces problèmes avec cet ordre dans /etc/modules :

$ cat /etc/modules
# First load onewire driver before i2c module
w1-therm
w1-gpio gpiopin=25 pullup=1

i2c-bcm2078
i2c-dev
#spi-bcm2708
rtc-ds1307
#snd-bcm2835
bcm2708_wdog

cuse
$ 

Note à propos des capteurs de température des nids : en suivant leurs températures, il est possible de détecter la présence des poules sur les nids, plus pratique et précis qu'un système mécanique.

Le logiciel

C'est Python qui fait tout le travail de notifications, de surveillance, etc... J'utilise également Motion pour streamer « en live » le flux vidéo en provenance de la caméra afin de voir ce qui se passe dans le poulailler.

Pour tout le reste, c'est Python qui intervient, j'utilise, entre autre, les modules suivants :

  • OpenCV pour la recherche des œufs
  • Twython pour l'interfaçage avec Twitter

2 threads sont utilisés, un s'occupe d'envoyer les notifications dans la console, surveiller les seuils d'alertes, générer les messages et les envoyer sur Twitter et un autre thread gère les réponses aux messages qui sont adressés au compte Twitter, oui, je l'admet, mes poules n'ont pas le temps de répondre à tous les messages et un CM automatisé leur permet de vaquer à leurs occupations tranquillement !

J'ai également développé un bout de code qui permet de former des phrases de manières plus ou moins « aléatoire » afin de ne pas toujours envoyer les mêmes messages sur Twitter.

Voici un exemple d'utilisation très simple; imaginez que vous vouliez pouvoir dire bonjour à quelqu'un via l'appel à un programme mais d'une manière originale à chaque fois, par exemple :

Nous avons d'un côté "Bonjour", "Salut" et "Hello", de l'autre "toi", "l'ami" et "vous", en combinant tout ça, on obtient ces bouts de phrases :

  • Bonjour toi / Bonjour l'ami / Bonjour vous
  • Salut l'ami / Salut toi / Salut vous
  • Hello vous / Hello toi / Hello l'ami

Vous avez compris le principe, on combine plusieurs morceaux de phrases ensemble afin d'en former d'autres.

Pour automatiser ça avec ma lib, on créé un tuple de tuple ainsi :

test = (
    '{0} {1}',
    (
        ( 5, 'Bonjour'),
        ( 2, 'Salut' ),
        ( 2, 'Hello' ),
    ),
    (
        ( 1, 'toi'),
        ( 5, 'l\'ami{0}', (
            ( 1, ', il est %hour% !'),
            ( 1, '!'),
        )),
        ( 5, 'vous'),
    )
)

Notes :

  • Le premier élément du tuple '{0} {1}' est une règle de formatage "format", le second élément et le troisième correspondent aux éléments que l'on va « sélectionner aléatoirement » et venir remplacer dans dans le premier élément.
  • Le second tuple est constitué de sous tuple contenant un nombre (la pondération) et une chaine de caractère, plus la valeur de la pondération est élevée et plus la chaine de caractère associée à de chance d'être choisi.
  • Vous pouvez imbriquez autant de tuple que vous le souhaitez pour créer des phrases très complexes

Après, il suffit de faire un appel à la fonction speak avec notre tuple en paramètre et elle nous généra une phrase automagiquement.

speak(test, hour='11h')

Vous noterez au passage que vous pouvez injecter des paramètres nommés qui serviront à remplacer leur équivalent sous la forme %param% dans les chaines de caractères.

Et voici ce que ça donne :

$ python speak.py
Bonjour l'ami, il est 11h !
$ python speak.py
Bonjour vous
$ 

Si vous voulez jouer avec cette lib, vous la trouverez dans lib/speak.py.

Les pistes d'évolutions

  • Améliorer la détection des œufs
  • Générer des stats (pontes, températures, éclairage, etc...)
  • Reconnaitre chaque poule (les lier à la production d’œufs)
  • Autonomie énergétique du dispositif

Le tout est disponible sur GitHub sous une licence évidemment libre : GitHub / hugokernel / LaVieDePoule

Mercredi, septembre 24 2014

Holster pour ordi-phone

  • Comme je l'évoquais alors, me voilà avec un ordi-phone FirefoxOS et pas de poche assez grande pour le transporter en sécurité.

Les téléphones qu'on a d'abord voulu si petit pour tenir dans une poche, deviennent maintenant si gros que ça en devient ridicule, dixit l'itruc6 qui fait les frais à juste titre de pas mal de moqueries.

  • De taille raisonnable, le ZTE Open C ne rentre pourtant pas dans le compartiment prévu de mon holster, et pas question de le placer dans une poche de pantalon, avec le risque trop important d'abîmer l'écran ou de s'asseoir dessus dans le cas de la poche arrière, sans compter la perte facile de l'engin.

Maintenant que je me penche sur le sujet, je dénote que ces appareils sont plus souvent dans les mains de leurs propriétaires que rangés, et j'en viens à me demander si la grande utilisation de ceux-ci ne serait pas incitée par leur encombrement excessif, genre on ne sait pas ou le mettre, donc on l'a à la main, donc bah on l'allume et on se laisse aller…
Hum, de la à dire que ce serait une stratégie des fabricants pour pousser à la consommation de contenu, je vous laisse réfléchir la dessus…

Bien, partant de ce problème de transport, je me suis mis en quête d'une solution, d'abord en cherchant à remplacer mon holster, par un autre modèle plus adapté mais que je n'ai pas trouvé, puis je me suis laissé gagner par l'idée de modifier mon holster d'une manière relativement simple, en fabriquant un nouveau compartiment !

  • Pour référence, voici un holster, sans modifications :

dsc00176.jpg On dispose d'un compartiment portefeuille, et en dessous d'un plus petit pour le téléphone, donc trop petit pour un ordi-phone.
Une fois porté, on a donc un côté utile à droite et du côté gauche une sangle qui passe sur l'aisselle, ce qui crée un déséquilibre, car le poids des affaires à droite tire et tend à ce que la sangle colle bien sous le bras ce qui n'est ni esthétique avec un T-shirt ou une chemise un peu large, ni agréable.
Nous verrons donc que ma bidouille permet au passage de résoudre ce défaut de conception de la part du fabriquant.
dsc00180.jpg dsc00181.jpg

PatronHolster.jpg

Le patron :

  • C'est donc après quelques heures de réflexions intense et de tests à base de modèles en papier que j'ai élaboré le patron du compartiment, que voici :

Le scan est à 300dpi, donc normalement imprimable directement à l'échelle 1 sur un A4, sinon, j'ai tracé un petit centimètre de référence.

  • Sur du tissus épais type jean, j'ai tracé et découpé le rabat de fermeture deux fois et la forme principale 3 fois. L'une d'elle est tronquée, ce sera la face avant.

Le plus dur est fait, passons à la couture !

dsc00135.jpg dsc00137.jpg

Le rabat de fermeture :

  • Il s'agit de coudre la partie douce d'une bande velcro sur une des deux formes en tissus, puis de la recouvrir de la seconde et de les assembler par une couture sur la marge, c'est à dire le long du trait blanc.
  • Puis on retourne l'ouvrage comme une chaussette, et le velcro réapparaît, tandis que les coutures disparaissent à l'intérieur.

dsc00138.jpg dsc00139.jpg

  • Ensuite on va assembler et coudre le rabat sur l'une des trois formes principale, le long du trait blanc vertical, comme ceci :

dsc00141.jpg dsc00142.jpg

La face arrière :

  • J'ai ensuite disposé un chiffon micro-fibre sur ce qui constitue donc la face arrière de la pochette.

Une fois taillé, il est cousu tout le long du trait blanc.
dsc00143.jpg dsc00144.jpg

dsc00148.jpg

La face avant :

  • La bande velcro accrocheuse est cousue sur la face avant, côté extérieur donc.

  • Une fois retourné, je dispose un morceau de tapis de souris qui me restait de mon étuis pour Nintendo DSi, recouvert aussi d'un chiffon micro-fibre, assemblés avec une couture sur la marge en blanc.

Ce qui devrait donc molletonner efficacement la pochette.

dsc00145.jpg dsc00146.jpg

Assemblage :

À ce stade on peut donc disposer la face avant sur l'arrière et mettre en situation l'ordi-phone afin de vérifier la cohérence de l'ensemble.
dsc00149.jpg dsc00150.jpg
À l'aide d'épingle, les deux faces sont maintenues le long du trait blanc. dsc00151.jpg dsc00152.jpg

Maintenant, il doit rester une partie principale inusitée dont on ne saurait à priori que faire, et de se dire également qu'on cousant nos deux faces tel quel, les coutures seraient non seulement visible, mais en plus le tissus resterait ainsi sujet à l’effilochage…

  • On va donc recouvrir le tout par le dessus avec cette dernière pièce de tissu, et coudre ces trois couches d'un coup, tout le long de la marge en blanc, mais attention à ne pas coudre le rabat, ni le haut de la pochette (là ou c'est étroit) !!!

dsc00153.jpg dsc00155.jpg

  • Car et c'est là qu'est toute l'astuce, on va se servir de cet endroit pour retourner l'ouvrage façon chaussette.

C'est pas facile, mais on y arrive tranquillement…
Pour récapituler, la troisième pièce est cousue par dessus la face avant, et une fois retournée se retrouve en face arrière, les coutures liant les trois couches se retrouvant à l'intérieur de la cavité ainsi créée par les deux faces arrières… je ne sais pas si c'est très clair, mais bon…
dsc00157.jpg dsc00159.jpg
Auparavant, on aura pris soins de coudre des rabats en haut et sur le devant, comme on l’aperçoit sur la photo avec la machine à coudre, et comme on le comprendra mieux sur les photos suivantes.

Finitions :

  • La pochette est quasi terminée, mais il reste une cavité béante formée par cette troisième couche de tissus retourné qu'on a rajouté et qu'on va mettre à profit pour y glisser un peu de mousse afin de molletonner l’arrière.

Pas facile non plus à disposer, mais on y arrive, aidé si besoins de petite pinces brus-selle ou à épiler.
dsc00160.jpg dsc00161.jpg

  • Une fois en place, il reste à fermer le trou en cousant les marges repliées sur l'intérieur.

Attention à ne pas coudre les rabats de l'étape précédente ! En effet, à cet emplacement doit passer la sangle du holster, comme en attestent les clichés de la dernière étape.
dsc00162.jpg dsc00163.jpg
dsc00164.jpg dsc00165.jpg

Mise en place sur le holster :

  • Il reste donc à faire passer la sangle depuis le haut jusque devant, à l'intérieur de la cavité ou siège la mousse.

Le nouveau compartiment peut coulisser sur la sangle pour être ajusté comme on veut.
dsc00168.jpg dsc00170.jpg dsc00173.jpg dsc00174.jpg

  • Et donc comme je l'évoquais, avec ce nouveau compartiment à gauche, le holster s'en trouve équilibré et la sangle ne vient plus serrer sous le bras :)

dsc00182.jpg dsc00184.jpg dsc00185.jpg dsc00186.jpg

  • Voilà un ordi-phone bien protégé dans son compartiment molletonné, à portée de la main, et pratique avec le chiffon micro-fibre qui nettoie l'écran à chaque rangement.

Seul regret, j'aurais dû molletonner un peu aussi le rabat de fermeture pour mieux protéger la tranche.

- page 1 de 40