Beaglebone Black and Green

La documentation de la prise en main et des premiers pas reste à faire! 
On dira un autre monde encore, mais nettement plus professionnel.
Sans de très bonnes connaissances de Linux, ce sera difficile.
Le lien https://beagleboard.org/getting-started donnera tout de suite une idée si on s'y sentira à l'aise!
Personnellement, j'adore le Beaglebone et le Node.js code (par exemple: http://randomnerdtutorials.com/programming-the-beaglebone-black-with-bonescript/).

L'application finale que j'ai programmée est un système pour obtenir des statistiques de mon chauffage (température à l'entrée et la sortie de la pompe à chaleur, ainsi que la température extérieure).
Les données sont ensuite importées dans Excel pour analyse. Cela m'a permis en particulier de comprendre qu'il fallait activer un peu plus le chauffage la nuit et l'après-midi (panneaux photovoltaïques). 

Dès qu'on a passé la phase des essais ou autres tests, on aimerait que notre ou nos jobs puissent démarrer automatiquement.

Pour ce faire on utilisera le crontab qui lancera nos commandes, scripts ou autres programmes au démarrage.

La commande  

crontab -e

nous permettra d'éditer la table cron sur le système Linux de notre BBB.

Ici un exemple de script avec la commande crontab -l:

root@beaglebone:/etc# crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# ..........................
#
# m h  dom mon dow   command

@reboot bash /root/jbdata/start.sh &

Et le contenu de /root/jbdata/start.sh:

root@beaglebone:/etc# cat /root/jbdata/start.sh
#!/bin/bash
sleep 30
echo Started >/root/jbdata/started.txt
echo cape-bone-iio > /sys/devices/bone_capemgr.*/slots
echo BB-W1:00A0 > /sys/devices/bone_capemgr.9/slots

sudo sync

python /root/jbdata/watchdog.py > /root/jbdata/watchdog1.txt &

cd /root/nodejs
echo bbbserver_Started1 >/root/nodejs/started1.txt
exec sudo /root/nodejs/start_bbbserver.sh &
cd /root/jbdata

/root/jbdata/watchdog.sh > /root/jbdata/watchdog2.txt &

while [ 1 ]
do
  echo Started1 >/root/jbdata/started1.txt
  python /root/jbdata/readtemps.py >/root/jbdata/log.txt 2>/root/jbdata/err.txt

  cp /root/jbdata/log.txt /root/jbdata/log1_`date +"%Y%m%d_%H%M"`.txt
  cp /root/jbdata/err.txt /root/jbdata/err1_`date +"%Y%m%d_%H%M"`.txt

  echo Started2 >/root/jbdata/started2.txt

  sleep 15
done

 

Notes:

  • Le sleep 30 au début est important: certaines ressources comme le Wifi sont sans doute encore en phase d'initialisation
  • Le watchdog.py est un autre Watchdog que le Beaglebone node.js watchdog dédié au senseurs de lumière.
    Il vérifie si le processus Python readtemps.py fonctionne toujours (processus qui lit la température extérieur ou les entrées sorties des température de la pompe à chaleur (chauufage et chauffe-eau))
  • Les fichiers de logs ou des erreurs contiennent la date et l'erreur. C'est très utile pour retrouver voir corriger les erreurs.  

  • Tout au début nous avons le script de démarrage de Beaglebone node.js senseur de lumière (Web) que voici:

root@beaglebone:/etc# cat /root/nodejs/start_bbbserver.sh

#!/bin/bash
cd /root/nodejs
while :
do
        exec sudo node bbbserver.js >/dev/null
        sleep 1
done


Les questions, commentaires ou demandes d'aide sont bienvenus: Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. 

 

Broches (pin numbering) du Beaglebone Black (BBB): 

La broche P9_40 par exemple est utilisée dans l'exemple Beaglebone node.js senseur de lumière (Web)

AIN veut dire Analogic INput.

Même en s'assurant que le javascript bbbserver est bien écrit, il faudrait s'assurer qu'il continue de fonctionner correctement. Et j'ai eu des surprises!

Ce script permet de vérifier si le processus node de bbbserver continue de fonctionner:

#!/bin/bash
#reboot if node server not running

sleep 200

while true; do

resultps=`ps -eaf | grep bbbserver | grep -v grep | grep -v sudo`

if [ -z "${resultps}" ]; then
	echo "bbbserver reboot" > /root/jbdata/reboot1_`date +"%Y%m%d_%H%M"`.txt
	sudo reboot
fi

sleep 20

done

Notes:

  • le premier sleep 200 est nécessaire lors du redémarrage du système
  • le second sleep n'est pas trop court
  • avant le reboot on écrit un fichier avec la date et l'heure

Très joli node.js javascript script qui permet de retourner une valeur de lumière depuis un senseur.

Un client Web (par exemple un Raspberry Pi) peut ainsi vérifier sa valeur en accédant en local http://192.168.1.61:8001/lightsync

var http = require("http");
var url  = require('url');
var fs   = require('fs');

var io   = require('/usr/local/lib/node_modules/socket.io'); 
var b    = require('/usr/local/lib/node_modules/bonescript');

//Lets define a port on 192.168.1.61 where we want to listen to
const PORT=8001; 

//console.log("Server listening on port %s", PORT);

var server = http.createServer(function(request, response) {
var path = url.parse(request.url).pathname;

  switch(path){
    case '/':
          response.writeHead(200, {'Content-Type': 'text/html'});
          response.write('Hello JBB<BR><BR>');
          response.write('To get the light sensor value < 9990 :  ');
          response.write('http://192.168.1.61:8001/lightsync<BR> '); 
          response.end();
          break;
    case '/lightsync':
          response.writeHead(200, {'Content-Type': 'text/plain'});

          var reading = b.analogRead('P9_40');   //Synchronous light value (< 1.0 Volt))
          value = (10000 - ((1.0 - (reading*reading*reading)) * 10000)) | 0

          response.write('' + value);  //string conversion          
          response.end();
          break;
    default:
        response.writeHead(404);
        response.write("opps this doesn't exist - 404");
        response.end();
        break;
    }
  });

server.listen(PORT);

var value = 9999

var listener = io.listen(server);
listener.sockets.on('connection', function(socket) {
    b.analogRead('P9_40', computeValue);
    
    socket.emit('message', {'message': value});
});

function computeValue(x) {
    reading = x.value
    value = (10000 - ((1.0 - (reading*reading*reading)) * 10000)) | 0 
}


Notes:

  • Le senseur est connecté sur le PIN analogique P9_40 ( Beaglebone Black pins (broches) )
  • Le senseur est installé à l'extérieur au bout d'un câble d'environ 3 mètres
  • Le reading*reading*reading permet d'augmenter les valeurs moyennes
  • La nuit nous avons bien une valeur de 0
  • En pleine journée ensoleillée, nous avons une valeur proche de 10000
  • Une valeur de 6000 est une bonne limite pour décider d'allumer des luminaires à l'intérieur, par exemple sur un Raspberry Pi avec un relais, voir désactiver un senseur de présence qui contrôle aussi ces mêmes luminaires.

    La vérification des erreurs n'est pas évidente!   Voir le watchdog sur le Beaglebone Black.