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