Здравствуйте!
Есть мысль, что на arduin можно сделать управление радиостанцией.
Скажем в режиме Маяка или попугая.
Нет ли где то готовых схемок и ПО по данной идеи?
Вид для печати
Здравствуйте!
Есть мысль, что на arduin можно сделать управление радиостанцией.
Скажем в режиме Маяка или попугая.
Нет ли где то готовых схемок и ПО по данной идеи?
Может имеется в виду Аппаратная платформа Arduino | Arduino.ru ?
Про arduin я не слышал.
Для начала надо четко решить что хочешь сделать, а уж потом искать или придумывать "схемки и ПО".
А так разговор пустой.
Так ТС же написал - хочет сделать "маяк или попугая" :s11:
Схем и прошивок более чем навалом. Ищем "радиолюбительский репитер схема". (И где еще можно маяк встретить? :) )
Написать программу маяка - школьная задачка по программированию.
А разве GOOGLE поиск отменили ? beacon radio arduino -
В основе его сообщения все же "управление радиостанцией".
И заметьте, он не писал что хочет сделать ;) просто у него появилась мысль, что это можно сделать.
Мы например делали управление двумя радиостанциями для ОЗЧР, с переключением антенного коммутатора, блокировками, индикацией и т.п.
Т.е. конкретная задача - конкретная реализация.
А чего конкретно хочет ТС "маяк или попугая", хочет ли он это сделать или просто поговорить об этом - хз :)
А вот и словоблуды налетели.
Вы цель поставьте конкретную и вопросов не будет.
"Попугаи" (на сколько знаю) вообще запрещены.
Если радио маяк, то цели/задачи какие?
Такой пойдет?
Управление радиостанцией это что? САТ? Удаленное управление? Включение/выключение по хлопку в ладоши?
Всё есть.
Нужно заставить себя напрячься, понять, что же всё таки хочется и тогда искать/спрашивать.
Так управление радиостанцией или маяк? Наверное, надо сначала понять, что хочется сделать, так как сделать можно всё.
У меня на ардуино реализовано "управление радиостанцией". Пока простенькая версия, которая включает:
- антенный коммутатор с автоматическим переключением антенн по диапазонам и переключением антенн из N1MM;
- контроллер поворотки для спайдера на простом TV Rotator;
- контроллер "поворотки" для Spitfire (по факту переключает направления используя стандартный интерфейс ротатора);
- переключение BPF по диапазонам;
- управление усилителем с подстройкой по диапазонам и передающим антеннам (пока в процессе отладки);
Для маяков в гугле полно информации, для более сложных вещей - надо думать самому.
И еще хороший вопрос - зачем?
А то вдруг мне тоже надо такое, а я и не в курсе
Лёша, создание "маякопопугаев", это возрастное.
Год назад, у меня, был наплыв спрашивающих как это осуществить? Причем, почему именно ко мне обращаются... мне не ведомо.
Разделил бы желание собрать маяк на три стадии.
1. Начинающие. А слышно меня будет если я зайду за забор/гараж/дом/в соседнем микрорайоне? Чисто любопытство.
2. Опытные радиолюбители. Знают как проверить/увеличить дальность связи без извращений. Нет желания делать не нужное.
3. Совсем совсем опытные. Надо поставить себе в QTH маяк. Осчастливить мир. Вдруг, кто то, жаждет и плачет, что не получается QSO провести.
Услышал мой маяк - шанс есть. Лови меня везунчик.
------------------------------------------------------------------------
Сеть маяков/репитеров/WEB SDR/Reverse beacon достаточно развита. Не вижу смысла городить огород.
Потому, нам с тобой, остается ждать третьей стадии.:s10:
P.S.
1 стадия.:s10:
Зачем плодить новые темы, поиск по форуму вроде нормально работает.
http://forum.qrz.ru/search.php?searchid=2114309
И нельзя ли более информативное название темы придумать? Arduin - это вообще что?
Маяк на Arduino это элементарная задача.
Топикстартер, напишите четкий алгоритм что нужно получить на выходе и тогда мы поможем со схемой и скетчем.
Без четкого Т.З. ни кто Вам ни чего не скажет, потому что вариантов масса.
Тогда Вам сюда: http://www.123avr.com/
Из пушки по воробьям. Это как человек про программу ТВ спросил, а вы ему статью про принципы телевидения, с развертками, синхронизацией и т.п.
Встроенных примеров достаточно. С того же Blink можно начать. Поменять режим мигания, вплоть до текста морзянкой. Если поменять номер порта, и подключить к нему транзисторный ключ, то этот ключ сможет управлять рацией абсолютно таким же образом.
Попробовал сделать маячок на досуге ))) При наличии комплектующих и софта заняло минут 10 )))
https://www.youtube.com/watch?v=1gxn0BUOI-M
Уважаемые коллеги, напишите пожалуйста скетч для меги2560, сам.... ну не могу, ни чо не работает.
Надо:
на Serial1 приходит A>B:xyzC
на Serial2 должно уйти xyz
где
A,B,C,> и : - всегда одно и тоже, и на этих же местах,
x,y и z - всегда разные и их количество разное тоже.
Примерно так, но я не тестировал. Если с пол пинка не запустится - пишите на что ругается.Код:/**
*
*/
const int SERIAL_DATA_DELAY = 5;
/**
* Startup events.
*/
void setup() {
init_serial();
}
/**
* Init serial port communication.
*/
void init_serial() {
Serial.begin(9600);
Serial1.begin(9600);
}
/**
* Main loop procedure.
*/
void loop() {
serial_forward();
}
/**
* Read data from serial port 0, parse string and send over serial 1.
*/
void serial_forward() {
String read_data;
String send_data;
int read_data_len;
while (Serial.available() > 0) {
delay(SERIAL_DATA_DELAY);
char c = Serial.read();
read_data += c;
}
do {
read_data_len = read_data.length();
int endIndex = read_data.indexOf("C");
if (read_data.startsWith("A>B:") && endIndex >= 0) {
send_data = read_data.substring(4, endIndex);
read_data.remove(0, endIndex + 1);
}
Serial1.println(send_data);
if (read_data_len == read_data.length()) {
read_data.remove(0, 1);
}
} while (read_data_len != read_data.length());
}
Ok, спасибо, буду пробовать.
Я не спец, пытаюсь... быдлокодить. :)
Написал как то так: (как пример)
String Str="55:12y;3";
char buffer[110];
int s1, s2;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Str.toCharArray(buffer,110);
s1=atoi(strtok(buffer,":"));
s2=atoi(strtok(NULL,";"));
// s3=atoi(strtok(NULL," "));
Serial.print(s1);
Serial.print(" ");
Serial.println(s2);
//Serial.print(" ");
// Serial.println(s3);
delay(5000);
}
и... наверное бы устроило, довел бы до конца, но посылает только цифру, если вставить типа 55:12y3, то всё плохо.
Запускается и работает, но кое что не понятно.
В Serial1.println(send_data); убрал ln, иначе, пока нет данных, непрерывно гонит в порт 0D 0A...
Serial1.print(send_data); выдает ДВОЙНУЮ последовательность xyz
У меня данные приходят из другого порта, и в этом случае Serial1.println(send_data); выдает аж ЧЕТВЕРНУЮ последовательность xyz.
Почему, не пойму. :(
Ниже, то что у меня:
#include <AltSoftSerial.h>
AltSoftSerial altSerial;
/**
*
*/
const int SERIAL_DATA_DELAY = 5;
/**
* Startup events.
*/
void setup() {
init_serial();
}
/**
* Init serial port communication.
*/
void init_serial() {
Serial.begin(9600);
Serial1.begin(9600);
altSerial.begin(9600);
}
/**
* Main loop procedure.
*/
void loop() {
serial_forward();
}
/**
* Read data from serial port 0, parse string and send over serial 1.
*/
void serial_forward() {
String read_data;
String send_data;
int read_data_len;
while (altSerial.available() > 0) {
delay(SERIAL_DATA_DELAY);
char c = altSerial.read();
Serial.print(c);
read_data += c;
}
do {
read_data_len = read_data.length();
int endIndex = read_data.indexOf("C");
if (read_data.startsWith("A>B:") && endIndex >= 0) {
send_data = read_data.substring(4, endIndex);
read_data.remove(0, endIndex + 1);
}
Serial1.print(send_data);
Serial.print(send_data);
if (read_data_len == read_data.length()) {
read_data.remove(0, 1);
}
} while (read_data_len != read_data.length());
}
А зачем вам AltSoftSerial и три сериал порта
Зачем тут Serial.print?Код:void init_serial() {
Serial.begin(9600);
Serial1.begin(9600);
altSerial.begin(9600);
}
И тут вы шлёте в два порта. Вы в портах не запутались :) :)Код:while (altSerial.available() > 0) {
delay(SERIAL_DATA_DELAY);
char c = altSerial.read();
Serial.print(c); // Зачем вам это?
read_data += c;
}
Код:Serial1.print(send_data);
Serial.print(send_data);
Лучше не надо так делать....
Тем более, что вы сами делаете перевод в цифру :)
Ваш код можно дописать, но он не предусматривает,
1. Обработку, если в буфере будет два или три нужных вам стринга
2. Обработку, если в буфере будет "мусор"
Скорее всего Serial.print(c);
или оберните отправку проверкой на наличее данных (хотя дико сомневаюсь, что это там)
Код:if (send_data.length() > 0) {
Serial1.println(send_data);
}
- Почему AltSoftSerial? - так сложилось, раньше писал для UNO, а там нет Serial1 2, 3. Если это принципиально то уберу, заменю на Serial2
- Нужны данные только на железных портах и в этом смысле просто Serial не подходитэ
- Serial.print везде добавил чтобы посмотреть, что идет в этих местах. Когда заработает - конечно уберу.
- С портами пока вроде не запутался.
Нет, именно Serial1Цитата:
Скорее всего Serial.print(c);
Ну, так я вроде это и сделал дописавЦитата:
или оберните отправку проверкой на наличее данных
Serial1.print(send_data);
Serial.print(send_data);
Или нет? Как сделать?
Думаю( может не прав), что вы не видите бесконечное 0D 0A потому что Serial монитор IDE не показывает, а Serial1 - железный и терминал видит.
Но это мне не так страшно, плохо, что идёт дублирование.
...Есть подозрение, что исходная A>B:xyzC на самом деле может на конце иметь 0D 0A или 0D 0A 0D 0A. Проверю.
Ну на самом деле я ничего вообще не вижу, так как написал этот код в слепую и не проверял его. Я об этом написал в самом начале.
Если я не ошибаюсь, Mega имеет 4 UART порта: Serial, Serial1, Serial2, Serial3. Используя AltSoftSerial вы можете сделать ещё на свободных пинах эмуляцию дополнительных портов. Но лучше использовать готовые UART.
Согласно вашему коду, вы слушаете altSerial и побайтно транслируете, то что получаете в Serial.
Потом парсите данные (вырезаете лишнее) и шлёте данные в Serial и Serial1.
Вопрос: какой порт вы мониторите? Если Serial, то там и будет двойной набор данных.
Если бы в конце были бы получены 0D 0A - то парсер их как раз должен был бы вырезать. Скорее всего, это какие-то служебные символы. Их мониторинг (отображение) зависит от настроек COM PORT терминала, которым вы смотрите данные.
P.S. Ещё в терминале может быть включено echo, тогда вы будете тоже видеть двойной набор данных.
Нет, не обернули.
Двойная отправка, на самом деле, мой косяк - там do-while делает ещё один проход после отправки, а send_data не обнуляется. Извините.
Вот так будет правильно:
Код:/**
*
*/
const int SERIAL_DATA_DELAY = 5;
/**
* Startup events.
*/
void setup() {
init_serial();
}
/**
* Init serial port communication.
*/
void init_serial() {
Serial.begin(9600);
Serial1.begin(9600);
}
/**
* Main loop procedure.
*/
void loop() {
serial_forward();
}
/**
* Read data from serial port 0, parse string and send over serial 1.
*/
void serial_forward() {
String read_data;
String send_data;
int read_data_len;
while (Serial.available() > 0) {
delay(SERIAL_DATA_DELAY);
char c = Serial.read();
read_data += c;
}
do {
read_data_len = read_data.length();
int endIndex = read_data.indexOf("C");
if (read_data.startsWith("A>B:") && endIndex >= 0) {
send_data = read_data.substring(4, endIndex);
read_data.remove(0, endIndex + 1);
}
if (send_data.length() > 0) {
Serial1.print(send_data);
send_data = "";
}
if (read_data_len == read_data.length()) {
read_data.remove(0, 1);
}
} while (read_data_len != read_data.length());
}
Ok, спасибо , шас попробую.
И еще. Как обычно :) изменились условия. Действительно реально последовательность оказалась с 0D 0A на конце. И именно это надо также обрезать, а С оставить. То есть на входе (на altSerial) A>B:xyzC.. (где две точки это 0D 0A), а на выход( с Serial1) должно уйти xyzC
Как это прописать... видимо в int endIndex = read_data.indexOf("С"); ?
Простейший вариант да, заменить C на нужную вам последовательность символов окончания. Должно работать, правда не оптимально, так как парсер сделает дополнительно несколько прогонов do-while по количеству символов. Но в вашем случае, это не будет являться проблемой, если, конечно, траффик по com port не сильно большой (десятки сообщений в секунду).
Лучше подправьте ещё одну строчку:
было: read_data.remove(0, endIndex + 1);
надо: read_data.remove(0, endIndex + 4);
Т.е. увеличили длину конечного стринга.