Show Posts
Pages: 1 [2] 3 4 ... 25
16  International / Français / Re: Arduino et les récepteurs RC, PWM on: July 16, 2013, 05:43:30 pm
Le plus probable c'est que le type de carte ne soit pas le bon, es-tu certain du type 168, 328 ? 5V/16MHz ?
17  International / Français / Re: Arduino et les récepteurs RC, PWM on: July 16, 2013, 01:57:46 pm
je suis en spektrum ,donc dsm2

Dommage, j'ai une librairie toute faite pour lire du PPM 6 voies, qui va bien avec le Récepteur 6 voies de HobbyKing.  smiley-red
18  International / Français / Re: Arduino et les récepteurs RC, PWM on: July 14, 2013, 07:11:08 am
Le pulseIn c'est bien comprendre le fonctionnement au départ mais il faudra ensuite passer à quelque chose à base d'interruption pour "mieux" utilise le micro-contrôleur.

Vous utilisez quoi comme matériel radio ?
19  International / Français / Re: L'exemple de la bibliothèque 'Morse' on: July 03, 2013, 10:01:54 am
Pour faire simple, quand tu crées un sketch, tu dois avoir un fichier MonSketch.ino dans un répertoire MonSketch, du même nom.

Ensuite pour l'exemple de la librairie Morse, je te suggère pour commencer de mettre tes 2 fichiers Morse.h & Morse.cpp dans ton répertoire MonSketch, comme ça quand tu ouvrira "MonSketch.ino", ça ouvrira le h et le cpp de morse en même temps et tu pourras tout compiler d'un coup  smiley-wink

En image, le répertoire :


Et l'IDE :
20  International / Français / Re: projet inutile donc absolument necessaire on: June 25, 2013, 09:47:49 am
Ça fait une très bonne idée de caméra cachée :

  • Un forain qui tient un stand de loterie confie celui-ci à un jeune employé et s'absente
  • Quelque clients viennent et gagnent systématiquement, le stand est dévalisé

Je vous laisse imaginer la tête du jeunot quand le patron revient...
21  International / Français / Re: Arduino-->Gyro-->Servos ???? on: June 21, 2013, 04:53:51 am
Tu sais ce que ton programme doit faire, alors ce que je te propose c'est de commencer par écrire ton programme ici, sur le forum, un peu comme ça :

IF GyroX>5° SERVO1=SERVO1+3
IF GyroX<5° SERVO2=SERVO2+3

Et on aura déjà une base de discussion un peu plus solide smiley-wink
22  International / Français / Re: Arduino-->Gyro-->Servos ???? on: June 21, 2013, 04:08:32 am
Les librairie t'aident déjà pas mal, tu as les valeurs du MPU6050, tu sais piloter les servos... il ne te reste plus que la rédaction de la partie "intelligente" du programme, qui se trouve principalement dans le loop.

Personnellement, si tu débute je te déconseille d’utiliser trop de fonctions.

C'est maintenant que tu écris TON programme...  smiley-wink

Bien sur on reste là pour t'aider, mais il faut que tu te lance  smiley-lol
23  International / Français / Re: Arduino-->Gyro-->Servos ???? on: June 19, 2013, 06:06:40 am
Peux-tu STP mettre le code complet ?
24  International / Français / Re: Arduino-->Gyro-->Servos ???? on: June 19, 2013, 02:57:56 am
Il paraît manquer une librairie I2C... Qu'as-tu dans les INCLUDE au début du sketch ?
25  International / Français / Re: MPU6050 (gyro/accelero) avec lib de Jeff Rowberg on: June 17, 2013, 04:43:59 pm
Pour ceux que ça pourrait intéresser j'ai finalement trouvé :

C'est bien la synchro qui ne va pas entre les 2 codes (Processing & Arduino), j'ai fini par ajouter un caractère dans le texte informel envoyé par l'Arduino :



et ça marche :


Mais sérieusement il faudrait plutôt revoir le code côté Processing pour qu'il se synchronise correctement.
26  International / Français / Re: MPU6050 (gyro/accelero) avec lib de Jeff Rowberg on: June 14, 2013, 10:01:40 am
Cette LIB vient avec 2 exemples, celui que j'essaye de faire fonctionner avec Processing et un second plus simple qui ne fait qu'envoyer certaines données sur le port série (MPU6050_raw).

J'arrive à faire fonctionner correctement ce deuxième exemple et il me sort des données qui paraissent cohérentes au niveau du port série.

Mon problème ici se situe bien au niveau protocole d'échange entre la partie Processing & la partie Arduino et il est surement lié au fait que mon MPU6050 n'est pas connecté "exactement" comme attendu dans le code d'exemple, mais comment aller plus loin ?
27  International / Français / Re: MPU6050 (gyro/accelero) avec lib de Jeff Rowberg on: June 14, 2013, 08:44:53 am
Et voila le résultat que j’obtiens :



On voit bien des DATA arriver dans la console de Processing, mais on ne voit pas l'objet 3D bouger en fonction de ça... et je ne sais pas pourquoi  smiley-roll
28  International / Français / Re: MPU6050 (gyro/accelero) avec lib de Jeff Rowberg on: June 14, 2013, 08:42:24 am
Voici le code Processing :
Code:
import processing.serial.*;
import processing.opengl.*;
import toxi.geom.*;
import toxi.processing.*;

ToxiclibsSupport gfx;

Serial port;                         // The serial port
char[] teapotPacket = new char[14];  // InvenSense Teapot packet
int serialCount = 0;                 // current packet byte position
int aligned = 0;
int interval = 0;

float[] q = new float[4];
Quaternion quat = new Quaternion(1, 0, 0, 0);

float[] gravity = new float[3];
float[] euler = new float[3];
float[] ypr = new float[3];

void setup() {
    // 300px square viewport using OpenGL rendering
    size(300, 300, OPENGL);
    gfx = new ToxiclibsSupport(this);

    // setup lights and antialiasing
    lights();
    smooth();
 
    // display serial port list for debugging/clarity
    println(Serial.list());

    // get the first available port (use EITHER this OR the specific port code below)
    String portName = Serial.list()[0];
   
    // get a specific serial port (use EITHER this OR the first-available code above)
    //String portName = "COM4";
   
    // open the serial port
    port = new Serial(this, portName, 115200);
   
    // send single character to trigger DMP init/start
    // (expected by MPU6050_DMP6 example Arduino sketch)
    port.write('r');
}

void draw() {
    if (millis() - interval > 1000) {
        // resend single character to trigger DMP init/start
        // in case the MPU is halted/reset while applet is running
        port.write('r');
        interval = millis();
    }
   
    // black background
    background(0);
   
    // translate everything to the middle of the viewport
    pushMatrix();
    translate(width / 2, height / 2);

    // 3-step rotation from yaw/pitch/roll angles (gimbal lock!)
    // ...and other weirdness I haven't figured out yet
    //rotateY(-ypr[0]);
    //rotateZ(-ypr[1]);
    //rotateX(-ypr[2]);

    // toxiclibs direct angle/axis rotation from quaternion (NO gimbal lock!)
    // (axis order [1, 3, 2] and inversion [-1, +1, +1] is a consequence of
    // different coordinate system orientation assumptions between Processing
    // and InvenSense DMP)
    float[] axis = quat.toAxisAngle();
    rotate(axis[0], -axis[1], axis[3], axis[2]);

    // draw main body in red
    fill(255, 0, 0, 200);
    box(10, 10, 200);
   
    // draw front-facing tip in blue
    fill(0, 0, 255, 200);
    pushMatrix();
    translate(0, 0, -120);
    rotateX(PI/2);
    drawCylinder(0, 20, 20, 8);
    popMatrix();
   
    // draw wings and tail fin in green
    fill(0, 255, 0, 200);
    beginShape(TRIANGLES);
    vertex(-100,  2, 30); vertex(0,  2, -80); vertex(100,  2, 30);  // wing top layer
    vertex(-100, -2, 30); vertex(0, -2, -80); vertex(100, -2, 30);  // wing bottom layer
    vertex(-2, 0, 98); vertex(-2, -30, 98); vertex(-2, 0, 70);  // tail left layer
    vertex( 2, 0, 98); vertex( 2, -30, 98); vertex( 2, 0, 70);  // tail right layer
    endShape();
    beginShape(QUADS);
    vertex(-100, 2, 30); vertex(-100, -2, 30); vertex(  0, -2, -80); vertex(  0, 2, -80);
    vertex( 100, 2, 30); vertex( 100, -2, 30); vertex(  0, -2, -80); vertex(  0, 2, -80);
    vertex(-100, 2, 30); vertex(-100, -2, 30); vertex(100, -2,  30); vertex(100, 2,  30);
    vertex(-2,   0, 98); vertex(2,   0, 98); vertex(2, -30, 98); vertex(-2, -30, 98);
    vertex(-2,   0, 98); vertex(2,   0, 98); vertex(2,   0, 70); vertex(-2,   0, 70);
    vertex(-2, -30, 98); vertex(2, -30, 98); vertex(2,   0, 70); vertex(-2,   0, 70);
    endShape();
   
    popMatrix();
}

void serialEvent(Serial port) {
    interval = millis();
    while (port.available() > 0) {
        int ch = port.read();
        print((char)ch);
        if (aligned < 4) {
            // make sure we are properly aligned on a 14-byte packet
            if (serialCount == 0) {
                if (ch == '$') aligned++; else aligned = 0;
            } else if (serialCount == 1) {
                if (ch == 2) aligned++; else aligned = 0;
            } else if (serialCount == 12) {
                if (ch == '\r') aligned++; else aligned = 0;
            } else if (serialCount == 13) {
                if (ch == '\n') aligned++; else aligned = 0;
            }
            //println(ch + " " + aligned + " " + serialCount);
            serialCount++;
            if (serialCount == 14) serialCount = 0;
        } else {
            if (serialCount > 0 || ch == '$') {
                teapotPacket[serialCount++] = (char)ch;
                if (serialCount == 14) {
                    serialCount = 0; // restart packet byte position
                   
                    // get quaternion from data packet
                    q[0] = ((teapotPacket[2] << 8) | teapotPacket[3]) / 16384.0f;
                    q[1] = ((teapotPacket[4] << 8) | teapotPacket[5]) / 16384.0f;
                    q[2] = ((teapotPacket[6] << 8) | teapotPacket[7]) / 16384.0f;
                    q[3] = ((teapotPacket[8] << 8) | teapotPacket[9]) / 16384.0f;
                    for (int i = 0; i < 4; i++) if (q[i] >= 2) q[i] = -4 + q[i];
                   
                    // set our toxilibs quaternion to new data
                    quat.set(q[0], q[1], q[2], q[3]);

                    /*
                    // below calculations unnecessary for orientation only using toxilibs
                   
                    // calculate gravity vector
                    gravity[0] = 2 * (q[1]*q[3] - q[0]*q[2]);
                    gravity[1] = 2 * (q[0]*q[1] + q[2]*q[3]);
                    gravity[2] = q[0]*q[0] - q[1]*q[1] - q[2]*q[2] + q[3]*q[3];
       
                    // calculate Euler angles
                    euler[0] = atan2(2*q[1]*q[2] - 2*q[0]*q[3], 2*q[0]*q[0] + 2*q[1]*q[1] - 1);
                    euler[1] = -asin(2*q[1]*q[3] + 2*q[0]*q[2]);
                    euler[2] = atan2(2*q[2]*q[3] - 2*q[0]*q[1], 2*q[0]*q[0] + 2*q[3]*q[3] - 1);
       
                    // calculate yaw/pitch/roll angles
                    ypr[0] = atan2(2*q[1]*q[2] - 2*q[0]*q[3], 2*q[0]*q[0] + 2*q[1]*q[1] - 1);
                    ypr[1] = atan(gravity[0] / sqrt(gravity[1]*gravity[1] + gravity[2]*gravity[2]));
                    ypr[2] = atan(gravity[1] / sqrt(gravity[0]*gravity[0] + gravity[2]*gravity[2]));
       
                    // output various components for debugging
                    //println("q:\t" + round(q[0]*100.0f)/100.0f + "\t" + round(q[1]*100.0f)/100.0f + "\t" + round(q[2]*100.0f)/100.0f + "\t" + round(q[3]*100.0f)/100.0f);
                    //println("euler:\t" + euler[0]*180.0f/PI + "\t" + euler[1]*180.0f/PI + "\t" + euler[2]*180.0f/PI);
                    //println("ypr:\t" + ypr[0]*180.0f/PI + "\t" + ypr[1]*180.0f/PI + "\t" + ypr[2]*180.0f/PI);
                    */
                }
            }
        }
    }
}

void drawCylinder(float topRadius, float bottomRadius, float tall, int sides) {
    float angle = 0;
    float angleIncrement = TWO_PI / sides;
    beginShape(QUAD_STRIP);
    for (int i = 0; i < sides + 1; ++i) {
        vertex(topRadius*cos(angle), 0, topRadius*sin(angle));
        vertex(bottomRadius*cos(angle), tall, bottomRadius*sin(angle));
        angle += angleIncrement;
    }
    endShape();
   
    // If it is not a cone, draw the circular top cap
    if (topRadius != 0) {
        angle = 0;
        beginShape(TRIANGLE_FAN);
       
        // Center point
        vertex(0, 0, 0);
        for (int i = 0; i < sides + 1; i++) {
            vertex(topRadius * cos(angle), 0, topRadius * sin(angle));
            angle += angleIncrement;
        }
        endShape();
    }
 
    // If it is not a cone, draw the circular bottom cap
    if (bottomRadius != 0) {
        angle = 0;
        beginShape(TRIANGLE_FAN);
   
        // Center point
        vertex(0, tall, 0);
        for (int i = 0; i < sides + 1; i++) {
            vertex(bottomRadius * cos(angle), tall, bottomRadius * sin(angle));
            angle += angleIncrement;
        }
        endShape();
    }
}

Je n'ai rien modifié à part le port COM  smiley-wink
29  International / Français / Re: MPU6050 (gyro/accelero) avec lib de Jeff Rowberg on: June 14, 2013, 08:39:54 am
Voici le code Arduino :

Code:
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
MPU6050 mpu;

// uncomment "OUTPUT_TEAPOT" if you want output that matches the
// format used for the InvenSense teapot demo
#define OUTPUT_TEAPOT

#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

// packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };

volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
    mpuInterrupt = true;
}

void setup() {
    Wire.begin();

    Serial.begin(115200);
    while (!Serial); // wait for Leonardo enumeration, others continue immediately

    Serial.println(F("Initializing I2C devices..."));
    mpu.initialize();

    Serial.println(F("Testing device connections..."));
    Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

    Serial.println(F("\nSend any character to begin DMP programming and demo: "));
    while (Serial.available() && Serial.read()); // empty buffer
    while (!Serial.available());                 // wait for data
    while (Serial.available() && Serial.read()); // empty buffer again

    Serial.println(F("Initializing DMP..."));
    devStatus = mpu.dmpInitialize();
   
    if (devStatus == 0) {
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);

        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
        attachInterrupt(0, dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();

        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;

        packetSize = mpu.dmpGetFIFOPacketSize();
    } else {
        Serial.print(F("DMP Initialization failed (code "));
        Serial.print(devStatus);
        Serial.println(F(")"));
    }

    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    // if programming failed, don't try to do anything
    if (!dmpReady) return;

    // wait for MPU interrupt or extra packet(s) available
    while (!mpuInterrupt && fifoCount < packetSize) {
        // other program behavior stuff here
        // .
        // .
        // .
        // if you are really paranoid you can frequently test in between other
        // stuff to see if mpuInterrupt is true, and if so, "break;" from the
        // while() loop to immediately process the MPU data
        // .
        // .
        // .
    }

    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    fifoCount = mpu.getFIFOCount();

    // check for overflow (this should never happen unless our code is too inefficient)
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F("FIFO overflow!"));

    // otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & 0x02) {
        // wait for correct available data length, should be a VERY short wait
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
       
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

        #ifdef OUTPUT_TEAPOT
            // display quaternion values in InvenSense Teapot demo format:
            teapotPacket[2] = fifoBuffer[0];
            teapotPacket[3] = fifoBuffer[1];
            teapotPacket[4] = fifoBuffer[4];
            teapotPacket[5] = fifoBuffer[5];
            teapotPacket[6] = fifoBuffer[8];
            teapotPacket[7] = fifoBuffer[9];
            teapotPacket[8] = fifoBuffer[12];
            teapotPacket[9] = fifoBuffer[13];
            Serial.write(teapotPacket, 14);
            teapotPacket[11]++; // packetCount, loops at 0xFF on purpose
        #endif

        // blink LED to indicate activity
        blinkState = !blinkState;
        digitalWrite(LED_PIN, blinkState);
    }
}

Je dois le modifier car la pin INT entre le 328P & le MPU6050 n'est pas connectée...
30  International / Français / MPU6050 (gyro/accelero) avec lib de Jeff Rowberg on: June 14, 2013, 08:04:12 am
Bonjour,

Je me penche aujourd'hui sur mon contrôleur de vol Drotek.

C'est une carte sur laquelle on trouve :
  • Un Atmega 328P & son FDTI
  • Un MPU6050 (Gyro+Accelero)
  • Un HMC5883 (Magnétomètre)
  • Un MS5611 (Altimètre)

Je me concentre actuellement sur le MPU6050 et je n'arrive pas à faire fonctionner l'exemple fournit la LIB de Jeff Rowberg.

Cet exemple se divise en 2 parties, une Arduino & Une Processing et le résultat final doit donner à peu près ça :


Les problèmes que je rencontre dans un second message...
Pages: 1 [2] 3 4 ... 25