Pré-requis
Le système d'exploitation utilisé est Ubuntu 10.04.2 LTS x64.
Paquets
Les paquets suivants sont requis :
Ils sont installées depuis les dépôts Ubuntu, par exemple à l'aide de la commande :
~$ sudo apt-get install python python-serial
Bibliothèque pyBusPirateLite
Des bibliothèques permettant de piloter le Bus Pirate en mode binaire sont disponibles sur sa forge, et plus particulièrement la bibliothèque pyBusPirateLite. La version utilisée dans cet article est la release 598. Il est possible de la récupérer sur la forge ou en téléchargeant cette archive.
Pilotage du MAX7219
Une présentation du MAX7219 a déjà été proposée dans cet article.
Bibliothèque MAX7219
Le meilleur moyen de produire du logiciel modulaire et réutilisable est de développer une bibliothèque. La bibliothèque MAX7219 est composée de deux fichiers :
Le fichier max7219.py constitue l'API de la bibliothèque.
#!/usr/bin/env python
# encoding: utf-8
"""
Copyright (C) 2011 Julien Le Sech - www.idreammicro.com
The MAX7219 Bus Pirate library is free software: you can redistribute it and/or
modify it under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your option)
any later version.
The MAX7219 Bus Pirate library is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/
"""
from serial.serialutil import SerialException
from pyBusPirateLite.SPI import *
from max7219_constants import *
class ShutdownMode:
"""
Shutdown modes.
"""
Shutdown = 0x00
NormalOperation = 0x01
class DisplayTest:
"""
Display test modes.
"""
NormalOperation = 0x00
TestMode = 0x01
class ScanLimit:
"""
Scan limits.
"""
Digit0 = 0x00
Digit0To1 = 0x01
Digit0To2 = 0x02
Digit0To3 = 0x03
Digit0To4 = 0x04
Digit0To5 = 0x05
Digit0To6 = 0x06
Digit0To7 = 0x07
class Intensity:
"""
Intensities.
"""
Level0 = 0x00
Level1 = 0x01
Level2 = 0x02
Level3 = 0x03
Level4 = 0x04
Level5 = 0x05
Level6 = 0x06
Level7 = 0x07
Level8 = 0x08
Level9 = 0x09
Level10 = 0x0A
Level11 = 0x0B
Level12 = 0x0C
Level13 = 0x0D
Level14 = 0x0E
Level15 = 0x0F
class DecodeMode:
"""
Decode modes.
"""
NoDecode = 0x00
Digit0 = 0x01
Digit1 = 0x02
Digit2 = 0x04
Digit3 = 0x08
Digit4 = 0x10
Digit5 = 0x20
Digit6 = 0x40
Digit7 = 0x80
AllDigits = 0xFF
class Digit:
"""
Digits.
"""
Digit0 = 0x01
Digit1 = 0x02
Digit2 = 0x03
Digit3 = 0x04
Digit4 = 0x05
Digit5 = 0x06
Digit6 = 0x07
Digit7 = 0x08
class Character:
"""
Characters.
"""
Zero = 0x00
One = 0x01
Two = 0x02
Three = 0x03
Four = 0x04
Five = 0x05
Six = 0x06
Seven = 0x07
Eight = 0x08
Nine = 0x09
Dash = 0x0A
E = 0x0B
H = 0x0C
L = 0x0D
P = 0x0E
Blank = 0x0F
class Segment:
"""
Segments.
"""
DP = 0x80
A = 0x40
B = 0x20
C = 0x10
D = 0x08
E = 0x04
F = 0x02
G = 0x01
class Max7219:
"""
This class allow to drive a MAX7219 using Bus Pirate.
"""
def __init__(self, port, baudrate):
self.port = port
self.baudrate = baudrate
self.spi = SPI(self.port, self.baudrate)
def initialize(self):
"""
Initialize and configure Bus Pirate to drive a MAX7219.
"""
# Enter BitBang mode.
self.spi.BBmode()
# Enter SPI mode.
self.spi.enter_SPI()
# Set SPI speed.
self.spi.set_speed(SPISpeed._1MHZ)
# Configure pins.
self.spi.cfg_pins(PinCfg.POWER | PinCfg.CS)
# Configure SPI.
self.spi.cfg_spi(SPICfg.OUT_TYPE | SPICfg.CLK_EDGE)
def set_shutdown_mode(self, shutdown_mode):
"""
Set shutdown mode.
"""
self.write(REG_SHUTDOWN, shutdown_mode)
def set_display_test(self, display_test):
"""
Set display test mode.
"""
self.write(REG_DISPLAY_TEST, display_test)
def set_scan_limit(self, scan_limit):
"""
Set scan limit.
"""
self.write(REG_SCAN_LIMIT, scan_limit)
def set_intensity(self, intensity):
"""
Set intensity.
"""
self.write(REG_INTENSITY, intensity)
def set_decode_mode(self, decode_mode):
"""
Set decode mode.
"""
self.write(REG_DECODE_MODE, decode_mode)
def write_digit(self, digit, value, decimal_point = False):
"""
Write digit value.
"""
if decimal_point == True:
value = value | 0x80
self.write(digit, value)
def write(self, address, value):
"""
Write register value.
"""
self.spi.CS_Low()
self.spi.bulk_trans(2, [address, value])
self.spi.CS_High()
Ses différents membres sont importés à l'aide de la directive :
from max7219 import *
Les adresses des registres du MAX7219 sont contenues dans le fichier max7219_constants.py.
#!/usr/bin/env python # encoding: utf-8 """ Copyright (C) 2011 Julien Le Sech - www.idreammicro.com This file is part of the MAX7219 Bus Pirate library. The MAX7219 Bus Pirate library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The MAX7219 Bus Pirate library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ """ REG_NO_OP = 0x00 REG_DIGIT_0 = 0x01 REG_DIGIT_1 = 0x02 REG_DIGIT_2 = 0x03 REG_DIGIT_3 = 0x04 REG_DIGIT_4 = 0x05 REG_DIGIT_5 = 0x06 REG_DIGIT_6 = 0x07 REG_DIGIT_7 = 0x08 REG_DECODE_MODE = 0x09 REG_INTENSITY = 0x0A REG_SCAN_LIMIT = 0x0B REG_SHUTDOWN = 0x0C REG_DISPLAY_TEST = 0x0F
Interpréteur Python
Piloter le MAX7219 via l'interpréteur Python est sans doute le meilleur moyen de le découvrir et de comprendre son fonctionnement.
On se place dans le dossier de la bibliothèque.
~$ cd pyBusPirateLite/
On lance le shell Python.
~/pyBusPirateLite$ python
La console affiche le prompt.
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
On pilote le MAX7219.
>>> from max7219 import *
>>> device = Max7219('/dev/ttyUSB0', 115200)
>>> device.initialize()
>>> device.set_scan_limit(ScanLimit.Digit0To7)
>>> device.set_intensity(Intensity.Level15)
>>> device.set_decode_mode(DecodeMode.AllDigits)
>>> device.write_digit(Digit.Digit0, Character.Zero)
>>> device.write_digit(Digit.Digit1, Character.One)
>>> device.write_digit(Digit.Digit2, Character.Two)
>>> device.write_digit(Digit.Digit3, Character.Three)
>>> device.write_digit(Digit.Digit4, Character.Four)
>>> device.write_digit(Digit.Digit5, Character.Five)
>>> device.write_digit(Digit.Digit6, Character.Six)
>>> device.write_digit(Digit.Digit7, Character.Seven)
>>> device.set_shutdown_mode(ShutdownMode.NormalOperation)
Logiciel de démonstration
Une fois le fonctionnement du MAX7219 assimilé, il peut être intéressant d'en garder une trace qui sera consultable ultérieurement. C'est pourquoi on écrit maintenant un logiciel de démonstration exploitant la bibliothèque développée précédemment.
#!/usr/bin/env python
# encoding: utf-8
"""
Copyright (C) 2011 Julien Le Sech - www.idreammicro.com
This file is part of the MAX7219 library for Bus Pirate.
This library is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option)b any later
version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for moredetails.
You should have received a copy of the GNU General Public License along with
this program. If not, see http://www.gnu.org/licenses/
"""
import argparse
import sys
from max7219 import *
def main():
"""
This program drives a MAX7219 using Bus Pirate in binary mode.
"""
# Parse arguments.
parser = argparse.ArgumentParser()
parser.add_argument(
"-p", "--port", dest = "port", default = "/dev/ttyUSB0",
help = "Serial port to use.")
parser.add_argument(
"-b", "--baudrate", dest = "baudrate", default = "115200",
help = "Baudrate")
args = parser.parse_args()
print "Serial port = " + args.port
print "Baudrate = " + args.baudrate
# Create MAX7219 object.
device = Max7219(args.port, args.baudrate)
# Initialize MAX7219.
device.initialize()
# Set scan limit.
device.set_scan_limit(ScanLimit.Digit0To7)
# Set intensity.
device.set_intensity(Intensity.Level15)
# Set decode mode.
device.set_decode_mode(DecodeMode.AllDigits)
# Write digits.
device.write_digit(Digit.Digit0, Character.Zero)
device.write_digit(Digit.Digit1, Character.One)
device.write_digit(Digit.Digit2, Character.Two)
device.write_digit(Digit.Digit3, Character.Three)
device.write_digit(Digit.Digit4, Character.Four)
device.write_digit(Digit.Digit5, Character.Five)
device.write_digit(Digit.Digit6, Character.Six)
device.write_digit(Digit.Digit7, Character.Seven)
# Enable display.
device.set_shutdown_mode(ShutdownMode.NormalOperation)
if __name__ == '__main__':
main()
Licence
La bibliothèque MAX7219 pour le Bus Pirate est placée, tout comme la bibliothèque pyBusPirateLite, sous licence GNU General Public License (GPL) v3.
Conclusion
Au travers de cet article, on vient d'expérimenter le pilotage du contrôleur d'affichage MAX7219 qui a précédemment fait l'objet d'un article purement théorique. Mais on vient également de découvrir un outil conçu et développé pour ce genre d'expérimentation : le Bus Pirate et son mode binaire.
