[ATX] [POP-XT] CMPS10 – Tilt Compensated Compass Module

 CMPS10 โมดูวัดเข็มทิศและวัดความเอียงแบบมีการชดเชยค่า

 

 401833_522753364448939_1252048894_n

        โมดูล CMPS10 คือโมดูลเข็มทิศดิจิตอลและโมดลวัดความเอียงในตัวเดียวกัน  ภายในมีเซนเซอร์วัดสนามแม่เหล็ก 3 แกนและเซนเซอร์วัดความเร่งอีก 3 แกน ใช้ไมโครคอนโทรลเลอร์16 บิต (PIC24F) ที่มีประสิทธิภาพออกแบบมาเพื่อลดความผิดพลาดที่เกิดขึ้นจากการเอียงของแผ่นวงจรพิมพ์ด้วย CMPS10 จะให้เอาต์พุตออกมาหลายรูปแบบดังนี้

            1. ค่าทิศทางแบบหยาบ 0-255 สำหรับทิศทางรอบตัว
            2. ค่าทิศทางแบบละเอียด 0-3599 ใช้แทนทิศรอบตัว 0 ถึง 359.9 องศา
            3. ค่าดิบของเซนเซอร์วัดค่าสนามแม่เหล็กทั้ง 3 แกน 16 บิต
            4. ค่าดิบของเซนเซอร์วัดค่าความเอียงทั้ง 3 แกน 16 บิต
            5. ค่า มุมยก (pitch) มีค่าระหว่าง -85 ถึง 85 องศา เทียบกับแนวระนาบ
            6. ค่ามุมเอียง (roll) มีค่าระหว่าง -85 ถึง 85 องศา เทียบกับแนวระนาบ

        CMPS10 ใช้ไฟเลี้ยง 3.3-5V กินกระแส 25mA  สามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์ได้ 3 รูปแบบคือ I2C บัส,บัสสื่อสารอนุกรม , และ PWM  โดยแต่ละโหมดการเชื่อมต่อจะมีรูปแบบดังนี้

        1). I2C บัสมีรูปแบบขาใช้งานดังรูป ในโหมดนี้ขา Mode ต้องปล่อยลอยไว้ ขาใช้งานหลัก ๆ มี 4 ขา
971826_522786311112311_1381866872_n

 

                1. +3.3-5V ขาไฟเลี้ยง
                2. SDA ขารับส่งข้อมูล
                3. SCL ขาสัญญาณนาฬิกา
                4. GND ขากราวด์

         2). สื่อสารอนุกรม มีขาต่อใช้งานดังรูป โดยขา Mode จะต้องต่อลงกราวด์ มีขาใช้งาน 4 ขาเช่นกันดังนี้  

375133_522786341112308_164326872_n

                1. +3.3-5V ขาไฟเลี้ยง
                2. Tx ขาส่งข้อมูล
                3. Rx ขารับข้อมูล
                4. GND ขากราวด์

        3). อ่านค่าโดยตรวจสอบค่าความกว้างพัลส์ใช้ขา Select PWM ต่อลงกราวด์  ขาใช้งานมีเพียง 3 ขา  

184524_522786327778976_1539607038_n

                1. +3.3-5V ขาไฟเลี้ยง
                2. PWM out ขารับค่าความกว้างพัลส์
                3. GND ขากราวด์  

 ตัวอย่างเบื้องต้นสำหรับการสื่อสารด้วยระบบบัส I2C กับบอร์ด POPXT 

267677_522786381112304_1747625176_n

        ตัวอย่างนี้จะนำค่าเวอร์ชั่น ทิศทาง มุมยก และมุมเอียง มาแสดงที่หน้าจอ GLCD โดย ตัวอย่างโค้ดมีดังนี้

/****************************************************************
*                  Arduino CMPS10 example code                  *
*                    CMPS10 running I2C mode                    *
*                    by James Henderson, 2012                   *
*****************************************************************/
#include "popxt.h"
#include "Wire.h"
#define ADDRESS 0x60
void setup(){
   Wire.begin();
   setTextSize(2);
   glcdMode(3);
}

void loop(){
   byte highByte, lowByte, fine;            
   char pitch, roll;                         
   int bearing;                              

   Wire.beginTransmission(ADDRESS);          
   Wire.write(2);                             
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);        
   while(Wire.available() < 4);           
   highByte = Wire.read();           
   lowByte = Wire.read();            
   pitch = Wire.read();              
   roll = Wire.read();               

   bearing = ((highByte<<8)+lowByte)/10;       
   fine = ((highByte<<8)+lowByte)%10;           

   display_data(bearing, fine, pitch, roll);  

   delay(100);
}
void display_data(int b,int f,int p,int r){
   glcd(0,0,"CMPS10 V:%d  ",soft_ver());
   glcd(1,0,"Bearing=%d.%d   ",b,f);
   glcd(2,0,"Pitch=%d  ",p);
   glcd(3,0,"Roll=%d   ",r);
}
int soft_ver(){
   int data;                                  

   Wire.beginTransmission(ADDRESS);
   Wire.write((byte)0);                          
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 1);                 
   while(Wire.available() < 1);
   data = Wire.read();           

   return(data);
}

969558_522789331112009_2129885921_n

        และตัวอย่างสำหรับ Robo-Creator ก็มีการเขียนในลักษณะเดียวกัน โดยตัวอย่างนี้จะนำค่าที่อ่านได้ออกแสดงที่หนาจอ LCD ขนาด 16×2 แทน

/****************************************************************
*                  Wiring  CMPS10 example code                  *
*                    CMPS10 running I2C mode                    *
*                    by James Henderson, 2012                   *
*****************************************************************/
#include "atx.h" // include file for Robo-Creator R1
#include "Wire.h"
#define ADDRESS 0x60   
void setup(){
      Wire.begin(); 
}
byte HByte, LByte, fine;              
char pitch, roll;                  
int bearing;  
void loop(){
   Wire.beginTransmission(ADDRESS); 
   Wire.write(2);                   
   Wire.endTransmission();
   Wire.requestFrom(ADDRESS, 4); 
   while(Wire.available() < 4);  
   HByte = Wire.read();           
   LByte = Wire.read();            
   pitch = Wire.read();              
   roll = Wire.read();               

   bearing = ((HByte<<8)+LByte)/10;
   fine = ((HByte<<8)+LByte)%10;   
   display_data(bearing, fine, pitch, roll); 
   delay(100);
}
void display_data(int b, int f, int p, int r){ 
   lcd("Bearing=%d.%d   ",b,f);
   lcd("#nPit=%d Roll=%d   ",p,r);
   delay(5);
}
int soft_ver(){
   int data;                                 
   Wire.beginTransmission(ADDRESS);
   Wire.write((byte)0);         
   Wire.endTransmission();
   Wire.requestFrom(ADDRESS, 1);
   while(Wire.available() < 1);
   data = Wire.read();           
   return(data);
}

 

Facebook Comments