Aus Raspberry Pi Geek 05/2016

ESP8266 Teil 4: Die SPI-Schnittstelle des ESP8266 (Seite 2)

Abbildung 1: Am ESP8266 ist lediglich ein Schieberegister angeschlossen.

Abbildung 1: Am ESP8266 ist lediglich ein Schieberegister angeschlossen.

Abbildung 2: Zwei Schieberegister am ESP8266 eröffnen die Möglichkeit, den Fluss der Daten zu verfolgen.

Abbildung 2: Zwei Schieberegister am ESP8266 eröffnen die Möglichkeit, den Fluss der Daten zu verfolgen.

Abbildung 3: Der Testaufbau mit zwei Schieberegistern in der Realität.

Abbildung 3: Der Testaufbau mit zwei Schieberegistern in der Realität.

SN74HTC595

Beim SN74HC595 handelt es sich um ein einfaches 8-Bit-Schieberegister. Die Daten laufen also seriell in das Register hinein, danach gibt es die Daten parallel wieder aus. Die Betriebsspannung des Halbleiters beträgt 2 bis 6 Volt, er hat einen sehr geringen Eigenstromverbrauch von nur wenigen Mikroampere. Der Strom pro Ausgang beträgt ±6 mA, was für einfache Leuchtdioden vollkommen ausreicht. Abbildung 4 zeigt die Pinbelegung des Registers, weitere Informationen liefert das Datenblatt [1].

Abbildung 4: Die Pinbelegung des SN74HC595.

Abbildung 4: Die Pinbelegung des SN74HC595.

Damit nun Leben in den Aufbau aus Abbildung 1 kommt, braucht es noch die passende Software. Das Programm aus Listing 1 sorgt dafür, dass alle acht LEDs im Sekundentakt blinken. Hierbei fällt auf, dass man die CS-Leitung komplett manuell steuern muss.

Listing 1

 

#include <SPI.h>
void setup() {
  SPI.begin();
  pinMode(15, OUTPUT);
  }
void loop() {
  digitalWrite(15, LOW);
  SPI.transfer(0x00);
  digitalWrite(15, HIGH);
  delay(1000);
  digitalWrite(15, LOW);
  SPI.transfer(0xff);
  digitalWrite(15, HIGH);
  delay(1000);
}

Der Grund dafür: Die Methode SPI.transfer() weiß nicht, wann ein Transfer abgeschlossen ist, denn sie hat keine Informationen über die Länge des Busses. Sie schiebt immer nur ein Byte dorthin. Falls sich der SPI-Bus im Sternbetrieb befindet, kann eine allgemeine Bibliothek unmöglich wissen, welche CS-Leitung sie verwenden soll, um eine konkrete Schreiboperation auszuführen.

Erweitern Sie nun den Aufbau gemäß Abbildung 2 um ein zweites Schieberegister, und starten Sie das Programm erneut. Die ersten acht LEDs blinken immer noch im Sekundentakt – aber die letzten acht tun das ebenfalls, und das immer schön abwechselnd. Das liegt daran, dass der zweite SN74HC595 dieselben Daten bekommt wie der erste, einfach nur um einen Schreibzyklus versetzt.

Damit die ersten acht LEDs wieder wie vorher blinken, fügen Sie ein weiteres Datenbyte mit Nullen in den Datentransfer mit ein, und zwar vor den ersten acht Bit (Listing 2). Damit haben Sie nun eine Idee davon, wie der SPI-Bus arbeitet. Unter Umständen gestaltet sich die Aufgabe etwas knifflig, die Daten-Bytes an die richtigen Stellen im Bus zu schieben. Listing 3 zeigt aber, dass selbst komplizierte Programme möglich sind.

Listing 2

 

#include <SPI.h>
void setup() {
  SPI.begin();
  pinMode(15, OUTPUT);
  }
void loop() {
  digitalWrite(15, LOW);
  SPI.transfer(0x00);
  SPI.transfer(0x00);
  digitalWrite(15, HIGH);
  delay(1000);
  digitalWrite(15, LOW);
  SPI.transfer(0x00);
  SPI.transfer(0xff);
  digitalWrite(15, HIGH);
  delay(1000);
}

Listing 3

 

#include <SPI.h>
int ll,dir;
void setup() {
  SPI.begin();
  pinMode(15, OUTPUT);
  ll=1;
  dir=0;
  }
void transfer(int data) {
  digitalWrite(15, LOW);
  SPI.transfer((data>>8)&0xFF);
  SPI.transfer(data & 0xFF);
  digitalWrite(15, HIGH);
}
void loop() {
  if (dir==0)
  { ll = ll << 1;
  if (ll==(1<<15)){dir=1;}}
  else
  { ll = ll >> 1;
  if (ll==1){dir=0;}
  }
  transfer(ll);
  delay(100);
}

Prinzipiell ist es sinnvoll, die kompletten Daten, die Sie auf den Bus schreiben wollen, in einer Struktur im RAM zu halten: Diese lässt sich einfacher manipulieren. Nach Änderungen an dieser Struktur schieben Sie die Daten in einem Rutsch aus dem ESP8266 hinaus. Bei der im Beispiel verwendeten Datenstruktur handelt es sich zwar nur um ein int, also einen Integer-Wert, aber zu Anschauungszwecken genügt das.

Sie schieben das einzelne Bit in der Variablen ll hin und her. Nachdem das Programm die Operation beendet hat, schreibt die Methode transfer() die Information byteweise auf den Bus. Die lokale Methode transfer() arbeitet dabei in einem komplett anderen Namensraum als SPI.transfer() aus der Bibliothek, was Überlagerungen ausschließt.

A/D-Wandler

Als Nächstes schließen wir einen A/D-Wandler (MCP3008, siehe gleichnamiger Kasten) an den Bus an (Abbildung 5) und sprechen diesen über eine vorhandene Bibliothek an. Die Bibliothek erspart es Ihnen, alle Funktionen eines solchen Wandlers mühselig selbst zu programmieren. Die Messergebnisse sendet der Mini-Rechner über die USB-Schnittstelle an den PC (Abbildung 6), alternativ können Sie die Daten auch über die WLAN-Schnittstelle des ESP8266 übertragen. In Teil 2 dieser Reihe finden Sie ein Beispiel, das zeigt, wie das funktioniert.

Abbildung 5: Der MCP3008 ist über den SPI-Bus mit dem ESP8266 verbunden.

Abbildung 5: Der MCP3008 ist über den SPI-Bus mit dem ESP8266 verbunden.

Abbildung 6: Der MCP3008 sendet die Messergebnisse über die USB-Schnittstelle an den PC.

Abbildung 6: Der MCP3008 sendet die Messergebnisse über die USB-Schnittstelle an den PC.

Verwenden Sie im vorgestellten Beispiel ein Potenziometer mit einer linearen Charakteristik – hier liegt in der Mittelstellung also am analogen Eingang die halbe Betriebsspannung. Potis mit logarithmischer Charakteristik sind üblicherweise in Lautstärkereglern verbaut, weil unser Gehör logarithmisch arbeitet.

Wundern Sie sich nicht, dass in den Abbildungen ein Achtfach-DIP-Schalter auftaucht, mit dem Sie zwischen Run- und Flash-Mode hin und her schalten: Es kommen nur die ersten beiden Schalter zum Einsatz – die heimische Bastelkiste hatte keine anderen Modelle mehr vorrätig.

MCP3008

Beim MCP3008 handelt es sich um einen zur Abfrage von analogen Sensoren konzipierten Analog-Digital-Wandler der Firma Microchip. Er verfügt über acht analoge Eingangskanäle mit einer Auflösung von 10 Bit. Der Bereich der Betriebsspannung reicht von 2,7 bis 5,5 Volt, im Standby hat der Wandler einen Stromverbrauch von maximal 2 Mikroampere. Aufgrund dieses geringen Energiebedarfs eignet er sich für den Einsatz im Batteriebetrieb. Er hat noch einen kleinen Bruder, den MCP3004, mit lediglich vier analogen Eingängen. Abbildung 7 zeigt die Pinbelegung des Halbleiters. Für weiterführende Informationen werfen Sie am einfachsten einen Blick in das Datenblatt [2].

Abbildung 7: Die Pinbelegung des MCP3008.

Abbildung 7: Die Pinbelegung des MCP3008.

A/D-Wandler verwenden

Um auf den MCP3008 zuzugreifen, verwenden Sie eine Bibliothek, die Ihnen einen Großteil der Arbeit abnimmt. Um die Bibliothek in die IDE zu integrieren, öffnen Sie eine Shell, wechseln ins Verzeichnis libraries/ der Arduino-IDE und führen dort den folgenden Befehl aus:

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 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