CMPS10 โมดูวัดเข็มทิศและวัดความเอียงแบบมีการชดเชยค่า
โมดูล CMPS10 คือโมดูลเข็มทิศดิจิตอลและโมดลวัดความเอียงในตัวเดียวกัน ภายในมีเซนเซอร์วัดสนามแม่เหล็ก 3 แกนและเซนเซอร์วัดความเร่งอีก 3 แกน ใช้ไมโครคอนโทรลเลอร์16 บิต (PIC24F) ที่มีประสิทธิภาพออกแบบมาเพื่อลดความผิดพลาดที่เกิดขึ้นจากการเอียงของแผ่นวงจรพิมพ์ด้วย CMPS10 จะให้เอาต์พุตออกมาหลายรูปแบบดังนี้
CMPS10 ใช้ไฟเลี้ยง 3.3-5V กินกระแส 25mA สามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์ได้ 3 รูปแบบคือ I2C บัส,บัสสื่อสารอนุกรม , และ PWM โดยแต่ละโหมดการเชื่อมต่อจะมีรูปแบบดังนี้
2). สื่อสารอนุกรม มีขาต่อใช้งานดังรูป โดยขา Mode จะต้องต่อลงกราวด์ มีขาใช้งาน 4 ขาเช่นกันดังนี้
3). อ่านค่าโดยตรวจสอบค่าความกว้างพัลส์ใช้ขา Select PWM ต่อลงกราวด์ ขาใช้งานมีเพียง 3 ขา
ตัวอย่างเบื้องต้นสำหรับการสื่อสารด้วยระบบบัส I2C กับบอร์ด POPXT
ตัวอย่างนี้จะนำค่าเวอร์ชั่น ทิศทาง มุมยก และมุมเอียง มาแสดงที่หน้าจอ 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); }
และตัวอย่างสำหรับ 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); }