Iambic Keyer Morse-Taste mit ATtiny85

Nachdem ich eine Morsetaste bauen wollte, habe ich mir überlegt, wie ich das am einfachsten anstelle und dazu einfach eine alte Maus genommen. Als Microcontroller wird ein ATtiny85 verwendet und der Akku ist ein normaler Li-Ionen Akku.

Um mögliche Probleme zu vermeiden, habe ich von der Platine der Maus alle Teile abgelötet und anstelle des Sensors den μController angebracht.

Durch drücken der linken Maustaste wird repetitiv der Punkt ausgegeben und bei der Rechten der Strich. Mit der mittleren Maustaste kann man die Geschwindigkeit ändern, allerdings (noch) nicht über das Mausrad. Es gibt hier 8 Modi.

Der ausgegebene Ton ist ein Rechteckssignal, das durch HIGH-/LOW-Schalten des Pins erzeugt wird.

 

const int buttonDit = 4;
const int buttonDah = 3;
const int buttonWPM = 2;
const int beepout =  1;
const int ledPin = 0;
int i=0,j=0,k=1;

int dit = 100;
int dah = 300;

const int hper = 715; //halbe periodendauer des tons in mikrosekunden

void setup() {
  pinMode(beepout, OUTPUT);
  pinMode(buttonDit, INPUT_PULLUP);
  pinMode(buttonDah, INPUT_PULLUP);
  pinMode(buttonWPM, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}

void loop() {
  if (digitalRead(buttonDit) == LOW) {
    ditdah(dit);
  }
  else {
    beep(0);
    digitalWrite(beepout, LOW);
  }
  if (digitalRead(buttonDah) == LOW) {
    ditdah(dah);
  }
  else {
    beep(0);
    digitalWrite(beepout, LOW);
  }
  if (digitalRead(buttonWPM) == LOW && k <= 8) {
      k++;
      wpm(k);
      for(int l=1; l<=k; l++){
        digitalWrite(ledPin, HIGH);
        delay(200);
        digitalWrite(ledPin, LOW);
        delay(200);
      }
      if(k == 8){
        k=0;
    }
  }
}

void ditdah(int a){
  digitalWrite(ledPin, HIGH);
  for(i=0; i<a; i++){
    beep(1);
  }
  digitalWrite(ledPin, LOW);
  delay(dit);
}

void beep(int a){
  if(a==1){
  digitalWrite(beepout, HIGH);
  delayMicroseconds(hper);
  digitalWrite(beepout, LOW);
  delayMicroseconds(hper);
  }
}

void wpm(int a){
 switch(a){
   case 0: dit = 100;
           dah = 300;
           break;
   case 1: dit = 90;
           dah = 270;
           break;
   case 2: dit = 80;
           dah = 240;
           break;
   case 3: dit = 70;
           dah = 210;
           break;
   case 4: dit = 60;
           dah = 180;
           break;
   case 5: dit = 50;
           dah = 150;
           break;
   case 6: dit = 40;
           dah = 120;
           break;
   case 7: dit = 30;
           dah = 90;
           break;
 }
}

cw_keyer Untitled Sketch_Steckplatine