WebRadioRéveilWifi -1-

Suite de l'étude précédente
Depuis le temps que l'idée circule d'une hémisphère à l'autre de mon cerveau dérangé, j'ai eu l'occasion de jouer un peu avec le raspi, et de faire quelques tests…

  • Essentiellement ce qui touche à la gestion des GPIO, de l'allumage de led en bash, en C et en python, aux boutons déclencheurs d'événements.

D'abord sur plaque labo, il me fallait envisager un câblage en dur pour faire des choses plus sérieuses et ainsi m'affranchir des faux contacts et autres problèmes de rebond.

  • Sur une carte à trous, j'ai donc câblé 7 boutons de récup et un connecteur HE10 pour la relier au port GPIO du raspi.

Chaque bouton a donc sa résistance de pull-up de 10kΩ, et j'ai dû y adjoindre par la suite un condensateur de 100nF anti-rebond, car force est de constater que l'anti-rebond logiciel, bah c'est de la merde. (bouncetime=xxx ms)
Du coup la place n'étant pas prévue, il sont soudés à l'arrache… bah tant-pi.
dsc09789.jpg dsc09783.jpg
dsc09786.jpg dsc09788.jpg

Ajouté également un petit connecteur jack pour récupérer le 5V du Raspberry et alimenter un ampli audio mono à base de LM386, celui-là même que j'avais fabriqué en cours de techno[1] au collège.

  • Avec ceci et un script python je suis donc à même de déclencher une playliste contenant des adresses URL de webradio, chaque boutons ayant sa propre fonction.

L'inconvénient c'est que je prévoie pas mal de fonctions et qu'il n'y aura pas suffisamment de boutons… On pourrait donc être tenté de rajouter des GPIO au Raspberry Pi en utilisant une puce MCP23017 ou 23008, mais ça ferait trop de boutons sur un radio-réveil qu'on doit pouvoir manipuler dans la pénombre.

 Voici un exemple pour deux boutons :

#!/usr/bin/env python2.7
# coding: utf-8
import time    # import des modules nécessaires
import os, sys
import RPi.GPIO as GPIO

CHANNEL = 17    # Définition de variables utiles
CHANNEL2 = 18
long_press = 1
very_long_press = 3

GPIO.setmode(GPIO.BCM)    # initialisation des GPIO
GPIO.setup(CHANNEL, GPIO.IN)
GPIO.setup(CHANNEL2, GPIO.IN)

def bouton17(a):    # Fonction pour GPIO 17
    button_press_timer = 0
    GPIO.remove_event_detect(CHANNEL)    # empêche le bouton d'être détecté x fois de plus
    while True:
        if(GPIO.input(a) == GPIO.LOW ):    # bouton appuyé
            button_press_timer += 0.2    # incrémente tant que le bouton est maintenu
            print button_press_timer
            print a
        
        else:    # bouton relaché
            if (button_press_timer > very_long_press):    # comparaison des durées
                print"very long press : ", button_press_timer
            elif (button_press_timer > long_press):
                print"long press : ", button_press_timer
            elif (button_press_timer > 0):
                print"short press : ", button_press_timer
            button_press_timer = 0
        time.sleep(0.2)

def bouton18(b):    # Fonction pour GPIO 18
    button_press_timer = 0
    GPIO.remove_event_detect(CHANNEL2) # empêche le bouton d'être détecté x fois de plus
    while True:
        if(GPIO.input(b) == GPIO.LOW ): # bouton appuyé
            button_press_timer += 0.2 # incrémente tant que le bouton est maintenu
            print button_press_timer
            print b
        
        else:    # bouton relaché
            if (button_press_timer > very_long_press):    # comparaison des durées
                print"very long press : ", button_press_timer
            elif (button_press_timer > long_press):
                print"long press : ", button_press_timer
            elif (button_press_timer > 0):
                print"short press : ", button_press_timer
            button_press_timer = 0
        time.sleep(0.2)

# Définition du déclenchement des boutons à la détection du front descendant
GPIO.add_event_detect(CHANNEL, GPIO.FALLING, callback=bouton17, bouncetime=100)
GPIO.add_event_detect(CHANNEL2, GPIO.FALLING, callback=bouton18, bouncetime=100)

while True:
    
    time.sleep (2)
GPIO.cleanup()    # Réinitialisation des GPIO en sortie de script

À charge donc de remplacer les print par les commandes désirées.
Voir aussi la doc de la librairie RPi.GPIO

À suivre…

Note

[1] EMT : Éducation Manuelle et Technologique, années 90

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Haut de page