[Radio] Hellschreiber with Arduino

This code in C++ produces a radio Hellschreiber output, with characters as input. The characters are (in this code) static, but it is easy to make it dynamic. The code is rough since it has never been implemented but was part of a test, which it passed. See the below screenshot in the output.

I made this Hellschreiber code for the Arduino in my HAB (high altitude ballooning) weatherballoon, but never used it. It could be nice as a tool that chirps like a website URL every few minutes, but i doubt radio enthousiasts still use it.

Hellschreiber is a way of telemetry that goes way back. It is actually a very smart method to parse data, but it needs the human capacity to interpret (read) the data. A high beep is black, low/no beep is white, medium beep is gray. With a good reception eveyrthing is black and white, with worse reception it will get greyish, but our human eyes can still make up some info from the super noisy data, in the same way we could read words that have been striped through.

Read more about Hellschreiber here.

Parts list

  • Radio transmitter [NTX2-433.650 MHZ 10mW]
  • Programming board [Arduino Mega 1280]
  • Operating system with FLDIGI HAB version [link]

Screenshot

Do note (!)
This code is not really finished or optimized at all, it was just a proof of concept. Also, I made the typography (the font) myself as well, so it might not be normalized.

Code

  1. /* RTTY Code
  2.    Copyright (C) 2010 HoHoHo-II
  3.  
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation, either version 3 of the License, or
  7.     (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. char* blank = "0000000";
  18.  
  19. char* T  = "00000100000010011111000000100000010";
  20. char* H  = "01111100111110000100000010000111110";
  21. char* O  = "00111000100010010001001000100011100";
  22. char* I  = "01000100100010011111001000100100010";
  23. char* h0 = "00111000100010010101001000100011100";
  24. char* h1 = "01001000100100011111001111100100000";
  25. char* h2 = "01001000110110011001001011100101110";
  26. char* h3 = "01000100101010010101001111100011100";
  27. char* h4 = "00011100001110011100001111000001000";
  28. char* h5 = "01011100101010010101001110100111010";
  29. char* h6 = "01111100101010010101001010100111010";
  30. char* h7 = "00000100000010011001001110100000110";
  31. char* h8 = "01111100101010010101001010100111110";
  32. char* h9 = "01011100101010010101001010100111110";
  33.  
  34.  
  35.  
  36.  
  37. void setup(){
  38.   pinMode(52, OUTPUT);
  39. }
  40.  
  41. void loop(){
  42.  
  43.  
  44. //hell_txchar(T);
  45. hell_txchar(h0);
  46. hell_txchar(h1);
  47. hell_txchar(h2);
  48. hell_txchar(h3);
  49. hell_txchar(h4);
  50. hell_txchar(h5);
  51. hell_txchar(h6);
  52. hell_txchar(h7);
  53. hell_txchar(h8);
  54. hell_txchar(h9);
  55.  
  56. hell_txchar(blank);
  57.  
  58. hell_txchar(H);
  59. hell_txchar(O);
  60. hell_txchar(blank);
  61. hell_txchar(blank);
  62. hell_txchar(H);
  63. hell_txchar(O);
  64. hell_txchar(blank);
  65. hell_txchar(blank);
  66. hell_txchar(H);
  67. hell_txchar(O);
  68. hell_txchar(blank);
  69. hell_txchar(blank);
  70. hell_txchar(blank);
  71. hell_txchar(blank);
  72. }
  73.  
  74.  
  75.  
  76. void hell_txchar (char* string) {
  77.  
  78.   for (int i = 0; i < strlen(string); i++) {
  79.     hell_txbit(string[i]);
  80.   }
  81.     for (int i = 0; i < 7; i++) {
  82.     hell_txbit(0);
  83.   }
  84.  
  85. }
  86.  
  87.  
  88. // Transmit a bit as a mark or space
  89. void hell_txbit (char chr) {
  90.   if (chr=='1') {
  91.     // High - mark
  92.     digitalWrite(52, LOW);
  93.   }
  94.   else {
  95.     // Low - space
  96.     digitalWrite(52, HIGH);
  97.   }
  98.   // Delay appropriately- handtuned
  99.   //delay(7);
  100.   delayMicroseconds(8080);
  101. }

Tim Zaman

MSc Biorobotics. Specialization in computer vision and deep learning. Works at NVIDIA.

You may also like...