Замедлитель сервомашинки (подскажите статьи/инструкции)

ubd

В инете море схем замедлителей. Это не проблема, но все они на процах.

Если делать программно, сначла одна а потом другая, такого не найти просто так, придётся самому делать, то же на проце, на рассыпухе такое наваять - самолёт это не поднимет… Занимайтесь программированием контроллеров, и вы сможете сделать всё что угодно!
Проще начать с PIC и применить язык программирования PIC-Basic.

1 month later
SkyKsandr

Спешу сообщить новость.
Я сделал ЭТО! Чему очень рад.

Итак, для этого понадобилась

  • ардуина нано с ибея (15$ c доставкой)
  • Просмотр 4 видеоуроков на канале ютуба АмперкаРу
  • пол вечера на реализацию и монтаж

Вдруг кому пригодится программный код:
/*

Замедлитель сервы для закрылок
и управление бортовыми
аэронавигационными огнями

*/
#include <Servo.h>

Servo Flaps;

int chInFlp = 9; // считывание сигнала закрылков
int chInBano = 11; // считывание сигнала БАНО
int chOutFlp = 10; // выход на закрылки
int chOutBano = 12; // выходн на БАНО

int Flp0 = 120; // Закрылки убраны
int Flp15 = 80; // Закрылки - взлетное положение
int Flp40 = 35; // Закрылки - посадочное положение

int lastFlaps;

void setup()
{
// назначение пинов
pinMode(chInFlp, INPUT);
pinMode(chInBano, INPUT);
pinMode(chOutBano, OUTPUT);
// подключение сервы
Flaps.attach(chOutFlp);
// установка начального положения
lastFlaps = Flp0;
Flaps.write(lastFlaps);
}

void loop()
{
// объявим переменные
int currentFlaps;

unsigned long durFlp = pulseIn(chInFlp, HIGH);
unsigned long durBano = pulseIn(chInBano, HIGH);

if (durBano > 1400)
{
digitalWrite(chOutBano, HIGH);
}
else
{
digitalWrite(chOutBano, LOW);
}

if (durFlp > 1400)
{
currentFlaps = Flp0; // Убраны
}
else if (durFlp > 1200)
{
currentFlaps = Flp15; // Взлетный
}
else
{
currentFlaps = Flp40; // Посадочный
}

if (lastFlaps > currentFlaps)
{
lastFlaps -= 1;
Flaps.write(lastFlaps);
}
else if(lastFlaps < currentFlaps)
{
lastFlaps += 1;
Flaps.write(lastFlaps);
}

delay(10);

}

sashaNar

Спасибо! Как раз нано есть, вожусь над приемом сигнала.)

sashaNar

Он вешает проц на 20мс примерно.) Так что нашел другой метод. Вот, написал для В-тейл микшера, но что то зараза такое ощущение что частота обновления очень низкая - немного подергивается. Может это сериальный порт перегружает проц?
Пины: 2,3 - входы, 3,4 -выходы.

#include <math.h>
#include <Servo.h>

int Chan1Interrupt = 0; // pin 18
int Chan2Interrupt = 1; // pin 19
volatile double Chan1_startPulse, Chan2_startPulse;
volatile double Chan1_val, Chan2_val;
volatile double Chan1_val_last, Chan2_val_last;
volatile double servo1_val,servo2_val;
long StartMillis=0;
long FrameCounter=0;

Servo ServoArray[4];

/*void serviceServos(long pFrameCounter)
{
ServoArray[1].writeMicroseconds(servo1_val);
ServoArray[2].writeMicroseconds(servo2_val);
}
*/
void setup()
{
attachInterrupt(Chan1Interrupt, Chan1_begin, RISING);
attachInterrupt(Chan2Interrupt, Chan2_begin, RISING);

int i;
// for (uint8_t i=0;i<2;i++)
// ServoArray[i].attach(4+i, 700, 2300);
ServoArray[1].attach(4, 700, 2300);
ServoArray[2].attach(5, 700, 2300);
Serial.begin(9600);
StartMillis = millis();
}

void loop()
{

long LocalMillis;
long LocalFrameCounter;
LocalMillis = millis();
/* LocalFrameCounter = (LocalMillis - StartMillis) / 20;

if (LocalFrameCounter > FrameCounter)
{
FrameCounter = LocalFrameCounter;
serviceServos(FrameCounter);
}
*/

Serial.print(Chan1_val);
Serial.print(’ ‘);
Serial.print(Chan2_val);
Serial.print(’ ‘);
servo1_val=(((1500-Chan1_val)+(1500-Chan2_val))/2)+1500;
servo2_val=(((1500-Chan1_val)-(1500-Chan2_val))/2)+1500;
Serial.print(servo1_val);
Serial.print(’ ');
Serial.println(servo2_val);

ServoArray[1].writeMicroseconds(servo1_val);
ServoArray[2].writeMicroseconds(servo2_val);
}

void Chan1_begin() // enter Chan1_begin when interrupt pin goes HIGH.
{
Chan1_startPulse = micros(); // record microseconds() value as Chan1_startPulse
detachInterrupt(Chan1Interrupt); // after recording the value, detach the interrupt from Chan1_begin
attachInterrupt(Chan1Interrupt, Chan1_end, FALLING); // re-attach the interrupt as Chan1_end, so we can record the value when it goes low
}

void Chan1_end()
{
Chan1_val = micros() - Chan1_startPulse; // when interrupt pin goes LOW, record the total pulse length by subtracting previous start value from current micros() vlaue.
detachInterrupt(Chan1Interrupt); // detach and get ready to go HIGH again
attachInterrupt(Chan1Interrupt, Chan1_begin, RISING);
if (Chan1_val < 1000 || Chan1_val > 2000) { Chan1_val = Chan1_val_last;}
else {Chan1_val_last = Chan1_val;}
}

void Chan2_begin() // enter Chan2_begin when interrupt pin goes HIGH.
{
Chan2_startPulse = micros(); // record microseconds() value as Chan2_startPulse
detachInterrupt(Chan2Interrupt); // after recording the value, detach the interrupt from Chan2_begin
attachInterrupt(Chan2Interrupt, Chan2_end, FALLING); // re-attach the interrupt as Chan2_end, so we can record the value when it goes low
}

void Chan2_end()
{
Chan2_val = micros() - Chan2_startPulse; // when interrupt pin goes LOW, record the total pulse length by subtracting previous start value from current micros() vlaue.
detachInterrupt(Chan2Interrupt); // detach and get ready to go HIGH again
attachInterrupt(Chan2Interrupt, Chan2_begin, RISING);
if (Chan2_val < 1000 || Chan2_val > 2000) { Chan2_val = Chan2_val_last;}
else {Chan2_val_last = Chan2_val;}
}

EDIT: вырубил сериальный порт, все работает нормально! С гирой тоже, но подрагивают сервы. Фильтр шума, что ли добавить?
EDIT2: Или это у меня сарвы агрелись? Пусть подостынут…

SGordon
sashaNar:

servo1_val=(((1500-Chan1_val)+(1500-Chan2_val))/2)+1500;
servo2_val=(((1500-Chan1_val)-(1500-Chan2_val))/2)+1500;

понравилось вот это выражение …

если скобки раскрыть то будет

servo1_val=(-Chan1_val-Chan2_val)/2 + 3000;
servo2_val=(-Chan1_val+Chan2_val)/2+ 1500;

не так ли?

sashaNar

Так.) Я над математикой вообще не думал, так, написал как вспомнил. Полюбому, еще две арифметические операции погоды не делают.
Кстати, сервы все же самую малость подергиваются. Уходят из предыдущего положения и тут же возвращаьтся обратно. Может кто у себя проверит?
Платка - ардуина нано 168.

22 days later