Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
746 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Logiciels

  [RaspberryPi3] Bouton bluetooth

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RaspberryPi3] Bouton bluetooth

n°1404318
nomiss
La rootine
Posté le 28-05-2017 à 11:03:02  profilanswer
 

Salut, je cherche à faire un bouton pour rendre visible mon raspberry en bluetooth et qu'un telephone puisse s'y connecter.

 

Pour le moment j'appuie sur un bouton et ca fait clignoter une LED durant 5 clignotements l'apparaige bluetooth.

 

Par la suite j'aimerai que la LED reste continuellement allumée en statique.

 

Programme du bouton récupéré sur internet, quand j'appuie sur le bouton il appelle le script python pour faire clignoter ma LED.

 

Script bluetooth_button.py

Code :
  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. import RPi.GPIO as GPIO
  4. GPIO.setmode(GPIO.BCM)
  5. # Le GPIO 18 est initialise en entree. Il est en pull-up pour eviter les faux signaux
  6. GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  7. try:
  8.     GPIO.wait_for_edge(18, GPIO.FALLING)
  9.     print "\nAppui detecte. Maintenant votre script va"
  10.     print "effectuer l'action correspondant a un appui sur le bouton."
  11.     execfile("bluetooth_appairage.py" ) #Exectution du script bluetooth_appairage.py
  12. except KeyboardInterrupt:
  13.     GPIO.cleanup()       # reinitialisation GPIO lors d'une sortie CTRL+C
  14. GPIO.cleanup()           # reinitialisation GPIO lors d'une sortie normale
 

Script bluetooth_appairage.py

Code :
  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. #-------------------------------------------------------------------------------
  4. # Bibliothèquese
  5. #-------------------------------------------------------------------------------
  6. import RPi.GPIO as GPIO                 #bibliothèque RPi.GPIO
  7. import time                             #bibliothèque time
  8. #-------------------------------------------------------------------------------
  9. GPIO.setwarnings(False)                 #désactive le mode warning
  10. GPIO.setmode(GPIO.BCM)                  #utilisation des numéros de ports du
  11.                                         #processeur
  12. GPIO.setup(23, GPIO.OUT)                #mise en sortie du port GPIO 23 (broche
  13.                                         #16 du connecteur)
  14. if __name__ == '__main__':
  15.     """
  16.     Programme par défaut
  17.     """
  18.     execfile("bluetooth_scan_on.py" )
  19.     print("Début du programme LED clignotante" )
  20.                                         #message IHM
  21.     blink = 0
  22.     while blink <= 5 :                  #10 états avant l'arrêt
  23.         GPIO.output(23, GPIO.HIGH)      #sortie 23 high
  24.         time.sleep(1)                   #attente 1 seconde
  25.         GPIO.output(23, GPIO.LOW)       #sortie 23 low
  26.         time.sleep(1)                   #attente 1 seconde
  27.         blink+=1
  28.     execfile("bluetooth_scan_off.py" )
  29. #---------------------------------------------------------------------------
 

Script bluetooth_scan_on.py

Code :
  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. import dbus
  4. import dbus.mainloop.glib
  5. global mainloop
  6. dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  7. bus = dbus.SystemBus()
  8. adapter_props = dbus.Interface(bus.get_object('org.bluez', '/org/bluez/hci0'),
  9.                                    "org.freedesktop.DBus.Properties" );
  10. adapter_props.Set("org.bluez.Adapter1", "Discoverable", dbus.Boolean(1))
  11. print "Scan bluetooth activé"
 

Script bluetooth_scan_off.py

Code :
  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. import dbus
  4. import dbus.mainloop.glib
  5. global mainloop
  6. dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  7. bus = dbus.SystemBus()
  8. adapter_props = dbus.Interface(bus.get_object('org.bluez', '/org/bluez/hci0'),
  9.                                    "org.freedesktop.DBus.Properties" );
  10. adapter_props.Set("org.bluez.Adapter1", "Discoverable", dbus.Boolean(0))


Message cité 1 fois
Message édité par nomiss le 28-05-2017 à 11:30:08
mood
Publicité
Posté le 28-05-2017 à 11:03:02  profilanswer
 

n°1404319
bardiel
Debian powa !
Posté le 28-05-2017 à 12:54:57  profilanswer
 

nomiss a écrit :

Par la suite j'aimerai que la LED reste continuellement allumée en statique.


Tip pour t'orienter : sous quelle(s) condition(s) la LED représentant ton BT doit resté allumée ?
 
Perso pour ta partie de scan je ferais ainsi (je fais pas en Python, trop longtemps que j'en ai pas fait, donc en "explication" ) :
 

scan_bt(start)
n=false;
g=0;
while (n=true) do
    allumer_LED()
    attendre_1_seconde
    g=g+1
    if (g=30) or (verif_status_bt()=true) n=true
}
scan_bt(stop)


Avec :
- un script scan_bt qui reprendre tes bluetooth_scan_on.py et bluetooth_scan_off.py mais exécuter de manière différencié suivant la valeur entrée
- un script verif_status_bt qui vérifie si un appareil s'est appairé
- passage à 30 secondes ou si un appareil s'est connecté
 
Après le BT pour les téléphones c'est un peu dépassé, c'est plus vers le WiFi que tu devrais t'orienter.
Ce n'est vraiment plus utilisé que pour les casques (en AD2P) et les (rares) souris BT...


---------------
Achievement unlocked : double TT pour avoir dénoncer un floodeur impoli sur le topic "Discussion avec la modération" de la cat' OS Alternatif
n°1404320
nomiss
La rootine
Posté le 28-05-2017 à 13:15:12  profilanswer
 

bardiel a écrit :


Tip pour t'orienter : sous quelle(s) condition(s) la LED représentant ton BT doit resté allumée ?

 

Perso pour ta partie de scan je ferais ainsi (je fais pas en Python, trop longtemps que j'en ai pas fait, donc en "explication" ) :

 

scan_bt(start)
n=false;
g=0;
while (n=true) do
    allumer_LED()
    attendre_1_seconde
    g=g+1
    if (g=30) or (verif_status_bt()=true) n=true
}
scan_bt(stop)


Avec :
- un script scan_bt qui reprendre tes bluetooth_scan_on.py et bluetooth_scan_off.py mais exécuter de manière différencié suivant la valeur entrée
- un script verif_status_bt qui vérifie si un appareil s'est appairé
- passage à 30 secondes ou si un appareil s'est connecté

 

Après le BT pour les téléphones c'est un peu dépassé, c'est plus vers le WiFi que tu devrais t'orienter.
Ce n'est vraiment plus utilisé que pour les casques (en AD2P) et les (rares) souris BT...

 

Super merci pour ta réponse.

 

En fait je me basais sur le fonctionnement d'enceinte nomade bluetooth. Donc faudrait que l'équipement soit sur le meme réseau que mon raspberry pour jouer des sons dessus ? comment ça fonctionne ?

 

Après ce qui me plait dans le bluetooth c'est que j'ai pas besoin que la personne soit sur mon réseau pour jouer sa musique.

Message cité 1 fois
Message édité par nomiss le 28-05-2017 à 13:22:13
n°1404322
nomiss
La rootine
Posté le 28-05-2017 à 14:02:57  profilanswer
 

EDIT : j'ai tout réuni dans un seul script

 
Code :
  1. def LED_BLINK():
  2.         device = False
  3.         blink = 0
  4.         while (blink <= 5) and (device==False) :                  #10 états avant l'arrêt
  5.                 GPIO.output(23, GPIO.HIGH)      #sortie 23 high
  6.                 time.sleep(1)                   #attente 1 seconde
  7.                 GPIO.output(23, GPIO.LOW)       #sortie 23 low
  8.                 time.sleep(1)                   #attente 1 seconde
  9.                 blink+=1
  10. def BLUETOOTH_SCAN_ON():
  11.         global mainloop
  12.         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  13.         bus = dbus.SystemBus()
  14.         adapter_props = dbus.Interface(bus.get_object('org.bluez', '/org/bluez/hci0'),
  15.                                    "org.freedesktop.DBus.Properties" );
  16.         adapter_props.Set("org.bluez.Adapter1", "Discoverable", dbus.Boolean(1))
  17.         print "Scan bluetooth activé";
  18. def BLUETOOTH_SCAN_OFF():
  19.         global mainloop
  20.         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  21.         bus = dbus.SystemBus()
  22.         adapter_props = dbus.Interface(bus.get_object('org.bluez', '/org/bluez/hci0'),
  23.                                    "org.freedesktop.DBus.Properties" );
  24.         adapter_props.Set("org.bluez.Adapter1", "Discoverable", dbus.Boolean(0))
  25.         print "Scan bluetooth désactivé";
  26. #Debut______________________________________________________
  27. GPIO.setmode(GPIO.BCM)
  28. GPIO.setup(23, GPIO.OUT)
  29. GPIO.setwarnings(False)
  30. GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  31. GPIO.output(23, GPIO.HIGH) #La led reste allumée en statique
  32. try:
  33.     GPIO.wait_for_edge(18, GPIO.FALLING)
  34.     print "Appui detecte"
  35.     BLUETOOTH_SCAN_ON()
  36.     LED_BLINK()
  37. except KeyboardInterrupt:
  38.     GPIO.cleanup()       # reinitialisation GPIO lors d'une sortie CTRL+C
  39. GPIO.cleanup()           # reinitialisation GPIO lors d'une sortie normale


Message édité par nomiss le 28-05-2017 à 14:03:22
n°1404330
bardiel
Debian powa !
Posté le 28-05-2017 à 20:23:36  profilanswer
 

nomiss a écrit :

En fait je me basais sur le fonctionnement d'enceinte nomade bluetooth. Donc faudrait que l'équipement soit sur le meme réseau que mon raspberry pour jouer des sons dessus ? comment ça fonctionne ?


En BT, il te faudra passer par de l'AD2P.

nomiss a écrit :

Après ce qui me plait dans le bluetooth c'est que j'ai pas besoin que la personne soit sur mon réseau pour jouer sa musique.


Rien t'empêche d'avoir X réseaux WiFi différents. La seule contrainte c'est que tu ne peux te connecter vraiment qu'à un seul à la fois, d'où bien savoir où tu veux en venir avec ton projet là...


---------------
Achievement unlocked : double TT pour avoir dénoncer un floodeur impoli sur le topic "Discussion avec la modération" de la cat' OS Alternatif
n°1404346
nomiss
La rootine
Posté le 29-05-2017 à 10:29:46  profilanswer
 

bardiel a écrit :


En BT, il te faudra passer par de l'AD2P.


 

bardiel a écrit :


Rien t'empêche d'avoir X réseaux WiFi différents. La seule contrainte c'est que tu ne peux te connecter vraiment qu'à un seul à la fois, d'où bien savoir où tu veux en venir avec ton projet là...


 
Le BT et AD2P fonctionne bien sur Ubuntu Mate sur Rpi3 (contrairement à Raspbian où je n'ai pas réussi à le faire fonctionner (ndlr : A2DP) ).  
 
De plus mon LAN et mon WLAN sont dans 2 réseaux différents. De ce fait, je veux utiliser un système d'appairage bluetooth simple, à la manière d'une enceinte bluetooth. Ca fonctionne bien.  
 
Pour mon script, ça avance bien. À présent, je lance le script, la LED est statique, quand j'appuie sur le bouton elle clignote et passe le Rpi3 en mode découvrable via Bt, au bout de 10 clignotements ou d'appareil appairé (non fonctionnel), le script s'arrête pour l'instant.
 
à faire : exécuter le script au boot du Rpi3, faire tourner le script en boucle, pour que la LED reste allumée en statique et que le bouton soit toujours utilisable. Voir comment sortir de la boucle de clignotement quand un appareil est appairé. Je cherche une commande python qui pourrait regarder si un appareil est connecté et si oui, la variable passe en TRUE, et quitte le boucle de clignotement puis repasse la LED en statique et le bouton en état "d'écoute"
 
En parallèle, j'ai fait un autre bouton pour éteindre le Rpi3, assez simple.


Message édité par nomiss le 29-05-2017 à 10:32:13
n°1404433
nomiss
La rootine
Posté le 31-05-2017 à 13:13:47  profilanswer
 

ça avance, pour sortir de ma boucle d'appairage, pour rappel : la led s'arrete de clignoter au bout de 30 fois ou bien si un appareil s'est connecté.
 
J'ai trouvé comment faire. Dès qu'un appareil est appairé, il y a un device qui apparait dans /sys/../../device* (* = 1 2 3 4 5 6 ...). Je vais donc m'appuyer dessus pour remplir ma condition de sortie de boucle avec le module os.path.isdir de python, qui retourne True ou False si le dossier existe ou non. Le soucis c'est que le chiffre du dossier peut varier et que os.path.isdir ne prend pas en compte le * d'après ce que j'ai pu lire/essayer.  
 
Il y a le module glob qui me retourne le nom du dossier quand je lui défini la valeur à chercher avec une étoile. Voilà une idée ci-dessous, mais je n'arrive pas à quitter ma boucle...
 
Voici mon script de test (je n'ai pas le Rpi à porter de main, je bosse sur un python windows)

Code :
  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. import time
  4. import os
  5. import glob
  6. def BLINK():
  7.     blink = 0
  8.     device = False
  9.     while blink <= 5 and device == False :                  #10 états avant l'arrêt
  10.         print ("blink =",blink)
  11.         print ("device =",device)
  12.         print("LED allumée" )      #sortie 23 high
  13.         time.sleep(1)                   #attente 1 seconde
  14.         print("LED eteinte" )       #sortie 23 low
  15.         time.sleep(1)                   #attente 1 seconde
  16.         blink+=1
  17.         DEVICE();
  18. def DEVICE():
  19.     device = False
  20.     if glob.glob("C:\device*" ):
  21.             print("ok True" )
  22.             device = True
  23.     else:
  24.             print("nop" )
  25.             device = False;
  26.        
  27. BLINK()


 
 
EDIT : bon j'ai trouvé une solution j'ai écrit ma procédure DEVICE dans BLINK directement, je voulais éviter mais au moins ça marche :

Code :
  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. import time
  4. import os
  5. import glob
  6. def BLINK():
  7.     directory_device = "C:\devicfe*"
  8.     blink = 0
  9.     device = False
  10.     while blink <= 3 and device == False :  #10 états avant l'arrêt ou Device détécté ou non
  11.         print("LED allumée" )    #sortie 23 high
  12.         time.sleep(1)           #attente 1 seconde
  13.         print("LED eteinte" )    #sortie 23 low
  14.         time.sleep(1)           #attente 1 seconde
  15.         blink+=1                #on incrémente de 1
  16.         if glob.glob(directory_device): #Chemin vers les devices connectés en bluetooth
  17.             print("Appareil connecté" )
  18.             device = True           #device passe à True pour sortie de la boucle While
  19.     if blink == 4:
  20.         print("Aucun appareil connecté" );
  21. BLINK()


Message édité par nomiss le 31-05-2017 à 13:45:01

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Logiciels

  [RaspberryPi3] Bouton bluetooth

 

Sujets relatifs
Micro-casque bluetooth Fedora[bluetooh] enceinte pulseaudio (cinnamon & pulseaudio-equalizer)
Problème Bluetooth Ubuntu: transfert de fichiers impossiblefaire fonctionner mon bluetooth
[Ubuntu] Bluetooth capricieuxBacktrack et Adaptateur Bluetooth
[archlinux] divers: qupzilla & indicator-bluetoothProblème Ubuntu Gnome Bluetooth
clavier souris bluetooth plus reconnuDistributions avec support de la carte WIFI/Bluetooth Ralink RT3290
Plus de sujets relatifs à : [RaspberryPi3] Bouton bluetooth



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR