FC-51 IR-Hindernissensor mit Arduino: Kollisionsschutz & Linienerkennung fuer Roboter

Der FC-51 ist der guenstigste Weg, deinem Arduino-Projekt Augen zu geben: Ein Infrarot-Sender strahlt Licht aus, ein Empfaenger daneben misst, ob es von einem Hindernis zurueckgeworfen wird. Kommt etwas naeher, schaltet der digitale Ausgang um – fertig ist der Kollisionsschutz. In diesem Tutorial verstehst du das Reflexions-Prinzip, stellst die Reichweite ueber das Poti ein, liest den Sensor sauber und entprellt aus, baust einen Alarm mit LED und laesst am Ende einen kleinen Roboter mit zwei FC-51 selbststaendig Hindernissen ausweichen. Auch fuer Objektzaehler und einfache Linienerkennung ist der Sensor gemacht.

Wie ein IR-Reflexsensor funktioniert

Auf dem FC-51 sitzen zwei kleine "Augen": eine Infrarot-LED (sendet unsichtbares Licht) und ein Fototransistor (empfaengt es). Ist der Weg frei, verpufft das ausgesendete Licht im Raum – der Empfaenger sieht nichts. Kommt ein Objekt in Reichweite, wird das IR-Licht zurueck auf den Empfaenger reflektiert. Ein Komparator auf der Platine vergleicht das Signal mit einer Schwelle und schaltet den OUT-Pin auf LOW, sobald ein Hindernis erkannt wird.

Das Entscheidende: Der FC-51 misst keine Entfernung. Er liefert nur ein Ja/Nein – Hindernis da oder nicht. Die Ansprechschwelle stellst du mit einem Potentiometer auf der Platine ein. Fuer echte Abstandswerte in Zentimetern brauchst du einen HC-SR04 Ultraschallsensor oder einen VL53L0X Laser-Sensor.

  • Reichweite: je nach Poti-Einstellung etwa 2–30 cm
  • Ausgang: digital (HIGH = frei, LOW = Hindernis), kein Analogwert
  • Betriebsspannung: 3,3–5 V – laeuft an Arduino wie an ESP32
  • Onboard-LED: zeigt die Erkennung direkt an, praktisch beim Justieren

ℹ️ FC-51 vs. PIR: Ein PIR-Bewegungsmelder reagiert nur auf Bewegung von Waermequellen (Menschen, Tiere). Der FC-51 erkennt dagegen jedes ruhende Objekt in Reichweite – auch eine Wand. Fuer Roboter, die vor Hindernissen stoppen sollen, ist genau das gefragt.

Das brauchst du

FC-51 IR-Hindernissensor – der Reflex-Sensor mit einstellbarer Reichweite (fuer den Roboter zwei Stueck)
UNO R3 Entwicklungsboard (USB-C) – liest die Sensoren und steuert die Reaktion
Nano V3 Board (USB-C) – die kompakte Wahl fuer den Roboter auf dem Fahrgestell
130 DC-Motoren (3er-Set) oder N20 Getriebemotoren – der Antrieb des Ausweich-Roboters
LED-Sortiment & Widerstaende – fuer die Alarm-Anzeige
Breadboard 400 Kontakte – fuer den Testaufbau

1Verkabelung & Reichweite einstellen

Der FC-51 hat drei Pins: VCC, GND und OUT. Wir haengen OUT an den Digitalpin D2.

FC-51 Arduino UNO Hinweis
VCC 5V laeuft auch an 3,3 V
GND GND gemeinsame Masse
OUT D2 digital: LOW = Hindernis erkannt

Auf der Platine sitzt ein blaues Potentiometer. Damit stellst du die Reichweite ein: Halte ein Objekt (z. B. deine Hand) in den gewuenschten Abstand und drehe das Poti langsam, bis die zweite Onboard-LED gerade anspringt. Ziehst du die Hand weg, muss sie wieder ausgehen. So kalibrierst du die Schwelle rein per Auge – ganz ohne Code.

⚠️ Logik ist invertiert: Der OUT-Pin ist im Ruhezustand HIGH und faellt bei einem Hindernis auf LOW. Das verwirrt am Anfang – im Code fragen wir deshalb auf == LOW ab.

2Erstes Auslesen

Der Einstieg ist ein Dreizeiler: Pin als Eingang, Zustand lesen, ausgeben. Weil LOW ein Hindernis bedeutet, drehen wir die Abfrage entsprechend um:

#define IR_PIN 2

void setup() {
  pinMode(IR_PIN, INPUT);
  Serial.begin(115200);
  Serial.println("FC-51 bereit");
}

void loop() {
  int zustand = digitalRead(IR_PIN);

  if (zustand == LOW) {          // LOW = Hindernis
    Serial.println("Hindernis erkannt!");
  } else {
    Serial.println("frei");
  }
  delay(200);
}

Halte etwas vor den Sensor: Im Seriellen Monitor wechselt die Meldung sofort. Funktioniert das nicht, ist meistens das Poti zu unempfindlich eingestellt oder OUT haengt am falschen Pin.

3Sauber erkennen: entprellen & Alarm ausloesen

An der Grenze der eingestellten Reichweite "zittert" der Ausgang gerne zwischen HIGH und LOW. Fuer einen zuverlaessigen Alarm zaehlen wir deshalb nur einen stabilen Zustandswechsel – das Signal muss eine kurze Zeit konstant anliegen, bevor wir es glauben. Dazu schaltet der Sketch bei einem Hindernis eine LED an D8 ein:

#define IR_PIN  2
#define LED_PIN 8

int  letzterStabil = HIGH;         // zuletzt bestaetigter Zustand
int  letzterMesswert = HIGH;
unsigned long wechselZeit = 0;
const unsigned long entprellMs = 40;

void setup() {
  pinMode(IR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  int messwert = digitalRead(IR_PIN);

  // bei jeder Aenderung die Uhr neu starten
  if (messwert != letzterMesswert) {
    wechselZeit = millis();
    letzterMesswert = messwert;
  }

  // Zustand erst uebernehmen, wenn er lange genug stabil ist
  if (millis() - wechselZeit > entprellMs) {
    if (messwert != letzterStabil) {
      letzterStabil = messwert;

      if (letzterStabil == LOW) {
        digitalWrite(LED_PIN, HIGH);
        Serial.println("ALARM: Hindernis!");
      } else {
        digitalWrite(LED_PIN, LOW);
        Serial.println("wieder frei");
      }
    }
  }
}

💡 Das gleiche Prinzip wie bei Tastern: Diese Entprell-Logik brauchst du bei fast jedem digitalen Signal. Tiefer steigt der Guide zu Interrupts & Entprellen ein – dort loest der Sensor sogar eine Interrupt-Routine aus, statt in loop() gepollt zu werden.

4Praxisprojekt: Roboter weicht Hindernissen aus

Jetzt der Klassiker: ein kleiner Roboter, der eigenstaendig um Hindernisse herumfaehrt. Zwei FC-51 blicken schraeg nach vorne – einer links, einer rechts. Ist der Weg frei, faehrt der Roboter geradeaus. Meldet der linke Sensor ein Hindernis, weicht er nach rechts aus und umgekehrt. Melden beide etwas, faehrt er kurz zurueck und dreht.

Die beiden Motoren steuern wir hier vereinfacht ueber zwei Richtungspins pro Seite (in der Praxis meist ueber eine Treiberstufe, siehe Hinweis). Der Fokus liegt auf der Ausweich-Logik:

// FC-51 Ausweich-Roboter (Logik-Grundgeruest)
#define IR_LINKS  2
#define IR_RECHTS 3

// Motorpins (je Seite ein Vorwaerts-Pin, vereinfacht)
#define M_LINKS   5
#define M_RECHTS  6

void setup() {
  pinMode(IR_LINKS,  INPUT);
  pinMode(IR_RECHTS, INPUT);
  pinMode(M_LINKS,   OUTPUT);
  pinMode(M_RECHTS,  OUTPUT);
  Serial.begin(115200);
}

void vorwaerts()   { digitalWrite(M_LINKS, HIGH); digitalWrite(M_RECHTS, HIGH); }
void stopp()       { digitalWrite(M_LINKS, LOW);  digitalWrite(M_RECHTS, LOW);  }
void dreheRechts() { digitalWrite(M_LINKS, HIGH); digitalWrite(M_RECHTS, LOW);  }
void dreheLinks()  { digitalWrite(M_LINKS, LOW);  digitalWrite(M_RECHTS, HIGH); }

void loop() {
  bool hindernisLinks  = (digitalRead(IR_LINKS)  == LOW);
  bool hindernisRechts = (digitalRead(IR_RECHTS) == LOW);

  if (hindernisLinks && hindernisRechts) {
    // beide blockiert: kurz stoppen und wegdrehen
    stopp();
    delay(150);
    dreheRechts();
    delay(400);
  }
  else if (hindernisLinks) {
    dreheRechts();          // links blockiert -> nach rechts
  }
  else if (hindernisRechts) {
    dreheLinks();           // rechts blockiert -> nach links
  }
  else {
    vorwaerts();            // Weg frei
  }
}

⚠️ Motoren nie direkt an Arduino-Pins: Ein Motor zieht mehr Strom, als ein Pin liefern darf, und erzeugt Spannungsspitzen. Steuere ihn ueber eine Treiberstufe (Transistor/Motortreiber) und versorge ihn aus einer eigenen Quelle. Die Grundlagen der Drehzahl- und Richtungssteuerung zeigt der Artikel DC-Motor & N20 mit Arduino ansteuern. Die Pins oben sind bewusst als Platzhalter fuer deine Treiber-Eingaenge gedacht.

5Weitere Einsaetze: Objektzaehler & Linienerkennung

Der FC-51 kann mehr als nur ausweichen. Zwei Ideen, die den gleichen Sensor nutzen:

Objektzaehler: Montierst du den Sensor an einer Foerderstrecke oder einem Durchgang, zaehlst du jedes vorbeiziehende Teil. Entscheidend ist, nur die Flanke zu zaehlen – also den Uebergang von "frei" zu "Hindernis", nicht jeden einzelnen LOW-Durchlauf:

#define IR_PIN 2

long zaehler = 0;
int  vorher = HIGH;

void setup() {
  pinMode(IR_PIN, INPUT);
  Serial.begin(115200);
}

void loop() {
  int jetzt = digitalRead(IR_PIN);

  // fallende Flanke: HIGH -> LOW = neues Objekt
  if (vorher == HIGH && jetzt == LOW) {
    zaehler++;
    Serial.print("Objekte gezaehlt: ");
    Serial.println(zaehler);
  }
  vorher = jetzt;
  delay(10);
}

Linienerkennung: Weil helle Flaechen IR-Licht gut reflektieren und schwarze es schlucken, erkennt der FC-51 den Kontrast zwischen weissem Boden und schwarzer Linie – die Basis fuer einen Linienfolge-Roboter. Fuer saubere Ergebnisse muss der Sensor allerdings dicht (wenige Millimeter) ueber dem Boden sitzen und das Poti feinfuehlig justiert sein. Spezielle Linienfolge-Module (TCRT5000) sind hier praeziser, fuer erste Experimente reicht der FC-51 aber gut.

Troubleshooting

⚠️ Sensor loest gar nicht aus: Poti zu unempfindlich eingestellt – langsam in die andere Richtung drehen, bis die Onboard-LED bei einem Hindernis reagiert.

⚠️ Sensor loest staendig aus: Poti zu empfindlich, oder direktes Sonnenlicht bzw. eine helle Lampe blendet den Empfaenger. IR-Sensoren moegen kein starkes Fremdlicht – im Zweifel abschatten.

⚠️ Dunkle/schwarze Objekte werden nicht erkannt: Schwarze und matte Oberflaechen reflektieren IR kaum. Das ist physikalisch bedingt – fuer solche Faelle ist ein Ultraschallsensor die bessere Wahl, der auf Schall statt Licht setzt.

⚠️ Reichweite schwankt stark: Glaenzende Oberflaechen reflektieren weiter als matte. Kalibriere das Poti auf das Material, das dein Projekt wirklich erkennen soll.

⚠️ Zwei Sensoren stoeren sich: Sitzen zwei FC-51 zu dicht nebeneinander, sieht der eine das IR-Licht des anderen. Etwas Abstand oder ein Sichtschutz dazwischen loest das.

🚀 Dein Robotik-Starterpaket

Alles fuer Kollisionsschutz und Ausweich-Roboter im Shop:

Fazit

Der FC-51 ist der guenstigste Einstieg in optische Hinderniserkennung: drei Kabel, ein Poti zum Justieren und ein digitaler Ausgang, der bei einem Hindernis auf LOW faellt. Du hast das Reflexions-Prinzip verstanden, den Sensor entprellt ausgelesen, einen LED-Alarm gebaut und einen Roboter programmiert, der mit zwei Sensoren eigenstaendig ausweicht – plus die Bonus-Ideen Objektzaehler und Linienerkennung.

Merke dir die eine Grenze: Der FC-51 sagt ob, nicht wie weit. Sobald du echte Entfernungen in Zentimetern brauchst, wechselst du zum HC-SR04 oder VL53L0X – die kannst du sogar mit dem FC-51 kombinieren, etwa als schneller Notfall-Stopp neben der praezisen Abstandsmessung. Viel Spass beim Bauen deines ersten autonomen Roboters!

Zurück zum Blog