疑似IoTの話。疑似でもないかな。
余ってるスマホを監視カメラとして活用するっていう話を以前このブログで述べたけど、さらにそのスマホを首振りさせて監視範囲をダイナミックに広げようという画期的な話だ。
目的は子猫を常に見る
目的は子猫だ。子猫がつい最近我が家に2匹つづけて入居したのでそいつらが心配なのだ。
余談だが子猫をもらうなら同時に2匹以上が良い。1匹だと遊び相手がいなくて可愛そうだが2匹いるとお互いにじゃれ合ってくれて人間様は見てるだけで癒やされる。
子猫たちも相手が人間より同じ年の子猫のほうがだんぜん楽しそうだ。
やりたいことの流れ
スマホの画面をちょちょっと操作するだけで監視カメラが上下左右に向きを変えるっていうまさにIoTを実現させよう。
目的は子猫がどこにいても見られるということで子猫さえ見られれば手段は問わない。が安くあげたいので眠っていた古いスマホとその他材料費1000円程度で2軸の首振り機構をつくる。
ハードウェア
マイコンボード
今回はスマートロックを作ろうと思って最初に買ったESP8266マイコンが乗ったボードを使う。
為替にもよるが送料込みで400円前後で買えるはず。これでWi-Fi機能も乗ってるんだから遊ばない手はない。
これでいろいろIoT機器つくってるだけで人生バラ色といっても過言ではない。
↓このリンク内にいくつか種類があるがどれを使っても同じことができるのではないかと思う。Wi-Fi機能さえあればいいのだから。
ワイヤレスモジュールCH340/CP2102/CH9102X nodemcu V3 V2 V2.1 lua wifiインターネットのもの開発ボードESP8266 ESP 12E|nodemcu v3|lua wifiwireless module – AliExpress
俺の場合、上記リンク先の左から3番目の機種を買って送料込み353円だった。
ちなみにAmazonでもまったく同じではないにしろ同様のボードは売られている。
Rasbee New バージョン NodeMcu Lua ESP8266 CP2102 WIFI インターネット 開発ボード 並行輸入品
¥360(2021/11/29 16:22時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
サーボ2個
サーボはマイコン工作マニアの御用達SG90で大丈夫。よほど大きいスマホを持ち上げるのでない限り大丈夫だが、最近のiPhoneでもAndroidでも大型化しているからちょっと注意だ。
waves SG90 サーボ モーター 9g (180° 2個)
¥750(2021/11/29 16:25時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
iPhone5とか6とか7ぐらいのレベルなら問題ない。
6プラス、7プラス、あるいはギャラクシーなんとかとかっていう大画面または大バッテリータイプを使う場合はSG92を使っておいたほうが無難かなと思う。
マイクロサーボ SG92R (1個)
¥550(2021/11/29 16:26時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
サーボブラケット
サーボがあっても関節機能がないと上下、左右に首をふることができない。サーボを固定するブラケットが関節の役割を果たしてくれる。
↓こいつはSG90、SG92サーボ用だけどそれより大型のサーボを調達した場合にはサイズが合わないかもしれない。そこのところはサーボに合わせてブラケットも探す必要がある。
↓Amazonで手に入るが、
サーボブラケット PT パン/チルトカメラプラットフォーム防振カメラマウント航空機 FPV 専用のナイロンの ptz 9 グラム SG90
¥290(2021/11/29 16:28時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
↓俺がアリエクで買ったときは4個買って送料込み297円だった。
補助電源基盤
サーボを直接マイコン基板につなげると電力不足でサーボがあらぬ動きをするから小さいマイコン基板でサーボを扱う場合にはサーボ用の電源基板を別に用意するべし。
KKHMF 2個 MB102 ブレッドボード 電源 ブレッドボード 電源モジュール 3.3V 5V Arduinoに対応 「国内配送」
¥448(2021/11/29 16:38時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
上記の電源基板のUSBポートはメスになっているのでUSBケーブルで電力供給をする場合にはオスオスのUSBケーブルも用意する必要がある。
USB 3.0 ケーブル 長さ60cm タイプA-タイプA USBケーブル オス-オス 金属コネクタ搭載 ラジエーター/カメラなど用 延長ケーブル データライン
¥499(2021/11/29 16:40時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
その他
ブレッドボードはピンからピンへの配線を変えるときに必要になるからあったほうが良い。
サンハヤト SAD-101 ニューブレッドボード
¥444(2021/11/29 16:33時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
ジャンプワイヤーもブレッドボードを使う場合にはあったほうがよい。
あとはマイコンボード用MicroUSBケーブル、そのUSBケーブルに給電するためのUSBアダプターなどは手持ちのものがあればそれでよい。
ここまで調べてみると実際には1000円で収まらなさそうだが、手持ちの部品とAliExpressで買った安いものとを組み合わせて実際に1000円程度で実現したはず。
ソフトウェア
マイコンボード側
ドライブレコーダーの首振り化のときに紹介したArduinoIDEという開発環境が無料で入手可能なのでそれを使う。っていうかほかに知らない。
パソコンにインストールして使う。
インストール方法とか設定もろもろについてはもっと親切に説明しているサイトを参照してほしい。たとえばここ↓
はじめてマイコン・ボードArduinoを使ってみる(2) | 電子工作(MAKE)
スマホ側
スマホ側ではスマートロック化計画の記事で紹介したBlynkというアプリをインストールして画面上にボタンを配置してコントローラーのように使う。これは便利なアプリだ。
前に公開したBlynk設定記事のここらへんを参照して部品を配置すればできると思う。
そしたらあとはスマホの画面に以下のように部品を配置しよう。
▼左が部品を適当に並べたところ。上にジョイスティック、下にボタン。右画面がジョイスティックのプロパティ。水平方向がV0、垂直方向をV1としている。それぞれの数値範囲はサーボの回転角度と同じく0~180にした。
▼そしてこちらがボタンのプロパティ。V2としている。
実現方法
ドライブレコーダー首振りの応用
プログラムのアルゴリズムとしてはドライブレコーダー首振りのときのまんま応用であるが、ただし今回は無線よる操作なのでそこのところが違う。
しかもマイコンボードが全然違うからほぼ違うプログラムになってしまう。
ESP8266マイコンボードそもそも認識しない
この認識しない→認識させるという工程だけで1ヶ月以上かかったのではないか。
なにが悪いんだかわからないが俺の持ってるWindowsパソコンでは挿すと「ピポン」とWindowsがなにか刺さったよと知らせるがデバイスマネージャーで見ても不明なままでArduinoIDEアプリでもシリアルデバイスとして認識していなかった。
そもそもシリアルデバイスとして認識させるにはシリアル変換ドライバーなる基板かなにかを1個噛ませなければ駄目なのか?と思って買おうかと思ったが限りなく散財ループに陥りそうだからやめた。
で、会社のパソコンにつないでみたら認識した。
それなら家のでもできるはずとやってみてもだめ。
最終的には「ESP8266 ドライバー」とかってキーワードで検索してそれらしいドライバーをネット上でみつけて入れてみたら認識したっぽい。
その前後にもいろいろやっていたからどれが奏功したのか実際には不明。
一応リンク貼っとく。
ESP8266 – WeMOS D1 mini – ch340
▼上記サイトのここのhereをクリックするとドライバーがあったはず
▼ここ
配線方法
ピン配置はAliExpressの販売サイトから失敬する。これの一番内側の列、例えば右列だったらGPIO16,GPIO5,GPIO4,GPIO0,GPIO2とかって並んでるところを参照する。
つなげ方は以下の通り。配線図とかかけないので写真と説明のみだがご容赦願いたい。
ピン番号 | 対応する線 |
GPI01 | サーボ1の信号線 |
GPI05 | サーボ2の信号線 |
補助電源基板の+ | サーボ2個の赤線 |
補助電源基板のー | サーボ2個の茶色線 |
プログラムコード
完コピするのは全然構わないが、巧く動かなくても責任は取れません。
// 参考サイト↓
// https://blog.livedoor.jp/tureduremake/archives/11487912.html
// blynkからボタン押してサーボ複数動かすの成功!!2021/11/25
#include <servo.h>
#include <blynksimpleesp8266.h>
#include <esp8266wifi.h>
#define BLYNK_PRINT SwSerial
Servo servo1;
Servo servo2;
char auth[] = "Your TOKEN "; //←←←←←←ここ変える
char ssid[] = "YOUR SSID"; //←←←←←←ここ変える
char pass[] = "YOUR Wi-Fi PASSWORD";//←←←←←←ここ変える
int vangle = 90;//垂直方向の現在角度保持用
int hangle = 90;//水平方向の現在角度保持用
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("Now try to connect Blynk ");
delay(500);
Blynk.begin(auth, ssid, pass); //Wi-Fi接続とともにBlynkにも接続してるみたい
//接続できたとき
//Serial.println("Blynk Connected!");
servo1.attach(1,500,2400); //水平サーボ指定
servo2.attach(5,500,2400); //垂直
servo1.write(hangle); //サーボを初期値中央に戻す
delay(500);
servo2.write(vangle); //サーボを初期値中央に戻す
delay(500);
}
BLYNK_WRITE(V0){ //BlynkアプリでV0パラメータが変化したとき水平サーボを動かす
Serial.print("hangle ");
Serial.println(hangle);
//以下条件で120を超えまたは60未満というのは
//ジョイスティックの小さな動きには反応させないように
//しきい値にしている(V1の処理もおなじ)
if(param.asInt() > 120){
if(hangle <= 180){
hangle += 2;
servo1.write(hangle);
delay(200);
}
}else if (param.asInt() < 60){
if(hangle >= 0){
hangle -= 2;
servo1.write(hangle);
delay(200);
}
}
}
BLYNK_WRITE(V1){ //垂直
Serial.print("vangle ");
Serial.println(vangle);
if(param.asInt() > 120){
if(vangle <= 110){
vangle += 2;
servo2.write(vangle);
delay(200);
}
}else if (param.asInt() < 60){ if(vangle >= 60){
vangle -= 2;
servo2.write(vangle);
delay(200);
}
}
}
BLYNK_WRITE(V2){ //中央に戻るボタンの処理
if(vangle > 90){ //垂直
for(int i = vangle;i>90;i-=2){
servo2.write(i);
delay(100);
}
}else{
for(int i = vangle;i<=91;i+=2){ servo2.write(i); delay(100); } } vangle = 90; if(hangle > 90){//水平
for(int i = hangle;i>90;i-=2){
servo1.write(i);
delay(100);
}
}else{
for(int i = hangle;i<=91;i+=2){
servo1.write(i);
delay(100);
}
}
hangle = 90;
}
void loop()
{
Blynk.run();
}
プログラムコードに関していくつか注意点と気づいた点
- Serial.printとかSerial.Printlnとかっていうのでシリアルモニターに出力しようとしているけどなぜか表示されない。
- サーボを動かすのに角度指定すると同時に内部でも角度を変数で持つようにしている。じゃないと今どこまで行っているのかわからなくなるから。
- 水平サーボをを1番で1番PIN、垂直サーボを2番で5番PINに設定しているが別のPINに設定しても可だとおもう。もちろんそのときは実際の配線も変えること。
- Blynkのライブラリを使っているがWi-Fiに接続するのにWi-Fi接続命令ではなくBlynk接続命令:Blynk.begin(auth, ssid, pass)というやり方なのだと知った。奥が深い。
- もしなにか質問があればツイートしてくれれば気づくかもしれないし気づかないかもしれない。こちらも素人だからやたら質問受けられない。
さいごに
最近のマイブームでいくつかのプログラムに挑戦しているが、Python、ArduinoIDE、Linuxのシェルだとかやってみて今回のプログラムはCによく似ているのでCに関しては経験済みだから比較的馴染みやすい。
しかもライブラリが豊富だからサーボの制御もかんたんなんだ。
近日中にまたサーボを制御して洗面所に取り付けたサーキュレーターを浴室に向けて時間設定で動かして乾燥させるというのをやりたい。
【追記】やった。