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
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
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() ?
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.
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.
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
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...
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
}