Logik erklärt
Medium · 45 min · Kostenlos
Ziel & Lerninhalt
Verstehe, wie ein Mikrocontroller Entscheidungen trifft – mit if/else, &&, || und Wahrheitstabellen.
- Boolesche Grundoperationen AND, OR, NOT anwenden.
- Komplexe Bedingungen aus mehreren Sensoren verknüpfen.
- De Morgan'sche Gesetze zur Code-Vereinfachung nutzen.
Erklärung & Wissen
Basic
Ein Mikrocontroller kennt nur zwei Zustände: wahr (1) und falsch (0). Alles, was er entscheidet, basiert auf Logik: 'Wenn Taste gedrückt UND Motor läuft noch nicht, dann Motor starten.' Diese Kombination aus UND, ODER, NICHT ist Boolesche Logik. In Arduino-Code schreibt man sie als &&, || und !. Wichtig: Beide Bedingungen bei && müssen wahr sein. Bei || genügt eine. Und ! kehrt alles um – aus wahr wird falsch.
Medium
Eine Wahrheitstabelle listet alle Kombinationen systematisch auf: Bei zwei Eingängen A und B gibt es 2² = 4 Zeilen. A=0,B=0; A=0,B=1; A=1,B=0; A=1,B=1. Jede Zeile zeigt das Ergebnis von A && B, A || B, !A. In echten ProtoPeaks-Projekten: Sensor A meldet Hindernis (HIGH), Schalter B ist aktiv (HIGH) → nur wenn beides gilt, bremst der Motor. Code: `if (sensorA == HIGH && schalterB == HIGH) { stop(); }`. De Morgan: `!(A && B)` ist identisch mit `!A || !B` – nützlich, um Bedingungen umzudrehen.
Expert
Auf CPU-Ebene werden Boolesche Operationen in einem einzigen Taktzyklus durch logische ALU-Befehle ausgeführt (AND, OR, XOR, NOT). Der Compiler optimiert komplexe Ausdrücke per Karnaugh-Diagramm oder algebraische Minimierung. In eingebetteten Systemen sind Kurzschlussauswertungen wichtig: Bei A && B wird B gar nicht ausgewertet, wenn A bereits falsch ist – spart Rechenzeit und verhindert Fehler (z.B. Division durch null in B). In sicherheitskritischen Systemen (SIL-zertifiziert) sind Booleschen Ausdrücke explizit dokumentiert und per Wahrheitstabelle verifiziert.
Fun Fact
George Boole, Mathematiker aus dem 19. Jahrhundert, entwickelte seine Algebra ursprünglich als Werkzeug der Philosophie – um logische Aussagen mathematisch zu formalisieren. Dass sie 100 Jahre später die Grundlage jedes Computers werden würde, hat er selbst nie erlebt.
- Wahrheitstabelle
- Tabelle aller Ein-/Ausgangs-Kombinationen einer logischen Verknüpfung. Bei n binären Eingängen hat die Tabelle $2^n$ Zeilen. Für 3 Eingänge (A, B, C) also 8 Zeilen. Eine vollständige Wahrheitstabelle beweist, ob zwei Ausdrücke logisch äquivalent sind – z. B. ob `!(A || B)` wirklich identisch mit `!A && !B` ist (De Morgan).
- Boolesche Algebra
- Rechnen mit Wahr/Falsch nach festen Regeln (Gesetzen). Wichtige Gesetze: Kommutativ ($A \wedge B = B \wedge A$), Assoziativ, Distributiv, Idempotenz ($A \wedge A = A$), De Morgan ($\neg(A \wedge B) = \neg A \vee \neg B$). Diese Gesetze erlauben das Vereinfachen langer if-Bedingungen zu kürzeren, fehlerresistenteren Formen.
- Bedingte Anweisung
- if/else – die Programm-Weiche, die Code nur bei bestimmten Bedingungen ausführt. Auf Assemblerebene wird `if` zu einem CMP-Befehl (Vergleich) gefolgt von einem bedingten Sprungbefehl (JZ, JNZ, JL…). Viele verschachtelte if/else-Strukturen können die Branch-Prediction der CPU ausbremsen. Oft ist ein switch-case effizienter, wenn man auf feste Werte prüft.
- Kurzschlussauswertung
- Der Compiler wertet den zweiten Teil von && oder || nicht aus, wenn das Ergebnis schon feststeht. Bei `if (A && B)` gilt: Ist A falsch, wird B gar nicht mehr ausgewertet. Ist bei `if (A || B)` A bereits wahr, entfällt B. Das ist kein Bug, sondern Standard (C, C++, Java). Wichtig: Falls B Seiteneffekte hat (z. B. `B = lieseSensor()`), darf man sich nicht auf deren Ausführung verlassen.
Praktischer Versuch: Logik-Ampel mit zwei Büroklammer-Kontakten
Zwei Büroklammer-Taster steuern über AND/OR-Logik, ob der Servo ausfährt. Kein Aktor nötig – der Serielle Monitor zeigt die Logikzustände live.
- 2 Büroklammern als Taster
- 2 Stücke Alufolie (Kontaktfläche)
Zwei Taster bauen
Baue zwei einfache Büroklammer-Kontakte: Biege je eine Büroklammer so, dass ein Arm auf ein Alufolie-Pad drückt, wenn man die Klammer runterdrückt. Verbinde je einen Pol mit D2 und D3, den anderen Pol mit GND.
Check: Beide Kontakte schließen zuverlässig wenn man drückt.
Tipp: Büroklammer auf Karton befestigen, darunter Alufolie-Pad – beim Drücken berühren sie sich.
Code uploaden
Lade den Code auf ProtoPeaks Mainboard. Öffne den seriellen Monitor (9600 Baud). Im Ruhezustand (keine Taste gedrückt) soll A=0, B=0 erscheinen.
Check: Serieller Monitor zeigt 'A=0 B=0' im Ruhezustand.
Tipp: Baudrate im seriellen Monitor auf 9600 stellen.
AND-Logik testen
Drücke Taste A allein, Taste B allein, beide gleichzeitig, keine. Beobachte das AND-Ergebnis in der Ausgabe.
Check: Nur wenn BEIDE Tasten gleichzeitig gedrückt, zeigt der Monitor 'AND=1'.
Tipp: Probiere alle 4 Kombinationen: keiner, nur A, nur B, beide.
OR-Logik testen
Beobachte die OR-Zeile in der Monitor-Ausgabe bei denselben 4 Kombinationen.
Check: Sobald EINE Taste gedrückt, zeigt Monitor 'OR=1'.
Tipp: Beim OR reicht eine von beiden – das ist oft der sicherere Auslöser.
Servo mit AND-Bedingung steuern
Aktiviere im Code die Servo-Steuerung. Teste: AND-Bedingung = Sicherheitsverriegelung (nur bei beiden Tasten). Tausche gegen OR – Servo reagiert schon auf eine Taste.
Check: Servo fährt nur aus, wenn beide Tasten gleichzeitig gedrückt.
Tipp: Ändere im Code die if-Bedingung auf || und beobachte den Unterschied.
Taster A an D2 (INPUT_PULLUP), Taster B an D3 (INPUT_PULLUP). Servo optional an D9.
// ProtoPeaks - Logik-Demo: AND / OR / NOT
#include <Servo.h>
Servo servo;
const int pinA = 2, pinB = 3;
void setup() {
Serial.begin(9600);
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
servo.attach(9);
servo.write(0);
}
void loop() {
bool A = !digitalRead(pinA); // LOW wenn gedrückt → invertieren
bool B = !digitalRead(pinB);
Serial.print("A="); Serial.print(A);
Serial.print(" B="); Serial.print(B);
Serial.print(" AND="); Serial.print(A && B);
Serial.print(" OR="); Serial.print(A || B);
Serial.print(" NOT_A="); Serial.println(!A);
if (A && B) servo.write(90); // AND: beide nötig
else servo.write(0);
delay(100);
}- Taster zeigt immer 1, auch ohne Drücken. — INPUT_PULLUP bedeutet: ungedrückt = HIGH = 1. Invertierung im Code mit !digitalRead() beachten.
- Servo zuckt ohne Tastendruck. — Büroklammer-Kontakt prellt. 20 ms delay oder Software-Entprellung (millis()-Vergleich) einfügen.
Kurzzusammenfassung
Boolesche Logik ist das Fundament jeder Entscheidung im Code. AND, OR, NOT kombinieren Sensorwerte zu sinnvollen Steuerregeln. Zwei Büroklammer-Taster reichen, um alle vier Wahrheitstabellen-Kombinationen live zu erleben.