Hello, does anyone know about serial control on cmps10 ( Tilt Compensated Magnetic Compass) with aduino?
Thanks.
http://www.robot-electronics.co.uk/htm/cmps10doc.htm
http://www.robot-electronics.co.uk/htm/arduino_examples.htm#Tilt%20Compensated%20Magnetic%20Compass
I know those links but I don't wanna drive a LCD display with arduino, I just wanna read the output value of cmps10.
Are you implying that you want someone to write the sketch for you? Perhaps you should offer money.
grinn:
I know those links but I don’t wanna drive a LCD display with arduino, I just wanna read the output value of cmps10.
This is not perfekt
a little step forward?
#include <Wire.h>
#define ADDRESS 0x60 // Defines address of CMPS10
void setup(){
Serial.begin(9600);
Wire.begin();
}
void loop(){
byte highByte, lowByte, fine; // highByte and lowByte store high and low bytes of the bearing and fine stores decimal place of bearing
char pitch, roll; // Stores pitch and roll values of CMPS10, chars are used because they support signed value
int bearing; // Stores full
Wire.beginTransmission(ADDRESS); //starts communication with CMPS10
Wire.write(2); //Sends the register we wish to start reading from
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // Request 4 bytes from CMPS10
while(Wire.available() < 4); // Wait for bytes to become available
highByte = Wire.read();
lowByte = Wire.read();
pitch = Wire.read();
roll = Wire.read();
bearing = ((highByte<<8)+lowByte)/10; // Calculate full bearing
fine = ((highByte<<8)+lowByte)%10; // Calculate decimal place of bearing
display_data(bearing, fine, pitch, roll); // Display data to the LCD03
delay(3000);
}
void display_data(int b, int f, int p, int r){ // pitch and roll (p, r) are recieved as ints instead oif bytes so that they will display corectly as signed values.
/*lcd03.write(LCD03_SET_CUR); // Set the LCD03 cursor position
lcd03.write(1);
lcd03.print(“CMPS10 Example V:”);
lcd03.print(soft_ver()); // Display software version of the CMPS10
delay(5); // Delay to allow LCD03 to proscess data
lcd03.write(LCD03_SET_CUR);
lcd03.write(21);
lcd03.print(“Bearing = “); // Display the full bearing and fine bearing seperated by a decimal poin on the LCD03
lcd03.print(b);
lcd03.print(”.”);
lcd03.print(f);
lcd03.print(" ");
delay(5);
lcd03.write(LCD03_SET_CUR); // Display the Pitch value to the LCD03
lcd03.write(41);
lcd03.print("Pitch = “);
lcd03.print(p);
lcd03.print(” ");
delay(5);
lcd03.write(LCD03_SET_CUR); // Display the roll value to the LCD03
lcd03.write(61);
lcd03.print("Roll = “);
lcd03.print(r);
lcd03.print(” ");*/
Serial.print("bearing: ");
Serial.println(b);
Serial.print("fine: ");
Serial.println(f);
Serial.print("pitch: ");
Serial.println(p);
Serial.print("roll: ");
Serial.println(r);
}
int soft_ver(){
int data; // Software version of CMPS10 is read into data and then returned
Wire.beginTransmission(ADDRESS);
// Values of 0 being sent with write need to be masked as a byte so they are not misinterpreted as NULL this is a bug in arduino 1.0
Wire.write((byte)0); // Sends the register we wish to start reading from
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 1); // Request byte from CMPS10
while(Wire.available() < 1);
data = Wire.read();
return(data);
}
I have modified the code from robot-electronics.com, and it’s works:
/****************************************************************
* Arduino CMPS10 example code *
* CMPS10 running I2C mode *
* by James Henderson, 2012 *
*****************************************************************/
#include <Wire.h>
//#include <SoftwareSerial.h>
#define ADDRESS 0x60 // Defines address of CMPS10
//#define LCD_RX 0x02 // RX and TX pins used for Wire03 serial port
//#define LCD_TX 0x03
#define Wire_HIDE_CUR 0x04
#define Wire_CLEAR 0x0C
#define Wire_SET_CUR 0x02
//SoftwareSerial Wire = SoftwareSerial(LCD_RX, LCD_TX); // Defines software serial port for Wire
void setup(){
Wire.begin(); // Conects I2C
Serial.begin(9600);
Wire.write(Wire_HIDE_CUR);
Wire.write(Wire_CLEAR);
}
void loop(){
byte highByte, lowByte, fine; // highByte and lowByte store high and low bytes of the bearing and fine stores decimal place of bearing
char pitch, roll; // Stores pitch and roll values of CMPS10, chars are used because they support signed value
int bearing; // Stores full bearing
Wire.beginTransmission(ADDRESS); //starts communication with CMPS10
Wire.write(2); //Sends the register we wish to start reading from
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // Request 4 bytes from CMPS10
while(Wire.available() < 4); // Wait for bytes to become available
highByte = Wire.read();
lowByte = Wire.read();
pitch = Wire.read();
roll = Wire.read();
bearing = ((highByte<<8)+lowByte)/10; // Calculate full bearing
fine = ((highByte<<8)+lowByte)%10; // Calculate decimal place of bearing
display_data(bearing, fine, pitch, roll); // Display data to the Wire
delay(100);
}
void display_data(int b, int f, int p, int r){ // pitch and roll (p, r) are recieved as ints instead oif bytes so that they will display corectly as signed values.
Wire.write(Wire_SET_CUR); // Set the Wire cursor position
Wire.write(1);
//Serial.print("CMPS10 Example V:");
//Serial.print(soft_ver()); // Display software version of the CMPS10
delay(5); // Delay to allow Wire to proscess data
Wire.write(Wire_SET_CUR);
Wire.write(21);
Serial.print("Bearing = "); // Display the full bearing and fine bearing seperated by a decimal poin on the Wire
Serial.print(b);
Serial.print(".");
Serial.print(f);
Serial.print(" \n");
delay(5);
Wire.write(Wire_SET_CUR); // Display the Pitch value to the Wire
Wire.write(41);
//Serial.print("Pitch = ");
//Serial.print(p);
//Serial.print(" /t");
delay(5);
Wire.write(Wire_SET_CUR); // Display the roll value to the Wire
Wire.write(61);
//Serial.print("Roll = ");
//Serial.print(r);
//Serial.print(" /n");
}
/*
int soft_ver(){
int data; // Software version of CMPS10 is read into data and then returned
Wire.beginTransmission(ADDRESS);
// Values of 0 being sent with write need to be masked as a byte so they are not misinterpreted as NULL this is a bug in arduino 1.0
Wire.write((byte)0); // Sends the register we wish to start reading from
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 1); // Request byte from CMPS10
while(Wire.available() < 1);
data = Wire.read();
return(data);
}
*/
Not trying to raise this thread from the dead, but for anyone who comes to this thread via google like I did, I ended up using this library someone made: https://github.com/kragniz/CMPS10