Come mettere insieme Arduino Nano, Giroscopio GY-521 e Display LCD 2004 I2C 20x4

Salve,

eccomi qui con il mio secondo problema, ho comprato tutto il necessario per realizzare il mio primo progetto con arduino seguendo le indicazioni di questa pagina Bolla elettronica 2 assi con mpu6050 e Arduino | danielealberti.it
L’unica differenza è che utilizzo un Arduino nano.

Ho montato il tutto e caricato lo sketch sull’arduino, ma ahime il display si accende senza segnare niente.
Cosa c’è che non va? cosa potrei aver sbagliato?
Ho provato a caricare altre sketch per testare il display, ma mi da sempre lo stesso risultato.

Avete consigli?

Grazie

Ciao rabbit
Cosa vedi nel monitor seriale ?
Hai installato la libreria dell'LCD?
Aloha

Sullo schermo non appare niente, rimane blu senza dare alcun tipo di segnale

ho usato questo codice includendo la libreria LiquidCrystal_I2C

#include <LiquidCrystal_I2C.h>
#include <rgb_lcd.h>
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd lcd;

const int MPU = 0x68;
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
int16_t RollVal, PitchVal, PrevRollVal, PrevPitchVal;

void setup() {

  Serial.begin(115200);
  Wire.begin();
  
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);    
  Wire.endTransmission(true);
  
  lcd.begin(16, 2);
  lcd.setRGB(50, 100, 200);
  lcd.setCursor(0, 0);
  lcd.print("DanieleAlberti");
  lcd.setCursor(13, 1);
  lcd.print(".It");
  delay(3000);
  lcd.clear();
  
  lcd.setRGB(200, 100, 200);
  lcd.setCursor(0, 0);
  lcd.print("Bolla");
  lcd.setCursor(5, 1);
  lcd.print("Elettronica");
  delay(3000);
  lcd.clear();
  lcd.setRGB(255, 255, 255);
}

void loop() {

  Wire.beginTransmission(MPU);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 14, true); // request a total of 14 registers
  AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  
  PrevPitchVal = PitchVal;
  PrevRollVal = RollVal;
  
  PitchVal = atan2(AcX , AcZ) * 57.3;
  RollVal = atan2(AcY , AcZ) * 57.3;
  
  lcd.setCursor(0, 0);
  lcd.print("X angle: ");
  lcd.print(PitchVal);
  
  lcd.setCursor(0, 1);
  lcd.print("Y angle: ");
  lcd.print(RollVal);
  
  Serial.print("x: ");
  Serial.println(AcX);
  
  Serial.print("y: ");
  Serial.println(AcY);
  
  Serial.print("z: ");
  Serial.println(AcZ);
  
  Serial.print("Roll: ");
  Serial.println(RollVal);
  
  Serial.print("Pitch: ");
  Serial.println(PitchVal);
  
  delay(500);
  lcd.clear();
}

oggi ho fatto anche altre prove caricando i sketch esempio della libreria LiquidCrystal_I2C per l’esattezza questo qui sotto e come risultato sono apparse sul display un paio di lettere ma non “Hello world!”

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Hello, world!");
  lcd.setCursor(2,1);
  lcd.print("Ywrobot Arduino!");
   lcd.setCursor(0,2);
  lcd.print("Arduino LCM IIC 2004");
   lcd.setCursor(2,3);
  lcd.print("Power By Ec-yuan!");
}


void loop()
{
}

ho provato anche come suggerito da un video su youtube di cambiare l’indirizzo del display da 0x27 a 0x3F, ma anche in questo caso senza alcun risultato.

  1. verifica di avere le resistenze di pull-up sul bus I2C (sono obbligatorie)

  2. butta via la libreria LiquidCrystal_I2C (di cui, oltretutto, dai problemi che descrivi, potresti avere una vecchia versione con un noto buco) ed, al suo posto, usa quella che ti allego, manutenuta da un utente del forum, ampiamente utilizzata e collaudata (guarda gli esempi per capire come usarla … ha praticamnete gli stessi nomi di funzioni)

Guglielmo

PCF8574_HD44780_I2C.zip (503 KB)

gpb01:

  1. verifica di avere le resistenze di pull-up sul bus I2C (sono obbligatorie)

ok non ero a conoscenza della necessità di utilizzare delle resistenze di pull-up.
Ho dato un occhiata nella rete ma non ho ben capito come andrebbero collegate, avreste qualche esempio?

gpb01:
2. butta via la libreria LiquidCrystal_I2C (di cui, oltretutto, dai problemi che descrivi, potresti avere una vecchia versione con un noto buco) ed, al suo posto, usa quella che ti allego, manutenuta da un utente del forum, ampiamente utilizzata e collaudata (guarda gli esempi per capire come usarla ... ha praticamnete gli stessi nomi di funzioni)

Grazie del consiglio, darò un occhiata nel pomeriggio a questa libreria.

Alessandro

rabbit86:
ok non ero a conoscenza della necessità di utilizzare delle resistenze di pull-up.

Intanto allora studiati cosa è e come funziona un bus I2C ...prima QUI e poi QUI, dopo di che colleghi due resistenze, vanno bene da 4.7K, da Vcc una verso SCL ed una verso SDA ...


Guglielmo

Eccomi qua, letto i link che mi hai consigliato ed installato le due resistenza da 4,7K.
HO incluso la tua libreria e ho provato gli esempi integrandoli allo skech che avevo preso dal sito del progetto, ma ho ancora qualche problema di programmazione.

Quando si avvia il programma appare la scritta Hello World come previsto, ma nel riprodurre il loop le scritte x angle e Y angle sono nitide, ma il numero successivo, cioè i gradi di inclinazione non sono numeri ma forme senza senso non riconducibili a nessun numero.

Cos’è che non va?

Vi allego qui lo sketch che sto utilizzando.

#include <PCF8574_HD44780_I2C.h>
#include <Wire.h>

PCF8574_HD44780_I2C lcd(0x27,16,2);
const int MPU = 0x68;
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
int16_t RollVal, PitchVal, PrevRollVal, PrevPitchVal;


void setup() 
{
  Serial.begin(115200)
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);    
  Wire.endTransmission(true);

  lcd.init();                        
  lcd.backlight();      
  lcd.clear(); 
  
  
  lcd.setCursor(0, 0);
  lcd.print("Hallo");
  lcd.setCursor(0, 1);
  lcd.print("World");
  delay(3000);
  lcd.clear();
  
  
}
void loop() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  
Wire.requestFrom(MPU, 14, true); // request a total of 14 registers
  AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

  PrevPitchVal = PitchVal;
  PrevRollVal = RollVal;

  PitchVal = atan2(AcX , AcZ) * 57.3;
  RollVal = atan2(AcY , AcZ) * 57.3;

  lcd.setCursor(0, 0);
  lcd.print("X angle: ");

  lcd.print(PitchVal);
  lcd.setCursor(0, 1);

  lcd.print("Y angle: ");
  lcd.print(RollVal);

  Serial.print("x:");
  Serial.println(AcX);

  Serial.print("y:");
  Serial.println(AcY);

  Serial.print("z: ");
  Serial.println(AcZ);

  Serial.print("Roll: ");
  Serial.println(RollVal);

  Serial.print("Pitch: ");
  Serial.println(PitchVal);

  delay(500);
  lcd.clear();
}