はじめに
この記事はM5Stack Advent Calendar 2018の11日目の記事です。
個人的に予定が間に合わず、実際に公開する日は12/12になってしまいました。すいません。
今回M5StackのモジュールであるSmart Nodeを購入したので、それを使ってみたという話です。
M5Stackとは
簡単に説明すると、Wi-FiとBLEとディスプレイとMicroSDスロットとボタンとバッテリーなどが入っている 5000円程度のマイクロコントローラで、Arduino IDEを使って開発ができます。
アドベントカレンダーなので、ここでは詳しい説明は省略させていただきます。下記など参照ください。
Switch Science - M5Stackであそぼう
色々搭載されているので、本体だけでも面白いものが作れるのですが、ユーザーが拡張できるようになっています。
2018年に日本に入ってきてから、毎月のようにどんどん拡張モジュールなどが発売されています。
500-2000円ほどお金を出せば、人感センサーやGPSや温度センサーなどが使えるようになります。
日本で購入する場合はSwitch-Scienceから、中国から直接購入する場合はAliExpressの公式ストアから購入できます。
自分は秋月やセンサーや部品なども色々接続して今まで勉強がてら作ってきました。
まず最初に作ったのがデジタル名刺
今,懇親会用に即席で名刺っぽい使い方できるアプリケーション作ってみた.
— 河原圭佑 / Keisuke KAWAHARA (@ktansai) 2018年7月3日
ボタンで表示切り替えられる.#M5Stack_UGjp pic.twitter.com/BYhwDCCVQW
それと、簡易測距計
夏休みの工作 第二弾
— 河原圭佑 / Keisuke KAWAHARA (@ktansai) 2018年8月13日
レーザー測距計 on M5stack
机の高さを0cmとして,センサーの下にものを置くとその高さを測ってくれる.
モレスキンは約14cmくらいなので精度はまぁまぁ#M5Stack pic.twitter.com/7oOkLDzgEj
今回買ったモジュール
そんな感じで、アイデアと部品さえ揃ってしまえば、デッサンをするように動くプロトタイプが作れるM5Stackですが、今回新しいモジュールを購入しました。
Smart Node module and FaceJoystick is available now: https://t.co/X5n25cJNuG #m5new pic.twitter.com/yoVLSM7SWR
— M5Stack (@M5Stack) 2018年10月30日
以下スペック。
- NeoPixel 12個
- マイク2つ,
- 赤外線LED4つ
- 赤外線受光部1つ
- バッテリー 500mAh
- スピーカー1つ
- 温度/湿度センサー(DHT12)
価格: 2000程度
今流行りのスマートスピーカーやスマートリモコンが自作できそうな拡張モジュールです。
これを買って、年内に色々スマートリモコンや自作スマートスピーカーなど作りたいなと思っていたのですが、なかなか時間が取れず、今回はNeoPixelの部分を使ってみました。
作りたいもの
自分は普段から集中力が持たない性格なので、作業をする時はポモドーロテクニックという25分作業して、5分作業を中断して休むという方法で集中力を保っています。
普段はiPhoneアプリか、Mac/PCのポモドーロタイマーのアプリで測って作業しているのですが、
- iPhoneやPCの画面をそのために使いたくない
- ちょうどよい感じにカスタマイズしたい
という思いがあり、自作ポモドーロタイマーを作りたいとつくづく思っていました。
最終的には、赤外線リモコンのパターンを Arduino IRremoteなどのライブラリを使って、部屋のライトを若干雰囲気を変えるとか、スマホに通知だけ送るとか、自分用Slackに活動記録として投げたいと思っています。
今回はこのタイマー表示部分をSmart nodeで作ってみました。
できたもの
m5stack smart node モジュールでタイマー pic.twitter.com/XO71wKQJRg
— 河原圭佑 / Keisuke KAWAHARA (@ktansai) 2018年12月12日
単純にSmart nodeのLEDのリングの部分を使って、時間がなんとなく分かるようになっています。
動画は短縮版の30秒です。
ソースコード
#include <NeoPixelBus.h>
#include <WiFi.h>
const uint16_t PixelCount = 12; // this example assumes 4 pixels, making it smaller will cause a failure
const uint8_t PixelPin = 15; // make sure to set this to the correct pin, ignored for Esp8266
#define colorSaturation 128
NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount, PixelPin);
RgbColor red(colorSaturation, 0, 0);
RgbColor blue(0, 0, colorSaturation);
RgbColor black(0);
float pomodoro_max_minutes = 25;
void LEDAnimation(RgbColor color){
for(int i = 0; i < 12; i++ ){
for(int j = 0; j < 12; j++ ){
strip.SetPixelColor(j, black);
}
strip.SetPixelColor(i, color);
strip.Show();
delay(100);
}
}
void setup()
{
Serial.begin(115200);
delay(2000);
Serial.println();
Serial.println("Initializing...");
Serial.flush();
// this resets all the neopixels to an off state
strip.Begin();
strip.Show();
LEDAnimation(blue);
Serial.println();
Serial.println("Running...");
timer_millis_start = millis();
for(int i = 0; i < 12; i++ ){
strip.SetPixelColor(i, black);
strip.Show();
}
}
void loop(){
float minutes = (float)(millis() - timer_millis_start ) / 1000 / 60;
int LED_number = minutes / (float)pomodoro_max_minutes * 12.0;
Serial.print(minutes);Serial.print(",");Serial.print(LED_number);Serial.print("\n");
if(minutes < pomodoro_max_minutes){
for(int i = 0; i < LED_number; i++ ){
strip.SetPixelColor(i, red);
strip.Show();
}
}
else{
while(true){
LEDAnimation(red);
}
}
delay(500);
}
本当はNTPで時刻取得などして、外部のサービスなどに記録するのを考えていたのですが、時間の関係でLEDの表示部分だけ実装して動いてる雰囲気だけ確認してみました。
Firebaseとかで、Webページから設定したり、タイマースタートしたり、活動記録見れたら面白いなと思っています。
今後、なにか思いついたらまた実装してみます。