Skip to content

Latest commit

 

History

History
179 lines (133 loc) · 7.29 KB

README.md

File metadata and controls

179 lines (133 loc) · 7.29 KB

MAX7219 Driver

Interfacing LED matrix displays with the MAX7219 driver [PDF datasheet] in Python using hardware SPI on the Raspberry Pi. The particular LED matrix I bought can be acquired for a few pounds from Banggood. Likewise 7-segment displays are available from Ali-Express. There are many other outlets selling both types of devices on Ebay and other such places.

This library has recently had a major overhaul, and is not compatible with the earlier version. It now supports:

  • multiple cascaded devices
  • LED matrix and seven-segement variants

max7219 matrix

Python Usage

For the matrix device, initialize the matrix class:

import max7219.led as led

device = led.matrix()
device.show_message("Hello world!")

For the 7-segment devce, initialize the sevensegment class:

import max7219.led as led

device = led.sevensegment()
device.write_number(deviceId=0, value=3.14159)

The MAX7219 chipset supports a serial 16-bit register/data buffer which is clocked in on pin DIN every time the clock edge falls, and clocked out on DOUT 16.5 clock cycles later. This allows multiple devices to be chained together.

When initializing cascaded devices, it is necessary to specify a cascaded=... parameter, and generally methods which target specific devices will expect a deviceId=... parameter, counting from zero.

For more information, see http://max7219.readthedocs.org/

max7219 sevensegment

Pre-requisites

Ensure that the SPI kernel driver is enabled:

$ dmesg | grep spi
[    3.769841] bcm2708_spi bcm2708_spi.0: master is unqueued, this is deprecated
[    3.793364] bcm2708_spi bcm2708_spi.0: SPI Controller at 0x20204000 (irq 80)

And that the devices are successfully installed in /dev:

$ ls -l /dev/spi*
crw------- 1 root root 153, 0 Jan  1  1970 /dev/spidev0.0
crw------- 1 root root 153, 1 Jan  1  1970 /dev/spidev0.1

Follow the advice in the building and installing section below, or follow http://www.brianhensley.net/2012/07/getting-spi-working-on-raspberry-pi.html if the devices do not appear before proceeding.

GPIO pin-outs

The breakout board has two headers to allow daisy-chaining:

Board Pin Name Remarks RPi Pin RPi Function
1 VCC +5V Power 2 5V0
2 GND Ground 6 GND
3 DIN Data In 19 GPIO 10 (MOSI)
4 CS Chip Select 24 GPIO 8 (SPI CE0)
5 CLK Clock 23 GPIO 11 (SPI CLK)

NOTE: See below for cascading/daisy-chaining, power supply and level-shifting.

Building & Installing

For Raspian:

On setup while in raspbian config or post install by running sudo raspi-config you must enable SPI: 8 Advanced options > A6 SPI > Yes (Would you like the SPI interface enabled?) > OK > Yes (Would you like the SPI kernel module to be loaded by default?) > OK

$ cd max7219
$ sudo apt-get install python-dev python-pip
$ sudo pip install spidev
$ sudo python setup.py install

For Arch Linux:

# cd max7219
# pacman -Sy base-devel python2
# pip install spidev
# python2 setup.py install

Cascading, power supply & level shifting

The MAX7219 chip supports cascading devices by connecting the DIN of one chip to the DOUT of another chip. For a long time I was puzzled as to why this didnt seem to work properly for me, despite spending a lot of time investigating and always assuming it was a bug in code.

  • Because the Raspberry PI can only supply a limited amount of power from the 5V rail, it is recommended that any LED matrices are powered separately by a 5V supply, and grounded with the Raspberry PI. It is possible to power one or two LED matrices directly from a Raspberry PI, but any more is likely to cause intermittent faults & crashes.

  • Also because the GPIO ports used for SPI are 3.3V, a simple level shifter (as per the diagram below) should be employed on the DIN, CS and CLK inputs to boost the levels to 5V. Again it is possible to drive them directly by the 3.3V GPIO pins, it is just outside tolerance, and will result in intermittent issues.

max7219 levelshifter

Despite the above two points, I still had no success getting cascaded matrices to work properly. Revisiting the wiring, I had connected the devices in serial connecting the out pins of one device to the in pins of another. This just produced garbled images.

Connecting the CLK lines on the input side all together worked first time. I can only assume that there is some noise on the clock line, or a dry solder joint somewhere.

max7219 cascaded

Examples

Run the example code as follows:

$ sudo python examples/matrix_test.py

or

$ sudo python examples/sevensegment_test.py

NOTE: By default, SPI is only accessible by root (hence using sudo above). Follow these instructions to create an spi group, and adding your user to that group, so you don't have to run as root: http://quick2wire.com/non-root-access-to-spi-on-the-pi

References

License

The MIT License (MIT)

Copyright (c) 2015 Richard Hull

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.