• ベストアンサー
  • すぐに回答を!

ホール素子を用いた磁界の変化検出の不具合

  • 質問No.7176623
  • 閲覧数2131
  • ありがとう数4
  • 回答数4

お礼率 100% (4/4)

こんにちは、初めて質問させていただきます。


ホール素子を用いて磁界がS→N、N→Sへと変化するのを検出する回路を作っています。

Arduinoを用いており、VDDにはArduinoから5Vを、GNDには900Ω抵抗(手元に150Ω抵抗しかなかったので6つ直列)を、OUTにはArduinoの2pinを接続しています。

使用しているホール素子はN極でHIGH,S極でLOWを返す、下のUS1881LUAです。
http://akizukidenshi.com/catalog/g/gI-05274/

INPUTに設定した2pinからdigitarReadでホール素子の出力を読み込み、磁界の変化があった時にSerial.printlnでパソコンに0か1を表示させるようにしています。


以上の構成で動作させたところ、N極を近づけると延々と1と0を繰り返し表示させ続けます。
S極を近づけた場合は0を一度だけ表示し、正常です。

正常ではN極を近づけた時に一度だけ1を表示するはずですが、上記のような挙動をします。


正常に作動させるためにはどうすればいいでしょうか?
ご回答宜しくお願いします。

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 45% (763/1670)

出力がオープンドレインだったのはうかつでした。

間違いなく、No.2 の形の指摘が正解でしょう。

ちなみに、「プルアップ」とは、ホール素子の out と Arduinoの2pin の間に抵抗を入れることではありません。

せめて、ホール素子の資料は確認しましょう。

13.1 Typical Three-Wire Application Circuit

にある回路とちゃんと比べてみましょう。
お礼コメント
minajimi

お礼率 100% (4/4)

すみません、一応資料は確認していたのですが、コンデンサ等は使ってなかったので13.1あたりは読み飛ばしてました。

最近入門したばかりで不勉強で申し訳ないのですが、あの図からコンデンサ関連の部分を取り除いたような回路でいいのでしょうか?
投稿日時:2011/12/07 22:22

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 45% (763/1670)

> 最近入門したばかりで不勉強で申し訳ないのですが、あの図からコンデンサ関連の部
> 分を取り除いたような回路でいいのでしょうか?

まず、やってみましょう。
ダメかもしれませんが。
でも、挙動は明らかに変わるはずです。
お礼コメント
minajimi

お礼率 100% (4/4)

先ほどVDDと2PINの間に10kΩ抵抗を入れて試してみたところ、上手く作動しました!

お二人の助言がなければ解決できなかったので、大変感謝しております。ありがとうございました。
解決の一番のきっかけになったので、AsanoNagiさんにベストアンサーをつけさせて頂きます。
投稿日時:2011/12/08 08:56
  • 回答No.2

ベストアンサー率 49% (49/100)

GNDには900Ωがなぜ必要なのか回路図がないのでわかりませんが。
US1881は出力がオープンドレインになっていると思いますが、2PINはプルアップされているのでしょうか?
10kΩ位でプルアップが必要です。
微妙に回路電流が流れていると、論理の0Vだけ確実に引っ張っていると考えられます。
お礼コメント
minajimi

お礼率 100% (4/4)

ご回答ありがとうございます。

ご指摘を受けて考えてみたところ、900Ωの抵抗は必要ありませんね。ミスでした。

そこで、GNDはそのままGNDへ、ホール素子のOUTと2PINとの間に10kΩ抵抗を挟んでみましたが、それでも解決しませんでした。
10MΩでも試してみましたが、やはり同じでした。
投稿日時:2011/12/07 21:19
  • 回答No.1

ベストアンサー率 45% (763/1670)

おそらく、プログラムのループの中で、不用意にゼロをセットしているからでしょう。

いずれにしても、まず、オシロスコープで

・ホール素子単独で
・ボードをつないだ状態で

それぞれ出力を確認するが一番良いです。
補足コメント
minajimi

お礼率 100% (4/4)

ご回答ありがとうございます。

以下にプログラムを書いておきます。
ホール素子の値を代入する引数(val)を宣言する時にint val = 0 としていたのを int valのみにしてみましたが、状況は改善されませんでした。

手元にテスターはあるのですがオシロスコープはないので、ちょっと調べられません。。



#define hole 2 //ホール素子をPin2に接続
#define LED 11 //LEDをPin11に接続

int val;
int old_val;

void setup(){
Serial.begin(9200);
pinMode(hole, INPUT);
pinMode(LED, OUTPUT);
}

void loop(){
val = digitalRead(hole); //ホール素子の出力を取得
digitalWrite(LED, val); //ホール素子の出力に応じてLEDをON/OFF

//ホール素子の出力が変化した時にPCに数値を送る
if(val != old_val){
Serial.println(val);
}

old_val = val;

}
投稿日時:2011/12/07 20:46
お礼コメント
minajimi

お礼率 100% (4/4)

すみません、返信はこちらからだったみたいですね。
ご回答ありがとうございます。
投稿日時:2011/12/07 20:58
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ