Für die folgenden Versuche kommt ein neues Modul zum Einsatz, auf dem sich vier 7-Segment-Anzeigen, ein Temperaturmodul und vier Taster befinden. In einem ersten
Schritt wird die Anzeige über den I2C-USB-Adapter und das Programm CoolTerm vom Computer aus angesteuert und später für den ebenfalls auf dem Board befindlichen Temperatursensor
genutzt.
In einer weiteren Übung wird gezeigt, wie sich das Board auch als Arduino Shield mit dem Arduino UNO einsetzen lässt.
Die I2C-7-Segmentanzeige
Das hier vorgestellte Modul gibt es bei der Fa. ELV als Bausatz zu kaufen. Das Löten der Komponenten auf der sehr gut gearbeiteten Platine geht problemlos.
Ein wenig Löterfahrung sollte man aber schon mitbringen. Die mitgelieferte Bau- und Bedienungsanleitung informiert umfassend. Mitgeliefert werden auch 6- und 8-polige Buchsenleisten, so dass sich bei
Bedarf dieses Board auch als Arduino Shield einsetzen lässt. Auf dem Board integriert und seitlich etwas herausgeführt ist ein Temperatursensor MCP9801, 4 Drucktaster und ein Reset-Button.
Die Verbindung zur Außenwelt wird über eine 2x6-polige Stiftleiste links von den 7-Segment-Anzeigen hergestellt.
Abbildung 1
I2C-7-Segment-Anzeige mit vier Tastern und einem Temperatursensor MCP9801. Das Modul kann auch als Arduino Shield verwendet werden.
Abbildung 2
Blick auf die Unterseite des 7-Segment-Moduls. Gut zu sehen sind die vier Brücken, mit denen sich die I2C-Adresse einstellen lässt.
Material
- 1x I2C-7-Segment-Anzeige
- 1x USB-I2C Adapter
- 1x USB-Kabel
- diverse Steckkabel
- 1x PC oder Laptop mit Programm CoolTerm
- Datenblatt vom IC SAA1064T
Aufgaben
- Verbinde das I2C-7-Segment-Anzeigemodul mit dem USB-I2C-Adapter.
- Verbinde den USB-I2C-Adapter mit dem PC und starte dort das Programm CoolTerm.
- Stelle die Baudrate auf 115200 ein und wähle anschließend in der Iconzeile Connect.
- Gib im Terminalfenster ein Fragezeichen (?) ein und warte auf die Rückmeldung des Rechners.
Wenn alle Verbindungen richtig gesetzt, die Baudrate korrekt eingestellt und auch sonst keine Fehler vorhanden sind, erscheint im
Terminalfenster ein Text, der ähnlich dem in Abb. 3 dargestellten aussieht. Erst wenn die Verbindung hergestellt ist, kann der Kontakt über den I2C-Bus mit den einzelnen Elementen hergestellt werden.
Gestartet wird mit der Ansteuerung der vier 7-Segment-Anzeigen. Informationen liefert das Datenblatt des IC SAA1064.
Abbildung 3 - Informationen des USB-I2C-Interface im Terminalfenster nach Eingabe von "?".
Erweiterte Aufgabenstellung
- Stelle auf dem Display die Zahlenfolge 1 ... 4 dar.
- Stelle auf dem Display die Zahlenfolge 9 ... 6 dar; die Helligkeit der Anzeigenelemente sollte etwas stärker sein als im vorherigen
Versuch.
Aus dem vorherigen Kapitel 2 - I2C bessser verstehen - wissen wir, wie man über die Eingabe von Befehlssequenzen über ein
Terminalfenster ein I2C-Modul anspricht. Dieses Wissen wird auf das neue 7-Segment-Modul angewendet. Zusätzlich werden Informationen aus dem Datenblatt über das Verhalten des 4-Digit-LED
Treiberbausteins SAA1064 eingeholt.
Dem Datenblatt sind zu entnehmen (S. 336ff):
Slave Adresse
Abbildung 4 - Format einer Slaveaddress nach dem Datenblatt des IC SAA1064
Das Format einer Slave-Adresse im Modus Write ist nach dem in Abb. 4 gezeigten Schema aufgebaut (obere Zeile). Das höherwertige
Nibble (0111) ist werksseitig vorgegeben, das niederwertige Nibbel richtet sich nach der auf der Platine eingestellten Situation. Werksseitig sind A1 und A0 auf 0 eingestellt, deshalb lautet die
Slave-Adresse 0x70.
Eingeleitet wird die Befehlseingabe mit einer Startsequenz S; abgeschlossen wird das Byte mit einem ACK-Bit 0.
Abbildung 5 - Format eines Instructionbytes
Über das Instructionbyte wird zunächst das Controlregister angesprochen. Nach dem Datenblatt muss dazu die Subadresse 00
eingegeben werden. Für die drei Bits SC, SB und SA gibt es folgende Zuordnungen:
SC |
SB |
SA |
Subadresse |
Funktion |
0 |
0 |
0 |
00 |
Controlregister |
0 |
0 |
1 |
01 |
Digit 1 |
0 |
1 |
0 |
02 |
Digit 2
|
0 |
1 |
1 |
03 |
Digit 3 |
1 |
0 |
0 |
04 |
Digit 4 |
1 |
0 |
1 |
05 |
reserviert |
1 |
1 |
0 |
06 |
reserviert |
1 |
1 |
1 |
07 |
reserviert |
Über das nachfolgende Controlbyte werden anschließend der Anzeigemodus und die Helligkeit der 7-Segment-Anzeigen
eingestellt.
Abbildung 6 - Format des Controlbyte. Das MSB ist beliebig wählbar.
Die Bedeutung der einzelnen Bits sind in der nachfolgenden Tabelle dargestellt bzw. lassen sich dem Datenblatt des ICs entnehmen. Das
MSB, das in der Tabelle mit X gekennzeichnet ist, kann beliebig gesetzt werden; ich setze das MSB hier auf 0.
X |
C6 |
C5 |
C4 |
C3 |
C2 |
C1 |
C0 |
Funktion |
0 |
1/0 |
1/0 |
1/0 |
|
|
|
|
steuert die Helligkeit |
0 |
|
|
|
1/0 |
|
|
|
1: alle Segmente an; Test
0: alle Segmente aus
|
0 |
|
|
|
|
1/0 |
|
|
1: Segmente 2+4 an
0: Segmente 2+4 aus
|
0 |
|
|
|
|
|
1/0 |
|
1: Segmente 1+3 an
0: Segmente 1+3 aus
|
0 |
|
|
|
|
|
|
1/0 |
0: static mode
Digit 1+2 an
1: dynamic mode
nacheinander werden 1+3
und 2+4 eingeschaltet
|
Nach Eingabe der Grundeinstellungen im Controlregister, werden mit einer zweiten Befehlssequenz die Ziffern an die 7-Segmentanzeigen
übergeben und sichtbar gemacht. Es sollen im folgenden Beispiel die Ziffern/Zeichen 315A
sein.
Dazu wird erneut das Slaveaddress- und das Instructions-Byte aufgerufen und anschließend die gewünschten Ziffern
eingegeben. In diesem Fall: 315A. Bei einer 7-Segment-Anzeige müssen dazu die folgenden LED-Segmente eingeschaltet oder auf HIGH gelegt werden:
3 A, B, C, D, G
1 A, B
5 A, C, D, F, G
A A, B, C, E, F, G
Jedes Zeichen auf einem 7-Segment-Display wird in ein Register geladen. Für jedes Display steht ein eigenen Dataregister zur Verfügung.
Die Codierung für die Ziffernfolge 315A zeigt die folgende Tabelle.
Ziffer/Zeichen |
DP |
G |
F |
E |
D |
C |
B |
A |
Hexadezimalzahl |
3 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
4F |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
03 |
5 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
6D |
A |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
77 |
Gibt man diese Werte in das Terminalfenster von CoolTerm ein und drückt auf den Button SEND, erscheinen die vier Zeichen auf dem
Display.
Material
- 1x I2C-7-Segment-Anzeige
- 1x USB-I2C Adapter
- 1x USB-Kabel
- diverse Steckkabel
- 1x PC oder Laptop mit Programm CoolTerm
- Datenblatt vom IC SAA1064T und vom IC MCP9801.
Aufgaben
- Verbinde das I2C-7-Segment-Anzeigemodul mit dem USB-I2C-Adapter.
- Verbinde den USB-I2C-Adapter mit dem PC und starte dort das Programm CoolTerm.
- Stelle die Baudrate auf 115200 ein und wähle anschließend das Icon Connect.
- Gib im Terminalfenster ein Fragezeichen (?) ein und warte auf die Rückmeldung des Rechners.
- Gib die nachfolgend beschriebenen Befehlssequenzen im Terminalfenster von CoolTerm ein, übertrage sie an den Sensor und notiere die Rückgabewerte.
Umsetzung der Aufgabe
Im Datenblatt wird nach der Slaveadresse des Temperatursensors gesucht, die auf S. 9 beschrieben ist. Für das Schreiben der
Slaveadresse wird das R/W-Bit auf 0 gesetzt.
Abbildung 7 - Slaveadresse 0x90 für den Temperaturmodul MCP9801
Zum Auslesen der Temperaturdaten muss in einem weiteren Schritt zunächst das Temperaturregister über einen sogenannten Registerpointer
angesprochen werden. Dies erfolgt nach Datenblatt (S. 14) über:
Abbildung 8 - Registerpointer des Temperaturmoduls MCP9801
Die Befehlssequenz S90 00 P
spricht das Temperaturregister des Sensor MCP9801 an. Das Auslesen der Daten übernimmt eine zweite Befehlssequenz
S91 02 P. Da es sich jetzt um einen READ-Befehl
handelt, wird das R/W Bit im Adressregister auf 1 gesetzt und somit aus der Adresse 90 eine 91. Anschließend müssen die Anzahl der zu lesenden Bytes benannt werden. In unserem Fall zwei. Ein Byte für
die Vorkomma-, ein Byte für die Nachkommastelle.
Gib diese beiden Zeilen in das Terminalfenster von CoolTerm ein und betrachte den Rückgabewert im
Monitorfenster.
Abbildung 9 - Eingabe der Befehlszeilen im Übertragungsfenster von CoolTerm. Kommentare müssen in Klammern gesetzt werden.
Die ersten beiden Messungen ergeben jeweils einen Wert von 0x1B 0x80. Die erste Hexadezimalzahl (1B) steht für den Vorkommawert, die zweite (80)
für den Nachkommawert. Die Umrechnung in einen Dezimalwert ergibt für 0x1B den Dezimalwert 27 und die 0x80 steht für 0,5. Der Temperaturmesswert wird also mit 27,5 °C angegeben. Durch einfaches Auflegen eines Fingers auf die Oberfläche des Sensors erhöht sich die
Temperatur schnell und der angezeigte Wert verändert sich.
Im folgenden Versuch wird gezeigt, wie man mit Hilfe des USB-I2C-Adapters sehr schnell Zugriff auf die Arbeitsweise eines
6-Achs-Bewegungssensors erhalten kann. Der LSM330DLC ist ein solcher Sensor, der eigentlich zwei verschiedene Systeme enthält: einen Beschleunigungs- und einen Drehratensensor (Gyroskop).
Man bezeichnet solche Sensoren auch kurz als Inertialsensoren. In modernen Mobilephones findet man sie ebenso wie in der Robotik und in Flugkörpern (Quadrocoptern etc.).
Für den folgenden Versuch wird ein 6-Achsen-Bewegungssensor-Modul der Fa. ELV benutzt, auf dem sich ein LSM330DLC-IC befindet.
Es verfügt über eine 3-Draht- und eine 4-Draht-SPI- sowie eine I2C-Schnittstelle.
Pinbelegung des 6-Achs-Bewegungssensor-Moduls
Die Pinbelegung des Moduls ist der Bau- und Bedienungsanleitung entnommen.
Abbildung 10 - Pinbelegung des 6-Achs-Bewegungssensor-Moduls mit einem LSM330 (Inertialsensor mit 3D Beschleunigungs- und 3D
Gyroskopsensor).
Dabei bedeuten:
CS_A Beschleunigungssensor: SPI enable;
hier unbeschaltet
CS_G Gyroskop: SPI enable; hier
unbeschaltet
SCL I2C:
Taktleitung
SDA I2C:
Datenleitung
SDO_A Beschleunigungssensor: I2C LSB der
Geräteadresse
SDO_G Gyroskop: I2C LSB der Geräteadresse
DEN_G Gyroskop: Data enable
GND Masse
INT1_A; INT2_A Beschleunigungssensor: Interruptsignal; hier
unbeschaltet
INT1_G, INT2_G Gyroskop: Interruptsignal; hier unbeschaltet
EN Enable:
Bewegungssensor; hier unbeschaltet
UPull
+Uin
Spannungsversorgung
Von den vorhandenen Pins werden nur vier Verbindungen zum USB-I2C-Interface benötigt. Die beiden Sensoren (Beschleunigung und
Gyroskop) werden über die interne Adresse angesprochen.
Versuch 3 - Daten aus einem Inertialsensor-Modul auslesen |
Material |
- 1x 6-Achsen-Bewegungssensor-Modul
- 1x USB-I2C Adapter
- 1x USB-Kabel
- diverse Steckkabel
- 1x PC oder Laptop mit Programm CoolTerm
- Datenblatt LSM330DLC
|
Aufgaben |
- Verbinde das 6-Achsen-Bewegungssensor-Modul mit dem USB-I2C-Adapter.
- Verbinde den USB-I2C-Adapter mit dem PC und starte dort das Programm CoolTerm.
- Stelle die Baudrate auf 115200 ein und wähle anschließend das Icon Connect.
- Öffne über Connection - Send String in CoolTerm ein Eingabefenster und gib die in Abb. 12 dargestellten
Befehlszeilen ein.
- Übertrage anschließend mit Send die Daten über den I2C-Bus an den Slave und notiere die im Terminalfenster zurückgegebenen
Werte.
- Wiederhole den vorherigen Schritt, verändere aber vorher die Neigung des Sensors.
|
Schaltskizze und Schaltungsaufbau
Der Sensor befindet sich auf einer briefmarkengroßen Platine und lässt sich über seine zwei Pinleisten auf einem Steckbrett einfach und
schnell verkabeln (Abb. 11).
Abbildung 11 - Verdrahtung des 6-Achsen-Bewegungssensor-Moduls mit dem ELV USB-I2C-Adapter.
Die Befehlszeileneingabe und die Ausgabe der Messdaten im Terminalfenster zeigt Abb. 12.
Abbildung 12 - Befehlseingabe zur Initialisierung des Gyroskops im Fenster "Send String" und Ausgabe der Daten im Terminalfenster.
Erläuterungen zu den beiden Befehlszeilen
Im Datenblatt des Intertialsensors LSM330 finden sich auf Seite 32ff Hinweise zu den Adressen der beiden Sensoren Gyroskop und
Beschleunigung.
Die Ansprechadresse auf dem I2C-Bus ergibt sich über das Datenblatt zu:
Das Register CTRL_REG1_G
wird über seine Adresse 0x20
angesprochen. Dort werden anschließend die entsprechenden Bits für die Wahl der Datenrate (DR1:0), die Auswahl der Bandbreite (BW1:0), der
Power-Down Modus PD und die Initialisierung der drei Raumachsen (Zen, Yen, Xen) gesetzt.
Mit der Befehlssequenz SD4 0F P
wird das Gyroskop über den I2C-Bus adressiert. seine drei Raumachsen aktiviert, der Powermodus auf normal und die Datenrate auf 95
Hz eingestellt.
In der zweiten Befehlszeile sollen die gemessenen Daten im Terminalfenster ausgegeben werden. Dazu wird die erste Registeradresse für die
Datenausgabe (0x27 - OUT_X_L_A) aufgerufen.
Da nachfolgend alle sechs Byte ausgegeben werden, wird der Sensor angewiesen automatisch die Datenadresse nach jeder Ausgabe um eins zu erhöhen. Um das zu erreichen (eine automatische Inkrementierung
der Adresse), muss nach Herstellerangaben das MSB der Registeradresse auf 1 gesetzt werden.
Es fehlt jetzt nur noch die Anzahl der zu lesenden Bytes (in diesem Fall 3, für die drei Raumachsen). Damit sind alle Befehle
erklärt.
Es lohnt sich, die Zeitdiagramme für die Ansteuerung des Gyroskops und des Beschleunigungssensor abschließend noch einmal anzuschauen, um
besser zu verstehen, was da eigentlich auf der Datenleitung hin- und hergeschoben wird. Für die beiden Sensoren zeigen die folgenden Diagramme die Bitfolgen; aufgenommen wurden sie mit einem
Picoscope der 2000-Serie.
Abbildung 13 - Das Zeitdigramm zeigt die Bitfolgen für die Befehlssequenz S30 20 77 P an. Es handelt sich um die Ansteuerung des Beschleunigungssensors.
Abbildung 14 - Zeitdiagramm für die Befehlssequenz SD4 20 0F P.
Das Auslesen der Daten des Beschleunigungssensors wird durch eine ähnliche Befehlssequenz erreicht. Abb. 15 zeigt die Befehlssequenz und
die Ausgabedaten im Terminalfenster.
Abbildung 15 - Die Daten des Gyroskops und Beschleunigungssensors werden ausgelesen und im Terminalfenster angezeigt.
Zeitdiagramme
Die nachfolgenden Zeitdiagramme zeigen, wie ein Inertialsensor-IC mit Hilfe eines USB-I2C-Adapter-Moduls angesteuert wird. Im vorliegenden Beispiel ist die I2C-Adresse des angesprochenen
Sensors D0. Die Messungen wurden
mit einem PicoScope 2000Series vorgenommen.
Die nachfolgende Abbildung zeigt die Eingabe der Befehlssequenzen über das Terminalfenster von CoolTerm und die nachfolgende Ausgabe der
Daten.
SD0 20 0F Grundeinstellung des Sensors
SD0 0F R01 P Abfrage des
Registers Who Am I (0x0F) .
SD0 A8 R03 P Abfrage der drei
Raumachsenwerte.
Abbildung 16 - Eingabe von drei Befehlssequenzen im Fenster "Send String" und Ausgabe der Daten im Terminalfenster von CoolTerm.
Wie ein Inertialmodul unter BASCOM angesteuert wird und was sonst zu beachten ist,
kann im Abschnitt AVR
Controller und BASCOM nachgelesen werden.