Reveil/horloge à galvanomètres avec assistant vocal

Reveil/horloge à galvanomètres avec assistant vocal

Bonjour et bienvenue à tous pour ce nouveau tutoriel. Nous allons aujourd’hui fabriquer une horloge/réveil à base de galvanomètres avec assistant vocal respectueux de la vie privée. Ouf un sacré morceau.
J’adore les galvanomètres, c’est une technologie purement analogique avec un super look vintage.
Allez, c’est parti.

  1. Commençons par la liste du matériel qui est disponible ci-dessous. Je vous ai laissé les références pour retrouver tout cela plus facilement.
    Concernant les galvanomètres, c'est le plus difficile à choisir.
    Après pas mal de temps, j'ai trouvé que les galvanomètres 100 Ua DC sont parfait pour fonctionner avec le Raspberry Pi.
    Personnellement, j'adore le boîtier plastique noir et plaque d’aluminium. Ça rend super bien.
    Avant de commencer, voici une petite vidéo de présentation qui j’espère vous donnera envie de reproduire ce tutoriel chez vous.

  2. Vous l’avez vu, on va baser toute l’intelligence sur un Raspberry pi Zéro W, une superbe bête dotée de Wifi et Bluetooth.
    Puissant silencieux et qui ne consomme rien, que demander de plus.

    Les galvanomètres vont être pilotés avec les GPIO du Raspberry Pi. Afin de faire cela, je me suis fait plaisir et j’ai conçu un shield à poser directement sur la Raspberry pour que cela soit pratique avec un look professionnel.
    Pour cela, j’ai utilisé l’outil Fritzing, il me permet de créer des cartes électroniques de qualité professionnelle très facilement.
    Je me suis basé sur un template shield pour Raspberry Pi Zéro auquel j’ai greffé trois borniers avec résistance pour piloter les galvanomètres, un bornier pour piloter le rétroéclairage et une extension de 4 GPIO, masse, 5v et 3v3 afin de venir brancher différents modules dans le futur.
    J’ai pensé mettre un capteur de température/humidité ou alors un radar de mouvement, à voir.
  3. Et voila le résultat sur Fritzing
  4. Une fois le plaque sur Fritzing terminée, j’ai envoyé les fichiers à JLCPCB afin d’obtenir les plaques. C’est pas cher très facile et le résultat est super professionnel et propre.
    Pour ceux que cela intéresse, je peux vous fournir les fichiers Fritzing, il me reste aussi des plaques vierges. Contacter moi sur le blog habitat-domotique.fr
  5. Pour utiliser le galvanomètre avec le Raspberry, il va falloir un peu de travail préliminaire. En effet pour pouvoir piloter le galvanomètre, il va falloir utiliser les GPIO en mode PWM (modulation de largeur d'impulsion). C’est une manière un peu détournée qui permet de générer un signal analogique en utilisant une source numérique. Un signal PWM est constitué de deux composantes principales qui définissent son comportement : un rapport cyclique et une fréquence.

    Mais ce n’est pas tout, il faut aussi déterminer la résistance d’équilibre qui permet de tenir la position maximale du cadran en équilibre quand on envoie le signal 1 (en numérique) par le Raspberry. Sur ce point pas de secret, il faut faire des essais.

    Voici comment je calibre mes galvanomètres. Tout d’abord sans rien brancher, je règle la position basse du galvanomètre en utilisant la vis de réglage présente au milieu de la façade. Puis, pour régler la position haute, je branche le galvanomètre au Raspberry via un potentiomètre. Puis j’envoie le signal 1 et je joue avec le potentiomètre. Afin de trouver la valeur nécessaire pour tenir la valeur maximale du cadran à l’équilibre. Noté bien cette valeur, elle est importante pour la suite.
  6. En effet, sur le shield, vous avez remarqué qu’en le GPIO et le bornier, j’ai une résistance fixe et un potentiomètre en série.
    En faisant ainsi, je garde la possibilité de régler la valeur après le montage, car vous n’avez aucune certitude de tomber sur une valeur de résistance standard. Et le potentiomètre: de préférence prenez le multitour avec une résistance plus grande que nécessaire pour atteindre l’équilibre, afin de ne pas arriver à l’extrémité.
    Cela permet d’avoir et de conserver une précision maximale, c’est d’autant plus important sur le galvanomètre des secondes qui possède beaucoup de subdivisions.
  7. Pour le fond du galvanomètre, il a fallu scanner le fond d’origine et le retravailler par ordinateur, puis l’imprimer sur du papier photo.
    Merci à Nicolas Hue pour cela, le résultat est super.
  8. Afin d’augmenter l’effet WAOUH, j’ai ajouté à l’arriéré des galvanomètres une LED blanche pour le rétroéclairage.
  9. Le logiciel de pilotage se fait en python avec, comme base de travail, la librairie pigpio qui va se charger de piloter les GPIO.
    La petite astuce à fin d’augmenter la précision : j’ai augmenté le nombre de subdivisions de la plage de contrôle qui d’origine est à 255. En le passant à 510, on double ainsi le nombre de subdivisions et donc la précision.
    Et afin de faire correspondre la valeur de l’heure (par exemple avec la valeur nécessaire à envoyer aux GPIO), j’ai recréé une librairie qui existait à l'origine sous Arduino, mais pas en python.
    Elle permet d’effectuer un calcul de ratio avec les valeurs extrêmes du galvanomètre et les valeurs extrêmes de la plage de contrôle des GPIO.
    Si vous souhaitez plus d’information, regardez les commentaires du code.

  10. #!/usr/bin/env python
    #./galvaclock.py Day Hour Minute

    import sys, pigpio, time, datetime, pygame

    HOUR_OUTPUT_PIN = 6
    MIN_OUTPUT_PIN = 13
    SEC_OUTPUT_PIN = 19
    ALARM_LED_PIN = 26
    ALARM_MODE_SWITCH_PIN = 4
    ALARM_MODE = 0
    ALARM_JOUR = 0
    ALARM_HOUR = 0
    ALARM_MINUTE = 0
    DELAY_BETWEEN_LOOPS = 1
    WAV_FOLDER = 'ZELDA-X0.wav'

    def set_galva(valeurHeure, valeurMinute, valeurSeconde):
    pi.set_PWM_dutycycle(HOUR_OUTPUT_PIN, valeurHeure)
    pi.set_PWM_dutycycle(MIN_OUTPUT_PIN, valeurMinute)
    pi.set_PWM_dutycycle(SEC_OUTPUT_PIN, valeurSeconde)

    def start_alarm():
    pi.set_mode(ALARM_LED_PIN, pigpio.OUTPUT)
    pi.set_mode(ALARM_MODE_SWITCH_PIN, pigpio.INPUT)
    pi.set_pull_up_down(ALARM_MODE_SWITCH_PIN, pigpio.PUD_DOWN)

    def start_galva():
    pi.set_mode(HOUR_OUTPUT_PIN, pigpio.OUTPUT)
    pi.set_mode(MIN_OUTPUT_PIN, pigpio.OUTPUT)
    pi.set_mode(SEC_OUTPUT_PIN, pigpio.OUTPUT)
    pi.set_PWM_range(HOUR_OUTPUT_PIN, 510)
    pi.set_PWM_range(MIN_OUTPUT_PIN, 510)
    pi.set_PWM_range(SEC_OUTPUT_PIN, 510)
    set_galva (510, 510, 510)
    time.sleep(DELAY_BETWEEN_LOOPS)
    set_galva (0, 0, 0)

    def start_sound():
    pygame.init()
    my_sound = pygame.mixer.Sound(WAV_FOLDER)

    def valmap(value, fromLow, fromHigh, toLow, toHigh):
    return int((value-fromLow) * (toHigh-toLow) / (fromHigh-fromLow) + toLow)

    pi = pigpio.pi() #Connect to local Pi

    if (len(sys.argv) == 4) and (pi.connected):
    ALARM_JOUR = int(sys.argv[1])
    ALARM_HOUR = int(sys.argv[2])
    ALARM_MINUTE = int(sys.argv[3])

    start_alarm()
    start_galva()
    start_sound()
    else:
    print("\nNb arguments invalide ou de communication avec les GPIO")
    exit()

    try:
    while True:
    ALARM_MODE = pi.read(ALARM_MODE_SWITCH_PIN)
    date = datetime.datetime.now()

    if ALARM_MODE == 1: #See mode
    pi.write(ALARM_LED_PIN, 1)
    set_galva (valmap(ALARM_HOUR, 0, 23, 0, 510), valmap(ALARM_MINUTE, 0, 59, 0, 510), 510)
    else: #Work mode
    if (int(date.isoweekday()) == ALARM_JOUR) and (int(date.hour) == ALARM_HOUR) and (int(date.second) == ALARM_MINUTE): #Alarm mode
    while ALARM_MODE == 0:
    pi.write(ALARM_LED_PIN, 1)
    set_galva (valmap(ALARM_HOUR, 0, 23, 0, 510), valmap(ALARM_MINUTE, 0, 59, 0, 510), 510)
    my_sound.play()
    ALARM_MODE = pi.read(ALARM_MODE_SWITCH_PIN)
    else: #Clock mode
    pi.write(ALARM_LED_PIN, 0)
    set_galva (valmap(int(date.hour), 0, 23, 0, 510), valmap(int(date.minute), 0, 59, 0, 510), valmap(int(date.second), 0, 59, 0, 510))
    time.sleep(DELAY_BETWEEN_LOOPS)

    except KeyboardInterrupt:
    print("\nFin de traitement")

    set_galva (0, 0, 0)
    pi.stop() #Disconnect from Pi


    #Syntax
    #
    #valmap(value, fromLow, fromHigh, toLow, toHigh)
    #Parameters
    #
    #value: the number to map
    #fromLow: the lower bound of the value s current range
    #fromHigh: the upper bound of the value s current range
    #toLow: the lower bound of the value s target range
    #toHigh: the upper bound of the value s target range


  11. Pour l’assistant vocal, j’ai connecté une paire d’enceintes et un micro sur un hub USB le tout relié au Raspberry.
    Pour le logiciel, j’ai utilisé JARVIS, un excellent assistant vocal à adapter à ses besoins. Mais son plus gros atout en plus de sa simplicité, c’est son caractère respectueux de la vie privée, car il n’a pas forcement besoin d’internet pour vous comprendre.
    https://www.openjarvis.com/
    Sur cette partie je ne peux que vous conseiller de regarder directement sur le site, c'est très bien fait.
  12. On assemble le tout dans le boîtier et nous voici avec une horloge / réveil à galvanomètre avec assistant vocal intégré . De quoi faire baver d’envie vos amis geeks.
  13. Coté amélioration, je suis en train de travailler sur la possibilité de lui intégrer un micro onduleur afin de lui permettre de s’éteindre proprement en cas de coupure d’électricité.
    J'avais à l'origine dans l’idée de prendre le Jabra speak 510 comme haut-parleur micro d'ambiance Bluetooth, mais à lui tout seul, il me demandait la moitié du budget. En tout cas avec le matériel que j’ai le résultat n’est déjà pas trop mal.

    Et aussi finir de coller les supports du Raspberry Pi. et terminer proprement l'assemblage de l'enceinte
  14. Conclusion:

    Cela m’a demandé pas mal de travail en amont afin de préparer tous les éléments et notamment le shield, car c’était la première fois que je faisais appel à JLCPCB pour la fabrication.
    En tout cas, je suis super content du résultat. Cela faisait des années que je rêvais d’avoir cet objet unique qui mêle nouvelle et ancienne technologie.
  15. Et sans oublier, merci à toute l'équipe MIWC et conrad d'avoir rendu ce projet possible.
    On se retrouve bientôt pour un nouveau tutoriel !
Rating: 4.4/5. From 3 votes.

Connectez-vous pour voter
Please wait...
Réalisé par
Posté le
Univers
IoT
Temps de fabrication
1 mois
Niveau de difficulté
Expert
Matériel(s)
3
Galvanomètre 100 µA DC Code produit: 077799-62
1
Boîtier pupitre WeroPlast HITPULT 3003 Polystyrène expansé (EPS), aluminium graphite (L x l x h) 308 x 167 x 84 mm Code produit: 520780-62
1
Batterie d'accumulateurs (LiPo) 3.7 V 600 mAh Tattu TA-30C-600-1S1P-Molex-1 30 C stick système d'enfichage Molex Code produit: 1542426-62
1
Module de puissance PowerBoost 1000 Basic Adafruit 2030 Code produit: 1516578-62
1
Haut-parleurs Logitech S-150 USB Code produit: 916080-62
1
arte microSDHC SanDisk Ultra® 32 Go Class 10, UHS-I Standard de puissance A1, avec logiciel Android, avec adaptateur SD Code produit: 1595559-62
1
Microphone USB Renkforce UM-80 filaire avec câble Code produit: 1269654-62
1
Kit de refroidissement 1 pc(s) Code produit: 1267831-62
1
Bloc d'alimentation Raspberry Pi® Goobay 71889 noir 1 pc(s)
1
Hub USB 2.0 LogiLink 4 ports noir Code produit: 986337-62
1
Raspberry Pi® Zero WH Raspberry Pi® Zero WH 512 Mo 1 pc(s) Code produit: 1667360-62
1
Degson DG308-2.54-02P-14-00AH Bornier à vis 0.82 mm² Nombre tota Code produit: 1327242-62
3
Trimmer 10 kΩ VG067TL1B10K réglage vertical linéaire 0.2 W 1 pc(s) Code produit: 407547-62
3
Résistance à couche carbone TRU COMPONENTS 22kΩ sortie axiale
1
Résistance à couche carbone TRU COMPONENTS 220Ω
1
Résistance à couche carbone TRU COMPONENTS 3.3Ω
1
intérrupteur NO a impulsion
Outils
1
gaines thermorétractables
1
Fer à souder
1
étain
1
Pince coupante
1
Tournevis

Aucun commentaire. Soyez le premier à en écrire un !

Vous devez être connecté pour laisser un commentaire.