Morsecode-Kommunikation mit Lasermodul – Duales Arduino-Projekt
Komponenten und Materialien
| Arduino UNO | × | 2 |
| Steckbrett (Breadboard) | × | 2 |
| Laser-Transmitter (Autodesk LASER TRANSMITTER) | × | 1 |
| Fotowiderstand (LDR) | × | 1 |
| Steckbrücken (Jumper Wires) | × | 1 |
Software
- Arduino IDE
Projektbeschreibung
Morsecode
Morsecode wandelt alphanumerische Zeichen in Punkte (kurz) und Striche (lang) um. Jedes Zeichen hat ein einzigartiges Muster. Dieses Projekt implementiert Sender und Empfänger einer optischen Morsecode-Strecke per Laserlicht. Der Empfänger-Algorithmus ist besonders einfach und basiert auf Zeitmessung von High/Low-Phasen.

Schritt 1: Sender (Transmitter)
Der Laser wird an Digitalpin 13 (PWM) angeschlossen (Anode), GND an Arduino-GND.



Algorithmus (Sender)
- Zu sendender Text als
char-Array vorgeben. - Laser-Pin definieren (Pin 13).
- Morse-Geschwindigkeit einstellen (
dotLen = 200 ms). - Punkt = HIGH für
dotLen, Strich = HIGH für3×dotLen. - Pause zwischen Elementen =
dotLen, zwischen Zeichen =3×dotLen, zwischen Wörtern =7×dotLen. - Jedes Zeichen per
switch-casein Punkte/Striche umsetzen und Laser entsprechend schalten.
Schritt 2: Empfänger (Receiver)
LDR mit 10 kΩ Pull-Down an A0: LDR an 5 V, anderer Pin an A0 und über 10 kΩ an GND. Wichtig: LDR vor Fremdlicht schützen (z. B. schwarze Papierkuppel).




Algorithmus (Empfänger) – Kernidee
- Ohne Laser liefert LDR Werte < 1000. Schwelle auf 1000 gesetzt.
- Wenn Wert > 1000: Laser erkannt → in Messschleife eintreten (14 Samples à 200 ms).
- Quantisierung: Wert > 1000 → ‚1‘ (Licht an), sonst ‚0‘ (Licht aus).
- Zähler
afür Anzahl ‚1‘,ffür Anzahl ‚0‘. - Jedes Morsezeichen hat ein charakteristisches Paar (a, f). Per
if-Kette zuordnen und ausgeben.
Beispiel: ‚a‘ = 4 Einsen, 10 Nullen; ‚b‘ = 6/8; ‚e‘ = 1/13; ‚s‘ = 3/11 etc.
Einschränkung: Der Code deckt nur eine Teilmenge der Zeichen ab. Erweiterung auf volles Alphabet durch weitere if-Zweige oder Lookup-Tabelle möglich.
Code
CODE-1: Sender (Laser-Steuerung)
int led13 = 13;
int dotLen = 200;
int dashLen = dotLen * 3;
int elemPause = dotLen;
int Spaces = dotLen * 3;
int wordPause = dotLen * 7;
char stringToMorseCode[] = "HELLO WORLD"; // Beispieltext
void setup() {
pinMode(led13, OUTPUT);
}
void loop() {
for (int i = 0; i < sizeof(stringToMorseCode) - 1; i++) {
char tmpChar = toLowerCase(stringToMorseCode[i]);
GetChar(tmpChar);
}
LightsOff(8000); // Lange Pause vor Wiederholung
}
void MorseDot() { digitalWrite(led13, HIGH); delay(dotLen); }
void MorseDash() { digitalWrite(led13, HIGH); delay(dashLen); }
void LightsOff(int delayTime) { digitalWrite(led13, LOW); delay(delayTime); }
void GetChar(char tmpChar) {
switch (tmpChar) {
case 'a': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'b': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'c': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'd': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'e': MorseDot(); LightsOff(elemPause); break;
case 'f': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'g': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'h': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'i': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'j': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'k': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'l': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'm': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'n': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'o': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'p': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'q': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'r': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 's': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 't': MorseDash(); LightsOff(elemPause); break;
case 'u': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'v': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'w': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'x': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'y': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'z': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
default: LightsOff(Spaces); // Leerzeichen / unbekannt
}
}
CODE-2: Empfänger (LDR-Auswertung)
int sensorPin = 0;
int sensorValue = 0;
int a, f;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(sensorPin);
if (sensorValue > 1000) {
a = 0; f = 0;
for (int i = 0; i <= 13; i++) {
sensorValue = analogRead(sensorPin);
if (sensorValue > 1000) { a++; }
else { f++; }
delay(200);
}
// Zeichenzuordnung
if (a == 4 && f == 10) Serial.print("a");
if (a == 6 && f == 8) Serial.print("b");
if (a == 8 && f == 6) Serial.print("c");
if (a == 1 && f == 13) Serial.print("e");
if (a == 2 && f == 12) Serial.print("i");
if (a == 10 && f == 4) Serial.print("j");
if (a == 7 && f == 7) Serial.print("g");
if (a == 9 && f == 5) Serial.print("o");
if (a == 3 && f == 11) Serial.print("s");
// ... weitere Zeichen ergänzen
a = 0; f = 0;
}
delay(200);
}
Gehäuse / Custom Parts

Schaltplan

Herstellungsprozess
- Umfassender Leitfaden zur Lasermarkierung: Arten, Vorteile und Anwendungen
- Laserpointer: Design, Fertigung und Sicherheitsübersicht
- Halbleiterlaser: Präzise Lichtgenerierung für moderne Technologie
- Strichcodescanner: Technologie, Design und Zukunftstrends
- Laser-gelenkte Lenkflugkörper: Entwicklung, Fertigung und strategische Bedeutung
- Interaktiven Laser-Projektor mit Zigbee-Sensoren & Gravio Edge Platform bauen
- UART-Kommunikation zwischen Raspberry Pi 4 und HiFive1 Boards herstellen
- Gesten-gesteuerter Roboter mit Raspberry Pi
- DTMF-Decoder mit Arduino bauen – ganz ohne zusätzlichen IC
- 4 Schlüsselvorteile von Low-Code-Lösungen für die industrielle Fertigung