Je suis sur un projet d’arduino avec un un accéléromètre et un écran oled 128 x 64.
Le but est d’afficher nos données d’accélération et de gyroscope sur l’écran.
Le problème est que l’affichage ne s’exécute pas correctement sur l’écran (voir photo).
Une solution ?
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ je l'ai déplacé vers le forum francophone.
Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone” ➜ donnez nous des infos sur le code, les modules, etc...
hello
quand tu auras lu "les bonnes pratiques du forum" tu sauras comment poster un code.
et pour t'aider, il nous faut ton code (entre balises)
Voici mon code, il utilise également l'accéléromètre
#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Serial.begin(115200);
// while (!Serial);
Serial.println("MPU6050 OLED demo");
if (!mpu.begin()) {
Serial.println("Sensor init failed");
while (1)
yield();
}
Serial.println("Found a MPU-6050 sensor");
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
display.clearDisplay();
display.setCursor(0, 0);
Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");
display.println("Accelerometer - m/s^2");
display.print(a.acceleration.x, 1);
display.print(", ");
display.print(a.acceleration.y, 1);
display.print(", ");
display.print(a.acceleration.z, 1);
display.println("");
Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");
display.println("Gyroscope - rps");
display.print(g.gyro.x, 1);
display.print(", ");
display.print(g.gyro.y, 1);
display.print(", ");
display.print(g.gyro.z, 1);
display.println("");
display.display();
delay(100);
}
Bonjour adrienvigier
As-tu essayé sans l'accéléromètre?
Si non essaies de mettre des résistances de pullup sur ton bus i2C, je mets, en général, 1.5k.
Eventuellement, regardes ce qu'il se fait.
Cordialement
jpbbricole
Oui j'ai déjà essayé sans l'accéléromètre mais le résultat est le meme ... je pense c'est un problème d'affichage. A quoi servirait cette resistance ?
vous avez de longs fils - ça pourrait aider à avoir un meilleur signal si vous augmentez le pullup
Bonjour J-M-L
D'après l'image,
c'est bon au début, puis ça se gâte, on pourrai supposer une désynchronisation du bus du fait d'états instables qui pourraient être améliorés par l'adjonction de ces résistances.
Cordialement
jpbbricole
nous sommes débutants, à quoi correspond le pull up ?
Si vous avez un montage en exemple je serai intéressé ! merci !
hello
un code à tester ( je n'ai pas d'accelero)
#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);
void setup() {
Serial.begin(115200);
// while (!Serial);
Serial.println("MPU6050 OLED demo");
/*
if (!mpu.begin()) {
Serial.println("Sensor init failed");
while (1)
yield();
}
Serial.println("Found a MPU-6050 sensor");
*/
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);
}
void loop() {
//sensors_event_t a, g, temp;
//mpu.getEvent(&a, &g, &temp);
display.clearDisplay();
display.setCursor(0, 0);
Serial.print("Accelerometer ");
Serial.print("X: ");
// Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
// Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
// Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");
//display.setTextSize(2);
display.println("Accelerometre m/s^2");
//display.setCursor(65, 0);
// display.println("m/s^2");
//display.setTextSize(1);
display.print(123, 1);
display.print(", ");
display.print(789, 1);
display.print(", ");
display.print(741, 1);
display.println("");
Serial.print("Gyroscope ");
Serial.print("X: ");
// Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
// Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
//Serial.print(g.gyro.z, 1);
Serial.println(" rps");
//display.setTextSize(2);
display.println("Gyroscope rps");
// display.setTextSize(1);
display.print(147, 1);
display.print(", ");
display.print(258, 1);
display.print(", ");
display.print(369, 1);
display.println("");
display.display();
delay(100);
}
Bonsoir
L'affichage sur le moniteur série fonctionne correctement ?
As-tu essayé de mettre un seul display.print("test");
pour voir le résultat ?
Bonjour,
Ton écran utilise le chipset SH1106.
Il faut utiliser la librairie Adafruit_SH110X.
#include <Adafruit_MPU6050.h>
#include <Adafruit_SH110X.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;
Adafruit_SH1106G display(128, 64, &Wire, -1);
void setup() {
Serial.begin(115200);
// while (!Serial);
Serial.println("MPU6050 OLED demo");
/*
if (!mpu.begin()) {
Serial.println("Sensor init failed");
// while (1)
// yield();
}
Serial.println("Found a MPU-6050 sensor");
*/
if (!display.begin(0x3C,true)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
display.setTextSize(1);
display.setTextColor(1);
display.setRotation(0);
}
void loop() {
sensors_event_t a, g, temp;
// mpu.getEvent(&a, &g, &temp);
display.clearDisplay();
display.setCursor(0, 0);
Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");
display.println("Accelerometer - m/s^2");
display.print(a.acceleration.x, 1);
display.print(", ");
display.print(a.acceleration.y, 1);
display.print(", ");
display.print(a.acceleration.z, 1);
display.println("");
Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");
display.println("Gyroscope - rps");
display.print(g.gyro.x, 1);
display.print(", ");
display.print(g.gyro.y, 1);
display.print(", ");
display.print(g.gyro.z, 1);
display.println("");
display.display();
delay(100);
}
J'ai mis en commentaire la lecture de l'accéléromètre.
Bonne nouvelle ! En effet, après avoir rentré ce code avec la nouvelle bibliothèque, il fonctionne, plus de pixels blancs en bas de l'écran, cependant lorsque j'ai retiré les commentaires, pour ainsi prendre en compte la lecture de l'accéléromètre, rien ne bouge, il ne prend pas les valeurs, je ne comprends pas comment changer cela, voici le code que j'ai rentré:
#include <Adafruit_MPU6050.h>
#include <Adafruit_SH110X.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;
Adafruit_SH1106G display(128, 64, &Wire, -1);
void setup() {
Serial.begin(115200);
// while (!Serial);
Serial.println("MPU6050 OLED demo");
if (!mpu.begin()) {
Serial.println("Sensor init failed");
while (1)
yield();
}
Serial.println("Found a MPU-6050 sensor");
if (!display.begin(0x3C,true)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
display.setTextSize(1);
display.setTextColor(1);
display.setRotation(0);
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
display.clearDisplay();
display.setCursor(0, 0);
Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");
display.println("Accelerometer - m/s^2");
display.print(a.acceleration.x, 1);
display.print(", ");
display.print(a.acceleration.y, 1);
display.print(", ");
display.print(a.acceleration.z, 1);
display.println("");
Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");
display.println("Gyroscope - rps");
display.print(g.gyro.x, 1);
display.print(", ");
display.print(g.gyro.y, 1);
display.print(", ");
display.print(g.gyro.z, 1);
display.println("");
display.display();
delay(100);
}
Qu'est-ce qui s'affiche dans le moniteur série?
On dirait que ton programme reboot tout seul. J'avoue que je ne comprend pas pourquoi.
est-ce que ça peut venir des branchements ?
A mon avis les deux librairies (pour le MPU et pour l'écran) prennent trop de ram, ce qui fait planter le programme.
Pour l'écran essaie la libraire SSD1306Ascii qui est très légère et supporte aussi le SH1106.
Il faudrait placer un Serial.print() après l'initialisation de l'écran pour voir si ce n'est pas l'allocation du buffer graphique qui fait planter.
Qu'elle est la quantité de RAM retourné par le compilateur?