Восстановление вертолета.

valekoiv
Offline
Зарегистрирован: 20.06.2013

Всем привет.

Решил восстановить свой старый вертолет и дополнительно доработать его с помощью arduino.

Вертолет walkera v400d02. На нем стояли коллекторные двигатели, которые часто горели...после чего и погорел регулятор. Решил сделать бесколлекторную систему, но проблема начала только расти. выход на регулятор из приемника выдавал не такой же сигнал как и на сервы(в том числе и регуляторы для бк двигателей). конвертеры сигнала стоят дорого, да и не все нормально работают с этим приемником.

с помощью pulseln() читаю длительность импульсов(то что мне нужно) со всех нормальных выходов, а вот на управление основным и хвостовым роторм не читается.

цитата с модельного форума:

"смотрел осциллографом форматы выходных сигналов на разъёмах приемника. На разъёмах для серво формат сигналов: прямоугольный импульс амплитудой 5 вольт, длительность от 1 до 2 миллисекунд, частота повторения 60Гц. Стандартный протокол для серво 50Гц, навороченные вроде до 300Гц тянут. Вроде как все текущие регуляторы для двигателей имеют протокол управления такой же как у серво. На валкировском приемнике таких каналов только 3 (для управления тарелкой). Канал управления хвостовым мотором имеет выходной сигнал с частотой повторения 2000Гц и скважностью от 0 до 100% (длительность импульса делить на длительность периода). А на главный ротор частота ШИМ 1000Гц (если уже память не изменяет). Т.е. валкеровцы сэкономили на микроконтроллере (который пересчитывает серво протокол в выходной ШИМ сигнал) в драйвере двигателя и гонят этот сигнал напрямую с приёмника в упрощённый драйвер, который является, по сути, силовым повторителем и, соответственно, не может использоваться отдельно от валкеровского приемника"

 

как мне хоть как-то опознать сигнал с приемника??? Он сделан на atmege вроде 128.

maksim
Offline
Зарегистрирован: 12.02.2012
valekoiv
Offline
Зарегистрирован: 20.06.2013

Я же написал что эта команда не читает почему-то.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну так кто кроме вас знает как вы пользуетесь этой функцией и почему она у вас не читает... может на  этом сайте знают.

valekoiv
Offline
Зарегистрирован: 20.06.2013

Я смотрю умник тут есть. Я прошу помощи разобраться в чем причина. И если внимательнее прочитать первый пост, то там видно что с других каналов читает а с этих нет. Зарегился здесь чтобы люди помогли, а не какие-то недоумники писали хрень какую-то. Ввместо того чтобы гадить здесь лучше бы помогли великий гуру.

maksim
Offline
Зарегистрирован: 12.02.2012

"Уважаемые товарищи ученые, у меня в подвале стук. Объясните, пожалуйста, причину этого стука"

valekoiv
Offline
Зарегистрирован: 20.06.2013

Вас если жизнь обидела, не отыгрывайтесь на других. Проходите мимо и не срите. Если я что-то не подробно рассказал, то спросите.

maksim
Offline
Зарегистрирован: 12.02.2012

Гадите пока здесь только вы.

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

Потому как фраза "не читается" может означать все что угодно.

valekoiv
Offline
Зарегистрирован: 20.06.2013

Внимательней прочитайте первый пост. Програмно проблемы нет. Возможно она аппаратная. Так же может понять что я спрашиваю альтернативные способы чтения сигнала. Форум - это обсуждения чего либо с людьми, а не с дикарями вроде вас. Если б ф был все знающий нахер бы здесь не зарегистрировался.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну так видите, вы сами уже решили в чем у вас проблема, так зачем действительно вы здесь зарегистрировались? Пообщаться о том о сем? Если вы так уверены в чем у вас проблема и не желаете посвещать других в подробности, то чем вам кто-то может помочь? В этом случае на каком сайте зарегитрироваться я уже написал выше.

valekoiv
Offline
Зарегистрирован: 20.06.2013

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

Otheral
Offline
Зарегистрирован: 22.10.2012

Если вы намеков не поняли, МОЖЕТ КОД ПОКАЖИТЕ, ЧТОБЫ ЛЮДИ ПОГЛЯДЕЛИ ЕГО И СКАЗАЛИ, ЕСТЬ ПРОБЛЕМЫ В НЕМ ИЛИ НЕТ? А ПОТОМ УЖЕ БУДИТЕ ПРОВЕРЯТЬ ЖЕЛЕЗО. Это вполне по существу...

maksim
Offline
Зарегистрирован: 12.02.2012

Вот видите люди - не дикари вам уже вопросы начинают задавать. За одно можете описать как и куда вы подключаете дуину к приемнику.

valekoiv
Offline
Зарегистрирован: 20.06.2013

В данный момент не а компьютера. Завтра покажу. Он очень простой-измеряю импульс и вывожу его пока через сом порт на монитор. Я же уже написал что с портов по 50 гц вижу длину импульса. С двух которые по 1000 ну и 2000 ну не вижу. Какие проблемы могут быть с кодом??? Там все просто! Но завтра как обещал выложу, если вам это что-то даст.

valekoiv
Offline
Зарегистрирован: 20.06.2013

Для образца взял код из ссылки 2 поста. На тот порт что там по умолчанию подключаю от приемника тот пин по которомуидет сигнал. + - с ардуино нано общий.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну вот уже что то.

valekoiv пишет:
+ - с ардуино нано общий.
это перефразируйте/расшифруйте.

А так что происходит? 

int pin = 7;

void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
  digitalWrite(pin, 1);
}

void loop()
{
  Serial.println(pulseIn(pin, HIGH, 1000));
}

 

valekoiv
Offline
Зарегистрирован: 20.06.2013

Сейчас с компа зайду посмотрю.

valekoiv
Offline
Зарегистрирован: 20.06.2013

maksim пишет:

это перефразируйте/расшифруйте.

 

у меня Ардуино нано. питается в данном случае от 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 герцовых не читает.

maksim
Offline
Зарегистрирован: 12.02.2012

А при скольки процентах скважности вы проверяете? Или прогоняете от 0 до 100% ? 

 Serial.println(pulseIn(pin, LOW, 2000));

valekoiv
Offline
Зарегистрирован: 20.06.2013

прогоняю от нуля до ста.

а этот вариант попробую когда домой приеду.

Кстати, ваш вариант наверное и не читал из-за ожидания импулься 1000, ведь импульс в среднем занчении примерно 1500. Вот только по логике с 1000 Гц выхода должен был прочитать.

maksim
Offline
Зарегистрирован: 12.02.2012

Следующим шагом убираете строку digitalWrite(pin, 1); и ставите подтягивающий резистор к земле - то есть резистор номиналом от 5 до 50 кОм между 7 выводом и GND. 

И ,кстати, а вы уверены что сигнал вообще до дуины доходит? Вы осцилографом пробовали смотреть сигнал на выводах дуины, а не приемника, при этом и землю осцилографа подцеплять тоже к дуине. Амплитуда сигнала нормальная от 0 до 5 вольт?

valekoiv
Offline
Зарегистрирован: 20.06.2013

это все буду пробовать вечером.

по поводу сигнала:

когда отсоединяю перемычку от приемника то на мониторе порта сразу всякая разнообразная числовая фигня бежит.А как только возвращаю сразу ноль на мониторе появлятся с периодичностью заданной в pulseIn().Соответственно что что-то доходит. 

Осцилографом мерял не я лично, а человек с форума.

Возможно ли такое что перемычка 50 Гц прпускает а 1000 нет?

valekoiv
Offline
Зарегистрирован: 20.06.2013

atmega

1 pin на меге-выход который должен давать 1000 Гц

maksim
Offline
Зарегистрирован: 12.02.2012

Так а вертолет то у вас рабочий? Основной и хвостовые роторы то запускаются? Если нет ,то значит и никакого сигнала с приемника нет. Что за перемычку вы отсоединяете? 

valekoiv
Offline
Зарегистрирован: 20.06.2013

регулятор сгорел из-за замкнуших щеток на двигателе.

Проблема с определением этого сигнала у всех владельцев данного вертолета. многие покупают конвертеры специальные, а работают не у всех. Вот поэтому решил не рисковать и сконвертировать сигнал через ардуино. одна проблема пока - не могу поймать этот сигнал на ардуино.

Ардуинка у меня на макетной плате стоит(breadboard вроде) приемник и остальная элетроника рядом на плотной картоночке. и все это соединено купленными специальными пермычками(проводок изолированный с концами в виде иголок). вечером постораюсь сфоткать.

maksim
Offline
Зарегистрирован: 12.02.2012

Так что ж мы тут "привидений" ловим... Нет у вас там никаких сигналов, вместе с регулятором сгорели и выводы.
Есть очень малюсенький шанс что погорели не ноги МК, а резисторы (? 0 Ом?) на фото их видно, к каждому сигнальному выводу идут. Если же резисторы целые, то однозначно МК.

valekoiv
Offline
Зарегистрирован: 20.06.2013

а простеньким мультиметром реально ли узнать что именно погорело? на регуляторе погорели полевики, из-за них получатся могли погореть и ножки МК?

и могу ли я с помощью колхозного осцилографа на базе аудио карты компа проверить работоспособность ножек МК. просто остальные выходы(те которые на сервы) работают без проблем.

maksim
Offline
Зарегистрирован: 12.02.2012

Конечно реально, обычным мультимитром в режиме вольтметра вы без проблем можете померить сглаженное напряжение ШИМа, но опять таки проверьте сначала эти резистроры или чего там, на фото не видно что это и что на них написано.

valekoiv
Offline
Зарегистрирован: 20.06.2013

вечерний отчет:

-аппаратная часть цела. нашел сгоревший приемник, а он не сгорел)))) погорели провода под корпусом. Полевики целы! врубаю в приемник и вуаля!!! мультиметр на выходе из регулятора показыват напряжение пропорциональное положению стика на передатчике.

прошло 20 мин...

-причиной всего было низкое напряжение на приемнике, хотя очень многие расчитаны на 4.8 В. Этот при 5 от ардуины не работал полноценно, но работал. сейчас запитал приемник от внешнего BEC-а и он спокойно прочитал импульсы. меняется от 0 до 1005.

 

Теперь новая проблемка над которой надо подумать:

при 100% положении стика ШИМ перестает быть ШИМом, т.е. напряжение становится постоянным, вследствие чего на мониторе выскакивает 0, тк импулсов больше нет...

valekoiv
Offline
Зарегистрирован: 20.06.2013

все разобрался как решить все.  Спасибо Максиму за помощь!!! В понедельник все подробно распишу что и как буду делать дальше. нужна будет ваша помощь в написани и оптимизации дальнейшего кода.

а я поехал к теще...

valekoiv
Offline
Зарегистрирован: 20.06.2013

...вернулся. Програмку написал, но сыровата. Для простых полетов использовать можно.

#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 считает длительность импульса, но когда полный газ или стик руддера в крайнее правое положение, то импульс уже не импульс, а постоянное напряжение. соответственно при полном газе мы получаем ноль и на регулятор идет ноль, а вертолет начинает падать. Можно увеличить время ожидания импульса, но тогда зависает второй канал на руддер, а он постоянно корректируется гироскопом. Надеюсь суть проблемы описал. как можно решить эту проблему.

maksim
Offline
Зарегистрирован: 12.02.2012
timpin = pulseIn(tin, HIGH, 2000); // опрос ресивира
if(digitalRead(tin) == HIGH) timpin = 1100;

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну вообще использовать pulseIn для чтения нескольких каналов - IMHO плохая идея. Именно из-за того что он дает задержку, останавливает скетч. Если есть возможность (хватает входов с аппаратным прерыванием) - лучче использовать attachInterrupt, если не хватает - ну значит самому в loop() c помщью digitalRead читать входы. сравнивать с предыдущим состоянием, если поменялось - засекатьв ремя. При следующей поменке - смотреть сколько прошло... ну собственно из этого и делать выводы.

> Надеюсь суть проблемы описал. как можно решить эту проблему.

Банальным здравым смыслом.  Давайте начнем рассуждать. Если пришел 0, что это означает?  Это означает что "импульсов нет". В каких случаях нет импульсов? Когда газ на нуле или на 100%. Как отличить эти случаи (а отличить можно движок же как-то их различает)? Чем они физический отличаются? Тем что при газе на нуле на пине напряжение 0 вольт, а при газе на 100% на пине напряжение 5v. Мы можем как-то узнать какое напряжение на пине?  Ну кончено. digitalRead

Что осталось?  Записать эти рассуждение ввиде кода:

timpin = pulseIn(tin, HIGH); // опрос ресивира
rimpin = pulseIn(rin, HIGH); // опрос ресивира

if(timpin==0 && digitalRead(tin))timpin=1100;
if(rimpin ==0 && digitalRead(rimpin))rimpin =600;

timpout = map(timpin, 0, 1100, 0, 180);
rimpout = map(rimpin, 0, 600, 0, 180);

Все. Никаких особых "сакральных" знаний нам не потребовалось. Рассуждения, if и digitalRead. Что-бы писать скетчи нужно просто "предствить себя на месте контроллера" и посмотреть какие-бы действия делали вы :)

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

timpin = pulseIn(tin, HIGH, 2000); // опрос ресивира
if(digitalRead(tin) == HIGH) timpin = 1100;

 

Не покатит. Голый digitalRead(tin) начнет возвращать HIGH раньше чем газ выйдет на 100%. Вообще может на малых значениях начать срабатывать . Даже при 10% может попасть в момент когда уровень  HIGH.

maksim
Offline
Зарегистрирован: 12.02.2012

Да, digitalRead() очень медленный, аж 2мс и один 0 не дописал:

timpin = pulseIn(tin, HIGH, 20000); // опрос ресивера
leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

Да, digitalRead() очень медленный, аж 2мс

Нет, я имелл ввиду не медленность его, в конце концов на прямое чтение порта можно перейти, а то что читать пин  имеет смысл только на граничных значениях PWM-ма. Во всех остальных случаях информация возращаемая digitalRead ничего не значит и предпринимать на ее основе какие-то действия (вручную переустанавливать timpin) - нельзя.

 

maksim
Offline
Зарегистрирован: 12.02.2012

leshak пишет:

Во всех остальных случаях информация возращаемая digitalRead ничего не значит и предпринимать на ее основе какие-то действия (вручную переустанавливать timpin) - нельзя.

Как это ничего не значит? Если после функции pulseIn() высокий уровень, то это ознаяет что либо уровень всегда высокий, либо успел измениться на высокий с последнего опроса порта в pulseIn() - что в обоих случаях можно определить как максимум ШИМа.

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

leshak пишет:

Во всех остальных случаях информация возращаемая digitalRead ничего не значит и предпринимать на ее основе какие-то действия (вручную переустанавливать timpin) - нельзя.

Как это ничего не значит? Если после функции pulseIn() высокий уровень, то это ознаяет что либо уровень всегда высокий, либо успел измениться на высокий с последнего опроса порта в pulseIn() - что в обоих случаях можно определить как максимум ШИМа.

Ну можно на это понадется. Возможно даже работать будет. Но я бы предпочел перестраховатся. Все-таки смотреть что вернула pulseIn. На высоких частотах, может быть что между pulseIn и digitalRead пробежал еще один импульс? Успело еще раз дернутся в LOW/HIGH? Если такое произойдет, то мы неправомочно определим максимум ШИМа. Не готов сказать какая вероятность (на каких частотах) того что между pulseIn и digitalRead успеет пройти еще один импульс, но как-то спокойней добавить проверочку результата pulseIn на ноль. Да и в коде так более явно видно "что мы тут делаем". Бонусом на один digitalRead меньше будет, без особой надобности. Если будем читать 16-ть каналов, к примеру, то 2ms*16=32ms уже 

maksim
Offline
Зарегистрирован: 12.02.2012

Если вместо digitalRead() всетаки читать порт, то импульс не проскочит, а если и проскочит, то и pulseIn()  будет возвращать 0. Так что если отказаться от digitalRead(), то и проверять что вернула pulseIn() безсмысленно.

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

Если вместо digitalRead() всетаки читать порт, то импульс не проскочит, а если и проскочит, то и pulseIn()  будет возвращать 0. Так что если отказаться от digitalRead(), то и проверять что вернула pulseIn() безсмысленно.

Ладно. Дело вкуса. Мой вкус говорит что digitalRead() нужно делать когда возникла неоднозначность интерпретации pulseIn(). Если неоднозначносте нет - то ничего делать не нужно. Ваш вкус говорит другое - OK :)

В принципе ваш и мой подход даже "различными" назвать трудно :) Скорее "косметические нюансы".

maksim
Offline
Зарегистрирован: 12.02.2012

Так я против вашего подхода ничего не имею, то что с digitalRead() мой подход будет работать некорректно согласен полностью.

valekoiv
Offline
Зарегистрирован: 20.06.2013

спасибо Вам за помощь. Програмку еще вчера поправил, хотел дома проверить но не было времени. Думаю сегодня попробую вечерком оба метода.

valekoiv
Offline
Зарегистрирован: 20.06.2013

сделал по примеру  leshak, но с модификацией. Работает отлично! теперь буду собирать, тестировать и настраивать на вертолете. но это в течении недели(видео будет).