Arduinoで始めるIoT~外から家電の操作を行うまで~

こんちゃ!洋梨🍐です。

「スマホから家電の操作したいな~」なんて思ったこと皆さん無いでしょうか?

きっとあると思います(暴論)^^

そこで今回はスマホから家電を操作する為の手順を公開したいと思います~

今回使うもの

製作環境

・Unity + C#

スマートフォン(操作)側アプリの開発に使います。今回紹介するソースコードはC#で書かれているので.NET FrameworkやXamarinでも動きますよ。(確認済)

・Arduino + C

リモコン(実行)側にはArduinoを用います。なお言語はC言語ベースです。

材料

・Arduino 本体


HiLetgo® 2個セット NEWバーション UNO R3 ATmega328P USB CH340G Arduinoと互換性 + USB ケーブル [並行輸入品]

今回の主役です。C言語を使って電子部品を扱うことができます。

・赤外線LED

リモコンの操作信号を再現するために使います。波長は 950nmに近いものを使います。※850nmでは動きませんでした。

・赤外線 受光モジュール

リモコンの操作信号を再現するために使います。

・ボタン

操作用に使います。

・Wi-Fiモジュール

スマートフォンから操作したい場合、使用します。Arduinoをインターネットに接続できるようにすればいいのでイーサネットでもOK!

オプション

・IC2 OLED (128×64)

Arduinoから情報を出力(可視化)するために今回は使いました。

・コンデンサー

リモコンの光を遠くまで飛ばせるようにするとき使います。

・リレー

赤外線操作ではなくコンセント操作を使いたいときにどうぞ

仕組み

簡単なイメージ図

例えば、普通は左のようにテレビの操作にリモコンを使いリモコンがテレビに信号を送っています。

しかし、スマホで操作したくてもスマホではテレビに信号を送ることができません。

そこで今回は信号を送る部分をArduinoに肩代わりしてもらい、スマホからArduinoを操作することで間接的にテレビに信号を送るというわけです。

作成 (Arduino側)

すべて説明すると長くなってしまうため簡単な説明です。

Arduinoでは赤外線信号を保存・再生します。

受光モジュールを使いリモコンの信号を事前にキャプチャーし、スマホからの信号が届いたら赤外線LEDを用いてキャプチャーした信号を 再生すればいいというわけです。

リモコンをキャプチャーする様子

まずキャプチャー(保存)するためのソースコードです。

次に再生するためのソースコードです。

このプログラムをボタンを押したときに呼び出すようにすればボタンを押したときにキャプチャーした信号が再生されるようになります。

赤外線LEDはカメラで点灯していることを確認できる。
上のGIFは実際に再生したところ。リモコンの信号と同じ点滅をしていることがわかる。

スマホからの操作に使用する際はUDPポートを監視し、信号が流れてきたら事前に決めたパケット構造に基づき対応した信号を再生するようにした。

操作用アプリ製作 (操作側)

紹介用に部屋の電気をON・OFFにする機能だけをつけたものにしてあります。C#で書かれています。なおUnityで動作確認済みです。

メインプログラム (Unity用)

ここで使っている「UDPSystem」のスクリプトは長いため以前書いた

こちらの記事をご覧ください。UDPパケットの送信には上記事のスクリプトを汎用しています。

スマートフォンで実行したときのスクリーンショット

これでスマートフォンからUDPでのパケットの送信ができるようになったと思います。もちろんTCPを使ってもできます。(むしろそっちのほうが良いかも)

テスト

このアプリで本当に信号(パケット)が出せているのか、しっかり届いているのかは調べないとわかりません。今回は「Wireshark」というパケットキャプチャーを使い、パケットが届いているかどうか確認したいと思います。

なお、外出先など外部からパケットを送信・受信(操作)するには「ポート開放」などが必要です。プログラムではUPnPやホールパンチングなど技術を使う必要があります。UPnPは比較的簡単なのでこちらを参考にしてみてください。

今回は外部(外出先)から使う事を推定しているのでテストではスマートフォンの4G回線(Docomo)からリクエストを送信します。

テストのイメージ図

今回テストで送信するリクエストは「ID(01)の機器の電源をON(01)にする」にします。つまりUDPで送るデーターは「0101」です。

先ほどのプログラムの「case 1:」の部分です!

パケットキャプチャー

アプリでプログラムを実行すると、自宅にあるPCの「パケットキャプチャー」で見るとUDPでパケット「0101」が届いているのが確認できました。これで外部からつけることができるという事が確認できました。

まとめ

今回はIoTデバイス作りの第一歩として家電操作を行いました。

この記事は以前私がレポートとしてやったものを記事に起こしたものになりますので詳しく知りたい方は こちらからレポートをダウンロード してください~

書いている途中で面倒になってしまったのもあり、説明がいくつか抜けて分からない部分があるかもしれませんでしたがすいませんです!(> 3 <)

「よくわかんないからプロジェクトファイルくれ」「もっと詳しく記事書いて」などリクエストはメールにお願いします!


ここまで読んでくれてありがとうございました!!

ホームページでは他にも

・様々な記事や作った作品および過程
・ソースコード、素材ファイル
・あらゆる”モノ”の作り方

などなど随時、記事や作品を新規公開・更新していますので是非見ていってくださいね!見ていただけると本当に嬉しいです!

Thank You Watching💛

C#でUPnPを使った ポートマッピング

ゲームを始めオンラインでの通信機能が必要になる事は多いと思います。

そんな時立ちはだかる難関の1つ。それはNAT越えです。

NAT越えをする手段はいくつか考えられますが、今回は一番簡単(?)なUPnPを使ってルーターにポートフォアリングを設定して通信通路を確保したいと思います。 この記事はその時の記録です。

実行・テスト環境

テスト環境:Unity 2018 2.9f1

今回のプログラムはUnity+C#で作成。

パケット送信などの仕組み・ソースコードは 前に書いた記事「UnityでUDP通信を行うには」 などを参考にしてください。

ルーターにポートフォアリング(ポート転送)をリクエストする

ネットワーク内のルーターを探索する

探索の為に「M-Search」リクエストを送信先「 239.255.255.250 : 1900 」(ブロードキャスト)にUDPで送信します。

「M-SEARCH」送信の様子

その後ルーターなどUPnP対応機器からのリスポンス「NOTIFY」が同じアドレスで返ってくるので受信します。

UPnP対応機器からのリスポンス「NOTIFY」

ルーターの情報を取得

先ほどの情報を元にルーターに「HTTP / GET」で詳細情報をリクエストします。

リクエストは以下のようなプログラムで実装しました。


私の環境では「192.168.0.12」のPCから「192.168.0.1」のルーターにリクエストを送信している

なお、リクエストに成功すると「HTTP 200 OK」が返され、XML形式の情報を入手することができます。

そのXMLのうち今回は <controlURL> の情報を元にリクエスト先アドレスを入手します。

リクエストをルーターに送信

先ほどの情報を元に対象のアドレスに「HTTP / POST」でリクエスト内容(SOAPプロトコル)を送信します。

今回テストに送信したリクエストは以下の通りです。

このリクエストではポート「12345」のUDP通信を「192.168.0.12」に転送するリクエストをしています。

ExternalPortとInternalPortは転送元と転送先なので通常同じにします。

リスポンスを受信し成功確認

上のSOAPリクエストを送信するとルーターからリスポンスを受け取ります。

この時、「HTTP 200 OK」なら成功です。

HTTP/1.1 200 OK で成功だとわかる
ルーターの管理者ページでも確認できる

成功すると上図のように管理者ページにも追加されているのがわかる。

なお、失敗だと「 HTTP/1.1 500 Internal Server Error 」が返されます。失敗原因としては「既にポートが使用中」「UPnP設定の上限まで達している」などが挙げられます。

そもそも何も返ってこない場合、そもそもどこかが間違えているはずですので再確認してみてくださいね。

外部からの送信テスト

ポートフォアリングの設定などがしっかり出来ていることを確認するために外からUDPでパケットを送信してみます。

パケット送信アプリで送信テスト

スマートフォンからDocomo(4G)のキャリア回線で自宅のパソコンへとメッセージを送信。

パケット(メッセージ)が届いているのが分かる

受信できていれば完璧です。

オンラインゲーム作りの第一歩ですかね^^

今度は「UDPホールパンチング」という方法でも挑戦してみたいと思います。
またその時は記事を書きますね


ここまで読んでくれて本当にありがとうございました~^

ホームページでは他にも

・様々な記事や作った作品および過程
・ソースコード、素材ファイル
・あらゆる”モノ”の作り方

などなど随時、記事や作品を新規公開・更新していますので是非見ていってくださいね!見ていただけると本当に嬉しいです!

また、「このアプリの作り方を知りたい。この部分どうなってるの?」「身の回りのこんなもの作れるの?」などなどご意見何でも受け付けていますので是非連絡くださいね!