[RESOLU]Utilisation gyroscope et écran LCD sur le même Arduino nano

Bonjour
un petit soucis encore
sur le même Arduino nano, j'utilise:
afficheur I2C LCD 20x4
GPS WAVGAT GY-NEO6MV2
gyroscope C74 GY-521 MPU-6050
clavier à Membrane 4x4
le schéma:

le code:

#include "LiquidCrystal_I2C.h"
#include "Timer.h"
#include "I2Cdev.h"
#include <Keypad.h>
#include "MPU6050_6Axis_MotionApps20.h"
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif
MPU6050 mpu;
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
Quaternion q;           // [w, x, y, z]         quaternion container
#define OUTPUT_READABLE_YAWPITCHROLL
#define INTERRUPT_PIN 2  // gyroscope, use pin 2 on Arduino Uno & most boards
bool dmpReady = false;  // set true if DMP init was successful
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3],ypr_precedent[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
int connection_ordi;     
const byte ROWS = 4; //nombre de lignes
const byte COLS = 4; //nombre de colonnes
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
int etat;
byte rowPins[ROWS] = {10, 9, 8, 7}; //entrées numériques où sont branchées les lignes
byte colPins[COLS] = {6, 5, 4, 3}; //entrées numériques où sont branchées les colonnes
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int correctif_x, correctif_y,signe_x,signe_y;
Timer monTimer1;
SoftwareSerial mySerial(11, 12); // RX, TX du GPS
TinyGPSPlus gps; // Call the contructor for the Class.
LiquidCrystal_I2C lcd(0x68, 20, 4); //adresse trouvée avec I2cScanner.ino
//**************************************************
void setup() {
 #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif
  unsigned int time_hold = 4;
  keypad.setHoldTime(time_hold);
    keypad.setDebounceTime(300);
    connection_ordi = 0;
  Serial.begin(9600);
  mySerial.begin(9600);
  while (!Serial) {;
  }
  while (!mySerial) {;
  }
          Serial.println('m');
mpu.initialize();
    pinMode(INTERRUPT_PIN, INPUT);
    devStatus = mpu.dmpInitialize();
    if (devStatus == 0) {
        mpu.setDMPEnabled(true);

        attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();
        dmpReady = true;
        packetSize = mpu.dmpGetFIFOPacketSize();
    }

 monTimer1.every(1000, info); 
 lcd.init(); // initialisation de l'afficheur
}
//******************************************************************
void loop() { // run over and over
 lcd.backlight();
 // Envoi du message
 lcd.setCursor(0, 0);
 lcd.print(" Go Tronic");
 lcd.setCursor(0,1);
 lcd.print(" ");
 lcd.setCursor(0, 2);
 lcd.print(" I2C Serial");
 lcd.setCursor(0, 3);
 lcd.print(" LCD");
 int received;                        // Variable servant à récupérer les chaines du PC
monTimer1.update();
if (Serial.available()>0) {          // Si des données sont disponibles
    received = Serial.read();          // On les récupère
          if (received=='e') { //mise en route du timer
            connection_ordi = 1;
          }
if (received=='r') {pinMode(12,OUTPUT);}
//****************************
if (received=='g') {
gepe();
}
  //*************************************
if (received=='a') { //gestion des chiffres neg pos***************************!!!!
signe_x=Serial.read();
int b;
     b=0;
     int flot;
     char lecture[7];
     unsigned long valeur;
     lecture[6]=0;  // marque la fin de chaine
for (b = 0;b<6; b++){
                        flot = Serial.read();
                        lecture[b]=flot;
  //                      delay(100);
  }
valeur=atol(lecture+1);
correctif_x=valeur;
if (signe_x=='-') {correctif_x=correctif_x*-1;}
 }                     
          if (received=='b') {
signe_y=Serial.read();
     int b;
     b=0;
     int flot;
     char lecture[7];
     unsigned long valeur;
     lecture[6]=0;  // marque la fin de chaine
for (b = 0;b<6; b++){
                        flot = Serial.read();
                        lecture[b]=flot;
 //                       delay(100);
                        }
valeur=atol(lecture+1);
correctif_y=valeur;
if (signe_y=='-') {correctif_y=correctif_y*-1;}
etalonnage(correctif_x,correctif_y);
 }                     
}
if (!dmpReady) return;
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();
    fifoCount = mpu.getFIFOCount();
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        mpu.resetFIFO();
    } else if (mpuIntStatus & 0x02) {
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        fifoCount -= packetSize;

        #ifdef OUTPUT_READABLE_YAWPITCHROLL
            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
#endif
    }
 char lettre;
 char key = keypad.getKey();
  
  if (key != NO_KEY){
    if(key =='1'){  lettre='1';} // inutilisé
    if(key =='2'){  lettre='r';} // pad haut
    if(key =='3'){  lettre='3';} // inutilisé
    if(key =='4'){  lettre='s';} // pad gauche
    if(key =='6'){  lettre='t';} // pad droit
    if(key =='7'){  lettre='7';} // inutilisé
    if(key =='8'){  lettre='u';} // pad bas
    if(key =='9'){  lettre='9';} // inutilisé
    if(key =='5'){  lettre='v';} // bloquage axe altitude
    if(key =='*'){  lettre='*';} // synchro polaire
    if(key =='D'){  lettre='D';} // synchro sur capteur
    if(key =='A'){  lettre='A';} // vitesse lente
    if(key =='B'){  lettre='B';} // vitesse moyenne
    if(key =='C'){  lettre='C';} // vitesse rapide
    if(key =='0'){  lettre='&';} //début apprentissage
    if(key =='#'){  lettre='#';} // fin apprentissage
    Serial.println(lettre );
  }
  }
//**************************************************************
void etalonnage(int x,int y) {
    mpu.setXGyroOffset(x);
    mpu.setYGyroOffset(y);
}
void dmpDataReady() {
    mpuInterrupt = true;
}
//**************************************************************
void info() {
if (connection_ordi == 1){
float position;
String a,b,c;
position=ypr[0] * 180/M_PI;
a=String(position);
a='x'+a;
position=ypr[1] * 180/M_PI;
b=String(position);
b='y'+b;
c=a+b;
 Serial.println(c); 
}}
void gepe(){
String a,b,c;
 Attente(2000);
 if (gps.charsProcessed() < 10) {
Serial.println('g');
}
else if ((gps.charsProcessed() > 10) && (gps.altitude.isUpdated())){
a=String(gps.location.lat());
b=String(gps.location.lng());
Serial.println('g'+a+'g'+b);
}}

static void Attente(unsigned long ms)
{
unsigned long TempsDepart = millis();
do
{
while (mySerial.available())
gps.encode(mySerial.read()); //on transmet à la biblothèque TinyGPS++ les données envoyées par le modume GPS sur le port série 2
} while (millis() - TempsDepart < ms);
}

tout fonctionne sauf l'affichage sur le LCD
une piste peut-être, les pins A4 et A5 étant utilisés par le Gyroscope (SDA & SCL), j'ai relié l'écran aux pins A2 et A3 (SDA & SCL)
est-ce important?
en utilisant "I2cScanner.ino", j'ai trouvé l'écran à l'adresse 0x68
le fait d'utiliser LiquidCrystal_I2C.h et I2Cdev.h peut-il provoquer un conflit?
pas d'erreur à la compilation pourtant

Salut

Oui c'est important. Il n'y a pas d'I2C sur A2 A3.
L'I2C est un bus pouvant piloter plusieurs périphériques.
Connecte l'écran aussi sur A4 et A5.
Le 6050 utilise l'adresse 0x68.
Le LCD utilise souvent 0x3F.

Pour en être sûr utilise un I2C scanner.
Et pense à régler le contraste du LCD, le petit potentiomètre bleu, sinon tu ne verras pas grand chose sur l'écran.

@+

Merci pour ton expertise: ça marche au poil!!
j'ai appris par la même occasion qu'en dehors des TXx il y avait d'autres pins spécialisés sur le nano
pour le LCD c'était 0x27 et I2Cscanner me l'a vite trouvé
j'aurais jamais pensé raccorder deux "périphériques" sur les mêmes pins mais ça marche
peut-être est-ce à rapprocher d'un bus USB sur ordi
merci encore :slight_smile:

je lis et relis le règlement...comment rajouter le tag "résolu"???

Il faut éditer le titre du premier message et ajouter [RESOLU] :

[RESOLU] Utilisation gyroscope et écran LCD sur le même Arduino nano

@+

Merci :slight_smile: