โมดูลเข็มทิศอิเล็กทรอนิกส CMPS03 เปนผลงานของ Devantech (www.radioelectronics. co.uk) ออกแบบมาเพือช ่ วยในการกําหนดทิศทางเคลื่อนที่ของหุนยนต อัตโนมัติ และนํามาใชในการ สรางเครื่องมือวัดและตรวจสอบทิศระบบอิเล็กทรอนิกส โดยหัวใจสําคัญของโมดูล CMPS03 คือ ตัวตรวจจับสนามแมเหล็กเบอร KMZ51 ของ Philips จํานวน 2 ตัว เพื่อใหมีความไวเพียงพอในการ ตรวจจับสนามแมเหล็กโลก (Earth magnetic field) และไมโครคอนโทรลเลอรเพือรั ่ บสัญญาณจากตัว ตรวจจับมาประมวลผลเปนขอมูลดิจิตอลและสัญญาณพัลสสําหรับแจงผลการวัดทิศทาง
17.1 คุณสมบัติของโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03 ใชไฟเลี้ยง +5V ตองการกระแสไฟฟา 20mA ใชตัวตรวจจับสนามแมเหล็กเบอร KMZ51 ของ Philips จํานวน 2 ตัว ความละเอียดของมุม 0.1 องศา คาความผิดพลาด 3-4 องศา โดยประมาณ หลังจากการปรับแตง เอาตพุตสัญญาณพัลส ความกวาง 1 ถึง 37 มิลลิวินาที โดยมีอัตราเพิ่มครังละ ้ 0.1 มิลลิวินาที
เอาตพุตขอมูลดิจิตอลผานการติดตอระบบบัส I2C รองรับสัญญาณนาฬิกาความถี่สูงถึง 1MHz โดยใหขอมูล 2 รูปแบบคือ 0 ถึง 255 และ 0 ถึง 3599
ขนาดเล็กเพียง 32 x 35 มิลลิเมตร สื่อสารกับไมโครคอนโทรลเลอรยอดนิยมไดทุกตระกูล อาทิ เบสิกแสตมป 2SX/2P, PIC,
MCS-51, PSoC, 68HC11 ทั้งผานระบบบัส I2C และดวยการวัดสัญญาณพัลส
17.2 ตําแหนงขาและการตอใชงานโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03 ในรูปที่ 17-1 แสดงรูปรางหนาตาและการจัดขาของ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส จะเห็นวา เปนแผงวงจรทีมี่ คอนเน็กเตอรตอออกมาเพือให ่ เชือมต ่ อไปใชงาน อยางไรก็ตามเพืออํ ่ านวย ความสะดวกแกผูใช งานกับบอรดทดลองของบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด (i-nex : เปนตัว แทนจําหนายสินคาของ Devantech ในประเทศไทยอยางเปนทางการ) จึงไดพัฒนาบอรดอะแด ปเตอรรุน ADX-CMPS03 เพื่อใหนําโมดูล CMPS03 มาติดตัง้ (โดยบอรด ADX-CMPS03 ตองจัดซื้อ แยก) บนบอรด ADX-CMPS03 ไดจัดเตรียมคอนเน็กเตอร PCB 3 ขาตัวผูสําหรับเชือมต ่ อกับบอรด ควบคุมหุนยนต และคอนเน็กเตอร IDC ตัวเมียแถวเดียว ่ 4 ขาสําหรับเสียบสายตอวงจรเบอร AWG#22 เพือต ่ อกับแผงตอวงจรหรือเบรดบอรด นอกจากนันยั ้ งมีสวิตชกดสําหรับปรับตังค ้ า (calibration) เพือ่ กําหนดตําแหนงทิศอางอิง โดยวงจรของบอรด ADX-CMPS03 แสดงในรูปที่ 17-2
17.3. การอานคาสัญญาณเอาตพุตของโมดูล CMPS03 17.3.1 การอานคาทิศทางจากเอาตพุตสัญญาณพัลส การอานคาสัญญาณในโหมดนี้ เปนการนําคาความกวางพัลสที่ไดจากเอาตพุตสัญญาณพัลส ของโมดูล CMPS03 มาระบุตําแหนงองศา จาก 0 ถึง 359.9 องศา โดยมียานของคาความกวางสัญญาณ ตัวตรวจจับสนามแมเหล็ก KMZ51 ไมโครคอนโทรลเลอรหลักสําหรับประมวลผล กราวด ไมตอใชงาน ความถี่ 50/60Hz ปรับตังค ้ าการวัด ไมตอใชงาน เอาตพุตแบบสัญญาณพัลส SDA สําหรับเชือมต ่ อผานระบบบัส I2C SCL สําหรับเชือมต ่ อผานระบบบัส I2C +5V ดานหนาของโมดูล CMPS03
รูปที่ 17-1 แสดงรูปรางและตําแหนงขาสําหรับการตอใชงานของโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03
33.0mm 28.6mm
ADX-CMPS03
R1 4.7k
R2 4.7k
K1 SCL
S1 CAL
K4 I2C BUS
+5V
GND SCL SDA +5V
K3 PWM
31.5mm 26.7mm
>31.5mm
K2 SDA
front +5V SCL SDA CMPS-03 PWM Digital Compass NC CAL 50/60Hz NC GND
PWM
GND
>33.0mm
คอนเน็กเตอรตัวเมีย สําหรับติดตั้งโมดูล CMPS03
คอนเน็กเตอร PCB ของ สัญญาณระบบบัส I2C
จุดตอสัญญาณของระบบบัส I2C สําหรับเสียบสายตอวงจรเพื่อใชกับบอรดทดลองหรือ แผงตอวงจร (เบรดบอรด) สวิตชกดติดปลอยดับสําหรับปรับแตงเพือหาตํ ่ าแหนง อางอิง (calibration) คอนเน็กเตอร PCB ของเอาตพุตสัญญาณพัลส
รูปที่ 17-2 แสดงวงจรของบอรด ADX-CMPS03 และการเชือมต ่ อกับโมดูล CMPS03 พัลสจาก 1 มิลลิวินาทีไปจนถึง 36.99 มิลลิวินาที มีความละเอียด 0.1 มิลลิวินาทีตอองศา ในสัญญาณ พัลสแตละไซเกิล มีชวงลอจิก “0” กวาง 65 มิลลิวินาที ดังนั้นในการนําสัญญาณพัลสมาประมวลผลเปนคามุม จึงตองใชการนับความกวางของ สัญญาณพัลสเปนหลักในการคํานวณหาคามุมที่โมดูล CMPS03 วัดได
17.3.2 การอานคาทิศทางเปนขอมูลดิจิตอลผานระบบบัส I2C การอานคาจากโมดูล CMPS03 ใหไดคาทีมี่ ความแมนยําสูงควรเลือกเอาตพุตขอมูลดิจิตอลผาน ระบบบัส I2C โดยโมดูล CMPS03 สามารถสงขอมูลของตําแหนงออกมาที่ความละเอียดสูงสุด 0.1 องศาโดยไมจําเปนตองมีการคํานวณหรือแปลงคาใด ๆ อีก
Start Bit
Start Bit
แอดเดรสสําหรับสงคาขอมูลไปยัง CMPS03 = $CO 1
1
0
0
0
0
0
A7
A6
A5
A4
A3
A2
A1
1
2
3
4
5
6
7
0 R/W ACK
8
Start bit
ขอมูลตําแหนงรีจสิ เตอรที่ตองการอานคา
9
แอดเดรสสําหรับอานคาขอมูลจาก CMPS03 = $C1
D7 D6 D5 D4 D3 D2 D1 D0 ACK 1
2
3
4
5
6
7
8
9
Stop bit
ขอมูล 8 บิตที่อานไดจาก CMPS03
1
1
0
0
0
0
0
1
A7
A6
A5
A4
A3
A2
A1
R/W
ACK
1
2
3
4
5
6
7
8
9
D7 D6 D5 D4 D3 D2 D1 D0 ACK 1
2
3
4
5
6
7
8
9
รูปที่ 17-3 แสดงไดอะแกรมเวลาของการติดตอสือสารกั ่ บโมดูล CMPS03 ผานระบบบัส I2C ตําแหนงรีจิสเตอร รายละเอียด 0 ตัวเลขแสดงรุนของบอรด CMP03 1 สงคาตําแหนงแบบหยาบ (0 ถึง 255) สงคาตําแหนงแบบละเอียดดวยตัวเลข 16 บิต (0 ถึง 3599) 2,3 สามารถแปลงคาเพื่อแสดงองศา 0 ถึง 359.9 องศาไดโดยตรง สําหรับตรวจสอบคาภายใน โดยจะแสดงคาความตางของ 4,5 Sensor1 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย สําหรับตรวจสอบคาภายใน โดยจะแสดงคาความตางของ 6,7 Sensor2 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย แสดงคาตัวเลขการปรับแตงภายใน (calibration value1) 8,9 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย แสดงคาตัวเลขการปรับแตงภายใน (calibration value2) 10,11 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย 12,13 ไมใชงานอานคาไดเปน 0 14 ไมใชงาน ไมไดกําหนดคาไว คําสั่งสําหรับการปรับแตงคา โดยเมื่อตองการปรับแตงคา 15 ตองเขียนขอมูล 255 เขาที่รีจิสเตอรตําแหนงนี้
ตารางที่ 17-1 แสดงตําแหนงรีจิสเตอรภายในโมดูล CMPS03
17.3.2.1 รูปแบบการสื่อสารขอมูลบัส I2C บัส I2C เชื่อมตอกับไมโครคอนโทรลเลอรโดยใชสายสัญญาณ 2 เสนไดแกขา SDA (รับและ สงขอมูล) และ SCL (ขาสัญญาณนาฬิกา) โดยขาสัญญาณทั้งสองจะตองตอตัวตานทานพูลอัปตอไว เพื่อกําหนดสถานะลอจิก “1” ใหกับระบบบัส
17.3.2.2 ลําดับขันการติ ้ ดตอ คาแอดเดรสของโมดูล CMPS03 คือ 0xC0 สําหรับการสงขอมูล และ 0xC1 สําหรับการอาน คาขอมูล โดยขันตอนการติ ้ ดตอกับโมดูล CMPS03 เพื่ออานขอมูลมีดังนี้ (1) สงบิตเริ่มตนหรือ Start bit เพื่อแจงใหระบบบัส I2C เตรียมพรอมรับขอมูล (2) สงคาแอดเดรส 0xC0 เพือระบุ ่ วาตองการเขียนขอมูลไปยังกับโมดูล CMPS03 (3) สงคาตําแหนงรีจิสเตอรภายในโมดูล CMPS03 ที่ตองการอานคา ซึ่งมีรายละเอียด แสดงในตารางที่ 17-1 (4) สงคาแอดเดรส 0xC1 เพื่อระบุวาตองการอานคาขอมูลจากโมดูล CMPS03 (5) อานคาขอมูลจากโมดูล CMPS03 มาเก็บไวในหนวยความจํา (6) สงบิตหยุดเพือหยุ ่ ดการสือสารข ่ อมูล และกําหนดใหบัสอยูในสภาวะบั สวาง
17.3.2.3 การปรับแตงคาของโมดูล CMPS03 ผานทางระบบบัส I2C การปรับแตงคาทําไดโดยการสงคา 0xFF ไปยังรีจิสเตอร 15 ของโมดูล CMPS03 โดยจะตองสง คา 4 ครังและระบุ ้ ทิศทางหลักๆ 4 ทิศทางเชนเดียวกับการกําหนดคาดวยสวิตชโดยตรง มีขันตอนดั ้ งนี้ (1) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศเหนือ จากนั้น เขียนคา 255 (0xFF) ไปยังรีจิสเตอร 15 (2) วางโมดูล CMPS03 ขนานกับพืน้ หันดานหนาของโมดูลไปทางทิศตะวันออก เขียน คา 255 (0xFF) ไปยังรีจิสเตอร 15 (3) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศใต กดสวิตช เขียนคา 255 (0xFF) ไปยังรีจิสเตอร 15 (4) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศตะวันตก กด สวิตช เขียนคา 255 (0xFF) ไปยังรีจิสเตอร 15 หลังจากปรับแตงคาแลวคาทีปรั ่ บแตงจะเก็บไวที่หนวยความจําอีอีพรอม ดังนั้นแมไมจายไฟ ใหกับตัวบอรด ขอมูลทีปรั ่ บแตงแลว จะยังคงอยูตอไป
ในการทดลองนีเป ้ นการเขียนโปรแกรมภาษา C ควบคุมไมโครคอนโทรลเลอร P89V51RD2 เพื่อติดตอ กับโมดูลเข็มทิศอิเล็กทรอนิกส CMPS-03 ในการสรางระบบทิศทางอางอิง 25.1 เริ่ มด วยการปรับแตงทิศทางใหแกโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03 เพื่อใหการวัดทิศทางของโมดูล CMPS03 มีความแมนยํามากที่สุด การปรับแตงมีขั้นตอนดังนี้ (25.1.1) ติดตั้งโมดูล CMPS03 ลงบนบอรดเชือมต ่ อ ADX-CMPS03 (25.1.2) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศเหนือ กดสวิตช 1 ครั้ง (25.1.3) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศตะวันออก กดสวิตช (25.1.4) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศใต กดสวิตช 1 ครั้ง (25.1.5) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศตะวันตก กดสวิตช 1 ครั้ง +5V 31 C2 1/50V
2
40
5
RESET 9 R1 10k
+5V
C1 0.1/50
6 4
16
RST
P3.6 17 P3.7
IC1 P89V51RD2 P0.7
+5V
C5 0.1/ 50V
R2 10k x8
32
R/W
3 DSP1 LCD 16x2
E RS D7 D6 D5 D4 D3 D2 D1 D0 14 13 12 11 10 9 8 7
VR1 10k
1
33 P0.6 34 P0.5 35 P0.4 36 P0.3 37 P0.2 38 P0.1 39 P0.0
+5V
R3 4k7 1 P1.0 2 P1.1
R4 4k7
+5V SDA SCL
MOD1 CMPS03 GND
20 18 C3 33pF
19 C4 33pF
XTAL1 11.0592MHz
รูปที่L25-1 วงจรทดลองติดตอไมโครคอนโทรลเลอร P89V51RD2 กับ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส
/*——————————————————————————————————————————————————————————————————————————*/ // Program : CMPS-03 Demo program // Description : Read angle by CMPS-03 sensor // Filename : l2501.c // C compiler : RIDE 51 V6.4.35 /*——————————————————————————————————————————————————————————————————————————*/ #include <REGLV51RD2.h> // Header file register for P89V51RD2BN #include <i2cV51.h> // Module function of i2c bus #include <lcdV51.h> // Module function of LCD display #define COMPASS_ID 0xC0 // Macro for CMPS03 addressing /*********************** Function for read angle for CMPS-03 *****************/ int read_angle() { unsigned int datah=0; // Variable for storing high byte unsigned int datal=0; // Variable for storing low byte i2c_start(); i2c_write(COMPASS_ID); i2c_write(0x02);
// I2C start condition // I2C send CMPS03 ID // I2C send command to read data from CMPS03
i2c_start(); i2c_write(COMPASS_ID+1); datah=i2c_read(); i2c_ACK(); datal=i2c_read(); i2c_NACK(); i2c_stop(); datah = (datah<<8)+(datal); return(datah/10);
// // // // // // // // //
I2C start condition I2C send CMPS03 ID in Read mode Read data high byte store to datah I2C acknowlage Read data low byte store to datal I2C acknowledge I2C stop condition Keep total value to datah Return value
} /*********************** Main loop *******************************************/ void main() { unsigned int value,old_value; // Variable for storing angle lcd_init(); // Initial LCD lcd_puts(0x80,”CMPS-03 Demo... “); // Display title message of CMPS03 program lcd_puts(0xC0,”Angle: “); // Display located angle value while(1) // Infinite loop { value = read_angle(); // Read angle from CMPS03 if(value != old_value) // Compare new and previous value to update display { lcd_puts(0xC7,” “); // Clear previous value inttolcd(0xC7,value); // Update new value delay(100); // Delay for displaying } old_value = value; // Keep previous value for comparison next time } }
โปรแกรมที่ P25-1 โปรแกรมภาษา C สําหรับทดลองติดตอไมโครคอนโทรลเลอร P89V51RD2 กับ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส (มีตอ)
คําอธิบายโปรแกรม การทํางานของโปรแกรมนีติ้ ดตอกับโมดูล CMPS03 ผานการสื่อสารขอมูลอนุกรมแบบบัส I2C ดังนั้น จึงไดทําการผนวกไฟลไลบรารี i2cV51.h ซึงทํ ่ าหนาทีสร ่ างสภาวะเงื่อนไขตางๆ ตามขอกําหนดของบัส I2C บัส ซึงได ่ นําเสนอในการทดลองกอนหนานีแล ้ ว ภายในโปรแกรมหลั กเป นการวนอ านค ามุ มมาแสดงผลที่โมดู ล LCD อยูตลอดเวลาภายใต while(1){} ทีเป ่ นจริงตลอด ในการแสดงผลนันจะเปรี ้ ยบเทียบขอมูลเดิมและคาใหมทีอ่ านได ถามีการ เปลี่ยนแปลงจึงนําคาใหมไปแสดงผล ฟงกชั่น read_angle ใชในการอานคามุมที่ไดจากโมดูล CMPS03 ผานทางระบบบัส I2C โดยเริมต ่ น การติ ดต อแลวตามด วยการสงแอดเดรสประจําตัวของโมดูล CMPS03 ซึ่งก็คือ 0xC0 นิยามดวยมาโคร COMPASS_ID ดังนี้
#define COMPASS_ID 0xC0
แลวตามดวยขอมูลคําสั่ง 0x02 เพื่อแจงใหโมดูล CMPS03 สงคามุมเปนชวงขอมูล 0 ถึง 3599 ซึงตรงกั ่ บคา มุมตั้งแต 0 ถึง 359.9 องศา โดยขอมูลจะถูกสงกลับมา 2 ไบตตอเนื่องโดยเริ่มจากไบตสูงแลวตามดวยไบต ลาง หลังจากอานขอมูลเขามา 2 ไบตแลว จะนําไปหารดวย 10 จึงไดผลลัพธสุทธิทีคื่ นคาจากฟงกชัน่
โปรแกรมที่ P25-1 โปรแกรมภาษา C สําหรับทดลองติดตอไมโครคอนโทรลเลอร P89V51RD2 กับ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส (จบ) 25.2 ตอวงจรตามรูปที่ L25-1 25.3 เขียนโปรแกรมที่ P25-1 แลวทําการแปลงใหเปนไฟล .hex ดวย RC51 ผานกระบวนการสรางไฟลโปรเจ็กต ของ Rkit-51 โดยใช RIDE ไดไฟล l2501.hex ดาวนโหลดลงในไมโครคอนโทรลเลอร P89V51RD2 โดยตองลบ ขอมูลกอนโปรแกรมลงไปใหม 25.4 จายไฟใหแกวงจร หมุนโมดูล CMPS-03 โดยใหระนาบของแผงวงจรขนานกับพื้น โดยหมุนใหครบ 1 รอบ สังเกตผลทีโมดู ่ ล LCD ทีโมดู ่ ล LCD แสดงผลดังนี้
CMPS-03 Demo... Angle: xxx โดยถาการทํางานถูกตองคาทีแสดงจะมี ่ คาตั้งแต 0 ถึง 359 องศา ภายใน 1 รอบ