CW-Keyer nach K3NG

Bei Radio Artisan findet sich im WWW ein Projekt das sich: „The K3NG Arduino CW Keyer“ nennt.
Dort hat Anthony Good (K3NG) einen Arduino in einen CW-Keyer verwandelt.

Der Keyer lässt eigentlich kaum Wünsche offen und kann sehr individuell angepasst werden.
Einzig der Program-Flash-Speicher des verwendeten Arduino schränkt die Möglichkeiten etwas ein.

Hier mal nur die Möglichkeiten die via „Command-Mode“ (via Paddel) einzustellen sind! (Serielle Kommando-Zeile oder CW-Keyboard sind aussen vor)

Command Mode (press button0 to enter command mode and press again to exit)
    A  Switch to Iambic A mode
    B  Switch to Iambic B mode
    C  Switch to Single Paddle Mode
    D  Switch to Ultimatic mode (if OPTION_NO_ULTIMATIC not set)

    E  Announce speed
    F  Adjust sidetone frequency
    G  Switch to bug mode
    H  Set weighting and dah to dit ratio to defaults
    I  TX enable / disable
    J  Dah to dit ratio adjust
    K  Toggle Dit and Dah Buffers on and off (Ultimatic Mode) (if OPTION_NO_ULTIMATIC is not set)
    L  Adjust weighting
    M  Change command mode speed
    N  Toggle paddle reverse
    O  Toggle sidetone on / off
    P#(#) Program a memory
    Q  Adjust keying compensation (left paddle = increase, right paddle = decrease)
    R####  Set serial number to ####
    S  Alphabet code practice (FEATURE_ALPHABET_SEND_PRACTICE)
    T  Tune mode
    U  Receive / Send Echo Practice
    V  Toggle potentiometer active / inactive
    W  Change speed
    X  Exit command mode (you can also press the command button (button0) to exit)
    Y#### Change memory repeat delay to #### mS
    Z  Autospace On/Off
    #  Play a memory without transmitting
    =  Enable / disable PTT Line (-...-)
    ?  Status
         1. Speed in WPM
         2. Keyer Mode (A = Iambic A, B = Iambic B, G = Bug, S = Single Paddle, U = Ultimatic)
         3. Weighting
         4. Dah to Dit Ratio


Die Dokumentation des K3NG Keyers ist recht gut, aber leider in English.
Es gibt diverse Kits/Bausätze die auch diese Software nutzen.
z.B. Nanokeyer

Hier wird eine Custom-Version beschrieben, und auch wie diese über das Feature: „WinKeyer“ und das Tool „Winkeydaemon“ mit einem LINUX QSO-Log Programm zusammenarbeitet.

Quellen

Do's and Dont's

Es wird vorgeschlagen den Keyer erst mal auf einem Bread-Board auf zu bauen und sich langsam von Funktion zu Funktion (Hardware und Software) zu hangeln.
Das wurde „geflissentlich“ überlesen und in Ermangelung eines Bread-Boards einfach gleich auf einer Lochraster-Platine losgelegt.
Im Nachhinein hätte man diverse Dinge anders lösen können aber es ist halt eine „Bastelei“.
Es hat sich als aber als extrem hilfreich erwiesen einen keinen Arduino Sketch zum Testen der einzelnen Digitalen und Analogen Ports (Input/Output) des Arduino zu nutzen.
Das hilft auch ungemein später den K3NG Keyer korrekt zu konfigurieren. Denn wenn er falsch Konfiguriert ist (Und das passiert schnell) dann geht im besten Fall irgendwas nicht, im dümmsten Fall geht gar nichts und die Fehlersuche ist nicht wirklich einfach.

Hardware Test Sketch (Das ist nur für einen Test der auf dem Terminal Informationen darstellt und Output-Pin's ansteuert), also kein richtig schöner Code, aber es reicht um zu sehen ob es funktioniert):

/*
  Hardware Test K3NG Keyer to check that all Digital and Analog Ports of the Arduino are working as expected 
  Change it round as needed to match your keyer inputs and outputs
  Note: It is far mor easy to change the Ardiono pins here as to change the wiring on the board...
 */
// Digital
int         led     = 5;       // Pin with LED for CMD-Indication
int         sound   = 7;       // Pin to output Sound
int         key3    = 3;       // Input from Key pin D03 Right dah
int         key4    = 4;       // Input from Key pin D04 Left dit
// Analog
int         ana6    = 6;       // input pin for the potentiometer A6
int         ana7    = 7;       // input pin for the potentiometer A7
//###########################################################################
int         val     = 0;      // Variables used below
int         key     = 0;  
// ######## Code ######## 
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);   
  pinMode(sound, OUTPUT); 
  digitalWrite(led, LOW);
  // Setup control input pins
  pinMode(key3, INPUT_PULLUP);    
   pinMode(key4, INPUT_PULLUP);   
  Serial.begin(9600);             // open the serial port at 9600 bps:
}
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);       // turn the LED on (HIGH is the voltage level)
  digitalWrite(sound, HIGH);     // turn the Sound on (HIGH is the voltage level)
  Serial.print("Analog Value Pin $ana3: ");
  val = analogRead(ana6);       // read the value from the sensor
  Serial.print(val);
  Serial.println();             // prints another carriage return
  Serial.print("Analog Value Pin $ana4: ");
  val = analogRead(ana7);      // read the value from the sensor
  Serial.print(val);
  Serial.println();           // prints another carriage return
  delay(1000);               // wait for a second
  key = digitalRead(key3);
  Serial.print("Digital Value Pin (Dah) - : $key3: ");
  Serial.print(key);
  Serial.println();        // prints another carriage return
  key = digitalRead(key4);
  Serial.print("Digital Value Pin (Dit) . : $key4: ");
  Serial.print(key);
  Serial.println();             // prints another carriage return
  digitalWrite(led, LOW);       // turn the LED off by making the voltage LOW
  digitalWrite(sound, LOW);     // turn the LED off by making the voltage LOW
  delay(1000);                  // wait for a second
}
//#### End ####


Hardware

Das Projekt war zwei Stufig, zuerst wurde ein Fldigi-CW-Interface gebaut, allerdings mit Schotky-Dioden (Idee KK5JY) und einem Opto-Koppler anstatt des Übertragers/Transistors.
Danach wurde der Aufbau um den Keyer mit einem Arduino Nano und 4 CW-Speicher-Plätzen erweitert um auch mit einem Iambic Paddel geben zu können und final hat sich dann ergeben das es das Feature Winkeyer sein muß.

Bilder


Beschaltung

Die Beschaltung des Arduinos hält sich an den Vorschlag des Urprojekts

allerdings mit anderen genutzen Pin's.

Veränderungen

Anders gestaltet wurde:


Custom Config

Den aktuellen K3NG-Master aus Git-Hub als ZIP herunterladen, auspacken und erst mal eine Kopie erstellen.
In der Kopie, nennen wir sie mal DM3KB_K3NG_KEYER sind im Pfad ~/K3NG-CW-Keyer/DM3KB_K3NG_KEYER/k3ng_keyer 3 Files anzupassen:

-rw-rw-r-- 1 k03b169 k03b169   5242 Mär  7 22:04 keyer_pin_settings.h
-rw-rw-r-- 1 k03b169 k03b169  13495 Mär  8 06:10 keyer_settings.h
-rw-rw-r-- 1 k03b169 k03b169  11296 Mär 11 08:38 keyer_features_and_options.h


keyer_pin_settings.h

Das File „keyer_pin_settings.h“ wird mit den durch das Schaltungs-Design festgelegten Pins konfiguriert.
(Die Pins aus dem Hardware-Test-Sketch sind hier die richtigen!!!)
Hier wurde für meinen Custom-Keyer gegnüber dem „default/original“ das folgende angepasst:

#define paddle_left 3
#define paddle_right 4
#define tx_key_line_1 2       // (high = key down/tx on)
#define tx_key_line_2 5 
#define sidetone_line 7         // connect a speaker for sidetone
#define potentiometer A7        // Speed potentiometer (0 to 5 V) Use pot from 1k to 10k
#define analog_buttons_pin A6
#define command_mode_active_led 5

Am Ende dieses Kapitels gibt es ein Archiv mit den kompletten Files die geändert wurden!

keyer_settings.h

Im File „keyer_settings.h“ lassen sich generelle Parameter setzen.
Hier wurde für meinen Custom-Keyer gegnüber dem „default/original“ das folgende angepasst:

#define initial_speed_wpm 15             // "factory default" keyer speed setting
#define initial_command_mode_speed_wpm 15 // "factory default" command mode speed setting 
#define wpm_limit_low 10
#define wpm_limit_high 45
#define analog_buttons_number_of_buttons 5  // includes the command button (command button + 3 memory buttons = 4)

Am Ende dieses Kapitels gibt es ein Archiv mit den kompletten Files die geändert wurden!

keyer_features_and_options.h

Im File „keyer_features_and_options.h“ werden die Parameter gesetzt die über die Funktionen des Keyers entscheiden.
Hier wurde für mein Custom-Keyer das folgende gegnüber dem „default/original“ angepasst:

#define FEATURE_BUTTONS
#define FEATURE_COMMAND_MODE
//#define FEATURE_COMMAND_LINE_INTERFACE  // Command Line Interface functionality
#define FEATURE_MEMORIES             // on the Arduino Due, you must have FEATURE_EEPROM_E24C1024 and E24C1024 EEPROM hardware in order to compile this
#define FEATURE_WINKEY_EMULATION    // disabling Automatic Software Reset is highly recommended (see documentation)
#define FEATURE_POTENTIOMETER         // do not enable unless you have a potentiometer connected, otherwise noise will falsely trigger wpm changes
//#define FEATURE_SERIAL_HELP
//#define OPTION_WINKEY_DISCARD_BYTES_AT_STARTUP     // if ASR is not disabled, you may need this to discard errant serial port bytes at startup
#define OPTION_WINKEY_SEND_WORDSPACE_AT_END_OF_BUFFER
//#define OPTION_WINKEY_2_SUPPORT                      // comment out to revert to Winkey version 1 emulation
//#define OPTION_WINKEY_FREQUENT_STATUS_REPORT         // activate this to make Winkey emulation play better with RUMlog and RUMped
//#define OPTION_CW_KEYBOARD_CAPSLOCK_BEEP


Am Ende dieses Kapitels gibt es ein Archiv mit den kompletten Files die geändert wurden!

Archiv Konfig Files

Compile & Upload

Nach anpassen der Konfiguration kann der k3ng_keyer Arduino-Sketch in der Arduino-IDE geöffnet werden.
Nicht erschrecken es werden alle *.h Files mit geöffnet, das ist aber nicht weiter schlimm.
Nun den „k3ng_keyer“ Sketch Kompilieren und auf den Arduino Nano hoch laden.
Hinweis: Bei „China“ Nachbauten des Nano dabei eventuell den Prozessor auf: „Arduino328P(Old Bootloader)“ stellen oder erst mal überhaupt einen Bootloader via ISP-Schnittstelle brennen!

Fehler

  • Das Poti zur Regelung der CW Gewschwindigkeit war anfangs ohne Funktion, geholfen hat: In den CMD-Modus gehen, und mit „V“ (Ja via Paddel!!) das Speed-Poti „inactive“ und mit einem weiteren „V“ wieder „active“ setzen. (Tipp aus dem Forum)
  • In der ersten Version mit der Option #define OPTION_WINKEY_2_SUPPORT war nach dem ersten Durchgang Senden aus dem Log-Programm Schluss, „Keyer busy“, WINKEY Version 1 funktioniert aber!


Winkey Daemon

Während FLDIGI den Winkeyer wohl auch direkt ansprechen kann nutzen andere Log-Programme unter LINUX oft den „cwdaemon“ via Netzwerk der kann aber einen Winkeyer nicht ansprechen.
Es gibt aber Ersatz, und zwar ein Perl Programm das: Einen Netzwerk-Port (Port: 6789) am Loopback-Interface (127.0.0.1) des Linux-Hosts öffnet und die dort empfangen Packete im „cwdaemon“ Dialekt auf die Serielle Schnittselle (z.B. /dev/ttyUSB0) an der der Winkeyer lauscht in den WinKeyer „Dialekt“ „übersetzt“ und den WinKeyer Version 1 der vom K3NG Keyer abgebildet wird anspricht und darüber das Funk-Gerät tastet.

Tool: Winkeydaemon
Doku: Winkeydaemon Dokumentation

Debug

Im „debug“ Modus gestartet zeigt ein CQ [via F1] vom Log-Program: Xlog(LinuX) den folgenden Output:

$ winkeydaemon -n -d /dev/ttyUSB1
Running stty -F /dev/ttyUSB1 1200 raw clocal cread -crtscts cs8 cstopb -parenb -echo -echoe -echoctl -echok -echonl -echoprt -isig -iexten 

Stat: 0xee
	Brk-in
	Keyer busy
	Tuning



Stat: 0xc0
	Idle
Got $datagram = "\e224\0\177\0\0\320vp\373\303U\0\0\0\0\0\0\0\0\0\0\240\266r\373\303U\0\0p\265r\373\303U\0\0t\266.\21v\177\0\0pt7\373\303U\0\0\0\222\226\306e\b\242\250\240\aA\373\303U\0\0p\@s\373\303U\0\0";
New client:127.0.0.1:44416
setspeed=24
Got $datagram = "CQ DE DM3KB DM3KB TEST\0\0\bC\@\373\303U\0\0\0C\@\373\303U\0\0\0\222\226\306e\b\242\250\0C\@\373\303U\0\0\0\0\0\0\0\0\0\0x\317\316\372\303U\0\0 \301p\373\303U\0\0";
Fifo: CQ DE DM3KB DM3KB TEST
Wrote 1 bytes, Fifo: Q DE DM3KB DM3KB TEST
Wrote 1 bytes, Fifo:  DE DM3KB DM3KB TEST

Stat: 0xc4
	Keyer busy
Wrote 1 bytes, Fifo: DE DM3KB DM3KB TEST
Wrote 1 bytes, Fifo: E DM3KB DM3KB TEST
Wrote 1 bytes, Fifo:  DM3KB DM3KB TEST
Wrote 1 bytes, Fifo: DM3KB DM3KB TEST
Wrote 1 bytes, Fifo: M3KB DM3KB TEST
Wrote 1 bytes, Fifo: 3KB DM3KB TEST
Wrote 1 bytes, Fifo: KB DM3KB TEST
Wrote 1 bytes, Fifo: B DM3KB TEST
Wrote 1 bytes, Fifo:  DM3KB TEST
Wrote 1 bytes, Fifo: DM3KB TEST
Wrote 1 bytes, Fifo: M3KB TEST
Wrote 1 bytes, Fifo: 3KB TEST
Wrote 1 bytes, Fifo: KB TEST
C
Wrote 1 bytes, Fifo: B TEST
Wrote 1 bytes, Fifo:  TEST
Wrote 1 bytes, Fifo: TEST
Wrote 1 bytes, Fifo: EST
Wrote 1 bytes, Fifo: ST
Wrote 1 bytes, Fifo: T
Wrote 1 bytes, Fifo: 

Stat: 0xc5
	Buffer 2/3 full
	Keyer busy
Q
 
D
E
 
D
M
3
K
B
 
D
M

Stat: 0xc4
	Keyer busy
3
K
B
 
T
E
S
T

ENDE

Zurück zu: F11:Arduino:Programme

f11/technik/arduino/programme/arduino-cw-keyer-k3ng.txt · Zuletzt geändert: 2021/08/30 07:28 von dm3kb
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0