Управление для простых "машинок на NRF"

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Если у тебя в детстве не было велосипеда, а ты вырос и купил себе машину, то у тебя все равно в детстве не было велосипеда"
народная мудрость.


А у меня в детстве не было машинки на радиоуправлении, поэтому 1-ое что мне захотелось как то воплотить так это ее. И сделать максимально все самому. При помощи 3Д принтера конечно. Худо бедно, но машинка появилась, а параллельно с ней появилась нужда в каком то устройстве для управления ей. Первое что было это два потенциометра подключенные к ардуино (про NRF писать не буду, понятно, что оно было). Машинка ездила, управлялось. Но не так как хотелось бы.

Идея № 2! сделать качалку из 2-х потенциометров. Идея была частично реализована в части механики, но почти сразу отвергнута. Не понравилось малая часть используемого диапазона. Надо было либо менять потенциометры, либо городить передаточные шестерни. Фото прилагаю.
f1.JPG

Идея №3! Использовать стандартный ардуино джойстик. В таком виде было собрано на пальцах 2 пульта. Оба рабочих. Один с нано и без батарейки, т.е. привязанный USB проводом к компу, второй на базе pirania UNO и аккумуляторного шилда к нему. Оба работают, но душа моя не лежит к ним, не могу я этими пипками управлятиь.
f2_1.JPGf2_2.JPG

Голова вспомнила о управлении пистолетного типа, где руль крутишь одной рукой, а газ жмешь пальцем. Надо делать такое.
Определил, что мне надо из управления?
1) Ездить вперед и назад. Курок можно сделать так, что в одну сторону будет вперед, а в другую назад. Но мне так не нравиться. будет так: одна сторона "СТОП", вторая "ПОЛНЫЙ ВПЕРЕД". Если надо дать задний ход, то курок в положение "СТОП" и нажимаем кнопку реверса. (кнопка №1).
2) Пусть будет включение-выключение света. (кнопка №2).
3) Клаксон! Буду ехать и пищать матом. Хочу. (кнопка №3).
4) Режим ускорения. Чем не форсаж ? Будет работать только в режиме полного газа и определенное время. Восстановление со временем. (кнопка №4).
5) Может быть стрелять. Чем не знаю, как не знаю , но подумаю. (кнопка №5).

Рулевое колесо решил сделать на базе какого-нибудь простого энкодера с кнопкой. И так что бы энкодер было просто поменять. Поворот в обе стороны без ограничения колеса, пропуски не смертельны. Ограничение программно, до максимума. Нажатием на кнопку будет свистеть пьезопищалка на машине. (пока на машине нет ни света, ни звука). В разработке.

Курок газа задал мне задачу.. Он должен быть достаточно чувствительным, не дергат ьмашину туда-сюда, удобным, небольшого размера. Была куча попыток и проектов, на фото часть идей. (№3 - по настоящее время).
f3.JPG

И вот последняя ЧАСТЬ. Коробочка с курком и 3-мя кнопками.
f4_all.JPG
Это рабочий вариант. Ну кнопками я похвастался рано, реально из списка тут только 1 кнопка и 2 концевых выключателя. Крайние позиции фиксируются концевиками, соотв. они и указывают положения "СТОП" и "ПОЛНЫЙ ВПЕРЕД". Если в положении "ПОЛНЫЙ ВПЕРЕД" еще чуть надавить курок, то сработает копка "НИТРО" . Реализовано мягким креплением концевика (резиночку подсунул).
Код для тестирования, может кому пригодиться. Тут нет реализации приема и передачи. только получение данных с курка и вывод их в окно порта. Временно нажатие кнопки "НИТРО" висит на 2-ом прерывании, потом будет на другом, одном из дополнительных.
C++:
volatile int c = 0, oldc = 0;
volatile int MinP = 80, MaxP = 970;

void potch()
{
  c = !digitalRead(2);
}


void setup() {
  Serial.begin (115200);
  pinMode (2, INPUT_PULLUP);
  pinMode (3, INPUT_PULLUP);
  pinMode (4, INPUT_PULLUP);
  attachInterrupt(0, potch, CHANGE);
}
long int oldp = -10, p = 0;
void loop() {
  long int s = 0;
  for (int i = 0; i < 20; i++)
  {
    s = s + analogRead(A0);
  };
  p = map(s / 20, MinP, MaxP, 0, 100);
  p = max(0, p); p = min(100, p);
  if (oldp != p) {
    Serial.print(digitalRead(3));
    Serial.print(":");
    Serial.print(digitalRead(4));
    Serial.print(":");
    Serial.print(s / 20);
    Serial.print(":");
    Serial.print(p);
    Serial.print(":");
    Serial.println(c);
    oldp = p;
  }
  if  (!digitalRead(3)) {
    MaxP = analogRead(A0);
  };
  if  (!digitalRead(4)) {
    MinP = analogRead(A0);
  };
  if (c != oldc) {
    if (c) {
      Serial.println("Nitro ON");
    }
    else {
      Serial.println("Nitro OFF");
    };
    oldc = c;
  }

}
На плате с соединительными разъемами присутствуют RC-фильтры для кнопок (с обратной стороны). Спаяны моими кривыми ручонками из SMD деталей. Показывать не буду , больно криво. Стыдно. Паял SMD 1-ый раз. Но свою работу выполняют. Прикрепил STL файлы.

gb_1.JPGgb_2.JPG
cxema1.jpg

Теперь буду делать рулевое колесо из энкодера. Здравые идеи приветствуются. На вопросы отвечу.
 

Вложения

Изменено:
  • Лойс +1
Реакции: Arhat109

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Этот вариант проекта зашел в некоторый тупик. Захотелось чего то более универсального, на все случаи жизни и что бы легко модифицировть.
Делаю проект передатчика на 8 кнопок, 4 аналоговых потенциометра (2 джойстика без кнопок, кнопки можно подключить к любым из 8-ми выше описанным) и энкодер , его кнопка будет использоваться для управления.
Пока есть только сыроватый собранный на макетке тестовый проект, в котором реализован только режим передачи и ответный скетч. Все данные передаются пакетом данных в 6 байт.
Планируется сделать настройки связи "и все такое" (с) Гувер
 
  • Лойс +1
Реакции: b707

Nick

✩✩✩✩✩✩✩
1 Авг 2018
35
5
А у меня была идея сделать пульт управления из геймпада для SEGA. Только геймпад нужно хороший подбирать а то одно китайское г продают.
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
В настоящее время есть рабочий скетч в котором реализовано:
1) 8 тактовых кнопок
8 кнопок подключенных через мультиплексор, занимают 4 цифровых входа. Данные передаются 1 байтом, где каждый бит несет смысл нажатой (1) или отпущенной кнопки (0). Реализован механизм инверсии кнопок, включения /выключения работы кнопки. Так же есть программная возможность изменения канала кнопки на другой. Т.е. 5-ую кнопку можно назначить на 2-ое место , а 2-ое на 3-е. Для удобства. Настраивается все это через отдельное меню.

2) 4 потенциометра. Значение каждого потенциометра передаются 1 байтом, т.е. от 0 до 255 . Опрос быстрым методом. Можно так же как и с кнопками включать и выключать обработку каждого потенциометра, инвертировать значение, назначить минимальное и максимальное получаемое значение , ниже/выше которого будет всегда 0/максимум. А так же верхнее передаваемое значение до 255. Т.е. значения можно конвертировать для передачи не только в 0..255 но и в 0..200, 0..123 и т.п. Изменение настроек через меню.

3) 1 энкодер. Используется как управляющий орган. Во время передачи передается изменение его положения между передачами. Если не крутить , то 0, если влево то -1 или больше, вправо 1 и больше. Возможно программно инвертировать его, а так же отключить его. Есть множитель, на который умножается поворот при передаче. целое число. т.е. 1 щелчок может соотв. коэффициенту 0 ,1 , 2..31. Настройка его через меню .

4) Рабочая часть приема и передачи, в основном приема. Вывод на экран канала, трубы, количество плохих пакетов и циклов loop в секунду. Так же на экране идет отображение работы сторожевого таймера. При зависании перезагрузка платы. У меня такое бывает если питать от внешнего источника почему то.

5) реализована настройка параметров радиопередачи, канал, сила сигнала, ответы, скорость, задержка между передачами. Настройка трубы. Труба используется фиксированной длины в 4 байта.

6) режим тестирования управления. Экран который отзывается на все органы контроля.

7) Подключено внешняя память EEPROM по i2c . На нее планируется записывать настройки, несколько штук. Профиль есть, загрузка последнего профиля, выбор и загрузка профиля из записанных. Пока ограничил 20-ю профилями. Выбор имени из 5 символов латинского алфавита от A до Z. Можно и больше , но надо ли ? т.к. выбор буквы идет поворотом энкодера, то довольно долго получается.

8) на А6 сделана проверка заряда акб. На плате через делитель напряжения.

9) Сделана схема в Изи-еде. Но пока не придет плата не буду ничего показывать. Надо проверить, это мой 1-ый такой опыт в разводке. Размер платы примерно 10 на 6 см.

Весь софт рассчитан на конкретное оборудование и на конкретные порты. Универсальности не будет, т.к. пожертвовал ею в целях увеличения производительности и сокращения кода.

Теперь думаю можно было бы еще и аналоговый мультиплексор поставить - те же 4 аналоговых порта занял бы при 8 аналоговых входах. Но вот надо ли столько вопрос.

Вариант прошивки готов. Читалка есть. Жду платы, т.к. доставку поставил самую дешевую, то будет долго. Пока попробую сделать демо видео.
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Меню для работы и настройки :
Описание.
1) Включение и первичная проверка
2) Тестирование. Проверка органов управления. Ряд нулей - кнопки. 1 нажатая, 0 отпущена. 4 числа ниже - показания 4-х аналоговых потенциометров. Left и Right - повороты энкодера. 4.8 5.0 - показание нарояжения с пина А6, 20 - количество циклов loop в секунду. 20 тысяч.
3) Настройка канала связи. 125 номер канала , правее номер трубы. Ниже мощность и скорость. Y-N режим подтверждения.
4) Профили настроек, сохраненные на внешней памяти i2c
5) Настройка управления. i - инверсия, передаваемые значения меняют 0 на 1 и 1 на 0 для кнопок. Для Энкодера поворот считается в другую сторону. Значения потенциометров вместо 0...1023 считаются как 1023 ..0. E - влючение /выключение. Если 1, то работает, если 0 - всегда передается 0. С - канал. порядок кнопок и порядок потенциометров можно менять местами. B0 -B7 номер кнопки. P0-P3 номер потенциометра. подчеркнутый - текущий, Min Max - ограничение для считываемых показаний потенциометра. 0...255 - ограничение передаваемого значения. диапазон Min.. Max мэпируется на 0...255 (верхнее значение меняется). То как работает функция map мне не понравилос. на примере мэпирования значений в диапазон 0..1. Значение за х у энкодера - множитель, вместо 1 будет передано 1 умноженная на множитель.
6) Старт передачи. т.к. приемник не включен и включено подтверждение передачи, то быстро меняется кол-во плохих передач. Выведен номер канала и номер трубы. Второе видео - удачная передача. 1 - количество тысяч удачных передач. WD - Ok - работа вотчдога, 4,8 - напряжение , просаживается до 4.6 при работе от ЮСБ. 62 - 64 тысячи циклов loop в секунду, передача каждые 10 мс.
Видео 1
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Пришла плата, частично запаял, вроде бы все работает
1593182520784.png
Нет наличных джамреров, они мне тут нужны, и нужны 4 движковых переключателя под 90 градусов, у меня только 2 и прямых. Попробую завтра на радиорынке найти, он уже работает, но в среду я там слишком поздно был.
 

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
Этот вариант проекта зашел в некоторый тупик. Захотелось чего то более универсального, на все случаи жизни и что бы легко модифицировть.
Делаю проект передатчика на 8 кнопок, 4 аналоговых потенциометра (2 джойстика без кнопок, кнопки можно подключить к любым из 8-ми выше описанным) и энкодер , его кнопка будет использоваться для управления.
интересно.
так сказать в порядке обмена опытом :)

Делал клиенту нечто подобное - "мост" между двумя ардуинами через NRF с передачей сигналов кнопок и аналоговых входов. Поддерживались Уно/Нано и Мега в любых комбинациях. связь двухсторонняя(то есть каждая ардуина одновременно и приемник и передатчик), до 32 цифровых и 16 аналоговых сигналов, типы сигналов - тактовые кнопки, фиксируемые, с инверсией... К этому прилагался еще и конфигуратор под винду :) - выбираешь мышкой, какие пины с какими связаны...
Для скорости передавал только те сигналы, что изменились в последнем цикле опроса... Система модульная, можно было легко добавить другие протоколы связи. например CAN или HC-12
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Многое зависит от обвеса, думаю сюда вполне бы влез еще аналоговый мультиплексор и вместо 4-х аналоговых каналов можно было сделать 8. При том что аналоговый мультиплексор есть. я тормознул.
Пока вынашивается идея универсальной платформы и универсальным управлением. В конечном счете вижу что платформу с платой типа нано168 с открытым ком-портом, в который по определенному протоколу идут выходные данные, а что подключить уже туда - будет зависеть от ситуации. Начну со связки NRF + ардуино, потом ESP-01 + управление смартфоном, далее синийзуб. Обратную передачу пока не планировал, она может быть сильно разной.
 

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
Понятно. У нас в проекте были именно кнопки и прочие сигналы, а компорта не было. Фактически это был пульт управления. То есть одна Ардуина - это пульт. на ней кнопки и ручки. другая исполнитель - на нее идут команды, а обратно различные сигналы датчиков и концевиков. Поэтому связь нужна была двухсторонняя.
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Нашел пару "косяков" на плате - сдвинулся один выход и оказалась не разведена 1 дорожка. Это мелочь. Но не нравиться , что греется преобразователь напряжения на 5 вольт. Думаю надо ставить где-то токоограничивающий резистор
Еще непонятно, почему на ардуине между землей и 5в есть сопротивление всего около 780 Ом.

Сейчас запустил в режиме передачи, подключен джойстик и потенциометр, 1 пустой, кнопка джойстика подключена к "штатному" разъему кнопок мультиплексора. Отработало больше 240 тыс передач, почти не нагрелся, т.е. рукой держу и не сразу понимаю, что теплый. на 230 тыс. 8 ошибок. Сигнал передается каждый 15 миллисекунд

Те же 8 ошибок 614 тысяч . 2.5 час непрерывной передачи данных,
 
Изменено:

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
А вы передаете с подтверждениеим или просто так? :)
Тут самое интересное. когда начинается двух сторонний обмен и сообщения с двух сторон начинают сталкиваться между собой (то есть когда два передатчика одновременно пытаются передавать). при интенсивном обмене число потерянных сообщений очень быстро растет и я пока не нашел простого решения этой проблемы
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Подтверждение на выбор в настройках передатчика. Тестирую с подтверждением обязательно. Иначе не интересно. Вероятность столкновений будет зависеть от величины пакета. У меня он небольшой и стабильная работа получается при интервале 10 мс. Быстрее уже лезут ошибки.