ЭЛЕКТРОНИКА Подборка радиомодулей для "своей игры"!

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
Всем привет!
Чувство, будто я вернулся в 2008 и опять задаю свои глупые вопросы)
Суть вопроса: делаю проект: беспроводные кнопки для своей игры. Беспроводные дабы облегчить жизнь отсутствием бороды проводов (21 век все-таки):)
На фото вид одной из 5 таких же. Внутри пока пусто.
Главный вопрос - беспроводная связь.
Я купил с али 5 таких передатчика на 433 МГц: https://aliexpress .com/item/32961511253.html
И один приемник: https://aliexpress.com/item/32857841146.html
Эти приемники - очень интересная вещь. Одмн как бы обучаются одной кнопкой. На каждый передатчик зашит (не знаю как правильно сказать) свой уникальный серийник. Т.е. чтобы приемник принимал сигнал с конкретного передатчика нужно его научить опозновать приемник.
Идея была такая - на каждой кнопке свой передатчик, для всех них один приемник, подключеный к микре, которая в свою очередь эмулирует нажатие клавиши. Для каждой кнопки - своя клавиша. Далее уже сама программа, с помощью которой собсна делаем игру определяет чья кнопка была первая и далее по списку...
Все класно, НО! Когда я начал тестировать передатчики и приемник оказалось, что при передаче сигнала сразу с двух передатчиков (т.е. зажать кнопку передачи на двух передатчиках) они как бы блокирует, или перегружают канал (хз что тут происходит) но приемник просто ничего не выдает. Просто молчит. Как только начинаешь тыкать поочередно - все ок. И да, у передатчика 4 канала. и если зажать на первом первый канал, на втором любой другой все тоже самое - приемник шлет на ...
Не знаю зачем, докупил еще 4 приемника, хотел для каждой кнопки свой приемник(глупый шаг:)), но опять же приемники отказываются работать, если передача чразу с двух передатчиков одновременно...
Отсюда логичный вопрос: как грамотно организовать беспроводную связь?
Варианты готов рассмотреть любые. Блютус,вафля, что угодно.
Хотелось бы конечно сократить издержки (итак дохера бобла влил) и придумать что-то с передатчиками 433, возможно другой приемник или еще что.
Все прочитавшим - спасибо!
А всем, давшим дельный совет - спасибо x10 :)
П.С. На втором фото макетка, там можно разглядеть два одинаковых передатчика и два разных приемника
 

Вложения

Изменено:

_BadWolf_

★✩✩✩✩✩✩
2 Янв 2020
49
16
Отсюда логичный вопрос: как грамотно организовать беспроводную связь?
Отложить эти передатчики, и взять оригинальные nrf модули, и на них уже делать сеть. Это если по хорошему.
А в этом случае можно не постоянно слать сигнал о нажатии кнопки, а отослать только короткий импульс при нажатии кнопки.
 
Изменено:

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
@_BadWolf_, Спасибо за ответ! Т.е. кидаем на кажду кнопку по нрфке, и видимо по ардуине(так понимаю нрфка без неё работать не может). Потом, полагаю, делаем каждой передающей нрф свой айди, посылаем пакет с значение кнопки 0 или 1, считываем нрф принимающей. Верно? Как-то без ардуины можно обойтись на передающих? Не сойдёт сума принимающая нрф, если на неё сразу пять штук информацию будут слать?
Заранее спасибо
 

_BadWolf_

★✩✩✩✩✩✩
2 Янв 2020
49
16
@Syomathend, Не нужно постоянно сигнал слать о состоянии кнопки, можно просто послать небольшой сигнал только когда ее нажмут, и все. Вариант с нрфкий это идеальый вариант. А с теми модулями что у вас можно сделать по сути тоже: не постоянно слать сигнал о кнопке, а только импульс в момент нажатия, в таком случае не обязательно юзать целую ардуинку, можно поставить аттини13 для этого.
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
@_BadWolf_, т.е. речь идёт о прогать голый МК? О гад плиз ноу;(
В голове есть схема с биполярником и кондером, это ещё хуже голого МК.
Я зацепился за нрф, так как я немного идеалист (ну так, на десятую процента). Никогда с ними не работал. Пару вопросов: плясок с бубном много ждёт? Сможет ли дигиспарк с ней работать?
Ну и я потрачу ещё немного монет, но лучше без рассыпухи и голых МК. Паять рассыпуху и голые МК в списке моих ненавистных дел сразу после собирать колорадских жуков и чистить вареную картошку:)
 

_BadWolf_

★✩✩✩✩✩✩
2 Янв 2020
49
16
т.е. речь идёт о прогать голый МК?
Если хочется хорошо и дешево то без этого никак. Да и вообще ардуинка идеально подходит ИСКЛЮЧИТЕЛЬНО для ознакомления с миром МК и всеми его нюансами, то есть чисто для обучения. Использовать ее в конечных проекта категорически не рекомендую. Ну это немного не туда меня занесло))

P.S. На тиньте есть библиотека ардуино.

плясок с бубном много ждёт?
Если никогда с этим не работали - да. Если у дигиспарка хватит памяти и интерфейсов то да.
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
@_BadWolf_, ну я надеюсь дигиспарка хватит. Мне то надо только одно цифровое значение передать, думаю библиотека для нрфки залезет) Спасибо ещё раз за помощь. Наверно остановлюсь на диги + нрф. Если есть ссылочки на хорошие статьи про обращение с нрф - с удовольствием почитаю;)
А касаемо обучения и ардуины, а тут на меге свой диплом бакалавровский делал, про автоматизацию спецпрачечной для АЭС. Получилась неплохо:) Хотя образование мое связано с АЭС, а не с АСУ и МК)))
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
Немного почитал, и вопрос реально появился. Digispark + nrf = взлетит или нет? Читал кто-то испытывал некоторые проблемы... Кто-то юзал такую связку? Поделитесь опытом:)
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
@kalobyte, эммм. Attiny85 в обвесе. На канале Александра как-то было пару видосов про неё (плату)
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
а зачем она, если есть мега328? 85я заточена под софтовый усб
у меня такая плата валяется давно, там вроде аппаратный спи нельзя использовать из-за обвеса

лучше купить тогда такие платы, паять вообще ничего не надо
https://www.aliexpress.com/item/4000112750588.html

или такие с мегой 48 аж 5 штук сразу
https://www.aliexpress.com/item/32851543165.html
нрф тянет 6 передатчиков одновременно
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
@kalobyte, тогда проще нану поставить. Просто с али заказывать и ждать месяц не охото. Нрф в Москве можно найти за лояльный ценник. В амперкоте продаются. А почему дигиспарк - дешевая, простая, не душит жаба, что ради одной нрф стоит целая нана:)
На гитхабе народ писал вроде, что подключали. Но опять же пляски с бубном которые нежелательны. Я подумал если у кого есть опыт, и у него не возникло проблем с диги...:)
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
А почему дигиспарк - дешевая, простая, не душит жаба, что ради одной нрф стоит целая нана
так нано стоитвроде бы около 2х баксов
куда еще дешевле? хотя я бы сделал плату и тини85 вроде как выводов не хватит
надо как раз 6 выводов или если не использовать прерывание, то ресет останется свободным и можно будет прошивать
кнопку уже некуда подключать
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
ну да, минимум 5 и 6й прерывание, когда на нрф пришел пакет и надо будить контроллер
но 6й как раз сброс и если ты его сделаеш входом для кнопки, то не сможеш больше прошить
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
Привет! Пока в процессе, просто немного руки не доходят. Главные выводы - надо делать на nrf24L01. Я имитировал подкинутой про клавиатуру, а софтина (от Владимира Хиля) сама умеет определять какая клавиша нажата первой. Т е просто кнопкой отправляешь сигнал на станцию приёмник. Станция приёмник через юсб к компу, и работает как Клава. Каждой кнопке - свою букву. Т е я нажимаю на кнопку на расстояние, на комп как бы имитируется нажатие кнопки клавиатуры . На кнопку привязываешь игрока в софтина и готово. Кнопки тариф на али, коробочки - очень удобно и дёшево - разводные коробки. На озоне нашёл очень дёшево и нужной мне формы. Код пока написан только на станцию и одну кнопку. Короче в процессе пока. На передатчики поставил наны. На приёмник - Про мини, дабы имитировать Клаву. Если есть ещё вопросы - пиши
Надеюсь ты здесь бываешь, расскажи, что получилось. Цель абсолютна та же, что у тебя. Если все получилось буду очень благодарен за любую инфу.
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
Всем доброго дня!:)
Все пытаюсь доковырять свои кнопки (информация выше), но возник такой вопрос:
Пытаюсь открыть две трубы на приемнике НРФ, но он толи не хочет этого делать, то ли я что-то косячу.
Суть: есть два передатчика и один приемник. Пытаюсь отправлять состояние кнопки по разным трубам (для каждого передатчика своя). Приемник читает сигнал, и если труба 1 - печатает 'a', если 2 - 'b'.
'a' он печатает, 'b' - нехочет никак. Что-то я туплю, не понимаю. Скажу заранее - оба передатчика работают
Передатчик 1:
C++:
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte counter;
boolean butt;
void setup() {
  pinMode(3, INPUT_PULLUP);

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигналa
  radio.setPayloadSize(32);    //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x6f);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_HIGH); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчикa
}

void loop() {
  butt =!digitalRead(3);
  if (butt == HIGH) {
   counter = 1;
radio.write(&counter, sizeof (counter));
delay(250);
  }
}
Передатчик 2:
C++:
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte counter;
boolean butt;
void setup() {
  pinMode(3, INPUT_PULLUP);

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);        //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();   //разрешить отсылку данных в ответ на входящий сигналa
  radio.setPayloadSize(32);   //размер пакета, в байтах

  radio.openWritingPipe(address[1]);   //мы - труба 1, открываем канал для передачи данных
  radio.setChannel(0x6f);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_HIGH); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчикa
}

void loop() {
  butt =!digitalRead(3);
  if (butt == HIGH) {
   counter = 1;
radio.write(&counter, sizeof (counter));
delay(250);
  }
}
Приемник:
C++:
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.openReadingPipe(2, address[1]);     //хотим слушать трубу 1
  radio.setChannel(0x6f);  //выбираем канал в котором нет шумов

  radio.setPALevel (RF24_PA_HIGH); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
  byte pipeNo, gotByte;
  if( radio.available(&pipeNo)){  // слушаем эфир со всех труб
    radio.read( &gotByte, sizeof(gotByte) );// чиатем входящий сигнал
    if(pipeNo==1){
      Keyboard.press('a');
      Keyboard.releaseAll();}
    if(pipeNo==2){
      Keyboard.press('b');
      Keyboard.releaseAll();}
     
  }
}
Буду рад совету. Заранее спасибо
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Попробуйте вместо
if(pipeNo==2){
Использовать
if(pipeNo==0){

и еще между строкой 28 и 29 выведите в монитор порта значение pipeNo
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Чёт я немного туплю с адресами... изначально byte address[][6] это вроде двумерный массив, однако при подстановке адреса к нему обращаются, как к одномерному? Может я не прав, может там есть свои подводные камни...
А если в первом передатчике сделать
radio.openWritingPipe(0xAABBCCDD11LL);
На втором
radio.openWritingPipe(0xAABBCCDD22LL);
На приёмнике
radio.openReadingPipe(1,0xAABBCCDD11LL); //хотим слушать трубу с первого передатчика, она же труба №1
radio.openReadingPipe(2, 0xAABBCCDD22LL); //хотим слушать трубу с второго передатчика, она же труба №2

Просто где то читал, что адреса 1-5 труб должны отличаться только младшими байтами, а я никак не могу осознать зачем массивы на этапе тестирования городить и какие в итоге адреса приедут на трубы. Либо делать, как говорит @Старик Похабыч, так как нулевая труба может всеми байтами отличаться, тогда надо будет подкорректировать 14 и 33 строку в коде приёмника.

ПС: Пока код читал, кажется догнал.... может попробовать массив подредактировать
byte address[][6] = {"Node1", "Node2", "Node3", "Node4", "Node5", "Node6"};
 

Syomathend

✩✩✩✩✩✩✩
10 Мар 2020
14
0
vk.com
Чёт я немного туплю с адресами... изначально byte address[][6] это вроде двумерный массив, однако при подстановке адреса к нему обращаются, как к одномерному? Может я не прав, может там есть свои подводные камни...
А если в первом передатчике сделать
radio.openWritingPipe(0xAABBCCDD11LL);
На втором
radio.openWritingPipe(0xAABBCCDD22LL);
На приёмнике
radio.openReadingPipe(1,0xAABBCCDD11LL); //хотим слушать трубу с первого передатчика, она же труба №1
radio.openReadingPipe(2, 0xAABBCCDD22LL); //хотим слушать трубу с второго передатчика, она же труба №2

Просто где то читал, что адреса 1-5 труб должны отличаться только младшими байтами, а я никак не могу осознать зачем массивы на этапе тестирования городить и какие в итоге адреса приедут на трубы. Либо делать, как говорит @Старик Похабыч, так как нулевая труба может всеми байтами отличаться, тогда надо будет подкорректировать 14 и 33 строку в коде приёмника.

ПС: Пока код читал, кажется догнал.... может попробовать массив подредактировать
byte address[][6] = {"Node1", "Node2", "Node3", "Node4", "Node5", "Node6"};
Спасибо за ответ)
Уже пробовал и адреса вводить, все равно. Кажется, будто он не хочет две трубы читать одновременно.