A wie Arduino Basics
Das Arduino verbindet über angeschlossene Sensoren die reale physische Welt mit der Welt des Virtuellen und steuert wiederrum im Code definiert Aktoren wie LEDs, Piezolautsprecher und Motoren.

Es gibt analoge Inputs, digitale Inputs und digitale Outputs. Mit PWM kann man an den Ausgängen mit dem Zeichen “~” auch analoge Spannungen simulieren.
B wie Blink
- Wir versuchen gemeinsam den Beispielcode “blink” auf das Arduino zu laden…
- …danach verändern wir die Blinkgeschwindigkeit und
- bei kurzen Pausen wird derselbe Code interessant mit einem Piezo-Buzzer anstatt mit einem LED.
C wie Aufgaben
Knob
- Lade den Knob-Beispielcode (File/Examples/Servo/Knob) auf das Arduino.
- Klicke im Code auf den Link im Kommentar und stecke den Servo und das Potentiometer wie im Bild ins Breadboard.
- Ergänze den Code mit den zwei Funktionen der seriellen Kommunikation (siehe unten) um am Serial Monitor auf dem Computer die Sensordaten vom Arduino zu sehen.
void setup() {
Serial.begin(9600)
}
void loop() {
Serial.println(val)
}
Living-Servo
Das Potentiometer aus der letzten Aufgabe macht einen Spannungsteiler. Das ist notwendig damit das Arduino eine Änderung der Spannung messen und in Werte bis zu 10bit umwandeln kann.

Anleitung der Aufgabe zum Living-Servo
- Stecke die Verbindungen wie oben aufgezeigt auf dem Breadboard.
- Lade das Programm “Knob” mit der ergänzten Serial-Kommunikation auf das Arduino.
- Verändere den am Computer angezeiten Sensor-Wert passend zu den Werten die der LDR liefert mit der Funktion “map()” (evtl. auf Zeile 23 im Code).
Die Werte dürfen 10bit nicht überschreiten (Umrechnung bits ins binäre System: Arndt Bruenner). Genauere Erklärungen zu “map” findest du in der Arduino-Referenz.
Eigener Sensor aus dem Arduino-Kit
Für diese Aufgabe sucht ihr euch einen eigenen Sensor. Zum Beispiel den Ultraschallsensor HC-SR05 (siehe Links unten). Klappt die Distanzmessung?
Motoren und Motorshields
Motoren brauchen viel Strom. Das Arduino kann ausser direkt bei den “5V” und beim “Vin” nur 50mA aus den Pins liefern. Um mehr Strom zu bekommen nutzen wir einen zusätzlichen Chip. Entweder kommt er als MOSFET, L293D oder auf einem Shield. Der A4988-Motortreiberchip ist speziell für Steppermotoren und wird für das CNC-Shield im Motor Extended Kit benötigt. Siehe unten die Links.
Graphiton-Arduino-Servo (Graphiton als Sensor)

/*
Actioncy GmbH presents:
"Graphiton-Arduino-Servo"
Vereinfachung von einem Code mit Interrupts von ChatGPT:
Kein Interrupt: Wir überwachen den Zustand des Pins direkt im loop(). Der Code liest den Zustand des Pins und prüft, ob er sich geändert hat. Wenn der Zustand von LOW nach HIGH wechselt, registriert der Code einen Impuls.
Zeitmessung: Der Code überprüft alle 1000 ms (1 Sekunde), wie viele Impulse seit der letzten Berechnung erfasst wurden, und zeigt diese als Frequenz an.
Entprellung: Da wir ohne Interrupt arbeiten, könnte es zu Problemen mit "Bouncing" (Prellen) des Signals kommen, insbesondere bei mechanischen Schaltern. Hier gehen wir davon aus, dass das Signal stabil ist und keine zusätzlichen Entprellungsmechanismen notwendig sind. Wenn nötig, kannst du zusätzliche Entprellung hinzufügen (z. B. durch Hysterese oder Software-Entprellung).
Frequenzberechnung: Alle 1 Sekunde wird die Anzahl der Impulse erfasst und als Frequenz (Impulse pro Sekunde) ausgegeben.
Weitere Verbesserung:
Wenn du immer noch Probleme mit der Zählung hast, könnte es an der Geschwindigkeit des Signals oder dem Signalpegel selbst liegen. Achte darauf, dass der Pin stabil ist und die Signale auch richtig erkannt werden.
Teste den Code und überprüfe, ob nun die korrekte Frequenz angezeigt wird!
*/
#include <Servo.h>
const int inputPin = 2; // Der digitale Pin, an dem das Signal anliegt
unsigned long lastMillis = 0;
unsigned long lastStateChange = 0;
int pulseCount = 0;
bool lastState = LOW;
Servo myservo; // create servo object to control a servo
int val = 0;
unsigned long servoMillis = 0;
int frequency = 0;
int i = 0;
void setup() {
// Initialisierung der seriellen Kommunikation
Serial.begin(9600);
myservo.attach(9);
// Den Input-Pin als Eingang festlegen
pinMode(inputPin, INPUT);
// Eine Sekunde warten, bevor wir mit der Ausgabe beginnen
delay(1000);
}
void loop() {
unsigned long currentMillis = millis();
val = map(frequency, 0, 23, 0, 180); // scale it for use with the servo (value between 0 and 180)
myservo.write(val);
// Wenn eine Sekunde vergangen ist, berechne die Frequenz und setze den Zähler zurück
if (currentMillis - lastMillis >= 100) {
frequency = pulseCount; // Frequenz ist die Anzahl der Impulse in 1 Sekunde
pulseCount = 0; // Zähler zurücksetzen
lastMillis = currentMillis;
// Ausgabe der Frequenz
Serial.print("Frequenz: ");
Serial.print(frequency);
Serial.println(" Hz");
}
// Zustand des Pins abfragen und Zähler erhöhen, wenn der Zustand sich geändert hat
bool currentState = digitalRead(inputPin);
// Wenn sich der Zustand des Pins geändert hat, dann wurde ein Impuls erkannt
if (currentState != lastState) {
// Wenn der Zustand auf HIGH wechselt, registrieren wir einen Impuls
if (currentState == HIGH) {
pulseCount++;
}
lastState = currentState;
}
}
Links
Interaktive Arduino-Plattform: Beispiel Knob auf “wokwi”