Приемник Rc выдает неправильные значения при управлении сервоприводом
Итак, я строю вертолет. Вот почему мне нужен приемник (tgy 9x) для считывания значений с моего контроллера. Эти значения передаются в мой Arduino, где происходят некоторые вычисления, а затем отправляются на сервоприводы.
Проблема в том, что как только я начинаю двигать сервопривод, все данные, которые я получаю от приемника, тут же становятся бессмыслицей.
Значения, которые я должен получить и получаю, когда я ничего не отправляю на свои сервоприводы. Эти значения указаны в микросекундах.
Channel1 Channel2 Channel3 Channel4
1486 1484 1482 1472
1486 1484 1482 1472
1486 1484 1482 1472
1486 1484 1482 1472
Что я получаю после перемещения сервопривода. Они должны быть между 1000 и 2000.
Channel1 Channel2 Channel3 Channel4
1495 18660 1105 17182
1495 2337 5667 3070
8828 7674 8795 6198
10289 7674 8795 11404
Arduino получает питание от USB (на данный момент), а сервопривод от ESC моего мотора. Все заземления подключены. Подключен только один сервопривод, и все провода от приемника не находятся рядом с линиями питания или сервоприводами.
Итак, вопрос в том, почему приемник выдает мне бессмыслицу и как это исправить.
Сейчас я закомментировал все, кроме этого:
RC_controller.h
#ifndef RC_controller
#define RC_controller
#include <Arduino.h>
#include "eeprom.h"
void RC_init();
void calc_input0();
void calc_input1();
void calc_input2();
void calc_input3();
void calc_input4();
void calc_input5();
#endif
RC_controller.cpp
#define RC_NUM_CHANNELS 8
uint32_t volatile rc_start[RC_NUM_CHANNELS];
uint32_t volatile rc_shared[RC_NUM_CHANNELS];
uint32_t volatile rc_raw[RC_NUM_CHANNELS];
int rc_channels_pin[8] = {2, 3, 4, 5, 6, 7, 8, 9};
void calc_input0() {
int identifyer = 0;
if (digitalRead(rc_channels_pin[identifyer]) == HIGH) {
rc_start[identifyer] = micros();
} else {
rc_raw[identifyer] = (uint16_t)(micros() - rc_start[identifyer]);
}
}
...
void RC_init()
{
for (byte i = 0; i > RC_NUM_CHANNELS; i++)
pinMode(rc_channels_pin, INPUT);
attachInterrupt(digitalPinToInterrupt(rc_channels_pin[0]), calc_input0, CHANGE);
attachInterrupt(digitalPinToInterrupt(rc_channels_pin[1]), calc_input1, CHANGE);
attachInterrupt(digitalPinToInterrupt(rc_channels_pin[2]), calc_input2, CHANGE);
attachInterrupt(digitalPinToInterrupt(rc_channels_pin[3]), calc_input3, CHANGE);
attachInterrupt(digitalPinToInterrupt(rc_channels_pin[4]), calc_input4, CHANGE);
attachInterrupt(digitalPinToInterrupt(rc_channels_pin[5]), calc_input5, CHANGE);
}
main.cpp
...
void setup()
{
Serial.begin(115200);
Wire.begin();
#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
for (int a = 0; a < 3; a++)
swashplate[a].attach(10+a, 1200, 1800);
RC_init();
}
void loop()
{
if (rc_raw[0] < 2000)
{
swasplate[0].write(rc_raw[0]);
}
Serial.print(rc_raw[0]);
Serial.print(" ");
Serial.print(rc_raw[1]);
Serial.print(" ");
Serial.print(rc_raw[2]);
Serial.print(" ");
Serial.print(rc_raw[3]);
Serial.print(" ");
Serial.print(rc_raw[4]);
Serial.print(" ");
Serial.print(rc_raw[5]);
Serial.print(" ");
Serial.println();
}
@MoneyMonkey, 👍0
1 ответ
Лучший ответ:
Я нашел проблему. Проблема была в прерываниях, когда программа работала и выполняла вычисления, в этот момент Arduino прерывалась и останавливалась посреди нее, и изменяла значение, с которым она выполняла вычисления. Это каким-то образом заставляло Arduino посылать помехи по сигнальным проводам. Считывание сигналов с помощью защиты чтения решило проблему.
void read_inputs()
{
noInterrupts();
byte identifyer = 0;
rc_shared[identifyer] = rc_raw[identifyer];
...
interrupts();
}
- Построение графика на Python с использованием Tkinter Canvas
- Самый быстрый способ считывания состояния цифрового контакта в Arduino Due
- Что именно делает возвращаемый тип в функции?
- Можно ли смоделировать часы без подключенного RTC?
- SPI с DMA в Arduino Due
- Сможет ли Arduino Uno считывать 3-кратные инкрементальные энкодеры?
- Программирование Bare Metal Due
- AMIS30543 | Таблица КРУГОВОГО ПЕРЕВОДЧИКА данных