Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Morsecodezendontvanger

Componenten en benodigdheden

Arduino UNO
× 2
LED (generiek)
× 2
Fotoweerstand
× 1
Zoemer
× 1

Over dit project

Ik gaf vandaag een les over communicatiesystemen en wilde dat mijn studenten leerden door te visualiseren en te ervaren. We hebben een paar experimenten gedaan om met het stenen tijdperk te beginnen en de behoefte aan communicatie te begrijpen en wat het betekent met taal en grammatica, wat betrouwbare communicatie is, signalen, berichten, enz.

Terwijl we al deze dingen bespraken, bereikten we een punt waarop we onze eigen taal voor visuele communicatie wilden definiëren, en daar bedachten we morsecode!

Het was duidelijk dat het leren van morsecode voor ieder van ons een vervelende taak zou zijn, en daarom hadden we een machine nodig. Dus hebben we besloten om een ​​klein programma te schrijven dat een bepaalde string kan coderen naar equivalente morsecode en een andere decoder die de string terug kan geven voor een bepaalde morsecodestroom.

Om morsecode voor een personage te vinden, verwees ik naar de volgende tabel -

Om morsecode te vertalen naar een equivalent teken, kan het worden georganiseerd in een binaire boom zoals hieronder. Met elke 'punt' die naar de linker substructuur gaat en 'streepje' naar de rechter substructuur.

Hierdoor kon ik snel een string coderen in de respectievelijke morsecode en vice versa.

Ik heb een programma in C# geschreven als PoC

Uitvoer

Hallo wereld.... . .-.. .-.. ---  .-- --- .-. .-.. -.. 

Omdat er echter communicatie tussen twee partijen moet plaatsvinden, wilde ik deze gecodeerde morsecode naar een ander apparaat verzenden en daar decoderen.

Ik heb twee Arduino-kaarten gebruikt om een ​​zender en een ontvanger te bouwen.

Op de zenderkaart heb ik een laserdiode . aangesloten van Keyes. Makkelijk verkrijgbaar en een goedkoop toestel. Voor de afstand die ik werk, was 3v-invoer meer dan voldoende, maar met 5v kan ik zien dat de laser minstens 200 m bereikt.

Mijn zender is aangesloten op een computer met seriële interface (via USB). Het leest voor alle gegevens op de seriële poort, teken voor teken. Zoek de equivalente morsecode voor het personage en genereer een 'punt' en 'streepje' lichtstroom.

Ik heb een puls van 50 ms gemaakt, waarbij elke 'dot' een lichtstraal van 50 ms is en een 'streepje' een lichtstraal van 150 ms. Elke 'punt' en 'streepje' wordt gescheiden door een stilte van 50 ms. Elk teken wordt gevolgd door nog eens 100 ms stilte.

Zendercode

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,         // spatie, !, ", #, $, %, &, '        NULL, "-. -.--", ".-..-.", NULL, NULL, NULL, NULL, ".----.",         // ( ) * + , - . /         "-.--.", "-.--.-", NUL, ".-.-.", "--..--", "-....-", ".-.-.-", "-.. -.",         // 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 () {  // plaats hier uw setup-code, om één keer uit te voeren: pinMode(13, OUTPUT); Serial.begin(9600);}void loop() { char ch; if(Serial.available()){    ch =Serial.read(); flashDashDot(MorseTabel[ch]); vertraging (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); vertraging (puntLengte); digitalWrite(13, LAAG); delay(dotLength);}void dash(){  digitalWrite(13, HIGH); vertraging (streepjeLengte); digitalWrite(13, LAAG); vertraging (dotLength);}  

Op het Arduino-bord van de ontvanger heb ik een LDR . aangesloten , een piëzo-zoemer en een LED . LED en zoemer zijn overbodig, ze geven alleen audio- en videofeedback en het voelt fijn om te zien dat alles werkt 😉

Mijn ontvanger is ook aangesloten op een computer om het resulterende tekenreeksteken te lezen.

Op het apparaat lees ik in een lus of er licht op de LDR valt die is aangesloten op analoge poort 4. Ik schermde het af van omgevingslicht door het in te kapselen met een lange buis. Wanneer het licht van mijn laserdiode deze LDR raakt, wordt de resulterende waarde hoog en zet ik de luidspreker aan en gaat het lampje branden. Als het uitgaat, zet ik de luidspreker uit en gaat uit.

Ik bereken de lengte van de lichtstraal om te bepalen of het een 'punt' of een 'streepje' was. Alle vertragingen meegerekend, kwam het tot ~400 cycli voor een puls op mijn 16MHz Atmel-processor.

Ontvangercode

// Morse Code Binary Tree//  Linker kind op 2n+1// Rechter kind op 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',                         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'                         };int val =0; // Een variabele om de lichtwaarde van de LDRint op te slaan ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup(){  Serial.begin(9600);// Start een seriële verbinding  Serial .print(codePtr);}void loop(){  val =analogRead(4); if (val>=10)  {    ctrHigh++; ctrLaag =0; digitalWrite(13, HOOG); toon (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, LAAG); geen toon (9); }} 
Uitgang bij ontvanger ....HE-..L.-..L---O.--W---O.-.R.-..L-..D-. -.--! 

Code

  • Zender
  • Ontvanger
ZenderArduino
Zendercode
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, // spatie, !, ", #, $, %, &, ' NULL, "-.- .--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // ( ) * + , - . / "-.--.", " -.--.-", NUL, ".-.-.", "--..--", "-....-", ".-.-.-", "-..- .", // 0 1 2 3 4 5 6 7 "-----", ".----", "..---", "...--", ".... -", ".....", "-....", "--...", // 8 9 :; <=> ? "---..", "---- .", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // @ ABCDEFG ".-- .-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // HIJKLMNO "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // PQRSTUVW ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // XYZ [ \ ] ^ _ "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, "..--.-", // ' abcdefg NULL, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // hijklmn o "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", / / pqrstuvw ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--" , // xyz { | } ~ DEL "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL, };int dotLength =50;int dashLength =dotLength*3;void setup () { // plaats hier je setup-code om een ​​keer uit te voeren:pinMode(13, OUTPUT); Serial.begin(9600);}void loop() { char ch; if(Serial.available()){ ch =Serial.read(); flashDashDot(MorseTabel[ch]); vertraging (dotLength*2); }}void flashDashDot(const char * morseCode){ int i =0; while(morseCode[i] !=0) { if(morseCode[i] =='.'){ dot(); } else if (morseCode[i] =='-'){ dash(); } ik++; }}void dot(){ digitalWrite(13, HIGH); vertraging (puntLengte); digitalWrite(13, LAAG); delay(dotLength);}void dash(){ digitalWrite(13, HIGH); vertraging (streepjeLengte); digitalWrite(13, LAAG); vertraging (dotLength);}
OntvangerArduino
Ontvangercode
// Morsecode Binaire boom// Linker kind op 2n+1// Rechter kind op 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 Variabele om de lichtwaarde van de LDRint op te slaan ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup(){ Serial.begin(9600);// Start een seriële verbinding Serial.print( codePtr); }void loop(){ val =analogRead(4); if (val>=10) { ctrHigh++; ctrLaag =0; digitalWrite(13, HOOG); toon (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; } } ctrHoog =0; digitalWrite(13, LAAG); geen toon (9); }}

Schema's

Morsecode-ontvangercircuit morsereceiver_1JpG6jZ6yv.fzzMorsecodezendercircuit morsetransmitter_sOKvrIbOv3.fzz

Productieproces

  1. Barcodescanner
  2. C++ Opmerkingen
  3. Inzicht in ADC-codefoutenpercentage
  4. Morsecode en dubbele afpersing:de huidige staat van malware
  5. DTMF-decoder met alleen Arduino
  6. Arduino Alarmsysteem:SERENA
  7. Morsecodecommunicatie met lasermodule (beide)
  8. Datamatrixcodes versus QR-codes
  9. CNC G-code introductie
  10. Fanuc G-codelijst
  11. G-codelijst voltooien