Вертолетный ИК пульт и ардуино

4er
Offline
Зарегистрирован: 14.10.2013

Добрый день. Возник такой вот, возможно глупый вопрос, а точнее проблема. Дома есть пульт управления вертолетом, работает с помощью ИК. Так же есть ИК датчик подключенный к ардуине. Использовал библиотеку IRremote, пытался сделать определение сигналов с пульта на ардуино. Сигнал определяется и в Serial пишется. Но.

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

Есть ли возможность разобрать сигнал на эти 4 байта на 4 числа в формате 0-254?

Собственно статья с информацией о сигнале с пульта: http://habrahabr.ru/post/189248/

Либо если такой возможности нет, то направьте в нужное русло, пожалуйста. Очень хочется прикрутить этот пульт управления.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В чем именно проблема? Конкретно. Можно по порядку, а не всё сразу.

IRremote определил протокол? Или говорит, что Unknown? Что он выдает в Serial?

В статье разобрано, какой байт за что отвечает. Что там непонятного? У Вас не так?

По порядку - это так:

1. Определить, понимает ли IRremote данные с пульта.

2. Если не понимает, написать свой "распознаватель" протокола, благо в статье по ссылке он расписан.

Разобрать на байты - это самое простое. Сначала протокол.

 

4er
Offline
Зарегистрирован: 14.10.2013

Прошу прощения, я просто только учусь с этим делом.

Собственно по порядку. 

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

Если Вы можете объяснить, какие действия мне необходимо сделать или дать ссылку на необходимую информацию я буду очень благодарен.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я не совсем Вас понял. Я бы сделал так:

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
Offline
Зарегистрирован: 14.10.2013

Собственно дошло время до опыта. Вот выдача в мониторе 

751F0B37
Unknown encoding: 751F0B37 (32 bits)
Raw (52): -15516 2050 -1900 300 -300 300 -700 300 -300 300 -700 300 -300 300 -300 300 -300 300 -300 300 -250 350 -250 350 -650 350 -650 300 -700 300 -700 350 -650 300 -650 400 -200 350 -300 300 -250 350 -250 350 -650 300 -300 300 -700 300 -700 300 
1B4F6A07
Unknown encoding: 1B4F6A07 (32 bits)
Raw (52): -29414 2000 -1950 350 -300 300 -650 350 -250 300 -700 300 -300 300 -300 300 -300 300 -300 300 -250 350 -250 350 -650 350 -650 350 -650 350 -650 350 -650 350 -650 350 -250 300 -300 300 -300 300 -700 300 -300 300 -700 300 -300 300 -700 300 
D7ABB0A4
Unknown encoding: D7ABB0A4 (32 bits)
Raw (52): -30264 1950 -2000 300 -250 350 -300 300 -700 300 -700 300 -650 350 -650 300 -700 300 -700 300 -300 300 -300 300 -700 300 -700 300 -700 300 -700 300 -650 300 -700 350 -250 300 -300 300 -300 300 -300 300 -300 300 -300 300 -300 300 -300 300 
77C92C99

Эта выдача происходит при нажатии на рычаг газа. Собственно судя по данным, сигнал передается только при использовании этого рычага, все остальные рычаги только изменяют передаваемое значение. На мой взгляд число совсем рандомные и как из них вытащить данные непонятно.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Кажется меня пробило на поговорить (дохтур, твои таблетки от жадности работают! :) 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МГц кварц, потому, скорей всего придется пересчитывать. Но это не страшно.

 

4er
Offline
Зарегистрирован: 14.10.2013

Спасибо, что так помогаете разобраться мне с моей проблеймой. Попробовать с этой библиотекой смогу только завтра вечером.

По поводу пульта. У меня он вот такой http://rc-go.ru/images/data/gallery/big_S107-21.jpg

Левый рычаг с помощью пружины тянется вниз, собственно код выше был, когда я пытался его поднять. По поводу передается/не передается сигнал. Если двигать только правый рычаг, менять направление, то ИК сигнала нет, он появляется только когда нажимаешь еще и левый. Если держать левый в максимальном положении, то код почти одинаковый идет, и при этом начать смещать правый джойстик, то коды будут снова меняться, так что запускает сигнал только левый рычаг, но сигналом передается состояние обоих.

Ардуино - Arduino UNO R3. По поводу частоты кварца тяжело сказать что-то.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Uno - уже проще. Если посмотрите в файл hardware/arduino/boards.txt, то там можно посмотреть частоту работы МК, смотрим и видим:

uno.build.f_cpu=16000000L

т.е. частот 16МГц, что вдвое больше, чем в указанной строке. Значит нужно увеличить константы примерно в два раза. Для начал можно и точно в два раза увеличить, если особо не копаться.

Как идут коды - немного странно, но это пока не так важно. Либо проблема пульта, либо непонимание работы. Пока можно не париться.

И так, навскидку, адаптировать исходник под ArduinoIDE, поскольку автор использовал Atmel Studio или типа того, а у нас main отсутствует, если только setup & loop. Плюс нам нужно выдавать коды в Serial, а не на LCD. И второе - пересчитать коэффиценты и делитель для таймера. Но это уже только завтра вечером. Можете попробовать увеличить IrPulseThershold=9 и TimerReloadValue=150 в два раза, для начала, но работать, скорей всего не будет.

 

4er
Offline
Зарегистрирован: 14.10.2013

И еще раз спасибо. Таким образом после всех этих манипулиций, что я должен получить в итоге? Как понять, что оно работает? :D

Нашел еще одну интересную статью. http://trandi.wordpress.com/2009/09/20/arduino-processing-helicopter-ir-remote/ Думаю это лучше будет попробовать прикрутить и доработать. Возможно что-то и получится

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Достаточно просто, при нажатии на определенный рычаг/кнопку, коды дложны меняться не хаотично, а примерно одинаково.

Более того, при использовании определенных рычагов, должны меняться только определенные байты (см. Вашу ссылку http://habrahabr.ru/post/189248/). Чтобы было удобно, данные лучше выводить в Serial Monitor в HEX виде, там должно быть явно видно в каком байте меняется информация. Повторюсь, подсчитать смогу только завтра, сегодня уже котелок не варит :)

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

рычаги не крутить, проверять приём кнопок

4er
Offline
Зарегистрирован: 14.10.2013

Собственно используя вот эту статью http://trandi.wordpress.com/2009/09/20/arduino-processing-helicopter-ir-remote/ Удалось достигнуть частичных успехов.

Он там делает через связку Processing и Arduino. Собственно эта связка работать никак не хочет. Все запускается, но в лог данные не выводятся. Если же судить по первому шагу его, то в моем случае данные немного другие и даже в статье на хабре данные так же другие. Видимо вертолетик похож, да сигналы все-равно разные.

В моем случае похоже, что стартовый сигнал около 1700,  0 это 100мкс, 1 - 200мкс.

Хотя опять же результаты очень прыгают.  А может ли это быть из-за IR приемника? Это нормально, что он пишет лог, как будто анализирует сигнал, когда я по нему пальцем вожу? :D

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Можете, конечно и Процессинг использовать, но если никогда не пользовались, то и не нужно пока что. Задача другая. Впрочем дело Ваше.

Размеры стартового, нуля и единицы - откуда ноги растут?

Результаты прыгают. Было бы интересно схему подключения посмотреть. Я с помехами не сталкивался.

И еще, частота работы применика и передатчика влияет на чувствительность (в смысле частоты должны быть одинаковыми, тогда и сигнал лучше ловится и т.п.). Хотя всё равно не понятно какая частота передатчика.

А пока что то варится, я проанализирую данные из #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) и по нему искать. Можно немало найти. Поищите.

 

4er
Offline
Зарегистрирован: 14.10.2013

Ответы по порядку. Ноги значений растут из примера описанного в ссылке выше. Правда возможно это не верно все. Результаты очень изменчивы.

Схема подключения прямая, только питание через сопротивление 220 Ом. Пробовал без сопротивления, разницы не заметил.

Частоты неизвестны.

Кнопок нет, только 2 рычага

По имени вертолета поискать не догадался, искал по вертолетам в общем IR RC. Нужно будет порыться. 

Вот такие пироги, спасибо за ссылки. Поковыряюсь, может тоже что найду еще. С процессингом, думал, что уже близко к решению, оказалось что нет :D