Приемник 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();
}

, 👍0


1 ответ


Лучший ответ:

0

Я нашел проблему. Проблема была в прерываниях, когда программа работала и выполняла вычисления, в этот момент Arduino прерывалась и останавливалась посреди нее, и изменяла значение, с которым она выполняла вычисления. Это каким-то образом заставляло Arduino посылать помехи по сигнальным проводам. Считывание сигналов с помощью защиты чтения решило проблему.

void read_inputs()
{
  noInterrupts();

  byte identifyer = 0;
  rc_shared[identifyer] = rc_raw[identifyer];

  ...

  interrupts();
}
,