Восстановление вертолета.
- Войдите на сайт для отправки комментариев
Всем привет.
Решил восстановить свой старый вертолет и дополнительно доработать его с помощью arduino.
Вертолет walkera v400d02. На нем стояли коллекторные двигатели, которые часто горели...после чего и погорел регулятор. Решил сделать бесколлекторную систему, но проблема начала только расти. выход на регулятор из приемника выдавал не такой же сигнал как и на сервы(в том числе и регуляторы для бк двигателей). конвертеры сигнала стоят дорого, да и не все нормально работают с этим приемником.
с помощью pulseln() читаю длительность импульсов(то что мне нужно) со всех нормальных выходов, а вот на управление основным и хвостовым роторм не читается.
цитата с модельного форума:
"смотрел осциллографом форматы выходных сигналов на разъёмах приемника. На разъёмах для серво формат сигналов: прямоугольный импульс амплитудой 5 вольт, длительность от 1 до 2 миллисекунд, частота повторения 60Гц. Стандартный протокол для серво 50Гц, навороченные вроде до 300Гц тянут. Вроде как все текущие регуляторы для двигателей имеют протокол управления такой же как у серво. На валкировском приемнике таких каналов только 3 (для управления тарелкой). Канал управления хвостовым мотором имеет выходной сигнал с частотой повторения 2000Гц и скважностью от 0 до 100% (длительность импульса делить на длительность периода). А на главный ротор частота ШИМ 1000Гц (если уже память не изменяет). Т.е. валкеровцы сэкономили на микроконтроллере (который пересчитывает серво протокол в выходной ШИМ сигнал) в драйвере двигателя и гонят этот сигнал напрямую с приёмника в упрощённый драйвер, который является, по сути, силовым повторителем и, соответственно, не может использоваться отдельно от валкеровского приемника"
как мне хоть как-то опознать сигнал с приемника??? Он сделан на atmege вроде 128.
Я же написал что эта команда не читает почему-то.
Ну так кто кроме вас знает как вы пользуетесь этой функцией и почему она у вас не читает... может на этом сайте знают.
Я смотрю умник тут есть. Я прошу помощи разобраться в чем причина. И если внимательнее прочитать первый пост, то там видно что с других каналов читает а с этих нет. Зарегился здесь чтобы люди помогли, а не какие-то недоумники писали хрень какую-то. Ввместо того чтобы гадить здесь лучше бы помогли великий гуру.
"Уважаемые товарищи ученые, у меня в подвале стук. Объясните, пожалуйста, причину этого стука"
Вас если жизнь обидела, не отыгрывайтесь на других. Проходите мимо и не срите. Если я что-то не подробно рассказал, то спросите.
Гадите пока здесь только вы.
Вот посмотрите пример или пример или пример как нормальные люди задают вопросы, что бы им могли помочь, а прежде чем огрызаться включили бы голову и подумали почему вам так пишут.
Потому как фраза "не читается" может означать все что угодно.
Внимательней прочитайте первый пост. Програмно проблемы нет. Возможно она аппаратная. Так же может понять что я спрашиваю альтернативные способы чтения сигнала. Форум - это обсуждения чего либо с людьми, а не с дикарями вроде вас. Если б ф был все знающий нахер бы здесь не зарегистрировался.
Ну так видите, вы сами уже решили в чем у вас проблема, так зачем действительно вы здесь зарегистрировались? Пообщаться о том о сем? Если вы так уверены в чем у вас проблема и не желаете посвещать других в подробности, то чем вам кто-то может помочь? В этом случае на каком сайте зарегитрироваться я уже написал выше.
Недостаток нормального общения у вас!!! я максимально подробно изложил. И еслибы у нормального человека возникли вопросы-он бы задал адекватные вопросы, учитывая что я новичек. А вы почти сразу хрень пороть стали. Предлагаю дальше общаться по существу темы, если вы на это способны.если не можете то идите к людям, которые задают более развернутые вопросы. И не показывайте свой недостаток общения.
Если вы намеков не поняли, МОЖЕТ КОД ПОКАЖИТЕ, ЧТОБЫ ЛЮДИ ПОГЛЯДЕЛИ ЕГО И СКАЗАЛИ, ЕСТЬ ПРОБЛЕМЫ В НЕМ ИЛИ НЕТ? А ПОТОМ УЖЕ БУДИТЕ ПРОВЕРЯТЬ ЖЕЛЕЗО. Это вполне по существу...
Вот видите люди - не дикари вам уже вопросы начинают задавать. За одно можете описать как и куда вы подключаете дуину к приемнику.
В данный момент не а компьютера. Завтра покажу. Он очень простой-измеряю импульс и вывожу его пока через сом порт на монитор. Я же уже написал что с портов по 50 гц вижу длину импульса. С двух которые по 1000 ну и 2000 ну не вижу. Какие проблемы могут быть с кодом??? Там все просто! Но завтра как обещал выложу, если вам это что-то даст.
Для образца взял код из ссылки 2 поста. На тот порт что там по умолчанию подключаю от приемника тот пин по которомуидет сигнал. + - с ардуино нано общий.
Ну вот уже что то.
А так что происходит?
int pin = 7; void setup() { Serial.begin(9600); pinMode(pin, INPUT); digitalWrite(pin, 1); } void loop() { Serial.println(pulseIn(pin, HIGH, 1000)); }Сейчас с компа зайду посмотрю.
это перефразируйте/расшифруйте.
у меня Ардуино нано. питается в данном случае от usb питание на приемник подаю с ардуино.
с вашим кодом в монитор выдает нули, даже 50 - ти герцовых портов.
int pin = 7; unsigned long duration; void setup() { Serial.begin(9600); pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH); Serial.println(duration); }а вот с этим кодом с 50 ти герцовых читает а с 1000 герцовых не читает.
А при скольки процентах скважности вы проверяете? Или прогоняете от 0 до 100% ?
Serial.println(pulseIn(pin, LOW, 2000));прогоняю от нуля до ста.
а этот вариант попробую когда домой приеду.
Кстати, ваш вариант наверное и не читал из-за ожидания импулься 1000, ведь импульс в среднем занчении примерно 1500. Вот только по логике с 1000 Гц выхода должен был прочитать.
Следующим шагом убираете строку digitalWrite(pin, 1); и ставите подтягивающий резистор к земле - то есть резистор номиналом от 5 до 50 кОм между 7 выводом и GND.
И ,кстати, а вы уверены что сигнал вообще до дуины доходит? Вы осцилографом пробовали смотреть сигнал на выводах дуины, а не приемника, при этом и землю осцилографа подцеплять тоже к дуине. Амплитуда сигнала нормальная от 0 до 5 вольт?
это все буду пробовать вечером.
по поводу сигнала:
когда отсоединяю перемычку от приемника то на мониторе порта сразу всякая разнообразная числовая фигня бежит.А как только возвращаю сразу ноль на мониторе появлятся с периодичностью заданной в pulseIn().Соответственно что что-то доходит.
Осцилографом мерял не я лично, а человек с форума.
Возможно ли такое что перемычка 50 Гц прпускает а 1000 нет?
1 pin на меге-выход который должен давать 1000 Гц
Так а вертолет то у вас рабочий? Основной и хвостовые роторы то запускаются? Если нет ,то значит и никакого сигнала с приемника нет. Что за перемычку вы отсоединяете?
регулятор сгорел из-за замкнуших щеток на двигателе.
Проблема с определением этого сигнала у всех владельцев данного вертолета. многие покупают конвертеры специальные, а работают не у всех. Вот поэтому решил не рисковать и сконвертировать сигнал через ардуино. одна проблема пока - не могу поймать этот сигнал на ардуино.
Ардуинка у меня на макетной плате стоит(breadboard вроде) приемник и остальная элетроника рядом на плотной картоночке. и все это соединено купленными специальными пермычками(проводок изолированный с концами в виде иголок). вечером постораюсь сфоткать.
Так что ж мы тут "привидений" ловим... Нет у вас там никаких сигналов, вместе с регулятором сгорели и выводы.
Есть очень малюсенький шанс что погорели не ноги МК, а резисторы (? 0 Ом?) на фото их видно, к каждому сигнальному выводу идут. Если же резисторы целые, то однозначно МК.
а простеньким мультиметром реально ли узнать что именно погорело? на регуляторе погорели полевики, из-за них получатся могли погореть и ножки МК?
и могу ли я с помощью колхозного осцилографа на базе аудио карты компа проверить работоспособность ножек МК. просто остальные выходы(те которые на сервы) работают без проблем.
Конечно реально, обычным мультимитром в режиме вольтметра вы без проблем можете померить сглаженное напряжение ШИМа, но опять таки проверьте сначала эти резистроры или чего там, на фото не видно что это и что на них написано.
вечерний отчет:
-аппаратная часть цела. нашел сгоревший приемник, а он не сгорел)))) погорели провода под корпусом. Полевики целы! врубаю в приемник и вуаля!!! мультиметр на выходе из регулятора показыват напряжение пропорциональное положению стика на передатчике.
прошло 20 мин...
-причиной всего было низкое напряжение на приемнике, хотя очень многие расчитаны на 4.8 В. Этот при 5 от ардуины не работал полноценно, но работал. сейчас запитал приемник от внешнего BEC-а и он спокойно прочитал импульсы. меняется от 0 до 1005.
Теперь новая проблемка над которой надо подумать:
при 100% положении стика ШИМ перестает быть ШИМом, т.е. напряжение становится постоянным, вследствие чего на мониторе выскакивает 0, тк импулсов больше нет...
все разобрался как решить все. Спасибо Максиму за помощь!!! В понедельник все подробно распишу что и как буду делать дальше. нужна будет ваша помощь в написани и оптимизации дальнейшего кода.
а я поехал к теще...
...вернулся. Програмку написал, но сыровата. Для простых полетов использовать можно.
#include <Servo.h> unsigned int tin = 5; // пин тротла из ресвира unsigned int tout = 6; // пин на регулятор основного ротора (еротла) unsigned int rin = 7; // пин руддера из ресивира unsigned int rout = 8; // пин на регулятор хвостового (рудера) unsigned int timpin; // thr impuls in unsigned int timpout; unsigned int rimpin; // rudder impuse in unsigned int rimpout; Servo tesc; // регулятор основного ротора Servo resc; // регулятор хвостового ротора void setup() { Serial.begin(9600); //для мониторинга и отладки pinMode(tin, INPUT); pinMode(rin, INPUT); pinMode(tout, OUTPUT); pinMode(rout, OUTPUT); tesc.attach(tout); resc.attach(rout); } void loop() { timpin = pulseIn(tin, HIGH); // опрос ресивира rimpin = pulseIn(rin, HIGH); // опрос ресивира timpout = map(timpin, 0, 1100, 0, 180); rimpout = map(rimpin, 0, 600, 0, 180); tesc.write(timpout); // вывод сигнала на регуляторы resc.write(rimpout); //для мониторинга и отладки Serial.print("in thr= "); Serial.print(timpin); Serial.print(" in rudder= "); Serial.print(rimpin); Serial.print(" out thr = "); Serial.print(timpout); Serial.print(" out rudder = "); Serial.println(rimpout); }теперь о проблеме!
-pulseIn считает длительность импульса, но когда полный газ или стик руддера в крайнее правое положение, то импульс уже не импульс, а постоянное напряжение. соответственно при полном газе мы получаем ноль и на регулятор идет ноль, а вертолет начинает падать. Можно увеличить время ожидания импульса, но тогда зависает второй канал на руддер, а он постоянно корректируется гироскопом. Надеюсь суть проблемы описал. как можно решить эту проблему.
Ну вообще использовать pulseIn для чтения нескольких каналов - IMHO плохая идея. Именно из-за того что он дает задержку, останавливает скетч. Если есть возможность (хватает входов с аппаратным прерыванием) - лучче использовать attachInterrupt, если не хватает - ну значит самому в loop() c помщью digitalRead читать входы. сравнивать с предыдущим состоянием, если поменялось - засекатьв ремя. При следующей поменке - смотреть сколько прошло... ну собственно из этого и делать выводы.
> Надеюсь суть проблемы описал. как можно решить эту проблему.
Банальным здравым смыслом. Давайте начнем рассуждать. Если пришел 0, что это означает? Это означает что "импульсов нет". В каких случаях нет импульсов? Когда газ на нуле или на 100%. Как отличить эти случаи (а отличить можно движок же как-то их различает)? Чем они физический отличаются? Тем что при газе на нуле на пине напряжение 0 вольт, а при газе на 100% на пине напряжение 5v. Мы можем как-то узнать какое напряжение на пине? Ну кончено. digitalRead
Что осталось? Записать эти рассуждение ввиде кода:
Все. Никаких особых "сакральных" знаний нам не потребовалось. Рассуждения, if и digitalRead. Что-бы писать скетчи нужно просто "предствить себя на месте контроллера" и посмотреть какие-бы действия делали вы :)
Не покатит. Голый digitalRead(tin) начнет возвращать HIGH раньше чем газ выйдет на 100%. Вообще может на малых значениях начать срабатывать . Даже при 10% может попасть в момент когда уровень HIGH.
Да, digitalRead() очень медленный, аж 2мс и один 0 не дописал:
Да, digitalRead() очень медленный, аж 2мс
Нет, я имелл ввиду не медленность его, в конце концов на прямое чтение порта можно перейти, а то что читать пин имеет смысл только на граничных значениях PWM-ма. Во всех остальных случаях информация возращаемая digitalRead ничего не значит и предпринимать на ее основе какие-то действия (вручную переустанавливать timpin) - нельзя.
Во всех остальных случаях информация возращаемая digitalRead ничего не значит и предпринимать на ее основе какие-то действия (вручную переустанавливать timpin) - нельзя.
Во всех остальных случаях информация возращаемая digitalRead ничего не значит и предпринимать на ее основе какие-то действия (вручную переустанавливать timpin) - нельзя.
Ну можно на это понадется. Возможно даже работать будет. Но я бы предпочел перестраховатся. Все-таки смотреть что вернула pulseIn. На высоких частотах, может быть что между pulseIn и digitalRead пробежал еще один импульс? Успело еще раз дернутся в LOW/HIGH? Если такое произойдет, то мы неправомочно определим максимум ШИМа. Не готов сказать какая вероятность (на каких частотах) того что между pulseIn и digitalRead успеет пройти еще один импульс, но как-то спокойней добавить проверочку результата pulseIn на ноль. Да и в коде так более явно видно "что мы тут делаем". Бонусом на один digitalRead меньше будет, без особой надобности. Если будем читать 16-ть каналов, к примеру, то 2ms*16=32ms уже
Если вместо digitalRead() всетаки читать порт, то импульс не проскочит, а если и проскочит, то и pulseIn() будет возвращать 0. Так что если отказаться от digitalRead(), то и проверять что вернула pulseIn() безсмысленно.
Если вместо digitalRead() всетаки читать порт, то импульс не проскочит, а если и проскочит, то и pulseIn() будет возвращать 0. Так что если отказаться от digitalRead(), то и проверять что вернула pulseIn() безсмысленно.
Ладно. Дело вкуса. Мой вкус говорит что digitalRead() нужно делать когда возникла неоднозначность интерпретации pulseIn(). Если неоднозначносте нет - то ничего делать не нужно. Ваш вкус говорит другое - OK :)
В принципе ваш и мой подход даже "различными" назвать трудно :) Скорее "косметические нюансы".
Так я против вашего подхода ничего не имею, то что с digitalRead() мой подход будет работать некорректно согласен полностью.
спасибо Вам за помощь. Програмку еще вчера поправил, хотел дома проверить но не было времени. Думаю сегодня попробую вечерком оба метода.
сделал по примеру leshak, но с модификацией. Работает отлично! теперь буду собирать, тестировать и настраивать на вертолете. но это в течении недели(видео будет).