2013/09/16

Arduino練習:霍爾效應感測器

霍爾效應(Hall effect)由Edwin Hall於1879發現,當電流通過固體導體(或半導體)且放在磁場內,導體內的電荷載子受到勞倫茲力而偏向一邊,進而產生電壓(霍爾電壓)。根據此效應,便可偵測磁場、磁鐵。

這是我買的霍爾效應感測器Melexis US5881LUA。腳位功能圖,1:電源,2:接地,3:輸出。


工作電壓:3.5V到24V
適用溫度範圍:-40°C到150°C

US5881LUA是一個單極(unipolor)的磁力偵測裝置,只能偵測磁鐵的S磁極。

線路圖如下所示,接上5V電源與接地後,US5881LUA的腳位3接一個上拉電阻10k歐姆再接5V,腳位3再接Arduino的數位腳位2。


當US5881LUA處於磁力很弱、磁鐵的S磁極時,Arduino腳位2的狀態將會讀到HIGH,只有在磁鐵S磁極靠近US5881LUA的正面時(據我圖中那個小小的磁鐵而言,必須在1公分之內),Arduino腳位2的狀態將會讀到LOW,所以其作用就如同一個普通的開關,但是是以磁力控制罷了。

底下是測試用的程式碼:

int pin = 2;

void setup()
{
  Serial.begin(115200);
  pinMode(pin, INPUT);    
}

void loop()
{
  int status;
  status = digitalRead(pin);
  Serial.println(status);
  delay(1000);
}

也沒什麼,就是讀取腳位2的狀態,並輸出到序列埠,平常會看到1(HIGH),磁鐵S極靠近就會看到0(LOW)。

這篇寫的有點簡略,關於「開關」,可參考我之前寫的「Arduino練習:以開關切換LED明滅狀態」。

52 comments:

  1. Anonymous8/4/15 14:20

    請問有辦法檢測交流110V或220V的電流進而算出現在電器使用的電功率嗎?

    ReplyDelete
    Replies
    1. 你想要的是這種東西嗎?
      http://openenergymonitor.org/emon/buildingblocks/how-to-build-an-arduino-energy-monitor
      應該要量測電壓與電流,再算出電功率。

      Delete
    2. 我也好想知道 有解答嗎xdd

      Delete
    3. 有啊,已經有產品了,網路上也很多分享文。

      Delete
  2. 請問要量測磁力的大小。例如多少gs是用這塊嗎?

    ReplyDelete
    Replies
    1. 不是。

      或可試試A1301/A1302,請參閱http://playground.arduino.cc/Code/HallEffect

      Delete
  3. 你好,我想請問,如果我想用霍爾感測控制馬達的正轉反轉,該怎麼做,有參考的例子嗎?

    ReplyDelete
    Replies
    1. 從霍爾感測器,取得狀態後(有磁力或無),然後下指令控制馬達。
      不太懂你的問題所在。

      Delete
    2. 有磁力時,馬達反轉,無磁力時,保持正轉。

      Delete
    3. 是的我知道。就動手寫啊,:D。

      Delete
    4. 說的簡單,大神幫忙個

      Delete
    5. 你只是說出想要的功能,並沒有描述問題。
      取得霍爾效應感測器的部份,這一篇文章有講。
      馬達電源的部份,請參考拙作《Arduino輕鬆入門:範例分析與實作設計》的第9章,然後10.2節介紹直流馬達,10.5節介紹馬達控制板,10.6有介紹自行以L293D驅動兩顆直流馬達。

      裡頭都有範例程式碼,皆能控制馬達正反轉。

      Delete
    6. int IN1=8;
      int IN2=9;
      int ENA=3;

      void setup()
      {
      pinMode(IN1,OUTPUT);
      pinMode(IN2,OUTPUT);
      }
      void loop()
      {
      analogWrite(ENA, 200);// 馬達轉速
      digitalWrite(IN1,LOW);// 馬達正轉
      digitalWrite(IN2,HIGH);
      delay(2000);

      digitalWrite(IN1,HIGH);// 馬達反轉
      digitalWrite(IN2,LOW);
      delay(2000);
      }

      以上是我寫的馬達正轉反轉的程式(利用L298N測試過,可以達到正轉反轉),我現在的問題是,我不知道如何跟霍爾感測器結合。

      Delete
    7. 你需要的程式碼,其概略形式等同於以開關控制LED,
      請參考 Arduino練習:以開關切換LED明滅狀態 http://yehnan.blogspot.com/2012/02/arduinoled.html

      從霍爾感測器,取得狀態後(有磁力或無),(請參考這一篇),
      根據該狀態,下指令控制馬達(你已經寫出來了)。

      Delete
    8. 謝謝你的回復,我先試試看。

      Delete
    9. 我做出來了,謝謝你, 我現在可以用霍爾感測有無磁力,然後控制馬達了,真心感謝。

      Delete
    10. 恭喜。
      也謝謝回報。

      Delete
  4. 您好
    想請教您一個問題
    因為我們這次的專題想利用多個磁鐵感應下棋的位置
    手邊目前已經準備好一塊ARDUINO YUN
    然而預計一個棋盤會有64個感應區塊
    這樣的話要如何去讓ARDUINO接受到訊號(多個INPUT)
    是要將多個ARDUINO板子串聯嗎?還是有擴充板子可以加裝?
    謝謝!!

    ReplyDelete
    Replies
    1. 使用MCP23017 或MCP23S17 ,
      一個可有16個數位輸入腳位,
      使用4個便可擴充64個腳位

      Delete
    2. 謝謝您的回答!
      我後來上了Arduino的官網查到此篇
      http://playground.arduino.cc/Code/I2CPortExpander8574
      裡頭有介紹到其他的Port expanders
      那這幾種的功能都差不多嗎?
      裏頭有提到MCP23016 (Microchip) are more complicated to use
      比較難使用的原因是為何?謝謝

      Delete
    3. 功能就是擴充腳位。

      > MCP23016 (Microchip) are more complicated to use
      因為控制這顆晶片時,需要傳送的訊號較囉嗦吧。

      建議找有人寫出Arduino程式庫的晶片,譬如搜尋「MCP23017 arduino library」

      Delete
    4. This comment has been removed by the author.

      Delete
    5. This comment has been removed by the author.

      Delete
    6. 謝謝您的回答!
      還有個問題想請教
      因為我們這次是想設計一個同步的棋盤(象棋或者西洋棋)
      下方靠滑軌搭配步進馬達移動再加一個伺服馬達黏一個磁鐵吸引棋子做移動
      但問了一位朋友
      他說本篇網誌介紹的感應器Melexis US5881LUA並非走IIC
      因此建議我買2個MEGA板?
      還是說有其他的感應器可以使用!謝謝

      Delete
    7. > Melexis US5881LUA這篇文章介紹的霍爾感應並非走IIC
      沒錯, 不是IIC, 這顆感測器就只會輸出數位訊號而已

      > 所以是建議我買2塊MEGA板子
      好建議
      一塊mega的腳位超過64個

      Delete
    8. This comment has been removed by the author.

      Delete
    9. This comment has been removed by the author.

      Delete
    10. 謝謝!
      另外想請問
      A3144E 跟這篇介紹的US5881
      這兩款HALL SENSOR 的功能有差嗎?
      或是說靈敏度何者較優?

      Delete
    11. A3144E那些產品,已經停產了吧。

      Delete
    12. > 靈敏度
      請自行查詢datasheet。
      我沒用過。

      Delete
  5. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. This comment has been removed by the author.

      Delete
  6. 你好 請問一下您在測試US5881時有用過背面測試嗎?
    因為我們最近買了一個A3144的
    當初也是看上單極感應
    但是卻是正面N極靠近通電
    背面S極靠近也會通電
    有沒有只會偵測單面單極靠近通電的感應器呢?

    ReplyDelete
    Replies
    1. > 背面測試嗎?
      沒有。

      > 正面N極靠近通電 背面S極靠近也會通電
      A3144應該是unipolar吧,不該如此。

      > 有沒有只會偵測單面單極靠近通電的感應器呢?
      不知道。

      Delete
  7. 你好 葉前輩
    想詢問一下前輩有沒有用過另一種線性的霍爾感測器呢?
    想用它來做一個簡易的高斯計。

    ReplyDelete
  8. 請問一下 葉老師 有沒有可以在arduino上 量測電壓電流的範例 直流的

    ReplyDelete
    Replies
    1. 這種的嗎?

      ACS712 電流感測器
      http://henrysbench.capnfatz.com/henrys-bench/arduino-current-measurements/the-acs712-current-sensor-with-an-arduino/

      Delete
    2. 嗯嗯 謝謝葉老師 只是想要請問一下 她說的我有點不太懂 這個是否只能測量電壓 因為我主要是想要利用arduino來測量的功率 所以好像缺少電流部分 請葉老師解惑 謝謝

      Delete
    3. ACS712 是量電流的。

      Delete
  9. 老師您好:
    我想要用Arduino做電磁波感測器,想要感測手機的存在,在網路上看到的方法是用霍爾傳感器做的,請問有沒有推薦比較敏感、偵測範圍比較大的傳感器呢,或是有沒有其他的方法可以實現?

    ReplyDelete
    Replies
    1. 談到此類感測器,好像都會談到Geiger counter,
      用來偵測輻射,
      但能不能感測手機的存在,我就不確定了。

      Delete
  10. 請問老師,
    我買了一個水流感測器,G1&2″ Water Flow Sensor DN15 4分霍爾水流量感測器(https://goo.gl/ReYW74)
    網路上找到的範例程式碼,都是設定成由腳位2輸入訊號。
    而我自己實測,確實是腳位2的結果最好,監視頁上看到的反應迅速又靈敏,調整成其他腳位時,測試數值不但時高時低,感應也不靈光。

    問題是,有沒有在程式上做甚麼修改,能使得腳位2以外的腳位讀取資料時,與腳位2有同樣好的的結果?

    我有試著去搜尋,關於腳位的知識,但我真的看不太懂,麻煩老師幫忙解惑一下了。

    ReplyDelete
    Replies
    1. 因為需要使用具備中斷能力的腳位,
      所以在程式碼裡會看到attachInterrupt,

      要改用別的腳位的話,仍須具備有中斷能力的腳位,而且也要隨之修改呼叫時傳入的中斷編號。

      腳位與中斷編號的對應,請看 https://www.arduino.cc/en/Reference/AttachInterrupt

      Delete
    2. 葉難老師好~
      不好意思打擾,想再請教一個問題

      我想整合ESP8266與水流感測器,上傳數據到thingspeak
      做法是透過這個網頁的教學範例程式(http://ruten-proteus.blogspot.tw/2014/11/internet-of-thing-arduino-esp8266.html)。
      溫濕度數據上傳thingspeak已成功,而網路上找來的基礎水流感測程式也已經測試成功。
      下一步,把[上傳溫濕度到thingspeak]這個範例中的[溫溼度感測器]部分,換成[水流感測器]。(硬體與程式都是)

      目前遇到的問題是

      硬體方面,pin0 pin1給ESP8266用,pin2 pin3給USB轉TTL除錯用,擁有中斷功能的pin2 pin3已被佔滿,,所以缺一個擁有中斷功能的腳位給水流感測器用~

      我目前想到的方法是

      1.幫arduino板子擴充具有中斷功能的腳位。( 搜尋過,但沒找著.. )
      中斷腳能藉由加裝甚麼東西來擴充嗎?

      2.買一塊mega來用。
      腳位多一定夠用,直接挪用現在在UNO版上成功的溫濕度上傳範例,不知道能否直接成功?
      調整一下IDE的設定,調成MEGA板即可?

      想先解決硬體問題,請問葉難老師有沒有甚麼建議呢?

      Delete
    3. 使用SoftwareSerial,把腳位(如10與11)模擬成TX RX序列埠腳位,跟ESP8266溝通。
      這樣你就有0與1可用了。

      1. 嗯,我不知道耶。只能再加裝額外的微控制器吧,如Uno的ATmega328P。

      2. 應該可以。 注意一下腳位的能力是否相同。

      Delete
  11. 請問老師
    可否用ACS712霍爾電流感應模組來感應冷氣220V的電流?
    目的是要得知冷氣是否有開啟,想藉由感測通電的方式來達成
    ACS712直接接220V的電壓沒問題嗎?還是中間要接一些電路來處理?
    另外ACS712感測220v冷氣的話該買多少A的呢?

    ReplyDelete
    Replies
    1. 沒用過,不想亂回答,orz。

      Delete
  12. 老師您好,我想要監控太陽能電池的電流
    總共大約是7V
    請問有甚麼IC 能夠直接監控嗎?

    ReplyDelete
    Replies
    1. https://www.adafruit.com/product/904

      https://www.hacktronics.com/Sensors/Current-Sensor-30-Amp/flypage.tpl.html?redirected=1

      Delete
    2. 不好意思,再請教一下
      因為我是要量測二極體導通後的電流
      我是要將IC串聯於二極體上嗎?
      因為要從好幾個串聯二極體上去得到單一個 二極體電流
      如何能夠去個別區分出二極體的電流呢??
      還請老師幫忙解答,感激不盡!!

      Delete
    3. 看不懂問題。

      我非電子科系出身,或許可到別的地方詢問。

      Delete