まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

WebRadioRéveilWifi -1-

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

Commentaires

1. Le mardi, 15 juillet 2014, 09:00 par Nikos

Toujours intéressant à lire ton blog.

J'avoue que certaines notions abordées ici dépassent mes connaissances, mais je vais m'améliorer, j'en profite aussi pour te prévenir que j'ai trouvé un nouveau magazine "hackable magazine" qui aborde la base (c'est le numéro 1 qui vient de sortir). Je pense sérieusement potasser ce sujet, savoir comment ça fonctionne c'est toujours intéressant.

2. Le jeudi, 17 juillet 2014, 20:05 par MaKoTo

C'est un billet d'étape un peu rapide il est vrai, là pour communiquer un peu sur l'avancée des tests qui déboucheront sur un prototype simpliste mais fonctionnel que je mettrais à jour de temps en temps.
Je compte donc écrire quelque chose de plus détaillé quand j'aurais des choses plus précises à montrer.
Cependant ce que je décide d’expliquer peut passer sous silence certaines choses qui me paraissent évidentes, oubliant à qui je m'adresse (d’ailleurs à qui ? Là réside toute la difficulté).
Il suffit alors de demander des précisions et on verra si c'est explicable simplement, sans nécessiter un arrière plan de connaissances indigestes.

J'ai pu apercevoir ce magasine présenté au Maker Faire Paris, sans trop m'y intéresser. Avant internet, j'ai trop souvent été déçu par la presse papier dans ces domaines, souvent très avare en explication pour le débutant, le laissant planté là sans aide… À moins qu'il ne soit très bien rédigé, avec le web, ça peut être être une bonne entrée en matière, une source d'intronisation.
Cependant, considérant ce média comme mort, je compte sur d'autres personnes dans mon genre pour partager des articles très détaillés sur leur blog.
Contribuer me semple la meilleur façon de les remercier.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet