Aus Raspberry Pi Geek 04/2020

I2C-Workshop (Teil 30): I/O-Expander-Baustein MCP23017 (Seite 2)

Listing 2

### IODIR PORT A, alle in
$ i2cset -y 1 0x20 0x00 0xFF
### IODIR PORT B, alle in
$ i2cset -y 1 0x20 0x01 0xFF
$ watch 'i2cget -y 1 0x20 0x12; i2cget -y 1 0x20 0x13'

Verändern Sie nun die Stellung der DIP-Schalter und verfolgen Sie am Bildschirm, wie sich das auf die Werte auswirkt. Falls Sie den Eindruck haben, dass etwas nicht stimmt, sehen Sie sich am besten zuerst die Beschriftung der Ports an: Sie ist für Port A aufsteigend, für Port B jedoch absteigend. Das sorgt gern für Verwirrung.

War der Test erfolgreich, haben Sie alles so weit richtig zusammengebaut. Nun ist es an der Zeit, mit der Programmiersprache Go auf den Baustein zuzugreifen. Listing 3 zeigt das entsprechende Programm. Die Funktion entspricht den Bash-Befehlen aus Listing 2. Mit go run input.go starten Sie das Programm auf der Kommandozeile.

Listing 3

package main
import (
  "fmt"
  "gobot.io/x/gobot/drivers/i2c"
  "gobot.io/x/gobot/sysfs"
  "time"
)
func main() {
  bus,_ := sysfs.NewI2cDevice("/dev/i2c-1")
  device := i2c.NewConnection(bus,0x20)
  defer func() {device.Close()}()
  device.WriteByteData(0x00,0xFF) // Port A all in
  device.WriteByteData(0x01,0xFF) // Port B all in
  for ;; {
    portA,_ := device.ReadByteData(0x12)
    portB,_ := device.ReadByteData(0x13)
    fmt.Printf("0x%xh : 0x%xh\n",portA,portB)
    time.Sleep(500*time.Millisecond)
  } // for;;
}// main

Ausgabe

Im zweiten Versuch verwenden Sie die I/Os des Moduls für die Ausgabe; Abbildung 4 zeigt den Schaltplan dazu. Hier verbinden Sie die I/Os mit LEDs, die Sie wiederum mittels eines Widerstands auf Masse ziehen. Am besten testen Sie den Aufbau wieder zuerst in einer Shell (Listing 4), bevor Sie ein Go-Programm verwenden.

Abbildung 4: Der Schaltplan der Output-Platine mit den LEDs als Verbrauchern.

Abbildung 4: Der Schaltplan der Output-Platine mit den LEDs als Verbrauchern.

Listing 4

### IODIR PORT A alle out
$ i2cset -y 1 0x20 0x00 0x00
### IODIR PORT B alle out
$ i2cset -y 1 0x20 0x01 0x00
$ i2cset -y 1 0x20 0x12 0xff
$ i2cset -y 1 0x20 0x13 0xff

Nach dem Ausführen der Kommandos aus Listing 4 sollten alle LEDs leuchten. Im nächsten Schritt verwenden Sie das Go-Programm aus Listing 5, um die LEDs abwechselnd anzusprechen. Der Code schreibt dazu nacheinander unterschiedliche Bit-Muster in die I/O-Register.

Listing 5

package main
import (
  "gobot.io/x/gobot/drivers/i2c"
  "gobot.io/x/gobot/sysfs"
  "time"
)
func main() {
  bus,_ := sysfs.NewI2cDevice("/dev/i2c-1")
  device := i2c.NewConnection(bus,0x20)
  defer func() {device.Close()}()
  device.WriteByteData(0x00,0x00) // Port A all out
  device.WriteByteData(0x01,0x00) // Port B all out
  for ;; {
    device.WriteByteData(0x12,0x55) // Port A 01010101
    device.WriteByteData(0x13,0x55) // Port B 01010101
    time.Sleep(500*time.Millisecond)
    device.WriteByteData(0x12,0xAA) // Port A 10101010
    device.WriteByteData(0x13,0xAA) // Port B 10101010
    time.Sleep(500*time.Millisecond)
  } // for;;
}// main

Ausblick

Die beiden vorgestellten Beispiele reizen den Funktionsumfang des MCP23017 bei Weitem nicht aus. So ist es etwa möglich, alle I/O-Pins des MCP23017 einzeln zu konfigurieren und anzusteuern. Außerdem haben die Beispiele das Verarbeiten der Interrupts des Bausteins außen vor gelassen. Sie sollten aber wissen, dass sich diese auch auf Pin-Ebene steuern lassen. Sie können Interrupts sowohl per Hardware als auch per Software weiterverarbeiten.

Fazit

Beim MCP23017 handelt es sich um einen sehr fortschrittlichen I/O-Baustein. Neben den üblichen Funktionen verfügt er über eine ausgefeilte Interrupt-Verarbeitung. Es ist sogar möglich, Pin-weise interne Pullup-Widerstände zu aktivieren. Falls Sie in einem Projekt vor der Wahl stehen, den PCF8574 (Teil 1 dieser Reihe) oder den MCP23017 zu verwenden, sollten Sie sich auf jeden Fall immer für den moderneren MCP entscheiden. Zugegeben, das Datenblatt ist keine leichte Lektüre; es lohnt sich aber, die Zeit zu investieren und sich einmal intensiv damit auseinanderzusetzen.

Der Autor

Im Zeitalter der Magnetringkernspeicher geboren, studierte Martin Mohr nach einer Ausbildung zum Elektroniker Informatik und entwickelte beruflich überwiegend Java-Applikationen. Mit dem RasPi erwachte die Liebe zur Elektronik wieder.

Infos

  1. MCP23017-Modul: https://de.aliexpress.com/item/32941624728.html
  2. Datenblatt MCP23017: http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf
  3. I2C-Workshop (Teil 18): Martin Mohr, “Unter Kontrolle”, RPG 04/2018, S. 80, https://www.raspi-geek.de/40583
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben