PDA

Просмотр полной версии : Arduino



R2DIC
25.04.2017, 18:35
Здравствуйте!

Есть мысль, что на arduin можно сделать управление радиостанцией.
Скажем в режиме Маяка или попугая.

Нет ли где то готовых схемок и ПО по данной идеи?

RV3MI
25.04.2017, 20:44
Может имеется в виду Аппаратная платформа Arduino | Arduino.ru (http://arduino.ru) ?
Про arduin я не слышал.

Для начала надо четко решить что хочешь сделать, а уж потом искать или придумывать "схемки и ПО".
А так разговор пустой.

R2DO
25.04.2017, 20:48
Так ТС же написал - хочет сделать "маяк или попугая" :s11:

R9AAA
25.04.2017, 21:17
Схем и прошивок более чем навалом. Ищем "радиолюбительский репитер схема". (И где еще можно маяк встретить? :) )
Написать программу маяка - школьная задачка по программированию.

UD4FD
25.04.2017, 21:19
А разве GOOGLE поиск отменили ? beacon radio arduino - (http://www.google.ru/search?sclient=tablet-gws&num=20&newwindow=1&site=&source=hp&q=beacon+radio+arduino&oq=beacon+radio+arduino&gs_l=tablet-gws.3..0i22i30k1.81535.95413.0.97041.20.19.0.1.1.0.277.3793.0j11j8.19. 0....0...1c.1.64.tablet-gws..0.20.3786...0j0i131k1j0i19k1j0i22i30i19k1j0i22i10i30k1j0i8i13i30k 1.LiJXip9yXi8)

RV3MI
26.04.2017, 12:03
Так ТС же написал - хочет сделать "маяк или попугая"

В основе его сообщения все же "управление радиостанцией".
И заметьте, он не писал что хочет сделать ;) просто у него появилась мысль, что это можно сделать.
Мы например делали управление двумя радиостанциями для ОЗЧР, с переключением антенного коммутатора, блокировками, индикацией и т.п.
Т.е. конкретная задача - конкретная реализация.

А чего конкретно хочет ТС "маяк или попугая", хочет ли он это сделать или просто поговорить об этом - хз :)

R2DIC
26.04.2017, 12:34
А вот и словоблуды налетели.

RV3MP
26.04.2017, 12:52
А вот и словоблуды налетели.
Вы цель поставьте конкретную и вопросов не будет.
"Попугаи" (на сколько знаю) вообще запрещены.
Если радио маяк, то цели/задачи какие?
Такой пойдет? (http://forklg.ru/viewtopic.php?f=98&t=1147)
Управление радиостанцией это что? САТ? Удаленное управление? Включение/выключение по хлопку в ладоши?

Нет ли где то готовых схемок и ПО по данной идеи?
Всё есть.
Нужно заставить себя напрячься, понять, что же всё таки хочется и тогда искать/спрашивать.

YL2QN
26.04.2017, 12:55
Есть мысль, что на arduin можно сделать управление радиостанцией.
Скажем в режиме Маяка или попугая.
Так управление радиостанцией или маяк? Наверное, надо сначала понять, что хочется сделать, так как сделать можно всё.

У меня на ардуино реализовано "управление радиостанцией". Пока простенькая версия, которая включает:
- антенный коммутатор с автоматическим переключением антенн по диапазонам и переключением антенн из N1MM;
- контроллер поворотки для спайдера на простом TV Rotator;
- контроллер "поворотки" для Spitfire (по факту переключает направления используя стандартный интерфейс ротатора);
- переключение BPF по диапазонам;
- управление усилителем с подстройкой по диапазонам и передающим антеннам (пока в процессе отладки);

Для маяков в гугле полно информации, для более сложных вещей - надо думать самому.

R2DIC
26.04.2017, 13:29
Вы цель поставьте конкретную и вопросов не будет.
"Попугаи" (на сколько знаю) вообще запрещены.
Если радио маяк, то цели/задачи какие?
Такой пойдет? (http://forklg.ru/viewtopic.php?f=98&t=1147)
Управление радиостанцией это что? САТ? Удаленное управление? Включение/выключение по хлопку в ладоши?

Всё есть.
Нужно заставить себя напрячься, понять, что же всё таки хочется и тогда искать/спрашивать.

Думалось, что вдруг ардуин умеет рацию переводить в режим передачи и в микрофон тон давать.

RV3MP
26.04.2017, 14:23
Думалось, что вдруг ардуин умеет рацию переводить в режим передачи и в микрофон тон давать.
Рацию... да на передачу... Эка задачка...
Ничего не мешает сделать любой генератор звуковой с необходимыми посылками, в трансивере включить VOX и всё...
Забыл спросить... а какую рацию нужно на передачу приручить?

RL5D
26.04.2017, 17:07
Думалось, что вдруг ардуин умеет рацию переводить в режим передачи и в микрофон тон давать.

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

RV3MI
26.04.2017, 17:20
И еще хороший вопрос - зачем?
А то вдруг мне тоже надо такое, а я и не в курсе

R2DIC
26.04.2017, 18:11
Рацию... да на передачу... Эка задачка...
Ничего не мешает сделать любой генератор звуковой с необходимыми посылками, в трансивере включить VOX и всё...
Забыл спросить... а какую рацию нужно на передачу приручить?

Для теста воки токи рублей за 500 а там посмотрим

R2DIC
26.04.2017, 18:12
Умеет. Напишите более подробно при каком условии нужно переводить рацию в режим передачи, какой частоты тон давать, сколько по времени должна длиться передача.

Надобности нет, просто думал коллеги подскажут ссылки на темы или сайты где ардуины используют именно в радиолюбительской плоскости.

RV3MP
26.04.2017, 18:33
А то вдруг мне тоже надо такое, а я и не в курсе

Лёша, создание "маякопопугаев", это возрастное.
Год назад, у меня, был наплыв спрашивающих как это осуществить? Причем, почему именно ко мне обращаются... мне не ведомо.
Разделил бы желание собрать маяк на три стадии.
1. Начинающие. А слышно меня будет если я зайду за забор/гараж/дом/в соседнем микрорайоне? Чисто любопытство.
2. Опытные радиолюбители. Знают как проверить/увеличить дальность связи без извращений. Нет желания делать не нужное.
3. Совсем совсем опытные. Надо поставить себе в QTH маяк. Осчастливить мир. Вдруг, кто то, жаждет и плачет, что не получается QSO провести.
Услышал мой маяк - шанс есть. Лови меня везунчик.
------------------------------------------------------------------------
Сеть маяков/репитеров/WEB SDR/Reverse beacon достаточно развита. Не вижу смысла городить огород.
Потому, нам с тобой, остается ждать третьей стадии.:s10:
P.S.

Для теста воки токи рублей за 500 а там посмотрим
1 стадия.:s10:

RV3MI
26.04.2017, 21:42
Надобности нет, просто думал коллеги подскажут ссылки на темы или сайты где ардуины используют именно в радиолюбительской плоскости

И снова получилось что я как в воду глядел :)

все же многолетний опыт пребывания на форуме дает о себе знать...

RM6LA
26.04.2017, 22:51
Здравствуйте!

Есть мысль, что на arduin можно сделать управление радиостанцией.
Скажем в режиме Маяка или попугая.

Нет ли где то готовых схемок и ПО по данной идеи?

Зачем плодить новые темы, поиск по форуму вроде нормально работает.
http://forum.qrz.ru/search.php?searchid=2114309
И нельзя ли более информативное название темы придумать? Arduin - это вообще что?

R4CR
26.04.2017, 22:57
Маяк на Arduino это элементарная задача.
Топикстартер, напишите четкий алгоритм что нужно получить на выходе и тогда мы поможем со схемой и скетчем.
Без четкого Т.З. ни кто Вам ни чего не скажет, потому что вариантов масса.

RV3MP
26.04.2017, 23:36
Arduin - это вообще что?
ТС уже объяснил ранее:

ардуин умеет рацию переводить в режим передачи и в микрофон тон давать
Век живи - век учись.:s10:

UN7JID
27.04.2017, 04:01
Надобности нет, просто думал коллеги подскажут ссылки на темы или сайты где ардуины используют именно в радиолюбительской плоскости.

Вам и дали, в посту №5 Но вам видимо лень читать....

RZ6FE
27.04.2017, 09:23
А вот и словоблуды налетели.
Эти люди вам дали всю необходимую информацию по вашим вопросам, а вы так... Негоже. Лучше бы чётче формулировали свою задачу.

R2DIC
27.04.2017, 15:58
Маяк на Arduino это элементарная задача.
Топикстартер, напишите четкий алгоритм что нужно получить на выходе и тогда мы поможем со схемой и скетчем.
Без четкого Т.З. ни кто Вам ни чего не скажет, потому что вариантов масса.

Хотел потренироваться самостоятельно скетчи писать.

RV3MP
27.04.2017, 16:59
Хотел потренироваться самостоятельно скетчи писать.
Возьмите готовый (ранее ссылку давал), поиграйтесь, поменяйте текст передачи, цикл...
Проще начинать, понять что как и почему...

R9AAA
27.04.2017, 22:44
Хотел потренироваться самостоятельно скетчи писать.
Тогда Вам сюда: http://www.123avr.com/

R1AIT
02.05.2017, 10:39
Тогда Вам сюда: http://www.123avr.com/

Из пушки по воробьям. Это как человек про программу ТВ спросил, а вы ему статью про принципы телевидения, с развертками, синхронизацией и т.п.
Встроенных примеров достаточно. С того же Blink можно начать. Поменять режим мигания, вплоть до текста морзянкой. Если поменять номер порта, и подключить к нему транзисторный ключ, то этот ключ сможет управлять рацией абсолютно таким же образом.

UA1OM
31.03.2018, 00:12
Попробовал сделать маячок на досуге ))) При наличии комплектующих и софта заняло минут 10 )))
https://www.youtube.com/watch?v=1gxn0BUOI-M

R3DE
23.04.2018, 14:36
Уважаемые коллеги, напишите пожалуйста скетч для меги2560, сам.... ну не могу, ни чо не работает.
Надо:
на Serial1 приходит A>B:xyzC
на Serial2 должно уйти xyz
где
A,B,C,> и : - всегда одно и тоже, и на этих же местах,
x,y и z - всегда разные и их количество разное тоже.

YL2QN
23.04.2018, 17:01
напишите пожалуйста скетч для меги2560, сам.... ну не могу, ни чо не работает.


/**
*
*/
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());
}


Примерно так, но я не тестировал. Если с пол пинка не запустится - пишите на что ругается.

R3DE
23.04.2018, 18:50
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, то всё плохо.

R3DE
23.04.2018, 22:35
[CODE]
/**

Примерно так, но я не тестировал. Если с пол пинка не запустится - пишите на что ругается.

Запускается и работает, но кое что не понятно.
В 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());
}

YL2QN
24.04.2018, 09:34
В Serial1.println(send_data); убрал ln, иначе, пока нет данных, непрерывно гонит в порт 0D 0A...
Serial1.print(send_data); выдает ДВОЙНУЮ последовательность xyz
У меня данные приходят из другого порта, и в этом случае Serial1.println(send_data); выдает аж ЧЕТВЕРНУЮ последовательность xyz.
Почему, не пойму.
А зачем вам AltSoftSerial и три сериал порта


void init_serial() {
Serial.begin(9600);
Serial1.begin(9600);
altSerial.begin(9600);
}


Зачем тут Serial.print?


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);

YL2QN
24.04.2018, 09:54
наверное бы устроило, довел бы до конца, но посылает только цифру, если вставить типа 55:12y3, то всё плохо.
Лучше не надо так делать....
Тем более, что вы сами делаете перевод в цифру :)

Ваш код можно дописать, но он не предусматривает,
1. Обработку, если в буфере будет два или три нужных вам стринга
2. Обработку, если в буфере будет "мусор"


убрал ln, иначе, пока нет данных, непрерывно гонит в порт 0D 0A...
Скорее всего Serial.print(c);
или оберните отправку проверкой на наличее данных (хотя дико сомневаюсь, что это там)

if (send_data.length() > 0) {
Serial1.println(send_data);
}

R3DE
24.04.2018, 19:24
А зачем вам AltSoftSerial и три сериал порта

Зачем тут Serial.print?


while (altSerial.available() > 0) {

Serial.print(c); // Зачем вам это?


И тут вы шлёте в два порта. Вы в портах не запутались :) :)
[CODE]


Serial1.print(send_data);
Serial.print(send_data);


- Почему AltSoftSerial? - так сложилось, раньше писал для UNO, а там нет Serial1 2, 3. Если это принципиально то уберу, заменю на Serial2
- Нужны данные только на железных портах и в этом смысле просто Serial не подходитэ
- Serial.print везде добавил чтобы посмотреть, что идет в этих местах. Когда заработает - конечно уберу.
- С портами пока вроде не запутался.


Скорее всего Serial.print(c);
Нет, именно Serial1


или оберните отправку проверкой на наличее данных
Ну, так я вроде это и сделал дописав
Serial1.print(send_data);
Serial.print(send_data);
Или нет? Как сделать?


Думаю( может не прав), что вы не видите бесконечное 0D 0A потому что Serial монитор IDE не показывает, а Serial1 - железный и терминал видит.
Но это мне не так страшно, плохо, что идёт дублирование.

...Есть подозрение, что исходная A>B:xyzC на самом деле может на конце иметь 0D 0A или 0D 0A 0D 0A. Проверю.

YL2QN
24.04.2018, 20:36
Думаю( может не прав), что вы не видите бесконечное 0D 0A потому что Serial монитор IDE не показывает, а Serial1 - железный и терминал видит.
Но это мне не так страшно, плохо, что идёт дублирование.
Ну на самом деле я ничего вообще не вижу, так как написал этот код в слепую и не проверял его. Я об этом написал в самом начале.

Если я не ошибаюсь, Mega имеет 4 UART порта: Serial, Serial1, Serial2, Serial3. Используя AltSoftSerial вы можете сделать ещё на свободных пинах эмуляцию дополнительных портов. Но лучше использовать готовые UART.

Согласно вашему коду, вы слушаете altSerial и побайтно транслируете, то что получаете в Serial.
Потом парсите данные (вырезаете лишнее) и шлёте данные в Serial и Serial1.

Вопрос: какой порт вы мониторите? Если Serial, то там и будет двойной набор данных.

Если бы в конце были бы получены 0D 0A - то парсер их как раз должен был бы вырезать. Скорее всего, это какие-то служебные символы. Их мониторинг (отображение) зависит от настроек COM PORT терминала, которым вы смотрите данные.

P.S. Ещё в терминале может быть включено echo, тогда вы будете тоже видеть двойной набор данных.

YL2QN
24.04.2018, 21:10
или оберните отправку проверкой на наличее данных
Ну, так я вроде это и сделал дописав
Serial1.print(send_data);
Serial.print(send_data);
Или нет? Как сделать?
Нет, не обернули.

Двойная отправка, на самом деле, мой косяк - там 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());
}

R3DE
24.04.2018, 21:35
Ok, спасибо , шас попробую.

И еще. Как обычно :) изменились условия. Действительно реально последовательность оказалась с 0D 0A на конце. И именно это надо также обрезать, а С оставить. То есть на входе (на altSerial) A>B:xyzC.. (где две точки это 0D 0A), а на выход( с Serial1) должно уйти xyzC

Как это прописать... видимо в int endIndex = read_data.indexOf("С"); ?

YL2QN
24.04.2018, 22:01
Как это прописать... видимо в int endIndex = read_data.indexOf("С"); ?
Простейший вариант да, заменить C на нужную вам последовательность символов окончания. Должно работать, правда не оптимально, так как парсер сделает дополнительно несколько прогонов do-while по количеству символов. Но в вашем случае, это не будет являться проблемой, если, конечно, траффик по com port не сильно большой (десятки сообщений в секунду).

Лучше подправьте ещё одну строчку:
было: read_data.remove(0, endIndex + 1);
надо: read_data.remove(0, endIndex + 4);
Т.е. увеличили длину конечного стринга.

R3DE
24.04.2018, 22:27
Лучше подправьте ещё одну строчку:
было: read_data.remove(0, endIndex + 1);
надо: read_data.remove(0, endIndex + 4);
Т.е. увеличили длину конечного стринга.
Проверил, работает как надо, всё устраивает. Я правда подправил в другом месте: int endIndex = read_data.indexOf(";")+1;
Только вот, если не трудно, напишите как именно прописать вместо С эти самые 0D 0A, так сказать... на будущее.

YL2QN
25.04.2018, 10:33
Я правда подправил в другом месте: int endIndex = read_data.indexOf(";")+1;
Где и почему вы так сделали - я не понимаю. У вас в стринге не было ";" как разделителя данных, если только входные условия опять не поменялись :)

0D 0A - это carriage return. Можно на него в принципе не обращать внимания.


напишите как именно прописать вместо С эти самые 0D 0A, так сказать... на будущее.
"\r\n"