Arduino Legacy

  • Kann auch in Visual Studio Code Arduino programmieren, aber noch nicht ausprobiert (TODO)
  • Gibt Alternativen zu Arduinos, z.B. ESP32

In diesem Auftrag geht es darum, den Arduino und dessen Programmiersprache C++ kennenzulernen.

Teil I

  1. Installiere die Arduino-IDE und verbinde den Arduino mit deinem Computer per USB.
  2. Starte dein erstes Arduino-Projekt und gebe in der Konsole der Arduino-IDE „Hello World“ aus. Siehe Ausgabe in Konsole

Teil II

Hier geht es darum, sich mit den wichtigsten Sprachelementen von C++ vertraut zu machen. Verwende dazu parallel das Arduino Programmieren Tutorial.

Diese Aufgabe kann auch mit dem Simulator (https://wokwi.com/projects/294342288335700490) gelöst werden. Verwende aber besser deinen Arduino.

  1. Mache einen Counter, der in der Konsole im Sekundentakt beliebig weit hoch zählt: $1,2,3,4,5,\ldots$.
    Tipp: Arduino Befehle
  2. Speichere in einem int-Array primes die Primzahlen $2,3,5,7,11,13$. Gebe diese im Sekundentakt der Reihe nach aus. Ist der Code am Ende des Arrays angelangt, so soll er wieder von vorne beginnen usw. Schreibe den Code so, dass er auch funktioniert, wenn man dem Array weitere Zahlen hinzufügt.
  3. Berechne mithilfe einer Schleife die Summe $100+101+102+\ldots+200$ und gib das Resultat ($15150$) aus.
  4. Schreibe eine Funktion rollDice vom Typ int, welche kein Argument entgegennimmt und eine Zufallszahl von $1$ bis $6$ zurück gibt. Rufe nun im Sekundentakt diese Funktion auf und gebe das Resultat aus.
  5. Erweitere deinen Code von der letzten Teilaufgabe mit einer Verzweigung: Wenn man (nicht) eine $6$ würfelt, soll zusätzlich „Gewonnen“ („Verloren“) angezeigt werden.
  1. Installiere Git. Auf Mac ist keine Installation nötig.
  2. Erstelle einen GitHub-Account (http://github.com). Verwende eine private Mail-Adresse, die du möglichst in 20 Jahren noch hast.
  3. Erstelle auf GitHub ein privates Repository mit Namen „ArduinoProjectsEFIF“ und klone es auf deinen Computer.
  4. Gebe das Repo der Lehrperson (anschae) frei.
  5. Erstelle für jedes Projekt unten ein neues File in diesem Ordner. Adde, commite und pushe regelmässig auf GitHub.

Arduino-Box richten:

  • Tuperware
  • Arduino
  • Batterie mit Kabel
  • LCD-Display

Ziele

  • LCD-Display ansteuern können und …
  • Laufschrift darauf anzeigen.

Name File

Benenne das Arduino-File Laufschrift.ino.

Material

  • LCD-Display

Teil I

Schliesse das LCD-Display an (siehe Arduino Programmieren Tutorial) und gebe darauf „Hello EFIF“ aus.

Teil II

Programmiere darauf eine Laufschrift.

Tipp: Verwende den Datentypen String. Es gibt sehr hilfreiche Befehle, um diese zu manipulieren. Siehe dazu: https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

Ziel

Eine LED zum Leuchten bringen und die Blink-Frequenz mit einem Potentiometer einstellen

Name File

Benenne das Arduino-File DiscoDisco.ino.

Material

  • LED & Widerstand
  • Potentiometer

Teil I

Bringe zuerst einmal eine LED auf dem Breadboard zum Leuchten. Beachte:

  • Verwende unbedingt einen passenden Vorwiderstand (mind. 120 Ohm)! Ohne diesen geht die LED kaputt und auch der Arduino kann beschädigt werden.
  • Die längere Verbindung (Anode) der LED geht auf Plus.

Teil II

Studiere das Kapitel zur Verwendung von analogen und digitalen Pins.

Verbinde nun eine der Verbindungen der LED mit einem der digitalen Inputs/Outputs des Arduinos (Uno: Pins 2 bis 13, vermeide Pins 0 und 1). Lege nun am entsprechenden Pin HIGH an, damit die LED leuchtet. Lasse nun die LED blinken. Verwende dazu die Delay-Funktion.

Teil III

Mit einem Potentiometer soll nun die Blink-Frequenz eingestellt werden können. Verbinde die Anschlüsse 1 & 3 des Potentiometers mit Vcc und GRN. Verbinde Anschluss 2 des Potentiometers mit einem der analogen Inputs/Outputs A0 bis A3 des Arduinos. Lese den Wert, der dort angelegt wird, nun ein. Dreht man das Potentiometer, so variiert der Wert im Bereich $0$ bis $1023$. Nutze diesen Wert, um die Frequenz festzulegen.

Ziel

Die Helligkeit einer LED mit einem Poti steuern. Die Lampe über zwei Knöpfe an und ausschalten.

Name File

Benenne das Arduino-File HelligkeitLED.ino.

Material

  • LED
  • Potentiometer
  • Schalter (2x)

Auftrag Teil 1: Helligkeit einstellen

Um die Helligkeit einer LED einstellen zu können, würde sich ein analoger Output-Pin anbieten, da dieser, im Gegensatz zu einem digitalen Output, auch Werte zwischen 0V und 5V annehmen kann. Trotzdem wollen wir für diese Aufgabe die LED an einem digitalen Pin anschliessen. Um die Helligkeit einstellen zu können, so müssen wir auf einen Trick zurückgreifen: Man muss die LED blinken lassen: Schnell genug, damit man es nicht als Blinken wahrnimmt aber langsam genug, damit die LED weniger hell erscheint. Diesen Code kann man natürlich selbst schreiben. Einfacher aber ist es, wenn man die LED an einen PWM-Pin anschliesst (digitale Pins mit Tilde-Symbol). PWM steht für Pulse Width Modulation. Der Output wechselt dabei periodisch zwischen LOW und HIGH, wobei man die Breite des Pulses mit einer Zahl zwischen 0 und 255 angeben kann: analogWrite(PIN_NR,puls_breite); Siehe dazu auch die Grafiken im Manual zu PWM.

Auftrag Teil 2: On/Off Schalter

Füge nun zwei Schalter hinzu. Schliesse diese an digitale Inputs. Mit digitalRead kann man abfragen, ob der Knopf gedrückt wird oder nicht. Mit einem Schalter soll die LED ein-, mit dem anderen ausgeschaltet werden können.

Auftrag Teil 3: nur 1 Schalter (optional)

Mache eine Kopie deines Codes und benenne das File HelligkeitLED2.ino. Entferne nun einen der Schalter. Man soll nun mit nur einem Schalter die LED ein- und ausschalten können.

Ziel

Einfaches Testprogramm zur Vorbereitung auf den Chronometer unten.

Auftrag

  1. Mit der delay() Funktion kann man einfach eine LED zum Blinken bringen. Doch die Verwendung dieser Funktion bringt grosse Nachteile mit sich. Welche wären die? Bespreche mit Kolleg:in.
  2. Wie könnte man anders eine LED im Sekundentakt zum Blinken bringen? Mache mit Kolleg:in einen Plan.
  3. Setzt euren Plan zusammen um.
  4. Könnt ihr auch zwei (oder mehr) LEDs in beliebigen Takten (z.B: LED 1 im Sekundentakt. LED 2 im 0.7 Sekundentakt) zum Blinken bringen?

Ziel

Einen Chronometer, also eine Stoppuhr, programmieren. Die Bestzeiten sollen im EEPROM des Arduinos gespeichert werden.

Name File

Benenne das Arduino-File Chronometer.ino.

Material

  • Schalter (3x)

Teil 1: Zeitmessung

Verbinde die drei Schalter mit dem Arduino, von denen soll dann jeweils einer:

  • Messung Starten
  • Messung Stoppen
  • Bestzeiten verwalten

Programmiere den Arduino nun so, dass man die Zeit stoppen kann. Drückt.man auf den Startknopf, so beginnt die Zeit zu laufen. Drückt man auf den Stoppknopf, so wird die Messung gestoppt. Drückt man nun den Startknopf erneut, so startet eine neue Messung. Die Zeit wird auf dem Display in der oberen Zeile in Millisekunden ausgegeben.

millis(); // gibt einem die Zeit seit Programmstart in Millisekunden an.

Teil 2: Zeitanzeige

Formattiere nun die Zeitanzeige. Diese soll im Format Minuten:Sekunden:Hundertstelsekunden, also zum Beispiel 04:12:05, sein. Schreibe dazu eine eigene Funktion.

Teil 3: Bestzeit

Erzielt man eine neue Bestzeit, so soll diese im EEPROM gespeichert werden. Damit ist diese Zeit auch noch verfügbar, wenn man die Spannungsquelle vom Arduino trennt. Auf das EEPROM kannst du mit EEPROM.read und EEPROM.write zugreifen. Die Bestzeit soll auf der zweiten Zeile des Displays angezeigt werden. Wird der Arduino neu gestartet, so soll die bereits vorhandene Bestzeit aus dem EEPROM gelesen und angezeigt werden.

Drückt man den dritten (bisher nicht genutzten) Schalter, so soll die Bestzeit zurückgesetzt werden.

Im EEPROM des Arduino Uno kann man insgesamt 1024 Bytes speichern. Um nun eine grössere Zahl darin zu speichern, muss diese Zahl in einzelne Bytes zerlegt werden. Mit z & 0x0000FF extrahiert man das erste Byte des longs z. Dabei steht 0x0000FF für die Zahl 00….001111 in Hexadezimalschreibweise (deshalb das 0x). Der Operator & ist dabei die bitweise Und-Verknüpfung. Das zweite Bit extrahiert man dann mit (z & 0x00FF00) >> 8; Der Befehl >> 8 verschiebt das Resultat um 8 bits nach rechts.

ACHTUNG: Achte darauf, dass nicht in jedem Durchgang des Loops ins EEPROM geschrieben wird/vom EEPROM gelesen wird. Ansonsten wird es beschädigt! Speichere nur dann, wenn eine neue Bestzeit erzielt wurde.

Teil 4: Zusätzliche Features für Schalter (optional)

  • Drückt man länger auf den Stoppknopf, so soll die angezeigte Zeit (nicht Bestzeit) zurückgesetzt werden.
  • Die Bestzeit soll nur dann zurückgesetzt werden, wenn die dritte Taste mind. zwei Sekunden gedrückt wird.

Teil 5: Mehrere Bestzeiten

Anstelle von nur einer Bestzeit sollen die fünf besten Zeiten sortiert im EEPROM gespeichert werden. Drückt man die dritte Taste Kurz, soll man durch dir Bestzeiten durchklicken können.

Um dies realisieren zu können, benötigst du ein Array, in welchem du mehrere Werte speichern kannst. Mit

long arr[5];

deklarierst du ein Array namens arr, welches 5 longs speichern kann. Beachte, dass die Grösse eines Arrays im Nachhinein nicht mehr verändert werden kann. Die Elemente des Arrays sind durchnummeriert. Um auf ein Element eines Arrays zuzugreifen, verwenden wir eckige Klammer, z.B. arr[2]. Beachte, dass das erste Element den Index 0 (und nicht 1!!!) hat. Das erste Element ist also arr[0], das fünfte und letzte ist arr[4]. Möchtest du auf alle Elemente eines Arrays zugreifen, kannst du eine for-Schleife verwenden. Möchtest du z.B. alle Elemente auf den Wert 42 setzen (warum auch nicht?), kannst du dies wie folgt machen:

for (int i=0; i < 5; i++)
{
  // zählt alle Zahlen durch von i=0 bis und mit i=4
  arr[i] = 42;
}

Die Bestzeiten müssen sortiert werden. Dafür kannst du die vordefinierte Funktion qsort verwenden. Besser (und interessanter) ist aber, einen eigenen Sortieralgorithmus zu schreiben. Die einfachste Möglichkeit ist der sogenannte Select: Wähle das erste Element des Arrays aus. Vergleiche dieses nun mit allen Elementen rechts davon (mit höherem Index). Wann immer eines der rechten Elemente grösser ist: Vertausche die beiden. Hast du das erste Element mit allen anderen verglichen, so weist du, dass das erste Element das kleinste ist. Nun wählst du das zweite Element und vergleichst dieses mit allen Elementen rechts davon usw.

Tipp: Verwende zwei ineinander verschachtelte for-Schleifen.

Datum: EF IF-Tag, 22.01.2023

Übersicht

Idee: Alle setzen an diesem Tag ein eigenes, kleines Arduino-Projekt um. Am späteren Nachmittag präsentieren alle den anderen ihre (hoffentlich fertigen) Projekte. Für das Projekt wird eine kurze Dokument erstellt.

Zeitplan

  • Kick-Off: 8.00
    • Info: Plan, Dokumentation
    • EFs:
      • Dokumentation beginnen: Titel, Abstract, Materialien
      • mit einer LP besprechen
    • TALITs per Teams-Chat an sca:
      • Ausgangslage: Was ist der Stand der Dinge jetzt?
      • Ziele:
        • Welche Ziele möchtest du heute unbedingt erreichen?
        • Welche sind optional?
  • Selbständiges Arbeiten bis 12.00 (TALITs: 11.45 zurück für Statusupdate)
    • dazwischen: Führung durch Informatik-Infrastruktur der KSR
  • Mittag
  • Selbständiges Arbeiten 13.00 - 15.00:
    • Dokumentation vervollständigen
  • Präsentationsrunde: 15.00
    • Alle demonstrieren den anderen ihr Projekt

Dokumentation

Die Dokumentation sollte 1-2 A4-Seiten lang sein und muss folgendes Beinhalten:

  • Abstract: Kurze Beschreibung des Projekts in wenigen Sätzen
  • Benötigte Materialien: Welche Komponenten werden benötigt?
  • Fotos:
    • des gesamten Projekts
    • Verkabelung, jedes Details (z.B. an welche Pins angeschlossen) muss ersichtlich sein
  • Code: gesamter Code als Screenshot
  • Beschreibung:
    • Was macht dein Code? Welche Funktionalitäten hast du implementiert?
    • Bugs/Probleme: Gibt es noch Probleme? Was funktioniert (noch) nicht?
    • Ausblick: Wie könnte man das Projekt mit mehr Zeit noch erweitern?

Abgabe: PDF im Teams-Chat an sca bis am Abend des EF-Tags.

Idee: Eigenes Arduino-Projekt über Zeitraum von mehreren Wochen realisieren. Wird benotet.

Auftrag 0

  • ef_informatik/arduino_legacy.txt
  • Zuletzt geändert: 2024-09-02 13:45
  • von sca