{"id":20418896,"url":"https://github.com/sehugg/ft8pi","last_synced_at":"2025-04-12T17:35:27.123Z","repository":{"id":139691943,"uuid":"333290620","full_name":"sehugg/Ft8Pi","owner":"sehugg","description":"FT8 transmitter for Raspberry PI (w/ WSPR shield)","archived":false,"fork":false,"pushed_at":"2021-01-28T01:48:53.000Z","size":264,"stargazers_count":18,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-26T12:01:39.521Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sehugg.png","metadata":{"files":{"readme":"README","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":"2021-01-27T03:22:18.000Z","updated_at":"2024-05-22T09:19:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"e7a62507-e223-49d7-8489-ea0e8408734c","html_url":"https://github.com/sehugg/Ft8Pi","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehugg%2FFt8Pi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehugg%2FFt8Pi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehugg%2FFt8Pi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehugg%2FFt8Pi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sehugg","download_url":"https://codeload.github.com/sehugg/Ft8Pi/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248606060,"owners_count":21132296,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-15T06:35:14.983Z","updated_at":"2025-04-12T17:35:27.115Z","avatar_url":"https://github.com/sehugg.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"Raspberry Pi bareback LF/MF/HF/VHF FT8 transmitter\n\nMakes a very simple FT8 tx from your RasberryPi by connecting GPIO\nport to Antenna (and LPF), operates on LF, MF, HF and VHF bands from\n0 to 250 MHz.\n\nCompatible with the original Raspberry Pi, the Raspberry Pi 2/3, and\nthe Pi Zero.\n\n******\nInstallation / update:\n******\n  Download and compile code:\n    sudo apt-get install git\n    git clone https://github.com/sehugg/Ft8Pi\n    cd Ft8Pi\n    make\n\n  Install to /usr/local/bin:\n    sudo make install\n\n  Uninstall:\n    sudo make uninstall\n\n******\nUsage: (ft8 --help output):\n******\n\n  If running from the console, recent versions of Jessie cause WsprryPi to\n  crash when the console screen blanks. The symptom is that WsppryPi works\n  for several transmissions and then crashes. The fix is to add \"consoleblank=0\"\n  to /boot/cmdline.txt.\n  https://github.com/JamesP6000/WsprryPi/issues/10\n\n  Usage:\n    ft8 [options] freq message\n    ft8 [options] freq -- message\n    ft8 [options] freq \"message\"\n      OR\n    ft8 [options] --test-tone freq\n\n  Options:\n    -h --help\n      Print out this help screen.\n    -p --ppm ppm\n      Known PPM correction to 19.2MHz RPi nominal crystal frequency.\n    -s --self-calibration\n      Check NTP before every transmission to obtain the PPM error of the\n      crystal (default setting!).\n    -f --free-running\n      Do not use NTP to correct frequency error of RPi crystal.\n    -r --repeat\n      Repeatedly, and in order, transmit on all the specified command line\n      freqs.\n    -x --terminate \u003cn\u003e\n      Terminate after n transmissions have been completed.\n    -o --offset\n      Add a random frequency offset to each transmission:\n        +/- 1000 Hz\n    -t --test-tone freq\n      Simply output a test tone at the specified frequency. Only used\n      for debugging and to verify calibration.\n    -n --no-delay\n      Transmit immediately, do not wait for a TX window. Used\n      for testing only.\n\n  Frequencies can be specified either as an absolute TX carrier frequency, or\n  using one of the following strings. If a string is used, the transmission\n  will happen in the middle of the region of the selected band.\n    160m 80m 60m 40m 30m 20m 17m 15m 12m 10m 6m 4m 2m\n\n  Transmission gaps can be created by specifying a TX frequency of 0\n\n******\nRadio licensing / RF:\n******\n  In order to transmit legally, a HAM Radio License is REQUIRED for running\n  this experiment. The output is a square wave so a low pass filter is REQUIRED.\n  Connect a low-pass filter (via decoupling C) to GPIO4 (GPCLK0) and Ground pin\n  of your Raspberry Pi, connect an antenna to the LPF. The GPIO4 and GND pins\n  are found on header P1 pin 7 and 9 respectively, the pin closest to P1 label\n  is pin 1 and its 3rd and 4th neighbour is pin 7 and 9 respectively. See this\n  link for pin layout: http://elinux.org/RPi_Low-level_peripherals\n  \n  Examples of low-pass filters can be found here:\n    http://www.gqrp.com/harmonic_filters.pdf\n  TAPR makes a very nice shield for the Raspberry Pi that is pre-assembled,\n  performs the appropriate filtering for the 20m band, and also increases\n  the power output to 20dBm! Just connect your antenna and you're good-to-go!\n    https://www.tapr.org/kits_20M-wspr-pi.html\n\n  The expected power output is 10mW (+10dBm) in a 50 Ohm load. This looks\n  neglible, but when connected to a simple dipole antenna this may result in\n  reception reports ranging up to several thousands of kilometers.\n\n  As the Raspberry Pi does not attenuate ripple and noise components from the\n  5V USB power supply, it is RECOMMENDED to use a regulated supply that has\n  sufficient ripple supression. Supply ripple might be seen as mixing products\n  products centered around the transmit carrier typically at 100/120Hz.\n\n  DO NOT expose GPIO4 to voltages or currents that are above the specified\n  Absolute Maximum limits. GPIO4 outputs a digital clock in 3V3 logic, with a\n  maximum current of 16mA. As there is no current protection available and a DC\n  component of 1.6V, DO NOT short-circuit or place a resistive (dummy) load\n  straight on the GPIO4 pin, as it may draw too much current. Instead, use a\n  decoupling capacitor to remove DC component when connecting the output dummy\n  loads, transformers, antennas, etc. DO NOT expose GPIO4 to electro- static\n  voltages or voltages exceeding the 0 to 3.3V logic range; connecting an\n  antenna directly to GPIO4 may damage your RPi due to transient voltages such\n  as lightning or static buildup as well as RF from other transmitters\n  operating into nearby antennas. Therefore it is RECOMMENDED to add some form\n  of isolation, e.g. by using a RF transformer, a simple buffer/driver/PA\n  stage, two schottky small signal diodes back to back.\n\n******\nTX Timing:\n******\n  This software is using system time to determine the start of\n  transmissions, so keep the system time synchronised within 1sec precision,\n  i.e. use NTP network time synchronisation or set time manually with date\n  command. A broadcast takes 15 seconds and starts at :00,:15,:30,:45.\n  \n  Reception reports can be viewed on https://pskreporter.info/\n\n******\nCalibration:\n******\n  As of 2017-02, NTP calibration is enabled by default and produces a\n  frequency error of about 0.1 PPM after the Pi has temperature stabilized\n  and the NTP loop has converged.\n\n  Frequency calibration is REQUIRED to ensure that the transmission\n  occurs within the narrow band. The reference crystal on your RPi might\n  have an frequency error (which in addition is temp. dependent -1.3Hz/degC\n  @10MHz). To calibrate, the frequency might be manually corrected on the\n  command line or a PPM correction could be specified on the command line.\n\n  NTP calibration:\n  NTP automatically tracks and calculates a PPM frequency correction. If you\n  are running NTP on your Pi, you can use the --self-calibration option to\n  have this program querry NTP for the latest frequency correction before\n  each transmission. Some residual frequency error may still be present\n  due to delays in the NTP measurement loop and this method works best if your\n  Pi has been on for a long time, the crystal's temperature has stabilized,\n  and the NTP control loop has converged.\n\n  AM calibration:\n  A practical way to calibrate is to tune the transmitter on the same frequency\n  of a medium wave AM broadcast station; keep tuning until zero beat (the\n  constant audio tone disappears when the transmitter is exactly on the same\n  frequency as the broadcast station), and determine the frequency difference\n  with the broadcast station. This is the frequency error that can be applied\n  for correction while tuning on a frequency.\n\n  Suppose your local AM radio station is at 780kHz. Use the --test-tone option\n  to produce different tones around 780kHz (eg 780100 Hz) until you can\n  successfully zero beat the AM station. If the zero beat tone specified on the\n  command line is F, calculate the PPM correction required as:\n  ppm=(F/780000-1)*1e6 In the future, specify this value as the argument to the\n  --ppm option on the comman line. You can verify that the ppm value has been\n  set correction by specifying --test-tone 780000 --ppm \u003cppm\u003e on the command\n  line and confirming that the Pi is still zero beating the AM station.\n\n******\nPWM Peripheral:\n******\n  The code uses the RPi PWM peripheral to time the frequency transitions\n  of the output clock. This peripheral is also used by the RPi sound system\n  and hence any sound events that occur during a transmission will\n  interfere with transmissions. Sound can be permanently disabled\n  by editing /etc/modules and commenting out the snd-bcm2835 device.\n\n******\nExample usage:\n******\n  Brief help screen\n    ./ft8 --help\n\n  Transmit a constant test tone at 780 kHz.\n    sudo ./ft8 --test-tone 780e3\n\n  Call CQ for callsign N9NNN at grid square EM10 on the 20m band with a\n  random frequency offset:\n    sudo ./ft8 -o 20m CQ N9NNN EM10\n\n  Reply to N9NNN with callsign Z3ZZ and signal report: (escape leading \"-\")\n    sudo ./ft8 20m -- N9NNN Z3ZZ -12\n      OR\n    sudo ./ft8 20m \"N9NNN Z3ZZ -12\"\n\n******\nReference documentation:\n******\n  http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf\n  http://www.scribd.com/doc/127599939/BCM2835-Audio-clocks\n  http://www.scribd.com/doc/101830961/GPIO-Pads-Control2\n  https://github.com/mgottschlag/vctools/blob/master/vcdb/cm.yaml\n  https://www.kernel.org/doc/Documentation/vm/pagemap.txt\n\n******\nCredits:\n******\n  This code is based on WsprryPi [4] and adapted to FT8 by\n  KO4KOP using the ft8_lib library [5].\n\n  Credits goes to Oliver Mattos and Oskar Weigl who implemented PiFM [1]\n  based on the idea of exploiting RPi DPLL as FM transmitter.\n\n  Dan MD1CLV combined this effort with WSPR encoding algorithm from F8CHK,\n  resulting in WsprryPi a WSPR beacon for LF and MF bands.\n\n  Guido PE1NNZ \u003cpe1nnz@amsat.org\u003e extended this effort with DMA based PWM\n  modulation of fractional divider that was part of PiFM, allowing to operate\n  the WSPR beacon also on HF and VHF bands.  In addition time-synchronisation\n  and double amount of power output was implemented.\n\n  James Peroulas \u003cjames@peroulas.com\u003e added several command line options, a\n  makefile, improved frequency generation precision so as to be able to\n  precisely generate a tone at a fraction of a Hz, and added a self calibration\n  feature where the code attempts to derrive frequency calibration information\n  from an installed NTP deamon.  Furthermore, the TX length of the WSPR symbols\n  is more precise and does not vary based on system load or PWM clock\n  frequency.\n\n  Michael Tatarinov for adding a patch to get PPM info directly from the\n  kernel.\n\n  Retzler András (HA7ILM) for the massive changes that were required to\n  incorporate the mailbox code so that the RPi2 and RPi3 could be supported.\n\n  [1] PiFM code from\n      http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter\n  [2] Original WSPR Pi transmitter code by Dan:\n      https://github.com/DanAnkers/WsprryPi\n  [3] Fork created by Guido:\n      https://github.com/threeme3/WsprryPi\n  [4] WsprryPi, a WSPR transmitter:\n      https://github.com/JamesP6000/WsprryPi\n  [5] Uses FT8 library code from Kārlis Goba:\n      https://github.com/kgoba/ft8_lib\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsehugg%2Fft8pi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsehugg%2Fft8pi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsehugg%2Fft8pi/lists"}