Arduino, "multiplexage" pwm

Salut a tous,

Sa fait quelques jours que je tente de faire un truc mais je bloque

En gros faire transiter 2 info par un même canal (8) de mon récepteur RC, et connecter un arduino nano au récepteur pour que chaque info aille au bon endroit au bon moment.

Donc, avec un arduino Mega, je lis l’état de 2 potentiomètre, je map dans 2 variable distinctes

écriture d'une trame PWM (grace a http://forum.arduino.cc/index.php/topic,20536.0.html#11 post 2 ) envoi de cette trame sur le port trainer de ma turnigy 9x flashé ER9x test en mappan un seul potentiomètre au ch8 de la trame, signal reçu par le récepteur sur le bon canal, je controle parfaitement 1 servo Donc a partir de la j'ai mappé les 2 potards pour qu'ils restent en dessous de 2000us, et j'envoi chaque signal pendant 40 ms (+ 20ms encoderWrite) et un signal "top" de 2000us de la meme durée

j'ai connecté mon arduino nano, utilisé une interruption pour déterminer la valeur envoyé par le récepteur, si je lis en continu je vois bien mes 3 valeurs (le top et les 2 signaux)

j'ai essayé quelques truc a base de if et de delay pour redistribuer l'info mais j'arrive pas avoir un truc vraiment stable, au mieu sa a tenu 10 seconde avant une erreur et sa c'était hier sans la méthode des interruption mais au détriment du temps de réponse, sachant que le temps de réponse m'importe peu, pas 10 seconde, mais au pire 1 seconde c'est pas grave...mais pas d'erreur

Le code pour melanger

#include <RCEncoder.h>

#include <LiquidCrystal.h>
LiquidCrystal lcd(24, 25, 26, 27, 28, 29);


#define OUTPUT_PIN 2  // pin 2 sortie ppm

int ana1 = A0;  //Signal 1
int ana2 = A1;  //Signal 2
int ana3 = A2;  // periode

int pause; // variable periode

int top = 1700;   // valeur max reponse rx 1950us
int maxppm = top - 200;
int minppm = 700;


void setup ()
{
  encoderBegin(OUTPUT_PIN);
  lcd.begin(16,2);
}

void loop ()
{
    
    pause = map(analogRead(ana3), 0, 1023, 0, 50); 
  
    encoderWrite(6, top);  // envoi la valeur de départ
    
    delay(pause);  // attend
  
    int value = analogRead(ana1);  // declare une var pour le pot 1
    int pulseWidth = map(value, 0,1023, 700, 1500); 
    encoderWrite(6, pulseWidth);  // envoi le S1
    
    delay(pause); // attend
   
    int value2 = analogRead(ana2); // declare une var pour le pot 2
    int pulseWidth2 = map(value2, 0,1023, 700, 1500); 
    encoderWrite(6, pulseWidth2);  // envoi le S2

    delay(pause);  // attend
    
    lcd.setCursor(0,0);          //ecrit les info sur le lcd, rallonge la derniere periode ?
    lcd.print("AN3=");
    lcd.print(analogRead(ana3));
    lcd.print("    ");
    
    lcd.setCursor(0,2);
    lcd.print("pau=");
    lcd.print(pause);
    lcd.print("    ");
    
    lcd.setCursor(8,0);
    lcd.print("P1=");
    lcd.print(pulseWidth);
    lcd.print("    ");
    
    lcd.setCursor(8,2);
    lcd.print("P2=");
    lcd.print(pulseWidth2);
    lcd.print("    ");
    
}

Puis l’autre pour “décoder” sans interupt

#include <Servo.h> 
Servo servo;
Servo servo2;

int in = 3; // pin entré d3
int pan = 5; // pin servo pan 5
int tilt = 6; // servo2 pin 6

int rx;  // variable reference top
int pos1;  //variable signal 1
int pos2;  // variable signal 2


int pospan;  // variable position servo 1
int postilt;  //variable position servo 2
int Vpospan;  //Verifi depassement

int valtop = 1920;  //valeur mini top us

int inmax = 1800;  //valeur max d'entré us
int inmin = 1000;  //valeur mini d'entré us

int outmax = 2000; //valeur sortie max servo
int outmin = 1000; //valeur sortie mini servo


void setup() {

Serial.begin(9600);    //com serie pc 
  
pinMode(in, INPUT);
pinMode(pan, OUTPUT);
pinMode(tilt, OUTPUT);
servo.attach(pan);
servo2.attach(tilt);



}


void loop() {
  
  rx = pulseIn(in, HIGH);
  
  if(rx > valtop) { delay(13);
                    pos1 = pulseIn (in, HIGH);
                  
  
                     if(pos1 < rx - 25){
                                        Vpospan = map (pos1, inmin, inmax, outmin, outmax);
                                        if(Vpospan < 2000){pospan = Vpospan;
                                                           servo.write(pospan);}
                     delay(39);
                     pos2 = pulseIn (in, HIGH);
                                if(pos2 < rx -25){postilt = map (pos2, inmin, inmax, outmin, outmax);
                                              servo2.write(postilt);
                                              
                                                 }
                                        }
  } 
                
 
  
  
  Serial.print("RX=");
  Serial.print(rx);
  Serial.print("   ");
  Serial.print("PAN=");
  Serial.print(pospan);
  Serial.print("   ");
  Serial.print("TILT=");
  Serial.println(postilt);
  
  

                  
}

Et le dernier truc pas fini que j’ai pondu dans la journée juste pour tester si l’interuption aide, J’ai mis des potard pour faire varier les différente pause mais pas de résultats satisfaisants

#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

volatile int In = NEUTRAL_THROTTLE;     // volatile, we set this in the Interrupt and read it in loop so it must be declared volatile
volatile unsigned long ulStartPeriod = 0;        // set in the interrupt
    // set in the interrupt and read in the loop

// we could use In = 0 in loop instead of a separate variable, but using bNewThrottleSignal to indicate we have a new signal 
// is clearer for this first example

int s1;   //lecture
int s11;  //ecriture
int s2;
int s22;
int s3;
int s33;


int pause;
int pause2;
int pause3;

void setup()
{
// tell the Arduino we want the function calcInput to be called whenever INT0 (digital pin 2) changes from HIGH to LOW or LOW to HIGH
// catching these changes will allow us to calculate how long the input pulse is
                                       
  attachInterrupt(THROTTLE_SIGNAL_IN,calcInput,CHANGE);

  Serial.begin(9600); 
}

void loop(){
           
 pause = map(analogRead (A0), 0, 1024, 0, 100);
 pause2 = map(analogRead(A1), 0, 1024, 0, 100);
 pause3 = map(analogRead(A2), 0, 1024, 0, 100);
 
 s1 = In;                                         // stock la valeur dans S1
  if( s1 > 1900 ){delay(pause);                   //quand s1>1900 atend 
                   s2 = In;                       //lis et stock la valeur dans s2
                   if(s2 < 1900){s22 = s2;        //si la valeur < 1900 (le top), on est au signal 1(theoriquement) 
                   delay(pause2);}                //attend 
                   s3 = In;                     
                   if(s3 < 1900){s33 = s3;}       
                  }
         
                                          
                                         

Serial.print(In);
Serial.print("   ");
Serial.print(pause);
Serial.print("   ");
Serial.print(pause2);
Serial.print("   ");
Serial.print(pause3);
Serial.print("   ");
//Serial.print(s1);                              
//Serial.print("   ");         
Serial.print (s22);
Serial.print("   ");
Serial.print(s3);
Serial.println("   ");

        
                                                   

 
}

void calcInput(){
                                                                             
  if(digitalRead(THROTTLE_SIGNAL_IN_PIN) == HIGH){ulStartPeriod = micros();}   // if the pin is high, its the start of an interrupt
  
     // get the time using micros - when our code gets really busy this will become inaccurate, but for the current application its 
    // easy to understand and works very well
  else{
  
       if(ulStartPeriod ){In = (int)(micros() - ulStartPeriod);  // if the pin is low, its the falling edge of the pulse so 
                                                          ulStartPeriod = 0;                             //now we can calculate the pulse duration by subtracting the 
                                                                                                        // start time ulStartPeriod from the current time returned by micros()
                                                                 // tell loop we have a new signal on the throttle channel
                                                                                      // we will not update nThrottleIn until loop sets bNewThrottleSignal back to false       
                             
                                                         }
     }
}

si j’affiche in en continu sa me donne sa

1984   top
1984   
1984   
1656   s1
1656   
1180   s2
1180   
1176   
1176   
1176   
1980   
1980   
1984   
1984   
1980   
1980   
1656   
1656   
1656   
1656   
1656   
1656   
1180   
1180   
1180   
1180   
1180   
1180   
1980   
1980

Donc je pense que ya moyen d’y arriver, mais je sait pas comment, je suis ouvert a toute suggestion

Voila, je sait pas si c’est clair tout sa, je précise que je suis un noob mais vous avez surement deviné, merci a ceux qui m’auront lu
bonne soirée

Salut, OMG ! J'ai bien compris quelque points mais dans l'ensemble je bit quedal à ce que tu veux faire et ou tu bloque !!!! :grin:

Je crois qu'un schéma s'impose ou une éxplication du but de tout ce montage, par ce que la, je comprend que : tu... bon j'ai rien compris en faite xD

Skizo.

LOL :) Je m'en doutais que c'était pas clair Concretement je veut pouvoir contrôler plus de chose avec mon récepteur sans en changer

j'ai fait un schema sur paint,

En gros sur le channel 8 du récepteur, pendant X ms c'est une valeur de top, ensuite la valeur 1 pendant X ms, la valeur 2 pendant Xms, et on recommence, je souhaiterai que la arduino nano reconnaisse le top, compte X ms stock V1, re compte X ms et stock V2

mais apparemment tout n'est pas bien régulier, en faite comme la radio envoi une trame ppm toute les 20ms, si jamais le méga change de valeur pile au début sa peut mettre 20ms de plus a arriver au récepteur, enfin je pense, du coup je me retrouve avec la valeur s2 a la place de s1 et un top qui saute ??

Et la serie de chiffre c'est ce que je lis sur avec le arduino nano quand je le branche au rx, on voit bien le top 1980 le s2 1650 et le s3 1180 donc je voudrait redistribué ces valeurs sur deux sortie PWM du arduino

Je sais pas si c'est plus clair, :roll_eyes: