SainSMART 16 Kanal Relaisboard mit Raspberry Pi ansteuern

Spaßeshalber habe ich mir vor kurzem das 16 Kanal Relaisboard zugelegt. Angesteuert werden sollte das Board mit einem Raspberry Pi. Da am GPIO meines Pis noch das Ein oder Andere angeschlossen ist, hatte ich keine 16 freien GPIO-Pins zur Verfügung. Ich entschied mich für die Ansteuerung über I2C und einen MCP23017 GPIO-Expander. Dieser hat 16 Ports die für diese Zwecke nutzbar sind. Die Ports des MCP23017 habe ich der Einfachheithalber direkt an das Relaisboard angeschlossen (auf dem Bord sind für jeden Relaiskanal ein Optokoppler verbaut, was mir als ausreichend sicher erschien). Auf die Verdrahtung des MCP23017 gehe ich nicht weiter ein. Wichtig zu wissen ist jedoch noch, das Relaisboard ist „active LOW“ geschaltet, d.h. kein Strom am Eingangspin des Relaiskanals lässt das Relais einschalten, eine Spannung von 5V am Eingang lässt das Relais ausschalten.

Softwareseitig kommt auf dem Pi ein aktuelles Raspbian zum Einsatz, zusätzlich habe ich die wiringPi – Bibliothek installiert und in das C-Programm für die Ansteuerung eingebunden. Bei Nutzen der wiringPi – Bibliothek ist die eigene Pinbenennung / Pinnummerierung zu beachten.

Das Programm für den Test des Boards sieht wie folgt aus:

#include <stdio.h>
#include <wiringPi.h>
#include <mcp23017.h>

/* Q2W_BASE => siehe wiringPi Dokumentation */
#define Q2W_BASE        100

/* Activ LOW !!! */
#define RELAY_ON        LOW
#define RELAY_OFF       HIGH

int main (void)
{
        int i, j;
        wiringPiSetup ();
        mcp23017Setup (Q2W_BASE, 0x21);
        for (i = 0; i < 16; i++) {
                /* Jeder GPIO-Pin des MCP23017 soll ein Ausgang sein. */
                pinMode (Q2W_BASE + i, OUTPUT);
                /* Alle Ausgänge auf HIGH schalten. */
                digitalWrite (Q2W_BASE + i, RELAY_OFF);
        }
        /* Alle Relais der Reihe nach Ein- und wieder Ausschalten. */
        for (j = 0; j < 16; j++) {
                digitalWrite (Q2W_BASE + j, RELAY_ON);
                printf("turning on port: %d\n", j);
                delay (2000);
                digitalWrite (Q2W_BASE + j, RELAY_OFF);
        }
        return 0;
}

Das Programm schaltet die einzelnen Relais der Reihe (der Reihe der MCP23017-Ausgänge) ein und wieder aus.

Übersetzt wir das Programm mit dem Befehl:

gcc -Wall -o mcp23017_relais_controll_test mcp23017_relais_controll_test.c -lwiringPi