arduino + RC пульт + 2 мотора. Нужна помощь.
- Войдите на сайт для отправки комментариев
Пролистал половину форума, но не смог найти ответа. Помогите пожалуйста.
У меня есть RC пульт дистанционного управления для моделизма. Вот такой:
http://www.hobbyking.com/hobbyking/store/__9042__Hobby_King_2_4Ghz_6Ch_Tx_Rx_V2_Mode_2_.html
на выходе его приемника имеется шим сигнал. И есть кораблик с двумя коллекторными электромоторами, по краям (обеспечивающие по мимо тяги еще и руление).
Хочу поставить на кораблик ардуину и завязать все радиоуправление через нее. Подскажите возможен ли такой вариант?
Спаять драйвера и все подключить не проблема. Вопрос в том как это запрограммировать? Необходио обеспечить вращение двигателей в разных направлениях что бы реализовать раздрай (одновременное вращение двигателей в разных направлениях для резкого разворота)
Заранее примногоблагодарен!
Да. Возможно.
Вам нужно раздробить задачу и искать решение отдельно.
1. Декодировать приходящий ШИМ. Для этого сначала выяснить что же выдает вам приемник PPM или PWM. По одному проводку все каналы он выдает или шесть имеет шесть выходов и на каждом свой ШИМ?
2. Научится рулить моторома с помощью какого-нибудь motor -шилда или ESC (чем там ваши моторы рулятся) - это точно должно легко выгугливаться
3. Соединить первое и второе. Возможно при этом внося какие-то корректировки в то что "прочитали от приемника" перед тем как выдать команду на моторы (к примеру "газ меньше 50% - это на самом деле "задний ход") и т.п.
Вообщем начинать нужно с того что-бы научится читать что-там выдает приемник. Либо искать библиотеки, либо самому с помощью attachInterrupt и т.п.
Искать описание/характериситки/библиотеке того что выдает приемник - лучше на всяких авио/квадрокоптерных ресурсах. Они этим постоянно занимаются. ArduPilot всякие и т.п.
Да. Возможно.
Вам нужно раздробить задачу и искать решение отдельно.
1. Декодировать приходящий ШИМ. Для этого сначала выяснить что же выдает вам приемник PPM или PWM. По одному проводку все каналы он выдает или шесть имеет шесть выходов и на каждом свой ШИМ?
2. Научится рулить моторома с помощью какого-нибудь motor -шилда или ESC (чем там ваши моторы рулятся) - это точно должно легко выгугливаться
3. Соединить первое и второе. Возможно при этом внося какие-то корректировки в то что "прочитали от приемника" перед тем как выдать команду на моторы (к примеру "газ меньше 50% - это на самом деле "задний ход") и т.п.
Вообщем начинать нужно с того что-бы научится читать что-там выдает приемник. Либо искать библиотеки, либо самому с помощью attachInterrupt и т.п.
Искать описание/характериситки/библиотеке того что выдает приемник - лучше на всяких авио/квадрокоптерных ресурсах. Они этим постоянно занимаются. ArduPilot всякие и т.п.
1. имеет шесть выходов и на каждом свой ШИМ
Спасибо за ответ и нужное направление! буду искать.
>имеет шесть выходов и на каждом свой ШИМ
Годик назад, вроде в ArduPilot проекте видел что-то готовое. У них там, кроме основного контроллера, ставился еще дополнительная atmega которая как раз этим и занималась. Брала у приемника много шимов, декодила их и гнала на основной полетный контроллер в виде PPM (по одному проводку). Вообщем-то нужно там в исходинаках искать прошивку именно этого "вспомогательного" камня. КАк-то PPM_Encoder Оно называлось или что-то подобное.
Моежет еще погуглить что-то типа "Servo decode". На самом-то деле приемник выдает не pwm не как analogWrite, а как библиотека Servo . Возможно с этой стороны что-то выгуглится.
Ну или самому, ручками ловить/декодить (на самом деле звучит страшней чем сделать) :)
Тут подумалось, что самый маленький первый шаг, можно сделать даже не сильно залазя в дебри.
Попробовать прочитать, для старта, хотя-бы один канал с помощью pulseIn просто в loop() читатать и выводить в Serial какая там длина импульса, дергая газ на пульте смотреть что меняется в Serial.
Для чтения нескольких каналов и повышения точности, скорее всего прийдется все-таки на использование таймеров переходить...
А может получится и для двух каналов pulseIn использовать. Типа на при четных проходах loop() делать pulseIn на одном пине, на нечетных - на другом. Учитывая что у вас не авио и милисекундные задержки не важны - возможно и такого хватит.
Большое спасибо!
К выходным вернусь из командировки, попробую.
Очень хочется что бы все получилось. Тогда можно было бы и добавить дополнительный функционал в виде автопилота по GPS
Можно, все можно.... только
1. Вам до автопилота еще долго "пилить и пилить". Это в теории все просто, а на практике - тут тебе и с шумом боросться, и инерционность руля сделать, и правильно инициализировать ESC и т.д. и т.п.
2. В автопилоте и с EEPROM разобратся, и что такое PID, и вспомнить векторную алгребру, и логгирование добавить для "разбора полетов", борьбу с "выбросами" GPS-са в сторону. Да банально... настроить среду/эмуляцию GPS-са и лодки. Что-бы можно было делать "тестовые заплывы на столе", отлажить код (не в воде-же с ноутом за ним гонятся что-бы выяснить "какого хрена он поплыл не туда"), подружить с софтом который позволяет "маршруты задавать на карте" и т.п. и т.д.
Вообщем-то все это не "синхрофазатрон строить", Энштейном быть не нужно, сверх-программером - тоже. Но "объем возявкания" - таки основательный. За пару вечеров - это не сделаешь. Вообщем - серьезный проект, а не "небольшой доп. функционал".
Но вполне реальный. Я могу 100% это сказать. Мой первый проект "под заказ на ардуино", как раз и был - лодка которая может либо с пульта управлятся, либо по маршруту с SD карты, либо "патрулировать точку" (когда ветер сносит - возвращатся к заранее заданной точке и "засыпать").
Кстати, что-то смутно припоминается, что там ребят которые делали ArduPilot, было еще пара "родственных проектов". Там семейство: для самолетов, для коптера.... в том числе и вроде что-то типа ArduBoat было. Возможно просто взять их проект за основу и "подпилить под себя". Но даже в этом случае похмурить мозг помедитировать на чужой код - все-таки прийдется :)
Вы абсолютно правы, просто только в теории.
Спасибо за интересную мысль "тестовые заплывы на столе", действительно без этого будет проблемно отладить.
А Ваш первый проект с лодкой был успешный?
Спасибо за интересную мысль "тестовые заплывы на столе", действительно без этого будет проблемно отладить.
Да. Вообщем-то создание какой-то воспроизводимой среды тестирования - это часто занимает даже больше 50% работы чем сам код. Но... без этого частно основной код трудно написать качественно, а иногда и вообще никак не написать.
Но вот "продать" это время - очень трудно. Так как это то что не видно в конечном продукте. Типа "ну что там такого - плыть по GPS". А ведь для отладки - нужно что-бы был точно повторяемый маршрут. Один в один. На реальном железе - такого не добится.
Да и маршруты - руками координаты из гугла срисовывать - запыхаешься. Значит либо какой-то софт для редактирвания писать, либо смотреть на сущетсвующие и с их форматом разбиратся (благо иногда очень простой).
А Ваш первый проект с лодкой был успешный?
А как же :) По крайней мере потом этот же клиент еще заказывал другие проекты. Это же был первый "под заказ на ардуино". Но далеко не первый "под заказ" и не первый "на ардуино".
Предвидя вопрос: нет. к сожалению исходниками поделится не могу. не моя собственность.
Но я выше уже упоминал опен-сорсные проекты от которых можно отталкиватся.
leshak спасибо за ответы. Читаю и добавить нечего, надо начинать пробовать.
Предвидя вопрос: нет. к сожалению исходниками поделится не могу. не моя собственность.
Но я выше уже упоминал опен-сорсные проекты от которых можно отталкиватся.
На чужую собственность не претендую. Буду пытаться прошаривать сам.
Спасибо за то что указали нужное направление, это тоже многого стоит. Потому как сразу вникнуть в что то для себя новое порой проблематично. Недавно освоил программирование рефов (релейная защита подстанций) язык программирования типо степ5, надеюсь и ардуину освою. Главное начать! :)
За любую дополнительную информацию попрежнему буду примного благодарен!
Тут подумалось, что самый маленький первый шаг, можно сделать даже не сильно залазя в дебри.
Попробовать прочитать, для старта, хотя-бы один канал с помощью pulseIn просто в loop() читатать и выводить в Serial какая там длина импульса, дергая газ на пульте смотреть что меняется в Serial.
Для чтения нескольких каналов и повышения точности, скорее всего прийдется все-таки на использование таймеров переходить...
А может получится и для двух каналов pulseIn использовать. Типа на при четных проходах loop() делать pulseIn на одном пине, на нечетных - на другом. Учитывая что у вас не авио и милисекундные задержки не важны - возможно и такого хватит.
А не подскажите как это делается с использованием таймеров...ну общие принципы так сказать....чтоб не сильно в дебризалазить?