使用 Basic Stamp 2 微控制器與 Hitachi HM55B 電子羅盤讀取地磁角,透過 COM Port 與電腦連接,透過C#開發使用者介面,即時顯示地磁角
1. 簡介
Hitachi HM55B 是由 Parallax 所研發的產品,其中使用 Hitachi HM55B 晶片為核心之一個具有雙軸量測的電子羅盤。Hitachi HM55B 電子羅盤模組能透過 BASIC Stamp 所提供的 5V 作為其電壓源並且校正其訊號準位。
圖1 Hitachi HM55B
2. 方法
2.1 Hitachi HM55B
地球上每個地方的地磁場都有固定的方向和大小,透過線性霍爾元件可檢測地磁場的大小和方向,因此可用來製作電子羅盤,Hitachi 公司所生產的 HM55B,其電子羅盤上具有 X 軸及 Y 軸,可分別量測地球磁場在這兩個方向的分量,如下圖所示,透過計算公式 angle θ = arctan ( -Y/X ) ,θ 即為X軸與地球磁場的夾角。
圖2 Hitachi HM55B 原理示意圖
2.2 Basic Stamp
Basic Stamp 是美國 Parallax 公司自1992年起所研發的微控制器 ( MCU ),此種微控制器與其他微控制器不同的地方在於其 ROM 記憶體內建了一套小型、特有的 PBASIC 程式語言直譯器,只要學會 PBASIC 程式語言,就能用其開發出嵌入式系統所用的控制應用程式,大幅降低了嵌入式設計的技能學習門檻,且 Parallax 開發一系列的感測元件,能直接與 Basic Stamp 做溝通,且有完整程式碼與接線圖,蠻適合剛入門學習的學生。
*註 : 由於 Basic Stamp 與其語言 PBASIC,在業界還沒有普及,因此可作為入門教材,但學生應於課後往 8051、ARM 等方面做學習。
圖3 Basic Stamp 2
2.3 硬體接線與程式碼
(1) 硬體接線
參考 Hitachi® HM55B Compass Module (#29123) 內的接線
圖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
(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電子羅盤旋轉時,電腦即時接收到的地磁角度,並顯示於使用者介面上。