Пульт дистанционного управления из смартфона

В двух предыдущих статьях я рассказал об использовании смартфона для управления игрушечным автомобилем, как непосредственно голосом, так и с использованием другого смартфона по блютус. Но управление было примитивным — отдавалась команда, автомобиль выполнял команду, останавливался и ждал следующей команды. Это было связано с большой скоростью движения автомобиля для комнатных условий (приблизительно 1,2 м/с), а так же с продолжительным временем отдания команды и невозможностью оперативно вмешиваться в движение, используя меню. Даже штатный пульт ДУ не давал возможности управления. В новой версии ДУ с графическим интерфейсом я решил применить ШИМ для регулировки скорости и имитировать управление рулем.

jlrnw7-motrughiznpornl4as0w.jpeg

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

image

При снятии пальца с экрана относительное расстояние от слайдера до левой границы экрана передается управляющему смартфону, где и формируется широтная модуляция импульсного сигнала.

GR.GET.POSITION c1, xx, yy
r6=(xx-xc)*(xx-xc)+(yy-yc)*(yy-yc)
IF r6


Наименьшая скважность сигнала 20%, наибольшая 80%. Теоретическая возможная частота 10 Гц. На самом деле наверное около 4 — 5 Гц, поскольку сигналы на модуляцию идут в общем потоке команд и некоторые из них также имеют временную задержку. Поэтому при низкой скважности хорошо заметна вибрация.

Две зеленых кнопки — верхняя движение вперед, нижняя назад. Справа красная кнопка — стоять на месте. Две белых кнопки — остановка программ пульте ДУ и на машинке. В нижней части экрана три фиолетовых кнопки выбора направления движения влево, прямо и вправо. При
включении, соответствующего режима, в центре кнопки появляется кружок меньшего диаметра и того же, но более темного цвета. Для управления направлением движения помимо кнопок я использовал так же акселерометр. При горизонтальном положении смартфона, проекция вектора ускорения силы тяжести на ось 0Y равняется 0, что соответствует движению прямо (смотрите рисунок выше).

exfneerkircjyecmk39jqxogt3k.jpeg

Если приподнять левую сторону смартфона то проекция будет со знаком +, что будет соответствовать движению вправо.

dssx8il0xzmlp5mjdiir7rmvj7c.jpeg

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

SENSORS.READ 1, sx, sy, sz
 IF (sy<=1)&(sy>-1)&(lrsh) THEN
  rsh=1
  lsh=1
  lrsh=0
  GR.HIDE cc13
  GR.HIDE cc15
  GR.SHOW cc17
  GR.RENDER
  BT.write "f"
  pause 100
 ENDIF

 IF (sy>2)&(rsh) THEN
  rsh=0
  lsh=1
  lrsh=1
  GR.HIDE cc13
  GR.HIDE cc17
  GR.SHOW cc15
  GR.RENDER
  BT.write "r"
  pause 100
 ENDIF

 IF (sy<-2)&(lsh) THEN 
  lsh=0
  rsh=1
  lrsh=1
  GR.HIDE cc17
  GR.HIDE cc15
  GR.SHOW cc13
  GR.RENDER
  BT.write "l"
  pause 100
 ENDIF


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

© Habrahabr.ru