文化祭は自作電子銃でサバゲ― 第2回

はじめに

ここでは、Arduino Nanoを使った赤外線送信機(銃)の作り方を、図解付き・ステップバイステップで紹介します。完成イメージは、まるでSF映画に出てくるような電子銃!実際に動いている様子は、こちらの動画でチェックしてみてください。

  • ゴール:ブレッドボード上で「トリガーボタンを押すと赤外線LEDが38kHz変調されて発光する」状態にする。
  • 完成イメージ:家電リモコンの仕組みに近い形で赤外線を送信し、受信機(別記事③参照)がそれを「命中」と判定する、本格的な電子銃を製作します。

目次

1. 必要なパーツ(銃側)

  1. Arduino Nano (または互換機, 5V/16MHz版推奨)
  2. 赤外線LED (940nmリモコン用)
  3. 抵抗 (220Ω) … LED電流制限
  4. プッシュボタンスイッチ … トリガー用
  5. ブレッドボード (830穴クラスなど)
  6. ジャンパーワイヤ (オス-オスを中心に20本程度)
  7. USBケーブル (Arduino NanoとPCをつなぐMini-B or Micro-B or Type-Cなど、互換機による)
  8. PC (Windows/Mac/Linux) … Arduino IDEでプログラムを書き込む
  9. 電源: USBから5V供給 or 乾電池4本(5~6V)+電池ボックス(とりあえずUSB接続が簡単)

トランジスタを使わない最小構成です。距離を伸ばしたい場合は2SC1815などで赤外線LEDを増幅する回路を追加しましょう。


2. 回路図(絵で解説)

下の図は、Arduino Nanoのピン配置に合わせてブレッドボードで配線したイメージ図です。

主な接続

[ここに生成した回路図画像を挿入]

  • Arduinoのデジタル出力ピン (D2): IR LEDを点滅させるために使用します。抵抗 (220Ω) は、IR LEDに流れる電流を制限し、LEDを保護します。
  • Arduinoのデジタル入力ピン (D4): スイッチ (S1) の状態を読み取るために使用します。
  • プルアップ抵抗 (10kΩ): デジタル入力ピンが浮遊状態になるのを防ぎ、スイッチが押されていないときに確実にHIGHレベルになるようにします。
  • スイッチ (S1): トリガーとして使用します。押されるとデジタル入力ピンがLOWになります。タクトスイッチは、向かい合う2つの端子が内部で繋がっています。(図参照)
  • IR LEDを駆動する際には、Arduinoのデジタル出力ピンの電流容量を超えないように注意してください。通常、20mA程度が上限です。
  • 赤外線リモコンの信号を送信するには、特定のプロトコルに従った信号をIR LEDから出力する必要があります。Arduinoのライブラリ (例えば IRremoteESP8266 など) を利用すると、一般的な赤外線プロトコルでの送信が容易になります。

3. ステップバイステップで組み立て

Step 1. Arduino Nanoをブレッドボードに挿す

場所の確保:
ブレッドボードの真ん中にある溝(左右分割)をまたぐ形でArduino Nanoを差し込むと、ピンが左右に分かれます。
ただしNanoは製品によってピンが半田済/未済があります。 ピンヘッダ が付いていればそのまま挿せます。

[ここに生成したArduino Nanoをブレッドボードに挿した写真]

ピン位置:
「D2」「D3」「5V」「GND」などの端子がどこに来るか確認しましょう。

Step 2. 電源ラインを接続

  1. Arduinoの5Vピン → ブレッドボードの赤(+)ラインへジャンパーワイヤ
  2. ArduinoのGNDピン → ブレッドボードの青(-)ラインへジャンパーワイヤ
  3. ブレッドボードの赤(+)/青(-)ライン 同士を横方向につないでおくと、より広範囲で電源が共有できます(製品によっては分断されている場合あり)。
電源ラインを接続

Step 3. スイッチを配線

押しボタンをブレッドボードに挿す
タクトスイッチの4本足のうち、対角線上にある足同士が内部で繋がっています。真ん中の仕切りをまたぐように挿すと、押したときだけ回路が通ります。

ブレッドボード+タクトスイッチ 配置方法

Arduino D4 → スイッチ片側
スイッチのもう片側 → GNDライン

  • スイッチが押されていない時、D4は内部プルアップでHIGH(5V)になる。
  • 押されるとGNDに落ちてLOW(0V)になる。
  • 初心者は「ブレッドボード+タクトスイッチ 配置方法」を動画や画像検索するとイメージしやすいです。

Step 4. 赤外線LEDと抵抗を接続

  1. 220Ω抵抗(R1)をArduino D3と**LEDアノード(+)**の間に挿す
  2. LEDカソード(-)GNDライン
  3. アノード(+)」は足が長い、もしくはLEDの内側に大きなリフレクターがある方。反対側が「カソード(-)」。
  4. [ここに生成した赤外線LEDの形状とアノード、カソードの判別方法を示す図]

テスト:
スマホカメラをLEDに向けて撮影モードにし、点灯を確認しやすいように後ほどプログラムを書き込みます。

Step 5. PCとUSB接続

  1. USBケーブル(Nanoのコネクタに合わせたもの)でArduino NanoをPCへ
  2. PCがドライバを認識し、デバイスマネージャ等でCOMポートが割り当てられるか確認(Windowsの場合)
  3. MacやLinuxでも同様にポート認識をチェック

4. Arduino IDEの導入・初期設定

Step 1. Arduino IDEを入手

  1. Arduino公式サイトから最新版をダウンロード (Windows/Mac/Linux対応)
  2. インストールウィザードに従ってセットアップ

Step 2. ボードとポートを選択

  1. Step 2. ボードとポートを選択
  2. IDEを起動 → ツール(Tools) メニュー
  3. 「ボード(Board)」→ 「Arduino Nano」を選択
  4. 「プロセッサ」→ 「ATmega328P (Old Bootloader) or (New Bootloader)」
  5. 互換機によって異なるので、エラーが出た場合は切り替えて試す
  6. 「シリアルポート(Port)」→ ご自身のArduinoが認識されたCOMポートを選択
  7. [ここに生成したArduino IDEのスクリーンショット]

トラブルシュート:

  • 書き込みエラーが出る場合、プロセッサ設定やドライバを再確認。

5. IRremoteライブラリの導入・説明

IRremoteとは

  • Arduinoで赤外線リモコン信号を送受信するための代表的なライブラリ
  • 38kHz変調をソフトウェアで生成し、さまざまな形式(NEC, Sony, RC5等)のIRコードを送信/受信できる。

Step 1. ライブラリをインストール

  1. Arduino IDE上のメニュー「スケッチ → ライブラリを管理 (Manage Libraries)」を開く
  2. 検索窓に IRremote と入力
  3. IRremote by Arduino」(作者名がArmin Joachimsmeyerなど)をインストール
    • バージョンが複数あれば最新推奨
    • [ここに古い関数名と新しい関数名の対応表]

注意: 2021年以降、IRremoteの構造が変わり、sendNEC(), **sendSony()**など関数名がアップデートされました。最新のサンプルを参考に。


6. ソースコード例(送信側)

以下は、NEC形式0x1234というコードを送るサンプル。
連射防止に少し工夫を入れています。

/*
  赤外線送信サンプル (銃側)
  トリガーボタン(D2)が押されたら、IR LED(D3)から38kHz変調信号を送信
*/
#include <IRremote.h>  // IRremoteライブラリを読み込む

// ピン設定
const int IR_SEND_PIN = 3;      // 赤外線LED用出力ピンをD3に設定
const int TRIGGER_PIN = 2;      // 押しボタン入力ピンをD2に設定 (内部プルアップ有効)

IRsend irsend;                  // IRremoteの送信用オブジェクトを生成

void setup() {
  Serial.begin(9600);          // シリアル通信を開始 (デバッグ用)
  pinMode(TRIGGER_PIN, INPUT_PULLUP);  // トリガーピンを入力に設定し、内部プルアップを有効化
  irsend.begin(IR_SEND_PIN);   // IR送信ピンを初期化
}

void loop() {
  // ボタンが押されるとLOWになる
  if (digitalRead(TRIGGER_PIN) == LOW) {
    Serial.println("Button Pressed! Sending IR...");  // シリアルモニタにメッセージを表示

    // 0x1234というデータをNEC形式で3回送信 (32ビット)
    for(int i = 0; i < 3; i++) {
      irsend.sendNEC(0x1234, 32);  // NECプロトコルでデータを送信
      delay(50);                  // 50ミリ秒の遅延
    }

    // 連射防止: ボタンが離されるまで待機
    while(digitalRead(TRIGGER_PIN) == LOW) {
      delay(10);                 // 10ミリ秒の遅延
    }
    delay(300);                  // ボタンが離された後、300ミリ秒の遅延
  }
}

// ソースコードの解説
// #include <IRremote.h>        // IRremoteライブラリを読み込む
// IRsend irsend;                // 送信用のIRsendオブジェクトを生成
// irsend.begin(IR_SEND_PIN);     // IR送信ピンを初期化
// sendNEC(0x1234, 32);         // 0x1234をNECプロトコルで32ビット送信
// while(digitalRead(TRIGGER_PIN) == LOW)  // ボタンが押されている間ループ
// delay(300);                  // ボタンが離された後、300ミリ秒待つ

ソースコードの解説

  1. #include <IRremote.h>
    • IRremoteライブラリを読み込み
  2. IRsend irsend;
    • 送信用のインスタンスを生成
  3. irsend.begin(IR_SEND_PIN);
    • 送信ピンを初期化 (ライブラリによって書き方が若干異なる場合あり)
  4. sendNEC(0x1234, 32);
    • 0x1234NECプロトコルで32ビット送信
    • ここを変えるとチーム別などの異なるコードを送れる
  5. 連射防止
    • while(digitalRead(TRIGGER_PIN) == LOW) … ボタンが離れるまでループ
    • delay(300) … ボタンリリース後に短い休止

7. 動作確認

  1. コードを書き込み
    • Arduino IDEで「チェックマーク(コンパイル) → 右矢印(書き込み)」
    • 成功すると「ボードへの書き込みが完了しました」と表示
  2. **シリアルモニタ(9600bps)**を開く
    • ボタンを押すと「Button Pressed!」と出ればOK
    • [ここにシリアルモニタのスクリーンショット]
  3. 赤外線LEDをスマホカメラで見ると、押した瞬間うっすら光る場合がある(機種による)
  4. 受信機側(次の記事③で作成)で、本当に**“0x1234”**が受信されるか確認できれば完璧

8. 仕上げ(ブレッドボード→外装)

  1. ブレッドボード上で問題なく動くのを確認後、ユニバーサル基板3Dプリンタ外装へ移行すると頑丈になる。
  2. 銃型外装は3Dプリンタで作り、トリガーボタン部分にこのスイッチを仕込む工夫をする。
  3. 配線がショートしないよう絶縁処理やホットボンド固定などを行う。

詳しくは記事④(3Dプリントによる銃本体の作り方)を参照。


9. よくある質問 (FAQ)

ボタンを押しても赤外線LEDが光らない

解決策: スマホカメラで確認する / LEDのアノードとカソードを逆にしていないかチェック / 抵抗値を間違えていないか / sendNECを何度か連続送信しているか

書き込みエラーで止まる

解決策: ボード設定で「ATmega328P (Old Bootloader)」を試す / シリアルポートが正しく選択されているか

距離が出ない(数mしか届かない)

解決策: トランジスタで赤外線LEDを増幅駆動 / より高出力のIR LED使用 / レンズや筒状ケースで指向性を上げる


まとめ

  1. 回路図(絵): D2ピン→スイッチ→GND、D3ピン→220Ω→IR LED→GND
  2. ステップバイステップ: ブレッドボードへのNano設置、電源ライン引き回し、スイッチ&LED配線、USBでPC接続
  3. Arduino IDE: ダウンロード・インストール、ボード/ポート設定
  4. IRremoteライブラリ: ライブラリを管理→検索→インストール → sendNEC()を使って発射
  5. ソースコード: if(digitalRead(D2)==LOW){ sendNEC(...); } で動作
  6. テスト: スマホカメラとシリアルモニタで状態確認

以上で、銃(送信機)側の基本制作は完了です。
次は**的(受信機)側(記事③)**の制作に進みましょう。そこでは赤外線受信モジュールを使い、命中判定や被弾カウントを行います。


参考リンク

これらを参考に、自分だけの電子銃をブラッシュアップしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次