Смартфон управляет игрушечным автомобилем

от автора

За прошедшее десятилетие у многих появилось один два смартфона лежащих без дела, так и у меня. Решил применить смартфон для управления чем-нибудь, ну например, автомобилем.
Для начала выбрал игрушечный автомобиль из Лего. Он может двигаться вперед и назад, поворачивать вправо и влево и имеет пульт ДУ c ИК лучами. В качестве драйвера двигателей машинки используется микросхема LB1836, которая имеет четыре информационных входа. In1, In2 — управляют ходовым двигателем, In3, In4 — управляют приводом руля, по схеме 0, 0 или 1, 1 — нерабочее состояние. 0, 1 или 1, 0 — вращение двигателя в одну или другую сторону.

Логические 0 и 1 на входах формирует приемник ИК лучей игрушки при получении сигналов от ДУ.

Я для передачи сигналов от смартфона к машинке решил использовать экран смартфона, поскольку другие каналы передачи технически сложные и дорогие в реализации. К входам микросхемы LB1836 я решил подсоединить свое устройство, которое будет получать сигналы от смартфона.

Схема передачи сигналов такая. Программа в смартфоне создает световые пятна заданной продолжительности на экране, устройство их регистрирует и формирует логические 0 и 1 той же продолжительности на входах LB1836 без какой либо логической обработки, что очень упрощает конструкцию устройства. То есть, я просто подменил приемник ИК лучей своим устройством.

Устройство приема световых сигналов состоит из 4 ячеек. Каждая ячейка представляет собой фототранзистор L-3DP3C KGB подсоединенный к усилителю на npn транзисторе KT315. Питание берется с управляемой машинки. Выход, как я уже говорил, подсоединяется к соответствующему входу драйвера двигателя. Маломощные двигатели могут питаться прямо от выхода, но вращаться будут только в одну сторону. Но зато их будет четыре!

О выборе элементов устройства могу сказать следующее. Транзисторы я взял те, какие у меня были с давних времен. Фототранзисторы купил те, что были в магазине. Так что, желающие повторить схему, не тратьте время на поиски, воспользуйтесь теми элементами, что вам доступны. Кстати, вначале я усилитель собрал на микросхеме LM 324N с четырьмя операционными усилителями. Тоже хорошо работает, но мне показались его габариты слишком большими.
Устройство собрал на картонке, используя полоски медной фольги и элементы конструктора Лего.

Фототранзисторы помещены на дно световых колодцев диаметром 5мм и глубиной 9 мм, что бы исключить боковое засвечивание. В световые колодцы вставлены металлизированные плёнки, свёрнутые в трубочку, что значительно повышает чувствительность фототранзисторов, за счет увеличения светового потока.

Вот такой получился автомобиль.

Для разработки программы я взял, приложение BASIC! из Googl Play Маркет. Это приложение позволяет писать программы для Android, создавать файлы apk и работать со всеми сенсорами и устройствами смартфона.

Листинг программы

DO  LET s$="Говорите команду: вперёд назад вправо влево или стоп"  TTS.INIT  TTS.SPEAK s$  TTS.STOP   STT.LISTEN "Говорите"  STT.RESULTS theList  LIST.SIZE theList, theSize  LET kom$="неудача"   FOR k = 1 TO theSize   LIST.GET theList, k, theText$   IF (theText$="вперед") THEN kom$="вперёд"   IF (theText$="назад") THEN kom$="назад"   IF (theText$="вправо") THEN kom$="вправо"   IF (theText$="влево") THEN kom$="влево"   IF (theText$="стоп") THEN kom$="стоп"  NEXT k  PRINT kom$    GR.OPEN 255, 0, 0, 0  GR.BRIGHTNESS 0.7  GR.ORIENTATION 1  GR.SCREEN w, h   a = 255  r = 255  g = 255  b = 255  fill = 1  GR.COLOR a,r,g,b,fill   LET wc=0.95*h  LET hc=w  LET m=36  GR.CLS   GR.CIRCLE n5, hc/m*9.5,wc,w/15.6  GR.CIRCLE n4, hc/m*13.5,wc,w/15.6  GR.CIRCLE n3, hc/m*18,wc,w/15.6  GR.CIRCLE n2, hc/m*22.5,wc,w/15.6   GR.CIRCLE n1, hc/m*26.5,wc,w/15.6   FOR i=1 TO 5   GR.HIDE i  NEXT i   IF (kom$="вперёд") THEN    GR.SHOW 2   PAUSE 300   GR.HIDE  2   ENDIF   IF (kom$="назад") THEN   GR.SHOW 1   PAUSE 300   GR.HIDE 1  ENDIF   IF (kom$="влево") THEN   GR.SHOW 2   GR.SHOW 4   PAUSE 300   GR.HIDE 2   GR.HIDE 4  ENDIF   IF (kom$="вправо") THEN   GR.SHOW 2   GR.SHOW 5   PAUSE 300   GR.HIDE 2   GR.HIDE 5  ENDIF   IF (kom$="стоп") THEN GOTO  qq  GR.BRIGHTNESS  0.1  GR.CLOSE UNTIL 0      ! ONERROR:  qq: LET s$="программа закончила работу" TTS.INIT TTS.SPEAK s$ TTS.STOP GR.BRIGHTNESS 0.1 GR.CLOSE END 

В программе используется управление голосом как наиболее целесообразное в моем случае. Объект TTS преобразует текст в речь. Объект STT преобразует речь в текст. При работе STT обязательно должен быть включен Wi Fi, потому что записанная фонограмма отправляется на сервер в интернете, откуда приходит результат распознавания, это несколько слов, или фраз. Программа проверяет, есть ли команда в списке, выводит команду на экран и выполняет её. Если текст не распознан программа выводит сообщение об этом. Все это повторяется в бесконечном цикле. Завершение работы программы производится командой «стоп» или нажатием клавиши возврат. Геометрические размеры взяты относительными, чтобы автоматизировать привязку на разных экранах с разными размерами и разрешением, что не всегда получается. Круги, которые рисуются на экране, являются объектами и номеруются автоматически по мере их создания.

Команда GR.SHOW 2 — означает показать круг, который был создан вторым. Его номер содержится в n4. Можно было написать GR.SHOW n4. В строке IF (theText$=«вперед») THEN kom$=«вперёд» вы заметите различие в значениях величины в команде присваивания — «вперед» и «вперёд». Дело в том, что STT упорно возвращает «вперед», хотя бывают случаи «вперёд», тогда программа не распознает команду. От этого можно было избавиться, но я не стал усложнять программу, а просто поправил написание при выводе на экран. Еще бывают сбои при распознавании команды «влево». Впрочем, возможно это особенности моего произношения.

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

Желающие могут посмотреть перейдя по ссылке.


ссылка на оригинал статьи https://habr.com/post/424945/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *