Вертолетный ИК пульт и ардуино
- Войдите на сайт для отправки комментариев
Добрый день. Возник такой вот, возможно глупый вопрос, а точнее проблема. Дома есть пульт управления вертолетом, работает с помощью ИК. Так же есть ИК датчик подключенный к ардуине. Использовал библиотеку IRremote, пытался сделать определение сигналов с пульта на ардуино. Сигнал определяется и в Serial пишется. Но.
Собственно суть проблемы. Т.к. на пульте не кнопки, а джойстики, то статические значения прописать в коде не получается. Известно, что сигнал с пульта передает 4 байта информации: каждый байт отвечает за положения джойстиков.
Есть ли возможность разобрать сигнал на эти 4 байта на 4 числа в формате 0-254?
Собственно статья с информацией о сигнале с пульта: http://habrahabr.ru/post/189248/
Либо если такой возможности нет, то направьте в нужное русло, пожалуйста. Очень хочется прикрутить этот пульт управления.
В чем именно проблема? Конкретно. Можно по порядку, а не всё сразу.
IRremote определил протокол? Или говорит, что Unknown? Что он выдает в Serial?
В статье разобрано, какой байт за что отвечает. Что там непонятного? У Вас не так?
По порядку - это так:
1. Определить, понимает ли IRremote данные с пульта.
2. Если не понимает, написать свой "распознаватель" протокола, благо в статье по ссылке он расписан.
Разобрать на байты - это самое простое. Сначала протокол.
Прошу прощения, я просто только учусь с этим делом.
Собственно по порядку.
C IRremote я выводил данные через Serial.println(results.value, HEX); в монитор. Собственно именно здесь я и пытался вместо HEX задавать другие параметры. А так же это значение как-то распознать на те 4 байта, в итоге ничего не получилось.
Искал другие примеры работы с библиотекой, но все сводилось к этому коду.
Просто я не совсем понимаю, как получить эти байты. Опять же делал я по вот этой статье http://itsac.ru/electronics/arduino/arduino-rabotaem-s-ir-signalami-ch-1-priyomnik-tsop22-zapis-ir-signala.html
Если Вы можете объяснить, какие действия мне необходимо сделать или дать ссылку на необходимую информацию я буду очень благодарен.
Я не совсем Вас понял. Я бы сделал так:
1. Загрузил пример из библиотеки IRremote, который называется IRrecvDump и понажимал, покрутил пульт. На выходе я бы получил название протокола или "Unknown encoding: ".
2. Если протокол неизвестен, тогда можно нажимать кнопки или смещать джойстик в одном направлении и смотреть какие коды меняются. Таким образом можно понять какие байты за какие элементы управления отвечают.
3. А если протокол известен, то вообще проблем нет
Рекомендую почитать про протоколы IR здесь http://www.sbprojects.com/knowledge/ir/index.php, там немало интересного. Ну да, на английском, а что делать.
И так? Как успехи с IRrecvDump? Что видно в Serial Monitor?
По поводу results.value - это unsigned long переменная и один код, обычно, помещается в ней. А уж выводить в HEX или DEC - это вопрос десятый. У нас на форуме эту тему уже не раз разбирали и ответы на этот вопрос есть. На самом деле можно пока смотреть в HEX формате, вполне достаточно, чтобы понять, какой байт за что отвечает. Это главное, а разбить на байты - это мелочи и пока это не поможет в решении задачи.
В общем если еще не скушно, то напишите, что выдает IRrecvDump? Хотя бы пару тройку вариантов и что нажимали при этом в каждом варианте.
Собственно дошло время до опыта. Вот выдача в мониторе
Эта выдача происходит при нажатии на рычаг газа. Собственно судя по данным, сигнал передается только при использовании этого рычага, все остальные рычаги только изменяют передаваемое значение. На мой взгляд число совсем рандомные и как из них вытащить данные непонятно.
Кажется меня пробило на поговорить (дохтур, твои таблетки от жадности работают! :) 4er, это не про Вас.
Немного странные фразы "сигнал передается только при использовании этого рычага" и "все остальные рычаги только изменяют передаваемое значение". Что Вы имели в виду? Газуем - выдается информация, а рычаги двигаем ничего не выдается? Вы себе противоречите. Не важно. Пока информации и без этого достаточно, но, обо всем по порядку.
Ок, раз протокол эта библиотека не понимает, следующие действия могут быть такими:
1. Доработать библиотеку, добавив распознавание этого измененного Sony протокола.
2. Взять другую библиотеку и попробовать считать данные по другому.
п.1
Минусы:
- код разрастается, он и так немаленький.
- нам не нужны другие протоколы, потому код лежит лишним грузом и не работает.
Плюсы:
- особых не вижу
п.2.
Минусы:
- новая библиотека, новые глюки
Плюсы:
- а вдруг получится
- код мизерный
- алгоритм простой, всего лишь один раз пересчитать константы
Рассмотрим второй вариант, тем более под руку попалась, вполне неплохая реализация отсюда http://we.easyelectronics.ru/Soft/prostoy-universalnyy-dekoder-ik-du.html
Вполне можно воспользоваться, поскольку 4 байта (32 бита) вписываются в этот алгоритм.
Рассмотрим исходные данные:
"0" - 300 мкс, "1" - 600 мкс.
Чтобы понять, как настроить программу, необходимо знать следующую информацию:
1. Какая Ардуина
2. Частота кварца
Тогда пересчитав, можно будет взять исходник и попробовать.
И так, какая Ардуина и какая частота? В статье используется 8МГц кварц, потому, скорей всего придется пересчитывать. Но это не страшно.
Спасибо, что так помогаете разобраться мне с моей проблеймой. Попробовать с этой библиотекой смогу только завтра вечером.
По поводу пульта. У меня он вот такой http://rc-go.ru/images/data/gallery/big_S107-21.jpg
Левый рычаг с помощью пружины тянется вниз, собственно код выше был, когда я пытался его поднять. По поводу передается/не передается сигнал. Если двигать только правый рычаг, менять направление, то ИК сигнала нет, он появляется только когда нажимаешь еще и левый. Если держать левый в максимальном положении, то код почти одинаковый идет, и при этом начать смещать правый джойстик, то коды будут снова меняться, так что запускает сигнал только левый рычаг, но сигналом передается состояние обоих.
Ардуино - Arduino UNO R3. По поводу частоты кварца тяжело сказать что-то.
Uno - уже проще. Если посмотрите в файл hardware/arduino/boards.txt, то там можно посмотреть частоту работы МК, смотрим и видим:
т.е. частот 16МГц, что вдвое больше, чем в указанной строке. Значит нужно увеличить константы примерно в два раза. Для начал можно и точно в два раза увеличить, если особо не копаться.
Как идут коды - немного странно, но это пока не так важно. Либо проблема пульта, либо непонимание работы. Пока можно не париться.
И так, навскидку, адаптировать исходник под ArduinoIDE, поскольку автор использовал Atmel Studio или типа того, а у нас main отсутствует, если только setup & loop. Плюс нам нужно выдавать коды в Serial, а не на LCD. И второе - пересчитать коэффиценты и делитель для таймера. Но это уже только завтра вечером. Можете попробовать увеличить IrPulseThershold=9 и TimerReloadValue=150 в два раза, для начала, но работать, скорей всего не будет.
И еще раз спасибо. Таким образом после всех этих манипулиций, что я должен получить в итоге? Как понять, что оно работает? :D
Нашел еще одну интересную статью. http://trandi.wordpress.com/2009/09/20/arduino-processing-helicopter-ir-remote/ Думаю это лучше будет попробовать прикрутить и доработать. Возможно что-то и получится
Достаточно просто, при нажатии на определенный рычаг/кнопку, коды дложны меняться не хаотично, а примерно одинаково.
Более того, при использовании определенных рычагов, должны меняться только определенные байты (см. Вашу ссылку http://habrahabr.ru/post/189248/). Чтобы было удобно, данные лучше выводить в Serial Monitor в HEX виде, там должно быть явно видно в каком байте меняется информация. Повторюсь, подсчитать смогу только завтра, сегодня уже котелок не варит :)
рычаги не крутить, проверять приём кнопок
Собственно используя вот эту статью http://trandi.wordpress.com/2009/09/20/arduino-processing-helicopter-ir-remote/ Удалось достигнуть частичных успехов.
Он там делает через связку Processing и Arduino. Собственно эта связка работать никак не хочет. Все запускается, но в лог данные не выводятся. Если же судить по первому шагу его, то в моем случае данные немного другие и даже в статье на хабре данные так же другие. Видимо вертолетик похож, да сигналы все-равно разные.
В моем случае похоже, что стартовый сигнал около 1700, 0 это 100мкс, 1 - 200мкс.
Хотя опять же результаты очень прыгают. А может ли это быть из-за IR приемника? Это нормально, что он пишет лог, как будто анализирует сигнал, когда я по нему пальцем вожу? :D
Можете, конечно и Процессинг использовать, но если никогда не пользовались, то и не нужно пока что. Задача другая. Впрочем дело Ваше.
Размеры стартового, нуля и единицы - откуда ноги растут?
Результаты прыгают. Было бы интересно схему подключения посмотреть. Я с помехами не сталкивался.
И еще, частота работы применика и передатчика влияет на чувствительность (в смысле частоты должны быть одинаковыми, тогда и сигнал лучше ловится и т.п.). Хотя всё равно не понятно какая частота передатчика.
А пока что то варится, я проанализирую данные из #4 поста, там много интересного.
Итак,
1. Посылка из 52 изменений сигнала (примерно).
2. Начало из двух изменений по 2мс.
3. Видно, что изменения сигнала происходят с периодом 250-400 мкс и 650-700мкс.
4. Значит граница между 0 и 1 около 500-550мкс
Подсказали правильно, если есть кнопки, то нужно начинать с кнопок. И, всё таки, пока нужно остановиться на IRrecvDump, потому что оттуда много что можно выудить. Кнопки на пульте есть? Данные выводятся при нажатии? Тогда результат в студию! :)
А вообще по имени Вашего вертолета можно найти море материала: SYMA S107 (GYRO 109) или типа того
http://www.rcgroups.com/forums/showthread.php?t=1417249&page=3
http://www.rcgroups.com/forums/showthread.php?t=1231421&page=7#post15217261
http://www.rcgroups.com/forums/showthread.php?t=1417249&page=3
Народ даже копал протоколы обмена и там написано какие биты за что отвечают, поищите, может найдете. Если можно добраться до платы, нужно списать с неё номер (я искал по S107R3) и по нему искать. Можно немало найти. Поищите.
Ответы по порядку. Ноги значений растут из примера описанного в ссылке выше. Правда возможно это не верно все. Результаты очень изменчивы.
Схема подключения прямая, только питание через сопротивление 220 Ом. Пробовал без сопротивления, разницы не заметил.
Частоты неизвестны.
Кнопок нет, только 2 рычага
По имени вертолета поискать не догадался, искал по вертолетам в общем IR RC. Нужно будет порыться.
Вот такие пироги, спасибо за ссылки. Поковыряюсь, может тоже что найду еще. С процессингом, думал, что уже близко к решению, оказалось что нет :D