حساس المجال المغناطيسي HMC5883
تعريف بالحساس :
HMC5883L عبارة عن حساس بوصلة رقمية ثلاثية المحاور XYZ تستخدم لغرضين عامين: لقياس مغنطة مادة مغناطيسية مثل المغناطيس الحديدي ، أو لقياس القوة المغناطيسية ، وفي بعض الحالات ، اتجاه المجال المغناطيسي عند نقطة في الفضاء. الاتصال مع HMC5883L بسيط ويتم كل ذلك من خلال بروتوكول I2C.
يمكن تشغيل هذا الحساس بمستويات جهد من 3 الى 5 فولت .
هذا الحساس قليل الاستخدام في التطبيقات العادية ولكنه شائع الاستخدام في الروبوتات المتحركة وتطبيقات مراقبة حالة الجو المتقدمة .
ونظراً لكون هذا الحساس يستخدم بروتوكول I2C فتوصيله بمختلف المتحكمات (كالاردوينو) بسيط وسهل حيث نحتاج لمنفذين فقط لنقل البيانات SDA ,SCL (اضافة لمنافذ التغذية الكهربائية).

تحميل المكتبات الضرورية :
لتشغيل هذا الحساس مع الاردوينو نحتاج لمكتبة خاصة تدعى Adafruit HMC5883 وهي من تطوير شركة adafruit للالكترونيات ويجب ايضا ان نستخدم مكتبة Adafruit sensor للحساسات العامة.
التوصيل والبرمجة :
سنشرح الان كيفية توصيل هذا الحساس مع الاردوينو وسنتعلم كيفية قراءة قيم الحساس وعرضها على شاشة السيريال الخاصة بالاردوينو.
تقسم القراءات في الحساس الى نوعين اساسيين : القراءة الحقيقية والقراءة الاعتيادية.
القراءة الحقيقية :
من خلال هذه القراءة نستطيع تحديد زاوية الاتجاه حسي الاتجاهات الاربعة , مثلاً : شمال N يكون 0 او 360 درجة
#include
#include
#include
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
void setup(void){
Serial.begin(9600);}
void loop(){
sensors_event_t event;
mag.getEvent(&event);
float heading = atan2(event.magnetic.y, event.magnetic.x);
float declinationAngle = 0.22;
heading += declinationAngle;
if (heading < 0) {
heading += 2 * PI; }
if (heading > 2 * PI) {
heading -= 2 * PI; }
float headingDegrees = heading * 180 / M_PI;
Serial.print("Heading : ");
Serial.print(headingDegrees);
Serial.println(" degree");
delay(500);}


القراءة الاعتيادية :
تحول القراءة الحقيقية (الزاوية ) و تحدد الاتجاه بناءاً على ثنائية من الاتجاهات الرئيسية , مثال : 210° تصبح S 30° W حيث S:SOUTH , W:WEST .
#include
#include
#include
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
void setup(void){
Serial.begin(9600);}
void loop(){
sensors_event_t event;
mag.getEvent(&event);
float heading = atan2(event.magnetic.y, event.magnetic.x);
float declinationAngle = 0.22;
heading += declinationAngle;
if (heading < 0) {
heading += 2 * PI; }
if (heading > 2 * PI) {
heading -= 2 * PI; }
float headingDegrees = heading * 180 / M_PI;
if (headingDegrees == 0 || headingDegrees == 360 ){
Serial.println("N");}
if (headingDegrees > 0 && headingDegrees < 90 ) {
Serial.print("N");
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("E");}
if (headingDegrees == 90) {
Serial.println("E");}
if (headingDegrees > 90 && headingDegrees < 180 ) {
headingDegrees = 180 - headingDegrees;
Serial.print("S");
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("E");}
if (headingDegrees == 180) {
Serial.println("S");}
if (headingDegrees > 180 && headingDegrees < 270 ) {
headingDegrees = headingDegrees - 180;
Serial.print("S");
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("W");}
if (headingDegrees == 270) {
Serial.println("W");}
if (headingDegrees > 270 && headingDegrees < 360 ) {
headingDegrees = 360 - headingDegrees;
Serial.print("N");
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("W");}
delay(500);}
قياس وتحديد اشعة الحقل المغناطيسي :
باستخدام هذا الكود ، تعرض الشاشة التسلسلية قيم اشعة المجال المغناطيسي على ثلاثة محاور (محاور X و Y و Z) وتقيس الشدة بواحدة micro-Tesla (uT).
#include
#include
#include
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
void setup() {
Serial.begin(9600);}
void loop(void) {
sensors_event_t event;
mag.getEvent(&event);
Serial.print("X axis: "); Serial.print(event.magnetic.x); Serial.print(" uT ");
Serial.print("Y axis: "); Serial.print(event.magnetic.y); Serial.print(" uT ");
Serial.print("Z axis: "); Serial.print(event.magnetic.z); Serial.println(" uT");
delay(500);}