前編:ここWi-Fi飛んでる?目に見えるデバイスをつくってみた
この企画は「その辺に飛んでいるWi-Fiの電波がどれくらいたくさん飛んでいるのかを肉眼で見て感じることができるデバイスを作ろう」という趣深い企画です。
デバイスを作るにあたって必要となる部品や技術内容については前編の記事で解説しておりますので、まだ読んでいない方はぜひ前編からご覧ください。
さあ、今回は前編で培ってきた技術を組み合わせて実際に作品を作っていきます。
完成イメージはこんなかんじでしたね。

機構部が「モータかソレノイド」となっているとこが優柔不断である
Wi-Fiマークをぴょんぴょんさせるにあたり、モータかソレノイドかを決めないと開発が進められないわけですが、今回はソレノイドを使うことにしました。
理由は「ただただ、ソレノイドを使いたかったから」です。
もうちょいマシな理由で選べよって思うかもしれませんが、趣味のものづくりに厳密な学術的根拠など必要ありません。自分の欲求を大事にしていきましょう。
作品本体をつくる
それでは、作品を作っていきましょう。
ホームセンターに行ったらちょうど良い感じの木の箱があったので、これをベースとして組み立てていこうと思います。

Wi-Fiマークをぴょんぴょんさせるのにちょうど良い感じな箱
次にバネを左右にスイングさせるための部品を3Dプリンタでさくっと作っていきましょう。
3Dプリンタで作った部品のSTLファイルは以下からダウンロードできますので、3Dプリンタをお持ちの方はどうぞご活用ください。
STLファイルダウンロードはこちら

3D-CAD(Fusion360)で部品をモデリングします

3Dプリンタを使って印刷するとこんなかんじです
アクチュエータにはプッシュソレノイドCBS0830(タカハ機工)を使います。
http://www.takaha.co.jp/SHOP/cbs0830.html

ソレノイドの先端にも3Dプリント部品を取り付けています

ソレノイドと3Dプリントした軸受け部品を土台に取り付けます

また別の部品にボールベアリングやバネを固定

ソレノイドを2個向かい合わせて設置

バネの先端にWi-Fiマークを取り付けます

前編の記事で使った回路を取り付ければ…
(電源はアルカリ乾電池8本になりました)
できた!

作品名『わいふぁいぴょんぴょん』
これで本体は完成しました!
続いて動作プログラムもつくっていきましょう。
動作プログラム
前編の記事で作ってきたWi-Fiのスキャンとモータドライバの制御のソースコードを統合して「Wi-Fiの電波を検知したらWi-Fiマークをピョンピョンさせる」動作を実装していきます。
今回作成したソースコードは以下のとおりです。
#include <M5Stack.h> | |
#include <WiFi.h> | |
#include <Grove_I2C_Motor_Driver.h> | |
#define I2C_ADDRESS 0x0f | |
int stateSymbol = 0; | |
void setup() { | |
Motor.begin(I2C_ADDRESS); | |
M5.begin(); //M5Stackオブジェクトの初期化 | |
M5.Lcd.print("START Wi-Fi PYONPYON"); | |
WiFi.mode(WIFI_STA); //STAモード(子機)として使用 | |
WiFi.disconnect(); //Wi-Fi切断 | |
delay(100); | |
} | |
void loop() { | |
int rssi; | |
int score; | |
rssi = scanRssi(); | |
score = getScore(rssi); | |
M5.Lcd.print("score : "); | |
M5.Lcd.println(score); | |
swingSymbol(score); | |
} | |
int scanRssi(void) { | |
M5.Lcd.fillScreen(BLACK); //LCDをクリア | |
M5.Lcd.setCursor(0, 0); //カーソル位置設定 | |
M5.Lcd.println("Scan..."); | |
long t1 = millis(); | |
int n = WiFi.scanNetworks(); //ネットワークをスキャンして数を取得 | |
long t2 = millis(); | |
long timeScan = t2 - t1; | |
int channel = WiFi.channel(0); | |
int rssi = WiFi.RSSI(0); | |
String ssid = WiFi.SSID(0); | |
M5.Lcd.fillScreen(BLACK); //LCDをクリア | |
M5.Lcd.setCursor(0, 0); //カーソル位置設定 | |
if (n == 0) { | |
//ネットワークが見つからないとき | |
M5.Lcd.println("NETWORKS NOT FOUND"); | |
return -1000; | |
} else { | |
//ネットワークが見つかったとき | |
M5.Lcd.print(n); | |
M5.Lcd.println(" NETWORKS FOUND\n"); | |
//チャンネルを表示 | |
M5.Lcd.print("CH : "); | |
M5.Lcd.println(channel); | |
//RSSI(受信信号の強度)を表示 | |
M5.Lcd.print("RSSI : "); | |
M5.Lcd.println(rssi); | |
//SSID(アクセスポイントの識別名)を表示 | |
M5.Lcd.print("SSID : "); | |
M5.Lcd.println(ssid); | |
//ネットワークスキャンにかかった時間を表示 | |
M5.Lcd.print("Scan time : "); | |
M5.Lcd.print(timeScan); | |
M5.Lcd.println("[ms]"); | |
delay(10); | |
return rssi; | |
} | |
} | |
int getScore(int rssi) { | |
int score; | |
if (-40 <= rssi && rssi < 0) { | |
score = 4; | |
} else if (-60 <= rssi && rssi < -40) { | |
score = 1; | |
} else { | |
score = 0; | |
} | |
return score; | |
} | |
void swingSymbol(int n) { | |
const int t = 300; | |
for (int i = 0; i < n; i++) { | |
int numberMotor = (stateSymbol == 0) ? MOTOR1 : MOTOR2; | |
Motor.speed(numberMotor, 100); | |
delay(t * 0.9); | |
Motor.speed(numberMotor, 0); | |
delay(t * 0.1); | |
stateSymbol = (stateSymbol + 1) % 2; | |
} | |
} |
大まかな動きとしては、
①Wi-FiをスキャンしてRSSI(受信信号の強度)を取得する → scanRssi()
②RSSIの大きさによってソレノイドを動かす回数を決定する → getScore(rssi)
③決定した回数分ソレノイドを動かす → swingSymbol(score)
の3つの処理を繰り返して行うというかんじです。
ソレノイドを動かす回数は、RSSIの大きさによって決定します。-40~0dB→4回、-60~-40dB→1回、-60dB以下→0回という具合にWi-Fiの電波が強いほどWi-Fiマークをより多い回数振ります。
動かしてみよう
それでは、わいふぁいぴょんぴょんのエレガントな動きをご覧ください。
このように、Wi-Fiが飛んでいるのを肉眼で見ることができちゃいます。
これで、実家で「Wi-Fiって何?」と聞かれても

ほら、なんかこの…ぴょんぴょんしてるやつだよ。ほら
自信を持ってわかりやすく伝えることができますね。
まとめ
今回の『わいふぁいぴょんぴょん』は「Wi-Fiが飛んでるのを見えるようにしたいなあ」という欲望からアイデアが生まれ、電子工作の技術によりそれを実現しました。
こういうアイデアって冗談や空想だけで終わっちゃうことがほとんどですが、「それ、作ったら面白いんじゃね?」「おっ、Arduinoで作れそうじゃん」というノリと勢いで作ってみると、楽しいものづくりができるのではないかと思います。
今回の連載の流れ
前編:ここWi-Fi飛んでる?目に見えるデバイスをつくってみた
後編:ここWi-Fi飛んでる?目に見えるデバイスをつくってみた(今回)