You write in your computer, sends a message thought USB and Arduino translates it into a Morse code.
Just a Arduino board with a buzzer connected at the digital output 12 (one wire in the ground and the other in the 12).
I tried to make the code as general as possible so you can easily adapt it for anthers ways of transmitting a Morse code. To do that you just need to rewrite a few functions.
+-------------------+ | 3) Interpretation | +-------------------+ | 2) Translation | +-------------------+ +-------------------+ | Computer |<========USB (Serial)=======>| 1) Reading | +-------------------+ +-------------------+
- Reads a character from Serial. Main function loop().
- Translate a ascii char into a Morse code using a reference table. A letter ‘K’ becomes a string word “-.-“. Function say_char().
- Interpret the Morse word as light and sound. Mostly at function say_morse_word(). The Interpretation needs 5 functions to say all Morse words, dot(), dash(), shortgap(), mediumgap() and intragap().
For a more details on Morse code I strongly recommend the English Wikipedia article on it.
int led = 13; // LED connected to digital pin 13 int buzzer = 12; // buzzer connected to digital pin 12 int unit = 50; // duration of a pulse char * morsecode[] = { "-----", // 0 ".----", // 1 "..---", // 2 "...--", // 3 "....-", // 4 ".....", // 5 "-....", // 6 "--...", // 7 "---..", // 8 "----.", // 9 "---...", // : "-.-.-.", // ; "", // < (there's no morse for this simbol) "-...-", // = "", // > (there's no morse for this simbol) "..--..", // ? ".--._.", // @ ".-", // A "-...", // B "-.-.", // C "-..", // D ".", // E "..-.", // F "--.", // G "....", // H "..", // I ".---", // J "-.-", // K ".-..", // L "--", // M "-.", // N "---", // O ".--.", // P "--.-", // Q ".-.", // R "...", // S "-", // T "..-", // U "...-", // V ".--", // W "-..-", // X "-.--", // Y "--.." // Z }; void setup() { pinMode(led, OUTPUT); pinMode(buzzer, OUTPUT); Serial.begin(9600); } void say_morse_word(char * msg){ int index = 0; while(msg[index]!='\0'){ // say a dash if(msg[index]=='-'){ dash(); } // say a dot if(msg[index]=='.'){ dot(); } // gap beetween simbols intragap(); index++; } } // beep void beep(int time){ int i; int t = 100; // period of the wav. bigger means lower pitch. int beepduration = (int)((float)time/t*1800); digitalWrite(led, HIGH); for(i=0;i<beepduration;i++){ digitalWrite(buzzer, HIGH); delayMicroseconds(t); digitalWrite(buzzer, LOW); delayMicroseconds(t); } delay(time); } // silence void silence(int time){ digitalWrite(led, LOW); delay(time); } // general procedure for . void dot() { beep(unit); } // general procedure for - void dash() { beep(unit*3); } // gap between dots and dashes void intragap() { silence(unit); } // gap between letters void shortgap() { silence(3*unit); } // gap be tween words void mediumgap() { silence(7*unit); } void say_char(char letter){ if((letter>='0')&&(letter<='Z')&&(letter!='<')&&(letter!='>')){ Serial.print(morsecode[letter-'0']); Serial.print(' '); say_morse_word(morsecode[letter-'0']); shortgap(); } else { if(letter==' '){ Serial.print(" \\ "); mediumgap(); }else{ Serial.print("X"); } } } void loop(){ if(Serial.available()){ say_char((char)Serial.read()); } } |
Additionally you can put another function to say entire strings, like say_string(“HELLO WORLD”)
void say_string(char * asciimsg){ int index = 0; char charac; charac = asciimsg[index]; while(charac!='\0'){ say_char(morsecode[charac-'0']); Serial.println(morsecode[charac-'0']); charac = asciimsg[++index]; shortgap(); } } |
You can use the Arduino IDE itself or any other program that talks with the serial port USB.