Morsen mit AVRTelegraph

Ich fahre im Sommer als Betreuer auf ein Kinderzeltlager mit (Plätze sind übrigens noch frei - falls ihr Kinder im passenden Alter kennt schlagt das doch mal vor; es wird sicher großartig). Das Thema ist “Western” und einer der Gegenstände, an die ein Geek dabei denkt sind Telegrafen und der Morsecode. Wir wollen mit den Kindern selbst kleine Sender und Empfänger bauen. Auch in die Rahmenspielhandlung wurden Telegrafen integriert und es werden aus zwei “benachbarten Städten” gleichzeitig Telegramme ankommen, die von den Zeltgruppen entschlüsselt werden sollen. Das Problem ist jedoch, diese zu generieren. Dass zwei Betreuer gleichzeitig und wiederholt Telegramme senden scheint ziemlich aufwändig und ist außerdem fehleranfällig. Dabei ist das doch eine Aufgabe, für die sich Mikrocontroller geradezu aufdrängen. Daher habe ich eine kleine Bibliothek für 8bit Atmel-Controller geschrieben, die morsen kann.

AVRTelegraph Sie heißt AVRTelegraph und kann einen oder mehrere Telegrafen simulieren. Bis zu 8 Nachrichten lassen sich parallel auf verschiedenen Ausgängen verschicken. Genau dies ist was die Sache etwas komplexer macht. Eine einzige Nachricht senden ginge nach dem Schema “Ausgang anmachen, Zeit warten, Ausgang ausmachen…”. Wenn man das mit mehreren Nachrichten parallel machen will hat man das Problem, dass Symbol-Startzeiten nicht unbedingt aufeinander treffen. Daher braucht man ein Zeit-Quantum, zu dem man alle Ausgänge überprüft und ggf. verändert oder auch nicht. Das Ganze lässt sich aber auch in etwas mehr als 200 Zeilen Code umsetzen. Die Bibliothek ist sicher nicht auf Performance optimiert, dafür aber recht übersichtlich gehalten und gut zu lesen.

Die Benutzung ist denkbar einfach: Strings zum Senden definieren; in Morsecode übersetzen lassen; Funktion zum Morsen aufrufen:

texts[0] = "attack at midnight";
texts[1] = "sos we are sinking";

/* translate texts */
char *morse_texts[2];
for(uint8_t i=0;i<2;i++) {
    morse_texts[i] = create_morse_array(texts[i]);
}

/* send morse code */
morse(morse_texts, 2);

Das Ergebnis aus dem Beispiel sieht dann an den Ausgängen so aus:

Ein Feature der Bibliothek ist außerdem, dass sich die Geschwindigkeit (also die Länge des Zeit-Quantums) sowie die Zeiten der einzelnen Symbole variabel anpassen lassen. Das ist nötig, um sich später an die Verarbeitungsgeschwindigkeit der Kindergehirne anpassen zu können :P. Den Code gibt’s auf Github. Viel Spaß damit!