Les écrans à 7 segments les plus courants sont les « Cathodes Communes », auxquelles ont destinées, entre autres, les micropuces MAX7219 et MAX7221. Il existe également des « Anodes communes », qui sont généralement beaucoup moins chères. Cependant, elles ne sont pas directement compatibles avec une telle micropuce. Ce tutoriel montre comment tout cela fonctionne. Toute personne qui souhaite en savoir plus sur les anodes ou les différences peut le faire ici.
Accessoires
Inspiré par cet article, j’ai eu l’idée de rendre les écrans à anodes compatibles avec le Pi. Pour cela, nous avons besoin :
- 1-8 Écrans à 7 segments à anode commune (par exemple, ceux-ci ici)
- Pilote de l’écran LED MAX7219 (ou MAX7221)
- si nécessaire, des outils de soudure et des brasures
Connexion
Examinons d’abord la fiche technique de la CI.
Le lien avec les Raspberry Pi ressemble à ceci :
- RPi Broche 2 (5V) => Broche 19 (V+)
- RPi Broche 2 (5V) avec résistance de 10k ohm => Broche 18 (ISET)
- RPi Broche 6 (GND) => Broche 4 et Broche 9 (GND)
- RPi Broche 19 => Broche 1 (DIN)
- RPi Broche 23 => Broche 13 (CLK)
- RPi Broche 24 => Broche 12 (CHARGE)
Il s’agit maintenant des connexions entre l’écran à 7 segments et le MAX7219. En outre, la structure d’un tel affichage (pour s’assurer que les broches sont les mêmes, vous pouvez tester chaque broche sur deux piles de 1,5V en série, V+ sur le pôle positif et la broche respective sur le pôle négatif, la broche V + que vous connectez n’a pas d’importance):
Habituellement, pour un écran cathodique, ce serait DIG 0 – DIG 7 pour chacun des V+ d’un écran (donc aussi au maximum 8 segments par MAx7219) et SEG A à SEG DP connectés en parallèle aux connexions respectives de l’écran à segments (SEG A à toutes les broches A des segments, etc.) Mais comme les anodes sont maintenant polarisées dans l’autre sens, nous devons aussi échanger les connexions :
- DIG 0 => Connexions A (parallèle à toutes)
- …
- DIG 7 => Connexions DP (parallèle à tous)
- SEG A => V + le segment à l’extrême droite
- SEG B => V + le deuxième segment en partant de la droite
- …
- SEG DP => V + le segment le plus à gauche (seulement pour 8 segments)
Si vous avez moins de 8 segments, vous irez de droite à gauche tout au long et certaines broches SEG seront vides. Par exemple. Je n’ai que 4 segments connectés à SEG A – SEG D.
Soudé à un breadboard, il ressemble à ceci :
Contrôle
Tout d’abord, nous installons une bibliothèque pour le MAX7219 / 7221 afin de pouvoir le contrôler plus facilement. Si vous l’avez déjà fait (par exemple à cause de la matrice de points LED), vous pouvez bien sûr l’ignorer.
git clone https://github.com/rm-hull/max7219.git
&& cd max721
Après l’installation
sudo python setup.py install
Vous pouvez déjà tester les écrans. Inspiré par cet article, j’ai écrit un scénario pour le Pi :
sudo nano examples/segment.py
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 |
#!/usr/bin/env python import max7219.led as segment #saves the values of all segment displays (max 8) digValues = [0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000] def display(dig, value): values = {} values['0'] = 0b01111110 values['1'] = 0b00001100 values['2'] = 0b10110110 values['3'] = 0b10011110 values['4'] = 0b11001100 values['5'] = 0b11011010 values['6'] = 0b11111010 values['7'] = 0b00001110 values['8'] = 0b11111110 values['9'] = 0b11011110 values[-1] = 0b00000000 #empty sign values[' '] = 0b00000000 values['A'] = 0b11101110 values['b'] = 0b11111000 values['C'] = 0b01110010 values['d'] = 0b10111100 values['E'] = 0b11110010 values['F'] = 0b11100010 values['G'] = 0b01111010 values['H'] = 0b11101100 values['I'] = 0b01100000 values['J'] = 0b00011100 values['K'] = 0b11101010 values['L'] = 0b01110000 values['O'] = 0b01111110 values['P'] = 0b11100110 values['q'] = 0b11001110 values['r'] = 0b10100000 values['S'] = 0b11011010 values['t'] = 0b11110000 values['U'] = 0b01111100 values['-'] = 0b10000000 values['_'] = 0b00010000 bPosition = 0b00000001 if dig < 1: bPosition = bPosition<<dig-1 #go through all segment displays for x in range(8): if (values[value]) & (1 << x) : digValues[x] |= bPosition else: digValues[x] = (0b11111111 ^ bPosition) & digValues[x] #Senden segment.send_byte(x, digValues[x]) def showvalue(value): n = [char for char in str(value)] #fill all unused ads with the empty character n = ([-1]*8 + n)[-8:] n.reverse() index = 7 for i in n: display(index, i) index = index -1 def main(): segment.init() segment.clear() while True: x = str(raw_input('Bitte Wert eingeben: ')) showvalue(x) if __name__ == "__main__": main() |
Comme vous pouvez le voir, j’ai déjà prédéfini tous les chiffres et quelques lettres. Certaines lettres (par exemple M, N, X, Y, … ne peuvent pas être affichées correctement sur un écran à 7 segments, elles sont donc manquantes). Vous pouvez également définir des combinaisons pour d’autres caractères, mais faites attention à commencer par le verso (par exemple, seul le segment G serait 0b10000000, le segment A serait 0b00000010, etc.)
Voici deux images avec l’entrée « 1234 » et « StOP » (faites attention aux majuscules / minuscules, car je n’ai pas défini toutes les lettres).
Amusez-vous bien avec !