HMC6343 – מצפן משולב באקסלרומטר

רכיב זה מכיל מצפן תלת-צירי, אקסלרומטר תלת-צירי וכן מיקרוקונטרולר המעבד את המידע ויכול לתקשר בתקשורת סטנדרטית (I2C) עם מיקרוקונטרולר אחר (כדוגמת הארדואינו). היתרון הגדול ברכיב זה הוא היכולת לקבל נתוני כיווניות בשלושה צירים (נטייה ימינה, נטייה קדימה וכיוון הסתכלות) באופן פשוט יחסית ועם מינימום רכיבים חיצוניים.

 hmc6343

נקנה ב- Sparkfun

מעגל

שימו לב: זהו חיישן יקר! ודאו שכל החיבורים נכונים לפני חיבור המעגל למקור מתח!

המצפן פועל על מתח של 3.3 וולט, ולכן יש להשתמש בממיר מתח (Logic Level Converter).

חיבורים:

  • VCC של החיישן -> 3V3 של ארדואינו
  • GND של החיישן -> Gnd של ארדואינו
  • SDA של החיישן -> TXI Chan1 של הממיר
  • TXO Chan1 של הממיר -> פין אנלוגי 4 של ארדואינו
  • SCL של החיישן -> TXI Chan2 של הממיר
  • TXO Chan2 של הממיר -> פין אנלוגי 5 של ארדואינו
  • GND של הממיר (לפחות אחד מהם) -> Gnd של ארדואינו
  • HV של הממיר -> 5V של ארדואינו
  • LV של הממיר -> 3V3 של ארדואינו

hmc6343-circuit

תוכנה

על-אף שהחיישן מתחבר (בעקיפין) לכניסות אנלוגיות של הארדואינו, במקרה זה הפינים משמשים בצורה שונה (לא ניתן להשתמש ב- analogRead). החיישן מתקשר עם הארדואינו בתקשורת נתונים מסוג I2C, המשתמשת בשני חוטי תקשורת.

בגלל מורכבותו של החיישן, המהירות בה ניתן לקרוא ממנו נתונים מוגבלת עד 10 פעמים בשניה. אם ניתן להסתפק ב- 5 קריאות בשניה, ניתן להגדיר זאת בתוכנה שלהלן ובכך לקבל נתונים מדוייקים יותר.

בתוכנה הבאה מוגדרות פרוצדורות המבצעות את הפעילויות המרכזיות הנדרשות:

  • getHeading – קוראת את נתוני הכיוון ומציבה אותם במשתנים x, y, z. אלו הנתונים העיקריים בהם נשתמש ברוב הפרוייקטים.
  • getAccelerations – קוראת את נתוני התאוצה בלבד, ומציבה אותם במשתנים x, y, z.
  • getMagnetics – קוראת את נתוני המגנטיות בלבד, ומציבה אותם במשתנים x, y, z.
  • set5Hz – קובע את קצב קריאת הנתונים ל- 5 פעמים בשניה. אם קוראים את הנתונים מהר יותר, יתקבלו נתונים זהים בקריאות עוקבות (למעשה, ניתן לקרוא את הנתונים מהר ככל שרוצים, אך הם משתנים רק 5 פעמים בשניה).
  • set10Hz – קובע את קצב קריאת הנתונים ל- 10 פעמים בשניה.

/*
  Sketch for operating the HMC6343
  Writen by Shachar Geiger on 12.6.09
  For more information, see http://www.magneticsensors.com/datasheets/HMC6343.pdf

  NOTICE: This is an expansive sensor! do not connect to power until after verifying the connections!

  Connect the sensor using a logic level converter (from Sparkfun):
    Sensor VCC -> Arduino 3V3
    Sensor GND -> Arduino Gnd
    Sensor SDA -> Converter TXI (Chan1)
      Converter TXO (Chan1) -> Arduino ANALOG IN 4
    Sensor SCL -> Converter TXI (Chan2)
      Converter TXO (Chan2) -> Arduino ANALOG IN 5
    Converter GND (at least one of them) -> Arduino Gnd
    Converter HV -> Arduino 5V
    Converter LV -> Arduino 3V3

  The sketch communicates with the sensor, enabling the following:
    Set the sample rate to 5Hz or 10Hz (Readings per second).
    Read the heading information (Heading, Pitch, Roll)
    Read the accellerations information (X, Y, Z)
    Read the magnetics information (X, Y, Z)

  Each reading procedurre gets the information from the sensor and stores it into the 3 variables: x, y and z.
*/

#include <Wire.h>
#define compass_ADR 0x32>>1

byte data[6];
int x;
int y;
int z;

void set5Hz() {
  Wire.beginTransmission(compass_ADR);
  Wire.send(0xF1);
  Wire.send(0x05);
  Wire.send(0x01);
  Wire.endTransmission();
  delay(10);
}

void set10Hz() {
  Wire.beginTransmission(compass_ADR);
  Wire.send(0xF1);
  Wire.send(0x05);
  Wire.send(0x02);
  Wire.endTransmission();
  delay(10);
}

void getHeading() {
  Wire.beginTransmission(compass_ADR);
  Wire.send(0x50);
  Wire.endTransmission();
  delay(1);
  Wire.requestFrom(compass_ADR, 6);
  for (int i=0; i<6; i++) {
    while (Wire.available() == 0);
    data[i] = Wire.receive();
  }
  x = data[0]*256 + data[1];
  y = data[2]*256 + data[3];
  z = data[4]*256 + data[5];
}

void getAccelerations() {
  Wire.beginTransmission(compass_ADR);
  Wire.send(0x40);
  Wire.endTransmission();
  delay(1);
  Wire.requestFrom(compass_ADR, 6);
  for (int i=0; i<6; i++) {
    while (Wire.available() == 0);
    data[i] = Wire.receive();
  }
  x = data[0]*256 + data[1];
  y = data[2]*256 + data[3];
  z = data[4]*256 + data[5];
}

void getMagnetics() {
  Wire.beginTransmission(compass_ADR);
  Wire.send(0x45);
  Wire.endTransmission();
  delay(1);
  Wire.requestFrom(compass_ADR, 6);
  for (int i=0; i<6; i++) {
    while (Wire.available() == 0);
    data[i] = Wire.receive();
  }
  x = data[0]*256 + data[1];
  y = data[2]*256 + data[3];
  z = data[4]*256 + data[5];
}

void setup() {
  Wire.begin();
  Serial.begin(9600);
  delay(500);
  set10Hz();
}

void loop() {
  getHeading();
  Serial.print(x);
  Serial.print ("\t");
  Serial.print(y);
  Serial.print ("\t");
  Serial.println(z);
  delay(100);
}

Comments are closed.