Радиолюбительский Маяк на arduino nano

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

В разработке конструкция простого радиолюбительского маяка на три диапазона, планируется 144/430/1200Mhz/
За основу скетча планировался проект выполненный радиолюбителем из Италии Nicola Salsotto IN3GJH
Так как скетч был сильно раскритикован здешним сообществом с их помощью и попытаюсь реализовать.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Начиналось с этого скетча:
 

Далее:
Вариант 1. (с изменениями от 20.04.2019 - введен режим программирования с консольного порта, вход в режим программирования отправка с консоли "P", далее следуем инструкциям выводимым в консоль, сначала позывной, далее локатор, изменения вступают в силу сразу же, так как функция передачи маяка блокирующая, вход в режим после окончания текущего сеанса
 

Вариант 2

Для варианта 2 можно конечно реализовать и обработку знаков, но код разрастется и экономия в 30 байт в таблице варианта 1 совсем потеряется

negavoid
Offline
Зарегистрирован: 09.07.2016

Деда Витя, это ж не маяк, это ж ключ :)

Вот маяк на 8 МГц:

А вот маяк на 1337 кГц:

Оба полноценные, никакого больше оборудования, кроме ардуины и куска провода к пину, не требуется.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

negavoid пишет:

Деда Витя, это ж не маяк, это ж ключ :)

ай да Клименко! А, что, красивое решение, это по нашему )))

будет Маяк, а ключ у меня тока разводной и пару-тройку трубных (есть номер 4-ре) )))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мда. Похоже скоро китайцы будут говорить, что все что Сделано в России можно сразу на помойку.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Несколько Маяков от UA6HJQ:

1.Простой телеграфный маяк на Arduino

 

2. Телеграфный маяк с автоответчиком

CW-BEACON-R7HJ
 

Config.h
 

DTMF.cpp
 

DTMF.h
 

cw.ino
 

func.ino
 

3.Простой маяк от K6HX (весьма оригинальный математический метод перевода в знаки морзе)
PS для тех, кто дружен с математикой

 

001//
002// Simple Arduino Morse Beacon
003// Written by Mark VandeWettering K6HX
004// Email: <a href="mailto:k6hx@arrl.net">k6hx@arrl.net</a>
005//
006// This code is so trivial that I'm releasing it completely without
007// restrictions.  If you find it useful, it would be nice if you dropped
008// me an email, maybe plugged my blog @ <a href="http://brainwagon.org" title="http://brainwagon.org" rel="nofollow">http://brainwagon.org</a> or included
009// a brief acknowledgement in whatever derivative you create, but that's
010// just a courtesy.  Feel free to do whatever.
011//
012 
013 
014struct t_mtab { char c, pat; } ;
015 
016struct t_mtab morsetab[] = {
017    {'.', 106},
018  {',', 115},
019  {'?', 76},
020  {'/', 41},
021  {'A', 6},
022  {'B', 17},
023  {'C', 21},
024  {'D', 9},
025  {'E', 2},
026  {'F', 20},
027  {'G', 11},
028  {'H', 16},
029  {'I', 4},
030  {'J', 30},
031  {'K', 13},
032  {'L', 18},
033  {'M', 7},
034  {'N', 5},
035  {'O', 15},
036  {'P', 22},
037  {'Q', 27},
038  {'R', 10},
039  {'S', 8},
040  {'T', 3},
041  {'U', 12},
042  {'V', 24},
043  {'W', 14},
044  {'X', 25},
045  {'Y', 29},
046  {'Z', 19},
047  {'1', 62},
048  {'2', 60},
049  {'3', 56},
050  {'4', 48},
051  {'5', 32},
052  {'6', 33},
053  {'7', 35},
054  {'8', 39},
055  {'9', 47},
056  {'0', 63}
057} ;
058 
059#define N_MORSE  (sizeof(morsetab)/sizeof(morsetab[0]))
060 
061#define SPEED  (12)
062#define DOTLEN  (1200/SPEED)
063#define DASHLEN  (3*(1200/SPEED))
064 
065int LEDpin = 13 ;
066 
067void
068dash()
069{
070  digitalWrite(LEDpin, HIGH) ;
071  delay(DASHLEN);
072  digitalWrite(LEDpin, LOW) ;
073  delay(DOTLEN) ;
074}
075 
076void
077dit()
078{
079  digitalWrite(LEDpin, HIGH) ;
080  delay(DOTLEN);
081  digitalWrite(LEDpin, LOW) ;
082  delay(DOTLEN);
083}
084 
085void
086send(char c)
087{
088  int i ;
089  if (c == ' ') {
090    Serial.print(c) ;
091    delay(7*DOTLEN) ;
092    return ;
093  }
094  for (i=0; i<N_MORSE; i++) {
095    if (morsetab[i].c == c) {
096      unsigned char p = morsetab[i].pat ;
097      Serial.print(morsetab[i].c) ;
098 
099      while (p != 1) {
100          if (p & 1)
101            dash() ;
102          else
103            dit() ;
104          p = p / 2 ;
105      }
106      delay(2*DOTLEN) ;
107      return ;
108    }
109  }
110  /* if we drop off the end, then we send a space */
111  Serial.print("?") ;
112}
113 
114void
115sendmsg(char *str)
116{
117  while (*str)
118    send(*str++) ;
119  Serial.println("");
120}
121 
122void setup() {
123  pinMode(LEDpin, OUTPUT) ;
124  Serial.begin(9600) ;
125  Serial.println("Simple Arduino Morse Beacon v0.0") ;
126  Serial.println("Written by Mark VandeWettering <k6hx@arrl.net>") ;
127  Serial.println("Check out my blog @ <a href="http://brainwagon.org" title="http://brainwagon.org"" rel="nofollow">http://brainwagon.org"</a>) ;
128  Serial.println("") ;
129}
130 
131void loop() {
132  sendmsg("K6HX/B CM87") ;
133  delay(3000) ;
134}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

negavoid пишет:

Вот маяк на 8 МГц:

Оба полноценные, никакого больше оборудования, кроме ардуины и куска провода к пину, не требуется.

проверил первый, что на 8 мегагерц, CW  сигнал просто великолепный!!!
Слышен на гармониках, на чётных похуже, на нечетных S9++ )))
Вплоть до 144mHz, на 432 нет даже присутствия
То-есть, можно просто поставить умножители, выделить нужные частоты и получить очень простой маячок ...
 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

во.  плод похмельной ночи, отоматический неблокирующий морзе-маяк с таймерами, очередью и блэкджэком. 

https://youtu.be/5O44eD7DJaA

чо скормишь ему, то и будет передавать.  Ннада?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

во.  плод похмельной ночи, отоматический неблокирующий морзе-маяк с таймерами, очередью и блэкджэком. 

https://youtu.be/5O44eD7DJaA

чо скормишь ему, то и будет передавать.  Ннада?

надо

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ок. код причешу, описание набью и выкладу.  В этой теме, или отдельную создать?  тама код абъемный, аж 179 строк. Я помню, ты говорил, что код больше 200 строк ниасилишь, поэтому старался укласца в рамки. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ок. код причешу, описание набью и выкладу.  В этой теме, или отдельную создать?  тама код абъемный, аж 179 строк. Я помню, ты говорил, что код больше 200 строк ниасилишь, поэтому старался укласца в рамки. 

В этой, я буду тут собирать все коды Маяков, что найду

Green
Offline
Зарегистрирован: 01.10.2015

Вы бы сам принцип работы ещё объяснили... И для чего/кого они нужны. Глядишь, люди и потянуться.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Вы бы сам принцип работы ещё объяснили... И для чего/кого они нужны. Глядишь, люди и потянуться.)


 

Маяк, устройство подключаемое к радиопередатчику, работающему в автономном режиме, используется радиолюбителями при выезде в полевые условия, служит для точного определения азимута на корреспондента.
Частоты маяков перед выедом как правило озвучиваются на соответствующих сайтах. Так как маяк работает автономно, позволяет оценить прохождение радиоволн в конкретное время суток, отметить точные азимуты на корреспондентов, для последующего использования, в частности в соревнованиях.
Очень помогает при работе на высокочастотных диапазонах (5 - 10 Гигагерц и выше), где угол лепестка диаграммы антенны порядка 1-2 градуса.

Постоянно работающие маяки позволяют оценить прохождение радиосигнала на конкретных корреспондентов.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Попробовал маяк Клименко на WAVGAT nano, от внутреннего генератора сигнал просто ужасен, от внешнего кварца, а он на плате 12 мегацерцовый сигнал приемлемый, на атмеге ардуино нано всё же получше, там он кристально чистый.
Хочу попробовать сменить кварц на 28 мгц, тогда маяк будет работать на частоте 14 мегагерц и кратные этой частоте.
Да, уровень сигнала значительно ниже, сказывается питание  камня от 3.3 вольта )))
Скетч здесь, аддоны брал из этой ветки форума

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

У Вас там в Черкесске ещё радиогубители осталися???

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DetSimen пишет:

ок. код причешу, описание набью и выкладу.  

Ан нет, быстро не выкладу.  Там, аказываеца, думать надо.  Крепко думать надо, и даже трезвым, а то хрень с налёту получица. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

-NMi- пишет:

У Вас там в Черкесске ещё радиогубители осталися???

 а то )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em, ты мне, кста, можешь существенно помочь, если набьешь пока недостающее. 

01const TMorze MorzeArray[] PROGMEM = {
02    {'A',0b101},
03    {'B',0b11000},
04    {'C',0b11010},
05    {'D',0b1100},
06    {'E',0b10},
07//  .
08    {'K',0b1101},
09//  .
10    {'S',0b1000},
11//  .
12//  .
13    {'Q',0b11101},
14//  .
15    {'Z',0b11100},
16    {'1',0b101111},
17    {'2',0b100111},
18    {'3',0b100011 },
19 
20    //  .
21    {'9',0b111110},
22    {'0',0b111111},
23//  .
24//  .
25    {'?',0b1001100}
26};

символ и код морзе в бинарном виде (0bxxxx), для кода морзе  правило простое, ведущая единица (мы ее пропустим потом), а потом сам код морзя, 1-тире, 0- точка 

например 'Щ' ('Q') ..--..  = 0b1 001100  - пробелом я отделил ведущую единицу от собственно кода Морзе, в реальном коде пробел ставить не нужно

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

символ и код морзе в бинарном виде (0bxxxx), для кода морзе  правило простое, ведущая единица (мы ее пропустим потом), а потом сам код морзя, 1-тире, 0- точка 

например 'Щ' ('Q') ..--..  = 0b1 001100  - пробелом я отделил ведущую единицу от собственно кода Морзе, в реальном коде пробел ставить не нужно

 

сейчас на работу доеду и набью, точнее в течении часа сделаю

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

дак я не тороплю же, у мня часть есть, отлаживать можно и на этом.  Потом, как сделаешь, подставим, и решение будет полным.  С кириллицей потом чонить придумаем, мошт таблицу перекодировки какую. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
01const TMorze MorzeArray[] PROGMEM = {
02  {'A',0b101},
03  {'B',0b11000},
04  {'C',0b11010},
05  {'D',0b1100},
06  {'E',0b10},
07  {'F',0b10010},
08  {'G',0b1110},
09  {'H',0b10000},
10  {'I',0b100},
11  {'J',0b10111}, 
12  {'K',0b1101},
13  {'L',0b10100},
14  {'M',0b111},
15  {'N',0b110}, 
16  {'O',0b1111},
17  {'P',0b10110},
18  {'Q',0b11101},
19  {'R',0b1010},         
20  {'S',0b1000},
21  {'T',0b11},
22  {'U',0b1001},
23  {'V',0b10001},
24  {'W',0b1011},
25  {'X',0b11001},
26  {'Y',0b11011},
27  {'Z',0b11100},
28  {'1',0b101111},
29  {'2',0b100111},
30  {'3',0b100011},
31  {'4',0b100001},
32  {'5',0b100000},
33  {'6',0b110000},
34  {'7',0b111000},
35  {'8',0b111100}, 
36  {'9',0b111110},
37  {'0',0b111111},
38  {'.',0b1010101},
39  {',',0b1110011}, 
40  {':',0b1111000}, 
41  {'\\',0b1011110},
42  {'-',0b1100001},
43  {'/',0b110010},
44  {'(',0b1101101},
45  {')',0b1101101}, 
46  {'@',0b1011010}, 
47  {'=',0b110001},
48  {'"',0b1010010},
49  {''',0b1011110},                  
50  {'?',0b1001100}
51  {'!',0b1110011}
52  {';',0b1101010}
53 
54};

Если ничего не пропустил )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Спасибо, забрал

Восклецательный знак { '!',0b1110011 } забыл. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Как там с причёсыванием?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Жди. Или вдумчиво и надежно, или быстро.  Хочешь, завтра выложу? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

не думаю, что еслиф ты без маяка жил 50 лет, то не проживёшь еще 3-4 дня. 

Жди. я же кроме писания программ от нечего делать, еще и таки немношко пью.  :) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

не думаю, что еслиф ты без маяка жил 50 лет, то не проживёшь еще 3-4 дня. 

Жди. я же кроме писания программ от нечего делать, еще и таки немношко пью.  :) 

это другое дело ... да маяк в принципе работает, вот тут скетчик от UA6HJQ немного поправил, у него интересная задумка...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Гы. Очень сильно немношко.  :-)

Именно поэтому я не беру заказов. Сегодня я здесь, а завтра в запое, и чем закащик виноват в такой ситуации?  А такак у мня остались еще жалкие фрагменты совести, то мне неудобно подставлять непричастных людей.  Тебе я ничего, сопсно, и не обещал, мне стала интересна задача, сиравно заняца нечем пока, я попробую сделать. Но уж, как смогу. Не получица - не обессудь, голова моя уже как в децтве работать не в состояньи. :-) 

Можешь кидать в мня тапками, я ниабижусь. :-)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Моя задумка готова пока на 60%. 

Я очень сильно сожалею, если вдруг обидел каво. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тебе строку откуда брать?  Из сериала или жоска заданную в тексте?  

Пока сделал чтение из Сериала, что туда напишешь, то и будет по кругу передавать.  Напишешь другое - через 2 секунды будет другое передавать. 

В принципе, в АТМега8 код влазиит, даже, наерна, тиньку приспособить можно будет

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

мне интересен сам твой алгоритм, лучше из сериала, тогда можно клавиатуру притарачить, да я сам всё делаю из интереса )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ок.  Сериал оставлю.  Набираешь в сериале нужный текст.  Отправляешь.  когда прошло 2 секунды с момента приема последнего символа - передаваемая строка заменяется принятой из сериала и сразу начинает передаваца

Алгоритм простой, на таймерах и флагах.  К вечеру выложу на гитхаб.  Наерна. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

  К вечеру выложу на гитхаб.  Наерна. 

Хорошо!

А я тут небольшой тренер (по мотивам R7HJ) за это время насобирал, пока не оптимизировал, компилируется )))
 

И ...при нём
 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

тваюштымать.  ну как не надоест то ватэтовотвсё

291     case '?':
292       dot();dot();dash();dash();dot();dot();break;
293     case '\'':
294       dot();dash();dash();dash();dash();dot();break;
295     case '-':
296       dash();dot();dot();dot();dot();dash();break;
 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Нет. Сегодня вряд ли успею. Жучков много. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Нет. Сегодня вряд ли успею. Жучков много. 

Да не торопись! Я дед только вникать в твой код неделю буду...PS Скидывал там скетч вверху, две ошибки на 50 строк, лохматость уже совсем не та ...ЗЫ и это не синтаксис, можно было сослаться на незнание языка, а логика...)))
 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

здоброй ночей. 

Значить, берешь, лезешь вот сюда. 

https://github.com/DetSimen/MorzeRepeater

скачиваешь оттудова Zip файл 

В Zip файле есть директория DtS, просто скопируй всё ее содержимое к себе в %Arduino%\libraries\DtS. ПОСЛЕ ЭТОГО только запускай IDE и открывай Morze.ino.  Канпилируй, матерись, спрашивай, наливай. 

Для вопросов и обсуждения, воть файл Morze.ino (осторожна!!! Dead-o-code): 

К 10 пину подключи светлодиот/бузер/ключ на полевике/Братскую ГЭС, всё чо хочешь, короче. 

При старте начинает "передавать" фразу по умолчанию.  Чтоб сменить, надо в Сериал отправить всё, что надо передавать.  Через 2 секунды после приема ПОСЛЕДНЕГО символа, принятая фраза начинает передаваца.  После окочания передачи всей фразы - пауза 5 секунд и передача сначала.  Все тайминги настраиваюца в самом начале. Комментарии тоже есть.  Разбирайся. Матерись. Спрашивай. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

код морзе берется из таблицы в прогмем.  Как получается код в бинарном виде: 

Допустим, закодируем знак вопроса ..--.. 

ставим 1, это флаг, что после нее до конца байта будут значащие биты, 0-точка, 1-тире

0b1001100

из этого кода, пропусканием всех нулевых бит от начала байта и флага получаем маску символа 

0b1001100  символ

0b0100000 - его маска, единичка стоит в первом значащем разряде

делаем маске и коду битовый AND, получаем 0 (точка) или не ноль (тире)

передаем этот бит

маску сдвигаем вправо на бит

пока маска не 0, т.е не сдвинулась до конца, передаем очередной бит.

символ 0b1001100

маски   0b0100000

            0b0010000

            0b0001000

             .

            0b0000001

и всё, символ кончился. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

хорошо!
СКОМПИЛИРОВАЛ - ИЗУЧАЮ

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И чо?  скомпилировалось намайна?  

у мня для Уно 

Program size: 6 330 bytes (used 20% of a 32 256 byte maximum) (1,69 secs)
Minimum Memory Usage: 363 bytes (18% of a 2048 byte maximum)
 
светлодиот на 10 пин подключил?  Мигаеть?
 
 
 
Я сегодня где-то в 13-00 по вашему сдрисну внадачу, там мне неудобно будет тыкать в планшет.  Поэтому если чо, спрашивай лучше щас. 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ВСЁ НОРМАЛЬНО! у нас еще рано, хочу зуммер подключить послушать, разбужу тут всех )))

Работает!!!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Перезалил, уклался в 200 строк. Выкинул лишние сучности

теперь карикатура занимает 5272 байта PROGMEM и 280 АЗУ

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ой.  Забыл про саафтара.  Подтверждаю, понужал меня не спать изо всех сил. 

Green
Offline
Зарегистрирован: 01.10.2015

ua6em, а я всё хотел спросить. Вот ваш маяк, подключили вы его к своему ТХ. Как я понимаю, сами при этом работать не можете - ведь маяк за вас работает... Или есть какие то иные правила?

sadman41
Offline
Зарегистрирован: 19.10.2016

Это ж как на рыбалке: приехал, удочки поставил, налил... Ну, иногда можно и дёрнуть, когда закусывать надоело ))

Green
Offline
Зарегистрирован: 01.10.2015

Нет, для своего позывного нужно же иметь разрешение с соответствующей категорией и пр. А так получается что вместо тебя работает робот и возможна ситуация когда твоих экземпляров класса может быть несколько.) С одинаковыми позывными! Что как то странненько.)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

синглтон, аднака, нужен

sadman41
Offline
Зарегистрирован: 19.10.2016

Green пишет:

Нет, для своего позывного нужно же иметь разрешение с соответствующей категорией и пр. А так получается что вместо тебя работает робот и возможна ситуация когда твоих экземпляров класса может быть несколько.) С одинаковыми позывными! Что как то странненько.)

РосЭфирЗапрет поймает роботов и разберётся, как полагается. Около робота же человек сидит обумаженный - следит, стало быть, за бездушной железякой. А этак ведь и обычный алко... партизан в тылу врага может отстучать под чужой фамилией - разницы нет ведь.

 

Green
Offline
Зарегистрирован: 01.10.2015

Не, ну это понятно. Хулиганить может каждый, только всё это ведь не законно. А мы же ж законопослушные граждане.)
Хотя раньше что бы выполнить норматив приходилось идти на обман. ЕМНИП, была категория один передатчик - несколько операторов, а категории несколько передатчиков - несколько опрераторов небыло. Однако, многие работали именно так, потому как конкуренция была большая.) 

sadman41
Offline
Зарегистрирован: 19.10.2016

Законопослушные граждане по десять роботов не пускают в эфир под одним аккаунтом. Пока рука стакан держит - робот стучит. Освободилась рука - батарейку у робота отобрал и сам трели выдаёшь. Так что суть вопроса до сих пор неясна.

Green
Offline
Зарегистрирован: 01.10.2015

Ну вот и я о том же. Можно ли десяток роботов пускать под одним аккаунтом? Та даже одного робота и себя?