Tu utilises quoi comme radio ?

Dagal:
Salut à tous,

Suis Belge, et ce n'est pas une maladie. Je proviens d'un petit patelin près de Liège.

A 6 ans je lançais partout que je réparerai des télévisions quand je serai grand.

Maintenant, j'en ai 40 et je répare beaucoup de chose sauf les TV :grin:

J'ai l'équivalent de l'époque du bac pro en électronique automation.

J'ai découvert l'informatique avec le z80 (Amstrad) à l'age de 14 ans. A 15 ans, je faisais de l'assembleur. A 16 j'apprend le 6800 et le 6502.
A 17 ans, premier pc compatible ibm :roll_eyes:

Depuis, l'informatique et moi, c'est une histoire d'amour.

Maintenant, je reviens à mes petits plaisirs d'avant. La création électronique.
Je viens donc d'acquérir mon tout premier arduino uno. Le premier jour, je contrôlais déjà 3 servos à l'aide de ma radio commande en branchant le récepteur sur le microcontrôleur, et je renvoyais les valeurs des 6 canaux vers l'ordi. Bref, je m'amuse comme un fou.

Je vais bientôt recevoir un contrôleur 3DConnexion, et j'espère recevoir un bras robotisé également.

... Devinez ce que je vais faire...

Salut Dagal,

Tu as quoi comme radio ?

Tu utilise la librairie Servo ? ChangepinInterrupt ? Micros() ?

Sev

J’utilise donc Servo et PinChangeInt (plus exactement)

ainsi qu’un calcul de temps mais tout ça est bien expliqué sur http://rcarduino.blogspot.co.uk/2012/03/need-more-interrupts-to-read-more.html

J’ai en premier lieu utilisé son programme que j’ai modifié peu à peu.

Ma commande est l’ HP6DSM fournie d’origine avec le Blade SR de chez E-Flite. Pour ne pas avoir de surprise, il faut absolument mettre tous les dip switch sur off de la radio commande, sinon les prémixages vous feront penser que rien ne va correctement. (me suis fais avoir)

Le récepteur est celui qui provient de feu mon hélicoptère…

Maintenant, j’ai un beau joystick série pour simulateur d’hélico/avion.

Le mieux, c’est que normalement, cela fonctionne avec n’importe quel récepteur…

J'utilisais ça aussi, mais je suis en cure de désintox de librairies (voir ma signature) et j'essaie d'optimiser au mieux les perfs, voila pourquoi j'essaie de lire directement le PPM (Une seule pin & seulement 7 interruptions !!) et bientot de générer moi-même le signal servo à l'aide des timers.

Mon travail à ce sujet est hébergé ici :

Sev

UniseV:
J'utilisais ça aussi, mais je suis en cure de désintox de librairies (voir ma signature) et j'essaie d'optimiser au mieux les perfs, voila pourquoi j'essaie de lire directement le PPM (Une seule pin & seulement 7 interruptions !!) et bientot de générer moi-même le signal servo à l'aide des timers.

Mon travail à ce sujet est hébergé ici :
Programing my Arduino to listen my receiver - Page 2 - RC Groups

Sev

J'ai réussi à gérer un servo en configurant un timer en fast PWM, et ça marche du tonner : contrairement à la lib servo qui est un traitement logiciel (donc dépendant des différentes tâches, très peu précis), mon servo ne tremble plus. Malheureusement, il n'y a pas assez de sorties OCx sur la uno. avec la mega2560, on peut faire 3 servos par timer, et on a 4 timers 16 bits, donc jusqu'à 12 servos en pure hardware. Maintenant, il faudrait que je retrouve la config des timers pour pouvoir te donner une base de travail...

Si tu veux piloter tes servos en hardware, pourquoi utiliser l'arduino?

Un système à base de 555 ou 556 et des conversions d/a seraient tout aussi bien

conversion d/a se fait avec un réseau r/2r
on ajoute un condentasseur pour avoir une tempo
en entrée du 555 pour définir la longueur de l'impulsion ( entre 1000 et 2000 µs)

8 sorties digitales pour - soit le numéro de servo

  • soit la valeur du servo
    1 sortie digitale pour choisir entre adressage et valeur de servo
    1 entrée digitale pour savoir si l'adresse est correctement enregistrée par un circuit intégré mémoire 8 bits

C'est une façon pour piloter de 1 à 8 servos en même temps avec la même valeur.

La sortie de la mémoire doit être suivie de 8 transistors pour faire la commutation.

De cette façon, les servos ne tremblent pas, et pas besoin de beaucoup de temps de travail

J'espère que mes idées passagères sont bien comprises de tous.

Super_Cinci:
J'ai réussi à gérer un servo en configurant un timer en fast PWM, et ça marche du tonner : contrairement à la lib servo qui est un traitement logiciel (donc dépendant des différentes tâches, très peu précis), mon servo ne tremble plus. Malheureusement, il n'y a pas assez de sorties OCx sur la uno. avec la mega2560, on peut faire 3 servos par timer, et on a 4 timers 16 bits, donc jusqu'à 12 servos en pure hardware. Maintenant, il faudrait que je retrouve la config des timers pour pouvoir te donner une base de travail...

Effectivement je suis interressé

@Dagal : L'idée pour moi c'est de tout intégrer dans un Arduino pro mini, donc j'évite tout composants externe :wink:

PS : merci au Modo pour le split du sujet :wink:

Désolé, je suis plus fan de ce qui est réparable facilement plutôt que la miniaturisation.

..Je viens de vouloir modifier un servo miniature, et je l'ai grillé... Je voulais qu'il tourne en continu mais maintenant il ne tourne plus de tout...

On a pas les mêmes contraintes, je suis dans le volant (avion/multi-rotor) le poids est primordial pour moi :wink:

Je viens de terminer la partie Servo de mon projet de pilote automatique d’avion RC, quelqes explications ici :
http://www.rcgroups.com/forums/showpost.php?p=21876639&postcount=18

J’ai finalement réussi à lire le PPM (merci à fdufnews & skywodd) & générer 2 signaux servo avec uniquement le timer1.

Si vous y voyez des trucs pas propre, n’héistez pas à me tirer les oreilles virtuellement, je remets le code ici :

// PPM read & PWM write V001
// Using timer1 to capture PPM signal & generate 2 servo signal

#define LEDPINO 13 //local Arduino PIN

boolean endTrame=0,failsafe=0,firstEdge=1;

// Rx capture data
volatile unsigned int vchUp[8];
volatile unsigned int vchPos[6];
unsigned int chPos[6];
byte curEdge;

// PWM Generator data
volatile unsigned int ocr1a,ocr1b;

void setup()
{
  // Pin setup
  pinMode(13,OUTPUT); //Arduino LED
  pinMode(9,OUTPUT); //Timer1 PWM1 (OCR1A)
  pinMode(10,OUTPUT); //Timer1 PWM2 (OCR1B)
  digitalWrite(13,HIGH); //Switch on the arduino LED

  // Timer1 setup
  TCCR1A=B10100000; // OCR2A/OCR2B : falling mode, timer: normal mode
  TCCR1B=B00000010; // 2MHz (arround 0.5µs precision), with falling edge CAPTUREPIN detection
  TIMSK1=B00100001; // Activate CAPTUREPIN interrupt & OVF interrupt
}

ISR(TIMER1_CAPT_vect)
{
  vchUp[curEdge]=TCNT1; // Take TimeStamp from 1 to 6
  curEdge++;
  if (curEdge>7) {     // From the 7th timestamp
    OCR1A=ocr1a;     //Update OCR1A & OCR1B when they are not read
    OCR1B=ocr1b;
    TCNT1=0;           // RESET COUNTER at end of trame, to avoid FailSafe detection
    TCCR1A=B11110000; // OCR2A/OCR2B : Rise mode
    TCCR1C=B11000000; // Trigger the rise
    TCCR1A=B10100000; // OCR2A/OCR2B : Falling mode
    if ((vchUp[7]-vchUp[1]) > 30000) {        //If total trame is higher than 15ms - false trame, bad synchro
      curEdge=0;            //Begining from 0 !!                      
    }
    else                                          //Else, a good trame is kept, reset edge counter and calculate channel values
    curEdge=1;
    for (int i=0;i<6;i++) {
      vchPos[i]=(vchUp[i+2]-vchUp[i+1])/2; //Measure channel values, divided by 2 to obtain µs
    }
    endTrame=1;           // To tell the main loop that news values are avaliable
  }
}

ISR(TIMER1_OVF_vect)
{
  TCCR1A=B11110000; // OCR2A/OCR2B : Rise mode
  TCCR1C=B11000000; // Trigger the rise
  TCCR1A=B10100000; // OCR2A/OCR2B : Falling mode
  OCR1A=ocr1a;     //Update OCR1A & OCR1B (while they are not read)
  OCR1B=ocr1b;
  failsafe=1; //The counter overflow around 32ms, used to activate failsafe
}

void loop()
{
  if (endTrame==1) {
    cli();
    for (int i=0;i<6;i++) {
      chPos[i]=vchPos[i]; //Take channel values
    }
    sei();
    endTrame=0;
    if (failsafe){ 
      failsafe=0;
    }

    // Here intelligent code that run only when Rx values are updated

    ocr1a=(chPos[4]*2); // Set servo 1 as channel 5
    ocr1b=(chPos[5]*2); // Set servo 2 as channel 6
  }

  // Here is the intelligent code that ALWAYS run

}

Sev