Ce MrdProgramme pour Raspberry permet de faire clignoter plusieurs guirlandes fixes à l’origine en code Morse.
Dans sa version actuelle, il ne nécessite rien de spécial, mais peut servir d’exemple simple pour le multithreading (un thread par guirlande).
Comme les guirlandes consomment plus que les sorties GPIO ne peuvent en donner (16mA par sortie), j’ai ajouté un ampli à base de transistor pour la puissance.
Objectifs:
- Faire clignoter une guirlande
- Emettre de code Morse sur les sorties GPIO
- utiliser les threads
Prérequis:
- Raspberry Pi
- qq composants électroniques (une résistance 330 Ohm et un transistor 2N222 par guirlande)
Les programmes utilisés sur le PC pour agir sur le Pi:
- Pour se connecter en mode console au Pi. au choix:
- Bitvise (pour se connecter & transférer des fichiers entre le PC & le Pi) Utilisateur: pi Mdp: raspberry
- Putty (pour se connecter) + Client FileZilla (pour transférer des fichiers entre le PC & le Pi). Utilisateur: pi Mdp: raspberry
- TightVnc (sur le PC) en option pour prendre la main sur le Pi. Mdp: MrdVnc
- Pour se connecter en mode console au Pi. au choix:
Etape 1: Création de la carte SD avec Raspbian Strech dessus
En 12/2022, c’est ce qu’il y avait de mieux.
- Ne laissez que le WiFi sur le Pi. Ni la fiche jack, ni l’USB vers l’Arduino.
- Téléchargez la dernière version de Raspbian (avec ou sans desktop), décompressez-la et copiez-la sur une carte SD: https://howchoo.com/pi/install-raspberry-pi-os ( dans les options avancées, activer les SSH et le WiFi)
Nota: Toutes les instructions suivantes (celles commençant par $) sont à saisir dans Bitvise ou Putty.
Elles sont « collables » par le presse-papier.
Dans Bitvise et Putty, le coller se fait par le clic droit de la souris.
Étape 2: Mise à jour du Pi et de son heure
$ sudo apt-get update
$ sudo dpkg-reconfigure tzdata
Etape 3a: Le programme Python « Morse ».
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Bibliothèques
import RPi.GPIO as GPIO #bibliothèque RPi.GPIO
import time #bibliothèque time
from random import *
import sys
from threading import Thread
# Initialisation des variables
Out_18=18 # la guirlande câblée sur la sortie 18
Out_23=23 # la guirlande câblée sur la sortie 23
GPIO.setwarnings(False) #désactive le mode warning
GPIO.setmode(GPIO.BCM) #utilisation des numéros de ports du processeur
GPIO.setup(Out_18, GPIO.OUT) #mise en sortie du port Out_18
GPIO.setup(Out_23, GPIO.OUT) #mise en sortie du port Out_23
# Pour faire varier la luminosité d’une guirlande (seule la sortie GPIO 18 en est capable)
# pwm = GPIO.PWM(Out_18, 50) # pwm à une fréquence de 50 Hz
# pwm.start(7)
MrdCode = {
‘A’: ‘.-‘, ‘B’: ‘-…’, ‘C’: ‘-.-.’, ‘D’: ‘-..’, ‘E’: ‘.’, ‘F’: ‘..-.’,
‘G’: ‘–.’, ‘H’: ‘….’, ‘I’: ‘..’, ‘J’: ‘.—‘, ‘K’: ‘-.-‘, ‘L’: ‘.-..’,
‘M’: ‘–‘, ‘N’: ‘-.’, ‘O’: ‘—‘, ‘P’: ‘.–.’, ‘Q’: ‘–.-‘, ‘R’: ‘.-.’,
‘S’: ‘…’, ‘T’: ‘-‘, ‘U’: ‘..-‘, ‘V’: ‘…-‘, ‘W’: ‘.–‘, ‘X’: ‘-..-‘,
‘Y’: ‘-.–‘, ‘Z’: ‘–..’,
‘0’: ‘—–‘, ‘1’: ‘.—-‘, ‘2’: ‘..—‘, ‘3’: ‘…–‘, ‘4’: ‘….-‘, ‘5’: ‘…..’,
‘6’: ‘-….’, ‘7’: ‘–…’, ‘8’: ‘—..’, ‘9’: ‘—-.’,
‘&’: ‘.-…’, « ‘ »: ‘.—-.’, ‘@’: ‘.–.-.’, ‘)’: ‘-.–.-‘, ‘(‘: ‘-.–.’, ‘:’: ‘—…’,
‘,’: ‘–..–‘, ‘=’: ‘-…-‘, ‘!’: ‘-.-.–‘, ‘.’: ‘.-.-.-‘, ‘-‘: ‘-….-‘, ‘+’: ‘.-.-.’,
‘ »‘: ‘.-..-.’, ‘?’: ‘..–..’, ‘/’: ‘-..-.’, ‘ ‘: ‘ ‘
}
#Fonctions pour les Dots & Dashes
def pause(units):
time.sleep(0.1 * units)
def dot(QuelleSortie):
print(« . », end= » »)
GPIO.output(QuelleSortie,True)
pause(1)
GPIO.output(QuelleSortie,False)
pause(2)
def dash(QuelleSortie):
print(« -« , end= » »)
GPIO.output(QuelleSortie,True)
pause(5)
GPIO.output(QuelleSortie,False)
pause(2)
message_18 = « Joyeux noel »
message_23 = « Bonne annee 2023 »
def Guirlande(MonOutput,MaPhrase):
global message_18
while 1:
message = MaPhrase + » «
message = » « .join(MrdCode[c] for c in message.upper())
for c in message:
if c == « . »:
dot(MonOutput)
elif c == « -« :
dash(MonOutput)
elif c== » « :
pause(5)
# Création des threads
t1 = Thread(target=Guirlande,args=(Out_18,message_18,))
t2 = Thread(target=Guirlande,args=(Out_23,message_23,))
# Démarrage des threads
t1.start()
t2.start()
#——————————————————————————-
Etape 3b: Le programme Python « Variateur ».
#!/usr/bin/python3
# -*- coding:utf-8 -*-
#——————————————————————————-
# Bibliothèques
#——————————————————————————-
import RPi.GPIO as GPIO #bibliothèque RPi.GPIO
import time #bibliothèque time
from random import *
#——————————————————————————-
# Initialisation des variables
IntensFixe=23
IntensVariable=18
EtatOut23=0
NbScrutOn23 = 25
NbScrutOff23 = 25
NbScrut23 = NbScrutOn23
Cmpt23=0
Cmpt223=0
NbScrut223 = 5
EtatOut24=0
NbScrutOn24 = 50
NbScrutOff24 = 50
NbScrut24 = NbScrutOn24
Cmpt24=0
Cmpt224=0
NbScrut224 = 7
CmptTournant=0
Sens=0.2
GPIO.setwarnings(False) #désactive le mode warning
GPIO.setmode(GPIO.BCM) #utilisation des numéros de ports du processeur
GPIO.setup(IntensFixe, GPIO.OUT) #mise en sortie du port GPIO 23
GPIO.setup(IntensVariable, GPIO.OUT) #mise en sortie du port GPIO 18
pwm = GPIO.PWM(IntensVariable, 50) # pwm à une fréquence de 50 Hz
CmptTournant = 7 # rapport cyclique initial de 7%
pwm.start(CmptTournant)
if __name__ == ‘__main__’:
« » »
Programme par défaut
« » »
print(« Début du programme LED clignotante »)
while 1:
CmptTournant+=Sens
if CmptTournant>=100:
CmptTournant=100
Sens=-Sens
if CmptTournant<=0:
CmptTournant=0
Sens=-Sens
#print(CmptTournant)
if Cmpt23 < NbScrut23 :
Cmpt23 += 1
#print(Cmpt23)
if EtatOut23==1:
GPIO.output(IntensFixe, GPIO.HIGH)
else:
GPIO.output(IntensFixe, GPIO.LOW)
if Cmpt23 >= NbScrut23:
Cmpt223+=1
if EtatOut23==0:
EtatOut23=1
NbScrut23=NbScrutOn23
if Cmpt223>=NbScrut223:
NbScrutOn23=randint(1,100)
NbScrut223=randint(1,10)
#print(« NbScrutOn23= « +str(NbScrutOn23)+ » et NbScrut223= « +str(NbScrut223))
Cmpt223=0
else:
EtatOut23=0
NbScrut23=NbScrutOff23
if Cmpt223>=NbScrut223:
NbScrutOff23=randint(1,100)
#print(« NbScrutOff23= « +str(NbScrutOff23))
Cmpt223=0
Cmpt23=0
if Cmpt24 < NbScrut24 :
Cmpt24 += 1
if EtatOut24==0:
#GPIO.output(IntensVariable, GPIO.HIGH)
pwm.ChangeDutyCycle(float(CmptTournant))
else:
#GPIO.output(IntensVariable, GPIO.LOW)
pwm.ChangeDutyCycle(float(0))
if Cmpt24 >= NbScrut24:
Cmpt224+=1
if EtatOut24==0:
EtatOut24=1
NbScrut24=NbScrutOn24
if Cmpt224>=NbScrut224:
NbScrutOn24=randint(1,100)
NbScrut224=randint(1,10)
#print(« NbScrutOn24= « +str(NbScrutOn24)+ » et NbScrut224= « +str(NbScrut224))
Cmpt224=0
else:
EtatOut24=0
NbScrut24=NbScrutOff24
if Cmpt224>=NbScrut224:
NbScrutOff24=randint(100,1000)
#print(« NbScrutOff24= « +str(NbScrutOff24))
Cmpt224=0
Cmpt24=0
time.sleep (.01)
#——————————————————————————-
Le câblage: