mercredi 23 janvier 2019

Mini écran OLED économique sur raspberry pi pour affichage de statut

Projet

Ajouter un mini affichage pour avoir un statut sur le Raspberry Pi de la domotique intégré sur rail DIN dans le tableau électrique.

Solution

Un petit écran OLED de 3,3cm de diagonale visible (1'3) pour de moins de 10€ utilisant le circuit SH1106.

Références

https://luma-oled.readthedocs.io Le pilote pour écran OLED
https://python-pillow.org La librairie graphique générique

Péripéties

Me voila donc parti sur banggood ou je prend un écran 0.96' un peu au hasard pour 5€67
0_96-Inch-4Pin-Blue-Yellow-IIC-I2C-OLED-Display-Module
Quelques semaines passent, voila l'écran. bon, c'est du I2C: VCC GND SCL SDA
Une petite soudure pour mettre un connecteur, un câble de connections. Recherche sur internet, une page sur la librairie Adafruit et quelques instructions, installation de quelques paquets raspbian i2c, activation du i2c sur le RPI. (voir ici). Branchement, execution:

pi@rpi3:~ $ i2cdetect -y 1

Hum, nada, aucun appareil i2c détecté par Linux (que des "--").

Inspection , hum... l'écran est cassé sur le haut.justement la ou il y a la puce. .
Le premier écran, reçu cassé


Bon, l'écran n'a pas supporté le voyage... Il a du arriver à pied par la Chine...

Amazon cette fois ci : https://www.amazon.fr/gp/product/B078J78R45

Je pars pour un 1.3' , 9€ cette fois ci, mais livraison le lendemain. Réception rapide, dans du carton solide, pas de dommage apparent cette fois ci. Branchement, exécution:
pi@rpi3:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
-> eureka, adresse 0x3C !!

Affichons quelque chose. Recherche internet: pas mal de pages sur SSD1306. J'essaye la librairie python Adafruit trouvée sur google.

Ah ... affichage ... Oh, pas lisible (Voir ici). Des frissons: quand même pas deux fois !

Petite recherche , en effet c'est ce qui arrive si on affiche avec un driver SSD1306 sur SH1106. De plus sur les commentaires amazon, des utilisateurs le mentionnent. C'est vrai que sur le paquet il est écrit: SH1106. Mea culpa. Ouf.

Ah, un peu moins de ressources, mais je tombe finalement sur la librairie Luma OLED (voir références).

EXCELLENT, ÇA MARCHE !

Autopsie

J'en profite donc pour faire une autopsie du premier écran. Le dispositif se présente sous la forme d'un circuit imprimé avec quelques CMS, une fiche I2C et un écran colle sur la circuit imprime par un double face et soude sur ce circuit par le biais d'un ruban de liaison. Le circuit ne sert donc vraiment qu'a fournir les quelques composants externes nécessaires (résistances, condensateur et un transistor) au composant SH1106 qui est intégré directement sur l'écran, a sa base.


mardi 16 octobre 2018

Installation HP LasetJet 3330 sur raspberry pi et partage avec Mac et Windows

J'utilisais jusque la une paire d'imprimantes Canon LBP2900 et LBP1120. Le driver de celles ci n'étant plus supporte sur Windows, j'utilisais un vieux PC Linux comme serveur d'impression. Seulement voila, l'imprimante et le PC se faisant vieux, l'imprimante ne donnait pas de très bon résultats d'impression, et le PC est tombe en panne. Il faut ajouter a cela que le driver CAPT spécifique Canon (ccpd) posait quelques fois problème, et que le PC était un peu gros. Jusqu'à présent, dans un local technique cela ne posait pas trop problème, sauf pour aller chercher l'impression.
Donc mon deuxième choix s'est porte sur une vieille (elle aussi) imprimante HP LaserJet 3330, mais en utilisant un Raspberry Pi (Raspbian) pour lui donner une interface réseau.
J'ai donc installe CUPS sur le RPI, puis branche l'imprimante (bon, avant cela j'ai du faire un petit nettoyage pour résoudre le problème du scanner qui ronflait, voir https://www.youtube.com/watch?v=lqG_nmi3vC4 ).
L'imprimante a été reconnue du premier coup dans l'interface web de CUPS.
Impression page de test: yes !
Partage sur Mac : woouah ! protocole "Bonjour", page test marche du premier coup !
Alors la bravo !

Reste Windows.... Hummm.... Super Windows avec CUPS...

La j'ai passe 2 heures.
Bon, j'ai essayé d'ajouter l'imprimante avec l'adresse http://addr.rpi.ici:631/printers/HP_LaserJet_3330
Après plusieurs essais (de divers drivers PS), je vois bien le fichier arriver dans le spool linux, mais il affiche une erreur. En fait le problème est que le fichier envoyé est encapsulé en PJL, et CUPS n'aime pas. Bon, quelques recherches sur internet plus tard, malgres le fait que le driver Linux de base fonctionne, j'installe "hplip", qui devrait egalement me permettre de scanner plus facilement en plus de l'impression, mais surtout, je declare une deuxième imprimante Marque "Raw", type "raw", de manière à ce que les données envoyées de Windows aillent directement a l'imprimante sans passer par les filtres CUPS.
Seulement voila, windows ne propose pas la bonne imprimante. Le site HP ne propose que le driver universel pour la 3330. Celle ci est compatible Postscript 2 et PCL 5e/6, et la dernière version du driver universel ne propose que PCL6e et Postscript Level 3. Bon, je choisis windows 8, et la on trouve le driver pour PCL5.
Je choisis cette fois ci un Driver: "HP Universal Printing PCL 5".
Et voila, impression super rapide sur windows...

vendredi 29 août 2014

numérotation des titres automatique sous Google Doc

Dans la version google doc 2014, il n'est pas possible de faire, simplement, une numérotation automatique des titres.
Oui, il est possible de créer la structure du document en premier, et d'utiliser les listes numérotées, mais si on écrit le document de façon séquentielle, c'est mort.

Voici un script Google App Script qui fait le travail. Il est basé sur des solutions que l'on trouve sur internet, et ajoute un peu  de configurabilité (des séparateurs notamment).

Dans un document google docs, ouvrir l'editeur de script (Tools->Script editor), puis copy/paste de ce code, puis selectionner la fonction à démarrer, puis l'executer, ceci ajoute un menu avec deux actions.


function onOpen() {  
  DocumentApp.getUi().createMenu('Laurent')  
    .addItem('add Heading Numbering', 'addHeaderNumbering')  
    .addItem('remove Heading Numbering', 'removeHeaderNumbering')  
    .addToUi();  
 }  
 // quote regular expression characters  
 RegExp.quote = function(str) {  
   return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");  
 };  
 // inserted between numbers (customizable)  
 var numSeparator = '.'  
 // added between numbering and text (customizable)  
 var lastSeparator = '\t'  
 // heading concerned (prefix and levels)  
 var headTxt='Heading '  
 var headFirst=1  
 var headLast=6  
 // build regex  
 var reHeading = new RegExp("^"+headTxt+"(["+headFirst+"-"+headLast+"])$");  
 var reNumbering=new RegExp("^["+RegExp.quote(numSeparator)+"0-9]+"+RegExp.quote(lastSeparator))  
 function addHeaderNumbering () {  
  setHeaderNumbering(1)  
 }  
 function removeHeaderNumbering () {  
  setHeaderNumbering(0)  
 }  
 function setHeaderNumbering(addNumber) {  
  // empty array for numbering  
  var counterHeader = Array.apply(null, new Array(headLast-headFirst+1)).map(Number.prototype.valueOf,0);  
  // loop on all document paragraphs  
  var paragraphs = DocumentApp.getActiveDocument().getBody().getParagraphs();  
  for(var i=0; i < paragraphs.length; ++i) {  
   var currentPar = paragraphs[i];  
   var headStr = String(currentPar.getHeading())  
   var isHeading=headStr.match(reHeading)  
   // get headings  
   if (isHeading) {  
    var levelIndex=isHeading.pop()-headFirst;  
    // increment current level before using it  
    ++counterHeader[levelIndex];  
    var numbering = '';  
    // build numbering if necessary  
    if (addNumber){  
     for ( var j = 0; j < counterHeader.length; ++j) {  
      if (j <= levelIndex) {  
       numbering += counterHeader[j] + (j == levelIndex ? '' : numSeparator);  
      } else {  
       counterHeader[j] = 0;  
      }  
     }  
     numbering+=lastSeparator  
    }  
    currentPar.setText(numbering+currentPar.getText().split(reNumbering).pop());   
   }  
  }  
 }  

mardi 26 novembre 2013

Sauver les messages video skype sous mac os

Il arrive que l'on veuille sauver un message video sur skype.
Cette fonctionalite n'est pas disponible encore par defaut.

En faisant une petite recherche google, il est possible de trouver diverses methodes, qui requierent cependant quelques manipulations.

Voici un "one liner" permettant d'automatiser la procedure:


let x=0;for db in Library/Application\ Support/Skype/*/main.db;do sqlite3 "$db" 'select vod_path from VideoMessages;'|while read url;do curl -# "$url" > video$x.mov;let x=x+1;done;done


jeudi 5 septembre 2013

interface OBD II sous ubuntu

Récemment, j'ai eu quelques problèmes avec la Scenic 2 familiale.
Bon, récemment, mais aussi moins récemment.
Comme les voitures sont aujourd'hui remplies d’électronique, il faut pouvoir s’équiper pour diagnostiquer. En effet, les messages affiches au tableau de bord donne un type de problème, mais pas le problème précis.

J'ai donc acquis une interface OBD II (On Board Diagnostic 2), avec interface USB, cela pour moins de 10euros, port compris, chez eBay, made in china bien évidemment, mais envoyé du royaume uni, ce qui évite les problèmes de TVA.

J'utilise Ubuntu (13.04), et l'outil scantool fait partie des dépôts standard, super !

Bon, un petit test "a la main" pour voir si cela fonctionne...
Branchement du port USB.
> dmesg
[683242.796058] usb 2-5: new full-speed USB device number 8 using ohci_hcd
[683243.011695] usb 2-5: New USB device found, idVendor=10c4, idProduct=ea60
[683243.011703] usb 2-5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[683243.011708] usb 2-5: Product: CP2102 USB to UART Bridge Controller
[683243.011713] usb 2-5: Manufacturer: Silicon Labs
[683243.011717] usb 2-5: SerialNumber: 0001
[683243.763122] usbcore: registered new interface driver usbserial
[683243.763444] usbcore: registered new interface driver usbserial_generic
[683243.763745] usbserial: USB Serial support registered for generic
[683243.775514] usbcore: registered new interface driver cp210x
[683243.777062] usbserial: USB Serial support registered for cp210x
[683243.777144] cp210x 2-5:1.0: cp210x converter detected
[683243.952059] usb 2-5: reset full-speed USB device number 8 using ohci_hcd
[683244.158926] usb 2-5: cp210x converter now attached to ttyUSB0
Bon, très bien.

Lors de l'achat, il etait ecrit: version 1.5.
Les datasheets des ELM327 peuvent être trouvées ici:
http://www.elmelectronics.com/dsheets.html
Une liste courte des commandes AT est ici:
http://elmelectronics.com/ELM327/AT_Commands.pdf
Suivons la procédure décrite ici pour déterminer la version:
$ screen /dev/ttyUSB0 38400
> AT L1                       -> aller a la ligne
OK
> AT I                        -> information
ELM327 v1.5
>ATKW0                        -> test pour v1.2
OK
>ATS0                         -> test pour 1.3
OK
>ATFE                         -> test pour 1.3a
OK
>ATSS                         -> test pour 1.4
OK
>ATCSM1                       -> test pour 1.4b
?
>ATAMT 40                     -> test pour 2.0
?
Malgré l'affichage de 1.5, cela correspondrait à une 1.4 .



References:
http://www.outilsobdfacile.fr/interface-diagnostic-elm-327.php#tips
http://codeseekah.com/2012/02/22/elm327-to-rs232-in-linux/

vendredi 23 août 2013

commander des volets roulants bubendorf moteur MG avec knx

Lorsque j'ai commandé les volets roulants pour la maison, le projet knx n'était pas très avancé.
J'avais le choix entre des moteurs Somfy "traditionnels", c'est à dire à 3 fils, ou bien des moteurs bubendorf à 4 fils.
Sans entrer dans les détails techniques, les principales différences qui m'étaient présentées étaient:
- Bubendorf: garantie 7 ans, possibilite de centralisation
- Somfy: traditionnel

Je sentais bien qu'une intelligence trop grande des moteurs pourraient être néfaste à la deporter dans la domotique, mais bon, la garantie 7 ans m'a convaincue.

Avec le recul, je ne suis pas sur ni d'avoir fait un bon ou un mauvais choix, je suis mitigé.

J'ai choisi le système Hager: mon tableau comporte 80% de Hager, car j'ai eu un bon prix sur un lot du bon coin.
Pour KNX j'etais parti sur des systemes knx un peu moins chers mais qui fonctionnent bien, des equipements eibmarkt, weinzierl.
Il existe des actionneurs knx pour volets roulants (TXA223, TXA224), cependant ces systèmes ne contrôlent que des VR a contact permanent.

C'est la que les details techniques interviennent.
Le moteur traditionnel est a 3 fils: un neutre et deux phases (montee , descente), a contact permanent (sur une des phases).
Le moteur MG est a 4 fils: un neutre, une phase permanente, deux commandes a contact furtif pour la montee et la descente.
Le moteur est donc alimente en permanence, et la consommation n'est pas negligeable, ce qui n'est pas le cas pour du traditionnel.
Ceci s'explique par le fait que la centralisation des moteurs MG se fait par une commande par courant porteur propriétaire bubendorf. C'est bien pour une installation traditionnelle (non domotique), cela est trop complexe à mon goût pour une installation knx (trop de systèmes différents à intégrer).

Physiquement, on installera des boutons types "va et viens" pour le traditionnel, et des boutons type "poussoir" pour le bubendorf.

Il existe un systeme Hager pour commander les MG, mais c'est un peu tiré par les cheveux, car cela passe par une commande radio, il me faudrait donc faire fil-radio-fil et passer par le CPL...

Donc pour l'instant, j'ai fait une installation simple: boutons poussoirs pour commander les VR qui actionnent des actionneurs KNX simple, type "bouton" (1.001).
Cela ne me permet pas d'avoir toutes les fonctionalites d'un actionneur de type TXA223, mais cela me permet de commander les volets simplement.
J'utilise un actionneur eibmarkt 12.16 pour commander 6 VR, et un TXA208Ca2 pour commander les 4 restants, il faut bien sur 2 boutons pour un VR.

Pour ce qui est de l'interface knxweb2: le widget "bouton" n’était pas adapté à ce type de commande, puisqu’il n'envoie un ordre que sur le "click", mais il me faut un contact furtif, avec un "on" sur l’appui, et un off sur le lâcher du bouton de la souris. j'ai donc développé un widget adéquat avec l'aide de Anthony Penhard.

Je peux donc dorénavant commander les VR moteur MG avec knxweb2...

Demarrage automatique de linknx et eibd sur ubuntu 13.04

L'installation KNX est maintenant avancée, et le prototype du départ sert pour la maison.

Il s'agit donc que les demons demarrent seuls lors d'un reboot de la machine, en attendant l'installation sur un raspberry pi.

J'ai choisi upstart, qui est le systeme standard d'ubuntu maintenant.

Il suffit de créer deux fichiers de demarrage:

pour linknx: linknx.conf
# linknx upstart script
# this script will start/stop linknx
description "start and stop linknx"
version "1.0"
author "Laurent Martin"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 10 5
console log
setuid <knxuser>
setgid <knxuser>
exec LD_LIBRARY_PATH=<knxpath>/local/lib <knxpath>/local/bin/linknx --config=<knxpath>/linknx.xml --write

pour eibd: eibd.conf
# eibd upstart script
# this script will start/stop eibd
description "start and stop eibd"
version "1.0"
author "Laurent Martin"

start on started linknx
stop on stopping linknx

respawn
respawn limit 10 5

console log

setuid
<knxuser>
setgid <knxuser>

exec
<knxpath>/local/bin/eibd --Discovery --Tunnelling --Routing --Server --listen-tcp --listen-local --trace=256 ipt:<ipgw>:3671

remplacer ces valeurs par les votres:
<knxuser> l'utilisateur qui exécute les demons, il est preferable que ce ne soit pas root
<knxpath> le repertoire contenant les softs knx
<ipgw> l'adresse IP de la passerelle KNX/IP, dans mon cas: 192.168.0.111

il suffit alors de copier ces fichiers dans /etc/init:
sudo cp linknx.conf eibd.conf /etc/init
et de demarrer:
sudo initctl start linknx
ceci va démarrer les 2 car il y a une dépendance de linknx sur eibd

au prochain reboot les 2 démons démarrent automatiquement.