• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wyświetlacz OLED 128x32 i GY-521 MPU-6050
#1
Witam, 

Stawiam dopiero pierwsze kroki w Arduino i napotkałem na pewne problemy ze współpracą dwóch urządzeń po I2C. 
Podłączyłem po I2C wyświetlacz OLED 128x32 i żyroskop GY-521 MPU-6050. 
Każde z urządzeń osobno działa prawidłowo pod warunkiem, że są dwa niezależne programy, tzn.:
1) Z wykorzystaniem biblioteki Adafruit_SSD1306.h Próby wyświetlania tekstów na wyświetlaczu OLED są prawidłowe. 
2) Kod p. Korneliusza Jarzębskiego - MPU6050_gyro_pitch_roll_yaw - żyroskop działa i wyświetla wyniki po COM.

Próbowałem połączyć oba programy, aby wyniki z żyroskopu wyświetlały się na OLED, ale niestety nie działa, wyświetlacz jest ciemny i nic nie wyświetla. Przypuszczam, że problemem są adresy urządzeń. Ustaliłem, że OLED ma adres: 0x3C, a żyroskop 0x68. Niestety nie wiem, jak tą informację wykorzystać. 
Używam Arduino Nano. 
Poniżej kod, który testowałem. Byłbym wdzięczny za wskazówki jak zmodyfikować kod? 
Z góry dziękuję i pozdrawiam w Nowym Roku. 
Kod:
#include <SPI.h>
#include <Wire.h>
#include <MPU6050.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

MPU6050 mpu;
Adafruit_SSD1306 display(4);

// Timers
unsigned long timer = 0;
float timeStep = 0.01;

// Pitch, Roll and Yaw values
float pitch = 0;
float roll = 0;
float yaw = 0;

void setup()
{
  // Calibrate gyroscope. The calibration must be at rest.
  // If you don't want calibrate, comment this line.
  mpu.calibrateGyro();

  // Set threshold sensivty. Default 3.
  // If you don't want use threshold, comment this line or set 0.
  mpu.setThreshold(3);

display.begin(SSD1306_SWITCHCAPVCC,0x3C);
display.clearDisplay();

}

void loop()
{
  timer = millis();

  // Read normalized values
  Vector norm = mpu.readNormalizeGyro();

  // Calculate Pitch, Roll and Yaw
  pitch = pitch + norm.YAxis * timeStep;
  roll = roll + norm.XAxis * timeStep;
  yaw = yaw + norm.ZAxis * timeStep;

  // Output raw
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(1,1);
display.print("Pitch=");
display.println(pitch);
display.print("Roll=");
display.println(roll);
display.print("Yaw=");
display.println(yaw);
display.display();//odświeżanie
 
  // Wait to full timeStep period
  delay((timeStep*1000) - (millis() - timer));
}
 
Odpowiedź
#2
Jak adresy są różne to problem jest gdzie indziej. Używasz millis by określić czas delay- majstersztyk. Najprościej to poszukać innej biblioteki, można też ustawić szybkość I2C na 100kHz, ekran wymaga dużej szybkości i pewnie Adafruit ustawia na 400, możesz też zamienić kolejność inicjacji tych bibliotek, jak urządzenie pracuje na 400 to i na 100 poleci, tylko wolniej, ale jak dla drugiego limit jest 100 to może być problem. Jak wyświetlasz dane na Oled to nic nie przeszkadza by dalej je wypluwać na UART, będziesz wiedział czy program stoi, czy tylko nie widzisz efektów jego działania na oled.
Sprawdź też, czy jak masz podłączone wszystko to poszczególne programy działają, może podłączając dwa urządzenia już pojawia się problem. Magistrala I2C wymaga podciągnięcia rezystorami do Vcc, arduinowe maduły mają wbudowane rezysotory, jak będzie ich więcej włączonych równolegle to też w końcu będzie źle.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości