Will man die Funktionalität seines Raspberry Pi um einen Atmel Mikrocontroller, z.B. Atmega oder Attiny erweitern, braucht man irgendeine Kommunikationsstrategie. Ich habe mich hierbei für eine I2C-Schnittstelle entschieden, da eine eigene Implementierung doch sehr umständlich ist (man muss immer auf einen Takt o.Ä. achten und somit doch ein komplettes Protokoll implementieren).

I2C

Für I2C hingegen existieren schon diverse Implementierungen sowohl für Master- als auch für Slave-Systeme. I2C ist ein Protokoll, welches zwei Busleitungen benötigt: Adress- und Datenleitung. Über diese kommunizieren Master und Slaves miteinander. Die Slaves reagieren jedoch nur auf Befehle des Masters und agieren nicht von sich aus. Der Vorteil von I2C ist jedoch, dass man viele Slaves an dieselbe Leitung hängen kann. Man benötigt am Master trotzdem nur zwei Pins.

Manche Mikrocontroller von Atmel unterstützen bereits selbst I2C. Die Attiny-Reihe hat häufig eine sogenannte USI-Schnittstelle (Universal Serial Interface). Über diese können mit Software relativ gut verschiedene serielle Protokolle implementiert werden.

Ich habe mich bei meinem Projekt entschieden, den Raspberry Pi als Master zu betreiben und den Attiny als Slave. Hierbei soll der Attiny Benutzereingaben einlesen und später gesammelt an den Pi zurückgeben. Später sollen noch weitere Mikrocontroller für Ausgabeanzeigen hinzukommen (z.B. Display oder LEDs). Deshalb wird der Raspberry Pi als Master betrieben.

Raspberry Pi vorbereiten

Der Raspberry Pi lädt in seiner Standardeinstellung das Modul für I2C noch nicht. Unter ArchlinuxARM kann man dies laden, indem man i2c-tools installiert und die Kernelmodule i2c-dev und i2c-bcm2708 lädt. Wichtig ist außerdem (und das stand in keinem Tutorial, das ich gelesen habe), dass man die Baudrate korrekt einstellt. Bei mir war diese für den Attiny viel zu hoch, sodass dieser mit der Kommunikation nicht hinerher kam.

  • i2c-tools installieren
  • in /etc/modules-load.d/raspberrypi.conf die beiden Module i2c-bcm2708 und i2c-dev eintragen
  • Datei /etc/modprobe.d/i2c-bcm2708.conf anlegen und dort options i2c-bcm2708 baudrate=4000 eintragen (4000 ist so ziemlich der geringste mögliche Wert, den kann man sicherlich noch höher stellen)
  • Raspberry neustarten oder die Module per modprobe alle noch laden

I2C auf dem Attiny

Für den Attiny existieren auch verschiedene Implementierungen von I2C-Slave. Ich habe mich mit i2cslave für eine entschieden, bei der man mit Speicherbereichen/Registern arbeitet, die sowohl geschrieben als auch gelesen werden. Dies scheint mir eher dem Prinzip von I2C zu entsprechen, wie ich es in den i2c-tools kennengelernt habe.

Jedoch gibt es auch Implementierungen, die mit zwei getrennten In- und Out-Buffern arbeiten. Nicht alle Implementierungen sind jedoch für jeden Attiny-Typ geeignet. In der obigen sieht man z.B. in i2cslave.h Regeln für verschiedene Attiny. Hierbei wird für jeden Attiny angegeben, welcher PIN welche Funktion übernimmt. Solche Regeln muss man in anderen Implementierungen evtl. für den eigenen Attiny-Typ ergänzen.

Um die gewählte Implementierung zu verwenden, muss man dann die Header-Datei im eigenen Programm inkludieren und die c-Datei zusammen mit dem eigenen Quelltext kompilieren.

Attiny und Raspberry Pi verkabeln

Verbindung von Pi und Attiny. Die Pin-Nummern im Bild stimmen nicht mit den eigentlichen Pin-Nummern überein. Die Verkabelung beider Bausteine ist dann grundsätzlich einfach. Man muss die beiden SLC- und SDA-Pins verbinden und den Attiny korrekt an die Stromquelle anschließen. Hierbei empfiehlt es sich, den Attiny mit nur 3,3V Versorgungsspannung zu verbinden (sofern er es unterstützt). Somit benötigt man keine Spannungswandler, weil der Attiny dann auch 3,3V als HIGH-Pegel verwendet.

Nachdem ich die Baudrate heruntergesetzt hatte (siehe oben), habe ich gute Erfahrungen sowohl mit eigenen Pullup-Widerständen (1,5kOhm) als auch mit den internen Pullup-Widerständen des Raspberry Pi alleine gemacht. Hier kann ich also im Moment keine klare Empfehlung geben. Da an die Widerstände jedoch nach der Länge der Leitung und der Anzahl an Slaves berechnen soll, muss man hier eventuell externe Widerstände einplanen, wenn man mehrere Slaves anschließen will.

I do not maintain a comments section. If you have any questions or comments regarding my posts, please do not hesitate to send me an e-mail to stefan@eliteinformatiker.de.