Имитация радиоуправления с помощью Arduino UNO

VeRGiLeeY
Offline
Зарегистрирован: 13.02.2013

Имеется:
1.плата для управления квадрокоптером.

http://www.hobbyking.com/hobbyking/store/__21977__HobbyKing_Multi_Rotor_Control_Board_V3_0_Atmega328_PA_.html

2. китайская 4-х канальная аппаратура радиоуправления.

http://www.hobbyking.com/hobbyking/store/__8338__Hobby_King_2_4Ghz_4Ch_Tx_Rx_V2_Mode_2_.html

3. arduino UNO.

Обычно коптер управляется с помощью аппаратуры. Задумал сделать упрвление через Wi-Fi через связку ардуины и ArduinoWirelessShield и подключить еще несколько примочек заодно. Ардкино решил подключить заместо приемника на китайскую плату и имитировать обычное радиоуправление не переписывая прошивки самой платы.
В этом собственно и проблема.

Подключил я приемник к ардуино и функцией pulsein() получил сигналы с каналов которые передаются от него на микроконтроллер платы.

int pin_in_1 = 8;
unsigned long in_1;

void setup()
{
 Serial.begin(9600);
 pinMode(pin_in_1, INPUT);
}

void loop()
{
in_1 = pulseIn(pin_in_1, INPUT);
Serial.println(in_1);
}

При выключеном передатчике возвращает 0, при включенном число в диапазоне 20000..20800, в зависимости от положения стика на передатчике. Насколько я понял, это время в микросекундах между сигналами HIGH и LOW поступающии с приемника.

 Подключил ардуино к пинам для приемника на плате и попытался передать сигнал с такой же частотой, но ничего не получается.

int ledpin_1 = 6;
int ledpin_2 = 9;
int ledpin_3 = 10;
int ledpin_4 = 11;
 
void setup() 
{ 
pinMode(ledpin_1,OUTPUT);
pinMode(ledpin_2,OUTPUT);
pinMode(ledpin_3,OUTPUT);
pinMode(ledpin_4,OUTPUT);
Serial.begin(9600);
} 
 
void loop() 
{ 
pulseOut(ledpin_1,20427);
pulseOut(ledpin_2,20427);
pulseOut(ledpin_3,20427);
if (Serial.available() > 0) { 
 for (int i=0; i <= 255; i++){ 
        //incomingByte = Serial.read();
        pulseOut(ledpin_4,20000);
      Serial.println(20000);}}
      {pulseOut(ledpin_4,20427);
    Serial.println(20427);}
}

void pulseOut(int pin, int val)
{
digitalWrite(pin,HIGH);
delayMicroseconds(val);
digitalWrite(pin,LOW);
}

Подскажите можно ли вообще исполнить эту идею и что я делаю не правильно.

maksim
Offline
Зарегистрирован: 12.02.2012

Воспользоваться библиотекой Servo, RC-приемники как раз и генерят на своих выходах ШИМ-сигнал для управления сервами.

VeRGiLeeY
Offline
Зарегистрирован: 13.02.2013

maksim

Спасибо. Все заработало.

mantana977
Offline
Зарегистрирован: 24.01.2014

Можно посмотреть исходник кода?А то у меня такая же проблема возникла