Praxis

 

Praxis 1: Simulation mit Wokwi

 

Der Internetservice Wokwi.com ermöglicht es Mikrocontroller mit Hardwarekomponenten zu simulieren. Dabei kann unter anderem ein Arduino UNO R3 oder auch ein ESP32 simuliert werden.

 

Arbeitsauftrag 1

  1. Besuchen Sie die Webseite von WokWi und erstellen Sie ein Projekt mit dem Arduino UNO:
    https://wokwi.com/projects/new/arduino-uno
  2. Geben Sie den folgenden Programmcode auf der linken Seite der Webseite ein:
    
    int ledPin = 13;
    
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      digitalWrite(ledPin, HIGH);
      delay(750);
      digitalWrite(ledPin, LOW);
      delay(750);
    }
    			
    
    Achten Sie dabei auf die Groß- und Kleinschreibung.
  3. Klicken Sie im rechten Teil der Webseite oben auf den grünen „Playbutton“!

 

Der Sketch

Den oben eingegebenen Programmcode nennt man auch Sketch. Dieser liefert die Anweisungen, die der Mircrocontroller abarbeitet. Für die meisten Fälle hat sich dabei ein Standard durchgesetzt. Der Programmcode (hier in C++) besitzt mindestens die beiden Funktionen „setup“ und „loop“, diese dürfen auch leer sein, müssen aber vorliegen.
Die in der „setup“-Funktion aufgeführten Befehle werden bei Start des Mikrocontrollers ausgeführt. Anschließend wird in ständiger Wiederholung die „loop“-Funktion aufgerufen.
Das C++ ist hierfür um spezielle Befehle für die Mikrocontroller der ergänzt:

pinMode
Mit diesem Befehl, der zwei Parameter erwartet, kann man einen Pin der GPIOs z.B. als Ausgang festlegen. Dies geschieht hier im Setup, weil diese Festlegung bis zur nächsten Änderung gilt.
digitalWrite
Mit diesem Befehl kann man auf einem Ausgangs GPIO einen definierten Wert anlegen. HIGH legt den Pin dabei auf +5V bzw. +3,3V beim ESP32, während LOW den Ausgang auf 0V (GND) setzt.
delay
Der Mikrocontroller wartet dabei die angegebene Anzahl an Mikrosekunden (1000 entspricht der Wartezeit 1 s).

Der Sketch legt demnach zunächst den GPIO 13 als digitalen Ausgang fest und schaltet anschließend im 0,75 s Wechsel diesen auf +5 V und anschließend aus. Was soll man also beim Ausführen des Sketches sehen können? Die Besonderheit ist hier der GPIO 13. Beim Arduino UNO R3 ist an diesem GPIO die interne LED verbunden. Diese ist auf dem Board mit „L“ bezeichnet. Wenn am GPIO 13 5 V anliegen, leuchtet diese LED auf. Daher sollte diese LED regelmäßig blinken.

 

Hinzufügen von Hardwarekomponenten

Über den „+“ Button lassen sich zu dem Arduino UNO weitere Hardwarekomponenten hinzufügen (s. Abbildung rechts).

 

Arbeitsauftrag 2

  1. Stoppen Sie gegebenenfalls die Ausführung des Sketches (Stopptaste).
  2. Wählen Sie zunächst das „Breadboard“ aus der Liste und platzieren Sie den Arduino und das Breadboard mit der Maus so, dass diese sich nicht überlappen.
  3. Wählen Sie eine LED aus der Liste und platzieren Sie diese wie unten abgebildet auf dem Breadboard. Beachten Sie, dass die LED nur dann leuchten wird, wenn sie „richtig herum“ im Stromkreis platziert wird (die Seite mit dem „schrägen“ Beinchen beach-ten).
  4. Durch Anklicken mit der Maus kann man Kabelverbindungen herstellen. Schließen Sie den Arduino und die LED in der abgebildeten Weise an.
  5. Starten Sie den die Ausführung des vorherigen Sketches erneut.

 

Wenn alle Kabelverbindungen richtig hergestellt wurden, sollte die LED auf dem Breadboard gemeinsam mit der internen LED des Arduino blinken.

An dieser Stelle ein paar Worte zu den Breadboard: In den beiden „Blöcken“ in der Mitte sind jeweils die fünf übereinander platzierten Anschlüsse miteinander verbunden. Daher kommt es in der Abbildung links überhaupt erst zu einem geschlossenen Stromkreis. Die beiden Anschlussleisten oben und unten sind jeweils horizontal miteinander verbunden, wie das auch die durchgehenden blauen und roten Linien nahelegen. Diese Anschüsse dienen meist dazu GND (-, blau) oder/und +5 V (+, rot) nur einmal am Arduino o. ä. abgreifen zu müssen.

 

Blinklicht zwischen zwei LEDs

  1. Bauen Sie in Wokwi das nebenstehende Schaltbild auf.
  2. Nutzen Sie den folgenden Sketch:
    
    int ledPin1 = 13;
    int ledPin2 = 12;
    
    void setup() {
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);
    }
    
    void loop() {
      digitalWrite(ledPin1, HIGH);
      delay(750);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      delay(750);
      digitalWrite(ledPin2, LOW);
    }	
    
  3. Starten Sie die Ausführung des Sketches.

 

Achtung!

Diese Aufbauten sollten mit realen Komponenten so nicht aufgebaut werden, da die LEDs nur einen bestimmten Strom vertragen, der bei diesem Aufbau bei weitem übertroffen würde. Das würde echte LEDs innerhalb kurzer Zeit zerstören.

 

„LED-Kette“ mit Lauflicht

Statt die LEDs alle einzeln zu schalten, kann man auch mit einem Array arbeiten, in dem man die benutzten GPIOs einträgt, damit wird der Sketch kürzer und übersichtlicher.

 

Arbeitsauftrag 3

  1. „Bauen“ Sie die nebenstehende Schaltung in Wokwi auf. Versuchen Sie die Kabelfüh-rung übersichtlich zu halten.
  2. Geben Sie den folgenden Sketch ein:
    
    int ledPin[] = {13,12,11,10};
    void setup() {
      for (int i=0; i<4; i++) {
        pinMode(ledPin[i], OUTPUT);
      }
    }
    void loop() {
      for (int i=0; i<4; i++) {
        digitalWrite(ledPin[i], HIGH);
        delay(500);
        digitalWrite(ledPin[i], LOW);
      }
    }
                       
  3. Starten Sie die Ausführung des Sketches.

 

In diesem Sketch wird für die Initialisierung (setup) und das eigentliche „Lauflicht“ die for-Schleife von C benutz. In beiden for-Schleifen wird die Integervariable i mit dem Startwertwert 0 (i=0) versehen und nach jedem Durchgang um Eins erhöht (i++). Die Schleife wird verlassen, bevor i den Wert vier erreicht (i<4). Der Wert von i adressiert anschließend bei den Arrays den entsprechenden Wert (ledPin[i]). Dabei beginnt die Zählung bei Null.

Bewertete Aufgaben

  1. Passen Sie den Sketch so an, dass alle sechs eingesetzten LEDs benutzt werden.
  2. Prüfen Sie die Funktionsweise Ihres Sketches.
  3. Speichern Sie Ihren Sketch in einer Textdatei.
  4. Ändern Sie Ihren Sketch nun so ab, dass das Lauflicht nicht nur von links nach rechts läuft sondern hin und her läuft.
  5. Speichern Sie auch diesen Sketch in Ihre Textdatei und laden Sie diese Textdatei mit den beiden Sketchen in Mebis hoch.

 

Bibliotheken zu Projekten hinzufügen

Will man bestimmte Funktionalitäten zu seinem Sketch hinzufügen, gibt es oft fertige Bibliotheken, die diese Funktionen bereithalten. Dies kann z.B. die Nutzung der WiFi-Funktionalität des ESP32 sein. Allerdings gibt es auch zu jedem Sensormodul mindestens eine Bibliothek, die eine einfache Nutzung ermöglicht. Gleiches gilt auch für Displays oder die Nutzung bestimmter Protokolle.

Da ein simulierter Temperatursensor maximal nett ist, wird nun ein OLED-Display 1306 genutzt. Für die einfache Ansteuerung werden zwei Bibliotheken von Adafruit verwendet, die Adafruit GFX und Adafruit SSD 1306. Diese lassen sich in Wokwi einfach hinzufügen, indem man zunächst über der Codeseite auf die Schaltfläche „Library Manager“ klickt. Anschließend fügt man über das Pluszeichen die beiden Bibliotheken hinzu. Das Ergebnis sollte wie folgt aussehen:

Für den Aufbau wird neben dem Arduino das Display benötigt. Dieses findet man wie zuvor die anderen Hardwarekomponenten. Bei Anschließen des Displays sollte beachtet werden, dass das 1306 mit 3,3 V arbeitet und daher nicht an die 5 V des Arduino angeschlossen werden sollte. Allerdings ist Wokwi hier genauso robust wie bei LEDs ohne Vorwiderstand, ein Hardwareschaden ist nicht zu erwarten. Es werden GND des SSD1306 mit GND des Arduino und VCC des SSD1306 mit 3.3V des Arduino verbunden, SCL geht auf A4 und SDA auf A5. Das Ergebnis sollte etwa wie in der nebenstehenden Abbildung aussehen.

 

Arbeitsauftrag 4

  1. „Bauen“ Sie die nebenstehende Schaltung in Wokwi auf. Versuchen Sie die Kabelfüh-rung übersichtlich zu halten.
  2. Geben Sie den folgenden Sketch ein:
    
    #include "Wire.h"
    #include "Adafruit_GFX.h"
    #include "Adafruit_SSD1306.h"
    Adafruit_SSD1306 display(-1);
    #define DIS_WIDTH 128     // OLED display Pixel in der Breite
    #define DIS_HEIGHT 64     // OLED display Pixel in der Höhe
    #define IMG_HEIGHT 128
    #define IMG_WIDTH  64
    void setup(){
      Serial.begin(9600);
      if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
        Serial.println(F("SSD1306 konnte nicht gefunden werden!"));
        for (;;);    // Unendliche Schleife, um das Programm anzuhalten
      }
      delay(500);
      display.clearDisplay();
      display.setTextSize(1);  
      display.setTextColor(WHITE);       
      display.setCursor(5, 5);       
      display.print("IT-Technik");
      display.setCursor(5, 15);      
      display.print("Rink - Elter - Bayer");
      display.setCursor(5, 25);      
      display.print("Cool ;-)");
      display.display();
    }
    void loop(){
    }
                       
  3. Starten Sie die Ausführung des Sketches.