Re: Управление сервоприводом.
Наконец добрался к паяльнику.
Запустил переделанный скетч под свою мегу
PHP код:
unsigned char Byte_Port;
void setup()
{
for (int i=22; i < 30; i++) pinMode(i, INPUT);
for (int i=37; i > 30; i--) pinMode(i, OUTPUT);
}
void loop()
{
PORTC = PINA;
}
И даже тут немного подергивается серва, а когда напрямую к приемнику , то как вкопанная.
Попробовал такой вариант.
PHP код:
unsigned char Byte_Port;
void setup()
{
for (int i=22; i < 30; i++) pinMode(i, INPUT);
for (int i=37; i > 30; i--) pinMode(i, OUTPUT);
}
void loop()
{
int Sens = analogRead(16);
PORTC = PINA;
}
Задергалась сильнее, чем в прошлом варианте.
Забраковал и pulseIn, так как там из 10 подряд значений длительности ни одного не повторилось, хотя болтались в пределах 1493 - 1505.
Re: Управление сервоприводом.
pulseIn я давно не использую, проблемная фунция
Дергается потому что идут небольшие задержки на выполнение команд.
Если написать на асемблере то возможно что выполнятся будет быстрее
Re: Управление сервоприводом.
Приторможу я пока с контролем над сервами. Не знаком я с ассемблером, но все равно думаю и там будет проблемно реализовать этот принцип, так как если не синхронизировано опрашивать порты, то обязательно упустим приход начала или конца импульса.
Тогда второй вопрос, а что еще можно попробовать?
Функцией attachInterrupt() на меге не более 6 каналов, это ладно, буду контролировать 6 каналов, но в описании написано:
Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются. Возможна потеря данный передаваемых по последовательному соединению (Serial data) в момент выполнения функции обработки прерывания.
Может если нет вариантов, то использовать pulseIn, но тогда нужно придумать серьезное усреднение этих данных, по большому счету мне 10-20 стабильных значений достаточно. Пробовал использовать функцию map(pulseIn(), 1000, 2000, 0, 10) - нормально, при плавном перемещении джойстика серва ступенями занимает свое положение, но в переходных зонах все равно болтается.
Отсюда третий вопрос, подскажите механизм усреднения, аппроксимирации? Вариант суммировать 10 отсчетов подряд и разделить на 10 не помогли.
p.s. может надо было это среднее умножить на 9, потом добавить один отсчет и снова разделить на 10? Я пробовал просто суммировать 10 значений и делил на 10 и это все в цикле.
И еще, pulseIn() долго определяет, что на входе нет импульса. Выключил передатчик и конкретно затормозила.
Re: Управление сервоприводом.
Тут видел вариант http://arduino.cc/playground/Code/ReadReceiver , но тогда придется доставать РРМ из приемника, да и разбираться с кодом мне трудновато. Зато тогда можно одним входом и одним таймером обойтись.
Может тут есть вариант?
http://arduino.cc/playground/Main/PinChangeInt
Re: Управление сервоприводом.
Нашел еще такую микросхему MCP23017, может она мне поможет? Вроде все 16 каналов можно использовать по прерыванию, но с протоколом I2C я не знаком.
Re: Управление сервоприводом.
C I2C все просто
Можешь проверить вот этот скетч, мне итересно будут с ним сервы дергаться? Если все нормально то можно будет запускать эту процедуру в фоновом режиме через прерывание таймера, например каждые 20мкс
будет производится копирование порта
PHP код:
void setup()
{
for (int i=22; i < 30; i++) pinMode(i, INPUT);
for (int i=37; i > 30; i--) pinMode(i, OUTPUT);
}
void loop()
{
uint8_t Result;
asm volatile(
"cli" "\n\t"
"label%=:" "in %[Result], %[in_porta]" "\n\t"
"out %[out_portc], %[Result]" "\n\t"
"rjmp label%=" "\n\t"
: [Result] "=r" (Result)
: [out_portc] "I" (_SFR_IO_ADDR(PORTC)), [in_porta] "I" (_SFR_IO_ADDR(PINA))
);
sei();
}
Re: Управление сервоприводом.
Chip, реально работает и стоит как вкопанная. Реакция на перемещение стика - мгновенное. Правда сейчас входы подключены 3 шт. 22, 23, 24, а сервой подгружен только один 37. С меня реально "пиво".
Проверил так же вариант включения приемника без включенного передатчика.
В данный момент использую прием по PCM, которая после пропадания сигнала использует запрограммированный Fail-safe из настроек приемника и возвращает в предустановленный режим.
При включении питания без передатчика, серва дернулась, но не сопротивлялась перемещению от руки. А после включения передатчика она занимала правильное положение и не давала изменить положение от руки.
Короче - настоящий мост.
Сразу есть маленькая просьба, правда если возможно, объяснить каким образом можно прервать трансляцию. Пока не нужно расписывать, я сначала проверю РРМ и РСМ, проверю с 8 входами и 8 выходами, а потом сформулирую правильно вопрос. :)
СПАСИБО.
Re: Управление сервоприводом.
Немного о своем проекте, правда длинная видео-запись была сделана для демонстрации скорости, плавности хода, мощности и прочего, но в середине сама суть ловли. Один из первых вариантов.
Это я с женой на пробной ловле катером с закрепленном на нем складном и быстро-съемном спиннинге с безынерционной катушкой.
Re: Управление сервоприводом.
Прикольно! У меня есть RC автомобиль с ДВС развивает скорость 90км/ч, как нибудь сниму видео как он после старта улетает в точку
По теме, я понял как нужно сделать,
К каждому из 8 входов подключить по 1-му диоду и эти диоды соединить на входе с прерыванием , в обработчике прерывания прописать кусок представленного мной кода. И все будет работать в фоновом режиме без нагрузки на контроллер
Re: Управление сервоприводом.
И у меня есть авто, сыну 3 года назад подарил Kyosho MFR, но он так и не заинтересовался, вот стоит пылится на балконе, но когда закончу с катером, то возьмусь и за нее. Вот видео рекламное.
Думаю это можно удалить, да и 48 пост тоже, или перенести, т.к. я создал отдельную тему Катер для рыбалки