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)
  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Ähnliche Themen