Lundi, août 15 2016

Flower Power

Bonjour les gens !

Cela fait longtemps que je voulais tenter de faire une lampe connectée contrôlée par une appli Androïd. Le but est d'apprendre à connecter un microcontrôleur en wifi et de concevoir le pendant Androïd afin de contrôler la lampe. L'inspiration est multiple, comme par exemple les lampes Phillips LivingColors. J'avais donc en tête de faire une lampe en bois en forme de fleur, avec des LEDs contrôlables à l'intérieur.

A partir de là, tout reste à faire.... J'ai commencé par choisir le contrôleur dans la lampe et le modèle de connexion avec le téléphone. Bon, tout d'abord, je ne voulais pas mettre un Raspberry Pi dans la lampe, faut pas déconner. Ensuite, j'avais le choix entre bluetooth et WIFI mais là je n'avais pas d'a priori. En cherchant sur Instructable, je suis tombé sur une API REST (Protocole Réseau) sur puce ESP8266. Cette API me permet de connecter le module à un WIFI local et d'être interrogeable par requête GET afin d'interagir avec l'appli Androïd. Du coup, le coeur et le mode de transmission sont choisis : NodeMCU en WIFI. L'avantage du NodeMCU par rapport à une puce ESP8266 seule est que la gestion de l'alimentation et de chargement du code sont gérés. En achetant en Chine, j'ai eu mes NodeMCU à 4 euros pièce, ce qui me convient.

Afin de simplifier la gestion des LEDs, je suis parti pour une bande de LED 5050 RGB. Récapitulons l'électronique : tout part d'une alimentation 12v nécessaire pour les LEDs, ensuite on trouve un step down à 5v pour le NodeMCU, puis le NodeMCU sort en PWM sur 3 MOSFET afin de contrôler l'intensité des 3 couleurs. Le montage total est des plus simples mais j'ai eu un petit souci dans mes connexions : il n'y a aucune correspondance entre les noms sur la board et les numéros des PINs dans l'IDE d'Arduino. Vive la galère... Obligé d'aller chercher les plans de la board... Mais bon, une fois qu'on a compris que c'est ça le problème, tout va bien :). Le code de l'ESP est très simple : 3 fonctions qui contrôlent chacune une sortie et le lien dans l'API pour répondre aux requêtes "blue", "green" et "red".

Voilà ce que ça donne en photo.

électronique

N'ayant jamais programmé une application Androïd, j'ai cherché comment en faire une simplement. Je suis tombé sur le Web IDE du MIT APP Inventer 2, j'ai essayé et j'ai plutôt aimé. J'ai réussi à faire mon application en quelques heures et j'en suis très content. La programmation en mode bloc est frustrante de temps en temps et le plus dur est de trouver où se trouve le bloc nécessaire, mais globalement c'est plutôt sympa. J'ai réalisé une vue principale pour l'ajustement de couleur avec deux boutons ("night" et "day") pour mettre tout à zéro ou tout à fond. Une vue secondaire est montrée lorsqu'il y a une erreur de connexion et elle renvoie à la vue principale lorsqu'il n'y a plus de problème.

Voilà les deux vues.

vue1 vue2

Enfin, le design de la lampe. J'avais en tête de faire 8 pétales autour d'une structure et le tout en bois. J'ai tout designé de tête et du coup j'ai du faire deux itérations (ou quatre) sur les pétales. La structure est assez simple et je vous propose des photos pour voir le résultat (il n'y a que du MDF de 3mm).

structure premierpetale premierpetale2 tout tout2 tout3 tout4

Assembler l'ensemble est simple. On jette tout dedans et un jack au fond pour l'alimentation et voilà. J'ai tout de même placé un croisillon de soutien pour les LEDs.

accroche

Alors tout ensemble, ça donne ça. :)

fini fini2

Pour donner un look plus fini, j'ai découpé une plaque de plexiglass que j'ai poncée pour créer un diffuseur.

diffuseur

Je suis content du résultat. Il faudrait quand même perfectionner les pétales intérieurs, un poil trop grands.

Merci d'être arrivés jusqu'ici :), si vous voulez des fichiers, faites signe dans les commentaires.

Bonne bidouille à tous

Un Raspberry Pi 2 en MediaCenter

dsc00067.jpg

  • Avec l’avènement du Raspberry Pi2, mon vieux médiacenter, lui-même PC recyclé (P4@2,66GHz) fait pas mal grise mine…

Incapable de lire des vidéo h264 qui dépasse le 720p, bruyant, énergivore (environ 80W), couplé à un vieux poste de télévision cathodique qui consomme aussi pas mal (environ 90Watt continu).
Utiliser un RpiPi2 (moins de 5W) donc me permettrait de laisser de côté tous ces inconvénients, cependant j'avais besoin d'une prise HDMI et c'est après avoir récupéré un vieux poste de télévision LCD (HD Ready, 720p et 1080i max, tuner mpeg2 obsolète, 50W en mode éco) que j'ai envisagé de changer mon système de médiacenter.

Entre temps, bonne nouvelle, plus besoin de bidouiller, ma clé wifi TP-Link est désormais reconnue par le kernel des derniers système GNU/Linux désigné pour RpiPi !

  • Voici donc l'histoire d'une migration, ou plutôt d'une lente progression…

1 - Choix du système d'exploitation :

À ma connaissance il y a deux possibilités, utiliser Raspbian Lite et à la main installer le logiciel médiacenter Kodi et tout le reste; Ou alors utiliser une distribution dédiée telle que Openelec ou RaspBMC. La première solution serait calquée sur ma démarche avec l'ancien médiacenter, mais puisqu'on me dit qu'Openelec offrirait de bien meilleures, j'ai donc choisis cette dernière…
Et après une semaine à m'échiner à faire fonctionner le truc, j'ai lâché l'affaire…
Pourtant j'avais réussis à tout faire fonctionner, télécommande, récup de la base, tout ça… sauf une chose, le partage réseau !
Avec ma config je n'ai pas le choix, je suis obligé de passer par un partage ssh, soit en sftp depuis l'interface de Kodi, qui s'évertue à monter ce partage en lecture seule…
Impossible de me rabattre sur le NFS, car mon stockage est chiffré, et NFS ne fonctionne donc pas.
Openelec étant verrouillée de partout, impossible d'installer un soft ou même d'écrire sur le disque, afin de monter un partage sshfs… Merci pour le temps perdu, au revoir !

Donc Raspbian Lite :) Ça je connais, et on va tout faire à la main, quoi de mieux que d'être servis par soit même !??

2 - Installer le Raspbian Lite :

Il existe actuellement 2016-05-10-raspbian-jessie-lite.zip, une version qui est entièrement en ligne de commande, sans environnement de bureau, donc très légère, idéale pour une petite carte SD (environ 800Mio une fois installé)

  • Déployer l'image sur une carte SD depuis un système GNU/Linux, avec la commande DD

(attention, of=/dev/sdx à adapter pour la cible de votre carte SD, en cas d'erreur risque d'effacement d'un disque dur non désiré)

dd bs=4M if=2016-05-10-raspbian-jessie-lite.img of=/dev/sdx; sync
  • Placer la carte SD dans le Raspberry, et le mettre sous tension.

Exécuter raspi-config, et configurer tous les trucs comme on veut, notamment les variables locales (time zone, clavier, etc), et très important, le mémory split pour allouer 512Mo au GPU, sans quoi impossible de lire de la HD 1080 !

raspi-config

Après le reboot, pour rappel :

Login : pi
Pass : raspberry

  • Effectuer les mises à jour :
sudo apt-get install rpi-update
sudo rpi-update
sudo apt-get update
sudo apt-get upgrade
  • Mettre les fichiers temporaires en ram pour économiser sur la durée de vie la la carte SD.
sudo nano /etc/fstab
tmpfs      /tmp		tmpfs	defaults,size=256M	0    0
tmpfs      /var/tmp	tmpfs	defaults,size=256M	0    0
tmpfs      /var/lock	tmpfs	defaults,size=256M	0    0
  • Editer le fichier /etc/network/interfaces et modifier comme suit la section wlan0 :
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "le nom du réseau wi-fi"
wpa-psk "le mot de passe du réseau wi-fi"
  • Relancer ensuite le réseau avec la commande :
service networking restart



3 - Installer Kodi :

sudo apt-get install kodi

Pour lancer Kodi il suffit de taper son nom depuis la console.
Si on veut que Kodi se lance au démarrage du RpiPi2, on peut éditer le fichier /etc/default/kodi, et le renseigner comme suit :

# Set this to 1 to enable startup
ENABLED=1

# The user to run Kodi as
USER=pi

# Adjust niceness of Kodi (decrease for higher priority)
NICE=-5

Sauf que… Pour une raison que j'ignore, une fois le RpiPi2 redémarré, Kodi doit se trouver dans un profil incomplet, car par exemple, son menu d'arrêt ne comporte qu'une seule entrée (exit), au lieu des 3 ou 4 habituelles (exit, reboot, shutdown…)
Ça c'est pas cool, surtout quand on constate qu'en lançant Kodi manuellement ce menu se retrouve bel et bien complet !
Encore un truc pas sec… alors on va faire les choses autrement !

  • On va configurer le login automatique de l'utilisateur sur le RpiPi2[1] en créant un autologin dans systemd :
sudo nano  /etc/systemd/system/getty@tty1.service.d/autologin.conf
  • Le remplir avec ceci :
# Systemd : logue automatiquement la console tty1 avec l utilisateur arcade
[service]
ExecStart=
ExecStart=-/sbin/agetty --autologin arcade --noclear %I 38400 linux
  • Puis enfin lancer ces deux commandes :
sudo systemctl enable getty@tty1.service
sudo sed -i -e "s/sbin\/agetty/sbin\/agetty -a arcade/g" /etc/systemd/system/getty.target.wants/getty@tty1.service
  • Au redémarrage du RpiPi2 plus besoin de se loguer, reste donc à lancer Kodi en éditant le fichier .profile :
nano ~/.profile
  • Et ajouter les lignes suivantes à la fin :
tty=`tty`
# Start Kodi only if login in tty1
if [ $tty = '/dev/tty1' ]; then
        kodi
fi



4 - Montage automatique du partage réseau ssh :

On va utiliser simplement le fstab, et s'arranger pour que le mot de passe ssh ne soit pas demandé.

  • Installation de sshfs :
sudo apt-get instal sshfs
  • Création d'une paire de clés publiques/privées pour l'utilisateur sur le client (le RpiPi2) :

fstab est géré par l'utilisateur root, c'est donc des cléf de celui-ci dont on a va avoir besoin, pour spécifier cela on utilise sudo :

sudo ssh-keygen -t dsa

Laisser le chemin par défaut (/root/.ssh/id_dsa) et laisser la demande de passphrase vide.

  • Copier ensuite la clé publique sur le serveur (la machine ou se trouve le stockage) :
sudo ssh-copy-id -i /root/.ssh/id_dsa.pub -p N°-de-port MONLOGIN@IP-du-serveur
  • Éditer le fstab :
sudo nano /etc/fstab
  • Et ajouter cette ligne :
sshfs#MONLOGIN@IP-du-serveu:/répertoire/distant    /hone/pi/video    fuse    port=N°-de-port,user,noatime,allow_other,_netdev    0    0
  • Ne pas oublier le créer le dossier ~/video :
mkdir /home/pi/video

Et vérifier en montant le contenu de fstab :

sudo mount -a



infrarougeRPI_bb.png

5 - La télécommande infra-rouge :

Jusqu'à présent j'utilisais une télécommande de récupération, couplée à un récepteur infra-rouge connecté sur une entrée de la carte son d'un vieux PC.
Je me suis dit, cette fois-ci, on va utiliser les nouvelles techno, et grâce au HDMI CEC je vais pouvoir piloter le médiacenter exécuté sur le RpiPi2, avec la télécommande de la TV !
Mais en fait non, le téléviseur n'est pas compatible avec cette norme, il faut donc passer par un récepteur infrarouge connecté sur un GPIO. Ici j'ai câblé le GPI018.

  • Installer le soft de gestion de l'infrarouge :
sudo apt-get install lirc
  • Éditer hardware.conf pour régler les paramètres de LIRC :
sudo nano /etc/lirc/hardware.conf
  • Faire correspondre le contenu à ceci :
########################################################
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"
# Don't start lircmd even if there seems to be a good config file
# START_LIRCMD=false
# Don't start irexec, even if a good config file seems to exist.
# START_IREXEC=false
#Try to load appropriate kernel modules
LOAD_MODULES=true
# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
########################################################
  • Activer le module sur le RpiPi2 en éditant config.txt
sudo nano /boot/config.txt
  • Dé-commenter la ligne (sans autre argument, c'est le GPIO18 qui sera écouté par le module, sinon pour par exemple le GPIO23, on indiquera dtoverlay=lirc-rpi,gpio_in_pin=23) et redémarrer le RpiPi2.
dtoverlay=lirc-rpi
  • Pour tester si les commandes infrarouge sont bien reçues :
sudo killall lircd
sudo mode2 -d /dev/lirc0
  • À chaque appuie sur une touche de la télécommande, devrait s'afficher ce genre de truc :
space 1223
pulse 281
space 1193
pulse 350
space 1199
pulse 264
space 1901
  • Bien, maintenant on va identifier la télécommande et associer chacun de ses boutons à une touche du clavier. Le programme va demander d'appuyer anarchiquement sur toutes les touches, puis de nommer les touches une à une. La syntaxe à respecter pour les noms est disponible en exécutant :
irrecord --list-namespace

Il est temps de procéder :

sudo irrecord -d /dev/lirc0 /etc/lirc/lircd.conf

J'ai choisis ces touches du clavier, qui correspondent aux raccourcis clavier les plus utile de Kodi, pour la simple raison que ça fonctionnera directement ! Pas la peine de configurer quoi que ce soit dans Kodi !

KEY_Up
KEY_Down
KEY_Right
KEY_Left
KEY_Enter
KEY_C (click droit)
KEY_PageUp
KEY_Esc (retour menu principal)
KEY_Back (retour menu précédent)
KEY_Rewind
KEY_Stop
KEY_PlayPause
KEY_FastForward

  • Reste à redémarrer le service LIRC
sudo /etc/init.d/lirc restart
  • Un moyen simple de savoir si ça marche, c'est de simplement appuyer sur les touches de la télécommande, ça devrait agir dans la console GNU/Linux !

Par exemple la touche correspondant à KEY_C affichera le caractère C, normal quoi, puisque LIRC permet ainsi d'assigner l'entièreté des touches du clavier, et plus encore.
Voici le contenu de lircd.conf, il est toujours temps de le modifier au besoin !

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.1-git(default) on Wed Jul 20 22:41:05 2016
#
# contributed by
#
# brand:                       lircd.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

  name  lircd.conf
  bits           15
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  one           304  1799
  zero          304   746
  ptrail        304
  gap          66906
  toggle_bit_mask 0x0

      begin codes
          KEY_Up                    0x43AA 0x4055
          KEY_Down                    0x4012 0x43ED
          KEY_Right                    0x406E 0x4391
          KEY_Left                    0x43AE 0x4051
          KEY_Enter                    0x412A 0x42D5
          KEY_C               0x42BE 0x4141
          KEY_PageUp                    0x409E 0x4361
          KEY_Esc                    0x4072 0x438D
          KEY_Back                    0x3ECE 0x3D31
          KEY_Rewind                    0x404A 0x43B5
          KEY_Stop                    0x424A 0x41B5
          KEY_PlayPause                    0x414A 0x42B5
          KEY_FastForward                    0x434A 0x40B5
      end codes

end remote

Au lancement de Kodi la télécommande devrait fonctionner Si ce n'est pas le cas, ressortir et vérifier que le processus lircd tourne bien.

ps -A | grep lirc



6 - Migration de base de données :

  • Toute la configuration de Kodi est bien rangée dans le dossier caché .kodi dans le home de l'utilisateur.

J'ai donc récupéré le dossier de mon ancien médiacenter afin de le copier sur le nouveau.
Oké donc après redémarrage du RpiPi2, j'ajoute ma source de vidéos, je navigue avec ma télécommande parmi les fichiers média, et … haaaa mais non, où sont passés les status lu/non-lu des fichiers ??? Tout est vierge !
Le dossier .kodi/userdata/Databases est pourtant bien en place…
Ho, une nouvelle base MyVideo93.db a été crée, la mienne MyVideo99.db a été ignorée semble t'il !
Qu'à cela ne tienne, je renomme la mienne en MyVideo93.db :)
Toujours rien, et cette fois le message d'erreur suivant apparait dans le log Kodi : .kodi/temp/kodi.log

10:51:06 9.596940 T:1967722496 ERROR: Can't open the database MyVideos93 as it is a NEWER version than what we were expecting?

Après beaucoup de temps à trifouiller la configuration de Kodi, j'ai fini par comprendre le truc…
Les bases utilisées par Kodi (par défaut des bases SQLite, extention .db stockée dans .kodi/userdata/Databases) sont incompatible pour la simple raison que le Kodi du vieux PC Pentium4 est plus récent (KODI 16.0) que celui du RpiPi2 (KODI 15).
Impossible de downgrader, me voilà bien embêté…

  • Pour résumer en une ligne : Sur le vieux PC médiacenter la base en V16 stokée dans ~/.kodi/userdata/Database/MyVideo99.db est incompatible avec la base sur le RpiPi2 en V15 stokée dans ~/.kodi/userdata/Database/MyVideo93.db.
  • Je veux pourtant récupérer les données de cette base, surtout les fichier lu/non-lu, alors j'ai procédé ainsi :
  • Installer les outils sur un ordinateur :
sudo apt install sqlite3 sqlitebrowser
  • Ouvrir la base en V16 (celle qui contient les données) : MyVideo99.db
sqlite3 MyVideos99.db
  • Dumper une à une les tables depuis SQLite en format SQL pour sauvegarder la structure.

Première commande, rediriger la sortie vers un fichier puis dumper la table depuis SQLite :

sqlite> .output bookmark.sql
  • Seconde commande, dumper :
sqlite> .dump bookmark
  • Faire de même pour les tables : files, path, settings, streamdetails.

On a donc sous la main les fichiers : bookmark.sql, files.sql, path.sql, settings.sql, streamdetails.sql.

  • À la fin on quitte :
sqlite> .quit
  • Ensuite on va importer ces données dans la base en V15 : MyVideo93.db

Ouvrir la base :

sqlite3 MyVideos93.db
  • Tout d'abord effacez la table de la base:
sqlite> drop table bookmark;
  • Puis lire le fichier sauvegardé:
sqlite> .read bookmark.sql
  • Pour vérifier que la table s'est bien importée.
sqlite> select * from bookmark;

Faire de même pour les tables : files, path, settings, streamdetails.

  • À la fin on quitte :
sqlite> .quit

Ok, mais ce n'est pas tout, car une fois la base MyVideo93.db mise en place sur le RpiPi2, toujours rien dans le dossier des vidéos, les status lu/non-lu ne remontent pas…
J'ai fini par comprendre qu'il s'agissait d'un problème avec les chemins utilisés sur l'ancien PC médiacenter qui étaient bien différents sur le nouveau RpiPi2, et que donc il fallait le mettre en conformité avec ce dernier dans la table path.
Sur la base MyVideo93.db, le seul path qui apparaissait était donc : /home/makoto/video/

  • Il suffirait de remplacer tout les anciens path par ce nouveau.

On peut le faire à la main avec le logiciel sqlitebrowser, ou alors par la ligne de commande :

sqlite3 MyVideos93.db
  • La commande va rechercher/remplacer le chemin /home/makoto/video/ par le nouveau !
UPDATE path SET strPath = REPLACE(strPath,'/home/makoto/video', '/home/pi/video');
  • À la fin on quitte
sqlite> .quit

Voilà c'est terminé, une fois la base rangée sur le RpiPi2 à sa place .kodi/userdata/Database/MyVideos93.db je constate que les status lu/non-lu sont tous présents :) Ouf !!!

Ressources :

http://blog.dorian-depriester.fr/linux/raspberry/utiliser-une-telecommande-infrarouge-pour-controler-xbmc
http://kodi.wiki/view/Keymaps
http://kodi.wiki/view/LIRC
http://wiki.openelec.tv/index.php/Guide_To_lirc_rpi_GPIO_Receiver
http://bornslacker.com/raspberry-pi-with-openelec-part-2/
https://anderson69s.com/2015/08/04/raspberry-pi-dupliquer-sa-telecommande-ir/
http://info.geekitude.fr/kodi/accueil
http://www.geekmag.fr/kodi-deplacer-le-profil-et-ses-donnees/
https://doc.ubuntu-fr.org/sqlite#inserer_des_valeurs_dans_la_table
http://kodi.wiki/view/HOW-TO:Update_SQL_databases_when_files_move

Note

[1] Note : je n'ai pas testé le login automatique via « raspi-config »

Lundi, août 1 2016

Un porte livre, pour lire allongé sur le dos, sans les mains :)

dsc01440.jpg

  • Qui n'a jamais trouvé pénible de lire allongé en sentant ses bras s'engourdir peu à peu, jusqu'à la limite du supportable ?

Suffirait de ne pas lire allongé, mais il est des moments ou des lieux où l'on a vraiment l'envie de s'affaler complètement… Sous le parasol à la plage, au lit, ou au fond du jardin !
L'idée d'un support pour poser le livre était là, et c'est à quatre mains qu'elle a d'abord murit avant de voir le jour.

L'outil impression 3D :

  • Une fois le concept bien réfléchit, à savoir un support léger et pliant, en forme d'un toit de 140° et réglable dans la hauteur, il restait alors à imaginer comment articuler tout ça…

J'ai alors modélisé des pièces avec Sketchup avant de les imprimer.
dsc01441.jpg Quelques trois prototypes plus tard, la charnière était prête, d'un genre nouveau pour moi car les deux parties mobiles sont imprimées encastrées en une seule fois ! Il suffit donc de forcer un peu sur le gond pour le sentir céder, et devenir un véritable pivot.

  • Ça évite d'utiliser une pièce supplémentaire pour réaliser le pivot des deux parties mobile, et c'est vraiment très intéressant de pouvoir créer ce genre d'articulation « pré-imprimée » !

dsc01444.jpg dsc01445.jpg dsc01448.jpg dsc01449.jpg

Matériel :

  • Après avoir réfléchis aux dimension que pourrait avoir l'engin, restait à rassembler les éléments nécessaire du kit, à savoir :

- Une planche de MDF de 80x60x0,3 cm
- Une plaque de plaque de verre synthétique de 50x25x0.4 cm
- 24 boulons de 10 mm, diamètre 4 mm. (Je rappelle qu'un boulon c'est le couple vis + écrou ;))
- 4 boulons de 15 mm, diamètre 4 mm.
- 4 boulons de 25 mm, diamètre 4 mm.
- Les pièces imprimées, à télécharger ici : http://www.thingiverse.com/thing:1636131


Réalisation :

  • Voici les dimensions des éléments que nous avons choisi :

PorteLivreFinal3_montage.png

  • Concernant le verre synthétique,

2 carrés de 25x25 cm pour faire le toit.

  • Concernant le MDF,

4 carrés de 25x26,5 cm pour constituer les côtés et les rehausses.
1 rectangle de 26,5x45,5 cm pour former le fond.

dsc01485.jpg Le découpage de la planche de MDF peut aisément se faire en plusieurs passe au cutter. À condition de prendre les précautions d'usage au maniement de l'outil, l'avantage certain et que c'est silencieux et ne crée aucunes poussières !

La découpe du verre synthétique se fait également au cutter, après avoir bien marqué le plastique en plusieurs passe, il suffit de le contraindre pour le plier net, et de le voir casser proprement à l'endroit prévu.

Ensuite j'ai simplement mis en place les pièces imprimées et procédé au perçage afin d'assembler le kit tranquillement…

  • Reste ensuite le plus relou, car les vis sont trop longue pour permettre au charnière de se rabattre complètement; Il faut donc les couper une à une…

J'ai fait ceci avec un étaux et une scie à métaux. Cependant une mini-perceuse équipée d'un disque à tronçonner m'aurait bien facilité la tâche !

L'objet :

  • Une fois sorti du sac, il suffit d'ouvrir les côté, et de placer le toit dans les clips… et c'est tout :)

dsc01500.jpg dsc01498.jpg

  • Au besoin il est possible de rehausser le toit afin d'adapter la distance du livre à sa vision.

dsc01497.jpg dsc01496.jpg dsc01489.jpg dsc01490.jpg

  • J'ai donc collé la pièce hexagonale sur le MDF, c'est ainsi bien pratique pour serrer facilement la rehausse avec la molette.

dsc01494.jpg dsc01493.jpg
Je n'ai pas été très malin en plaçant une des molettes en plein sur le passage du rabat, ce qui fait qu'on ne peut pas replier complètement à plat le porte livre, mais bon…

  • Voilà… Tu t'allonges la tête là dessous, et tu fais gaffe à ne pas t'endormir…

Wé parce que c'est peut-être les vacances là, mais t'es censé lire à la base quand même ;)
dsc01503.jpg dsc01507.jpg

Jeudi, juillet 28 2016

Le bartop, la borne d'arcade pour demi-portions ! -04-

dsc01247.jpg Suite de l'étude précédente :

  • Refonte de mon tuto précédent, je propose ici une méthode d'installation rapide et simple d'un système Arcade fonctionnel sur écran informatique, avec AdvanceMenu et mame64 bits version 0.161.

Ce système pèse environ 1,4Gio, sans superflu, il démarre très vite, idéal pour être utilisé en borne, sans clavier ni souris.


Prérequis :

- Un Bartop avec son écran LCD 4/3 (oui c'est le mâââl, mais c'est ici le concept…).
- L'image iso de debian 8 netinstall depuis debian.org.
- L'archive d'installation ArcadeDebian8Install-Bartop64bits que j'ai scripté.
- Une connexion internet.
- Un ordinateur 64 bits.



Installation du système d'exploitation :

  • Générer une clé USB bootable depuis l'image iso avec la commande dd.

sdX correspondant à la clé cible, attention à ne pas se tromper !

sudo dd if=debian-8.4.0-amd64-netinst.iso of=/dev/sdX bs=4M; sync
  • Démarrer l'ordi 64bits sur la clé, et suivre les instructions d'installation.

Pour simplifier les choses et permettre la configuration correcte de l'étape d'installation Arcade, indiquer ceci à l'installeur :

- Mot de passe root : arcade
- Nom d'utilisateur : arcade
- Mot de passe utilisateur : arcade

Partitionner de préférence :

- Une première partition de 2Gio minimum, point de montage racine /
- Une seconde partition pour stocker, point de montage /home

À l'étape d'installation des packets, lorsque la question sera posée, décocher :

- environnement de bureau debian
- serveur d'impression


Installation du système Arcade :

Cette étape va permettre d'installer ceci :

- Le minimum requis du serveur graphique Xorg et sonore Alsa.
- AdvanceMenu 2.8.
- L'ensemble des fichiers de configurations (xorg.conf@640x480, mame.ini, advmenu.rc, hiscore.dat…) et quelques scripts de commandes utiles à AdvanceMenu.
- Mame 64 bits 0.161[1] patché Hiscore et nonag screen.


tar xvf ArcadeDebian8Install-Bartop64bits.tar.gz
  • Se placer dans le dossier ArcadeDebian8Install-Bartop64bits :
cd ArcadeDebian8Install-Bartop64bits
  • Se loguer en root :
su
  • Exécuter le script d'installation :
./install-Bartop.sh

Aller se promener, plus ou moins longtemps selon la puissance de l'ordinateur et du débit internet…

  • À la fin, sera affiché la page de configuration Alsa, régler alors les barres-graph de volume comme souhaité, et frapper la touche échap pour sortir, l'ordinateur va redémarrer…

AdvanceMenu est un peu long à démarrer la première fois, c'est normal et dû à la création d'un fichier de config xml


Fonctionnalités :

Voir aussi la démo vidéo.

- Presser une fois le bouton power de l'ordi et le système s'éteindra proprement en 5 à 10 secondes.

Via AdvanceMenu,

- Possibilité par le menu Command de passer en TATE ou en YOKO
- Possibilité par le menu Command d'effacer les Hiscores du jeu sélectionné.
- Possibilité par le menu Command de copier de nouvelles roms depuis une cléUSB contenant les dossiers RomTATE et/ou RomYOKO remplis de roms version 0.161.
- Possibilité par le menu Command de copier sur une cléUSB (en fat et fat32) les fichiers de sauvegardes des parties jouées (fichier inp).
- Possibilité par le menu Command de rebooter la borne.

  • Pour info, les roms sont stockées dans ./advance/RomTATE (jeux verticaux) et ./advance/RomYOKO (jeux horizontaux)
  • Pour avoir des vignettes dans AdvanceMenu, il faudra remplir les dossiers ./advance/snap et ./advance/titles.

Le mot de la fin :

La confection d'un LiveCD/USB avec installeur complet, est à l'étude…

À suivre…

Note

[1] Vous trouverez les jeux dans un torrent contenant l'intégralité des roms compatibles avec cette version est disponible sur archive.org

Lundi, juillet 25 2016

Un porte outil pour MultiTool Leatherman en 5 min

Les multitools leatherman acceptent des embouts de tournevis dans un format spécial. Ils ne sont pas donnés et le tournevis ainsi formé est très court ce qui est peu pratique dans certains cas.

IMG_20160709_161435On trouve des portes embouts « classiques » permettant d’utiliser les embouts hexagonaux standards.

Capture d’écran_2016-07-25_14-57-59

Mais 20€ dans un accessoire aussi simple c’est un peu exagéré. On va s’en fabriquer un en quelques minutes avec un porte embout standard qui traînait dans un tiroir.

IMG_20160709_161429Avec un coup de meuleuse d’angle on va meuler deux bords opposés pour qu’il soit utilisable dans le leatherman

IMG_20160709_161440IMG_20160709_161720Et voilà, il n’y a plus qu’à l’insérer dans le leatherman

IMG_20160709_161729Avec un embout nous voilà en possession d’un vrai tournevis.

IMG_20160709_161739

Aussi bien que l’accessoire original !

 

Mercredi, juillet 13 2016

[DIY] Cat-Hunter, l’anti pisse

Quand on aime pas les chats il faut savoir s’en débarrasser ! Depuis mon déménagement (au rez de chaussée) un chat a déjà pissé plusieurs fois sur nos rideaux par la fenêtre !

Les répulsifs sous formes de granules odorantes (gerbantes !) n’ont pas l’air des plus efficaces, après moultes réflexions de plusieurs personnes l’idée d’un « psssshhhttt » automatisé fit son chemin.

Dans l’urgence, j’en ai acheté un sur Amazon, il s’agit basiquement d’une bombe d’air sec avec un déclencheur utilisant un PIR, dans le même temps j’ai commencé à fabriquer mon propre dispositif. L’idée de base est d’utiliser un désodorisant à chiotte automatique.

sense spray naked3

Plusieurs problèmes se posent, dans un premier temps le détecteur est au niveau du bouton (à la perpendiculaire du spray) et lors de déclenchements successifs il y a un temps d’attente de plusieurs minutes….

Commençons la charcuterie… On enlève toute l’électronique embarquée pour la remplacer et on gardera le moteur et la structure en plastique.

IMG_20160708_012235

La carte que j’ai prévu utilise un pic12f675 avec un mosfet 7n7002 et un PIR de Panasonic EKMB.

cat_hunter

IMG_20160712_005022

Le système marche correctement, reste plus qu’a voir son efficacité au prochain passage de cette saleté de chat !

IMG_20160713_004210

J’ai déporté le capteur PIR dans une boite de pellicule (oui oui j’utilise encore de la pellicule !) et je l’ai couvert avec un PAD de BMX qui trainait dans un coin. (il faut que je trouve un moyen de désactiver le système je n’ai pas mit de bouton et ça pu le jasmin Brise(r) chez moi !).

IMG_20160713_201524

#include <pic12f675.h>
#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ 4000000

#define MOTOR GPIObits.GP5
#define PIR GPIObits.GP2

#pragma config FOSC = INTRCIO
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF
#pragma config BOREN = OFF
#pragma config CP = OFF
#pragma config CPD = OFF

uint8_t pir_detected = 0;

void main() {
TRISIObits.TRISIO5 = 0; // GP5 = Output for motor
TRISIObits.TRISIO2 = 1;
ANSEL = 0;
MOTOR = 0;

// Enable interrupt on change
INTCONbits.GIE = 1;
INTCONbits.GPIE = 1;
IOCbits.IOC2 = 1;

while(1) {
SLEEP();
if(pir_detected == 1) {
MOTOR = 1;
__delay_ms(500);
MOTOR = 0;
pir_detected = 0;
__delay_ms(1000);
__delay_ms(1000);
__delay_ms(1000);
}
}
}

void interrupt isr(void) {
uint8_t tmp = 0;
if(INTCONbits.GPIF == 1) {
pir_detected = 1;
tmp = GPIObits.GP2;
INTCONbits.GPIF = 0;
}
}

Classé dans:Astuce / Tips, Divers, DIY, Electronique

Dimanche, juillet 10 2016

Une table en acier et bois (Douglas) pour le jardin

Il me restait quelques planches de Douglas après la pose du bardage sur la maison. Pourquoi ne pas en faire une table ?

Je vais faire un cadre en acier mécano soudé avec un dessus en planches de douglas.

L’acier est acheté chez en revendeur pro (Rubion). Le cadre est en 80×40 et les pieds en 60×60. La table fait une dimension de 1800×800. Le coût d’achat est d’environ 100€ d’acier + le bois et la peinture que je possède déjà.

Le cadreLe cadre est soudé avec un petit poste inverter GYS GYSMI 80p (soudure à l’électrode enrobée)

IMG_20160618_161518Les soudures sont meulées et le cadre peint avec une peinture métal pour extérieur. Des bouchons plastiques ferment les pieds en haut et en bas pour éviter la rouille sur les parties non peintes.

IMG_20160706_080649

Voici la fabrication de la table en vidéo:

 

 

 

 

 

Vendredi, juin 24 2016

Le niveau de précision du pauvre

Voilà, ça y est, mon tour est posé sur sa dalle, je peux enfin l’utiliser. Pour maximiser sa précision, il est vivement recommandé de le mettre de niveau. Pour se faire, point de niveau de maçonnerie, il faut utiliser un niveau de précision, précision de l’ordre de 0,01mm/m.

Sauf que c’est pas complètement donné, surtout pour un équipement qui servira 2 fois dans l’année maximum. En y réfléchissant un peu, il est possible d’obtenir une bonne précision avec un niveau laser. Alors d’accord, un niveau laser, c’est pas non plus donné (pour un correct j’entends), mais au moins ça peut servir pour tous les autres travaux, et c’est facile d’en trouver en prêt chez les copains.

L’idée, c’est de se servir d’un miroir (ou de plusieurs) comme d’amplificateurs d’erreurs. Un petit schéma étant plus parlant qu’un long discours, voici la procédure que j’ai suivi :

niveau_laser

Mesure de précision avec un niveau laser

Il faut partir du principe que le faisceau est parfaitement vertical (normalement vrai pour un niveau de bonne facture, et dans tous les cas, ça se vérifie facilement). Le faisceau sort du niveau avec un angle, de manière à tracer une ligne verticale sur le mur d’en face. Il se reflète sur le miroir qui est posé sur la surface à régler. Si la surface n’est pas parfaitement de niveau, le faisceau réfléchi aura un décalage, et une seconde ligne apparaîtra sur le mur d’en face. Quand les deux lignes superposées sont confondues, c’est que l’on est de niveau… pour une direction. Reste ensuite à faire de même pour l’autre direction, et revérifier que tout n’a pas bougé.

Et niveau précision du coups ? Et bien, le faisceau fait environ 1mm de large, la précision escomptée est donc de 1mm/2h, h étant la distance entre l’origine du faisceau et l’endroit le plus éloigné où vous pouvez voir les 2 faisceaux. Dans mon cas, j’étais à 3m, ce qui me donne une précision de l’ordre de 0,1mm/m. Pas aussi bon qu’un niveau de mécanicien, mais définitivement meilleur qu’un niveau de maçon. Pour améliorer encore la chose, il aurais suffi de mettre un second miroir, pour augmenter « virtuellement » la distance.

Mais j’ai fait ça en pleine journée, et le faisceau devenais difficile à lire à cause de la luminosité. Je m’en contenterais pour le moment !

Merci à Fred pour le coups de main et le laser !

- page 2 de 91 -