Archives pour la catégorie Electronique

[POC] PHP Ext for use WiringPi

After using the wirigPi library in C to managing the RaspberryPi’s GPIO, I have written a first version of wrapper extension for PHP.

This version allows setup the library, set if pin is input or output, read and write the pin.

The first example blink a DEL and has a button for the exit of the infinite loop !

You can read and get the source code into my Github repository.

Are you interested by my work ?

Développer sur Raspberry PI en C

Voici bien longtemps que j’ai mis de côté l’électronique. Pour repartir dans ce domaine, il me semble intéressant d’utiliser le Raspberry Pi. Ce petit ordinateur à 40€ qui permet de brancher toute sorte de choses sur son port GPIO et d’expérimenter facilement.

Étant développeur, mon langage de prédilection est le PHP. Celui-ci étant plutôt de haut niveau, il est impossible de l’utiliser pour écrire un programme pour un microcontrôleur Microchip ou ATmega. Pour ces derniers, il faut se tourner vers l’assembleur, le basic ou le C pour Microchip.

Il y a quelques mois, j’ai réalisé un petit montage pour lire le télérelevé client de mon compteur EDF. Le programme qui réalise la lecture des données du compteur et qui gère le stockage de ces données est écrit en PHP. J’ai compilé la version 7.0 pour le Raspberry Pi modèle A, afin de bénéficier des améliorations de cette version. Cela se ressent très vite avec un processeur peu puissant.

Maintenant, je m’intéresse aux interactions possibles avec le Raspberry Pi via son port GPIO. Et je me lance le défi d’utiliser PHP 7.0 pour écrire des programmes qui utilise le GPIO du Raspberry PI.

Mais comment avoir accès au hardware via PHP ?
J’ai trouvé deux façons de faire. La première est un très gros bricolage. Il s’agit de passer par des commandes système pour exécuter un programme qui réalisera les actions. Il y a deux grosses limitations à cela, d’une part les temps sont mauvais et d’autre part piloter la ligne de commande et en interpréter les résultats reste complexe. C’est beaucoup de travail pour quelques choses qui semblent plutôt simples.
La seconde façon est de réaliser une extension à PHP. Ce dernier est écrit en C et Pascal Martin a écrit un livre en français sur “Développer une extension PHP”. Reste à trouver une librairie C qui gère le GPIO du Raspberry Pi. J’en ai trouvé deux, la première “pigpio” semble très complète, mais je me la garde sous le coude pour plus tard. La seconde est “wiringPi”. Elle est composée de deux librairies et d’un exécutable permettant l’interaction avec le GPIO via la ligne de commande.

Avant de me lancer dans l’écriture de l’extension, je vais commencer par jouer un peu avec la librairie et mon banc d’essai.

Quel accueil !
Quel accueil !

Voici ce que je compte tester avant d’écrire une extension pour PHP :

  • Faire clignoter une LED
  • Lire l’état d’un bouton (pull Up)
  • Écrire des informations sur un écran LCD 16×2 ou 20×4
  • Lire des informations via le bus i2c

Pour le moment, seul le dernier point n’est pas atteint. Le but de ces tests réalisés en langage C est simple : obtenir un étalon permettant la validation des tests de l’extension PHP et éliminer les problèmes matériels.

Voici une petite vidéo du programme écrit en C.

Mon projet vous intéresse, ou vous avez des questions ? Je me ferais une joie de vous répondre dans les commentaires.

Version 0.1.0 du programme de télérelève EDF

La première version de l’outil permettant de réaliser un télérelevé EDF chez soi est arrivée.

Cette version 0.1.0 fige une première fois le code source et en donne une première base utilisable. J’utilise déjà cette version sur mon Raspberry Pi.

Attention toute fois, cette version corrige un manque dans la base de données SQLITE. Avant cette version, il n’y avait aucun index dans la table relevée.

Si vous utilisez les versions précédentes avec une base SQLITE, il est nécessaire à la mettre à jour manuellement.

Voici les requêtes SQL à exécuter pour la mettre à jour.

Après cela, la base est à jour.

Et vous, avez-vous mis en place un tel système ? Comment gérez-vous votre consommation électrique ?

Télé relève EDF automatique

Après avoir cherché de nombreuses fois la meilleure méthode pour suivre la consommation électrique de la maison, je suis tombé sur un gazouillis qui parlait du télé-relevé EDF côté client.

Puis une recherche Google plus loin, je suis arrivé sur cette page. Les gros avantages de cet exemple pour moi sont que la réalisation a été faite sur un Raspberry Pi et que le code est en PHP. Pour les premiers tests cela fut bien pratique.

Me voilà reparti à réaliser un montage électronique. Le dernier montage était il y a 3 ans maintenant.

Grâce à un généreux collège qui a déjà réalisé la performance, j’ai pu obtenir le bon optocoupleur. Deux résistances plus tard, un câble posé entre le compteur et le Raspberry Pi, me voici parti dans le dur du sujet.

Comme présenté dans le lien donné plus haut, il y a quelques modifications à réaliser dans la configuration du Raspberry Pi  avant de connecter le câble sur le port GPIO.

Ensuite, vient la création du port série. Cette création est rapidement réalisée par la commande suivante   stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 -crtscts

Avant l’exécution de la commande, soit le fichier  /dev/ttyAMA0 n’existe pas, soit il est muet lors de l’exécution de la commande cat.

Malheureusement, après un redémarrage du Raspberry Pi, le fichier est muet. Afin de palier ce problème, il est nécessaire d’ajouter la commande de création du port série à la cron tab (tâche planifiée) de l’utilisateur root.

Pour modifier la crontab :

Ligne ajoutée :

Maintenant la commande  cat /dev/ttyAMA0 affiche bien les données du télé-relevé après un redémarrage du Raspberry Pi.

Ensuite, étant développeur PHP, j’ai testé les scripts fournis dans l’article mais, n’étant pas pleinement satisfait, j’ai développé une application un peu plus moderne. Une fois développée, je me suis aperçu que le Raspberry ne disposait que de PHP 5.4 qui est incompatible avec mon travail (PHP 5.6 minimum).

Peu importe, PHP est libre, je vais le compiler. Et tant qu’à faire de le compiler, autant prendre la dernière version de PHP 7.0 pour profiter des nombreuses optimisations réalisées sur cette version. Afin de vous épargner bon nombre de désagréments, je vous fournis les commandes permettant la compilation de PHP 7.0 sur un Raspberry Pi A avec Raspbian 7.

Récupération des sources (les commandes durent longtemps) :

Maintenant, il faut installer les librairies et outils nécessaires à la compilation de PHP :

La commande va mettre un certain temps à tout télécharger et installer les packets.

Ajouter le fichier  /home/pi/buildphp2 avec le contenu suivant :

PHP est compilé puis installé dans /opt/php7 . Les fichiers de configuration de PHP sont disponibles dans le dossier /opt/php7/etc/ 

Commande permettant de lancer le script de compilation (à executer depuis la console du Raspberry Pi) :

La compilation a duré 4h15 sur mon Raspberry Pi A.

Une fois la compilation réalisée, un petit test s’impose :

Il y a plus de module car j’ai compilé quelques extensions complémentaires.

Afin de rendre PHP plus facile à utiliser nous allons créer un raccourci :

Maintenant que PHP 7 est compilé et opérationnel, il est temps d’installer le programme de télé-relève.

Pour le télécharger, rien de plus simple. Tout comme pour PH,  l’utilisation de GIT est recommandée.

Maintenant, nous sommes dans le dossier de l’application. La première chose à faire est de télécharger la dernière version du gestionnaire de dépendances Composer.

Une fois installé, installons les dépendances du logiciel :

Après la fin du téléchargement et de l’installation, le logiciel doit être configuré à minima en ajoutant ceci dans le fichier config.yml  situé à la racine du projet :

Le type de compteur correspond à la version la plus courante (doc EDF).

Maintenant vérifions que tout fonctionne bien :

Vérifions que la lecture se passe bien :

Screen Shot 2016-05-26 at 22.37.27

Maintenant que tout fonctionne bien, il reste à mettre en place la dernière chose nécessaire à la réalisation d’un relevé toutes les 5 minutes.

Modifions la crontab de l’utilisateur pi  crontab -e pour y ajouter la ligne suivante :

Que se passera-t-il toutes les 5 mins ? Le gestionnaire de tâches planifiées exécutera la commande « read » de mon application et stockera le relevé dans une base de données sqlite nommé « datas.sqlite ». Elle est située à la racine du projet. Afin de pouvoir vérifier ce qui s’est passé lors de l’exécution, le log est disponible dans le fichier « telereleve.log » également situé à la racine du projet.

Voici un exemple des données présentes dans la base de données (j’ai lu la base de données avec sqlite browser).

Screen Shot 2016-05-26 at 22.48.49

Les données sont exprimées en Wh. Il faut diviser par 1000 pour obtenir des KWh.

Merci de votre intérêt pour mon travail. Je suis impatient de lire vos retours d’expérience et vos commentaires sur le projet.