Arduino-Workshop

Aus /dev/tal
Wechseln zu: Navigation, Suche

Der Arduino-Workshop soll Menschen einen Einblick in Umgang und Programmierung mit Mikrocontrollern anhand des Beispieles des Arduinos geben. Dazu werden auch auf verschiedene spezielle Eigenschaften von Arduinos eingegangen.

Die Informationen auf dieser Seite können zur Wiederholung und selbstständigen Durchführung des Workshops, aber auch als Vorlage für kommende Wiederholungen des Workshops dienen.

1. Treffen

Für die Vorbereitung des ersten Treffens wird der Vortrag von Scirocco zum Thema Arduino empfohlen. Eine kleine Einführung in die Möglichkeiten, wie Arduinos genutzt werden können, kann darauf folgen. Das erste Treffen (28.03.2014) soll aber vor allem schon einsteigend einige praktische Anwendungen mit LEDs und kleinen Dotmatrixanzeigen zeigen.

Blinkende LED

Zunächst wurde eine blinkende LED realisiert, um die Basisfunktion eines Ausgabepins zu verdeutlichen. Die LED wird einfach an der Anode mit einem Vorwiderstand dazwischen an einen Ausgabepin gesteckt. Die Kathode geht dann an GND.

Das Programm[1], welches die LED blinken lässt sieht wiefolgt aus:

void setup() {
  pinMode(1, OUTPUT);
}
void loop() {
  digitalOutput(1, HIGH);
  delay(500);
  digitalOutput(1, LOW);
  delay(500);
}

LED-Dotmatrix

Danach wurde ein 5x7-Dotmatrix Display aus LEDs angesteuert. Im Endeffekt konnten verschiedene Zeichen mit verschiedenen Dauern angesteuert werden.

Die Spalten der Dotmatrix wurden mit Vorwiderständen und die Zeilen der Dotmatrix ohne Widerstände an digitale Pins des Arduinos angeschlossen. Die Pins der Zeilen und Spalten werden in zwei eindimensionalen Arrays gehalten und können daher vorerst beliebig sein.

Jedes anzuzeigende Zeichen wird der Einfachheit halber in eigenen zweidimensionalen int-Arrays mit Elementen bestehend aus Einsen und Nullen gehalten.

Eine Funktion wird implementiert, die ein einzelnes Zeichen mithilfe der Matrixansteuerung[2] an der Dotmatrix anzeigt. Dabei wird jedes Pixel der Dotmatrix in einer verschachtelten For-Schleife durchgegangen und mit einer if-Anweisung geprüft, ob das aktuelle Pixel im anzuzeigenden Zeichen an oder aus ist.

Damit dieses Zeichen eine gewisse Zeit lang angezeigt werden kann, wird eine weitere Funktion entwickelt, die das gewünschte Zeichen eine gegebene Dauer an der Dotmatrix anzeigt. Dazu kann die millis()-Funktion von Arduino genutzt werden.[3]

In der loop-Funktion steht eine Sequenz von Funktionsaufrufen mit verschiedenen Zeichen. Damit kann unter anderem einfach der eigene Name auf die Dotmatrix geschrieben werden.

2. Treffen

Das zweite Treffen (04.04.2014) besteht aus einer Erweiterung der LED-Dotmatrix (Scrollender Text oder sonstige Animationen) und aus einer Einführung in Schieberegister bzw. Peripherie im Allgemeinen anhand einer Schaltung mit 7-Segmentanzeigen, die über Schieberegister angesteuert werden. (TM1638)

Scrollende LED-Dotmatrix

Zunächst wurde der Code der LED-Dotmatrix dahingehend aufgeräumt, dass nun für die Spalten nicht mehr 7 einzelne int-Werte verwendet werden, sondern nur ein Byte pro Spalte (Bitweise kodiert) nötig sind. Damit wird nötige Speicher deutlich reduziert, was bei Mikroprozessoranwendungen wünschenswert ist.

Daraufhin wird ein Framebuffer implementiert. Dabei wird ein Array der Größe von 5 8-Bit Werten sowie ein paar Funktionen definiert. Darunter Funktionen zum leeren des Framebuffers, zum Ausgeben des Framebuffers mit millis()-delay (Ähnlich wie beim 1. Treffen) und zum setzen eines Zeichens an einer bestimmten horizontalen Position. Letztere Funktion beinhaltet eine if-Abfrage, sodass nur innerhalb des Framebuffers geschrieben werden kann. Dann wird ein Array aus den anzuzeigenden Glyphen gebildet und in der loop-Funktion eine For-Schleife zur aufeinanderfolgenden Anzeige derer geschrieben.

Im letzten Teil mit dieser Dotmatrix beschäftigen wir uns damit, den Text von rechts nach links durchzuscrollen. Dabei wird das Delay verringert und eine weitere For-Schleife für die Verschiebung des aktuellen und nächsten Zeichens eingebaut. Auf das letzte Zeichen folgt wieder das erste.

China-LED-Display

Nun probieren wir einmal ein anderes Modul anzusteuern. Das Modul mit einem TM1638-Controller[4] ist leider relativ schlecht Dokumentiert und auch der Controller hat ein grottiges Datenblatt. Daher musste ich zunächst eine Library[5] zur Ansteuerung überfliegen.

Zunächst sahen wir uns aber erst an, wie serielle Datenverbindungen und Schieberegister funktionieren. Dann versuchten wir mit der Arduino-ShiftOut-Funktion (Parameter BitOrder muss LSBFIRST sein) und einer selbstprogrammierten Routine, die LEDs auf der Platine anzusteuern. Da dies allerdings nicht wirklich wie gewünscht funktionierte, entschlossen wir uns jedoch dazu, doch die fertige Library auszuprobieren.

3. Treffen

Beim dritten Treffen (11.04.2014) wird die Schaltung anhand einer Library für Arduino angesteuert, da die simplen Versuche des letzten Treffens nicht zufriedenstellend funktionierten. Dazu wird es auch erstmals näher um Buttons als Eingabemöglichkeit gehen.

Fortsetzung China-LED-Display

Zunächst wurde der Schaltplan der Platine mit dem Multimeter erarbeitet. Der Schaltplan war im Internet nicht zu finden, ist aber für eine möglichst leichte Ansteuerung vorzuziehen. Danach war es aber dann doch auch trotz des schwer verständlichen Datenblatts des Controllers auf der Platine möglich, eine eigene Library zu erarbeiten.

Dazu wurden Funktionen zur Ansteuerung der LEDs, der Taster und der LED-Segmente geschrieben. Das Auslesen der Taster erschien erst als schwierig, da nicht beachtet wurde, dass ein Rechtsshift eines signed Wertes das höchstwertige Bit nicht geleert hat. Nach längerer Fehlersuche wurde der Fehler allerdings gefunden und konnte dadurch behoben werden, dass ab sofort der Datentyp uint8_t anstelle von chars bzw. unsigned chars verwendet wird. Damit ist auch die Bitlänge eindeutig festgelegt.

Zum Schluss wurden noch die Funktionen so angepasst, dass auch mit einem weiteren Parameter die jeweilige weiter kaskadierte Anzeige angesteuert werden kann.

4. Treffen

Zum vierten Treffen (18.04.2014) wird die Library noch weiter erweitert und es kann auch noch ein kleines Spiel oder eine kleinere Anwendung dafür programmiert werden.

Mangels bedarf und wegen dem wichtigeren GetDigital Osterrätsels fand dieses Treffen in der Form nicht statt. Es konnten jedoch in eigenregie eigene Erweiterung für das Chinadisplay geschrieben werden, unter anderem um Dezimalzahlen auf den 7-Segment-Anzeigen darstellen zu können.

5. Treffen

Das fünfte Treffen (25.04.2014) findet nach bedarf statt. Bisher gibt es keine Ideen, was dort noch gemacht werden kann. Eventuell könnte man sich dann mal den A/D-Wandler, PWM sowie Timer ansehen.

Referenzen

  1. Siehe dazu auch: http://www.arduino.cc/en/Tutorial/BlinkingLED
  2. Wikipedia zur Matrixansteuerung: http://de.wikipedia.org/wiki/Matrixschaltung
  3. Siehe auch: http://arduino.cc/en/Tutorial/BlinkWithoutDelay
  4. Bezugsquelle: http://www.dx.com/p/8x-digital-tube-8x-key-8x-double-color-led-module-81873
  5. https://code.google.com/p/tm1638-library/