ガイド · 読了まで23分

Arduinoを電池で動かす方法:9V、単3、18650とVinピン

Arduinoを電池で動かす方法を解説します。USBとDCジャック(7〜12 V)の違い、Vinピンと5Vピン、9V・単3・18650の選び方、サーボ用の別電源、電池寿命の計算まで。

Arduinoを電池で動かすことは、プロジェクトをパソコンのUSBケーブルから解放し、ロボットカーや庭のセンサー、ポケットに入れて持ち歩けるデバイスに変える第一歩です。結論から言うと、Arduino Unoを電池で動かすいちばん安全な方法は、7〜12 Vの電池パック(単3×6本、または18650を2本直列)をDCジャックかVinピンにつなぐか、USBポートにモバイルバッテリーを挿すことです。5Vピンは、測定して調整したきれいな5 Vの電源にだけ使ってください。このピンはボードのレギュレーターと保護回路を完全に迂回するからです。

初心者がぶつかる謎のトラブルの多くは、電源の問題が原因です。サーボが動くたびにリセットされるボード、数時間で切れる9V電池、数秒で電源が落ちるモバイルバッテリー、触れないほど熱くなるレギュレーターなどです。このガイドでは、Arduinoへの電源供給に使えるすべての入力、どの電池をどこにつなぐか、モーターに専用の電源が必要な理由、消費電流と稼働時間の計算方法を学びます。最後に、ESP32とRaspberry Pi Picoを電池で動かす場合の違いも見ていきます。

Arduino Uno R3の電源入力:USB、DCジャック、電源ピン
Arduino Uno R3:左側にUSB-Bポートと黒いDCジャック、下の辺に沿ってIOREF、RESET、3.3V、5V、GND、GND、Vinの各ピンが並ぶPOWERヘッダーがあります。

Arduinoに電源を供給する5つの方法

Arduino Unoの内部には2つの独立した電源経路があります。USBから来る5 Vは、500 mAの自己復帰型ヒューズ(ポリスイッチ)と小さなMOSFETスイッチを通り、そのままボードの5 Vラインに入ります。DCジャックからの電圧は、まず逆接続保護ダイオードを通り、その地点でVinピンに現れたあと、1117系のLDOレギュレーターで5 Vまで下げられます。3.3 Vは、その5 Vラインから2つ目の小さなレギュレーターで作られます。ボード上のコンパレーターがVinを監視しており、Vinが約6.6 Vを超えるとUSB側の電源を自動的に切り離します。そのため、ACアダプターとUSBを同時につないでも、電源同士がぶつかることはありません。

入力電圧保護使いどころ
USB(Bタイプ)5 V500 mAポリスイッチ机の上での開発、スマホ充電器、モバイルバッテリー
DCジャック(5.5×2.1 mm、センタープラス)推奨7〜12 V(限界6〜20 V)逆接続保護ダイオード+5 VレギュレーターACアダプター、単3×6本、2Sリチウムイオンパック
Vinピン7〜12 Vレギュレーターあり、逆接続保護なし電池ボックスのリード線、シールド
5Vピン実測4.8〜5.2 V保護まったくなし調整済みの降圧/昇圧モジュール出力、安定化された5 V電源
3.3Vピン出力専用なし50 mAまでの3.3 Vセンサー
迷ったら次のルールに従ってください。机の上ではUSB、屋外ではDCジャックに7〜12 Vの電池パック。5Vピンは、テスターで確認した安定化5 V電源にだけ使います。ピンがボードのどこにあるかはArduino Unoのピン配置を参照してください。

USB給電:500 mAの上限

USBは、Arduinoに電源を供給するいちばん簡単で、いちばん保護のしっかりした方法です。パソコンのUSB 2.0ポートが供給できるのは最大500 mAです。合計電流がそれを超えるとUnoのポリスイッチが発熱して回路を遮断し、冷えると自動で再びつながります。ボード自体の消費は約45〜50 mAなので、センサーやLED、モジュールで分け合えるのは約400 mAです。スマホ充電器やモバイルバッテリーも同じUSBポートで使えます。違いは、細くて長いケーブルだと電圧が4.6 Vまで下がることがある点だけです。USBで動かしている間は、5Vピンから取り出す電流もすべてこの500 mAの枠から出ていきます。サーボやLEDテープをUSB給電でつなぐとヒューズが働き、パソコンのポートも自分を守るために接続を切ることがあるのはこのためです。

DCジャックとVinピン:なぜ7〜12 Vなのか?

ボードの5 VレギュレーターはリニアのLDOで、正しく動くには入力に出力より1〜1.2 V高い電圧が必要です。そこにジャックの保護ダイオードによる0.7〜1 Vの電圧降下が加わるので、安定した5 Vを得るにはジャックに少なくとも7 Vが必要です。6 Vの電源だと5 Vラインは4.2〜4.5 Vまで下がります。ボードは動いているように見えても、アナログ値がずれたり、モジュールがおかしな動きをしたりします。上限側の問題は熱です。リニアレギュレーターは余分な電圧を熱に変えます。消費する電力はP = (Vin − 5 V) × Iです。目安として、レギュレーターに1 Wを超える熱を出させないでください。そのあたりで小さなSOT-223パッケージは触れないほど熱くなり、最終的には自分で停止します。

Vinの電圧100 mA時の発熱300 mA時の発熱評価
7 V0.2 W0.6 Wいちばん効率のよい範囲
9 V0.4 W1.2 W300 mAでは限界ぎりぎり
12 V0.7 W2.1 W軽い負荷のみ
20 V1.5 W4.5 W非推奨、レギュレーターが過熱する

Vinピンは入力でもあり、出力でもあります。ジャックからボードに給電しているとき、Vinにはジャックの電圧から約0.7〜1 Vを引いた電圧が出ているので、小さな9〜12 Vの負荷ならここから給電できます。ただし電流の経路には1 Aの保護ダイオードがあるので、モーターのような大きな負荷はVinからではなく、電源から直接給電してください。電池ボックスをVinピンにつなぐと、この保護ダイオードは迂回されます。レギュレーターは働きますが、プラスとマイナスを逆につなぐとボードを守るものは何もありません。新しいUno R4 MinimaとR4 WiFiでは、ジャックとVinが6〜24 Vに対応し、リニアレギュレーターの代わりにスイッチング(降圧)コンバーターを使っているので、12 Vでも過熱しません。詳しくはArduino Uno R4を参照してください。

逆接続は、Arduinoを壊すいちばん手っ取り早い方法です。DCジャックのプラグはセンタープラス(+)でなければなりません。古いACアダプターには逆のものもあります。電池ボックスをVinピンとGNDピンにつなぐ前に、線の色を信じず、テスターで極性を確認してください。ボードが壊れたかもしれないと思ったら、Arduinoが壊れたか確かめる方法のチェックを試してください。

5Vピン:レギュレーターを迂回しても安全なのはいつ?

5Vピンは、ATmega328Pやボード上のほかのチップの電源ラインに直接つながっています。このピンから給電すると、レギュレーター、逆接続保護ダイオード、USBヒューズをすべて飛ばすことになります。そのため、Arduino自身のドキュメントも5Vピンや3.3Vピンからの給電を推奨していません。とはいえ、正しく行えば利点もあります。レギュレーターでの電圧降下も熱損失もないので、電池が長持ちし、モジュールにより多くの電流を回せます。条件はひとつだけで、電源が安定化され、測定済みであることです。ATmega328Pは5.5 Vまでで動くよう設計されており、6 Vが絶対最大定格です。それを一瞬でも超えると、チップが永久に壊れることがあります。

  • まず測る:Arduinoにつなぐ前に、電源の出力をテスターで確認してください。4.8〜5.2 Vの間にあるべきです。
  • 電池を直接つながない:新品の単3アルカリ電池4本は6.4 Vに達し、上限を超えます。5Vピンにつなぐのは、レギュレーター、降圧モジュール、昇圧モジュールの出力だけにしてください。
  • USBとの同時接続に注意:5Vピンから給電している状態でUSBを挿すと、2つの5 V電源がボードを通してつながってしまいます。書き込みの間は外部電源を外しておくのがいちばん安全です。
  • コンデンサを入れる:ボードの近くで外部5 Vラインに100〜470 µFの電解コンデンサを入れると、急に電流が流れたときの電圧の落ち込みがならされます(コンデンサとは?)。
  • 市販の選択肢:7805を使ったレギュレーターモジュール(7805レギュレーター)、5.0 Vに合わせたLM2596、ブレッドボード用のMB102電源モジュールは、どれもきれいな5 Vを出してくれます。
可変式の降圧/昇圧モジュールは、5 Vではなく適当な電圧(ときには12 V以上)に設定された状態で届くことがよくあります。まず電池をモジュールの入力につなぎ、出力でテスターが5.0 Vを示すまで青い半固定抵抗を回し、そのあとで初めてArduinoの5Vピンにつないでください。

3.3Vピン:どれくらい電流を取り出せる?

Unoの3.3Vピンは電源入力ではなく、小さなレギュレーターの出力で、公式の上限は50 mAです。BME280、MPU6050、RC522 RFIDリーダーのように数十ミリアンペアに収まるモジュールならこれで足ります。しかしピーク電流の大きいモジュールには荷が重すぎます。アンテナ付きのnRF24L01+PA+LNAは送信中に100 mAを超え、ESP-01 Wi-Fiモジュールは数百ミリアンペアのピークを引き、SIM800Lは最大2 Aの瞬間的な電流を必要とします。nRF24L01+PA+LNAとESP-01には、5 Vラインから給電する別のAMS1117 3.3 Vレギュレーターモジュールを使ってください。一方、SIM800Lは3.3 Vではなく3.4〜4.4 Vで動き、AMS1117の1 Aの上限も超えます。リチウムイオン電池1本か、4.0 Vに合わせた少なくとも2 Aを出せる降圧モジュールから給電してください。Arduino Nanoとその互換品では、3.3VピンがUSBシリアル変換チップの内部から供給されていることが多く、Unoよりさらに弱いので、こちらでも別のレギュレーターを使うほうが安全です。無線モジュールの電源についてはnRF24L01ガイドに詳しくまとめています。

AMS1117 3.3 Vレギュレーターモジュール
AMS1117 3.3 Vレギュレーターモジュール:VINに5 Vを入れてVOUTから3.3 Vを取り出します。ESP-01やnRF24L01のように電流を多く使うモジュールを、Arduinoの3.3Vピンに負担をかけずに動かせます。

電池の選択肢:9V、単3、18650、モバイルバッテリー

電池電圧容量接続先Unoでの稼働時間(約50 mA)
9Vアルカリ電池(006P)9 V(負荷をかけるとすぐ7 Vまで下がる)400〜600 mAhDCジャック/Vin6〜8時間
単3アルカリ電池×6本9 V2000〜2500 mAhDCジャック/Vin約30時間
単3アルカリ電池×4本6 V(新品時6.4 V)2000〜2500 mAh非推奨ジャックには低すぎ、5Vピンには高すぎる
単3アルカリ電池×3本4.5 V2000〜2500 mAh5Vピン約1日(終盤は不安定)
18650×1本+5 V昇圧3.0〜4.2 V → 5 V2000〜3500 mAhUSBまたは5Vピン約30時間(3000 mAh)
18650×2本直列(2S)7.4 V(6.0〜8.4 V)2000〜3500 mAhDCジャック/Vin約2日(3000 mAh)
10000 mAhのモバイルバッテリー5 V(USB)約6000 mAh(5 V換算)USB約5日(電源が切れなければ)

昔ながらの9V電池(006P)は、DCプラグ付きのスナップ端子でつなげるので最もよく勧められますが、効率はいちばん悪い選択肢でもあります。中に小さなセルが6個入っているため、容量は約400〜600 mAhしかなく、内部抵抗も高めです。Unoの50 mAにサーボやLEDをいくつか加えると、電圧はすぐに7 Vを下回り、ボードがリセットを繰り返すようになります。リニアレギュレーターのボードでは、電池のmAhがそのまま稼働時間を決め、余分な電圧は熱になるだけです。そのため、同じ9 Vを出す単3×6本の電池ボックスは、9V電池の約4倍長持ちします。容量の単位についてはmAhとは?で詳しく説明しています。

単3電池は安くてどこでも手に入りますが、本数を正しく選ぶ必要があります。いちばん多い間違いは単3×4本を使うことです。6 Vではジャックには足りません。ダイオードとレギュレーターでの電圧降下のあと、5 Vラインに届くのは約4.2 Vだけだからです。一方、同じ電池パックを5Vピンにつなぐと新品で6.4 Vになり、上限を超えてしまいます。正しい組み合わせは、DCジャックに単3×6本(9 V)のパック、5Vピンに直接単3×3本(4.5 V)のパックです。単3×3本で16 MHzで動くUnoは、1本あたりの電圧が1.25 Vを下回ると不安定になり始めるので、容量を使い切ることはできません。充電式のニッケル水素電池(NiMH)は1本1.2 Vなので、NiMH×4本(4.8 V)も5Vピン用として人気ですが、充電したばかりの電池は最初の数分間5.5 Vを超えることがあります。

リード線付きの単3電池ボックス
単3電池ボックスには1本用、2本用、3本用、4本用、6本用があります。Arduino UnoのDCジャックには6本用、5Vピンには3本用が適しています。赤い線がプラス、黒い線がマイナスです。

18650リチウムイオン電池と昇圧コンバーター

18650は直径18 mm、長さ65 mmの充電式リチウムイオン電池で、ノートパソコンのバッテリーやモバイルバッテリーに使われています。公称電圧は3.7 Vで、満充電で4.2 V、空になると約3.0 Vになります。実際の容量は2000〜3500 mAhで、6800 mAhや9900 mAhと表示された電池はほぼ間違いなく偽物です。18650を1本でArduinoに使う方法は2つあります。昇圧コンバーター(MT3608モジュールや市販の18650モバイルバッテリー基板など)で3.7 Vを5 Vに上げてUSBか5Vピンに給電する方法と、2本を直列にして2S(7.4 V)のパックをDCジャックに挿す方法です。Unoには後者がいちばんバランスのよい選択肢です。8.4 Vから始まり、1本あたり3.5 V(合計7 V)に下がるまで、電圧はレギュレーターにとって余裕のある範囲に収まります。昇圧コンバーターを使う場合は、電池から流れる電流が出力側より大きくなることを覚えておいてください。5 Vで200 mAが必要な回路は、効率88パーセントなら3.7 Vの電池から約307 mAを引きます。

18650充電式リチウムイオン電池
18650リチウムイオン電池:公称3.7 V、満充電で4.2 V。Arduinoのプロジェクトでは、1本を昇圧コンバーターと組み合わせるか、2本を直列(2S、7.4 V)にしてDCジャックから使います。
  • 保護は必須:リチウムイオン電池を3.0 V未満まで放電すると寿命が縮み、危険なこともあります。保護回路付きの電池か、保護基板(BMS)を使ってください。
  • TP4056は1セル専用:TP4056モジュールが4.2 Vまで充電できるのは1本(1S)だけです。2S直列のパックを絶対にTP4056で充電しないでください。2S用のBMS充電回路かバランス充電器を使います。配線の詳細はTP4056充電モジュールにあります。
  • ショートに注意:18650はショートすると数十アンペアを流せます。むき出しの線を残さず、電池のラインにはヒューズとスイッチを入れてください。
  • 昇圧の設定:MT3608のような可変式モジュールは、出力を5.0 Vに合わせる前にArduinoにつながないでください。
  • 電池を混ぜない:直列パックには、同じメーカー、同じ容量、同じ充電状態の電池を使ってください。
保護回路付きTP4056リチウムイオン充電モジュール(USB-C)
保護回路付きTP4056モジュール:18650電池はB+とB−に、昇圧コンバーターや負荷はOUT+とOUT−につなぎます。USB-C入力から電池を4.2 Vまで充電します。

モバイルバッテリーが勝手に切れるのはなぜ?

モバイルバッテリーは、リチウム電池、充電回路、保護回路、5 V昇圧回路が入った完成品のパックなので、Arduinoを電池で動かすいちばん手間のかからない方法です。USBケーブルを挿すだけです。ただし多くのモバイルバッテリーは、スマホの充電が終わったら止まれるように出力電流を監視していて、電流が50〜100 mAを下回ると10〜60秒以内に出力を切ります。20 mAのNanoや50 mAのUnoはこのしきい値を下回るので、ボードはしばらく動いたあと、静かに止まってしまいます。対策は2つあります。低電流モードのあるモバイルバッテリーを選ぶか(ボタンを2回押すと有効になる機種もあります)、Arduinoに一定間隔で短い負荷をかけさせることです。後者の方法では、5 Vラインから47 Ω、1 Wの抵抗をNPNトランジスタ(BC337または2N2222)のコレクタにつなぎ、エミッタをGNDに、ベースを1 kΩの抵抗を通してD7ピンにつなぎます。トランジスタがオンになると、抵抗に約5 V / 47 Ω ≈ 106 mAが流れ、モバイルバッテリーは負荷があると判断します。値はオームの法則計算ツールで自分で確かめられます。

C++ (Arduino IDE)
1// Powerbank uyanık tutma / powerbank keep-alive
2// D7 -> 1 kΩ -> NPN beyzi, kolektör -> 47 Ω -> 5V / D7 -> 1 kΩ -> NPN base, collector -> 47 Ω -> 5V
3const int LOAD_PIN = 7;
4const unsigned long PERIOD_MS = 8000;  // her 8 saniyede bir / every 8 seconds
5const unsigned long PULSE_MS = 300;    // 300 ms yük / 300 ms of load
6
7unsigned long pulseStart = 0;
8bool loadOn = false;
9
10void setup() {
11  pinMode(LOAD_PIN, OUTPUT);
12  digitalWrite(LOAD_PIN, LOW);
13}
14
15void loop() {
16  unsigned long now = millis();
17  if (!loadOn && now - pulseStart >= PERIOD_MS) {
18    digitalWrite(LOAD_PIN, HIGH);   // ~106 mA çek / draw ~106 mA
19    loadOn = true;
20    pulseStart = now;
21  }
22  if (loadOn && now - pulseStart >= PULSE_MS) {
23    digitalWrite(LOAD_PIN, LOW);    // yükü kapat / switch the load off
24    loadOn = false;
25  }
26  // projenin kodu burada, delay() kullanmadan / your project code here, without delay()
27}

コードはdelay()ではなくmillis()を使っているので、プロジェクトのほかの処理を止めません。この方法はmillis()とdelay()の違いで詳しく説明しています。8秒ごとに300 msだけ106 mAを流しても、平均では約4 mA増えるだけです。それでもモバイルバッテリーが切れる場合は、周期を5秒に縮めるか、パルスを500 msに延ばしてください。しきい値とタイムアウトは機種ごとに違います。

モーターとサーボは別電源、GNDは共通

Arduinoを電池で動かすとき、いちばんトラブルを起こしやすい負荷がモーターとサーボです。サーボは動き始めた瞬間に数百ミリアンペアの突入電流を引き、DCモーターは起動時や拘束(ロック)時に通常の数倍の電流を引きます。この電流のピークで5 Vラインが一瞬落ち込むことがあり、電圧が十分に下がるとATmega328Pのブラウンアウト検出が働いて、ボードが勝手にリセットされます。さらに、モーターのブラシから出るノイズがセンサーの値を乱します。ルールは簡単です。Arduinoの5Vピンから給電するのは小さなサーボ1個までにして、それ以外のモーターはすべて別の電源で動かしてください。サーボとDCモーターのしくみはサーボモーターとL298NでDCモーターを制御する方法を参照してください。

負荷通常の電流ピーク電流推奨電源
SG90マイクロサーボ100〜250 mA0.5 A以上(拘束時)1個ならArduinoの5V、それ以上は別の5 V
MG996Rサーボ0.5〜0.9 A最大2.5 A別の5〜6 V、サーボ1個につき2〜3 A以上
TTギア付きDCモーター70〜250 mA約1 A(起動時、拘束時)L298NまたはL9110S+別の6〜9 Vパック
28BYJ-48ステッピングモーター約240 mA約240 mAULN2003基板に別の5 V
WS2812B LED(1個あたり)約20 mA(中程度の明るさ)60 mA(白で最大輝度)30個を超えたら別の5 V
小型水中ポンプ100〜200 mA起動時は数倍リレーまたはMOSFET+別電源
  1. モーター用に別の電源を選びます。サーボには5〜6 V(ニッケル水素の単3×4本か、5〜6 Vに合わせたLM2596)、DCモーターにはモーターの電圧に合ったパック(たとえば2Sの18650)です。
  2. 電源のプラスは、サーボの赤い線かモータードライバの電源入力だけにつなぎます。Arduinoの5Vピンにはつながないでください。
  3. Arduinoには専用の入力から給電します。モーターの電流がArduinoのレギュレーターを通らなければ、同じ2SパックをDCジャックにつないでもかまいません。
  4. 電源のマイナス(GND)をArduinoのGNDピンにつなぎます。GNDが共通になっていないと、制御信号が働きません。
  5. サーボのオレンジまたは黄色の信号線を、Arduinoのデジタルピンのどれか(たとえばD9)につなぎます。ServoライブラリはPWMマークのないピンでも動きます。
  6. サーボの電源の両端、サーボの近くに470〜1000 µFの電解コンデンサを入れます。極性に注意してください。
  7. L298Nを使う場合は、モーター電源を12V端子に入れます。電源が12 Vを超える場合は5V-ENジャンパーを外し、Arduinoは専用の電源から動かしてください。
LM2596降圧型(バック)レギュレーターモジュール
LM2596降圧モジュール:2Sリチウムイオンパックや12 VのACアダプターのような高めの電圧を、半固定抵抗で設定した5〜6 Vまで、熱くならずに効率よく下げます。サーボやLEDテープ用に別の電源ラインを作るいちばん手軽な方法です。
GNDを共通にする理由はこうです。電圧は必ず2点の間で測られます。Arduinoの信号ピンが5 Vを出すとき、それはArduinoのGNDから見た5 Vですが、サーボは自分の電源のGNDを基準に測ります。2つのGNDがつながっていないと、サーボには信号が意味のない電圧に見え、ガタついたりまったく動かなかったりします。詳しくはGNDとは?を、別の5〜6 Vラインの作り方はLM2596の調整ガイドを参照してください。

電流と稼働時間はどう計算する?

電池で動くプロジェクトで本当に知りたいのは「どれくらい持つか」です。基本の式は簡単で、稼働時間(時間)=電池容量(mAh)× 0.85 ÷ 平均電流(mA)です。0.85という係数は、電池が定格容量を丸ごと出しきることはないという事実を反映しています。大電流や低温では容量が減り、電池が完全に空になる前に回路が止まり、コンバーターでも損失が出るからです。9V電池のように早めに電圧が落ちる電池では、0.7を使うほうが現実的です。プロジェクトがほとんどの時間スリープしているなら、まず平均電流を求めます。平均電流=(動作時の電流×動作時間+スリープ時の電流×スリープ時間)÷ 合計時間です。手で計算する代わりに電池寿命計算ツールを使えます。容量、動作時とスリープ時の電流、起動間隔を入力すると、稼働時間を時間、日、月で出してくれます。

シナリオ平均電流電池稼働時間の目安
Uno+I2C LCD、常時動作約75 mA2Sの18650(3000 mAh)約34時間
Nano+センサー+モバイルバッテリーの自動オフ防止約29 mA(25+4)10000 mAhのモバイルバッテリー(約6000 mAh、5 V)約7日
ESP32モジュール:10分ごとに5秒起動(120 mA)、スリープ時150 µA約1.15 mA18650(3000 mAh)約3か月
同じコード、スリープ時に5 mAを消費する開発ボード約6 mA18650(3000 mAh)約18日
Pico+MicroPython、常時動作約25 mAニッケル水素の単3×3本(2000 mAh)約68時間

推測するより、測るほうが確実です。テスターを電流(mA)レンジに切り替え、電池と回路の間に直列につなぐと、実際の消費電流がわかります。やり方はテスターの使い方で紹介しています。予想より大きな値が出たら、まずボード自体の消費を疑ってください。Unoでは、ATmega328Pがスリープしている間も、USBシリアル変換チップ(ATmega16U2)、電源LED、レギュレーターで30 mA以上を消費します。そのため、電池を長持ちさせたいプロジェクトでは、Arduino Pro MiniのようなUSBチップのないボードが好まれます。電源LEDとレギュレーターを外したPro Miniなら、スリープモードでマイクロアンペア単位まで下がります。

ステップごとに:プロジェクトを電池で動かす

  1. プロジェクトをUSBで動かしている間に、テスターで平均電流とピーク電流を測ります。サーボやモーターが動いているときの電流も測ってください。
  2. モーター、サーボ、LEDテープのような大電流の負荷を切り分け、それらには別の電源を計画します。
  3. ボードの入力を選びます。Unoなら、DCジャックに7〜12 Vのパック、またはUSBか5Vピンに安定化した5 V。Picoなら、VSYSに1.8〜5.5 Vです。
  4. 必要な稼働時間に合わせて容量を計算するか、電池寿命計算ツールを使います。
  5. 電池のプラス側のラインに電源スイッチを入れます。リチウムイオンのパックには保護基板(BMS)があることを確認してください。
  6. USBでコードを書き込んだらUSBを抜き、電池でテストします。サーボが動いている間に、5Vピンの電圧をテスターで確認してください。
  7. コードで電池の電圧を監視し、決めた値を下回ったら警告を出します(コードは下にあります)。

Arduinoで電池の電圧を測る

電池がいつ切れるかを推測する代わりに、電圧を測ることができます。Arduinoのアナログ入力が読めるのは最大5 Vなので、8.4 Vまで上がる2SパックをA0に直接つなぐことはできません。分圧回路が必要です。100 kΩと10 kΩの2本の抵抗で電圧は11分の1になり、8.4 VはA0で約0.76 Vになります。電池が弱るにつれてボードの5 Vラインもずれることがあるので、電源電圧に左右されない内部の1.1 V基準電圧を使って測るほうが正確です。自分のパックに合う抵抗値は分圧計算ツールで選べます。詳しくは分圧回路を読んでください。

C++ (Arduino IDE)
1// 2S Li-ion paket gerilimini ölçme / measuring a 2S Li-ion pack voltage
2// Pil+ -> 100k -> A0 -> 10k -> GND / pack+ -> 100k -> A0 -> 10k -> GND
3const int BAT_PIN = A0;
4const int LED_PIN = 13;      // pil zayıf uyarısı / low-battery warning
5const float R1 = 100000.0;   // üst direnç / top resistor
6const float R2 = 10000.0;    // alt direnç / bottom resistor
7const float VREF = 1.1;      // dahili referans, multimetreyle düzelt / internal reference, calibrate with a multimeter
8const float LOW_V = 6.6;     // 2S için alt sınır (3,3 V/hücre) / low limit for 2S (3.3 V per cell)
9
10void setup() {
11  Serial.begin(9600);
12  pinMode(LED_PIN, OUTPUT);
13  analogReference(INTERNAL);   // 1,1 V referans (Uno/Nano) / 1.1 V reference (Uno/Nano)
14  analogRead(BAT_PIN);         // ilk ölçümü at / discard the first reading
15  delay(10);
16}
17
18void loop() {
19  long sum = 0;
20  for (int i = 0; i < 16; i++) {   // 16 ölçümün ortalaması / average of 16 readings
21    sum += analogRead(BAT_PIN);
22    delay(2);
23  }
24  float pinV = (sum / 16.0) * VREF / 1024.0;
25  float batV = pinV * (R1 + R2) / R2;
26
27  Serial.print("Pil / Battery: ");
28  Serial.print(batV, 2);
29  Serial.println(" V");
30
31  digitalWrite(LED_PIN, batV < LOW_V ? HIGH : LOW);   // zayıfsa LED yanar / LED on when low
32  delay(2000);
33}

分圧回路の上側は、電源スイッチより後ろで電池のプラスにつないでください。こうすると、デバイスの電源が切れている間に分圧回路が電池を消耗させません。内部の1.1 V基準電圧はチップごとに約±10%ばらつきます。テスターで測った電池の電圧とシリアルモニタの値を比べて、VREFを補正してください(たとえば1.08に)。分圧回路は常に約76 µAを流しますが、電池寿命への影響は実質的にありません。このコードはUnoとNano用です。Megaでは基準電圧の名前がINTERNAL1V1になります。6.6 Vのしきい値は1本あたり3.3 Vに相当し、この時点で電池はほぼ空です。1本あたり3.0 Vを下回ると電池が傷みます。パックをDCジャックにつないでいる場合は、7 Vあたりで5 Vラインが下がり始めるので、LOW_Vを7.0にするのも理にかなっています。

ESP32を電池で動かす

ESP32の開発ボードは3.3 Vで動き、電源の取り方は3通りあります。USBポート、5Vピン(ボードによってはVIN)、または3V3ピンから直接です。Espressifは、これらを同時に使ってはならず、どれか1つだけを選ぶようにと明記しています。5Vピンに加えた電圧はボードの3.3 V LDOレギュレーター(ほとんどの互換品ではAMS1117)を通りますが、3V3ピンが受け付けるのは安定化された3.0〜3.6 Vだけです。Wi-Fiで送信するときESP32は最大240 mAのピーク電流を引くので、少なくとも500 mAを出せる電源が必要です。そうでないと「Brownout detector was triggered」(ブラウンアウト検出が作動した)というエラーでリセットされます(詳しくはブラウンアウトエラー)。18650を1本、3V3ピンに直接つながないでください。満充電で4.2 Vあるので上限を超えます。5Vピンも向いていません。AMS1117には約1.1 Vの電圧降下が必要なので、電池の電圧が下がるにつれて出力が3.3 Vを下回ってしまいます。正しい選択肢は、18650を5 Vに昇圧して5Vピンに入れるか、少なくとも500 mAを出せる低ドロップアウトの3.3 Vレギュレーターを使うか、リチウムイオン充電回路を内蔵したESP32ボードを使うことです。ただし、電池寿命を本当に左右するのは、ESP32がほとんどの時間をディープスリープで過ごすかどうかです。このモードでチップ自体の消費は約10 µAですが、開発ボード上のUSBシリアル変換チップ、LED、レギュレーターのせいでミリアンペア単位に跳ね上がることがあります。上の表の3か月と18日の差はここから生まれています。詳しくはESP32のディープスリープを参照してください。

C++ (Arduino IDE)
1// ESP32: 18650 gerilimini ölç, sonra derin uykuya geç / measure the 18650, then deep sleep
2// Pil+ -> 100k -> GPIO34 -> 100k -> GND / cell+ -> 100k -> GPIO34 -> 100k -> GND
3const int BAT_PIN = 34;                         // yalnız giriş, ADC1 / input-only, ADC1
4const uint64_t SLEEP_US = 60ULL * 1000000ULL;   // 60 saniye / 60 seconds
5
6void setup() {
7  Serial.begin(115200);
8  uint32_t mv = 0;
9  for (int i = 0; i < 16; i++) {
10    mv += analogReadMilliVolts(BAT_PIN);        // kalibre milivolt / calibrated millivolts
11  }
12  float batV = (mv / 16.0) * 2.0 / 1000.0;      // bölücü yarıya indirir / the divider halves it
13  Serial.printf("Pil / Battery: %.2f V\n", batV);
14
15  if (batV < 3.3) {
16    Serial.println("Pil zayif / Battery low");  // işi atla, pili koru / skip the work, protect the cell
17  } else {
18    // sensörü oku, Wi-Fi ile gönder / read the sensor, send over Wi-Fi
19  }
20
21  esp_sleep_enable_timer_wakeup(SLEEP_US);      // 60 sn sonra uyan / wake up after 60 s
22  Serial.flush();
23  esp_deep_sleep_start();                       // loop() hiç çalışmaz / loop() never runs
24}
25
26void loop() {
27}

コードは起動するたびに電池の電圧を測り、処理をして、60秒のタイマーでまたスリープに戻ります。ディープスリープから起きたESP32はプログラムを最初から実行し直すので、loop()は一度も実行されません。GPIO 34は入力専用のADC1ピンで、Wi-Fiがオンでも使えますが、ADC2のピンはWi-Fiと同時には使えません。analogReadMilliVolts()はチップの工場出荷時キャリブレーションを使って、ミリボルトの値を直接返します。100 kΩ+100 kΩの分圧回路は4.2 Vを2.1 Vに下げ、流れる電流はわずか21 µAです。値がばらつく場合は、GPIO 34とGNDの間に100 nFのコンデンサを入れてください。ESP32を始めるなら、ESP32とは?から読むのがおすすめです。

Raspberry Pi Picoを電池で動かす

Raspberry Pi Picoは、電池で動かしやすいボードのひとつです。リニアレギュレーターではなく、昇降圧(バックブースト)型のスイッチングレギュレーターを積んでいるからです。VSYSピンに1.8〜5.5 Vの範囲の電圧を入れれば、ボードがそれを効率よく3.3 Vに変換し、入力が3.3 Vを下回っても動き続けます。つまり、単3電池2本か3本、18650を1本、1セルのLiPoのどれでも、追加のモジュールなしでVSYSとGNDの間に直接つなげます。注意が必要なのはUSBとの併用だけです。USBの5 V(VBUS)はショットキーダイオードを通してVSYSにつながっているので、電池をVSYSに直接つないだ状態でUSBを挿すと、USBが電池に電流を流し込もうとします。Raspberry Piが推奨する対策は、電池を専用のショットキーダイオード(たとえば1N5817)を通してVSYSにつなぐことです。3V3ピンから外部回路に供給できるのは最大約300 mAで、3V3_ENピンをGNDに落とすとレギュレーターが止まり、ボード全体の電源が切れます。ボードの全体像はRaspberry Pi Picoとは?を参照してください。

MicroPython
1from machine import ADC, Pin
2import time
3
4vsys = ADC(29)            # VSYS/3 ölçer (Pico) / measures VSYS/3 (Pico)
5usb = Pin(24, Pin.IN)     # USB takılıysa 1 / 1 when USB is connected
6CONV = 3.3 / 65535        # ham değeri volta çevir / raw value to volts
7
8while True:
9    total = 0
10    for _ in range(16):   # 16 ölçümün ortalaması / average of 16 readings
11        total += vsys.read_u16()
12    volts = total / 16 * CONV * 3   # kart içindeki bölücü 3'e böler / on-board divider divides by 3
13    source = "USB" if usb.value() else "Pil / Battery"
14    print("{}: VSYS = {:.2f} V".format(source, volts))
15    if not usb.value() and volts < 3.3:   # 3xAA ya da 18650 için alt sınır / low limit for 3xAA or a 18650
16        print("Pil zayif! / Battery low!")
17    time.sleep(5)

Picoでは、GP29がボード上の分圧回路を通してVSYSの3分の1を測り、GP24はUSBがつながっているときに1を返します。つまり部品を追加しなくても、電池の電圧と、ボードがUSBと電池のどちらで動いているかの両方がわかります。推奨どおりショットキーダイオードを通して電池をつないだ場合、VSYSの値は電池の電圧より約0.2〜0.3 V低くなります。この読み取りはADCの基準電圧が3.3 Vであることを前提にしていますが、昇降圧レギュレーターのおかげで、電池が弱ってもこの基準電圧は安定しています。Pico WではGP29とGP24が無線チップと共用されているので、このコードはそのままでは動きません。そちらではPin("WL_GPIO2")でUSBの状態を読みます。電池を長持ちさせるには、測定の合間にtime.sleep()ではなくmachine.lightsleep()を使ってください。

電池で動くプロジェクトのアイデア

  • Bluetoothで操作するロボットカー:モーターとArduinoの両方を2Sの18650パックで動かします。詳しくはArduinoで車を作る方法へ。
  • 障害物を避けるロボット:モーターはL298Nを通して別のラインで、ArduinoはDCジャックから給電して、リセットを防ぎます(障害物を避けるロボット)。
  • 電池残量表示付きの電圧計:分圧回路で測った値をLCDに表示します(Arduinoで電圧計を作る方法)。
  • 庭の水分ステーション:ESP32をディープスリープさせて1時間に1回土壌水分を測り、18650を1本で数か月動かします。
  • 持ち運べるGPSロガー:NEO-6M GPSとモバイルバッテリーで、ハイキングのルートを記録します。
  • 電池で動くPicoのナイトライト:単3電池3本からVSYSに給電したPicoが、部屋が暗くなるとLEDを点けます。

よくある間違いと直し方

症状考えられる原因対策
サーボが動くとボードがリセットされるサーボの電流で5 Vラインが落ち込むサーボを別電源にし、GNDを共通にして470〜1000 µFのコンデンサを入れる
9V電池が数時間で切れる9V電池の容量は400〜600 mAhしかない単3×6本か2Sの18650パックを使う
モバイルバッテリーが10〜60秒で切れる電流が自動オフのしきい値を下回っている低電流モードか、自動オフ防止のパルス
レギュレーターがとても熱くなる入力電圧が高く、電流も大きい入力を7〜9 Vに下げるか、降圧モジュールで5 Vを作る
電池で動かすとアナログ値がずれる入力が7 V未満で、5 Vラインが下がっているパックの電圧を上げるか、内部の1.1 V基準電圧を使う
ボードが熱くなる、または電源が入らない逆接続、または5Vピンに5.5 Vを超える電圧電源を外し、テスターで極性と電圧を確認する
Wi-Fiに接続するときにESP32がリセットされる電源がピーク電流を出しきれない(ブラウンアウト)短く太い配線、470 µFのコンデンサ、より強力な電源
PicoでUSBを挿すと電池が温かくなるUSBがVSYSを通して電池に電流を流し込んでいる電池のラインにショットキーダイオードを入れる
リチウム電池で常設のプロジェクトを作るなら、電池のラインにヒューズ(たとえば2 A)とスイッチを入れ、電池は密閉されていても通気のあるケースに入れ、充電中は決してプロジェクトから目を離さないでください。膨らんだ電池、へこんだ電池、熱を持った電池はすぐに使用をやめてください。

プロジェクトを安定して動かせるかどうかは、半分は電源で決まります。正しい入力を選び、モーターは別電源にし、GNDを共通にして、電池寿命は最初から計算しておきましょう。電池で動くプロジェクトを作る準備ができたら、BlueGraysアプリのBluetoothで操作するL298Nカー、障害物を避けるロボット、スマート水やりステーション、LCD付きデジタル電圧計、ESP32ディープスリープの省電力プロジェクトをチェックしてみてください。どれも回路図、配線、コードをステップごとに案内します。

よくある質問

Arduinoは9V電池で動きますか?

はい、9V電池はArduino UnoのDCジャックかVinピンにつなげます。ボードは7〜12 Vの範囲なら問題なく動きます。ただし9Vアルカリ電池の容量は400〜600 mAhしかないので、Unoだけでも約6〜8時間、サーボやモーターを加えるとずっと短くなります。長時間動かすプロジェクトには、単3×6本か、18650を2本直列にするほうが適しています。

Arduinoはモバイルバッテリーで動かせますか?

はい。USBケーブルでモバイルバッテリーをArduinoのUSBポートにつなぐだけで、ボードはUSBヒューズで保護されます。注意点は、多くのモバイルバッテリーが50〜100 mA未満の負荷を検出できず、しばらくすると出力を切ってしまうことです。低電流モードのある機種を選ぶか、数秒ごとにArduinoに短い負荷をかけさせる自動オフ防止回路を追加してください。

Arduinoは12VのACアダプターで動かせますか?

はい。12 VはUnoの推奨範囲7〜12 Vの上限で、DCジャックからなら安全です。ただしボード上のリニアレギュレーターは余分な6〜7 Vを熱に変えるので、5 Vラインから約150 mAを超える電流を取り出すと過熱します。もっと電流が必要なら、9 VのACアダプターを使うか、別の降圧モジュールで5 Vを作ってください。Uno R4なら24 Vまで問題なく動きます。

Arduinoは5Vピンから給電できますか?

できますが、5Vピンはボードのレギュレーター、逆接続保護ダイオード、USBヒューズを迂回するので、保護はまったくありません。テスターで測って4.8〜5.2 Vの間に収まっていることを確認した、安定化された電源だけをつないでください(たとえば5.0 Vに合わせたLM2596や昇圧モジュール)。5.5 Vを超える電源や逆向きにつないだ電源は、ATmega328Pを一瞬で壊すことがあります。

Arduinoは3.7Vのリチウムイオン電池で動きますか?

Unoは3.7 Vを直接つないでも安定して動きません。DCジャックには低すぎ、5Vピンにも足りません。1本の電池を昇圧コンバーターで5 Vに上げてUSBか5Vピンに入れるか、2本を直列にして7.4 VのパックをDCジャックに挿す必要があります。一方、3.3 VのPro Mini(RAWピン)やRaspberry Pi Pico(VSYS)は1本の電池から直接問題なく動き、ESP32も低ドロップアウトの3.3 Vレギュレーターがあれば動きます。

Arduinoは電池でどれくらい動きますか?

稼働時間は、容量を平均電流で割ると求められます。容量(mAh)× 0.85 ÷ 平均電流(mA)です。たとえば50 mAを消費するUnoは、3000 mAhの2S 18650パックで約50時間動きます。ディープスリープを使うESP32なら、同じ容量で数か月持つこともあります。BlueGraysの電池寿命計算ツールは、スリープ時の電流も計算に入れてくれます。

全プロジェクトを見る
LCDディスプレイ付きデジタル電圧計
#56中級
プレミアム

LCDディスプレイ付きデジタル電圧計

自作の測定器で、電池や電源アダプターが出力する電圧を調べます。2つの抵抗で作る分圧回路が、高い電圧をボードで読み取れるレベルまで下げます。Arduinoが元の電圧を計算し、2行のLCDディスプレイにボルト単位で表示します。この回路では約55ボルトまでの直流電圧を測定できます。コンセントの商用電源には絶対に接続しないでください。

4.5(27)
36
サーボモーターの使い方
#35初級
プレミアム

サーボモーターの使い方

小型サーボモーターのアームが、一方の端、中央、もう一方の端の3つの位置へ順番に回り、それぞれの位置で2秒間止まります。Arduinoが保持する角度をモーターに指示すると、モーターはその位置まで動いて止まります。ロボットアームや自動開閉するふたが動く仕組みを学べます。

4.7(48)
67
L298Nで作るBluetooth操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

スマートフォンをリモコンにして、自作のロボットカーを操作できます。ArduinoはBluetoothモジュールを通じてスマートフォンのリモコンアプリから指令を受け取り、モータードライバーで車輪を回します。前進、後退、左右や斜めへの移動ができ、速度もスマートフォンから調整できます。停止ボタンを押すと、短いブレーキ動作でモーターがすぐに止まります。

5.0(38)
65
障害物回避ロボット
#81上級
プレミアム

障害物回避ロボット

自分で進む道を見つける、賢い車を作ってみませんか?障害物回避ロボットは、前面の超音波センサーで周囲を常に調べます。障害物を見つけると停止し、サーボモーターで左右を確認して、最も障害物の少ない方向を選んで進みます。自動運転の基礎を学ぶのにぴったりの入門プロジェクトです。

5.0(38)
49
スマート水やりステーション
#83上級
プレミアム

スマート水やりステーション

旅行中も植物が枯れないよう、自動で水やりをするシステムです。土壌水分センサーで土の湿り具合を測定し、乾燥するとArduinoが給水ポンプを数秒間動かして、青いライトを点灯させます。水分が適切なときは緑のライトが点灯します。土がひどく乾燥すると、赤いライトが点滅し、ブザーが鳴って知らせます。

5.0(42)
57
ESP32のディープスリープで節電(OLED + RTC RAMカウンター)
#135上級
プレミアム

ESP32のディープスリープで節電(OLED + RTC RAMカウンター)

ESP32のディープスリープモードは、CPUとほとんどの周辺機器を停止し、消費電流を約10 µAまで抑えます。電池で動くIoT機器に欠かせない機能です。このプロジェクトでは、タイマー(15秒)、外部ピン(EXT0、ボタンはGPIO 33)、タッチ(T0/GPIO 4)の3種類の復帰方法を使います。RTC_DATA_ATTRを付けた変数はディープスリープ中も保持され、起動回数、タイマーによる復帰回数、ボタンによる復帰回数を継続して記録できます。復帰するたびにSSD1306 OLEDディスプレイに復帰理由と回数を表示します。

4.3(10)
16
ESP32サーボモーター(ポテンショメーター制御)
#118中級
プレミアム

ESP32サーボモーター(ポテンショメーター制御)

このプロジェクトでは、ポテンショメーターでSG90サーボモーターを制御します。ポテンショメーターから読み取ったアナログ値を0~180度の範囲に変換し、サーボの角度を調整します。ESP32Servoライブラリは、ESP32の出力に対応した適切なGPIOでサーボ信号を生成します。このプロジェクトではGPIO 18を使います。ロボットアームやカメラ用ジンバル、自動ドアの機構に使われる基本的な制御方法です。

4.3(29)
42