手をかざすだけでコンピューターを操作できたら面白いと思いませんか?
今回は 双方向ハンドセンサー(Interactive Hand Sensor / IHS) という国産の赤外線センサーを Raspberry Pi 5 に接続し、センサーの値をリアルタイムに取得するところまでをレビューします。
特別な電子工作の知識がなくても、USB ケーブル 1 本で動かせるので、ぜひ参考にしてみてください。
双方向ハンドセンサー(IHS)とは?


双方向ハンドセンサーは、日本の個人開発者が設計・製作した 8 チャンネル赤外線センサー基板です。手やものを近づけたときの赤外線の反射量を 12bit(0〜4095)の数値として出力し、約 20cm 以内の距離・位置・動きをリアルタイムに検出できます。
- 公式サイト:https://interactive-hand-sensor.com/root/
- 購入先(スイッチサイエンス):https://www.switch-science.com/products/6495/
センサーの特徴
| 項目 | 仕様 |
|---|---|
| センサー方式 | スイッチングフォトリフレクタ(SPR)技術 |
| チャンネル数 | 8ch |
| AD 分解能 | 12bit(0〜4095) |
| スキャン速度 | 8 チャンネルを 1.2ms でスキャン |
| 検出距離 | 約 20cm 以内 |
| 電源 | USB 5V / 約 180mA(約 1W) |
スイッチングフォトリフレクタ(SPR)という技術
IHS の核となる技術が スイッチングフォトリフレクタ(SPR) です。赤外線 LED を通常の連続点灯ではなく、わずか 10 マイクロ秒(0.00001 秒)だけ約 1.5A の大電流でパルス発光させます。
この超短時間の発光で反射光を AD コンバータで読み取ることで、「周囲の照明などの環境光」と「手からの反射光」を明確に分離できます。具体的には以下の手順でセンサー値を算出しています。
距離近似値 = (赤外線 LED オン時の AD 値) − (赤外線 LED オフ時の AD 値) − 起動時の校正値この方式は開発者が 2019 年に発明したもので、屋内の明るい環境でも安定した検出が可能です。
他センサーとの比較
| AIカメラ | LiDAR | 双方向ハンドセンサー | |
|---|---|---|---|
| プライバシー | 映像が残る懸念あり | ◯ | ◯(反射量のみ) |
| 測定速度 | 遅い | 遅い | 速い(1.2ms) |
| 検出距離 | 1m 以上 | 1m 以上 | 約 20cm 以内 |
| 暗所での動作 | △ | ◯ | ◯ |
| 応用の自由度 | 仕様依存 | 仕様依存 | 高い |
カメラと違って画像を記録しないため、プライバシーに配慮した非接触インターフェースとして活用できる点が大きな魅力です。
接続方法:今回は USB 接続(推奨)
IHS を Raspberry Pi に接続する方法は 2 種類あります。
パターン A(今回紹介):Arduino Nano R4 経由の USB 接続

- IHS 基板 → Arduino Nano R4 → USB Type-C ケーブル → Raspberry Pi 5
- 物理的な配線は USB ケーブル 1 本のみ
- 電源供給も同時にできる最もシンプルな構成
パターン B:GPIO 直結(SPI 接続)
- Raspberry Pi の GPIO ピンに直接 SPI 接続
- 柔軟な制御が可能だが、配線と設定が複雑
初めて試す方にはパターン A が断然おすすめです。
接続図

Arduino Nano R4 のファームウェアが 8 チャンネルの AD 値をシリアル通信(CDC-ACM)で連続出力するので、Raspberry Pi 側は /dev/ttyACM0 を読み取るだけです。
Raspberry Pi 5 のセットアップ
必要なもの
- Raspberry Pi 5(Raspberry Pi OS インストール済み)
- 双方向ハンドセンサー(IHS)+ Arduino Nano R4 セット
- USB Type-C ケーブル
Step 1:OS のアップデート
まず Raspberry Pi OS を最新の状態にします。
sudo apt update && sudo apt upgrade -yStep 2:Arduino ファームウェアの確認
Arduino Nano R4 には、シリアル出力を有効にしたファームウェアを書き込む必要があります。今回使用するリポジトリのファームウェア(firmware/IHS11_Nano_R4.ino)には #define Monitor が有効化済みです。
ファームウェアが正しく書き込まれていれば、USB 接続時にセンサーが 青く光ってキャリブレーションが始まります。これがスタートのサインです。
Step 3:USB 接続してデバイスを確認
USB Type-C ケーブルで IHS(Arduino Nano R4)と Raspberry Pi 5 を接続し、デバイスが認識されているか確認します。
ls /dev/ttyACM*/dev/ttyACM0 が表示されれば OK です。表示されない場合は以下で詳細を確認してください。
lsusb # USB デバイス一覧
dmesg | tail # カーネルログの末尾Step 4:シリアルポートへのアクセス権限を設定
デフォルト状態では一般ユーザーがシリアルポートを読めないため、dialout グループに追加します。
sudo usermod -aG dialout $USER設定を反映するために一度ログアウト→ログイン(または再起動)してください。
# 設定確認
groups $USER
# 出力例: pi adm dialout cdrom sudo ...Step 5:pyserial のインストール
Python からシリアル通信を行うために pyserial をインストールします。
sudo apt install -y python3-serialインストールできたか確認します。
python3 -c "import serial; print('pyserial OK')"pyserial OK と表示されれば準備完了です。
センサー値を取得するスクリプト
GitHubリポジトリ Murasan201/touchless-control-ihs にある scripts/read_sensor_log.py を使って、センサーの値をリアルタイムに確認します。
リポジトリのクローン
git clone https://github.com/Murasan201/touchless-control-ihs.git
cd touchless-control-ihsスクリプトの全体像
scripts/read_sensor_log.py のコードは以下のとおりです。
#!/usr/bin/env python3
"""
read_sensor_log.py - Monitor IHS sensor values over serial
Reads 8-channel AD values from the IHS sensor (via Arduino Nano R4)
and prints them with timestamps to stdout.
"""
import argparse
import signal
import sys
from datetime import datetime
import serial
def parse_args():
parser = argparse.ArgumentParser(
description="Monitor IHS sensor values over serial"
)
parser.add_argument(
"--port",
default="/dev/ttyACM0",
help="Serial port exposed by Arduino Nano R4 (default: /dev/ttyACM0)",
)
parser.add_argument(
"--baud",
type=int,
default=57600,
help="Serial baud rate (default: 57600)",
)
parser.add_argument(
"--lines",
type=int,
default=0,
help="Stop after this many lines (0 = run forever)",
)
return parser.parse_args()
def main():
args = parse_args()
ser = None
def handle_sigint(sig, frame):
print("\n[INFO] Interrupted. Closing serial port.")
if ser and ser.is_open:
ser.close()
sys.exit(0)
signal.signal(signal.SIGINT, handle_sigint)
try:
ser = serial.Serial(args.port, args.baud, timeout=1)
print(f"[INFO] Opened {args.port} at {args.baud} bps")
except serial.SerialException as e:
print(f"[ERROR] Could not open serial port: {e}", file=sys.stderr)
sys.exit(1)
count = 0
try:
while True:
raw = ser.readline()
if not raw:
continue
try:
line = raw.decode("ascii", errors="replace").rstrip()
except Exception:
continue
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
print(f"[{timestamp}] {line}")
count += 1
if args.lines > 0 and count >= args.lines:
break
finally:
if ser and ser.is_open:
ser.close()
print("[INFO] Serial port closed.")
if __name__ == "__main__":
main()スクリプトの実行
python3 scripts/read_sensor_log.py --port /dev/ttyACM0 --baud 115200ボーレートについて:ファームウェアのバージョンによって 57600bps と 115200bps のどちらかが使われます。接続できない場合はもう一方の値も試してみてください。
オプション一覧
| オプション | デフォルト | 説明 |
|---|---|---|
--port | /dev/ttyACM0 | シリアルポート |
--baud | 57600 | ボーレート |
--lines | 0(無限) | 指定行数で停止 |
出力例
[INFO] Opened /dev/ttyACM0 at 115200 bps
[12:34:56.789] 1234, 567, 32, 0, 45, 2300, 100, 3800,
[12:34:56.791] 1240, 560, 28, 0, 48, 2310, 102, 3790,
[12:34:56.793] 1500, 800, 40, 0, 50, 2400, 110, 3850,カンマ区切りの 8 つの数値が センサー 8 チャンネルの AD 値(0〜4095)です。タイムスタンプはミリ秒単位で付与されるため、手の動きの時系列変化を正確に追跡できます。
手をセンサーに近づけると値が大きくなり、離すと小さくなることが確認できるはずです。
ログファイルへの保存
出力をログファイルにリダイレクトしておくと、後から解析できます。
python3 scripts/read_sensor_log.py --baud 115200 > sensor_log.txtトラブルシューティング
/dev/ttyACM0 が見つからない場合
lsusbリストに Arduino または Microsoft の表記があるか確認してください。表示がなければケーブルの抜き差しや、データ転送対応の USB ケーブルかどうかを確認してみてください(充電専用ケーブルは不可)。
Permission denied: '/dev/ttyACM0' エラー
dialout グループへの追加後、再ログインが完了しているか確認してください。
groupsdialout がリストに含まれていれば OK です。
値が 0 のまま変化しない
Arduino 起動直後はキャリブレーション中です。LED が青く光り終わるまで(数秒)待ってからスクリプトを実行してください。また、起動直後のキャリブレーション時はセンサーの上に手を置かないようにしてください(校正値がずれます)。
まとめとここからの展開
今回は双方向ハンドセンサー(IHS)の概要から Raspberry Pi 5 への USB 接続、リアルタイムでセンサー値を取得するスクリプトの実行まで解説しました。
取得した 8 チャンネルの AD 値を使えば、次のような発展的なアプリケーションが実現できます。
- 近接レベルの閾値処理でタッチレス・スイッチを作る
- チャンネル間の値の傾きから手の傾きや方向を検出する
- 時系列変化パターンからジェスチャー(スワイプ、手を振るなど)を認識する
今後はこれらの応用についても記事にしていく予定です。コードや設定ファイルはすべて GitHub に公開していますので、ぜひ手を動かしてみてください。
GitHub リポジトリ:https://github.com/Murasan201/touchless-control-ihs
を-Raspberry-Pi-5-でレビュー_14794_c71c8.jpg)










コメント