{"id":18041967,"url":"https://github.com/camilstaps/soda-pop-source","last_synced_at":"2026-03-08T06:33:05.577Z","repository":{"id":91511271,"uuid":"86987668","full_name":"camilstaps/SODA-POP-source","owner":"camilstaps","description":"Source of the SODA POP rig","archived":false,"fork":false,"pushed_at":"2022-03-24T20:47:22.000Z","size":1442,"stargazers_count":3,"open_issues_count":7,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-04T23:43:39.577Z","etag":null,"topics":["arduino","electronics","ham-radio","qrp","soda-pop","uno"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/camilstaps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-02T13:22:42.000Z","updated_at":"2024-03-02T05:58:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"09385760-37c8-4e37-ab87-24b2853a6088","html_url":"https://github.com/camilstaps/SODA-POP-source","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/camilstaps/SODA-POP-source","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camilstaps%2FSODA-POP-source","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camilstaps%2FSODA-POP-source/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camilstaps%2FSODA-POP-source/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camilstaps%2FSODA-POP-source/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/camilstaps","download_url":"https://codeload.github.com/camilstaps/SODA-POP-source/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camilstaps%2FSODA-POP-source/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30247374,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T05:41:50.788Z","status":"ssl_error","status_checked_at":"2026-03-08T05:41:39.075Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arduino","electronics","ham-radio","qrp","soda-pop","uno"],"created_at":"2024-10-30T16:22:19.276Z","updated_at":"2026-03-08T06:33:05.529Z","avatar_url":"https://github.com/camilstaps.png","language":"C++","readme":"# SODA POP source\n\nThis repository contains the source for the [SODA POP][sodapop] by [Steve Weber\nKD1JV][KD1JV], a single band QRP CW transceiver on a 3.6\" square board.\n\nThe original code is copyright \u0026copy; [Steven Weber KD1JV][KD1JV], additions\nand changes are copyright \u0026copy; [PA5ET][] and [VK3IL][]. This only goes for\nthe `SODA_POP` directory. Everything is licensed under GPL v3, see the LICENSE\nfile.\n\n---\n\n- [Operation](#operation)\n- [Settings](#settings)\n- [Optional features](#optional-features)\n- [How to flash the firmware](#how-to-flash-the-firmware)\n- [Changelog](#changelog)\n\n---\n\n## Operation\n\nTo a large extent, operation is as described in the manual.\nIt can be described by the state machine below.\nA detailed description is given under the image.\nDashed states and edges are [optional features](#optional-features).\n\n![State machine](README/states.png)\n\n### Startup\nOn startup, the band will be shown (e.g. `bn.20`). After a 1s delay, the rig\nwill turn on.\n\n### Tuning\nUse the rotary encoder to tune. Tuning can be done in steps of 50Hz, 200Hz,\n1kHz and 10kHz. Rotate through these steps by pressing the rotary encoder. For\nall steps except 50Hz, the corresponding digit on the display will blink.\n\nDirect Frequency Entry (DFE) can be used by holding the encoder button for 1s.\nIt is only available when a paddle is connected. The display will read `DFE`.\nKey in the desired frequency. The current digit blinks. Save with the keyer\nswitch or cancel with the RIT switch. When all four digits are entered, the\nnew frequency is saved automatically. Abbreviations can be used for 0 (T) and 9\n(N) and for all numbers when enabled (see under\n[Optional features](#optional-features)).\n\n### RIT\nPressing the RIT button turns RIT on. The display will show the RIT offset.\n\n### Message memory\nPressing the keyer switch allows you to send a message from memory. There are\ntwo messages, use either side of the paddle to send one. Use the RIT switch\nto cancel.\n\nWhen a message is being transmitted, you can still use the RIT switch to cancel\nit. You can also enter beacon mode by pressing the keyer switch. In beacon\nmode, the message is repeated continuously with an adjustable delay in between\n(see `BEACON_INTERVAL` under [Settings](#settings)). During transmission, the\nkeys are only checked *between* the transmitted characters, so you'll have to\nhold the buttons longer than normally.\n\nTo update the memory, hold the keyer switch for 5s. The display will say\n`Entr.`. Enter the message using the paddle. This is not possible with a\nstraight key. The display will flash once after a character space is detected,\nand once again after a word space has been detected. To finish, press the keyer\nswitch again. The message will be played back while the display reads `St.?`\n(from 'store'). After this, store the message with either side of the paddle.\nPressing the RIT switch allows you to key in a message again; pressing the RIT\nswitch once more returns to the default state.\n\nThe maximum message length is 64 by default (can be changed in `settings.h`).\nIf you try to enter more characters, the error routine is enabled (see below).\n\nUsing `OPT_MORE_MEMORIES`, it is possible to use up to 10 messages, that can be\nselected using the rotary encoder. See under\n[Optional features](#optional-features).\n\n### Preferences\nChange the code speed by holding the keyer switch for 2s. The display will read\n`CS.20`, where `20` is the speed in WPM. Use the paddle or the rotary encoder\nto change, and save with the keyer switch.\n\nChange the band by holding the RIT switch for 2s. The display will read\n`bn.20`, where `20` is the band. Save with the keyer switch. This is only\npossible when compiled with `OPT_BAND_SELECT` (see\n[Optional features](#optional-features) below).\n\n### Calibration\nThe calibration routine is explained in the manual. Hold the RIT switch for 5s\nto enter the calibration routine.\n\nThe display will read `corr.`. You can correct the Si5351 by connecting a\nfrequency counter to TP3 and fixing it to 10MHz using the rotary encoder.\n\nMove on with the keyer switch (the display will show the IF frequency). Adjust\nCT3 to peak the signal on TP2. Peak the IF LO frequency using the rotary\nencoder, peaking the signal on TP1 *with a scope*. If you changed this, go back\nto changing CT3 and repeat.\n\nMove on with the keyer switch (the display will read `bn.16`) and set the band\nusing the rotary encoder.\n\nMove on with the keyer switch (the display will read `P. rX`) and peak the\nsignal using CT1 and CT2. The adjustment can be sharp, especially on higher\nfrequency bands.\n\nPressing the keyer switch will return to the default state.\n\n### Errors\nWhen an error is detected, the display will read `Err.` and a alarm will be\nsounded. The only way to recover is to restart the rig.\n\n## Settings\nThere are several compile-time settings in `settings.h`. Change them before\nuploading the code to the chip.\n\n- `WPM_DEFAULT`: the default key speed in WPM (20).\n- `KEY_MIN_SPEED`: the minimum key speed in WPM (5). Lower speeds than 5 may\n  damage the rig, because the on-time for dashes will be rather long.\n- `KEY_MAX_SPEED`: the maximum key speed in WPM (30). Higher speeds than 30 are\n  untested and may present timing issues.\n- `SIDETONE_FREQ`: the frequency of the sidetone in Hz (600).\n- `MEMORY_LENGTH`: the maximum length of messages in memory, including word\n  spaces (64). Higher values than 255 are unsupported.\n- `MEMORY_EEPROM_START`: the start address of the memory in EEPROM (16). Don't\n  change this unless you know what you're doing.\n- `BEACON_INTERVAL`: the number of dot times between two transmissions of a\n  message in beacon mode. A dot time is 1.2s / WPM (e.g. a beacon interval of\n  15 means 1.5s on 10WPM).\n- `TUNING_STEPS`: an array of tuning steps in mHz. These steps are rotated\n  through with the encoder button.\n- `TUNING_STEP_DIGITS`: which digit to blink when in a tuning step. An array of\n  the same length as `TUNING_STEPS`. Values should be taken from `BLINK_NONE`,\n  `BLINK_0`, `_1`, `_2` and `_3` (`0` is the rightmost digit).\n- There are several band plans. Define one of `PLAN_IARU1`, `_IARU2`, `_IARU3`,\n  `_VK`.\n  The exact boundary definitions are in `bands.h`.\n- Change the default operating frequency of a band by defining e.g.\n\n      #define DEFAULT_OP_FREQ_20 1405500000\n\n## Optional features\nThere are several features that can be added to the rig if you want to. This is\ndone by adding and removing `#define` lines to `settings.h`.\n\n- `OPT_HIDE_LEADING_ZEROES`: hide leading zeroes on frequency display.\n- `OPT_BAND_SELECT`: change the band by pressing RIT for 2s.\n- `OPT_AUTO_BAND`: auto-select bands using a PCA9536 PIO (thanks VK3IL).\n- `OPT_ERASE_EEPROM`: erase the EEPROM by holding RIT for 8s.\n- `OPT_STORE_CW_SPEED`: store the CW speed in EEPROM.\n- `OPT_DFE`: direct frequency entry by holding the encoder button for 1s.\n- `OPT_DFE_OBSCURE_ABBREVIATIONS`: adds number abbreviations to DFE according\n  to the table below. Abbreviations for 0 (T) and 9 (N) are always enabled.\n\n  | Letter | Number\n  ---|---\n  | A | 1\n  | U | 2\n  | W | 3\n  | V | 4\n  | S | 5\n  | B | 6\n  | G | 7\n  | D | 8\n- `OPT_DISABLE_DISPLAY`: disables the display when in default state after a\n  preset time (default: 2.5s). The buttons still work and when something\n  happens the display turns on again. The encoder button enables the display\n  without doing anything else. The display will blink for 0.5s approximately\n  every 30s to prevent you from leaving the rig on by accident.\n  This saves about 2.5mA (on 59mA total in RX mode).\n- `OPT_MORE_MEMORIES`: allows for up to ten message memories (0 through 9),\n  that can be selected using the rotary encoder instead of with the paddle.\n  Turning the encoder changes the index, pressing the keyer switch selects that\n  memory.\n\n## How to flash the firmware\n\nBy far the easiest way to reprogram the controller is using an\n[Arduino Uno][uno].\n\nIf you are only planning on flashing new firmware once or twice, just take the\ncontroller from the SODA POP, plug it in the Arduino, flash it, and put it\nback.\n\nIf you are planning on working on the firmware yourself, you will need to flash\nmuch more often. Not only is moving the chip back and forth annoying and\ntime-consuming, it will also break the pins eventually. It is possible to\nprogram the controller using in-circuit serial programming (ICSP). This is very\nsimilar to the [method described on the Arduino wiki][uno-prog].\n\nRemove the Atmega chip from the Arduino and connect these four lines:\n\n| Arduino | SODA POP\n---|---\n| RESET | 1\n| RX (0) | 2\n| TX (1) | 3\n| GND | 8\n\n**Do not connect Vdd**: to program the board, you will connect a USB cable.\nThe Arduino will be powered from the USB port, the SODA POP from its internal\npower supply. Connecting the power lines may cause problems if the voltages\nare not exactly the same.\n\nProgramming the board can now be done using the Arduino IDE.\n\nSome images of the connections:\n\n![SODA POP ICSP connector](README/icsp-connector-sodapop.jpg)\n![Arduino ICSP connector](README/icsp-connector-arduino.jpg)\n\n## Changelog\n\n- 2017-06-05:\n  - Fixed issue where large correction values for the Si5351 were not stored\n\tproperly (issue [#26](/../../issues/26); requires recalibration of the\n\tcorrection value)\n- 2017-05-16:\n  - `OPT_AUTO_BAND` (PR [#22](/../../pull/22) by VK3IL)\n  - Made hiding leading zeroes on frequency display a compile-time option\n\t(`OPT_HIDE_LEADING_ZEROES`; issue [#19](/../../issues/19))\n- 2017-05-12:\n  - VK band plans (PR [#21](/../../pull/21) by VK3IL)\n- 2017-05-04:\n  - Beacon mode (issue [#6](/../../issues/6))\n  - More logical UX for sending and storing memories, using RIT to cancel\n  - More memories can be selected by entering a number with the paddle (issue\n    [#16](/../../issues/16))\n  - `OPT_DFE_OBSCURE_ABBREVIATIONS` is now `OPT_OBSCURE_MORSE_ABBREVIATIONS`\n- 2017-05-02:\n  - Power saving mode: the last dot now blinks when the display is off (issue\n    [#18](/../../issues/18))\n  - The old IF frequency is used in the calibration routine\n  - Added band plans for IARU-1,2,3 (issue [#13](/../../issues/13))\n- 2017-04-23 and -25:\n  - Fix timing issues when building with new versions of the Arduino IDE\n- 2017-04-21:\n  - Added up to 10 message memories (issue [#11](/../../issues/11))\n  - Allow for true QSK (issue [#12](/../../issues/12))\n  - Allow for user-defined default frequencies (issue [#15](/../../issues/15))\n  - Minor fixes\n- 2017-04-13:\n  - Made tuning steps an option in `settings.h`\n- 2017-04-12:\n  - Added `OPT_DISABLE_DISPLAY` (issue [#5](/../../issues/5)) (saves ~2.5mA)\n  - More power saving by entering sleep mode at the end of `loop()` (~6mA)\n  - Added comments to clarify the code\n- 2017-04-11:\n  - Rewrote all code to a state machine\n  - Fixed a bug with entering memory\n  - Minor changes to the display\n  - Made several things settings (see `settings.h`)\n  - Big steps tuning (issue [#3](/../../issues/3))\n  - Direct frequency entry (issue [#2](/../../issues/2))\n  - Store CW speed in EEPROM (issue [#1](/../../issues/1))\n- 2017-04-04:\n  - Added bands up to 10m and enabled run-time band switching\n  - Fixed rotary encoder issues\n\n[KD1JV]: http://kd1jv.qrpradio.com/\n[PA5ET]: https://camilstaps.nl\n[VK3IL]: https://www.vk3il.net/\n[sodapop]: https://groups.yahoo.com/neo/groups/AT_Sprint/files/SODA%20POP/\n[uno]: https://www.arduino.cc/en/Main/ArduinoBoardUno\n[uno-prog]: https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamilstaps%2Fsoda-pop-source","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcamilstaps%2Fsoda-pop-source","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamilstaps%2Fsoda-pop-source/lists"}