CW Oefenprogramma op Arduino

Alles over morse.
Plaats reactie
Bericht
Auteur
Gebruikersavatar
Dopp
Berichten: 1142
Lid geworden op: 08 mei 2011, 18:03
Roepletters: PA3BNX

CW Oefenprogramma op Arduino

#1 Bericht door Dopp »

Hallo Allemaal

Een morse (her)oefen programmaatje voor op een arduino


Alleen een piezo-buzzer nodig.
met draadjes aan pin 11 van een Arduino(nano,uno of mega)

Heb de code ook als CW-Oefenprogram.txt bijgevoegd omdat .ino
niet mag op dit forum hi.

Dat kun je eenvoudig wijzigen in

CW-Oefenprogram.ino

om te laden in de arduino studio

En nu maar oefenen met luisteren..



Have fun....

Code: Selecteer alles

/*
 ((c))PA3BNX Morse training 
 @21-02-2021
 LIROD programma
 Only A buzzer needed at pin 11
 Plays a-z and 0-9 ? CW
 5 minutes
 To Reset push button on Arduino
 */

const int freq = 750; //Hz
const int w = 18; //WPM  
const bool bMixed = true; //Switch between a=z and 0-9, ?  or a-z

const byte cPinCW=LED_BUILTIN; 
const byte cPinCWtone=11; //Buzzer here. Use only PWM pins!

int di;
int dah;
int space;
int separator;
long maxtime;

int WPM(int wpm)
{
/*PARIS
  .---. .- .-. .. ...
   p             a           r           i          s
  2+4+4+2  +2+  2+4  +2+   2+4+2  +2+   2+2  +2+   2+4 + 6
  50 di times
*/
const int x=50;
//Time of a dot in 'paris' in mSec
return 60000/(wpm * x);
}

void Speed(int s)
{
  di=s;//1 count + 1
  dah=3 * di;// 3 counts + 1 
  space=4 * di;//letter separator  3 counts
  separator=6 * di;//word separator  7 counts
}
 
void Sein(int token)
{
if (token==space)
  {   
   delay(space);
  }
 else if (token==separator)
  {
   delay(separator);
  }  
 else
  {
   //freq= 200 + (analogRead(A0)* 2);
   digitalWrite(cPinCW,HIGH);
   tone(cPinCWtone,freq,token);
   delay(token);
   digitalWrite(cPinCW,LOW);
   delay(di);
  }
 }//End Sein=====================================




void PlayMorse(String aa)
{
byte i;
String m;
Serial.print(aa); 

for (i=0;i<aa.length();i++)
{
   
  //Serial.print( aa.charAt(i));
  char myChar = aa.charAt(i);

  if (myChar == ' ')
  {
   m += '/';
  }
  else
  {
   m += " ";
  }
 
  switch (myChar){
  case 'a':
   m += ".-";
   break;
  case 'b':
   m += "-...";
   break;
  case 'c':
   m += "-.-.";
   break;
  case 'd':
   m += "-..";
   break;
  case 'e':
   m += ".";
   break;
  case 'f':
   m += "..-.";
   break;
  case 'g':
   m += "--.";
   break;
  case 'h':
   m += "....";
   break;
  case 'i':
   m += "..";
   break;
  case 'j':
   m += ".---";
   break;
  case 'k':
   m += "-.-";
   break;
  case 'l':
   m += ".-..";
   break;
  case 'm':
   m += "--";
   break;
  case 'n':
   m += "-.";
   break;
  case 'o':
   m += "---";
   break;
  case 'p':
   m += ".--."; 
   break;
  case 'q':
   m += "--.-";
   break;
  case 'r':
   m += ".-.";
   break;
  case 's':
   m += "...";
   break;
  case 't':
   m += "-";
   break;
  case 'u':
   m += "..-";
   break;
  case 'v':
   m += "...-";
   break;
  case 'w':
   m += ".--";
   break;
  case 'x':
   m += "-..-";
   break;
  case 'y':
    m += "-.--"; 
    break;
  case 'z':
   m += "--..";
   break;
  case '1':
   m += ".----";
   break;
  case '2':
   m += "..---"; 
   break;
  case '3':
   m += "...--";
   break;
  case '4':
   m += "....-"; 
   break;
  case '5':
   m += ".....";
   break;
  case '6':
   m += "-...."; 
   break;
  case '7':
   m += "--...";
   break;
  case '8':
   m += "---..";
   break;
  case '9':
   m += "----."; 
   break;
  case '0':
   m += "-----"; 
   break;
  case '?':
   m+="..--..";
   break;
  case '.':
   m+=".-.-.-";
   break;
  case ',':
   m+=".----.";
   break;
  case '@':
   m+=".--.-.";
   break; 
  case '/':
   m+="-..-.";
   break;
  case '\\':
   m+="-..-.";
   break;
 
  
  default:
   break;
  }
}
  m.replace(" /","/");
  for (i=0;i<m.length();i++)
  {
   switch (m.charAt(i))
   {
   case '.':
    Sein(di);
    break;
   case '-':
    Sein(dah);
    break;
   case ' ':
    Sein(space);
    break;
   case '/':
    Sein(separator);
    break;
   default:
    Sein(separator);
    break; 
   }
 }  
}

void setup() {
  // put your setup code here, to run once:
 
 Serial.begin(9600);

 Serial.println();
 Serial.print(w);
 Serial.print(" wpm ");
 
 if (bMixed==true)
 {
 Serial.println("0-9, ? and a-z >> ");
 }
 else
 {
 Serial.println("a-z >>");
 }

 pinMode(cPinCW,OUTPUT);

 randomSeed(analogRead(0));
 
 Speed(WPM(w));
 maxtime+=millis()+300000;
}

void loop() {
  // put your main code here, to run repeatedly:
    //Bool
    static bool bFlag;
    //Integer
    byte static t;
    byte x;
    byte c;
    char f;
       //String
    String myval;
    
  if (bMixed==false)
   {
    f='a';
   }
    else
   {
    f='0';
   }


   if (millis() < maxtime) 
   {
    myval="";
    
    for (x=0;x<5;x++)
     {
      again:
      c=random(char(f), char('z'));
      if (c > char('9') && c < char('a'))
      {
       if (c !=char('?'))
       {
        goto again;
       }
      }
      myval += char(c);
     }   
    
    myval += ' ';
     
    PlayMorse(myval);
     t++; 
     if (t == 5)
    { 
     Serial.println("");
     t=0;
    }
   }
    else if (bFlag==false)
   {
    Serial.println("<<");
    bFlag=true;
   }
}
Bijlagen
CW OefenProgram.txt
Arduino
CW oefen programma


Alleen een piezo buzzer needed
(4.75 KiB) 42 keer gedownload
73's
PA3BNX
Lodewijk

Mijn Credo!

Zelfbouw:
Minimaal hardware
en maximaal software.

Gebruikersavatar
PA3TON
Berichten: 1702
Lid geworden op: 20 sep 2007, 19:59
Locatie: Oldenzaal
Contacteer:

Re: CW Oefenprogramma op Arduino

#2 Bericht door PA3TON »

draait zo te zien ook op een esp8266 van 1,68 euro een buzzer kost 2,57 euro per 30 :) Toevallig laatst besteld om zenuw-spiralen te maken
een web-interface erbij, kun je met je telefoon zinnen er heen sturen/
Wat niet kan is nog nooit gebeurd

Gebruikersavatar
Dopp
Berichten: 1142
Lid geworden op: 08 mei 2011, 18:03
Roepletters: PA3BNX

Re: CW Oefenprogramma op Arduino

#3 Bericht door Dopp »

Hallo Allemaal

Vanaf nu vervangt mijn arduino experimenteer bordje ook het
CW-oefen toon generatorje (met ingebouwde netvoeding
en speaker bc547 en TAA611) rechtse kastje op de foto
met regelbare-toon-hoogte door
rode potmeter en buzzer op steek bordje.


Arduino was al een:

start rogerbeep 1750Hz,
5TVO,
CW-callgever,
klapmicrofoon
K roger beep generator
tijdbeepjes(30 sec)
glissando generator
lm335 temperatuur meter shack
e.t.c.

allemaal gekoppeld aan de home made tafelmic.

Stukje code aleen van de CW-key met junker seinsleutel hi...



Code Snipped betreffende CW-generator met ISR routine-------------


const byte cPinCW=13;//CW key
const byte cPinCWtone=11; //Only allowed PWM 3,5,6,9,10,11 Piezo Buzzer


pinMode(cPinCW, OUTPUT); //Led pin 13 knippert on key down

const byte cPinCWmanual=2; //Manual key //Uno, Nano, Mini, other 328-based 2, 3
pinMode(cPinCWmanual,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(cPinCWmanual),ISR_CWkey,CHANGE);



void ISR_CWkey()
{
if (digitalRead(cPinCWmanual)==LOW)
{
int freqKey=map(analogRead(A0),0,1023,400,1200);
tone(cPinCWtone,freqKey);
digitalWrite(cPinCW,HIGH);
}
else
{
digitalWrite(cPinCW,LOW);
noTone(cPinCWtone);
}
}


End Code------------



Afbeelding
Bijlagen
CW-Gen2Arduino.JPG
73's
PA3BNX
Lodewijk

Mijn Credo!

Zelfbouw:
Minimaal hardware
en maximaal software.

Gebruikersavatar
Dopp
Berichten: 1142
Lid geworden op: 08 mei 2011, 18:03
Roepletters: PA3BNX

Re: CW Oefenprogramma op Arduino

#4 Bericht door Dopp »

Hallo Allemaal

Nog een CW achtige manier van Seinen ???
Bijlagen
EyesThatTalk.png
73's
PA3BNX
Lodewijk

Mijn Credo!

Zelfbouw:
Minimaal hardware
en maximaal software.

Plaats reactie