Blog der Heimetli Software AG

UniPi: die Relais mit Python schalten

Mit dem UniPi-Board bekommt ein Raspberry Ein- und Ausgaenge die vernünftig gegen Störungen geschützt sind. Die Anschlüsse erfolgen über Printklemmen, was einen einfachen Einbau und Austausch ermöglicht.

Der Raspberry wird oben auf das Board gesetzt und über die Steckerleisten mit Strom versorgt.

UniPi-Board mit aufgesetztem Raspberry

Ansteuerung der Relais

Die Relais hängen nicht an den GPIOs vom Raspberry sondern an einem MCP23008, der über den I2C-Bus mit dem PI verbunden ist.

Der Chip wird über die Adresse 0x20 auf dem Bus angesprochen. Ein Blick ins Datenblatt zeigt dass für diese Betriebsart vor allem zwei Register wichtig sind:

  • IODIR I/O-Direction (Register 0)
  • GPIO General Purpose (Register 9)

Nach einem Reset sind alle Ports als Input geschaltet. Zur Initialisierung muss 0x00 in IODIR geschrieben werden.

Danach wird der Zustand der Relais direkt über das GPIO-Register gesteuert.

Test auf der bash

Vor dem Test sicherstellen dass I2C mit raspi-config freigeschaltet wurde!

# IODIR auf 0x00 setzen -> 8 Ausgaenge
i2cset -y 1 0x20 0x00 0x00

# Ein Relais schalten
i2cset -y 1 0x20 0x09 0x01

Wenn das Relais klackert ist der Test gelungen.

Ansteuerung mit python

Dank dem smbus-Modul ist das fast ebenso einfach:

import smbus
import time

# Open the bus
bus = smbus.SMBus(1)

# Set up the pins as output
bus.write_byte_data( 0x20, 0x00, 0x00 )

# Toggle the relays on and off
for value in [0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80]:
    bus.write_byte_data( 0x20, 0x09, value )
    time.sleep( 1 )

Das Programm importiert die benötigten Module und initialisiert den SMBus. Dann wird das Port auf dem MCP23008 als Ausgang geschaltet und danach alle Relais einmal aktiviert.