oe1wkl / morserino-32 Goto Github PK
View Code? Open in Web Editor NEWMorserino-32 multi-functional Morse code machine, based on ESP32
License: GNU General Public License v3.0
Morserino-32 multi-functional Morse code machine, based on ESP32
License: GNU General Public License v3.0
Built a morserino, works great except can't connect to wifi, was told to upgrade to latest software V4.5.2 this was done. config M2 then connect to m2 on computer, enter wifi name and password...M2 resets then I check wifi and evry time it says "No Wifi"
My computer sees "Morserino" and M2 sees my router name, they just won't connect...any suggestions??
Thanks in advance DE John VE3JXX
Would it make sense to allow a user t o focus only on sound and LETTER on the screen when learning new characters instead of showing him dots and dahs?
At least as an option?
Regards (gr8 product)
There are broken links in the readme.md for the Build Instructions.
Steps 2&3 point to invalid links for the Heltech module documentation and driver download. Both result in a 404.
https://heltec-automation-docs.readthedocs.io/en/latest/general/establish_serial_connection.html
https://heltec-automation-docs.readthedocs.io/en/latest/esp32+arduino/quick_start.html
Hi,
whatever TXT file I upload (also the given example files from github) - once I start the File Player it always plays the same: Meta data of a html file. How can I get rid of that effect? I'm on latest SW version and did try out reset already as well.
Thx.
Especially due to the current circumstances it would be nice to have a WiFI TRX mode that works analog to the LoRa TRX.
This would allow distant users to connect their Morserinos directly via WiFi (using a VPN or Router port redirections).
The Morserino could send simple UDP packages using the same package header/format as it currently does for LoRa.
The existing WifFi settings could be used, but extended by a Peer entry for the IP address of the Peer Morserino.
This are my ideas how to begin:
--- ./morse_3_v2.4.ino 2020-04-26 20:44:04.662410857 +0200
+++ ./morse_3_v2.4.ino 2020-04-26 21:10:35.903208571 +0200
@@ -57,6 +57,7 @@
#include <SPI.h> // library for SPI interface
#include <LoRa.h> // library for LoRa transceiver
#include <WiFi.h> // basic WiFi functionality
+#include <WiFiUdp.h> // UDP lib for WiFi TRX
#include <WebServer.h> // simple web sever
#include <ESPmDNS.h> // DNS functionality
#include <WiFiClient.h> //WiFi clinet library
@@ -533,6 +534,7 @@
uint8_t p_menuPtr = 1; // current position of menu
String p_wlanSSID = ""; // SSID for connecting to the Internet
String p_wlanPassword = ""; // password for connecting to WiFi router
+ String p_wlanTRXPeer = ""; // peer Morserino for WiFI TRX
uint32_t p_fileWordPointer = 0; // remember how far we have read the file in player mode / reset when loading new file
uint8_t p_promptPause = 2; // in echoTrainer mode, length of pause before we send next word; multiplied by interWordSpace
uint8_t p_tLeft = 20; // threshold for left paddle
@@ -831,6 +833,8 @@
WebServer server(80); // Create a webserver object that listens for HTTP request on port 80
+WifiUDP udp; // Create a udp socket for wifi trx
+
File fsUploadFile; // a File object to temporarily store the received file
String getContentType(String filename); // convert the file extension to the MIME type
@@ -852,6 +856,7 @@
"<label for='ssid'>SSID of WiFi network?</label>"
"<input name='ssid' id='ssid' ></div> <div>"
"<label for='pw'>WiFi Password?</label> <input name='pw' id='pw'>"
+ "<label for='pw'>WiFi TRX Peer?</label> <input name='trxpeer' id='trxpeer'>"
"</div><div><button>Submit</button></div></form></body></html>";
@@ -5077,10 +5082,12 @@
server.send(200, "text/html", "Wifi Info updated - now restarting Morserino-32...");
p_wlanSSID = server.arg("ssid");
p_wlanPassword = server.arg("pw");
+ p_wlanTRXPeer = server.arg("trxpeer");
//DEBUG("SSID: " + String(p_wlanSSID) + " Password: " + String(p_wlanPassword));
pref.begin("morserino", false); // open the namespace as read/write
pref.putString("wlanSSID", p_wlanSSID);
pref.putString("wlanPassword", p_wlanPassword);
+ pref.putString("wlanTRXPeer", p_wlanTRXPeer);
pref.end();
ESP.restart();
@@ -5539,6 +5546,7 @@
p_wlanSSID = pref.getString("wlanSSID");
p_wlanPassword = pref.getString("wlanPassword");
+ p_wlanTRXPeer = pref.getString("wlanTRXPeer");
p_lcwoKochSeq = pref.getBool("lcwoKochSeq");
p_quickStart = pref.getBool("quickStart");
I was running v4.0 and my external paddle was working fine.
After upgrading to 4.2.1 its now reversed.
I see that there was a bug fix release of 4.0.1 that supposedly fixed this but it seems that it broke mine.
I am using a CWMorse brand double paddle.
Perhaps there could be an option added to the software to let the end user choose the setting?
Thank you for this wonderful kit. Everything works as expected except the red pushbutton switch is defective. Something is wrong with the mechanism or spring. How can I find a suitable replacement?
Today, it's really easy and cheap to setup RF/WiFi sniffer, so it pose real security risk to send the WiFi password over the air in the plaintext. Even it's small window during which the password is sent it's still possible to catch it and compromise the host network. It's not much problem in rural areas, but in the city, especially in the height spot/building there can thousands of people in the radio range.
Could Morserino setup the WPA2 protected AP for the initial WiFi setup? The low security approach is to use hardcoded password like "morserino", high security approach is to generate random password and show it on the display. Or could the password be send over HTTPS? It would lower the risk of automated full-time 24/365 sniffers and possible offline analysis of the captured data - realtime man-in-the-middle attack is unlikely to happen in the small time window. Or could be there an option to set the password through the USB? For security concerned people like me? :)
Problem:
Morserino is restarting unexpectedly and randomly after some characters have been keyed in 'Adaptive Random' mode.
Reproduce:
Select the last koch lesson ":" and start adaptive random mode. Restart should happen within 100 keyed characters.
Please confirm.
Cause:
Unclear. Given that it only happened on my devices with the last koch lesson, i would suspect a out-of-bounds array access. But i did not find it until now.
One time, i received the following on USB-serial-output:
ia3 >ia3 OK
Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception)
Debug exception reason: Stack canary watchpoint triggered (loopTask)
Core 1 register dump:
PC : 0x4010b36d PS : 0x00060336 A0 : 0x800eac01 A1 : 0x3ffb1e20
A2 : 0x3ffb1e50 A3 : 0x3ffd21e0 A4 : 0x00000003 A5 : 0x0000002f
A6 : 0x000000a5 A7 : 0x3ffb1fb0 A8 : 0x00000000 A9 : 0x3ffb1e00
A10 : 0x3ffb0061 A11 : 0x3f402d79 A12 : 0x00000000 A13 : 0x00000003
A14 : 0x3ffb1f0c A15 : 0x0000000a SAR : 0x0000000a EXCCAUSE: 0x00000001
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
Backtrace: 0x4010b36d:0x3ffb1e20 0x400eabfe:0x3ffb1e40 0x400eacb2:0x3ffb1e80 0x400f8a8f:0x3ffb1ec0
0x400fbfb6:0x3ffb1ef0 0x400fc1fb:0x3ffb1f40 0x400fc76f:0x3ffb1f80 0x4010b729:0x3ffb1fb0 0x40089ccd:0x3ffb1fd0
Possible Solution:
I did not find an out-out-bounds-array-access until now. However, reducing heap memory allocations and avoiding string reallocations, especially on the stack, seems to solve the problem.
I created a branch here and committed some enhancements:
https://github.com/DO1GDO/Morserino-32/tree/fix/adapt-rand-memory
@oe1wkl:
Still working on it to improve the behaviour. However, some refactoring is still to be done. Problem does not happen any more with the current commits in the fix-branch, so we could review and test those commits for a merge ... or i could try to do some further refactoring before merging ... let me know your preference please.
I am a bit confused about custom-chars handling ... is it a still active feature or was it removed at some point in the past? (sorry, didn't try all morserino options and features until now ...
I think that a shield that plugs into the Raspberry Pi family should be developed.
It would be nice if there were a togglable feature that let the user try to send the word a few more times after it has been shown.
This does not always happen, but quite often. Seems to happen when sending very long inputs (>8 Dits) and/or several <err>
s, but i am not sure, what the exact trigger is to let this happen.
I have reproduced this in Koch Trainer with lesson 1 (m) activated and using the Echo Trainer.
What i get there as example:
mmm OK
e<err>s<err>mmm ERR
Can provide photos if this helps.
If there are sufficient resources on the hardware for a larger binary, it would be great to increase the dictionary to include 1,000 words. I am willing to create a pull request that extends the english_words.h file and specifies the top 1,000 common words in the English language.
Moserino board revision: 3
Morserino SW version: 4.5.1
Relevant preferences: Koch Sequence: LCWO
Issue description: The current Koch lesson isn't being stored across restarts (HW switch).
Steps to reproduce:
n
m
Expected result: Morserino remember the changed setting, lesson is set to m
.
Actual result: Morserino reverts to the old setting, n
.
Please let me know if I can be of any help with debugging! And as always, many thanks for this great project, Willi and team! 73!
This is an awsome learning device. But could it be expanded also to a memory keyer. Nothing fancy just a couple of memories to store some data like call, cq, qrz and so one to use it on the air...
Would be great to implement this in this device..
73 de Tom HB9DOD
Allow the option of connecting to wifi networks with no password.
Some hotel and cafe wifi networks do not have passwords.
While it's not ideal from a security point of view, it would be useful to have the option of connecting.
The current version of the software, uses an empty password in the wifi config form to mean use the current password.
I suggest adding an option to allow an empty password to be set
I was thinking of adding support for multiple wifi networks
allow setting of up to 3 wifi settings in the config
and allowing choosing of the active config.
This would allow configuring of home network, phone hotspot, and another network, so Morserino-32 could be used at multiple locations easily.
Would you be interested in a PR?
While practicing with the echo trainer with an uploaded practice file, if echo repeats are not "unlimited" the echo trainer comes to a stop after the failed Nth repeat and does not continue unless you exit and start again. This does not occur in the other built in modes.
Setting to reproduce:
Max # of Words = Unlimited
Randomize File = Off
Each Word 2x = Off
Echo Repeats = 0 (or any number other than Unlimited)
To recreate set Echo Repeats to 1 and upload a file with just the letter "a" on one line. Let it fail twice (you have 1 repeat) and it will stop supplying words.
A funny side effect of this is partly what I wanted as a feature:
Track number of failures (or max them out) forcing the user to attempt to try and have a perfect run (or run with no more than N failures).
I am running Version 2.4
Currently the echo trainer will only start with either an iambic key or one of the PCB paddles, and not with the straight key alone. Once I have started either the koch or standard echo trainer with a paddle, it works fine with a straight key. This is with the current firmware m32_v4.1.ino.wifi_lora_32_V2.bin
Cloning into 'Morserino-32'...
remote: Enumerating objects: 1181, done.
remote: Counting objects: 100% (63/63), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 1181 (delta 31), reused 35 (delta 17), pack-reused 1118 eceiving objects: 100% (1181/1181), 112.65 MiB | 22.21 MiB/s
Receiving objects: 100% (1181/1181), 119.31 MiB | 21.79 MiB/s, done.
Resolving deltas: 100% (710/710), done.
error: invalid path 'Software/UDP Chat Server by SP9WPN /README.MD'
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'
In the latest CWA beginner guide (v4.2.7), the sequence has been altered. The sequence should now read:
"teanois14rhdl25ucmw36?fy,pgq79/bv+kj80=xzBK.-ASNE@:"
If sequence 1 or 2 is selected the code should loop infinitly until paddle is pressed.
If keyer type is straight the loop can't be interuppted.
I was playing with chatserver-mopp and identified that when you send a letter that consists only of dah's morserino is sending only one dah, never multiple.
Below some debug of packets (decoded) - I have sent S O S O S O:
13-12-2023, 21:05:56 -010111000010110101011100
['01', '01', '01', '11']
13-12-2023, 21:05:59 -0101110100101110
['10']
13-12-2023, 21:06:00 -010111100010110101011100
['01', '01', '01', '11']
13-12-2023, 21:06:03 -0101111100101110
['10']
13-12-2023, 21:06:04 -011000000010110101011100
['01', '01', '01', '11']
13-12-2023, 21:06:06 -0110000100101110
['10']
This does not work on morserino 5.1 - tested back to 4.3.1 - the problem is stil there.
https://github.com/Morse-Code-over-IP/chatserver-mopp-udp/issues/2
troubleshooting assistance request - after assemblin MORSERINO 32 , genegal shortcut check result 3.2 MOhm. Energising screen for a second message "Morserino-32 43415 ver 2.4 EMPTY" . PLS help. 73
Igor
I've been fooling around the code today, and so far I've gotten the echo trainer to support straight keys without too many apparent problems. I've pushed the changes to my fork. If there is any interest in them, anyone is free to use the changes as they see fit.
The major changes I've made so far:
<err>
s and whatever came before them in the echo trainer response get ignored (I noticed this made me less frightful of making mistakes (wrong amount of dits) when using paddles)What doesn't work:
If there is interest for increased straight key support, I'll gladly iron out the little problems that the fork currently has. Just curious to know if there is need for this.
Version 2.3
Result:
No sound is heard anymore. Device needs to be restarted.
Expected results:
Settings are saved without the device needed to be restarted.
Hello!
I noticed the Morserino-32 in "CW Keyer" mode enumerates as a com port device and outputs the same decoded string (sent by the user) as shown on the display. Would it be possible to make it enumerate as an HID Keyboard instead? I would like to practice typing and sending text messages with CW. Just an idea. Thanks!
I would like to use the Morserino for a course at CWops as a practice tool. However, the speed initially used there is 25WPM with a Farnsworth speed, i.e. an effective speed, of 4WPM. Unfortunately, this cannot be mapped on the Morserino at this time. I would therefore wish that such speeds are also supported. At best by simply entering speed and effective (Farnsworth) speed in the settings.
How about implementing the Morsekob protocol for CW over IP? It would open the world to other clients on Windows, OSX, Linux, Arduino, iOS...
I just built this box yesterday, and it's just what I wanted. I have a couple of suggestions for you:
1- Make the Long Range WiFi an option. I don't see any situation where I would use that and I'm not even sure the 433Mhz band can be used like that in the US. It might save you some money on antennas (mine is in the desk drawer).
2- Make the molex connector for the battery power connection a SIP module mounted to the circuit board. The connector and wire harness are bit hokey. A connector soldered directly to the board that one could connect the battery too would be much better.
All in all, I'm really impressed with this and I think it will help me become a better morse code operator. Thank you.
This is a great code set and product (m32). It is great to see German character support. I speak English, Spanish, German and Dutch. I saw how the characters, numbers, punctuation, and etc. are coded. Can other characters be added to support Spanish and French, etc.?
The CW Academy sequence in the current (5.0.3) Morserino Firmware is different to the sequence stated in the current CW Academy Beginner Curriculum (4.2.3).
No. 40 in Morserino is .
and should be <BK>
No. 41 in Morserino is ,
and should be <SK>
Dear Morserino team
I want to see UPPERCASE.
Is it possible?
Please be check it.
Thank you.
Updated via the web interface, V4.4 successfully installed as guessed by seeing the quick flash of Lora init successful. I then attempted to update via the command line update utility and I get the same problem. Success reported by the utility, flash of the lora init, but no display. When I rotate the knob it makes noise, I can even start one of the trainers by selecting whatever is presented. Any troubleshooting tips, or is this a software bug?
Creating an issue for discussion...
The speaker sound to me is very harsh. I assume this is because it is fed from a PWM square wave and has abrupt starts and stops causing harmonics at the end.
Could this instead be fed from the ESP32's cosine wave generator and use the attenuation options 1/2, 1/4, 1/8 at the ends for optional decay at the start and ends? This would be 8-bit DDS might be enough?
Has this been tried? I'm tempted to give it a go.
Must be cross platform ( Linux, Mac and Windows).
Optional support for winkeyer device.
First the program sends a series of K's in CW for 30 seconds while the character K is displayed. Then it repeats the procedure with the character M. When that is complete it sends a four characters group using K and M in random places without displaying the signs.
It then waits for a four characters input using the keyboard or the morse device, shows the characters you have gotten correct in green, the wrong ones in red. That continues until the user has gotten 90 % correct of a number of groups, then a new letter is introduced ( for example X ), it is sent for 30 seconds while the character is displayed.
Then the lesson continues using the new character until 90% of groups is correct, a new character or prosign is introduced and the lessons continues until all characters are learned.
It may also be possible to display the character K and send the character in morse 5 times and wait for 4~10 around seconds for the answer using the morse key or keyboard.
Options and statistics:
It could also display statistics of a users progress and time used. The slowest permitted speed should be 13 WPM. Any speed below this is wasted time. Some of it may be posted to https://lcwo.net/ if an API is available.
Multiple users in the program, but only one at a time.
It could also be possible to adjust the mininum and maximum number of characters in the groups and if they are of random size. It could support Farnsworth timing, characters are sent at the same speed as at higher speeds, while extra spacing is inserted between characters and words to slow the transmission down.
The advantage of this is that you get used to recognising characters at a higher speed,the characters does not "blend together" as easily and thus it will be easier to increase the speed later on.
Morse alphabets that should be used : Primarly International, but the possibility to add regional extras like the Norwegian Æ Ø and Å. Those extras should be possible to add to the characters learned with a option in settings.
Compatibility with a Murmur client that can connect to a murmur server, that enables chatting in morse code with other users. The client is available at: https://www.mumble.info/ Similar low latency open source free software solutions could also be used.
A existing server already exists: http://internetcw.weebly.com/
Suggestion for a plugin for mumble:
Fading,QRM,QRN and white noise should be possible, as this issue seems to be resolved:
mumble-voip/mumble#3743.
Compatible with Hamsphere: http://hamsphere.com/
There is a API, but the developers of hamsphere may have to be contacted.
Steps
Strange thing is, that when I configure
SSID mobile as first wifi and SSID home as second wifi
after the wifi configuration resets itself, there is only wifi home left (which was the first wifi I ever configured weeks ago).
This behaviour was observed now 3 times in a row. Every week on my cw school day, the configuration is reset.
I do change the snapshots in between and use the serial communication - but I cannot say if this is the culprit!
I just made another test:
Training mode: First the program sends a series of K's in CW for 30 seconds while the character K is displayed. Then it repeats the procedure with the character M.
When that is complete it sends a four characters group using K and M in random places without displaying the signs. It then waits for a four characters input using the morse device, shows the characters you have gotten correct in green, the wrong ones in red.
That continues until the user has gotten 90 % correct of a number of groups, then a new letter is introduced ( for example X ), it is sent for 30 seconds while the character is displayed.
Then the lesson continues using the new character until 90% of groups is correct, a new character or prosign is introduced and the lessons continues until all characters are learned.
Reference link:
https://github.com/Supermagnum/SuperKoch
Hi! I'm trying to get latest release (5.0.3) running on a Heltec Wifi Lora32 v3 board and was able to compile it out of the box with Heltec board definitions 0.0.9 and Heltec Esp32 library 1.1.5.
But after upload, the display will stay blank, no matter if I define BOARDVERSION 3 or 4 in morsedefs.h
Did anyone have success with a Heltec v3 board yet? I do not need all features, just want to use it as a simple CW trainer / keyer. No need for Wifi or Lora.
Hello in documentation we can find an information that TX Power for LoRa is 100mW.
But this is only maximum available power that in reality is not set.
Lora library defaults to 14dBm, while in morserino code I could not find a place where it is overriden.
So in reality the power is 25mW not 100mW.
I was having a QSO via cq.morserino.info and apparently I was disconnected half way through my over. It was mentioned by the other party that I suddenly stopped transmitting even though I was still keying.
I thought I'd try running the chat server on my own computer to see if the problem was local to me. I noticed that after a certain period of time the chat server would stop recognising HI and :BYE.
I've tracked the problem down to the 'mopp' function. Every time this function is called, the serial number is incremented by one. As soon as the serial number hits 64, the 'mopp' function no longer returns the correct encoded version of the text passed to it. This means that, no matter how many times you send HI or :BYE, the server won't recognise them. It also means that, if the client times out, the server sends a garbled mess at a random speed instead of :BYE at 30wpm.
I appeared to fix the problem by resetting the serial number to 1 whenever it reached 64 but I'm not sure whether this is sensible because I don't understand how the serial numbers are used by the morserino. Regardless. I'm not sure whether any of the above accounts for the disconnect that happened to me on cq.morserino.info. I guess it might've just been my WiFi dropping.
On version 3.02 the Koch sequence LCWO can't memorized on snapshoot, after recall a snapshot the Koch sequence go to M32/ JLMC. the code looks correct in Write and readPreferences !
When opening "check wifi", leaving it via red button and then opening the firmware update, only "IP: 0.0.0.0" is shown.
As far as I understand and read the documentation, V4 and V5 kind of want the binary files built from source code using Arduino IDE.
Once the development platform is installed, it asks to open the *.ino file to build the project. V5 source directory doesn't have a *.ino file like this was built using another IDE system and not the Arduino platform.
Also, the V5 bin file doesn't load using the binary load program as it gives an error about the binary file not being of the right type or having the proper signature.
Would like updated documentation that matches uploaded files if possible.
Thanks
If you set the InterChar and InterWord spaces for the CW Academy beginner course (long pauses), the wait time on Echo Trainer is uncomfortably long.
If I see this correctly, this could be due to the variable responsePause
, whose value is 5 by default.
For shorter InterWord spaces this is certainly useful, but in the given case probably a bit too long. Maybe the value should be adjustable via the morserino (or should probably adapt depending on the given interword space).
(Also, the time before the echo trainer starts with the first sequence is a bit long, which might have a different cause.)
I noticed that the maximum length of the cw abbreviations does not correspond to the corresponding setting. For example, I have set „Length abbrev“ to 2 but all of the abbreviations in Koch Trainer - Echo Trainer - CW Abbrev have only the length of 1. But if I set „Length abbrev“ to 3, the echo trainer shows words with the max. length of 2. Is it possible that the corresponding setting is unintentionally exclusive the given number (i.e. < instead of ≤)?
Using firmware v5.0.
(I only skimmed the code, but in the context I noticed that the Arduino random function says: A random number between min and max-1
. ;) )
I noticed the effective Wpm was always 1 less than the Wpm (when using the default of 3 for inter character spacing and 7 for interword spacing). I don't believe this is correct.
The documentation says the "interword space will always be at least 4 dit lengths longer that the character spacing", which makes sense. However, the code in updateTimings() adds 6 to the character spacing:
interWordSpace = _max(p_interWordSpace * ditLength, (p_interCharSpace+6)*ditLength);
This makes the calculation of "effWpm" be 1 less than what I think it should be. I think it should read "+4" not "+6". You can also remove 1 multiplication with:
interWordSpace = _max(p_interWordSpace, p_interCharSpace+4) * ditLength;
Hope that all makes sense.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.