スキップしてメイン コンテンツに移動

M5StickC Plus 応用編2 <WiFi +フルカラーLED>

 こちらの記事の続きになります。

前回最後に書いた通り、WiFiなどと連携してフルカラーLEDを制御していきたいと思います。

前提条件

前回記事の続きなので

  • 部品
  • 回路

に関しては同じものを使用します。

試す方はそちらに書いてある通りに回路を組んでおいてください。

プログラムと動作内容

#include <M5StickCPlus.h>
#include <WebServer.h>

int r_pin = 0;
int g_pin = 25;
int b_pin = 26;
double hz = 12000.0; //周波数
uint8_t bit = 8;     //分解能

////IPアドレス固定用
IPAddress ip(192, 168, ***, ***); //ip
IPAddress subnet(255, 255, 255, 0);
////
const char* ssid = "**********";
const char* password = "**********";
WebServer server(80);

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(1);
  M5.Lcd.println("Connecting to");
  M5.Lcd.println(ssid);
  WiFi.config(ip, ip, subnet);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.println("");
  M5.Lcd.println("WiFi connected.");
  M5.Lcd.println("IP address");
  M5.Lcd.println(WiFi.localIP());

  server.on("/", [](){ 
    String message = "Hello World <br>";
    if(server.args() > 0){
      message += "paramater is <br>";
      for(int i = 0; i < server.args(); i++){
        String argName = server.argName(i);
        String arg = server.arg(i);
        message += argName + ": " + arg + "<br>";
      }
    }
    server.send(200, "text/html",  message);
  });

  server.on("/setColor", [](){ 
    if(server.args() > 0){
      for(int i = 0; i < server.args(); i++){
        String argName = server.argName(i);
        String arg = server.arg(i);
        if(argName == "r"){
          ledcWrite(0, arg.toInt());
        }
        if(argName == "g"){
          ledcWrite(1, arg.toInt());
        }
        if(argName == "b"){
          ledcWrite(2, arg.toInt());
        }
      }
    }
    server.send(200, "text/html", "OK");
  }); 

  server.begin();

  pinMode(r_pin, OUTPUT);
  pinMode(g_pin, OUTPUT);
  pinMode(b_pin, OUTPUT);

  ledcSetup(0, hz, bit);
  ledcSetup(1, hz, bit);
  ledcSetup(2, hz, bit);
  
  ledcAttachPin(r_pin, 0);
  ledcAttachPin(g_pin, 1);
  ledcAttachPin(b_pin, 2);

  ledcWrite(0, 256);
  ledcWrite(1, 256);
  ledcWrite(2, 256);

}

void loop() {
    server.handleClient();
}

まずは、各自で実行できるように書き換える必要があります。

////IPアドレス固定用
IPAddress ip(192, 168, ***, ***); //ip
IPAddress subnet(255, 255, 255, 0);
////

固定したいIPアドレスになるように***を書き変えておいてください。

特に固定したくないという方は、

IPAddress ip(192, 168, ***, ***); //ip

IPAddress subnet(255, 255, 255, 0);

WiFi.config(ip, ip, subnet);

これら3行を見つけてコメントアウトしてください。

次に、

const char* ssid = "**********";          //各自の環境で使っているWiFiの名前に書き変えてください
const char* password = "*********";  //各自の環境で使っているWiFiのパスワードに書き変えてください 

**********の部分を消してそれぞれコメントで書かれている内容に書き変えてください。

その後、M5StickC Plusに書き込むことで動作します。

  • 注意:書き込み時にフルカラーLEDが赤く光ると思います。これはGPIO0をブートモードの切り替えなど、内部の構造と仕様によって起こることなので気にしないでください。記事内で紹介された範囲では起こりませんが、GPIO0の使い方によっては正常に動作しないことがあるので注意しましょう。参考サイトを以下に載せておきます。

trac.switch-science.com

動作確認はM5StickC PlusのLCDで確認できます。

SSIDIPアドレスが赤線で隠されていますが、各環境で違ったものが表示されると思います。

これが表示されればここまではOKです。

そしたら同じWiFiに接続されているPCやスマートフォンのブラウザからLCDの最後に書かれているIPアドレスにアクセスしてみましょう。

http://192.168.***.***

***LCDに表示されたものに書き変えてアクセスしてみてください。

そうすると、ブラウザ(Chrome)で以下のように表示されると思います。

こうなっていれば完璧に動作していることがわかります。

次に同じように以下にアクセスしてみましょう。

http://192.168.***.***/?r=256&g=0&b=0

こうなると思います。

一つ前にアクセスした時のURLに

/?r=256&g=0&b=0

が足されたことによって文字が追加されました。

paramater is
r: 256
g: 0
b: 0

URLにクエリストリングが追加されるとそのすべてを返してくれます。

クエリストリングを認識できていることが確認できます。

最後に前回の記事通りにフルカラーLEDが接続できていることを確認して以下にアクセスしてみましょう。

http://192.168.***.***/setColor?r=256&g=0&b=0

そうすると、接続されているフルカラーLEDが光ると思います。

今回は/setColorというURIにアクセスしているため処理が変わります。

パラメータ名に設定されているのはrgbの三つでそれぞれの色に対応しています。

それぞれのパラメータに設定してLEDの変化が得られるのは0~256の数字になります。

これはPWM出力で設定した8bitの分解能で表現できる値の幅になります。

パラメータで設定した値がそのままPWM出力になるように処理しているからです。

なのでそれぞれのパラメータの値を0~256の間で変化させてアクセスしなおすとLEDの色が変わるので試してみてください。

以上でプログラムの動作内容になります。

プログラムの重要な箇所

以下で説明する箇所以外は前回と変わっていなかったり、WiFiへのアクセスやそれらの設定、LCDへの表示が主なものなので説明は省きます。

http://192.168.***.***

http://192.168.***.***/?r=256&g=0&b=0

にアクセスしたときの動作として設定しているのが以下になります。

  server.on("/", [](){ 
    String message = "Hello World <br>";
    if(server.args() > 0){
      message += "paramater is <br>";
      for(int i = 0; i < server.args(); i++){
        String argName = server.argName(i);
        String arg = server.arg(i);
        message += argName + ": " + arg + "<br>";
      }
    }
    server.send(200, "text/html",  message);
  });

"/"にアクセスした場合はHello Worldと表示した後

if(server.args() > 0)でクエリストリングがあるか否かを判断し、あった場合にはそれらすべてを表示する処理になります。

次に

http://192.168.***.***/setColor?r=256&g=0&b=0

にアクセスしたときの動作として設定しているのが以下になります。

  server.on("/setColor", [](){ 
    if(server.args() > 0){
      for(int i = 0; i < server.args(); i++){
        String argName = server.argName(i);
        String arg = server.arg(i);
        if(argName == "r"){
          ledcWrite(0, arg.toInt());
        }
        if(argName == "g"){
          ledcWrite(1, arg.toInt());
        }
        if(argName == "b"){
          ledcWrite(2, arg.toInt());
        }
      }
    }
    server.send(200, "text/html", "OK");
  }); 

"/setColor"にアクセスした場合はOKと表示した後

フルカラーLEDに出力するPWMの値をクエリストリングから取得して出力しています。

これらのように

server.onの第一引数に好きなURI名を設定して第二引数にアクセスしたときの処理を記述することによってさまざまな動作をさせることが出来ます。

server.on("/", [](){ 
    //処理を書く
  }); 

例えば

  server.on("/purple", [](){ 
    ledcWrite(0, 0);
    ledcWrite(1, 256);
    ledcWrite(2, 0);
    server.send(200, "text/html", "purple");
  }); 

これを同じようにsetup関数内に追記して

http://192.168.***.***/purple

にアクセスするとLEDが紫に点灯することがわかります。

これにserver.argNameserver.argなどを組み合わせることでいろいろなs処理が出来るので試してみましょう。

まとめ

  • esp8266と比べるとWiFiへのアクセス速度がかなり速いことが体感できた。
  • GROVEに使われているピン2本も応用して使えそう(タッチセンサとして使えるかなど試してみたい)
  • 親指サイズでサーバとして動作してバッテリや6軸センサ、GPIOが使えるのでいろいろ応用できそう

コメント

このブログの人気の投稿

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その2

前回の記事 に引き続きPhaser3+Typescriptを使って RPG の基礎を作っていきます。 この記事は前回の記事を呼んだ前提で説明していきますので、ぜひそちらを先に読むことをお勧めします。 また、今回の記事は前回よりも難易度と内容量が上がっていますが、記事の最後に作業後の リポジトリ のリンクがありますので、そちらを先にダウンロードしてそちらと比較しながら学習することができます。 前回まで作成した状態のプログラムが以下の リポジトリ からダウンロードできますので前回まででうまくいっていない方は参考にしてみてください。 github.com 最終目標(再掲) ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・ゲームの作り方の断片を知る ・キャラの表示できるようにする ・キャラを移動できるようにする ・当たり判定をつける ・ NPC の追加してみる ・話しかけられるようにする 開発前提(再掲) ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール(再掲) ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 当ブログ仕様の画像素材の注意点 当ブログで使用する画像素材は『 ピポヤ倉庫 』より許可なしで無償再配布・改変が認められたものを改変して作成されたものです。 中には許可なく再配布・改変してはいけない素材もインターネット上には多く存在するのでそれらを使用するときは十分に規約を呼んでから使用しましょう。 1. キャラの表示 想定画面 今回は、はじめにキャラつまり操作

M5Stackで、においセンサー(TGS2450)を使ってみる。(LCDに表示編)

今回は、においセンサー(TGS2450)から取得したデータをM5Stackの LCD にグラフ表示をしていきます。 今回主に使用したもの M5Stack 10Ω抵抗 5本 Pch  MOSFET  2SJ334(スイッチとして利用) M5StackSideBB(ブレッドボード) M5Stackのピンはそのままだと配線するとき手間がかかるかと思いますので、今回はM5StackSideBBを利用しました。 ブレッドボードも付いているので、手軽に電子工作できるので個人的にオススメです。 SideBB for M5Stack www.switch-science.com 諸注意 本ブログのプログラムはArduinoIDEまたはPlatformIOでM5Stackの開発ができる状態であること前提のものですので、各自導入をお願いします。 過去に Windows のArduinoIDEで M5Stackの開発環境を構築する記事 があるので、参考にしてください。 においセンサー(TGS2450)について 今回使用したセンサーは 秋月電子通商 で購入できます。 http://akizukidenshi.com/catalog/g/gP-00989/ akizukidenshi.com TGS2450には4つのピンがあり、使用するのはそのうちの3本でヒーターを温めるピン、センサー情報を得るピン、GNDがあります。 ここで注意したいのは、ヒーター電圧は1.6Vと記述されているのでM5Stackで利用するときは分圧して3.3Vを1.6V近くまでに降圧することをお勧めします。 TGS2450のセンサーは可変抵抗になっており、データシートには5.62kΩ〜56.2kΩの間を抵抗が変化し、においが強いとより低くなると記述されていました。 よって、センサーの値をM5Stackで取得するにはセンサー抵抗と外部に接続する任意の値の抵抗による分圧回路によって求めることができます。 TGS2450の動作方法は、250ms周期でセンサーに電圧を5ミリ秒on、245ミリ秒offの状態にしてヒーターは8ミリ秒on、242ミリ秒offにすることで値を取得します。 配線 においセンサーとM5Stackの配線 上の図が配線図です。 30Ωの抵抗は10Ωの抵抗を三つ直列に接続して作成しました。 また、上部の抵抗10Ω二

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その1

今回はPhaser3とTypescriptを使って簡単な RPG ゲームを作る方法を紹介していきます。 内容はPhaser3およびゲーム作りについての記事なので、Nodejsの周辺モジュールなどの説明は一部省いての説明になりますのでご了承ください。 またこの記事では Phaser2 ではなく Phaser3 を使用するので注意してください。 この記事は二部構成になりますので、この記事を読んだ際はぜひ次の記事も読むことをお勧めします。 最終目標 ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・開発環境を整える ・Phaser3の開発構成を知る ・スタート画面を作る ・マップ表示をさせる 開発前提 ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 1. 最低限の開発環境の準備 今回最低限の環境を整えるために、『Typescript + Phaser3』の開発テンプレートを github リポジトリ で公開しました。 以下からZIPをダウンロードするか、 git clone コマンドで各自環境に展開してみてください。 ここから先は リポジトリ のプログラムを元に説明していきます。 github.com 展開するとファイル構造は以下のようになっているかと思われます。 注: 他にもファイルやフォルダがあるかと思われますが、表記されているのは今回使うものになっています。 - src/ (これから書くプログラムの保存領域)