この記事では、USB接続のデジタル入力基板「TDFA30608」を使って、押しボタンスイッチのON/OFFをRaspberry Piで読み取ってみます。
TDFA30608は8点のデジタル入力を持つ基板です。外部機器の接点信号やスイッチの状態を、USB経由で自分のプログラムから簡単に読み取ることができます。入力側とUSB側は絶縁されているので、設備や外部電源を使った実験にも使いやすいのが特徴です。
今回はまず、CH0に押しボタンスイッチを1個つないで、ボタンを押したときに入力がONになるところまで試してみます。
用意するもの
| アイテム | 説明 |
|---|---|
| Raspberry Pi(OSインストール済み) | Pi 4 または 5 推奨。Raspberry Pi OSが入っていること |
| TDFA30608 デジタル入力基板 | 8点入力のUSB絶縁デジタル入力モジュールです |
| USBケーブル TDAC-USB2B1M5 | Raspberry PiとTDFA30608を接続します |
| 外部電源 | 5Vや12Vなど。TDFA30608の入力側に使います |
| 押しボタンスイッチ | まずはCH0のON/OFF確認に使います |
| 配線材 | 外部電源、押しボタン、TDFA30608の端子を接続します |
| インターネット | ツールのインストールやソースの取得で使います |
TDFA30608の入力電圧は5~24Vに対応しています。この記事では5Vまたは12Vの外部電源を想定します。
まずは配線してみよう
今回はC端子を外部電源のプラス側に接続する方法で試します。
まずはRaspberry PiにはまだUSBを接続せず、入力側の配線をします。
外部電源の + → TDFA30608の C 端子
外部電源の - → 押しボタンスイッチの片側
押しボタンスイッチのもう片側 → TDFA30608の CH0 端子
この配線では、ボタンを押していないときはCH0がOFF、ボタンを押すとCH0がONになります。
CH1以降も同じ考え方で使えます。たとえばCH1を使う場合は、押しボタンの片側をCH1につなぎます。C端子は共通なので、外部電源のプラス側に接続したままでOKです。
配線が終わったら、外部電源を入れます。LEDの点灯確認は、このあとUSBケーブルでRaspberry Piに接続してから行います。
ツールを準備しよう
Raspberry Pi のソフトをアップデートしてから、必要な開発ツールやライブラリをインストールします。
sudo apt update && sudo apt upgrade -y
sudo apt install -y git build-essential libusb-dev python3
USBの権限を設定する
TDFA30608を一般ユーザーから使えるように、USBのアクセス権限を設定します。
以下のコマンドで「udev」ルールを作ります。32ee は東京デバイセズ製品のベンダーID、1770 はTDFA30608のプロダクトIDです。
sudo tee /etc/udev/rules.d/99-usb-tokyodevices.rules <<EOF
SUBSYSTEM=="usb", ATTR{idVendor}=="32ee", ATTR{idProduct}=="1770", MODE="0666"
EOF
変更を反映します。
sudo udevadm control --reload-rules
sudo udevadm trigger
ここまでできたら、USBケーブルでRaspberry PiとTDFA30608を接続します。すでに接続していた場合は、一度抜き差ししてください。
ボタンを押したときにTDFA30608上のCH0に対応するLEDが点灯すれば、入力側の配線はできています。
TD-USBツールをインストールしよう
TDFA30608を操作するには、「TD-USB」という公式のコマンドラインツールを使います。GitHubからソースコードを取得してビルドします。
git clone https://github.com/tokyodevices/td-usb.git
cd td-usb
make
ちゃんと動くか試してみましょう。
./td-usb
# → バージョン情報が表示されれば成功!
TDFA30608が見えているかも確認してみます。
./td-usb tdfa30608 list
XXXXXXXXXXXXXX
接続されているTDFA30608が見つかると、シリアル番号が表示されます。
入力を読み取ってみよう
まずは現在の入力状態を1回だけ読み取ってみます。
./td-usb tdfa30608 get
0
ボタンを押していない状態では、すべての入力がOFFなので 0 が表示されます。
次に、CH0につないだ押しボタンを押しながら同じコマンドを実行します。
./td-usb tdfa30608 get
1
1 が表示されれば、CH0がONとして読み取れています。
TDFA30608の読み取り値は、8個の入力状態をまとめた数値です。CH0がONなら 1、CH1がONなら 2、CH0とCH1が両方ONなら 3 になります。
| 入力状態 | 2進数でのイメージ | 表示される値 |
|---|---|---|
| すべてOFF | 00000000 | 0 |
| CH0だけON | 00000001 | 1 |
| CH1だけON | 00000010 | 2 |
| CH0とCH1がON | 00000011 | 3 |
| CH7だけON | 10000000 | 128 |
繰り返し読み取りたい場合は、--loop オプションを使います。次の例では200ミリ秒ごとに入力状態を表示します。
./td-usb tdfa30608 get --loop=200
0
0
1
1
0
終了するときは Ctrl+C を押してください。
Pythonで動かしてみよう
ここでは、Pythonから ./td-usb tdfa30608 get --loop=200 を呼び出して、CH0の状態が変わったときだけ表示するスクリプトを書いてみます。
td-usb フォルダの中で、button_watch.py というファイルを作成してください。
#!/usr/bin/env python3
import subprocess
import time
CMD = ['./td-usb', 'tdfa30608', 'get', '--loop=200']
def is_on(value, channel):
return (value & (1 << channel)) != 0
proc = subprocess.Popen(CMD, stdout=subprocess.PIPE, text=True, bufsize=1)
last_state = None
print('CH0の監視を開始します。終了するにはCtrl+Cを押してください。')
try:
for line in proc.stdout:
try:
value = int(line.strip())
except ValueError:
continue
ch0 = is_on(value, 0)
if ch0 != last_state:
state_text = 'ON' if ch0 else 'OFF'
print(f'[{time.strftime("%H:%M:%S")}] CH0: {state_text} 入力値: {value}')
last_state = ch0
except KeyboardInterrupt:
proc.terminate()
print('\n監視を終了しました。')
実行してみよう
python3 button_watch.py
CH0の監視を開始します。終了するにはCtrl+Cを押してください。
[12:03:10] CH0: OFF 入力値: 0
[12:03:14] CH0: ON 入力値: 1
[12:03:17] CH0: OFF 入力値: 0
押しボタンを押すと CH0: ON、離すと CH0: OFF と表示されれば成功です。
CH1以降も読み取ってみよう
CH1以降を使う場合も、配線とPythonの考え方は同じです。
たとえばCH2を確認したい場合は、押しボタンをCH2につなぎ、Python側では次のようにチャンネル番号を 2 にします。
ch2 = is_on(value, 2)
複数のスイッチをつないで、CH0、CH1、CH2をまとめて見ることもできます。入力値はビットの組み合わせなので、どのチャンネルがONになっているかをプログラムで判定できます。
おわりに
この記事では、TDFA30608とRaspberry Piを使って、押しボタンスイッチのON/OFFを読み取るところまで試しました。
デジタル入力が読めるようになると、たとえば次のような用途に応用できます。
- ドアやカバーが開いたかどうかを検知する
- フットスイッチや押しボタンをPCアプリの入力にする
- 設備の接点出力をRaspberry Piで記録する
- 複数のスイッチ状態をまとめて監視する
TDFA30608はUSBから簡単に扱えるので、はじめて外部接点をプログラムから読み取る実験にも使いやすい基板です。まずは1チャンネルだけ動かしてみて、慣れてきたら複数チャンネルの監視にも広げてみてください。


