วันพุธที่ 13 กรกฎาคม พ.ศ. 2554

Digital Compass

โมดูลเข็มทิศ (Compass Module)
        โมดูลเข็มทิศแบบดิจิตอล เป็นเข็มทิศอิเล็กทรอนิกส์ที่ใช้เชื่อมต่อกับไมโครคอนโทรลเลอร์ เพื่อใช้ระบุตำแหน่งทิศทางได้อย่างถูกต้องแม่นยำ เหมาะอย่างยิงกับการประยุกต์ใช้งานกับหุนยนต์ หรืออุปกรณ์ควบคุมต่างๆ ที่ต้องมีการเคลื่อนที่
อุปกรณ์ที่ใช้ในการหาทิศทางขั้วแม่เหล็กโลก นั้นคือเข็มทิศ ซึ่งเป็นอุปกรณ์ที่มีประโยชน์อย่างมากในการเดินทางเอาไว้หาทิศทาง ซึ่งเข็มทิศนั้นจะต้องชี้บอกตำแหน่งทางทิศเหนืออยู่เสมอ 
        พอมาถึงยุคดิจิตอลที่อะไรๆ มันก็เล็กลงเล็กลงทุกที เข็มทิศก็มีการพัฒนาจนมากลายเป็นโมดูลขนาดเล็กๆ เพียง 6mm.x 6mm. เท่านั้นเอง ซึ่งเล็กมากๆ สามารถนำเข้าไปติดตั้งที่อุปกรณ์เช่นมือถือหรือว่าในรถในเรือได้ทันที   เจ้าโมดูลตัวจิ๋วนี้มีรหัสว่า    Compass Module  ใช้การเชื่อมต่อข้อมูล แบบ I2C  2 wire serial interface  ใช้ไฟได้ตั้งแต่ 2.7V-5V ซึ่งสะดวกมากในการนำไปพัฒนา
   
     โมดูล HMC6352 นี้จะใช้การบอกทิศทางแบบอะซิมุท (Azimuth) ซึ่งการบอกแบบนี้จะเป็นวิธีการที่คิดขึ้นมาเพื่อใช้ในการบอกทิศทาง คือวัดขนาดของมุมทางราบที่ วัดจากแนวทิศเหนือหลักเวียนตามเข็มนาฬิกามาบรรจบกับแนวเป้าหมาย ที่ต้องการมุมทิศอะซิมุทนี้จะมีค่าตั้งแต่ 0-360 องศา และเมื่อวัดมุมจากเส้นฐานทิศเหนือหลักชนิดใดก็เรียกทิศเหนือตามหลักนั้น


      ทำการทดลองกันเลย
 เตรียมอุปกรณ์กันก่อน

 1. HMC6352 ซึ่งปัจจุบันโมดูลตัวนี้มีหลายแบบครับใช้งานได้เหมือนกันรุ่นใหม่ๆจะเล็กลง มา


2. บอร์ดตัวเก่งของ เรา Arduino นั่นเอง ซึ่งก็ต้องมาพร้อมกับโปรแกรมภาษา C++ ที่สามารถหาโหลดมาใช้ทำให้การเขียนโปรแกรมติดต่ออุปกรณ์ต่างๆ นั้นเป็นเรื่องง่ายๆ 

หลังจากอุปกรณ์ต่างๆ ครบแล้วต่อมาก็ทำการต่อวงจรดังรูปเลยครับ

ให้ต่อไฟ GND และ SDA SDL ซึ่งเหตุผลที่ใช้ Analog 4 และ 5 ของ Arduino ก็เพราะว่า ฟังชั่น wire.h ของโปรแกรม Arduino นั้น ได้เขียนไว้โดยกำหนดไว้แล้ว เราก็ดึง wire.h มาใช้เลยก็เลยต้องต่อที่พอร์ตนี้จ้า

เริ่มต่อกันเลย
ต่อสายเพียงแค่ 2 เส้นเท่านั้นเอง  
ต่อมาก็ทำการโปรแกรมให้กับ Arduino อ่านค่าออกมาโดยให้โปรแกรมดังนี้


CODE

#include <Wire.h>

int HMC6352Address = 0x42; //address ของ HMC6352 ที่ทางโรงงานนั้นกำหนดมาคือ 0x42 
int slaveAddress;
int ledPin = 13;
boolean ledState = false;
byte headingData[2];
int i, headingValue;

void setup()
{// Shift the device's documented slave address (0x42) 1 bit right
// This compensates for how the TWI library only wants the
// 7 most significant bits (with the high bit padded with 0)

slaveAddress = HMC6352Address >> 1;   // This results in 0x21 as the address to pass to TWI
Serial.begin(9600);
pinMode(ledPin, OUTPUT);      // Set the LED pin as output
Wire.begin();
}


void loop()
{
  // Flash the LED on pin 13 just to show that something is happening
  // Also serves as an indication that we're not "stuck" waiting for TWI data

  ledState = !ledState;
  if (ledState) {
    digitalWrite(ledPin,HIGH);
  }
  else
  {
    digitalWrite(ledPin,LOW);
  }
  // Send a "A" command to the HMC6352
  // This requests the current heading data

  Wire.beginTransmission(slaveAddress);
  Wire.send("A");              // The "Get Data" command
  Wire.endTransmission();
  delay(10);                   // The HMC6352 needs at least a 70us (microsecond) delay
  
  // หลังจากที่ได้ส่ง A ซึ่งเป็นคำสั่งให้โมดูลส่ง Output ออกมาเราจะก็จะทำการอ่านค่า Output โดยใช้ Heading Mode ของตัวไอซี
// ตัวอย่าง เราจะอ่านค่าออกมาเป็น 1345    ค่าองศาอซิมุสจะเท่ากับ   134.5 degrees


  Wire.requestFrom(slaveAddress, 2);        // Request the 2 byte heading (MSB comes first)
  i = 0;
  while(Wire.available() && i < 2)
  { 
    headingData[i] = Wire.receive();
    i++;
  }

  headingValue = headingData[0]*256 + headingData[1];  // Put the MSB and LSB together
  Serial.print("Current heading: ");
  Serial.print(int (headingValue / 10));     // The whole number part of the heading
  Serial.print(".");
  Serial.print(int (headingValue % 10));     // The fractional part of the heading
  Serial.println(" degrees");
  delay(500);
}


เมื่อพิมพ์โปรแกรมเสร็จเรียบร้อยแล้วจากนั้นทำการกด Upload ลงสู่ Arduino

แล้วใช้ Hyper terminal รับค่าที่เราส่งมา โดยตั้ง Baudrate ที่ 9600 

จากนั้นเราลองวัดที่ทางทิศเหนือกันก่อน

ค่าที่ได้ก็จะออกมาอยู่ที่ ประมาณ 0 องศา หรือ 360 องศา

ลองหันไปทางทิศตะวันออก ดูบ้าง หรือ 90 องศา Azimuth 

ค่า Output ที่ออกมาก็จะออกมาประมาณ 90 องศา

ลองอีกซักมุมสองมุมอย่างอันนี้ไม่รู้ว่ามุมเท่าไรแต่ไปทาง ตะวันออกเฉียงใต้

ค่าออกมาประมาณ 135 องศา

ลองหันทางนี้บ้าง



ราคาสินค้าประมาณ   1150 – 2100 บาท

HMC6352 Modulehttp://www.warf.com/index.php?action=productreview&productitems=360

Datasheet
http://www.sparkfun.com/datasheets/Components/HMC6352.pdfArduino Decimal USB
http://www.warf.com/index.php?action=productreview&productitems=132ข้อมูล Arduino
http://www.wara.com/modules.php?name=News&file=article&sid=711



 

ไม่มีความคิดเห็น:

แสดงความคิดเห็น