Bonjour,
receiverData[] est un tableau de quelle sorte de variable?
Bonjour,
receiverData[] est un tableau de quelle sorte de variable?
Salut Demss;
Voilà :
int receiverData[6];
int transmitterCommand[6] = {1500,1500,1500,1000,1000,1000};
int transmitterCommandSmooth[6] = {0,0,0,0,0,0};
int transmitterZero[3] = {1500,1500,1500};
int transmitterCenter[3] = {1500,1500,1500};
byte channel;
Bonjour,
J'ai fait des tests avec ce code:
void setup()
{
Serial.begin(9600);
}
void loop()
{
int receiverData[6];
unsigned int receiverPin[6] = {1932,1520,1520,1524,1524,1112};
byte channel;
float mTransmitter[6] = {1,1,1,1,1,1};
float bTransmitter[6] = {0,0,0,0,0,0};
for (channel = 0; channel < 6; channel++)
{
//Serial.print(receiverPin[channel]);
receiverData[channel] = (mTransmitter[channel] * receiverPin[channel]) + bTransmitter[channel];
Serial.print(" OK ");
Serial.print( receiverData[channel]);
}
Serial.println("");
delay(250);
}
Et tous semble correcte, ça me donne:
OK 1932 OK 1520 OK 1520 OK 1524 OK 1524 OK 1112
OK 1932 OK 1520 OK 1520 OK 1524 OK 1524 OK 1112
OK 1932 OK 1520 OK 1520 OK 1524 OK 1524 OK 1112
Vue que readReceiver(receiverPin[channel]) semble fonctionner dans ton code je l'ai remplacé par un tableau pour le tester.
Je connais pas la valeur des variables ROLL et LASTCHANNEL mais je suppose que c'est 0 et 6?
J'ai pas d'information sur le tableau receiverPin[].
Tu as écrit que ça te sort ça:
OK 0 OK 0 OK 0 OK 0 OK 0 OK 0
Et tu à mit 3 print() dans ta boucle.
Il manque des données dans ta sortie de valeur.
Avec les bout de code que tu as donné je peux pas faire plus.
Ta surement fait une petite erreur d'inattention quelque par dans ton code qui fait que plus rien ne va.
Le troisième print se trouve en dehors de la boucle for() et me permet de faire un saut de ligne une fois que tout le tableau est lu.
J'ai trouvé les variables que tu me demandais :
// Receiver variables
#define TIMEOUT 25000
#define MINCOMMAND 1000
#define MIDCOMMAND 1500
#define MAXCOMMAND 2000
#define MINDELTA 200
#define MINCHECK MINCOMMAND + 100
#define MAXCHECK MAXCOMMAND - 100
#define MINTHROTTLE MINCOMMAND + 100
#define LEVELOFF 100
#define ROLL 0
#define PITCH 1
#define YAW 2
#define THROTTLE 3
#define MODE 4
#define AUX 5
#define LASTCHANNEL 6
Et pour receiverPin:
#ifdef Mega_AQ1x //Receiver pin assignments for the Arduino Mega using an AeroQuad v1.x Shield
//The defines below are for documentation only of the Mega receiver input
//The real pin assignments happen in initializeMegaPcInt2()
//If you are using an AQ 1.x Shield, put a jumper wire between the Shield and Mega as indicated in the comments below
#define ROLLPIN 67 // AI13, Place jumper between AQ Shield pin 2 and Mega AI13
#define PITCHPIN 65 // AI11, Place jumper between AQ Shield pin 5 and Mega AI11
#define YAWPIN 64 // AI10, Place jumper between AQ Shield pin 6 and Mega AI10
#define THROTTLEPIN 66 // AI12, Place jumper between AQ Shield pin 4 and Mega AI12
#define MODEPIN 63 // AI9, Place jumper between AQ Shield pin 7 and Mega AI9
#define AUXPIN 62 // AI8, Place jumper between AQ Shield 8 and Mega AI8
int receiverPin[6] = {5,3,2,4,1,0};
#endif
Si jamais, les sources sont là ::):
Bonjour,
Je parlais de ce print: en tout 3 print() dans la boucle et 1 print() hors de la boucle.
for (channel = ROLL; channel < LASTCHANNEL; channel++){
Serial.print(readReceiver(receiverPin[channel]));
receiverData[channel] = (mTransmitter[channel] * readReceiver(receiverPin[channel])) + bTransmitter[channel];
Serial.print(" OK "); Serial.print(receiverData[channel]);}
Serial.println("");
Je vais faire d'autre test avec ton code quand je vais avoir du temps!
Celui que tu as mis en rouge est en commentaire dans mon exemple ( // ...) .
En tout cas, merci pour le coup de main.
Bonjour Jean-François,
Si tu va dans le Menu Serial Monitor du logiciel AeroQuad Configurator et si tu écrit 1 dans la boite de text et qu'ensuite tu click sur le bouton Send Commande.
À tu encore le problème des 0?
Je n'arrive pas à installer Aeroquad configurator sur mon Mac.
Normalement avec le moniteur série Arduino, je devrais avoir les mêmes valeurs qui sortent :
http://aeroquad.info/bin/view/Main/SerialCommands_v11
Voir sous "U".
J'ai fait un essai en utilisant les trois print, dans le premier, j'ai mes valeurs de réception (1510,1902....) et dans l'autre en sortie de multiplication / addition , mes valeurs tombent à 0.
Bonjour,
Oui avec le moniteur série Arduino c'est la même chose.
Je me suis tromper avec l'envoi du 1 je voulais effacer mon message mais tu l'avais déja lu.
La clef est cette fonction, il faut que l'Arduino lise cette ligne de code en rouge pour ne pas avoir le problème des 0.
Dans le fichier Receiver.pde.
// ISR which records time of rising or falling edge of signal
static void measurePulseWidthISR(uint8_t port) {
uint8_t bit;
uint8_t curr;
uint8_t mask;
uint8_t pin;
uint32_t currentTime;
uint32_t time;// get the pin states for the indicated port.
curr = portInputRegister(port+2);
mask = curr ^ PCintLast[port];
PCintLast[port] = curr;
// mask is pins that have changed. screen out non pcint pins.
if ((mask &= port_to_pcmask[port]) == 0) {
return;
}
currentTime = micros();
// mask is pcint pins that have changed.
for (uint8_t i=0; i < 8; i++) {
bit = 0x01 << i;
if (bit & mask) {
pin = port * 8 + i;
// for each pin changed, record time of change
if (bit & PCintLast[port]) {
time = currentTime - pinData[pin].fallTime;
pinData[pin].riseTime = currentTime;
if ((time >= MINOFFWIDTH) && (time <= MAXOFFWIDTH))
pinData[pin].edge = RISING_EDGE;
else
pinData[pin].edge == FALLING_EDGE; // invalid rising edge detected
}
else {
time = currentTime - pinData[pin].riseTime;
pinData[pin].fallTime = currentTime;
if ((time >= MINONWIDTH) && (time <= MAXONWIDTH) && (pinData[pin].edge == RISING_EDGE)) {
** pinData[pin].lastGoodWidth = time;
pinData[pin].edge = FALLING_EDGE;
}
}
}
}
}
Je vais faire d'autre recherche plus tard.
Ce que je n'arrive pas à comprendre c'est que si je fais ça :
receiverData[channel] = mTransmitter[channel] * readReceiver(receiverPin[channel]) + bTransmitter[channel];
mes valeurs sont à 0 en sortie.
Si je fais ça :
receiverData[channel] = 1 * readReceiver(receiverPin[channel]) + 0;
mes valeurs de réception passent.
Les valeurs devraient être les mêmes dans les deux cas :
float mTransmitter[6] = {1,1,1,1,1,1};
float bTransmitter[6] = {0,0,0,0,0,0};
Bonjour,
Voici les seul endroit où mTransmitter[] et bTransmitter[] peuvent être modifier.
Dans la fonction readEEPROM() du fichier Eeprom.pde.
mTransmitter[THROTTLE] = readFloat(THROTTLESCALE_ADR);
bTransmitter[THROTTLE] = readFloat(THROTTLEOFFSET_ADR);
mTransmitter[ROLL] = readFloat(ROLLSCALE_ADR);
bTransmitter[ROLL] = readFloat(ROLLOFFSET_ADR);
mTransmitter[PITCH] = readFloat(PITCHSCALE_ADR);
bTransmitter[PITCH] = readFloat(PITCHOFFSET_ADR);
mTransmitter[YAW] = readFloat(YAWSCALE_ADR);
bTransmitter[YAW] = readFloat(YAWOFFSET_ADR);
mTransmitter[MODE] = readFloat(MODESCALE_ADR);
bTransmitter[MODE] = readFloat(MODEOFFSET_ADR);
mTransmitter[AUX] = readFloat(AUXSCALE_ADR);
bTransmitter[AUX] = readFloat(AUXOFFSET_ADR);
Dans la fonction readSerialCommand() du fichier Receiver.pde.
case 'O': // Receive transmitter calibration values
mTransmitter[ROLL] = readFloatSerial();
bTransmitter[ROLL] = readFloatSerial();
mTransmitter[PITCH] = readFloatSerial();
bTransmitter[PITCH] = readFloatSerial();
mTransmitter[YAW] = readFloatSerial();
bTransmitter[YAW] = readFloatSerial();
mTransmitter[THROTTLE] = readFloatSerial();
bTransmitter[THROTTLE] = readFloatSerial();
mTransmitter[MODE] = readFloatSerial();
bTransmitter[MODE] = readFloatSerial();
mTransmitter[AUX] = readFloatSerial();
bTransmitter[AUX] = readFloatSerial();
break;
et
for (channel = ROLL; channel < LASTCHANNEL; channel++) {
mTransmitter[channel] = 1.0;
bTransmitter[channel] = 0.0;
}
Regarde à quel moment mTransmitter[] devient = 0 avec la fonction Serial.print().
Et aussi regarde si la valeur mTransmitter[channel] est bien = 0.00 avec la fonction Serial.print().
receiverData[channel] = mTransmitter[channel] * readReceiver(receiverPin[channel]) + bTransmitter[channel];
Merci pour ces infos.
En bidouillant cet après midi, j'ai fait des modifs dans l'EEprom et je me suis aperçu que ça m'a changé pas mal de trucs.
J'ai donc remis toutes l'EEprom à 255 et ensuite à 0 en regardant ce que cela donnait à chaque fois et effectivement des valeurs que je n'avais pas avant sont apparues.
Par contre j'ai oublié ma télécommande au boulot et je ne peux pas faire d'essai sur les valeurs de réception :
je mets les valeurs mTransmitter[] et bTransmitter[] à 1.0 dans l'EEprom, je contrôle avec un autre programme si les adresses sont bien avec la valeurs 1.0, ensuite je recharge le programme Aeroquad et lorsque je fait un print pour sortir mTransmitter[] dans la boucle for, la valeurs est à .... 0 >:(
C'était bien lié au valeurs enregistrée dans l'EEprom....
Voilà comment j'ai procédé :
dans SerialCommand.pde, j'ai mis ça pour le "Y"
case 'Y': // Initialize EEPROM with default values
smoothTransmitter[THROTTLE] = 1.0;
smoothTransmitter[ROLL] = 1.0;
smoothTransmitter[PITCH] = 1.0;
smoothTransmitter[YAW] = 0.5;
smoothTransmitter[MODE] = 1.0;
smoothTransmitter[AUX] = 1.0;
smoothHeading = 1.0;
break;
J'ai chargé dans l'Arduino, puis envoyé un "Y" dans le moniteur série.
Il faut envoyé un "W" pour enregistrer dans l'EEprom.
J'ai remis le fichier SerialCommand dans sa configuration d'origine, rechargé et fait un essai.
Maintenant ça fonctionne, mes valeurs de récepteur sortent de cette boucle et mTransmitter[channel] est bien à 1.0.
Ce que je ne comprend pas c'est que si je regarde les adresses dans l'EEprom, elles sont toutes à 0, chaque valeur étant sur 4 adresses de l'EEprom. :-?
Je commence à attaquer la partie châssis-moteurs :
Le quatrième contrôleur est dans mon planeur....
Je continuerai à faire mon interface en parallèle.
Il faut également que je m'occupe de la commande de ma pompe à vide pour les matériaux composites ...
Beau travail, et passionnant.
Bravo, il nous tarde de voir la suite.
Churchill
Je suis impressionné par ton travail, j'ai toujours voulu faire un Quadricoptère mais je suis limiter par mon budget qui n'est pas bien gros.[smiley=thumbup.gif] [smiley=thumbup.gif] [smiley=thumbup.gif]
Cyril
beau travail en effet, j'admire surtout l'ordre qui règne dans ton atelier cela me laisse réveur :-/
Le prototype prend forme; l'idée d'utiliser un trépied d'appareil photo est bonne, mais il va falloir le lester vu la puissance des moteurs ;D 1kW si je me souviens bien
1kW :o
On peut espérer combien d'autonomie avec une tel puissance?