Ajouter un bouton physique MOB à OpenCPN

--- publié le 05 mars 2018 10:43:35

Amis marins,


Vous utilisez OpenCPN, ce merveilleux outil de navigation configurable à souhaits auquel ne manque
qu'un bouton pratique pour le 'Man Over Board'.
Il existe en effet un bouton sur le logiciel qui permet de lancer cette fonction (MOB), mais cela implique
que vous soyez devant votre écran, une souris à la main, ce qui n'est pas vraiment praticable dans la
réalité ! Il existe également un raccourci pour l'actionner, c'est le Contrôle Espace qui lui nécessite un
clavier branché.
Je me propose donc de vous fournir une recette pour brancher un bouton poussoir physique(à placer à
portée de main du barreur ou n'importe où vous le jugerez nécessaire).
La dernière version de OpenCPN tourne à merveille sur un raspberry PI 2 ou 3.
Les ports GPIO du raspberry serviront à interfacer le bouton et à lancer un script qui lancera sur
OpenCPN la fonction MOB.
Le bouton:
Il nous faut un bouton poussoir étanche et solide qui sera branché d'un côté sur le 3,3V du
raspberry et de l'autre au GPIO 17 (pin 11) par exemple. Le port GPIO 17(dans mon exemple) sera
configuré en Input et attendra de se trouver à l'état haut pour déclencher le script.


Le code de ce bouton sera programmé en python de la façon suivante :
mob,py,


import time
from RPi import GPIO
import os
b1=17
GPIO.setmode(GPIO.BCM)
GPIO.setup(b1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
time.sleep(0.5)
inputval = GPIO.input(b1)
if inputval>0:
os.system('sh /home/pi/Desktop/mob.sh')
break


Attention : si vous vous servez de Windows pour écrire ce script, il faudra le rendre compatible avec
linux en se servant de la commande dos2unix à télécharger sur le pi et en faisant dos2unix mob.py :

sudo apt-get install dos2unix
puis dos2unix mob.py


ce script en appelle un autre ('mob.sh') placé sur le bureau et qui fournira la commande Ctrl Espace.
Ce script bash fonctionne grâce à xdotool qu'il vous faudra installer sur le pi

sudo apt-get install xdotool

Le contenu de ce script est le suivant :

#!/bin/bash
WID=`xdotool search --name "OpenCPN 4.6.1" `//dans le cas ou votre version de OpenCPN
//serait la 4.6.1:à modifier si besoin !
xdotool windowfocus $WID
xdotool key ctrl+space
#le raccourci homme à la mer.


Il est facile de déclencher une sirène d'alarme en rajoutant à la fin du script sh la ligne
mpg123 /usr/share/opencpn/sounds/Alien_Siren.mp3
en supposant que vous ayez placé un fichier son mp3 de votre choix (Alien.Siren.mp3 dans cet exemple)

dans le dossier /usr/share/opencpn/sounds/, et relié la sortie son du raspberry à un haut parleur ou / et un
ampli BF.
Il n'y a plus qu'à lancer le script python (si tout fonctionne, définir dans /home/pi/.config/autostart un
fichier mob.desktop composé comme suit :


[Desktop Entry]
Type=Application
name=mob
Exec=sudo /usr/bin/python /home/pi/mob.py


Lancer OpenCPN en mode graphique.
Un appui sur le bouton devrait faire apparaître le MOB sur la carte et retentir l'alarme si elle a été
configurée !
Bonne navigation

 

Kinefou

Les derniers commentaires :

Missing
yannbis

Bonjour,
projet vraiment très intéressant.
Une solution simple et restant économique pour les moins bidouilleurs, ou les windowsiens : acheter un accessoire qui fasse la conversion bouton poussoir->entrée de touches de clavier.
Par exemple ici pour moins de 7€, c’est une pédale USB programmable, vue par le PC comme un clavier.
https://www.ebay.fr/itm/PC-USB-Foot-Switch-Keyboard-Pedal-V3X/282336494404

Dans le cas d’un MOB on programme « CTRL+Espace ». En démontant, on doit facilement récupérer les 2 contacts pour déporter le bouton sous un format souhaité et étanche.
Bien sûr il faut que la fenêtre Open CPN soit active. Pour pallier à ce problème, je pense qu’un petit script intermédiaire peut faire le job, j’essaierai avec AutoIt et la fonction ControlSend ( https://www.autoitscript.fr/autoit3/docs/functions/ControlSend.htm)

Néanmoins la gestion de la fenêtre active semble un point dur potentiel niveau robustesse.
J’en profite pour relancer GilletArom pour voir si une intégration plus profonde dans Open CPN serait possible, en intégrant une veille des touches « MOB » même si la fenêtre est inactive .

Enfin quelques suggestions, notamment pour robustifier le système c’est primordial :
> Autotest du bouton au démarrage, permet de valider que toute la chaine hardware est OK, et aussi un bref coup de buzzer.
> Bouton d’acquittement (surtout dans le cas d’un système bluetooth, par exemple si on débarque un équipier mais qu’on continue la nav.)
Ces fonctions peuvent être faites par un appui long par exemple, en conservant une seule I/O

Je testerai volontiers dès que j’aurai un bateau

Yann

PS : dernière remarque, il y a des commentaires à la fois sur le forum et sur l’article on s’y perd un peu, ce n’est pas possible de centraliser ?

lundi 09 avril 2018 10:59
Img_7803
tanagra

@Kinefou: La connexion Bluetooth pour le MOB: superbe idée !!! d'autant plus que le RPI 3 intègre le Bluetooth (je l'utilise pour aiguiller les alarmes sur une petite enceinte Bluetooth). Je vais regarder comment mettre en œuvre cette fonction sous OpenPlotter et je ferai un retour sur ce fil.

Pour l'option "Bouton Poussoir" MOB je pense préférable de protéger le RPI par un optocoupleur. Je vais mettre à jour ma petite doc en intégrant cette petite modification.

dimanche 08 avril 2018 10:34
Missing
Kinefou

Bravo à toi, tanagra!; Je n'avais pas encore eu le temps de lire ton adaptation à openplotter qui me fait découvrir un peu plus les incroyables ressources de cette distribution 'couteau suisse'. Je vais la mettre en œuvre très vite et je te remercie également pour les précisions utiles que tu as apportées à mon article.
Amicalement

samedi 07 avril 2018 12:02
Missing
1
Kinefou

Chose promise, chose due, voilà la suite de ce post traitant de la mise en place du Mob sur raspberry par l'ajout d'un dispositif bluetooth.
N'en déplaise à m@telot.phi et pour compléter les posts de Ecume29 et de millimetrick que je remercie de leur soutien!
Le principe est très simple; la personne de quart porte un émetteur bluetooth sous forme d'un bracelet ('I5 Plus Smart Bracelet watch Bluetooth' pour moi). apairé avec le raspberry Pi 3 qui tourne dans la table à cartes avec OpenCpn (fenêtre non réduite car le script mob.sh ne marche pas sur une fenêtre réduite).Toutes les 5 secondes, le script presence.sh (détaillé plus loin) cherchera le bracelet: s'il le trouve, il continue en incrémentant la variable presence. S'il ne le trouve pas, il émet un beep (avec un petit buzzer) pour attirer l'attention. Ce bip sera émis 2 fois (1 absence, puis 2 absences). A la troisième absence (au bout donc de 15s), il déclanche le script mob.sh qui va s'occuper de lancer la sirène d'alarme et de pointer le point de chute sur OpenCPN, tout en se réinitialisant afin de ne pas marquer plusieurs Mob d'affilée.
Dans mon cas, j'ai prévu 2 bracelets, 1 bleu et un rose (on est souvent à 2 sur le pont lors des quarts).Chaque équipier porte un bracelet à son poignet. A chaque bracelet, correspond un script 'presence' sur le raspberry, à savoir 'presence .sh' pour le bracelet bleu et 'presence1.sh' pour le bracelet rose.Ces 2 scripts sont lancés depuis le bureau en créant 2 fichiers de commande 'bleu' et 'rose' et en les rendant executables. on les lance dans un terminal pour suivre le déroulement. Important: ne pas réduire la fenêtre de opencpn car xdotool compris dans le script mob.sh ne marche pas sur une fenêtre réduite!). Tant que les 2 bracelets sont à portée du pi, le script continue à tourner sans avertissements. Si l'un des 2 se trouve hors de portée, un bip est émis. Au bout de trois absences, c'est le branle bas, la sirène hurle, le point se marque sur la carte et si on suit une route, elle est automatiquement redirigée vers le point de chute pour guider le barreur (merci OpenCPN!!!)
passons à la pratique:
Je suppose que vous avez suivi la première partie de ce post et que tout fonctionne avec le bouton.
Il vous reste à apairer les bracelets (ou smartphone si vous acceptez de la sacrifier!!!), puis à créer le script 'presence.sh comme suit:

presence.sh

#!/bin/bash

BLUETOOTHADDR="CB:9E:FF:D5:66:6C" # Adresse Bracelet rose

SLEEPTIME=5 # Intervalle de recherche en secondes

COUNTPRESENT=0

COUNTABSENT=0

while true

sudo gpio mode 29 out #n'importe quel gpio non utilisé sur lequel on branche une led témoin
sudo gpio write 29 1 #On allume le temoin de présence

echo "$$">Pid_Rose

do


hcitool con > rose

grep $BLUETOOTHADDR rose >/dev/null

retval=$?

if [ "$retval" = 0 ]

then
COUNTPRESENT=$((COUNTPRESENT+1))

echo "$(date) - ROSE est à bord!!"

sudo rm rose

else

COUNTABSENT=$((COUNTABSENT+1))

echo $COUNTABSENT

sudo rm rose

fi

if [[ "$COUNTPRESENT" = 1 ]]

then

COUNTABSENT=0

fi

if [[ "$COUNTABSENT" = 1 ]]

then

COUNTPRESENT=0

sudo gpio write 29 0 #On éteins le temoin de présence

sudo python /home/pi/bip.py #bip d'avertissement à la première perte de contact

fi

if [[ "$COUNTABSENT" = 2 ]]

then

sudo gpio write 29 0

sudo python /home/pi/bip.py #bip d'avertissement à la deuxième perte de contact

fi

if [[ "$COUNTABSENT" = 3 ]] # On attend 3 pertes de contact successives pour être sûr que Rose est absent


then

sudo gpio write 29 0

COUNTPRESENT=0

echo "$(date) - Homme à la mer!!"

/home/pi/Desktop/mob.sh #On déclanche l'alarme et on pointe la chute sur OpenCPN


rm Pid_Rose

sudo kill $$ #On 'tue' le processus pour arrêter la boucle

fi

echo "$(date) - confirmation presence: $COUNTPRESENT"

echo "$(date) - confirmation absence: $COUNTABSENT"

sleep $SLEEPTIME #On attend 5 secondes

done

Pour le deuxième bracelet, on reprend le même code en le renommant presence1.sh et en changeant l'adresse par celle de ce bracelet
on peut également changer le gpio du témoin de présence (si on veut un témoin par bracelet).

Le code de bip.py peut être par exemple: (on branche un buzzer sur le pin physique N°13)

import RPi.GPIO as gpio

import time

gpio.setwarnings(False)

gpio.setmode(gpio.BOARD)

gpio.setup(13,gpio.OUT)

gpio.output(13,gpio.HIGH)

time.sleep(0.5)

gpio.output(13,gpio.LOW)

time.sleep(0.5)

print('BEEEP!!')

reste à définir 2 fichiers de commande appelé 'rose' et 'bleu'sur le bureau pour lancer ces scripts commodément:

rose
#!/bin/sh
sudo /home/pi/presence.sh

bleu
#!/bin/sh
sudo /home/pi/presence1.sh

En pratique, mon Raspberry tourne dans la table à cartes et je le connecte de ma tablette avec VNC.
Je lance OpenCPN que je déplace pour avoir accès à mes lanceurs 'rose' et 'bleu'.
Je lance les scripts en double cliquant sur ces lanceurs et en choisissant 'executer dans un terminal'.
Je contrôle sur les terminaux qui se sont ouverts, la bonne réception de mes bracelets (presence=1, absence=0) et je maximise OpenCPN.
Le système prêt est alors prêt et surveille la présence des bracelets.
A chacun d'optimiser la méthode pour s'adapter à ses besoins.
Il est facile d'adjoindre une commande qui coupe le moteur avec une electro-vanne placée sur l'arrivée de carburant et commandée par le raspberry dans le script mob.sh, mais cela s'avère inopérant lorsqu'on navigue à la voile!
Sous voile, en situation de Mob, la réaction dépend beaucoup des conditions de navigation et de l'équipage. Toujours est il que la plus évidente des réactions est de lancer immédiatement une bouée avec feux ou une perche IOR, d'arrêter le bateau en le faisant loffer bout au vent, d'affaler la Gd voile et de démarrer le moteur pour revenir sur les lieux de la chute en passant au vent de la cible.Je pense que pour réaliser cela, le contrôle humain et visuel reste le moyen le plus sûr.
La sécurité est avant tout une question de pratique et on ne saurait trop insister sur l'importance de l'entrainement 'à blanc' avec une simple bouée pour augmenter ses chances de succès en malheureux cas d'épreuve réelle que je ne souhaite à personne!!L'electronique n'est jamais qu'une aide qui ne doit pas nous faire négliger le bon sens et la pratique.

vendredi 06 avril 2018 17:31
Avatar
1
Ecume29

Je n'ai pas résisté à tester rapidement ...
Génial tout simplement. Pour Tanagra, simplement rajouter le déclenchement à partir d'un test bluetooth (smartphone ou simple bracelet bluetooth) pour lancement du script ... et tout s'enchaine ...
Voir http://clement.storck.me/blog/2016/02/detection-de-presence-en-bluetooth/ pour la partie bluetooth.
J'en avais rêvé , bouton + bluetooth c'est fait!
Bravo et merci

vendredi 06 avril 2018 15:05
Voir tous les commentaires
Retour