NS.One dan Sensor Kompas CMPS10

CMPS10 adalah kompas digital yang dibuat oleh Devantech, yang memiliki fitur magnetometer 3-axis dan akselerometer 3-axis untuk meng-kompensasi kemiringan hingga 60º. Data dari modul ini dapat diakses melalui serial, I2C dan sebagai output PWM. Selain pembacaan bearing dengan resolusi 0.1º, sensor ini pun memberikan informasi mengenai pitch, roll, serta pembacaan dari akselerometer dan magnetometer.
NS.One dan CMPS10Berikut adalah satu contoh program untuk membaca informasi dari CMPS10 secara I2C, dan menampilkannya pada layar LCD. Alamat CMPS10 adalah 0xC0, namun pustaka Wire menggunakan nilai 7-bit, dengan menggeser satu bit ke kanan, menjadi 0x60.

#include <LiquidCrystal.h>
#include <Wire.h>

#define ADDRESS 0x60               // Defines address of CMPS10

LiquidCrystal lcd(24,25,26,28,29,30,31);

void setup() {
  Wire.begin();                    
  lcd.begin(16,2);
  lcd.print("Welcome to NS.One");
  int ver = soft_ver();
  lcd.setCursor(0,1);
  lcd.print("Versi: ");
  lcd.print(ver);
  delay(2000);  
}

void loop() {
   byte msb, lsb, 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
   msb = Wire.read();           
   lsb = Wire.read();            
   pitch = Wire.read();              
   roll = Wire.read();               
// Calculate full bearing
   bearing = ((msb<<8)+lsb)/10;
// Calculate decimal place of bearing
   fine = ((msb<<8)+lsb)%10; 
   display_data(bearing, fine, pitch, roll); 
   delay(100); 
} 

void display_data(int b, int f, int p, int r) { 

 lcd.clear(); 
 lcd.print("Arah:"); 
 lcd.setCursor(0,1); 
 if ((b >= 338) || (b <= 22))
   lcd.print("Utara"); 
 else if ((b >= 23) && (b <= 67)) 
   lcd.print("Timur Laut"); 
 else if ((b >= 68) && (b <= 112)) 
   lcd.print("Timur"); 
 else if ((b >= 113) && (b <= 157)) 
   lcd.print("Tenggara"); 
 else if ((b >= 158) && (b <= 202)) 
   lcd.print("Selatan"); 
 else if ((b >= 203) && (b <= 247)) 
   lcd.print("Barat Daya"); 
 else if ((b >= 248) && (b <= 292)) 
   lcd.print("Barat"); 
 else if ((b >= 293) && (b <= 337)) 
   lcd.print("Barat Laut");
}

// Software version of CMPS10 is read into data and then returned
int soft_ver(){
   int data;        

   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
// Sends the register we wish to start reading from
   Wire.write((byte)0);                           
   Wire.endTransmission();
// Request byte from CMPS10
   Wire.requestFrom(ADDRESS, 1);                  
   while(Wire.available() < 1);
   data = Wire.read();           
   return(data);
}

NEXT SYSTEM
Microcontroller & Robotic Learning Center
ITC Kosambi Ruko F2
Jl. Baranang Siang 6-8
Bandung 40112
Tel. (022) 4222062, (022) 70775874

Email : info@nextsys.web.id