Issuu on Google+

CMPS-10      1

CMPS-10   1. คุณสมบัติทางเทคนิค 

เปนโมดูลเข็มทิศและวัดความเอียงผลงานของ Devantech (www.robot-electronics.co.uk)

ภายในตัวโมดูลประกอบไปดวยตัวตรวจจับแมเหล็กขัวโลก ้ 3 แกนกับตัวตรวจจับความเรง 3 แกนที่ทํางานรวมกับชิปประมวลผลขนาด 16 บิต เพื่อตรวจสอบทิศ 

มีความละเอียดในการวัด 0.1 องศา

วัดความเอียงได

ใชไฟเลี้ยงในชวง +3.6 ถึง +5V ตองการกระแสไฟฟา 25mA

เชื่อมตอกับไมโครคอนโทรลเลอรได 3 วิธีคือ 1. ผานบัส I2C ความถีสั่ ญญาณนาฬิกา 100kHz ใหคาของขอมูล 0 ถึง 255 หรือ 0 ถึง 3599

2. แบบอนุกรมหรือ Serial ดวยอัตราบอด 9600 บิตตอวินาที ในรูปแบบ 8 บิตขอมูล 2 บิตหยุด ไมมีบิตพาริตี้ รองรับทั้งระดับสัญญาณ 3.3V และ 5V 3. แบบสัญญาณ PWM ดวยความกวางพัลส 1 ถึง 37 มิลลิวินาที ความละเอียดของการ เพิ่มคา 0.1 มิลลิวินาที 

ใหผลการวัด 3 แบบ ประกอบดวย 1. คาทิศทางรอบตัวในแนวแกนนอนหรือ Bearing มีคา 0 ถึง 359.9 องศา ผิดพลาด 1% 2. คามุมยกหรือ Pitch มีคา -85 ถึง 85 องศาเทียบกับแนวระนาบ ผิดพลาด 1.5% 3. คามุมเอียงหรือ Roll มีคา -85 ถึง 85 องศาเทียบกับแนวระนาบ ผิดพลาด 1.5%

ขนาด 24 x 18 มม.


2 CMPS-10     

2. การจัดขาและการกําหนดทิศ โมดูล CMPS10 มีหนาตา, การจัดขา และการกําหนดทิศทางหลักจากผูผลิ  ตแสดงในรูปที่ 1 โดยตําแหนงดังกลาวจะอางอิงกับขัวของแม ้ เหล็กโลกหรือเปนทิศเหนือ อยางไรก็ตาม ผูใช  งานสามารถ กําหนดทิศอางอิงใหมได โดยไมจําเปนตองเปนทิศเหนือเสมอไป ดวยกระบวนการทางซอฟตแวรและ ขั้นตอนทางฮารดแวรเล็กนอย CMPS10 ใชไฟเลี้ยงในชวง +3.6 ถึง +5V การเชือมต ่ อกับ CMPS10 ทําได 3 วิธีคือ โหมดบัส ่ เลือกไดทั้งแบบ Bearing, Pitch และ Roll โดย I2C, โหมดอนุกรมหรือ Serial และโหมด PWM คาทีได Bearing เปนคาทิศทางรอบตัวในแนวแกนนอน มีคาระหวาง 0 ถึง 359.9 องศา สวน Pitch เปนมุมยก มีคาระหวาง -85 ถึง 85 องศาเทียบกับแนวระนาบ และ Roll เปนมุมเอียงมีคาระหวาง -85 ถึง 85 องศา เทียบกับแนวระนาบ ดูรูปที่ 2 ประกอบ

รูปที่ 1 หนาตา, การจัดขาและการกําหนดทิศอางอิงของโมดูล รูปที่ 2 แสดงทีมาของค ่ าที่อานไดจาก เข็มทิศ CMPS10 โมดูลเข็มทิศ CMPS10


CMPS-10      3

                

                

ตารางที่ 1 รายละเอียดของรีจิสเตอรทังหมดของโมดู ้ ลเข็มทิศ CMPS10

3. การติดตอในโหมดบัส I2C แมวา CMPS10 จะเลือกติดตอได 3 แบบก็ตาม แตจากการทดสอบพบวา การติดตอกับโมดูล CMPS10 ในโหมดบัส I2C สะดวกกวาแบบอนุกรมและ PWM สําหรับ CMPS10 มีแอดเดรสสําหรับเชือมต ่ อผานระบบบัส I2C อยูที่ 0x60 มีรีจิสเตอรเก็บคา ตางๆ รวม 22 ตัว ดังแสดงในตารางที่ 1 หากสงขอมูลคําสังเป ่ น 0x00 จะเปนการอานคาเวอรชันเฟรมแวรของโมดูล CMPS10 หากสงขอมูลคําสังเป ่ น 0x02 จะเปนการอานขอมูล โดย CMPS10 จะสงขอมูลกลับมา 4 ไบต ไบตแรกเปนไบตสูงของคามุมทิศ (bearing), ไบตที่สองเปนไบตตําของค ่ ามุมทิศ, ไบตที่สามจะเปน คามุมยก (pitch) และไบตสุดทายจะเปนคามุมเอียง (roll) โดยคามุมทิศทีอ่ านไดมีคาระหวาง 0 ถึง 3599 (16 บิต) จึงตองหารดวย 10 เพื่อใหไดคามุมทิศที่มีคาระหวาง 0 ถึง 359.9 องศา


4 CMPS-10     

4. การตอวงจรเพื่อใชงานกับบอรด Unicon เตรียมอุปกรณทั้งหมดดังรูปที่ 3 ใชสาย JST3AC-8 จํานวน 2 เสนตอระหวางบอรด Unicon และโมดูล CMPS10 ดังรูปที่ 4 โดยปลายสายดานหัวตอ IDC ตัวเมียของสาย JST3AC-8 เสนที่ 1 ตอกับ คอนเน็กเตอรของ CMPS10 ที่ขาไฟเลี้ยง (+V), กราวด (GND)และ SDA สวนเสนที่ 2 ใหตอสาย สัญญาณ (สีขาว เสนกลาง) กับขา SCL สวนหัวตอ IDC ตัวเมียของสายสีแดงและดําทีเหลื ่ อใหปลอย ลอยไว สวนปลายสายดานที่เปนหัวตอ JST ใหนําไปเสียบจุดตอพอรต SDA และ SCL บนบอรด Unicon

รูปที่ 3 อุปกรณทังหมดที ้ ต่ องใชในการใชงานโมดูลเข็มทิศ CMPS10 กับบอรด Unicon หากตองการติดตังโมดู ้ ลเข็มทิศ CMPS10 เขากับแทนหรือฐานยึดใดๆ จะตองใชสกรูและนอต พลาสติกในการติดตังเพื ้ อลดผลกระทบจากโลหะที ่ อาจมี ่ ตอการตรวจจับแมเหล็กขัวโลกของตั ้ วตรวจ จับภายใน CMPS10 (ในชุดอุปกรณของ CMPS10 มีเตรียมไวใหแลว - ดูไดจากรูปที่ 4)


ZX-01 Switch

รูปที่ 4 วงจรเชือมต ่ อเพือใช ่ งานโมดูลเข็มทิศ CMPS10 กับบอรด Unicon

@INEX

CMPS-10      5


6 CMPS-10     

5. เขียนโคด โคดตัวอยางสําหรับอานคาของโมดูลเข็มทิศ CMPS10 แสดงในโปรแกรมที่ 1 จากนั้นนําคา ที่ไดมาแสดงผลที่จอ GLCD-XT ที่ติดตังบนบอร ้ ด Unicon /************************************************************************ * TITLE : COMPASS AND TILT * DESCRIPTION : Get direction of geography and tilt * on BMPS10 with I2C interface then show value on GLCD ***********************************************************************/ #include "unicon.h" #define ADDRESS 0x60 // Register address for CMPS10 #define PIN 18 // Pin 18 for calibration 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 // Stores full bearing

int bearing; void setup() { sleep(1000); // Delay 1 second glcdClear(); // Clear GLCD screen Wire.begin(); // Initiate I2C pinMode(PIN, INPUT); // Set pin 18 to input mode } void loop() { measurement(); // Get data from CMPS10 if(!digitalRead(PIN)) // Pressed button for calibration { calibrate(); } display_data(); // Show bearing, pitch and roll delay(50); // Delay time 50 millisecond } void measurement() // Get bearing, pitch and roll data { Wire.beginTransmission(ADDRESS); //starts communication with CMPS10 Wire.write(2); Wire.endTransmission(); Wire.requestFrom(ADDRESS, 4); // Request 4 bytes from CMPS10 while(Wire.available() < 4); // Wait for bytes to become available highByte = Wire.read(); // Get high byte of bearing lowByte = Wire.read(); // Get low byte of bearing

pitch = Wire.read(); // Get pitch roll = Wire.read(); // Get roll bearing = ((highByte << 8) + lowByte) / 10; // Calculate full bearing fine = ((highByte << 8) + lowByte) % 10; // Calculate decimal of bearing } void display_data() { glcd(0, 0, "CMPS10 V:%d

// Show data on GLCD ", soft_ver());

โปรแกรมที่ 1 ไฟล Unicon_CMPS10_Button.ino อานคาจากโมดูลเข็มทิศ CMPS10 ของบอรด Unicon (มีตอ)


CMPS-10      7

glcd(1, 0, "Bearing=%d.%d ", bearing, fine); glcd(2, 0, "Pitch=%d ", pitch); glcd(3, 0, "Roll=%d ", roll); } void calibrate() // { glcdClear(); // glcd(0, 0, "Calibrate Start"); writeCalibrateData(0xF0); // sleep(500); // glcd(1, 0, "Turn module to North."); // while(!digitalRead(PIN)); // while(digitalRead(PIN)); writeCalibrateData(0xF5); //

Calibrating CMPS10 by pressed a button Show calibration message on GLCD Send data 0xF0 to starting calibration Delay 500 milliseconds Show message to turn module to North Wait for pressed a button Send data 0xF5 to set North

glcd(1, 0, "Turn module to East. "); // Show message to turn module to East while(!digitalRead(PIN)); // Wait for pressed button while(digitalRead(PIN)); writeCalibrateData(0xF5); // Send data 0xF5 to set East glcd(1, 0, "Turn module to South."); // Show message to turn module to South while(!digitalRead(PIN)); // Wait for pressed button while(digitalRead(PIN)); writeCalibrateData(0xF5); // Send data 0xF5 to set South glcd(1, 0, "Turn module to West. "); // Show message to turn module to West while(!digitalRead(PIN)); // Wait for pressed button while(digitalRead(PIN)); writeCalibrateData(0xF5); // Send data 0xF5 to set West glcd(1, 0, "Calibration complete"); // Show calibration finishing on GLCD sleep(1000); // Delay 1 second glcdClear(); // Clear GLCD screen } void writeCalibrateData(int data) { Wire.beginTransmission(ADDRESS); Wire.write(22); Wire.write(data); Wire.endTransmission(); } int soft_ver() { int data;

// // // // //

Begin I2C transmission with CMPS10 address Send register address Send data to address 0x022 End I2C trasmission

// Get software version // Software version of CMPS10 is read // into data and then returned // starts communication with CMPS10

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

// // // //

Request byte from CMPS10 Wait for bytes to become available Get software version Return software version

}

โปรแกรมที่ 1 ไฟล Unicon_CMPS10_Button.ino อานคาจากโมดูลเข็มทิศ CMPS10 ของบอรด Unicon (จบ)


8 CMPS-10     

ฟงกชันหลั ่ กๆ ของโปรแกรมมี 3ตัวคือ measurement();, display_data(); และ calibration(); โดยฟงกชันแรกเป ่ นฟงกชันติ ่ ดตอเพื่ออานคาจาก CMPS10 ผานรูปแบบการสือสารข ่ อมูลระบบบัส ้ ่ GLCD-XT ดวยฟง I2C คาที่ไดมี 3 คาคือ bearing, pitch และ roll จากนั้นนําคาทังหมดมาแสดงผลที กชัน่ display_data(); สวนฟงกชัน่ calibrate(); ใชปรับเทียบทิศอางอิงใหแกโมดูล CMPS10 โดยทําการเขียนคา 0xF0 ไปยังรีจิสเตอร 22 ของโมดูล CMPS10 เพือเริ ่ มต ่ นการปรับเทียบ จากนันเมื ้ อกํ ่ าหนดทิศอางอิงเริมต ่ นได ใหเขียนขอมูล 0xF5 ไปยังรีจิสเตอร 22 ของโมดูล CMPS10 โดยในการเขียนแตละครั้งจะเกิดขึ้นเมื่อ มีการกดสวิตชทีต่ อกับขาพอรต 30 ในการปรับแตงตองทําทังสิ ้ ้น 4 ครังตามทิ ้ ศหลัก แตละทิศจะมีมุม ตางกัน 90 องศา

6. ทดสอบวัดทิศทาง หลังจากอัปโหลดโปรแกรมไปยังบอรด Unicon ระบบจะทํางานทันที Unicon จะติดตอกับ โมดูล CMPS10 เพื่ออานคาและแสดงผลดังรูปที่ 5 หากไมมีการกําหนดทิศทางอางอิงเปนอยางอื่น ตําแหนง 0 องศาจะหมายถึง ทิศเหนือ ซึ่งจะอางอิงกับขั้วแมเหล็กโลก โดยทิศอางอิงหลักที่กําหนด มาจากโรงงานของโมดูล CMPS10 แสดงในรูปที่ 1 หากมีการหมุนหรือบิดตัวโมดูลไปมา คาของมุมยก (pitch) และมุมเอียง (roll) จะเปลียนแปลง ่ เปนการแสดงใหเห็นวา โมดูล CMPS10 สามารถวัดความเอียงไดดวย

รูปที่ 5 ผลการทํางานของโมดูล CMPS10 ทีแสดงค ่ ามุมของทิศ (Bearing), มุมยก (Pitch) และมุมเอียง (Roll) ผานทางบอรด Unicon


CMPS-10      9

7. การปรับแตงทิศอางอิง อยางไรก็ตาม ในการใชงานจริง ควรมีการปรับแตงทิศอางอิงใหถูกตองเพือขจั ่ ดหรือลดผลจาก สนามแมเหล็กทีอาจค ่ างอยูภายในตั  วตรวจจับสนามแมเหล็กของโมดูล CMPS10 มีขันตอนโดยสรุ ้ ปดังนี้ (1) เริมต ่ นดวยการกดสวิตชทีต่ อกับพอรต 30 เพือเข ่ าสูโหมดปรั  บทิศอางอิง จอแสดงผล GLCDXT แสดงขอความ Calibrate Start ตามดวยขอความ Turn module to North. ทําการหมุนตัวโมดูล CMPS10 ไปยังทิศทีกํ่ าหนดใหเปนทิศเหนือ (อาจเปนทิศเหนือจริงๆ หรือทิศใดๆ ทีต่ องการอางอิงก็ได) แลวกดสวิตชทีต่ อกับพอรต 30 เพือกํ ่ าหนดทิศอางอิงครังที ้ ่ 1 จะเห็น LED ทีโมดู ่ ล CMPS10 ติดสวาง (2) ทีจอแสดงผล ่ GLCD-XT แสดงขอความ Turn module to East. หมุนตัวโมดูล CMPS10 ไปทางขวาในทิศทางตามเข็มนาฬิกา 90 องศา แลวกดสวิตชครั้งที่ 2 อันการกําหนดทิศตะวันออก (3) จอแสดงผล GLCD-XT แสดงขอความ Turn module to South. หมุนตัวโมดูล CMPS10 ไปทางขวาในทิศทางตามเข็มนาฬิกาไปอีก 90 องศา แลวกดสวิตชครั้งที่ 3 เพื่อกําหนดเปนทิศใต

รูปที่ 6 การปรับแตงทิศอางอิงของโมดูล CMPS10


10 CMPS-10     

(4) จอแสดงผล GLCD-XT แสดงขอความ Turn module to West. จากนั้นหมุนโมดูลไปทาง ขวาในทิศทางตามเข็มนาฬิกาอีก 90 องศา แลวกดสวิตชครั้งที่ 4 เปนครั้งสุดทาย LED ของโมดูล CMPS10 จะดับลง เปนอันสิ้นสุดการปรับแตงทิศอางอิงของโมดูล CMPS10 ในรูปที่ 6 แสดงขั้นตอนการปรับแตงทิศอางอิงของโมดูล CMPS10

8. แกโคดลดอุปกรณ จากโปรแกรมที่ 1 เปนตัวอยางที่นําไปใชกับบอรด Arduino ไดทุกแบบ โดยอาจแกโคดเพื่อ เปลี่ยนอุปกรณแสดงผลเปนโมดูล LCD 16 ตัวอักษร 2 บรรทัด หรือ LED รวมถึงแสดงผาน Serial Monitor ของ Arduino IDE สําหรับผูใช  งานบอรด Unicon และใชการแสดงผลผานจอ GLCD-XT สามารถใชสวิตช OK ในการเขาสูโหมดปรั  บเทียบทิศอางอิงแทนการใชสวิตชภายนอกได โดยดูตัว อยางโคดในโปรแกรมที่ 2 #include "unicon.h" #define ADDRESS 0x60 byte highByte, lowByte, fine; char pitch, roll; int bearing; void setup() { sleep(1000); glcdClear(); Wire.begin(); } void loop() { measurement(); if(sw_ok()) { calibrate(); } display_data(); delay(50); } void measurement() { 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();

// Register address for CMPS10 // Stores full bearing

// Delay 1 second // Clear GLCD screen // Initiate I2C

// Get data from CMPS10 // Pressed OK for calibration

// Show bearing, pitch and roll // Delay time 50 millisecond // Get bearing, pitch and roll data //starts communication with CMPS10 // Request 4 bytes from CMPS10 // Wait for bytes to become available // // // //

Get Get Get Get

high byte of bearing low byte of bearing pitch roll

โปรแกรมที่ 2 ไฟล Unicon_CMPS10_SW_OK.ino สําหรับอานคาจากโมดูลเข็มทิศ CMPS10 ของบอรด Unicon และใชสวิตช OK บนบอรดแสดงผล GLCD-XT ในการปรับแตงทิศอางอิง (มีตอ)


CMPS-10      11

bearing = ((highByte << 8) + lowByte) / 10; // Calculate full bearing fine = ((highByte << 8) + lowByte) % 10; // Calculate decimal place of bearing } void display_data() // Show data on GLCD { glcd(0, 0, "CMPS10 V:%d ", soft_ver()); glcd(1, 0, "Bearing=%d.%d ", bearing, fine); glcd(2, 0, "Pitch=%d ", pitch); glcd(3, 0, "Roll=%d ", roll); } void calibrate() // Calibrating CMPS10 by pressed OK button { glcdClear(); // Show calibration message on GLCD glcd(0, 0, "Calibrate Start"); writeCalibrateData(0xF0); // Send data 0xF0 to starting calibration sleep(500); // Delay 500 milliseconds glcd(1, 0, "Turn module to North."); // Show message to turn module to North sw_ok_press(); // Wait for pressed OK button writeCalibrateData(0xF5); // Send data 0xF5 to set North glcd(1, 0, "Turn module to East. "); // Show message to turn module to East sw_ok_press(); // Wait for pressed OK button writeCalibrateData(0xF5); // Send data 0xF5 to set East glcd(1, 0, "Turn module to South."); // Send data 0xF5 to set South sw_ok_press(); // Wait for pressed OK button writeCalibrateData(0xF5); // Send data 0xF5 to set South glcd(1, 0, "Turn module to West. "); // Show message to turn module to West sw_ok_press(); // Wait for pressed OK button writeCalibrateData(0xF5); // Send data 0xF5 to set West glcd(1, 0, "Calibration complete"); // Show calibration finishing on GLCD sleep(1000); // Delay 1 second glcdClear(); // Clear GLCD screen } void writeCalibrateData(int data) { Wire.beginTransmission(ADDRESS); Wire.write(22); Wire.write(data); Wire.endTransmission();

// // // // //

Begin I2C transmission with CMPS10 address Send register address Send data to address 0x022 End I2C trasmission

} int soft_ver() // Get software version { int data; // Software version of CMPS10 is read into data and then returned Wire.beginTransmission(ADDRESS); // Starts communication with CMPS10 Wire.write((byte)0); Wire.endTransmission(); Wire.requestFrom(ADDRESS, 1); // Request byte from CMPS10 while(Wire.available() < 1); // Wait for bytes to become available data = Wire.read(); // Get software version return(data); // Return software version }

โปรแกรมที่ 2 ไฟล Unicon_CMPS10_SW_OK.ino สําหรับอานคาจากโมดูลเข็มทิศ CMPS10 ของบอรด Unicon และใชสวิตช OK บนบอรดแสดงผล GLCD-XT ในการปรับแตงทิศอางอิง (จบ)


12 CMPS-10     


Cmps10