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
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:
- FC-51 IR-Hindernissensor – fuer den Roboter gleich zwei einplanen
- Nano V3 Board (USB-C) – kompakt genug fuers Fahrgestell
- N20 Getriebemotor – kraftvoller Antrieb mit Getriebe
- 130 DC-Motoren (3er-Set) – die guenstige Antriebs-Alternative
- LED-Sortiment – fuer die Alarm-Anzeige
- Breadboard 400 Kontakte – fuer den Testaufbau
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!