Phone-Bluetooth-Arduino… Morse Keyer

This is a Morse keyer that can receive characters from your phone over Bluetooth. It then translates the received text into Morse code and keys the transmitter. It can also process a number of simple commands; for example: change (or just report) the CW speed, stop the ongoing transmission, repeat the last transmission etc. The generic serial terminal app is actually quite adequate for this purpose, so QSOs flow easily even if the operator is not young, i.e. cannot type very quickly on the phone keypad. The Android terminal app cannot produce a proper QSO log, but it can save all the transmissions to a file as they are output, together with timestamps, call signs etc. The device is battery operated and fun to use. It can also work as a normal keyer, with a paddle.


This was an enjoyable weekend experiment. Who knows, it might even have a practical use in portable operations.

The phone uses the generic Serial Bluetooth Terminal (for Android) app.
 
I first paired the phone and the keyer in the Bluetooth options on Android. The password is entered only once. The HC-05 Bluetooth module comes with a factory password of ‘1234’ or maybe ’0000’. (The password and other settings for the HC-05 can be changed with AT commands. There are instructions on the Internet.)
In the terminal app, the device (this keyer) is selected for connection only once. From then on the connection is made with one touch.


The keyer converts letters, numbers, spaces and five basic punctuation marks received from the phone into Morse code. You can use lowercase or uppercase, it doesn’t matter. It can also produce the prosigns SK, AS and AR (received as: asterisk, left parenthesis, right parenthesis, respectively).


The serial terminal app cannot keep a real QSO log, but it can continuously record the content of the communication in a text file from which it is easy to extract times, call signs and other data later.

The basic schematic.
The unit in the photos.
Additionally, a CW sidetone can be enabled on pin 10, for a passive piezo speaker, perhaps during testing or if the keyer is used for practice. Otherwise it is not necessary because there is a sidetone on the radio.
Note: this version of the Pro Mini board has a diode connected in series with the RAW pin. It creates a voltage drop of 0.3 V. Since the Pro Mini here is powered by a 3.7 V (nominal) battery, via its own 3.3 V regulator, and the voltage difference gets pretty small, I replaced the diode with a short.
The battery is attached to the bottom of the case. The PCB stands on 30 mm spacers. The Bluetooth module is on the far left, glued to the side of the board. In the middle is the Arduino Pro Mini, and on the right is the charging and protection module for the battery. While charging, the red LED lights up, and when it’s finished – blue. The dimensions of the case are 100x68x50 mm.

The battery is 2,000 mAh and can be charged with a regular charger for Android phones. The Bluetooth module can be switched off to save energy, for example, when using the paddle.


The image on the left shows how to enable the recording into a text file log. Important: recording stops when you exit the application. Upon returning to the application, if you want to continue recording the log, you must turn on the Data -> Log option again. The name of the file is automatically assigned and contains the date and time.

The following options should also be enabled:
– Auto scroll to end of buffer
– Local echo
– Clear input on send
– Show timestamps
– Keep screen on when connected
(maybe not always)

Some of these options are already on by default, but it’s worth checking. They are set practically only once.

Up to 30 “macros” (message memories) are available. You can save your CQ, typical phrases, greetings etc. Even after exiting the application, the contents of the memories are preserved, as well as the name of the paired Bluetooth module, and the keyer remembers the speed, so it is easy to reconnect after a break and continue working.

For the first test, I saved these messages:
M1: cq cq cq de yu2zz yu2zz ) k
M2: de yu2zz
M3: gd ur 599 5nn qsl? bk
M4: qsl
M5: tnx fair qso cu
M6: 73 * ee
L1: yu2zz

Again, ) is AR, and * is SK.

The contents of individual memories should start with a space, so that words do not stick together if messages are played directly one after the other. The contents of the memories can be changed easily (long tap on the icon), and their displayed names can also be changed, so the operator always sees what is where (see the pictures).

The keyboard itself offers all the usual useful features, such as copy/paste. It is an excellent idea to always type in and copy the other station’s call sign right at the beginning, as it will be needed several times during the QSO.

In addition to passing characters, the Arduino program offers several other functions, such as checking and changing the CW speed. One or more ‘<‘ or ‘>‘ characters can be sent from the phone in sequence. Each of them decreases or increases the speed, respectively, by one standard word per minute. With the ‘%‘ sign, the operator requests only the information about the current speed. The speed can be checked and changed also while the character string is being transmitted over the radio.

If a ‘!‘ is sent from the phone, the transmission currently in progress will stop. The exclamation point must be the first character sent to the keyer after the sequence of characters whose transmission is to be interrupted.

If a string of characters starting with ‘@‘ is sent from the phone, that string of characters will not be sent over the air, but will remain in the saved text file (log), as a note (for example – frequency etc).

If the character ‘~‘ (tilde) is sent from the phone, the last string of characters sent will be repeated. It is practical to put one tilde alone in one of the memories. By the way, the terminal application also has its own History option through which it is possible to return to any previously typed line.

The maximum length of the character string sent from the phone is 50 characters.

Some of the QSOs (parts).

It takes a little time to get used to the new way of making QSOs, but it is not difficult. Younger operators, who are already fast on the phone keyboard, adapt especially quickly. They hardly need messages from the memories.

I cannot type very fast and it took me an hour to start making normal QSOs not only using saved messages, but also adding other operators’ names and custom phrases at around 20 WPM.

Receiving Morse code by ear remains a prerequisite for using this gadget.

Early testing of the program with an Arduino Uno and a Bencher clone.
Connectors: radio keying, paddle, battery charging.


The paddle speed is set independently. Press and hold the green momentary switch, and at the same time press the dot side on the paddle – to increase the speed, or the dash side – to decrease. The entire speed range can be traversed in about 7 seconds. You don’t need a phone for this, but, if it’s already connected, the terminal will (why not) show the newly set paddle speed.


Download YU2ZZ_BT_KEYER_1v0.ino


There is a lot of room for improvement.

2 thoughts on “Phone-Bluetooth-Arduino… Morse Keyer

  1. Pingback: ‘PIC-Keyer’: 2025 Edition | YU2ZZ ····· Elektronika. Radio. Hobi.

  2. Pingback: Antenna (or whatever) Selector SHIELD for Arduino Uno | YU2ZZ ····· Elektronika. Radio. Hobi.

Leave a Reply