Python, GPIO, Max7221 et 6 afficheurs 7 segments
Bonjour,
Je débute en Python, il fallait bien qu'un jour je m'amuse avec ce langage. Je me suis débrouillé seul jusqu'à present, mais la je suis tombé sur un os, j'ai beau essayé de le ronger dans tous les sens, je n'arrive pas en extraire la moelle qui me permettra d'avancer.
Le principe est : j'ai un vieux jukebox avec un système laser obsolète et surtout plus maintenu par Pioneer. Donc j'ai eu l'idée d'utilisé un Raspberry Pi 3 avec un Raspbian Jessie. Au debut, j'ai voulu utilisé un Raspbian Stretch, mais il semblerait que Stretch ne gère plus simplement l'interface IR, donc j'ai fait un downgrade vers Jessie.
J'ai installé MPD et MPC pour faire jouer les morceaux de musique, mais voulant conserver les interfaces IHM d'origine du jukebox (clavier, afficheurs 7 segments et télécommande) j'ai eu l'idée de faire un petit programme Python pour m'interfacer avec MPC.
Actuellement Le clavier matriciel fonctionne avec la télécommande IR, il me reste à gérer l'affichage sur mes 6 (2+4) afficheurs 7 segments Anodes Communes. J'ai déjà utilisé un MAX7221 avec un Arduino pour un affichage sur une matrice de led, avec succès. Je maîtrise le GPIO (utilisé pour le clavier matriciel et le récepteur IR). Bien sur j'ai inversé la partie Segment/Digit du Max7221, car il est prévu pour des afficheurs 7 segments Cathodes Communes.
J'ai trouvé 2 methodes pour utiliser le MAX7221 :
- luma.led_matrix : si j'essaie de l'installer par pip, j'ai l'erreur : Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-4a9hxs9f/smbus2/
- luma.led_matrix : si j'essaie de l'installer depuis github, et que je l'installe avec "sudo python setup.py install" j'ai une erreur : error in luma.led_matrix setup command: 'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.
- Utilisation du GPIO comme je le ferai sur un Arduino
N'arrivant pas à installer le package luma, je ne peux pas tester en utilisant le package. Je suis trop debutant pour comprendre ce qui bloque l'installation.
En utilisant les GPIO, je n'arrive à rien non plus
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
#!/usr/bin/env python
# File rpi_7219b.py
# http://www.bristolwatch.com/index.htm
# By Lewis Loflin - lewis@bvu.net
# Output time from system clock.
# Two bytes are shifted in first being address, second being data.
# Works the same as two 74165 SSRs in series or 16-bits.
# LD "pulseCS()" clocks 16-bit address/data into working registers.
# access to GPIO must be through root
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
LATCH = 24 # CS
CLK = 23
dataBit = 19 # DIN
GPIO.setup(LATCH, GPIO.OUT) # P0
GPIO.setup(CLK, GPIO.OUT) # P1
GPIO.setup(dataBit, GPIO.OUT) # P7
# Setup IO
GPIO.output(LATCH, 0)
GPIO.output(CLK, 0)
def pulseCLK():
GPIO.output(CLK, 1)
# time.sleep(.001)
GPIO.output(CLK, 0)
return
def pulseCS():
GPIO.output(LATCH, 1)
# time.sleep(.001)
GPIO.output(LATCH, 0)
return
# shift byte into MAX7219
# MSB out first!
def ssrOut(value):
for x in range(0,8):
temp = value & 0x80
if temp == 0x80:
GPIO.output(dataBit, 1) # data bit HIGH
else:
GPIO.output(dataBit, 0) # data bit LOW
pulseCLK()
value = value << 0x01 # shift left
return
# initialize MAX7219 4 digits BCD
def initMAX7219():
# set decode mode
ssrOut(0x09) # address
# ssrOut(0x00); // no decode
ssrOut(0xFF) # 4-bit BCD decode eight digits
pulseCS();
# set intensity
ssrOut(0x0A) # address
ssrOut(0x04) # 9/32
pulseCS()
# set scan limit 0-7
ssrOut(0x0B); # address
ssrOut(0x07) # 8 digits
# ssrOut(0x03) # 4 digits
pulseCS()
# set for normal operation
ssrOut(0x0C) # address
# ssrOut(0x00); // Off
ssrOut(0x01) # On
pulseCS()
# clear to all 0s.
for x in range(0,9):
ssrOut(x)
ssrOut(0)
pulseCS()
return
def writeMAX7219(data, location):
ssrOut(location)
ssrOut(data)
pulseCS()
return
def displayOff():
# set for normal operation
ssrOut(0x0C) # address
ssrOut(0x00); # Off
# ssrOut(0x01) # On
pulseCS()
def displayOn():
# set for normal operation
ssrOut(0x0C) # address
# ssrOut(0x00); # Off
ssrOut(0x01) # On
pulseCS()
initMAX7219()
# time returned as string
# But order is reversed relative to MAX7219.
str1 = time.strftime("%H:%M:%S")
# str2 = time.strftime("%d:%m:%Y")
print (str1)
# print len(str1) # 8
# x is digit position must be 1 to 8
# y is used for string pointer
while 1:
y = 7
for x in range(1, 9):
if str1[y] == ":":
# output "-"
writeMAX7219(10, x)
y = y - 1
continue # back to if
# convert y char to integer
writeMAX7219(int(str1[y]), x)
y = y - 1
str1 = time.strftime("%H:%M:%S")
print (str1)
print ("Stop")
time.sleep(20)
displayOff() |
Merci.
Mon coté débutant en python me bloque, ce n'est peut-être pas grand chose ou surement une erreur de ma part, mais je bloque. Alors si quelqu'un a la solution je veux bien un coup de main.
Merci.