PWM fluctiaties bij RC ontvanger

IDE gerelateerde berichten
Berichten: 3
Geregistreerd: 03 Sep 2016, 16:27

PWM fluctiaties bij RC ontvanger

Berichtdoor corolusFPV » 03 Sep 2016, 16:45

Hallo allemaal, dit is mijn eerste post :D

Ik zit nu in mijn examenjaar Havo en ben met een profielwerkstuk bezig.
Mijn plan is om mijn Quadcopter te automatiseren door middel van een Arduino Mega 2560 en allerlei sensoren (sonars, gps, etc).
De RC ontvanger stuurt de signalen naar de Mega, die bewerkt die signalen weer en stuurt het door naar de Flight Controller (Multiwii 328P)
Mijn code werkt nu al redelijk alleen fluctueert het PWM signaal van de ontvanger erg. (Dat is ten minste wat de Mega zegt in de serial monitor)

Als ik nu een servo op mijn Arduino Mega aansluit dan beweegt hij welke kant ik hem op wil laten gaan, maar trilt hij heel erg.
Als ik hem dan rechtstreeks op de ontvanger aansluit zonder de Arduino er tussen, dan beweegt hij normaal zonder constant trillen.
Het ligt dus aan de Arduino of de code.

Ik gebruik pulseIn om het PWM signaal van mijn ontvanger te lezen.
Dan map() om het PWM signaal om te zetten in iets wat de Servo library begrijpt.
Daarna schrijf ik dat signaal naar de output (Multiwii in dit geval)


Dit is het gedeelte van mijn code die het PWM signaal leest en schrijft

Code: Alles selecteren
#include <Servo.h>

//RC ontvanger pin
  const int rxPin_ch1 = 13; //Roll
  const int rxPin_ch2 = 12; //Pitch
  const int rxPin_ch3 = 11; //Throttle
  const int rxPin_ch4 = 10; //Yaw
  const int rxPin_ch5 = 9; //Auxiliary 1
  const int rxPin_ch6 = 8; //Auxiliary 2

//PWM
    int pwmCH1;
    int pwmCH2;
    int pwmCH3;
    int pwmCH4;
    int pwmCH5;
    int pwmCH6;

//Flight Controller
    int outputTHR;
    int outputROL;
    int outputPIT;
    int outputYAW;
    int outputAX1;
    int outputAX2;

 
//output pin
  Servo fcPin_THR;
  Servo fcPin_ROL;
  Servo fcPin_PIT;
  Servo fcPin_YAW;
  Servo fcPin_AX1;
  Servo fcPin_AX2;

void setup() {
//PinMode RC ontvanger
  pinMode(rxPin_ch1,INPUT);
  pinMode(rxPin_ch2,INPUT);
  pinMode(rxPin_ch3,INPUT);
  pinMode(rxPin_ch4,INPUT);
  pinMode(rxPin_ch5,INPUT);
  pinMode(rxPin_ch6,INPUT);
 
//Output pin
  fcPin_THR.attach(2);
  fcPin_ROL.attach(3);
  fcPin_PIT.attach(4);
  fcPin_YAW.attach(5);
  fcPin_AX1.attach(6);
  fcPin_AX2.attach(7);
}

void loop() {
 pwmCH1 = pulseIn(rxPin_ch1,HIGH);          //Lees het PWM signaal van de RC ontvanger                   
 outputROL = map(pwmCH1,1000,2000,0,180);   //Zet het PWM signaal van 1000 tot 2000 om in een signaal tussen 0 en 180 (voor de servo library)
 pwmCH2 = pulseIn(rxPin_ch2,HIGH);
 outputPIT = map(pwmCH2,1000,2000,0,180);
 pwmCH3 = pulseIn(rxPin_ch3,HIGH);
 outputTHR = map(pwmCH3,1000,2000,0,180);
 pwmCH4 = pulseIn(rxPin_ch4,HIGH);
 outputYAW = map(pwmCH4,1000,2000,0,180);

 fcPin_ROL.write(outputROL);   //Schrijf het signaal naar de flight controller
 fcPin_PIT.write(outputPIT);
 fcPin_THR.write(outputTHR);
 fcPin_YAW.write(outputYAW);


}


Als iemand hier een oplossing voor denkt te hebben hoor ik dat graag.


(De multiwii is ook gebaseerd op een Arduino chip, dus zou volgens mij kunnen Communiceren met de Mega door i2c.
Dit zou een nog beter alternatief zijn op hoe ik het nu aangesloten heb maar hier heb ik totaal geen ervaring mee en
ik snap de multiwii source code ook niet echt omdat bijna alles in C++ is).

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PWM fluctiaties bij RC ontvanger

Berichtdoor shooter » 04 Sep 2016, 19:34

pulseIn is een zogenaamde blocking code, ofwel hier wacht de processor tot de puls gedaan is, waardoor allerlei tijden etc helemaal van slag raken.
je kunt ook maar een pulsein tegelijk doen, want de andere is dan allang geweest voor dat je pulsein aan zet.
paul deelen
shooter@home.nl

Berichten: 3
Geregistreerd: 03 Sep 2016, 16:27

Re: PWM fluctiaties bij RC ontvanger

Berichtdoor corolusFPV » 06 Sep 2016, 20:43

Bedankt, dat verklaart het.

Ik heb nu iets gevonden wat misschien beter zou werken. AttachInterrupt, dit ziet er wel allemaal ingewikkeld uit, heeft iemand deze manier al eerder geprobeerd?
Het moet mogelijk zijn om vrijwel zonder vertraging PWM signalen te verwerken, de APM 2.5 Flight controller kan dat namelijk ook en die maakt net als de Arduino Mega gebruik van een ATmega 2560 chip.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: PWM fluctiaties bij RC ontvanger

Berichtdoor Koepel » 07 Sep 2016, 08:39

Je wilt dus een Arduino als 'man-in-the-middle' tussen het servo signaal van de ontvanger en de Multiwii. En de Multiwii stuurt de servo motors aan ?
Dus met alle gegevens van sensoren en van het servo signaal van de ontvanger, wil je zelf een nieuw servo signaal maken ?
Het gaat dus niet om zomaar een PWM signaal, maar om een servo signaal. Dat servo signaal is echter wel een PWM signaal en geen PPM (Pulse Position Modulated) signaal.
En je wilt dan iets maken dat ongeveer hetzelfde doet als de Multiwii ? Dus dan krijg je een cascade van twee Multiwii-achtigen achter elkaar ?

Heb ik het zover goed begrepen ?

Voor de sturing van de servo motors gebruik je de standaard Arduino Servo library. Die library is niet ideaal, maar is meestal wel voldoende om het goed te laten werken.

Voor het lezen van meerdere servo signalen zul je inderdaad interrupts moeten gebruiken. Ik zie dat vaak samen met de functie micros(), zoals hier : http://rcarduino.blogspot.nl/2012/04/how-to-read-multiple-rc-channels-draft.html. Ik weet niet of die code goed werkt.
Op Github heb ik geen library kunnen vinden. Het is lastig zoeken, omdat er geen standaard term is voor het lezen van een servo signaal.

Berichten: 3
Geregistreerd: 03 Sep 2016, 16:27

Re: PWM fluctiaties bij RC ontvanger

Berichtdoor corolusFPV » 08 Sep 2016, 22:18

Dat klopt, de arduino Mega krijgt signaal binnen van de ontvanger en op basis van de sensor data verwerkt hij het en stuurt het naar de Multiwii.
(De multiwii stuurt dan de motor van de Quadcopter aan).

Ik heb nu zelf een soort library gemaakt voor interrupts en die doet het al een stuk beter dan die pulseIn code. Er zit nog wel een kleine vertraging in, maar ik denk niet dat het veel problemen gaat opleveren.
Nu maar alle electronica aansluiten en dan kan ik hem testen, ik zal het wel laten weten of hij het nu doet.

Dit is ongeveer de interrupt code:

Code: Alles selecteren

void setup(){
attachInterrupt(CH1_INT,calcCH1,CHANGE);
}

void loop(){
NewSignal_CH1 = false; 
}

void calcCH1(){

  if(digitalRead(CH1_PIN) == HIGH){
    StartPeriod_CH1 = micros();}
  else {
    if(StartPeriod_CH1 and NewSignal_CH1 == false){
      CH1_In = (int)(micros() - StartPeriod_CH1);
      StartPeriod_CH1 = 0;
      NewSignal_CH1 = true;}
  }
}




Ik snap zelf amper hoe deze code nou precies werkt, maar het is me toch gelukt om hem in te korten ;)

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PWM fluctiaties bij RC ontvanger

Berichtdoor shooter » 09 Sep 2016, 11:48

Heb je de software van de controller al eens bekeken? Die is knap ingewikkeld, want het moet allemaal nogal snel.
Persoonlijk zou ik een ongebruikte uitgang van de ontvanger gebruiken en daar jouw mega aanhangen en daarmee iets doen, zoals ledjes, camera, landingslicht of zo, zeker als je nog in het begin bent.
Hou er ook rekening mee ,dat een multiwii 3.3 Volt is en een mega is 5 Volt.

Er is ook een groot verschil tussen PWM en een SERVO signaal, ja klopt het zijn beide Pulsduur signalen, echter de PWM is van 0 tot 100% in de tijd, en servo is een tijdsignaal van 20 ms.
paul deelen
shooter@home.nl

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten