[C#][Sensor]使用 Hitachi HM55B 電子羅盤

  • 24534
  • 0
  • 2010-08-02

使用 Basic Stamp 2 微控制器與 Hitachi HM55B 電子羅盤讀取地磁角,透過 COM Port 與電腦連接,透過C#開發使用者介面,即時顯示地磁角

 

1. 簡介

Hitachi HM55B 是由 Parallax 所研發的產品,其中使用 Hitachi HM55B 晶片為核心之一個具有雙軸量測的電子羅盤。Hitachi HM55B 電子羅盤模組能透過 BASIC Stamp 所提供的 5V 作為其電壓源並且校正其訊號準位。

 

12379826864

圖1 Hitachi HM55B

 

 

2. 方法

2.1 Hitachi HM55B

地球上每個地方的地磁場都有固定的方向和大小,透過線性霍爾元件可檢測地磁場的大小和方向,因此可用來製作電子羅盤,Hitachi 公司所生產的 HM55B,其電子羅盤上具有 X 軸及 Y 軸,可分別量測地球磁場在這兩個方向的分量,如下圖所示,透過計算公式 angle θ = arctan ( -Y/X ) ,θ 即為X軸與地球磁場的夾角。

clip_image002

圖2 Hitachi HM55B 原理示意圖
 

 

2.2 Basic Stamp

Basic Stamp 是美國 Parallax 公司自1992年起所研發的微控制器 ( MCU ),此種微控制器與其他微控制器不同的地方在於其 ROM 記憶體內建了一套小型、特有的 PBASIC 程式語言直譯器,只要學會 PBASIC 程式語言,就能用其開發出嵌入式系統所用的控制應用程式,大幅降低了嵌入式設計的技能學習門檻,且 Parallax 開發一系列的感測元件,能直接與 Basic Stamp 做溝通,且有完整程式碼與接線圖,蠻適合剛入門學習的學生。

*註 : 由於 Basic Stamp 與其語言 PBASIC,在業界還沒有普及,因此可作為入門教材,但學生應於課後往 8051、ARM 等方面做學習。

 clip_image002[1]clip_image002

圖3 Basic Stamp 2

 

 

2.3 硬體接線與程式碼

(1) 硬體接線

參考 Hitachi® HM55B Compass Module (#29123) 內的接線

image

圖4 HM55B 電子羅盤與 Basic Stamp 2 接線圖

 

(2) 程式碼

使用 Hitachi® HM55B Compass Module (#29123) 內的範例程式碼,在此我改了輸出部分,起始判斷字元 s 與結束判斷字元 e;

例如角度為20度,則輸入為 s20e,讓後續透過 COM Port 讀入電腦時,容易做字串處理


' -----[ Pins/Constants/Variables ]-------------------------------------------
DinDout        PIN      6                    ' P6 transceives to/from Din/Dout
Clk            PIN      5                    ' P5 sends pulses to HM55B's Clk
En             PIN      4                    ' P4 controls HM55B's /EN(ABLE)

Reset          CON      %0000                ' Reset command for HM55B
Measure        CON      %1000                ' Start measurement command
Report         CON      %1100                ' Get status/axis values command
Ready          CON      %1100                ' 11 -> Done, 00 -> no errors
NegMask        CON      %1111100000000000    ' For 11-bit negative to 16-bits

x              VAR      Word                 ' x-axis data
y              VAR      Word                 ' y-axis data
status         VAR      Nib                  ' Status flags
angle          VAR      Word                 ' Store angle measurement

' -----[ Main Routine ]-------------------------------------------------------

DO                                           ' Main loop

  GOSUB Compass_Get_Axes                     ' Get x, and y values

  angle = x ATN -y                           ' Convert x and y to brads
  angle = angle */ 360                       ' Convert brads to degrees

  DEBUG HOME,"s",DEC angle,"e"
  PAUSE 150                                  ' Debug delay for slower PCs

LOOP                                         ' Repeat main loop


' -----[ Subroutines ]--------------------------------------------------------

Compass_Get_Axes:                            ' Compass module subroutine

  HIGH En: LOW En                            ' Send reset command to HM55B
  SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]

  HIGH En: LOW En                            ' HM55B start measurement command
  SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
  status = 0                                 ' Clear previous status flags

  DO                                         ' Status flag checking loop
    HIGH En: LOW En                          ' Measurement status command
    SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
    SHIFTIN  DinDout,clk,MSBPOST,[Status\4]  ' Get Status
  LOOP UNTIL status = Ready                  ' Exit loop when status is ready

  SHIFTIN  DinDout,clk,MSBPOST,[x\11,y\11]   ' Get x & y axis values
  HIGH En                                    ' Disable module

  IF (y.BIT10 = 1) THEN y = y | NegMask      ' Store 11-bits as signed word
  IF (x.BIT10 = 1) THEN x = x | NegMask      ' Repeat for other axis

  RETURN

 

 

2.4 電腦端使用者介面

將 2.3 中的硬體與電腦 COM Port 做連接,利用 SerialPort 類別 : 表示序列埠資源 讀取資料。

對此部分有興趣的,可參考 BillChung 前輩 Blog 中的文章 Serial Port通訊檢測

(1) Form

image 

(2) 程式碼


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        delegate void SetTextCallback(string text);

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string carray = serialPort1.ReadExisting();
            SetText(carray);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = System.IO.Ports.StopBits.One;
            serialPort1.Parity = System.IO.Ports.Parity.None;
            serialPort1.ReadTimeout = 100;
            serialPort1.Open();
        }

        private void SetText(string text)
        {
            if (this.txtAngle.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                txtTemp.Text += text;
                if (txtTemp.Text.Length < 10) { return; }

                string[] strTempS = txtTemp.Text.Split('s');
                if (strTempS.Length <= 1) { return; }

                string[] strTempE = strTempS[1].Split('e');
                if (strTempE.Length > 0)
                {
                    this.txtAngle.Text = strTempE[0];
                    txtTemp.Clear();
                }
            }
        }
    }
}

 

3. 結果

影片為硬體 Basic Stamp 2 與 HM55B電子羅盤旋轉時,電腦即時接收到的地磁角度,並顯示於使用者介面上。