https://youtu.be/3G9cN6IlFiM
Na zdrojový kód si nenárokuji žádná práva, takže přikládám níže. Použito Arduino Nano Strong kvůli výhodné konfiguraci pinů napájení a signálu. Pokud umíte, nebo máte ve svém okolí někoho, kdo umí s arduinem, je programování záležitost na minuty.´
Případné připomínky, nebo návrhy, rád zapracuji do programu a budu aktualizovat.
- Kód: Vybrat vše
#include <EnableInterrupt.h>
#include <Servo.h>
#define RC_NUM_CHANNELS 2
#define AIL 0
#define ELE 1
#define AIL_INPUT A0 // vstup křidélka
#define ELE_INPUT A1 // vstup výškovka
Servo LEVA;
Servo PRAVA;
int KRID,VYSK,LEVA_VAL,PRAVA_VAL,KRID_L,KRID_P;
uint16_t rc_values[RC_NUM_CHANNELS];
uint32_t rc_start[RC_NUM_CHANNELS];
volatile uint16_t rc_shared[RC_NUM_CHANNELS];
void rc_read_values() {
noInterrupts();
memcpy(rc_values, (const void *)rc_shared, sizeof(rc_shared));
interrupts();
}
void calc_input(uint8_t channel, uint8_t input_pin) {
if (digitalRead(input_pin) == HIGH) {
rc_start[channel] = micros();
} else {
uint16_t rc_compare = (uint16_t)(micros() - rc_start[channel]);
rc_shared[channel] = rc_compare;
}
}
void calc_ch1() { calc_input(AIL, AIL_INPUT); }
void calc_ch2() { calc_input(ELE, ELE_INPUT); }
void setup() {
Serial.begin(SERIAL_PORT_SPEED);
pinMode(AIL_INPUT, INPUT);
pinMode(ELE_INPUT, INPUT);
enableInterrupt(AIL_INPUT, calc_ch1, CHANGE);
enableInterrupt(ELE_INPUT, calc_ch2, CHANGE);
LEVA.attach(9); // výstup levá
PRAVA.attach(10); // výstup pravá
}
void loop() {
rc_read_values();
KRID = map(rc_values[AIL],960,2012,25,155);
VYSK = map(rc_values[ELE],960,2012,25,155);
VYSK = abs(min(VYSK,90)-90);
KRID_P = abs(min(KRID,90)-90);
KRID_L = (max(KRID,90)-90);
LEVA_VAL = (38 + (2 * KRID_L) + (2 * VYSK));
LEVA_VAL = min(LEVA_VAL,140);
PRAVA_VAL = (40 + (2 * KRID_P) + (2 * VYSK));
PRAVA_VAL = min(PRAVA_VAL,140);
PRAVA_VAL = PRAVA_VAL - 180;
PRAVA_VAL = abs(PRAVA_VAL);
LEVA.write(LEVA_VAL);
PRAVA.write(PRAVA_VAL);
delay(10);
}