Allumage conditionnel d'une LED

Le connecteur GPIO du Raspberry Pi, comment l'utiliser sur les Mode A, B et B+

Modérateur : Francois

Avatar du membre
Nico
Messages : 11
Enregistré le : sam. 25 juin 2016 23:07

Allumage conditionnel d'une LED

Message par Nico » lun. 26 déc. 2016 11:24

Joyeuses fêtes de fin d'année à tous !

Je possède une Raspberry Pi 3 configurée pour être nomade ; en effet, elle a pour vocation d'être un drone terrestre diffusant son propre réseau Wifi (permettant son contrôle ou simplement son accès en ssh), alimentée avec un powerbank et possédant une seconde interface wifi lui permettant de se connecter à un autre réseau Wifi (et d'accéder à internet).
Point positif : Tout fonctionne plutôt correctement
Point négatif : aucun retour visuel de l'activité de la Raspberry....

J'ai branché 3 LED sur 3 GPIO... Je peux les allumer manuellement ou par script python.... Mais je n'arrive pas à provoquer leur allumage en fonction du résultat d'un test.
Ne sachant pas du tout programmer (et encore moins "from scratch") je suis donc à la recherche d'un script pouvant effectuer ce type de scénario :

Teste si l'interface wlan0 diffuse bien son ssid (le hotspot wifi est il activé ?)
si oui => allume la led 1
si non => la led 1 reste éteinte
Vérifie cette condition toute les 5 secondes

Teste si l'interface wlan1 est bien connectée (la Raspberry est connectée en wifi à un Lan local)
si oui => allume la led 2
si non => la led 2 reste éteinte
Vérifie cette condition toute les 5 secondes

Teste si tel service est lancé (streaming vidéo, nginx, script divers...)
si oui => allume la led 3
si non => la led 3 reste éteinte
Vérifie cette condition toute les 5 secondes

Si quelqu'un possède une piste pour effectuer ce que j'appellerai l'allumage conditionnel d'une LED, je suis intéressé ! Car je n'ai hélas pas les compétences pour créer par moi même ce genre de script et que je n'en trouve pas d'exemple sur internet....autre que celui là, sur raspberrypi.org, mais le code proposé ne me parle pas du tout et je ne vois pas comment l'adapter à mes besoins :

Code : Tout sélectionner

def getwpaclientstatus():
        import subprocess

        try:
            writedatedlogmsg(networklog, 'Attempting WPA client status read. ', 4, networkloglevel)
            result = subprocess.Popen(['/sbin/wpa_cli', 'status'], stdout=subprocess.PIPE)
        except:
            writedatedlogmsg(networklog, 'Error reading wpa client status. ', 0, networkloglevel)
        else:
            writedatedlogmsg(networklog, 'Completed WPA client status read. ', 4, networkloglevel)


        # prune interface ID
        resultdict = {}

        for result in result.stdout:
            if result.find('=') > 0:
                split = result.split('=')
                resultdict[split[0]] = split[1].strip()
        return resultdict
Merci de partager vos connaissances avec nous !

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Allumage conditionnel d'une LED

Message par guillaume9344 » mer. 28 déc. 2016 20:19

Bonsoir, je ne peut vous donnez un script tout fait, mais si vous souhaitez progressez en programmation , je peux vous donner plusieurs pistes:
-exemple pour faire un test dans un script https://openclassrooms.com/courses/repr ... nditions-4
-une piste pour savoir si une connexion est active: https://forum.ubuntu-fr.org/viewtopic.php?id=238701
-une bibliothèque pour commander les gpio :http://wiringpi.com/download-and-install/
-https://projects.drogon.net/raspberry-p ... o-utility/

voilas quelques piste à explorer ...
@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
Nico
Messages : 11
Enregistré le : sam. 25 juin 2016 23:07

Re: Allumage conditionnel d'une LED

Message par Nico » mer. 28 déc. 2016 22:00

Merci beaucoup ! C'est déjà très intéressant !
J'avais commencé le cours openclassroom, mais je l'ai abandonné juste avant ce chapitre.... Je vais donc continuer !
En ce qui concerne wiringpi, bien que l'ayant déjà installé sur la RPi, je préfèrerai utiliser la bibliothèque RPi.GPIO de python, nativement présente sur Raspbian Jessie (semble t-il...)... histoire de pouvoir le rendre super compatible avec n'importe quoi d'autre... mais le principe doit être le même, j'imagine...
Je vais essayer de me remettre sur les tests que tu me propose et les scripts qui vont avec.... Merci !

Je reviendrai si je trouve quelque chose, mais reste ouvert à d'autres solutions !

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Allumage conditionnel d'une LED

Message par guillaume9344 » jeu. 29 déc. 2016 16:36

Pour les gpio il ny a pas de libraries préférentielle du moment que vous la métrisez et quelle est accessible par des commandes console.
Bon tests alors.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
Nico
Messages : 11
Enregistré le : sam. 25 juin 2016 23:07

Re: Allumage conditionnel d'une LED

Message par Nico » dim. 15 janv. 2017 23:24

Je reviens avec un script bash permettant de tester l'état de mes interfaces wifi... Pour l'instant, le résultat de ces tests se traduit par un retour écran du texte défini (et en boucle infinie).... Je pourrais dès lors, semble t-il, remplacer les "echo" par des "gpio write N° 0" ou des "gpio write N° 1" en fonction.... Et donc utiliser la librairie wiring pi...
Je n'ai vraiment rien contre cette librairie, mais si quelqu'un pouvait traduire ce script bash en python, celà éviterai d'avoir à installer wiring Pi uniquement pour ce script...
Je continue tout de même mes recherches et reviendrai donner mes conclusions !

Code : Tout sélectionner

#!/bin/bash

# Début de la boucle infinie (vérification constante et perpétuelle des connexions)
while true
do

# Test du fonctionnement du point d'accès Wifi <=> LED1
	Wlan0=`ifconfig wlan0 | grep "inet ad" | cut -f2 -d: | awk '{print $1}'` # Est-ce qu'une IP est définie pour wlan0 ?
	if  [ -n "$Wlan0" ] ; # Si la commande renvoie une IP
		then # Alors...
		echo "Le point d'accès est opérationnel ! <=> LED1 allumée"
		else # Sinon...
		echo "Le point d'accès n'est pas disponible... <=> LED1 éteinte"
	fi # Fin du test LED1

# Test de la connection au réseau local sans fil <=> LED2
	if [ ! -e "/sys/class/net/wlan1/operstate" ] ; # Est-ce que l'interface wlan1 n'est pas branchée ?
		then # Alors, l'interface wlan1 n'est pas dispo
		echo "L'interface Wlan1 n'est pas branchée <=> Pas de connection avec le réseau local...  <=> LED2 éteinte"
		
		Wlan1=`ifconfig wlan1 | grep "inet ad" | cut -f2 -d: | awk '{print $1}'` # Est-ce qu'une IP est définie pour wlan1 ?
			elif  [ -n "$Wlan1" ] ; # Si la commande renvoie une IP
				then # Alors...
				echo "Pas de connection avec le réseau local... <=> LED2 éteinte"
				else # Sinon...
				echo "La connection au réseau local est opérationnelle ! <=> LED2 allumée"
	fi # Fin du test LED2
	
# Test du fonctionnement du streaming <=> LED3
	stream=`pgrep mjpg_streamer` # Est-ce que le streaming est actif ?
	if  [ -n "$stream" ] ; # Si la commande renvoie un PID
		then # Alors...
		echo "Le streaming est en cours ! <=> LED3 allumée"
		else # Sinon...
		echo "Le streaming n'est pas actif... <=> LED3 éteinte"
	fi # Fin du test LED3

done
exit 0


Bud Spencer
Raspinaute
Messages : 416
Enregistré le : lun. 15 août 2016 21:38

Re: Allumage conditionnel d'une LED

Message par Bud Spencer » mar. 17 janv. 2017 23:28

Traduire des boucles infinies qui passent leur temps à faire des i/o, surement pas :lol:

Prend déjà ca. C'est vite fait à l'arrache, mais ca te donne un exemple de code qui tourne sans boucle et qui permet de conditionner une led (pin 12, GPIO18) en fonction de l'état de l'interface wlan0 . Tu peux ajouter tes autres conditions dans la proc. wifi2led ou instancier des threads individuels pour chaque suivant tes besoin.

Bon j'aurais pu mettre le code en texte que tu n'ais plus qu'a copier/coller, mais l'avantage d'une images, c'est que tu es obligé de le lire pour le retaper
(lire -> comprendre -> apprendre ;) )
wifi2led.png
wifi2led.png (35.13 Kio) Vu 1283 fois
ps : Il faut installer la lib pyroute2 pour python (il me semble qu'elle n'est pas installé d'origine)
Modifié en dernier par Bud Spencer le mar. 17 janv. 2017 23:56, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Avatar du membre
Nico
Messages : 11
Enregistré le : sam. 25 juin 2016 23:07

Re: Allumage conditionnel d'une LED

Message par Nico » mar. 17 janv. 2017 23:41

Merci Bud !

Pour l'instant j'ai fait ça (je viens de le tester à l'instant, et puisque le script est lancé au démarrage, j'ai pas de soucis de retour console....) et ça à l'air de fonctionner correctement, en réagissant dès que je perd une connexion ou que je retire une interface....

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import RPi.GPIO as GPIO

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD)
GPIO.setup(31, GPIO.OUT)
GPIO.setup(35, GPIO.OUT)

while True:
# Test du fonctionnement du point d'accès Wifi <=> LED1
    Wlan0=os.system('ifconfig wlan0 | grep "inet ad" | cut -f2 -d: | awk "{print $1}"')
    if Wlan0 is None:GPIO.output(35,0)
    else:GPIO.output(35,1)
# Fin du test LED1

# Test de la connection au réseau local sans fil <=> LED2
    if os.path.exists('/sys/class/net/wlan1/operstate'):
    	Wlan1=os.system('ifconfig wlan1 | grep "inet ad" | cut -f2 -d: | awk "{print $1}"')
        if Wlan1 is None:GPIO.output(31,0)
        else:GPIO.output(31,1)
    else:GPIO.output(31,0)
# Fin du test LED2
En ce qui concerne ton code, et voyant que tu es toujours en ligne, j'ai quelques questions :
Que fait la variable ip= IPDB() ?
Peux tu m'expliquer simplement l'utilité de tes fonctions ?
Et surtout l'appel de la fonction signal_hndl dans main() qui me semble "un brin technique"... ?

Sinon je chercherai dans mon coin, mais ça risque d'être plus long...
Modifié en dernier par Nico le mar. 17 janv. 2017 23:58, modifié 1 fois.

Bud Spencer
Raspinaute
Messages : 416
Enregistré le : lun. 15 août 2016 21:38

Re: Allumage conditionnel d'une LED

Message par Bud Spencer » mar. 17 janv. 2017 23:57

vi, j'avais pas mis la bonne image, mais c'est réparé

IPB est une class de la lib pyroute2. C'est une librairie intéressante pour de l'usage réseaux en python (http://docs.pyroute2.org/)

la Fonction signal_hndl, je l'ais enlevé pour simplifier. Il faut juste savoir qu'un signal est une fonction qui est appelée quand un programme se fini. Cela permet entre autre de libérer des ressources, mais c'est peut être un poil compliqué a expliquer si tu débutes.
Modifié en dernier par Bud Spencer le mer. 18 janv. 2017 00:05, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Avatar du membre
Nico
Messages : 11
Enregistré le : sam. 25 juin 2016 23:07

Re: Allumage conditionnel d'une LED

Message par Nico » mar. 17 janv. 2017 23:59

alors je retire....
mais même avec ta nouvelle version, je ne comprend pas:
+ ip = IPDB()
+ threading.Timer.... start()
+ et if _name_ == '_main_'

Une librairie python pour le réseau ? Cool, je vais regarder ça sérieusement, ça m'interresse !
Merci, voilà encore de la matière à étudier !

Bud Spencer
Raspinaute
Messages : 416
Enregistré le : lun. 15 août 2016 21:38

Re: Allumage conditionnel d'une LED

Message par Bud Spencer » mer. 18 janv. 2017 13:55

C’est un peu compliqué à expliquer à un débutant, mais IPDB est un module de la librairie pyroute2 qui contient notamment jeux d’enregistrement des objets de la pile réseaux du system.
IPDB().interfaces.xxxxxxx.operstate retourne l’état de de l’interface xxxxxxx (UP si activée et DOWN si pas activée).
If __name__ == ‘__main___’ ….. C’est le point d’entrée de ton programme. Au démarrage il appelle la procédure def main() :

Threading.Timer :
Dans ton programme à toi, tu travailles dans une boucle permanente qui tourne sans arrêt. Ce qui veut dire que tout ce que tu vas vouloir faire avec ton programme doit se trouver dans cette boucle infernale. La vitesse de ta boucle est conditionnée par le temps de toutes les instructions qui y sont exécutée et le programme est bloqué dans la boucle et aucune instruction extérieure ne peut être exécutée. Pour un batch de test occasionnel, ce n’est pas dramatique, mais si tu veux faire un programme qui doit tourner en tache de fond, c’est la pire façon de faire.

Dans mon exemple, le fonctionnement est totalement diffèrent. La procédure main() lance la procédure wifi2led en lui passant 1 en paramètre (1 seconde) puis elle peut continuer à faire autre chose, le programme n’est pas bloqué. Pendant ce temps, le timer wifi2led s’exécute de son côté et à chacun de ses propres appels, il se rappel automatiquement toutes les secondes par la ligne .....start(). J’ai utilisé cette méthode pour faire un code simple mais dans la réalité il faudrait ajouter une fonction pour démarrer/arrêter le timer proprement ou faire un thread contrôlé qui lui pourrait contenir une boucle temporisée au lieu d’un timer.

Rassure-toi, tous les débutants font la même erreur catastrophique en utilisant des boucles permanente sur le thread principale. Pour bien comprendre le phénomène tu peux lire ca :
http://www.framboise314.fr/penser-threa ... rogrammes/

L’exemple est en c++ mais ça explique simplement le ‘pourquoi du comment de parce que …’
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Le GPIO »