Pages: [1]   Go Down
Author Topic: DUE and pressure sensor with I2C  (Read 1454 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i have arduino due board and i want to integrate pressure sensor MPL3115A2 from sparkfun with my board.the interface is I2C.i burned the following code given on the sparkfun website but it doesnt work on my board.help me out.

/*
  MPL3115A2 Altitude Sensor Example
  SparkFun Electronics, A.Weiss, 7/17/2012
  Beerware License - whatever
 
  Hardware Connections:
  -VCC = 3.3V
  -SDA = A4, SCL = A5
  -INT pins can be left unconnected for this demo
 
  Usage:
  -Serial terminal at 9600bps
  -Prints altitude in meters, temperature in degrees C, with 1/16
   resolution.
  -software enabled interrupt on new data, ~1Hz with full resolution
  -the IIC_support file contains the IIC read and write functions
  -IIC_support.ino is just another .ion sketch that holds functions
   that do not need to be modified.
 
*/

#include <Wire.h> // for IIC communication

const int SENSORADDRESS = 0x60; // address specific to the MPL3115A1,
                                // value found in datasheet
void setup()
{
  Wire.begin();        // join i2c bus
  Serial.begin(9600);  // start serial for output
 
  // This is a basic II2 communication check. If the sensor doesn't
  // return decicmal number 196 (see 0x0C register in datasheet),
  // "IIC bad" is printed, otherwise nothing happens.
  if(IIC_Read(0x0C) == 196); //checks who_am_i bit for basic I2C handshake test
  else Serial.println("i2c bad");
 
  // Enable and configure the sensor.
  sensor_config();
}

void loop()
{
  sensor_read_data();
  // your code here
}

boolean check_new()
{
  // This function check to see if there is new data.
  // You can call this function and it will return TRUE if there is
  // new data and FALSE if there is no new data.
 
  // If INT_SOURCE (0x12) register's DRDY flag is enabled, return
  if(IIC_Read(0x12) == 0x80) // check INT_SOURCE register on
                             // new data ready (SRC_DRDY)
  {
      return true;
  }
  else return false;
}

void sensor_config()
{
  // To configure the sensor, find the register hex value and
  // enter it into the first field of IIC_Write (see below). Then
  // fingure out the hex value of the data you want to send.
  //
  // For example:
  // For CTRL_REG1, the address is 0x26 and the data is 0xB9
  // 0xB9 corresponds to binary 1011 1001. Each place holder
  // represents a data field in CTRL_REG1.
 
  // CTRL_REG1 (0x26): enable sensor, oversampling, altimeter mode
  IIC_Write(0x26, 0xB9);
 
  // CTRL_REG4 (0x29): Data ready interrupt enbabled
  IIC_Write(0x29, 0x80);
 
  // PT_DATA_CFG (0x13): enable both pressure and temp event flags
  IIC_Write(0x13, 0x07);
 
  // This configuration option calibrates the sensor according to
  // the sea level pressure for the measurement location
 
  // BAR_IN_MSB (0x14):
  IIC_Write(0x14, 0xC6);
 
  // BAR_IN_LSB (0x15):
  IIC_Write(0x15, 0x5B);
}

void sensor_read_data()
{
  // This function reads the altitude and temperature registers, then
  // concatenates the data together, and prints in values of
  // meters for altitude and degrees C for temperature.
 
  // variables for the calculations
  int m_altitude, m_temp, c_altitude;
  // these must be floats since there is a fractional calculation
  float l_altitude, l_temp; 
  float altitude, temperature;
 
  // read registers 0x01 through 0x05
  m_altitude = IIC_Read(0x01);
  c_altitude = IIC_Read(0x02);
  // the least significant bytes l_altitude and l_temp are 4-bit,
  // fractional values, so you must cast the calulation in (float),
  // shift the value over 4 spots to the right and divide by 16 (since
  // there are 16 values in 4-bits).
  l_altitude = (float)(IIC_Read(0x03)>>4)/16.0;
  m_temp = IIC_Read(0x04); //temp, degrees
  l_temp = (float)(IIC_Read(0x05)>>4)/16.0; //temp, fraction of a degree
 
  // here is where we calculate the altitude and temperature
  altitude = (float)((m_altitude << smiley-cool|c_altitude) + l_altitude;
  temperature = (float)(m_temp + l_temp);
 
  // wait here for new data
  while(check_new() == false);
 
  // once there is new data, it is printed
  Serial.print(altitude); // in meters
  Serial.print(",");
  Serial.println(temperature); // in degrees C
}

// These are the two I2C functions in this sketch.
byte IIC_Read(byte regAddr)
{
  // This function reads one byte over IIC
  Wire.beginTransmission(SENSORADDRESS);
  Wire.write(regAddr);  // Address of CTRL_REG1
  Wire.endTransmission(false); // Send data to I2C dev with option
                               //  for a repeated start. THIS IS
                               //  NECESSARY and not supported before
                               //  Arduino V1.0.1!!!!!!!!!
  Wire.requestFrom(SENSORADDRESS, 1); // Request the data...
  return Wire.read();
}

void IIC_Write(byte regAddr, byte value)
{
  // This function writes one byto over IIC
  Wire.beginTransmission(SENSORADDRESS);
  Wire.write(regAddr);
  Wire.write(value);
  Wire.endTransmission(true);
}
Logged

London, UK
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SDA and SCL are on pins 20 and 21 on the Due, I believe you are trying to use the pins for Uno.

Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Check the address. 

I have done i2c with lcd, I have read lcd manual and ran into two problems.
Problem 1 was that lcd manufacturer used 8 bit address, so I had to convert it to 7 bits.
Problem 2 was that the manufacturer listed the address in the manual and I thought it was already in hex, but the address they listed in reality was a decimal, took me two days to figure it out.
So in order to make the lcd work I had to do two things.  Convert the decimal to binary, get rid of the last bit so now I had 7 bits for address, convert binary to hex.  That, finally!, gave me the right address.
Logged

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

the connection is right.i burned the following I2C scanning code to check slave device addrees but it shows "no I2C device found".
http://playground.arduino.cc/Main/I2cScanner
 i dont is there any problem with DUE board,its beta version IDE or what?
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

the connection is right.i burned the following I2C scanning code to check slave device addrees but it shows "no I2C device found".
http://playground.arduino.cc/Main/I2cScanner
 i dont is there any problem with DUE board,its beta version IDE or what?
From reading the Due board, the i2cScanner does not work on Due.  Lots of people tried it before, so you can forget using i2cScanner at this time.
Logged

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

Then what should i do to make the I2C connection working with Altitude sensor?plz guys help me.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Then what should i do to make the I2C connection working with Altitude sensor?plz guys help me.
Let start with basics.

Due uses 3.3 volts.  So the data and clock pulses on the i2c bus from Due to the other devices are going to be 3.3 volts.  Does your sensor able to use 3.3 volt pulses? 
Logged

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

yeah i know the Due operates at 3.3 volts and i think my device is also 3.3volts operating.
https://www.sparkfun.com/products/11084
Logged

Pages: [1]   Go Up
Jump to: