Pages: [1]   Go Down
Author Topic: Can't LiquidLCD Lib work with Wire Lib together?  (Read 1005 times)
0 Members and 1 Guest are viewing this topic.
Beijing
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm doing a test on MPU6050 with a LCD1602 displays the results.But lcd class can NOT work correctly after wire.begin,for MPU6050 connection with arduino,is excuted.What's wrong? Any comment is appraciated.
The source code follows:

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
 // is used in I2Cdev.h
 #include "Wire.h"
 // I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
 // for both classes must be in the include path of your project
 #include "I2Cdev.h"
 #include "MPU6050.h"
 
// class default I2C address is 0x68
 // specific I2C addresses may be passed as a parameter here
 // AD0 low = 0x68 (default for InvenSense evaluation board)
 // AD0 high = 0x69
 MPU6050 accelgyro;

 int16_t ax, ay, az;
 int16_t gx, gy, gz;

 #define LED_PIN 13
 bool blinkState = false;
 // initialize the library with the numbers of the interface pins
 LiquidCrystal lcd(12, 11, 9,8,7,6,5, 4, 3, 2);
void setup() {
    // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
 // Print a message to the LCD.
   lcd.print("hello, world!");
   
   // join I2C bus (I2Cdev library doesn't do this automatically)

 lcd.setCursor(0, 1);
    lcd.println("Initializing I2C"); // if this line appears after the next line, the string can not be displayed corectly.
     Wire.begin();
   // initialize serial communication
   // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
   // it's really up to you depending on your project)
   Serial.begin(9600);
 //while(!Serial);
   // initialize device
   Serial.println("Initializing I2C devices...");
   
   accelgyro.initialize();

   // verify connection
   Serial.println("Testing device connections...");
   Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

   // configure Arduino LED for
   pinMode(LED_PIN, OUTPUT);
 }

 void loop() {
   // read raw accel/gyro measurements from device
   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

   // these methods (and a few others) are also available
   //accelgyro.getAcceleration(&ax, &ay, &az);
   //accelgyro.getRotation(&gx, &gy, &gz);

   // display tab-separated accel/gyro x/y/z values
   ///*
   Serial.print("a/g:\t");
   Serial.print(ax);
  Serial.print("\t");
   Serial.print(ay);
  Serial.print("\t");
   Serial.print(az);
  Serial.print("\t");
   Serial.print(gx);
  Serial.print("\t");
   Serial.print(gy);
  Serial.print("\t");
   Serial.println(gz);
   //*/
 delay(1000);
 lcd.setCursor(0, smiley-cool
 // lcd.print(millis()/1000);
 lcd.print(ax);  //ax is not displayed.

lcd.setCursor(0, 1);
 lcd.print(ay);  // roung codes displayed as shown in the picture.
  // blink LED to indicate activity
   blinkState = !blinkState;
   digitalWrite(LED_PIN, blinkState);
 }

Logged

Dallas, TX USA
Offline Offline
Edison Member
*
Karma: 47
Posts: 2334
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pin collision.
Go look at the variants file for leonardo to see the pins used for i2c
It is down in
{installdir}/hardware/arduino/variants/leonardi/pins_arduino.h

You will see that i2c uses pins 2 and 3 on leonardo
(SDA and SCL)
And no, you can't just change those defines to change it.

For Leonardo, pick other pins for your lcd.

--- bill

« Last Edit: December 29, 2012, 01:35:37 pm by bperrybap » Logged

Beijing
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bperrybap,
Thank you very very much. Your reply is very helpful for me and the problem has been solved.
I wonder why leonardo be designed like that? It has seperated pins for SDA and SCL on the board, but pin 2 and pin3 are still "occupied".
Logged

Western New York, USA
Offline Offline
Faraday Member
**
Karma: 25
Posts: 4110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
lcd.println(...
I'm on vacation so I didn't take the time to read much else but this will give you unexpected results even without adding any other libraries.

Don
Logged

Dallas, TX USA
Offline Offline
Edison Member
*
Karma: 47
Posts: 2334
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bperrybap,
Thank you very very much. Your reply is very helpful for me and the problem has been solved.
I wonder why leonardo be designed like that? It has seperated pins for SDA and SCL on the board, but pin 2 and pin3 are still "occupied".

While the i2c pins are "seperated" they are not separate dedicated
pins. They are physically connected to the same AVR pins as the digital 2 and 3 pins.
They are there as a convenience for shields.

It's more of a general problem than a leonardo issue.
Some of the issue falls back on Atmel
because AVR pins can have multiple functions and different AVR chips
assign the alternative functions to different ports/bits/physical pins.

This makes it impossible to change AVR chips and maintain 100%
hardware compatibility. Adding to the problem on the software side is
the way the Arduino enviroment has done its APIs and Arduino pin mappings.

Same problem exists on UNO.
On the Uno boards, the SDA and SCL pins are also
analog pins 4 and 5 (digital pins 18 and 19)

--- bill
Logged

Pages: [1]   Go Up
Jump to: