部品 · 読了まで12分

ホール効果センサーとArduino:A3144と49Eで磁石と回転数を測る

Arduinoでホール効果センサーを使う方法を解説します。デジタルのA3144、アナログのKY-024 / 49E、プルアップ抵抗、極と磁界の強さ、回転数(RPM)の計測、ドアセンサー、ESP32の内蔵ホールセンサーとリードスイッチの違いまで紹介します。

ホール効果センサーは、可動部品を一切使わずに、磁石があるかどうか、その極、そして強さを検知する小さな半導体チップです。Arduinoのプロジェクトでは、モーターの回転数を数えたり、自転車の速度を測ったり、ドアが開いているか閉じているかを判定したり、ジョイスティックの位置を読み取ったりするのに使われます。スマホの手帳型カバーを閉じると画面が消えるしくみ、パソコンの冷却ファンの回転信号、自動車の車輪速センサーも、すべてホール効果で動いています。ホビー向けのキットでよく見かけるのは2種類で、オン/オフの信号を出すデジタルのA3144と、磁界の強さを電圧として出力するアナログの49E(KY-024モジュール)です。

このガイドでは、ホール効果の物理をわかりやすく説明したうえで、デジタルとアナログのセンサーの違い、配線、そしてプルアップ抵抗が必要な理由を紹介します。続いて、A3144で磁石を検知し、49Eで近づいている極と磁界の強さ(何ガウスか)を測り、割り込みを使ってモーターの回転数(RPM)を数えます。ESP32の内蔵ホールセンサーの用途と新しいバージョンで削除された理由、Raspberry Pi PicoのMicroPythonコード、ホールセンサーとリードスイッチの比較も紹介します。

ホール効果センサーを反応させるための小さな磁石
小さなネオジム磁石なら、数センチ離れた位置からホールセンサーを反応させられます。磁石の平らな面をセンサーの文字が印刷された面に向けてください。

ホール効果とは?ホールセンサーのしくみ

1879年、エドウィン・ホール(Edwin Hall)は、電流が流れている薄い導体に直角に磁界をかけると、導体の両端の間に小さな電圧が生じることを発見しました。これは、動いている電荷が磁界の中で横向きに押される(ローレンツ力)ためです。電子が板の片側にたまり、反対側は電子が足りなくなり、その差がホール電圧として測定されます。この電圧は磁界の強さに比例し、磁界の向きが変わると符号も反転します。この効果は金属より半導体のほうがずっと大きく現れますが、それでもマイクロボルト〜ミリボルトのレベルです。そのため、ホールセンサーのチップには、ホール素子の板のほかにレギュレーター、増幅器、そしてデジタル型ではシュミットトリガと出力トランジスタが内蔵されています。

磁界の強さはガウス(G)またはミリテスラ(mT)で表し、1 mT = 10 Gです。地球の磁界は約0.25〜0.65 Gしかないので、ホールセンサーには影響しません。小さなネオジム磁石の表面には数千ガウスの磁界がありますが、この値は距離とともに急激に小さくなります。距離が2倍になると、磁界はおよそ8分の1まで下がります。そのため、検知できる距離はセンサーのしきい値と磁石の大きさによって変わり、ふつうは数ミリから数センチの範囲です。

ホールセンサーの種類:A3144、KY-024 / 49Eなど

ホールセンサーは出力の種類で大きく3つのグループに分かれます。A3144のようなユニポーラスイッチ型では、一方の極(A3144ではS極)が十分に近づいたときだけ出力がLOWになり、磁石が離れるとHIGHに戻ります。US1881のようなラッチ型では、S極で出力が一方の状態に、N極でもう一方の状態に切り替わり、磁石が離れても最後の状態が保持されます。このタイプは、周囲にN極とS極の磁石が交互に並んだモーターに最適です。49Eのようなリニア型では、出力はスイッチではなく、磁界の強さに比例したアナログ電圧です。磁石がないときは電源電圧の半分を出力し、一方の極が近づくと上がり、もう一方の極では下がります。

特徴A3144(デジタル)49E / SS49E(アナログ)US1881(ラッチ型)
電源4.5〜24 V2.7〜6.5 V3.5〜24 V
出力オープンコレクタ、磁石があるとLOWアナログ、磁界ゼロでVCC/2オープンドレイン、S極でLOW、N極でHIGH
反応する極S極のみ両方(符号つき)S極でオン、N極でオフ
しきい値 / 感度動作点は約70〜350 G5 Vで標準1.4 mV/G標準±95 G
プルアップは必要?必要(10 kΩまたはINPUT_PULLUP)不要必要
モジュール名KY-003KY-024(LM393によるDOもあり)、KY-035モジュールとしてはまれ
ピン(印刷面を手前にしたとき)VCC、GND、OUTVCC、GND、OUTVDD、GND、OUT

ホールセンサーとArduinoの配線、プルアップ抵抗

A3144の出力はオープンコレクタのトランジスタです。磁石があると出力をGNDにつなぎ、磁石がないと出力をどこにもつながず、浮いた状態にします。浮いたピンはノイズを拾って、HIGHとLOWをランダムに読み取ります。そのため、出力を抵抗で電源側に引き上げる必要があり、これをプルアップと呼びます。Arduinoでいちばん簡単なのは、pinMode(pin, INPUT_PULLUP)でボード内蔵の20〜50 kΩの抵抗を有効にする方法です。ケーブルが長い、周囲のノイズが多い、または高速で回転する軸を数える場合は、出力と電源の間に外付けの10 kΩを入れると、よりきれいなエッジが得られます。オープンコレクタには便利な副作用もあります。センサーを5 Vで動かし、出力を3.3 Vにプルアップすれば、ESP32やPicoのような3.3 Vのボードでも安全に使えます。

接続Arduino UnoESP32Raspberry Pi Pico
A3144 VCC5VVIN(5 V)VBUS(5 V)
A3144 OUTD2 + INPUT_PULLUP(または10 kΩ → 5V)GPIO 27 + INPUT_PULLUP(または10 kΩ → 3V3)GP15 + PULL_UP(または10 kΩ → 3V3)
49E VCC5V3V33V3
49E OUTA0GPIO 34GP26(ADC0)
GND(両方)GNDGNDGND
A3144の公式な電源電圧の範囲は4.5〜24 Vです。3.3 Vで動かしても動作しているように見えることが多いですが、信頼性はありません。ESP32やPicoでは、センサーを5 Vで動かし、出力のプルアップは3.3 Vにつないでください。KY-003のような完成品のモジュールには注意が必要です。モジュール上に、出力をVCCに引き上げる抵抗とLEDが載っています。モジュールを5 Vで動かすと出力も5 V近くまで上がり、3.3 Vのボードのピンを壊すおそれがあります。その場合は出力に分圧回路を入れるか、センサー単体を使ってください。

A3144で磁石を検知する

  1. A3144の印刷面を手前にすると、ピンは左からVCC、GND、OUTです。VCCを5Vに、GNDをGNDに、OUTをD2につなぎます。
  2. 下のコードを書き込み、シリアルモニタを9600ボーで開きます。
  3. 磁石の片面をセンサーの印刷面に近づけます。ボードの内蔵LEDが点灯しない場合は、磁石を裏返してください。A3144はS極にしか反応しません。
  4. LEDが点灯する距離と消灯する距離をメモします。この2つの差がセンサー内蔵のヒステリシスです。
C++ (Arduino IDE)
1const byte HALL_PIN = 2;              // A3144 OUT
2const byte LED_PIN = 13;              // dahili LED / onboard LED
3
4bool lastMagnet = false;
5
6void setup() {
7  pinMode(HALL_PIN, INPUT_PULLUP);    // açık kolektör çıkış için pull-up / pull-up for the open-collector output
8  pinMode(LED_PIN, OUTPUT);
9  Serial.begin(9600);
10}
11
12void loop() {
13  bool magnet = digitalRead(HALL_PIN) == LOW;   // mıknatıs varken LOW / LOW when a magnet is present
14  digitalWrite(LED_PIN, magnet ? HIGH : LOW);
15
16  if (magnet != lastMagnet) {                   // yalnız durum değişince yaz / print only on change
17    Serial.println(magnet ? F("Miknatis var / magnet detected") : F("Miknatis yok / no magnet"));
18    lastMagnet = magnet;
19  }
20}

リードスイッチやボタンと違って、A3144にはチャタリング対策が必要ありません。センサー内部のシュミットトリガが、動作点(BOP)を復帰点(BRP)より少なくとも20 G高く保つので、磁石が境目でふらついても出力が行ったり来たりしません。可動接点がないため出力のエッジもきれいで、1秒間に数千回反応できます。ロジックが反転していることを忘れないでください。INPUT_PULLUPを使うと、磁石があるときにLOW、ないときにHIGHを読み取ります。これはボタンの配線と同じプルアップのロジックです。

KY-024 / 49Eで極と磁界の強さを測る

49Eはリニア型のセンサーです。5 Vで動かすと、磁石がないときの出力は約2.5 Vで、1ガウスあたり標準で1.4 mV変化します。S極が印刷面に近づくと電圧が上がり、N極では下がります。そのため、磁石の有無だけでなく、どちらの極が近づいているか、磁界がどれくらい強いかまで測れます。計算式はB (G) = (Vout − Vzero) / 0.0014です(Voutは出力電圧、Vzeroはゼロ点の電圧)。KY-024モジュールでは、AOピンが49Eの出力そのもので、DOピンはLM393コンパレーターのデジタル出力です。DOは、ポテンショメーターで設定したしきい値を磁界が超えると切り替わります。下のコードは起動時にゼロ点を測定し、その後、磁界をガウスとミリテスラで表示して極を知らせます。

C++ (Arduino IDE)
1const byte HALL_PIN = A0;               // 49E OUT ya da KY-024 AO / 49E OUT or KY-024 AO
2const float VCC = 5.0;
3const float SENSITIVITY = 0.0014;       // 1,4 mV/G (5 V'ta tipik) / 1.4 mV/G (typical at 5 V)
4const float DEAD_BAND = 20.0;           // bu değerin altını yok say (G) / ignore below this (G)
5
6float zeroVolt = 2.5;
7
8float readVolt() {
9  long sum = 0;
10  for (byte i = 0; i < 32; i++) sum += analogRead(HALL_PIN);   // 32 ölçüm ortalaması / average of 32 readings
11  return sum / 32.0 * VCC / 1023.0;
12}
13
14void setup() {
15  Serial.begin(9600);
16  delay(200);
17  zeroVolt = readVolt();                // mıknatıs yokken sıfır noktası / zero point with no magnet nearby
18  Serial.print(F("Sifir / zero: "));
19  Serial.print(zeroVolt, 3);
20  Serial.println(F(" V"));
21}
22
23void loop() {
24  float gauss = (readVolt() - zeroVolt) / SENSITIVITY;
25  Serial.print(gauss, 0);
26  Serial.print(F(" G  ("));
27  Serial.print(gauss / 10.0, 1);        // 10 G = 1 mT
28  Serial.print(F(" mT)  "));
29  if (gauss > DEAD_BAND)       Serial.println(F("Guney kutbu / south pole"));
30  else if (gauss < -DEAD_BAND) Serial.println(F("Kuzey kutbu / north pole"));
31  else                         Serial.println(F("Alan yok / no field"));
32  delay(250);
33}

Unoの10ビットADCは5 Vを1024段階に分けるので、1段階は約4.9 mVです。49Eと組み合わせると、分解能はおよそ3.5 Gになります。極の表示はメーカーによって異なることがあるので、最初は方位磁針で確認してください。方位磁針の北を指す側の端は、磁石のS極のほうを向きます。センサーは約±1000 Gで飽和するので、とても強い磁石をほとんど触れるくらいまで近づけると、値はそれ以上上がらなくなります。ゼロ点は温度によって数ミリボルトずれることがあるので、正確に測りたいときは測定の直前にゼロ点の測定をやり直してください。

ホールセンサーで回転数(RPM)と速度を測る

モーター、ファン、車輪の回転数を測るには、軸やリムに小さな磁石を貼り、1回転ごとに磁石が前を通過する位置にA3144を固定します。磁石が通過するたびに、出力が1回LOWになります。loop()の中でdigitalRead()を使ってパルスをとらえようとすると、高速回転のときにパルスを取りこぼします。正しい方法は割り込みを使うことです。下のコードは2つのパルスの間隔をマイクロ秒単位で測り、RPM = 60,000,000 / (period_µs × number_of_magnets)の式で回転数を計算します(period_µsはパルスの間隔、number_of_magnetsは磁石の数)。2秒間パルスが来なければ、軸は止まっていると判断します。割り込みのしくみはArduinoの割り込みのガイドで詳しく説明しています。

C++ (Arduino IDE)
1const byte HALL_PIN = 2;                  // A3144 OUT, Uno'da kesme pini (INT0) / interrupt pin on the Uno (INT0)
2const byte MAGNETS = 1;                   // mildeki mıknatıs sayısı / magnets on the shaft
3const unsigned long MIN_GAP_US = 2000;    // 2 ms'den sık darbeler gürültüdür / pulses closer than 2 ms are noise
4const unsigned long STOP_US = 2000000;    // 2 sn darbe yoksa durdu / no pulse for 2 s means stopped
5
6volatile unsigned long lastPulse = 0;
7volatile unsigned long period = 0;        // iki darbe arası süre (µs) / time between pulses (µs)
8
9void onPulse() {
10  unsigned long now = micros();
11  unsigned long gap = now - lastPulse;
12  if (gap > MIN_GAP_US) {
13    period = gap;
14    lastPulse = now;
15  }
16}
17
18void setup() {
19  pinMode(HALL_PIN, INPUT_PULLUP);
20  attachInterrupt(digitalPinToInterrupt(HALL_PIN), onPulse, FALLING);   // mıknatıs gelince LOW'a iner / falls LOW when the magnet arrives
21  Serial.begin(9600);
22}
23
24void loop() {
25  noInterrupts();                         // iki değişkeni birlikte oku / read both variables together
26  unsigned long p = period;
27  unsigned long last = lastPulse;
28  interrupts();
29
30  float rpm = 0;
31  if (p > 0 && micros() - last < STOP_US) {
32    rpm = 60000000.0 / ((float)p * MAGNETS);
33  }
34  Serial.print(F("RPM: "));
35  Serial.println(rpm, 0);
36  delay(500);
37}

コードでは2 msの不感時間を設けています。つまり、磁石1個で最大30,000 RPMまで測れるということで、ほとんどのホビー用モーターには十分すぎるほどです。軸に磁石を2個や4個つければ、低速でもより頻繁に更新される測定値が得られます。MAGNETSの値を変えるだけです。磁石はバランスよく配置してください。片側だけ重いと、高速回転する軸が振動します。パソコンのファンの黄色い線も、実は内部のホールセンサーからのオープンコレクタ出力で、1回転につき2パルスを出します。同じコードをMAGNETS = 2で使えば、ファンの回転数を読み取れます。サイクルコンピューターに必要な周長と時速(km/h)の計算はリードスイッチのガイドにあります。ホールセンサーでも式は同じです。

ホールセンサーで作るドアやふたのセンサー

ドアセンサーにするには、磁石をドアの動く側の扉に、A3144を枠に取り付け、ドアを閉めたときに磁石のS極がセンサーの印刷面を向くように配置します。ドアが閉まっていると出力はLOW、開くとHIGHになります。配線が切れても、プルアップがピンをHIGHに引き上げるので、システムはそれを「ドアが開いている」と判断し、故障しても安全側にとどまります。ここではホールセンサーに2つの利点があります。可動接点がないので、振動するドアや1秒間に何度も開閉するふたでも摩耗しません。また、密閉された箱の壁越しでも磁石を検知できます。欠点は常に電力を消費することです。A3144は約4〜5 mAを消費するので、2000 mAhの電池でもセンサーだけで約18日で使い切ってしまいます。電池で何か月も動かす必要があるドアセンサーには、電力を消費しないリードスイッチのほうが向いています。

ESP32の内蔵ホールセンサー

無印ESP32のチップには小さなホールセンサーが内蔵されていて、Arduino ESP32コアの2.xではhallRead()関数で読み取れます。ただし、このセンサーはノイズがとても多く、強い磁石がモジュールの金属シールドにほとんど触れるくらい近づいたときにしか、はっきりした変化を示しません。また、測定中はGPIO 36とGPIO 39を使うので、これらのピンにほかの部品をつないでいると結果がおかしくなります。ESP32-S2、S3、C3のような新しいチップにはこのセンサーがそもそもなく、EspressifがESP-IDF 5でサポートを削除したため、Arduino ESP32コア3.xにはhallRead()がもうありません。下のコードはどちらのバージョンでもコンパイルできます。2.xでは平均値を表示し、3.xでは代わりに警告を表示します。本格的なプロジェクトでは、ESP32に外付けのA3144や49Eをつなぐほうが常に確実です。ボード全般の特徴は「ESP32とは?」で紹介しています。

C++ (Arduino IDE)
1// ESP32 dahili Hall sensörü (yalnız orijinal ESP32) / built-in Hall sensor (original ESP32 only)
2void setup() {
3  Serial.begin(115200);
4}
5
6void loop() {
7#if ESP_ARDUINO_VERSION_MAJOR < 3
8  long sum = 0;
9  for (int i = 0; i < 100; i++) {
10    sum += hallRead();              // GPIO 36 ve 39'u kullanır / uses GPIO 36 and 39
11  }
12  Serial.println(sum / 100);        // gürültülü, ortalama al / noisy, so average it
13#else
14  Serial.println("hallRead() 3.x cekirdekte yok / not available in core 3.x");
15#endif
16  delay(200);
17}

Raspberry Pi Picoで回転数を測る(MicroPython)

Picoでは、A3144をVBUSの5 Vで動かし、出力をGP15につないで、ピンの内部プルアップ抵抗を有効にします。この抵抗は3.3 Vにつながっているので、ピンに5 Vがかかることはありません。下のコードは割り込みでパルスを数え、1秒ごとにカウンターを読み取ってリセットします。カウンターを読み取る間だけ割り込みを短時間無効にすると、読み取りとリセットの間にパルスが入り込んで失われるのを防げます。この方法の分解能は、磁石1個で60 RPMです。より細かい結果が必要なら、Arduinoの例と同じように、2つのパルスの間隔をtime.ticks_us()で測ることもできます。

MicroPython
1from machine import Pin, disable_irq, enable_irq
2import time
3
4hall = Pin(15, Pin.IN, Pin.PULL_UP)    # A3144 OUT (sensör VBUS'tan 5 V ile) / A3144 OUT (sensor on 5 V from VBUS)
5MAGNETS = 1                            # mildeki mıknatıs sayısı / magnets on the shaft
6count = 0
7last_us = 0
8
9def on_pulse(pin):
10    global count, last_us
11    now = time.ticks_us()
12    if time.ticks_diff(now, last_us) > 2000:    # 2 ms gürültü filtresi / 2 ms noise filter
13        count += 1
14        last_us = now
15
16hall.irq(trigger=Pin.IRQ_FALLING, handler=on_pulse)
17
18while True:
19    time.sleep(1)
20    state = disable_irq()              # sayacı güvenle oku / read the counter safely
21    pulses = count
22    count = 0
23    enable_irq(state)
24    print("RPM:", pulses * 60 // MAGNETS)

ホールセンサーとリードスイッチ、どちらを選ぶ?

どちらも磁石を検知しますが、しくみはまったく違います。リードスイッチは、ガラス管の中の2枚の金属片が磁石で接触する機械式のスイッチで、電力をまったく消費しません。ホールセンサーは可動部品のない電子チップで、電源が必要です。簡単なルールはこうです。反応する回数が少なく、電池で何か月も動かすセンサーにはリードスイッチ。高速で回転する軸、振動の多い環境、極の情報や磁界の強さが必要な用途にはホールセンサーです。

ガラス管のリードスイッチ
リードスイッチ:ガラス管の中に2枚の金属片が入っています。電力は消費しませんが、機械式なので速度と寿命には限りがあります。
特徴ホールセンサー(A3144 / 49E)リードスイッチ
しくみ半導体、可動部品なし機械式の接点
電源必要(約4〜6 mA)不要
極と強さA3144はS極のみ、49Eは極と強さがわかる極は関係なし、有無のみ
速度数十kHzまで、エッジがきれい数百Hz、接点のチャタリングあり
寿命と耐久性摩耗せず、振動に強い数百万回の動作、ガラスが割れることがある
向いている用途回転数(RPM)、速度、位置、極の検知電池式のドアや窓のセンサー

ホールセンサーを使ったプロジェクトのアイデア

  • サイクルコンピューター:スポークに磁石を、フォークにA3144を取り付け、速度、走行距離、平均速度をOLEDディスプレイに表示します。
  • モーターとファンの回転計:DCモーターやパソコンのファンの回転数を測り、PWMで速度を調整しながら実際の回転数を確認します。
  • 風速計:カップ型の回転部の軸に磁石を取り付け、回転数から風速を計算してESP32で記録します。
  • 水流メーター:YF-S201のような流量センサーの中にもホールセンサーが入っています。パルスを数えればリットル数を測れます。詳しくは水流センサーのガイドをご覧ください。
  • 秘密の金庫や引き出しのロック:ふたの内側に隠した49Eが、磁石をちょうど正しい位置にかざしたときだけロックを解除します。
  • ドアやふたのアラーム:A3144を使い、ふたが開くとブザーを鳴らしたり、ESP32でスマホに通知を送ったりするアラームです。

よくある間違いと対処法

症状考えられる原因対処法
ピンがHIGHとLOWをランダムに読み取るA3144の出力にプルアップがないINPUT_PULLUPを使うか、出力とVCCの間に10 kΩを入れる
磁石を近づけても何も起きない極が違う:A3144はS極にしか反応しない磁石を裏返し、印刷面に対してまっすぐ向ける
ESP32やPicoでセンサーが不安定A3144を3.3 Vで動かしているセンサーを5 Vで動かし、プルアップを3.3 Vにつなぐ
高速回転で回転数が低い、または不安定loop()の中でパルスを読み取っていて取りこぼしているattachInterrupt()で割り込みを使う
磁石がないのに49Eが値を示すゼロ点が2.5 Vと違う、またはずれている起動時にゼロ点を測定し、その値を差し引く
ESP32のhallRead()がコンパイルできないArduino ESP32コア3.xを使っている外付けのホールセンサーを使うか、コア2.xに切り替える
どちらの面がS極かわからない磁石を使う場合は、まず49Eのコードを実行し、磁石の両面を順番にセンサーに近づけてください。プラスのガウス値を示す面がS極です。その面にペンで印をつけておくと、A3144を使うどのプロジェクトでも時間を節約できます。磁石を接着するときは、極だけでなく磁石の中心もセンサーの印刷面の中央に合わせてください。数ミリずれるだけで、反応する距離が半分になることがあります。

ホールセンサーは、磁石を非接触で、ノイズなく、摩耗せずに検知するいちばん柔軟な方法です。A3144では速くてきれいなオン/オフ信号が、49Eでは極と磁界の強さが、割り込みを使えば信頼できる回転数の測定が得られます。プルアップ抵抗、正しい極、3.3 Vのボードでの電源の注意点さえ忘れなければ、最初から動きます。BlueGraysアプリでは、「リードスイッチの状態を読み取る」と「リードスイッチ式ドアセンサー」のプロジェクトのほか、ボタンや割り込みの例、ESP32の動体検知アラーム、Picoのチャタリング対策のプロジェクトを、ステップごとの回路図とコードつきで紹介しています。

よくある質問

ホール効果センサーはどのように動作しますか?

ホールセンサーの中には、電流が流れる薄い半導体の板があります。この板に直角に磁界がかかると、電荷が片側に押され、両端の間に磁界に比例した小さな電圧が生じます。センサー内部の増幅器がこの電圧を大きくし、デジタル型ではしきい値回路がそれをオン/オフの出力に変えます。

A3144にプルアップ抵抗が必要なのはなぜですか?

A3144の出力はオープンコレクタです。磁石があると出力をGNDにつなぎ、ないとどこにもつなぎません。浮いたピンはノイズでランダムな値を読み取るので、出力を抵抗で電源側に引き上げる必要があります。ArduinoではINPUT_PULLUPで十分ですが、ケーブルが長い場合や高速回転では外付けの10 kΩのほうが確実です。

A3144はどちらの極に反応しますか?

A3144はユニポーラスイッチで、S極が印刷面に十分近づいたときだけ出力をLOWにします。N極を近づけても何も起きません。磁石の極がわからない場合は、両面を試すか、49Eのようなリニア型のセンサーで確認してください。

KY-024とKY-003の違いは何ですか?

KY-003はデジタルのA3144センサーを使ったモジュールで、磁石の有無だけを知らせます。KY-024はリニア型の49EセンサーとLM393コンパレーターを搭載しており、AOピンから磁界の強さをアナログ値で、DOピンからポテンショメーターで設定したしきい値に基づくデジタル信号を出力します。

ホールセンサーはどれくらい離れた磁石を検知できますか?

距離は磁石の強さとセンサーのしきい値によって変わります。小さなネオジム磁石なら、A3144はふつう1〜3 cmで反応します。弱いフェライト磁石では数ミリまで短くなります。磁界は距離とともに急激に弱まるので、検知距離を伸ばすいちばん効果的な方法は、より大きい磁石か、より強い磁石を使うことです。

ESP32の内蔵ホールセンサーは使えますか?

無印ESP32には内蔵ホールセンサーがあり、Arduino ESP32コア2.xではhallRead()で読み取れます。ただし、ノイズがとても多く、ごく近くの強い磁石にしか反応せず、GPIO 36と39を使います。ESP32-S2、S3、C3には搭載されておらず、Arduino ESP32コア3.xではhallRead()が削除されています。本格的なプロジェクトでは外付けのセンサーを使ってください。

全プロジェクトを見る
ボタンでLEDを点灯(押している間のみ)
#9初級

ボタンでLEDを点灯(押している間のみ)

呼び鈴のように、押している間は点灯し、離すと消灯します。Arduinoはボタンの状態を常に読み取り、押されている間はLEDを点灯させ、指を離した瞬間に消灯させます。このシンプルな回路で、ボードが外部からの操作を検知する仕組みを学べます。

4.8(113)
229
ESP32でボタンによるLED制御(押している間だけ点灯)
#104初級

ESP32でボタンによるLED制御(押している間だけ点灯)

ボタンを押している間はLEDが点灯し、離すと消灯します。ESP32のデジタル入力ピンと内蔵プルアップ抵抗の使い方を学びます。INPUT_PULLUPモードを使うため、外付け抵抗は不要です。

4.6(36)
55
リードスイッチの状態を読み取る
#37初級

リードスイッチの状態を読み取る

ドアや窓の警報装置に使われる、磁石で動くスイッチの仕組みが気になったことはありませんか?リードスイッチモジュールに磁石を近づけると、内部の小さなスイッチが閉じます。Arduinoがその状態を1秒ごとに読み取り、コンピューターの画面に0または1を表示します。磁石を近づけたり遠ざけたりして、値が変わる様子を確かめられます。

4.4(21)
27
リードスイッチ式ドアセンサー
#38初級
プレミアム

リードスイッチ式ドアセンサー

ライトを見るだけで、ドアが開いているか閉まっているか分かります。ドアに小さな磁石、ドア枠に磁石を検知するスイッチを取り付けます。ドアが閉まっているときは両者が並び、緑のLEDが点灯します。ドアが開いて磁石が離れると、赤いLEDが点灯します。家庭用警報装置のドアセンサーも、こんなシンプルな仕組みです。

4.7(34)
44
ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
#145上級
プレミアム

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)

PIRセンサーが動きを検知するとブザーとLEDを作動させ、同時にTelegramで持ち主に即座に通知するスマート防犯アラームです。アラームが繰り返される頻度を抑えるため、30秒のクールダウン(待ち時間)を設けています。この仕組みはPIRの検知が正しいかを確認したり、誤検知をなくしたりするものではありません。家の防犯、ガレージの監視、倉庫や作業部屋などに使えます。ESP32-CAMなら写真付きの通知を追加でき、通常のESP32 DevKit V1ではテキストで通知します。

0.0(0)
9
Raspberry Pi Picoのボタンのチャタリング対策:IRQとソフトウェアポーリングの比較
#159中級
プレミアム

Raspberry Pi Picoのボタンのチャタリング対策:IRQとソフトウェアポーリングの比較

ボタンを1回押しただけで、コードでは3~4回と数えられますか?原因はチャタリングです。金属接点がマイクロ秒単位で振動します!シリアルモニタで、2つのカウント方法を並べて比較します。未処理のポーリングは振動も検出して多く数え、IRQとソフトウェアによるチャタリング対策は正確に数えます。接点が振動する仕組み、ソフトウェアによる対策(ticks_diff() > 50ms)、Pin.irq()による割り込みの登録、IRQ_FALLINGトリガー、ISRハンドラー、globalとISRの安全な扱い方を学びます。IRQでLEDを切り替え、動作を目で確認できます。シリアルモニタには押すたびに両方のカウントが表示されます。

0.0(0)
12
人感センサーで動きを検出
#24初級
プレミアム

人感センサーで動きを検出

誰かが部屋に入ると知らせる、シンプルな見張り役です。人感センサーが人体から放出される熱を捉え、Arduinoは動きがある間LEDを点灯させ、動きが止まると消灯させます。玄関先で自動点灯する照明や、警報システムの基本となる仕組みです。

4.6(47)
67