Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Morsecode-Transceiver

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 2
LED (generisch)
× 2
Fotowiderstand
× 1
Summer
× 1

Über dieses Projekt

Ich habe heute eine Klasse über Kommunikationssysteme unterrichtet und wollte, dass meine Schüler durch Visualisieren und Erleben lernen. Wir haben ein paar Experimente gemacht, um mit der Steinzeit zu beginnen und das Bedürfnis nach Kommunikation zu verstehen und was es unter Sprache und Grammatik versteht, was zuverlässige Kommunikation, Signale, Botschaften usw. sind.

Während wir all diese Dinge besprachen, kamen wir an einen Punkt, an dem wir unsere eigene Sprache für die visuelle Kommunikation definieren wollten, und dort haben wir Morsecode entwickelt!

Es war offensichtlich, dass das Erlernen von Morsecode für jeden von uns eine mühsame Aufgabe sein würde, und daher brauchten wir eine Maschine. Also haben wir uns entschieden, ein kleines Programm zu schreiben, das eine gegebene Zeichenfolge in äquivalenten Morsecode kodieren kann, und einen anderen Decoder, der die Zeichenfolge für einen gegebenen Morsecode-Stream zurückgeben kann.

Um den Morsecode für ein Zeichen zu finden, habe ich mich auf die folgende Tabelle bezogen –

Um Morsecode in ein äquivalentes Zeichen zu übersetzen, kann er wie unten in einem binären Baum organisiert werden. Jeder „Punkt“ bewegt sich zum linken Unterbaum und jeder „Strich“ bewegt sich zum rechten Unterbaum.

Dadurch konnte ich schnell einen String in den entsprechenden Morsecode codieren und umgekehrt.

Ich habe ein Programm in C# als PoC geschrieben

Ausgabe

Hallo Welt.... . .-.. .-.. ---  .-- --- .-. .-.. -.. 

Da jedoch die Kommunikation zwischen zwei Parteien stattfinden muss, wollte ich diesen verschlüsselten Morsecode an ein anderes Gerät übertragen und dort entschlüsseln.

Ich habe zwei Arduino-Boards verwendet, um einen Sender und einen Empfänger zu bauen.

Auf der Senderplatine habe ich eine Laserdiode angeschlossen von Keyes. Leicht verfügbar und ein günstiges Gerät. Für die Entfernung, die ich arbeite, war die 3 V-Eingabe mehr als ausreichend, aber bei 5 V kann ich sehen, dass der Laser mindestens 200 m erreicht.

Mein Sender ist mit einem Computer mit serieller Schnittstelle (über USB) verbunden. Es liest nach allen Daten am seriellen Port, Zeichen für Zeichen. Finden Sie den entsprechenden Morsecode für das Zeichen und generieren Sie einen „Punkt“- und „Strich“-Lichtstrom.

Ich habe einen 50-ms-Puls erzeugt, wobei jeder "Punkt" ein 50-ms-Lichtstrahl und ein "Strich" ein 150-ms-Lichtstrahl ist. Jeder „Punkt“ und „Strich“ werden durch eine 50-ms-Stille getrennt. Auf jedes Zeichen folgen weitere 100 ms Stille.

Sendercode

const char* MorseTable[] ={        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,        // Leerzeichen, !, ", #, $, %, &, '        NULL, "-. -.--", ".-..-.", NULL, NULL, NULL, NULL, ".----.",        // ( ) * + , - . /        "-.--.", "-.--.-", NULL, ".-.-.", "--..--", "-....-", ".-.-.-", "-.. -.",        // 0 1 2 3 4 5 6 7        "-----", ".----", "..---", "...--", "... .-", ".....", "-....", "--...",        // 8 9 :; <=> ?        "---..", "--- -.", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..",        // @ ABCDEFG        ".- -.-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.",        // HIJKLMNO        "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",        / / PQRSTUVW        ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--" ,        // XYZ [ \ ] ^ _        "-..-", "-.--", "-- ..", NULL, NULL, NULL, NULL, "..--.-",        // ' abcdefg        NULL, ".-", "-...", "-.-.", "-.. ", ".", "..-.", "--.",        // hijklmno        "....", "..", ".---", "-.-", ".- ..", "--", "-.", "---",        // pqrstuvw        ".--.", "--.-", ".-.", "...", " -", "..-", "...-", ".--",        // xyz { | } ~ DEL        "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL,        };int dotLength =50;int dashLength =dotLength*3;void setup () {  // Geben Sie hier Ihren Setup-Code ein, um ihn einmal auszuführen: pinMode(13, OUTPUT); Serial.begin(9600);}void loop() {  char ch; if(Serial.available()){    ch =Serial.read(); flashDashDot(MorseTable[ch]); Verzögerung (dotLength*2); }}void flashDashDot(const char * morseCode){  int i =0; while(morseCode[i] !=0)  {    if(morseCode[i] =='.'){      dot(); } else if (morseCode[i] =='-'){      dash(); }    i++; }}void dot(){  digitalWrite(13, HIGH); Verzögerung (dotLength); digitalWrite(13, LOW); delay(dotLength);}void dash(){  digitalWrite(13, HIGH); Verzögerung (StrichLänge); digitalWrite(13, LOW); delay(dotLength);}  

Auf dem Arduino-Board des Empfängers habe ich einen LDR . angeschlossen , ein Piezo-Summer und eine LED . LED und Summer sind überflüssig, nur dass sie Audio- und Video-Feedback geben und es sich gut anfühlt zu sehen, wie die Dinge funktionieren 😉

Mein Receiver ist auch mit einem Computer verbunden, um die resultierende Zeichenfolge zu lesen.

Auf dem Gerät lese ich in einer Schleife nach, ob Licht auf den LDR trifft, der an Analogport 4 angeschlossen ist. Ich habe ihn vor Umgebungslicht abgeschirmt, indem ich ihn mit einer langen Röhre eingekapselt habe. Wenn Licht von meiner Laserdiode auf diesen LDR trifft, wird der resultierende Wert hoch und ich schalte den Lautsprecher und die LED ein. Wenn es untergeht, schalte ich den Lautsprecher und die LED aus.

Ich berechne die Länge des Lichtstrahls, um festzustellen, ob es ein „Punkt“ oder ein „Strich“ war. Unter Berücksichtigung aller Verzögerungen betrug der Puls auf meinem 16-MHz-Atmel-Prozessor ~400 Zyklen.

Empfängercode

//Morsecode-Binärbaum//  Linkes Kind bei 2n+1// Rechtes Kind bei 2n+2//         <.|->//      .E       -T//    .I  -A   .N - M//const char MorseTree[] ={'\0','E', 'T', 'I', 'A', 'N', 'M', 'S',                          'U', 'R' , 'W', 'D', 'K', 'G', 'O', 'H',                         'V', 'F', 'U', 'L', 'A', 'P', ' J', 'B',                         'X', 'C', 'Y', 'Z', 'Q', '\0','\0','5',                                 '3', '\0','\0','\0','2', '\0',                         '\0','+', '\0','\0','\0 ','\0','1', '6',                         '=', '/', '\0','\0','\0','(', '\0','7' ,                          '\0','\0','\0','8', '\0','9', '0', '\0',                       ' '\'\'\ 0','\0','\0','\0','\0','\0',                         '\0','\0','\0','?', '_' , '\0','\0','\0',                         '\0','"', '\0','\0','.', '\0','\0',' \0',                         '\0','@', '\0','\0','\0','\0','\0','\0',                          '      ' ','\0','\0','\0','\0','\0','\0',           '\0',';', '!', '\0',')', '\0','\0','\0',                          '\0','\0',',' , '\0','\0','\0','\0',':',                         '\0','\0','\0','\0','\0', '\0','\0'                         };int val =0; // Eine Variable zum Speichern des Lichtwerts aus dem LDRint ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup(){  Serial.begin(9600); // Eine serielle Verbindung starten  Serial .print(codePtr);}void loop(){  val =analogRead(4); if (val>=10)  {    ctrHigh++; ctrLow =0; digitalWrite(13, HOCH); Ton (9, 1000); } else {    ctrLow++; if ((ctrHigh>=dotLen) &&(ctrHigh =dotLen * 2) {      Serial.print("-"); codePtr =(2*codePtr) + 2; } else {      if(ctrLow ==dotLen*2){        Serial.print(MorseTree[codePtr]); codePtr =0; }    }    ctrHigh =0; digitalWrite(13, LOW); kein Ton(9); }} 
Ausgang am Empfänger ....HE-..L.-..L---O.--W---O.-.R.-..L-..D-. -.--! 

Code

  • Sender
  • Empfänger
SenderArduino
Sendercode
const char* MorseTable[] ={ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // Leerzeichen, !, ", #, $, %, &, ' NULL, "-.- .--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // ( ) * + , - . / "-.--.", " -.--.-", NULL, ".-.-.", "--..--", "-....-", ".-.-.-", "-..- .", // 0 1 2 3 4 5 6 7 "-----", ".----", "..---", "...--", ".... -", ".....", "-....", "--...", // 8 9 :; <=> ? "---..", "---- .", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // @ ABCDEFG ".-- .-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // HIJKLMNO "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // PQRSTUVW ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // XYZ [ \ ] ^ _ "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, "..--.-", // ' abcdefg NULL, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // hijklmn Ö "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", / / pqrstuvw ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--" , // xyz { | } ~ DEL "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL, };int dotLength =50;int dashLength =dotLength*3;void setup () { // Geben Sie Ihren Setup-Code hier ein, um ihn einmal auszuführen:pinMode (13, OUTPUT); Serial.begin (9600);}void loop () { char ch; if (Serial.available ()) {ch =Serial.read (); flashDashDot(MorseTable[ch]); Verzögerung (dotLength*2); }}void flashDashDot (const char * morseCode) {int i =0; while(morseCode[i] !=0) { if(morseCode[i] =='.'){ dot(); aufrechtzuerhalten. Sonst if (morseCode[i] =='-'){ dash(); } i++; }} Leerer Punkt () { DigitalWrite (13, HIGH); Verzögerung (dotLength); digitalWrite(13, LOW); Verzögerung (dotLength);} Leerer Strich () { DigitalWrite (13, HIGH); Verzögerung (StrichLänge); digitalWrite(13, LOW); delay(dotLength);}
EmpfängerArduino
Empfängercode
//Morsecode-Binärbaum// Linkes Kind bei 2n+1// Rechtes Kind bei 2n+2// <.|->// .E -T// .I -A .N -M //const char MorseTree[] ={'\0','E', 'T', 'I', 'A', 'N', 'M', 'S', 'U', 'R', 'W', 'D', 'K', 'G', 'O', 'H', 'V', 'F', 'U', 'L', 'A', 'P', 'J ', 'B', 'X', 'C', 'Y', 'Z', 'Q', '\0','\0','5', '4', '\0',' 3', '\0','\0','\0','2', '\0', '\0','+', '\0','\0','\0' ,'\0','1', '6', '=', '/', '\0','\0','\0','(', '\0','7', '\0','\0','\0','8', '\0','9', '0', '\0', '\0','\0','\0 ','\0','\0','\0','\0','\0', '\0','\0','\0','?', '_', '\0','\0','\0', '\0','"', '\0','\0','.', '\0','\0','\ 0', '\0','@', '\0','\0','\0','\0','\0','\0', '-', '\0' ,'\0','\0','\0','\0','\0','\0', '\0',';', '!', '\0',' )', '\0','\0','\0', '\0','\0',',', '\0','\0','\0','\0 ',':', '\0','\0','\0','\0','\0','\0','\0' };int val =0; // A Variable zum Speichern des Lichtwerts aus dem LDRint ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup () { Serial.begin (9600); // Eine serielle Verbindung starten Serial.print ( codePtr); } ungültige Schleife () { val =analogRead (4); if (val>=10) {ctrHigh++; ctrLow =0; digitalWrite(13, HOCH); Ton (9, 1000); } sonst {ctrLow++; if ((ctrHigh>=dotLen) &&(ctrHigh =dotLen * 2) {Serial.print ("-"); codePtr =(2*codePtr) + 2; aufrechtzuerhalten. Sonst { if (ctrLow ==dotLen * 2) { Serial.print (MorseTree [codePtr]); codePtr =0; } } ctrHigh =0; digitalWrite(13, LOW); kein Ton(9); }}

Schaltpläne

Morsecode-Empfängerschaltung morsereceiver_1JpG6jZ6yv.fzzMorsecode-Senderschaltung morsetransmitter_sOKvrIbOv3.fzz

Herstellungsprozess

  1. Barcode-Scanner
  2. C++-Kommentare
  3. Verstehen der ADC-Code-Fehlerrate
  4. Morsecode und doppelte Erpressung:Der Stand der Malware heute
  5. DTMF-Decoder, der nur Arduino verwendet
  6. Arduino-Alarmsystem:SERENA
  7. Data-Matrix-Codes vs. QR-Codes
  8. CNC-G-Code-Einführung
  9. Fanuc-G-Codeliste
  10. Vollständige G-Code-Liste