何回かに分けてTWE-Liteファームウェア開発について触れたいと考えております。
今回作成した物
最下段のサンプルにて親機から 0.5秒毎に全てのLED On/Offを要求しているのですが、通信のタイミングや処理速度の関係で全く上手く行かない...
最終的に実施したい事
- 親機1台/子機30台位で動作させる
- USB電源を接続したまま動作するハードウェアを作成する (スリープ等は要件に含まない)
- 子機のスイッチを押す度に自分の状態を示すLEDの色が変更される
- 子機のスイッチ状態が変化した事を親機に通知する
- 親機である ToCoStick on Raspberry Pi で何かの時間やWebAPI等の結果を元に、子機であるTWE-Lite DIP に接続されたLEDを点滅させる
※1 今回の記事は下記ページのFirmware 「超簡単!TWEアプリ」を利用したものとなります。
http://mono-wireless.com/jp/products/TWE-ZERO/index.html
※2 今回の標準ファームを利用する方法では最終的に実施したい事が出来ないと判断したため、独自でファームウェアを作成する事にしました、続編は引き続き掲載致します。
準備
ハードウェアの構成
- RaspberryPi2 B+
- ToCoStick
- TWE-Lite DIP 1台
- 抵抗 680オーム * 3
- LED 手持ちの物を適当に * 3
- ボタンスイッチ
配線
- 電源
Raspberry PiのGPIOから5Vを引き出し、3端子レギュレータ TA48M033F を用い 5v -> 3.3v へ降圧しています - DO1 LEDを接続
- DO2 LEDを接続
- DO3 LEDを接続
- DI1 ボタンスイッチを接続 (親機データ受信時のテストに利用)
LEDと抵抗、ボタンスイッチの接続は下記公式の入門ページに準じております。
TWE-Lite DIP使用方法(初級編)
RaspberryPiにcuパッケージをインストール
シリアルコンソールをインストール
cu - Call up another system だそうです覚えづらい...
下記の様に表示されれば接続成功です。(Macではデバイス名が異なります)
rootユーザでは接続できません
dialoutグループにpiのみ所属しているためです
特に実施する必要は無いと思いますが groupファイル編集にて dialout:x:20:pi,root のようにして再ログインすれば接続出来るようになります。
切断
Ctrl + C の後に ~.
Mac → Raspberry Pi から接続しているのですが 直接 ~. を入力すると
Mac → Raspberry Pi 間の接続が切られてしまいました
親機と子機の設定を行う
下記コマンドを実行後に Connected. と表示されたら + を 3回入力します
するとConfig画面が表示されます
親機と子機で設定画面に入りApplication IDを揃える必要があります。
また、親機はDevice IDを121とする必要があります。
Application IDについて
http://mono-wireless.com/jp/products/TWE-Lite-DIP/TWE-Lite-DIP-step3-interactive.html
親機の設定
設定変更を行いたい頭文字 a を入力するとインタラクティブに値を入力できます
最後に S を押してConfigを保存しましょう、変更された箇所が *印 付きとなりました。
頭文字c 周波数チャネルは親機/子機同一である必要があります
子機の設定
設定変更を行いたい頭文字 a や i を入力するとインタラクティブに値を入力できます
最後に S を押してConfigを保存しましょう、変更された箇所が *印 付きとなりました。
頭文字c 周波数チャネルは親機/子機同一である必要があるとの事です
子機から親機へのデータ受信テスト
上記設定を行うと既にデータが飛んでくる状態となっています確認を行うには上記と同じコマンドで
接続すれば良いのですが INTERACTIVE MODE に入ったままだと飛んできたデータが確認できないので
+ を3回押し通常モードに戻ると受信データを確認出来ます。
INTERACTIVE MODEを抜ける
以降が子機から飛んできたデータ
子機DI1への入力が親機に反映するか確認
Pythonで受信データを表示
下記を適当な名前で作成頂き実行する事で上記出力を得られます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | </p><h1>!/usr/bin/env python</h1><h1>-<em>- coding: utf-8 -</em>-</h1><p>import serialimport sys</p><p>argv = sys.argvargc = len(argv)</p><p>def read_serial(s):while True:line = s.readline()print line.strip()</p><h1>USBデバイスの指定</h1><p>if argc != 2:s = serial.Serial("/dev/ttyUSB0", 115200, timeout=10)else :s = serial.Serial(argv[1], 115200, timeout=10)</p><p>while True:try:read_serial(s)except KeyboardInterrupt:breakexcept:continue</p><p>s.close() |
Pythonでデータ送信を行う
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | </p><h1>!/usr/bin/env python</h1><h1>-<em>- coding: utf-8 -</em>-</h1><p>import serialimport sysimport selectimport time</p><p>argv = sys.argvargc = len(argv)</p><p>def digital_write(child_id, pin, value):header = get_send_header(child_id)</p>[crayon-6901fa6a68eaf276676666/]<p>def get_send_header(child_id):if child_id == '':</p><h1>全ての子機を対象にする</h1>[crayon-6901fa6a68eb0980209610/]<h1>main</h1><p>HIGH = 1LOW = 0</p><h1>USBデバイスの指定</h1><p>if argc != 2:s = serial.Serial("/dev/ttyUSB0", 115200, timeout=10)else :s = serial.Serial(argv[1], 115200, timeout=10)</p><p>while True:</p><h1>全ての子機を対象</h1>[crayon-6901fa6a68eb1872262825/]<p>s.close() |
当初の予定では上記のようにして子機への通知としてLEDの点滅を親機側で制御できたら良いなと考えていたのですが
標準ファームウェアでは外部回路を用いないと、特定ポートをOn/Blink状態で保持等は出来ないため
次回以降でオリジナルのファームウェア開発について記載します。
投稿者プロフィール
-
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております
機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。








