无法读取FS-IA6B的频道

时间:2019-09-14 17:38:15

标签: c controller raspberry-pi interrupt ppm

我有一个FS-IA6B,Flysky FS-I6和Raspberry Pi Zero。我想阅读FS-IA6B的所有频道。我使用C语言。

我将电源连接到FS-IA6B,将4通道连接到Raspberry Pi上的引脚分别连接到25、24、23和21。我从DigitalRead()函数中随机得到零和一,只有一个数字。 / p>

我使用库WiringPipigpio如何从控制面板中获取必要的数据?

这是Arduino的有效代码,但是什么是中断?

#include <EnableInterrupt.h>

#define SERIAL_PORT_SPEED 57600
#define RC_NUM_CHANNELS  4

#define RC_CH1  0
#define RC_CH2  1
#define RC_CH3  2
#define RC_CH4  3

#define RC_CH1_INPUT  A0
#define RC_CH2_INPUT  A1
#define RC_CH3_INPUT  A2
#define RC_CH4_INPUT  A3

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(RC_CH1, RC_CH1_INPUT); }
void calc_ch2() { calc_input(RC_CH2, RC_CH2_INPUT); }
void calc_ch3() { calc_input(RC_CH3, RC_CH3_INPUT); }
void calc_ch4() { calc_input(RC_CH4, RC_CH4_INPUT); }

void setup() {
  Serial.begin(SERIAL_PORT_SPEED);

  pinMode(RC_CH1_INPUT, INPUT);
  pinMode(RC_CH2_INPUT, INPUT);
  pinMode(RC_CH3_INPUT, INPUT);
  pinMode(RC_CH4_INPUT, INPUT);

  enableInterrupt(RC_CH1_INPUT, calc_ch1, CHANGE);
  enableInterrupt(RC_CH2_INPUT, calc_ch2, CHANGE);
  enableInterrupt(RC_CH3_INPUT, calc_ch3, CHANGE);
  enableInterrupt(RC_CH4_INPUT, calc_ch4, CHANGE);
}

void loop() {
  rc_read_values();

  Serial.print("CH1:"); Serial.print(rc_values[RC_CH1]); Serial.print("\t");
  Serial.print("CH2:"); Serial.print(rc_values[RC_CH2]); Serial.print("\t");
  Serial.print("CH3:"); Serial.print(rc_values[RC_CH3]); Serial.print("\t");
  Serial.print("CH4:"); Serial.println(rc_values[RC_CH4]);

  delay(200);
}

我又找到了有关中断以及FS-IA6B如何发送数据的信息。

第2步:the function description

还有about PPM and PWM

在我编写这段代码后,它几乎是相同的,但是我没有使用“中断”。

#include "SBUS.h"
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <pigpio.h>
#include <wiringPi.h>

#define THROTTLE_SIGNAL_IN 0 // INTERRUPT 0 = DIGITAL PIN 2 - use the interrupt number in attachInterrupt
#define THROTTLE_SIGNAL_IN_PIN 2 // INTERRUPT 0 = DIGITAL PIN 2 - use the PIN number in digitalRead

#define NEUTRAL_THROTTLE 1500 // this is the duration in microseconds of neutral throttle on an electric RC Car

int trothle, start_micros;
uint16_t rc_compare;

void calc(int pin);

int main(void){
    wiringPiSetup();

    // pinMode(21, INPUT);
    // pinMode(22, INPUT);
    // pinMode(23, INPUT);
    // pinMode(24, INPUT);
    pinMode(25, INPUT);

    // if(gpioInitialise() < 0){
 //        fprintf(stderr, "pigpio initialisation faled\n");
 //        return 1;
 //    }

    // gpioSetMode(21, PI_INPUT);
    // gpioSetMode(22, PI_INPUT);
    // gpioSetMode(23, PI_INPUT);
    // gpioSetMode(24, PI_INPUT);
    // gpioSetMode(25, PI_INPUT);

    while(1){
        calc(25);
        printf("Throttle ch1%3d: %d\n", digitalRead(25), rc_compare); 
        // printf("\e[1;1H\e[2J");
        delay(250);
    }

    return 0;
}


void calc(int pin){
    if (digitalRead(pin) == 1)
    {
        start_micros = micros();
    }else{
        rc_compare = (uint16_t)(micros() - start_micros);
    }
}

但是我得到的是随机数字。

如何从遥控器获取正常值?

0 个答案:

没有答案