M5StickCで環境センサーの実行

はじめに

M5StickCに環境センサー(ENVⅡ)を設定し、動作を確認します。

  1. 必要なもの
  2. スケッチ
  3. 実行

 

1.必要なもの

M5StickCと環境センサーを使用します。環境センサーは温度、湿度、気圧、磁界センサを搭載しています。I2C通信でデータを取得します。ピン番号26がクロック、0番ピンがデータ用です。

ENVからENVⅡになり、温度/湿度センサーのDHT20がSHT30に変更されています。

番号

商品名

価格

参考販売店

1

M5StickC

1980円(セット)

1650円(本体のみ)

SwitchSience

2

ENV II Hat

836円

SwitchSience

 

2.スケッチ

arduino.exeを起動して、

[ファイル]⇒[スケッチ例]⇒[M5StickC]⇒[Hat]⇒[ENV]とスケッチを開くと

一つ前のENVのスケッチが開きます。今回はENVⅡを使用するのでそのまま使用できません。

ENVⅡから温度/湿度センサーがDHT12ではなくSHT30にかわっているので、新しくGitHubからサンプルを取得します。

以下のURLに行き、[Code]⇒[Download Zip]を実行するか、

git clone https://github.com/m5stack/M5-ProductExampleCodes をDOSプロンプトで実行します。

https://github.com/m5stack/M5-ProductExampleCodes

 

入手したフォルダM5-ProductExampleCodesからHatフォルダ→ENVⅡ_HATフォルダに移動するとENVⅡ_HAT.inoファイルがあるので、これをarduino.exeで開きます。

Adafruit_BMP280のライブラリが必要とスケッチの先頭に記載されています。

/*
note: need add library Adafruit_BMP280 from library manage
Github: https://github.com/adafruit/Adafruit_BMP280_Library
*/

ライブラリを追加するために[スケッチ]⇒[ライブラリをインクルード]⇒[ライブラリを管理]と選択し、ライブラリマネージャを開きます。

 

ライブラリマネージャを開いたらAdafruit_BMP280を検索しインストールを実行します。

関連ライブラリもインストールを行いますか?とメッセージが表示された場合は[Install all]を選択します。

 

3.実行

スケッチをM5StickCに書き込めば温度、湿度、気圧、磁界の向きが表示されました。

 

 

 

 

M5StickC+PuppyCをスマートフォンから動かす

はじめに

前回、既存のスケッチ例をもとにPuppyCを動かしてみました。今回はさらにスケッチを書き換えてスマートフォンから動作できるようにします。

  1. 必要なもの
  2. スケッチ
  3. 実行

 

1.必要なもの

M5StickCとPuppyCを用意ます。

番号

商品名

価格

参考販売店

1

M5StickC

1980円(セット)

1650円(本体のみ)

SwitchSience

2

PuppyC

2002円

SwitchSience


2.スケッチ

 

スマートフォンからM5StickCを呼び出す場合、M5StickCがサーバーに、スマートフォンがクライアントになります。

 

WiFiServer

M5StickCをサーバーに設定するにはWiFiServerクラスを使用します。

serverという名前でインスタンした例です。引数はポート番号です。HTTPで接続する場合はポート番号80が一般的であるため、80にしています。

(WebサーバのHTTPならポート番号は80、メール受信プロトコルPOP3ならポート番号110、メール送信はポート番号25と固定的に割り当てるのが一般的)

ポート番号を80ではなく1234などに設定(WiFiServer server(1234))したい場合、そのサーバーにアクセスするためにはwww.AAA.com:1234 のようにコロンとポート番号を記入する必要があります。

server.begin()

Webサーバーとして起動します。

server.available()

クライアント側からアクセスがあった場合に1を返します。この値を用いてクライアントとやり取りを行います。

 

WiFiClient

クライアントの処理を行うためのクラスです。サーバーにアクセス時に生成します。

 

 

client.connected()

クライアントと接続されている状態かどうかを表します。(接続1:切断:0)

 

client.available()

クライアントが書き込んだデータのバイト数を返します。

 

client.read()

クライアントからの情報を1バイトリードします。

 

client.println()

ASCIIテキストとして可読文字をクライアントに送信します。

 

htmlについて

クライアント側に表示するhtmlについて説明します。

 

HTTP/1.1 200 

200 はリクエストが成功した場合に返すレスポンスコードです。(204だとNo Content)

クライアントがサーバーにアクセスしたときに GET HTTP/1.1を送信します。それに対する応答です。

form

formは入力・送信フォームを作成する際に使用します。
<form>~</form>の間にボタンを作成します。
フォームに入力されたデータは、送信ボタンを押すことで送信され、サーバー側で処理が行われます。 

 

method

nethod属性はデータの送信方法(HTTPメソッド)を指定する際に指定します。 method属性の値として指定できるのは以下の2種類です。

  • get …… 送信内容がURLとして渡される(初期値)
  • post …… 本文(本体)として送信される

URLの後ろにクエスチョンマーク( ? )を付けて、それ以降続くにクエリとして送信先ページに渡されます。

今回はGET /? control=Forward(Back,Stop)となります。

 

input 

formを構成するためのタグです。type属性の値に”submit”を設定すると送信ボタンを作成します。name属性とvalue属性に設定した値がmethod属性で指定した送信方法で送られます。

 

HTTP/1.1 302

302リダイレクトとは、URL転送処理のうち,1時的な転送に用いられる処理のことです。ウェブサーバーは、ページの新しい場所を即座にブラウザーに通知してリダイレクトする必要があります。

 

マルチタスク

サーバーとクライアントのやり取りと同時にPuppyCを動作させるため、マルチタスクを使用します。xTaskCreatePinnedToCore関数を使用します。

  • pvTaskCode:loop()関数と並行して動作する関数名を記載します。

  • pcName:作成した関数のわかりやすい名前を記入します。

  • usStackDepth:バイト数として指定されたタスクスタックのサイズ。サイズは1024~8192で指定できます。

  • pvParameters:作成した関数の引数を指定します。ない場合はNULLを指定します。

  • uxPriority:実行する優先度を指定します。

  • pvCreatedTask:作成した関数を参照できるハンドラを返すために使用されます。変数はTaskHandle_t型で定義します。

  • xCoreID:値がtskNO_AFFINITYの場合、作成されたタスクはどのCPUにも固定されず、スケジューラーは使用可能な任意のコアで実行できます。値0または1は、CPUのインデックス番号を示します。M5StickCはドュアルコアなので、0、1が設定可能です。

スケッチ例のPuppyCを変更したスケッチは以下になります。

 

 

3.実行

スケッチをM5StickCに書き込みます。スマホでネットワークを確認すると、ssidで設定した名前(ここではm5stickcに設定)が表示されます。

クリックしてアクセスします。パスワードはpassで指定した内容です。

次にブラウザを起動して const IPAddress ip で設定したipアドレスを入力します。

ブラウザに表示されている「Forward」を押すと前進、「Stop」で停止、「Back」で後ろに下がります。

 

 

M5StickCでPuppyCを動かす

はじめに

PuppyCにM5StickCを接続して動かしてみます。

  1. 必要なもの
  2. スケッチ例
  3. 実行

 

1.必要なもの

M5SticKCとPuppyCが必要です。

番号

商品名

価格

参考販売店

1

M5StickC

1980円(セット)

1650円(本体のみ)

SwitchSience

2

PuppyC

2002円

SwitchSience

PuppyCはM5StickC用の四脚ロボットベースです。

 

長方形の箱に入っていますが、半分はクッションです。

 


2.PuppyCの動作確認

PuppyCの動作確認はスケッチ例の中にある「PuppyC」で確認します。

[ファイル]⇒[スケッチ例]⇒[M5StickC]⇒[HAT]⇒[PuppyC]でスケッチを書き込みます。

ソースコードを見ると、puppy.hがインクルードされています。これはpuppuy.cppで作成した関数 IIC_Init()、angle_all_set、angle_setを使用するためです。

初期化用の関数IIC_Init()はpuppy.cppで定義されています。WireはI2Cとの通信を可能にするために必要なライブラリです。beginで接続します。第1引数はデータを送受信するためのポート名、第2引数はクロックに使用するポート名、第3引数は周波数(100は100kbit/s)です。

GitHubにあるESP32のWire.hを見るとデフォルト値は以下のように設定されています。

angle_all_setは4つのサーボモーターすべての動作位置を指定、angle_setは個々のサーボモーターの動作位置を決定するのに使用します。

Wire.beginTransmission(SERVO_ADDRESS)でサーボ―モータを動かすためのアドレスを設定します。このあと、Wire.Write()でデータを送信したのち、Wire.endTransmission()で通信を終了します。angle_all_setは第1引数からサーボモーターの1番、2番、3番、4番に割り振られています。設定する値は角度(angle )を表しています。値に90と記述すると90°を意味し、サーボモーターが地面と垂直になっている状態です。

angle_all_setが全体のサーボモーターに設定しているのに対して、angle_setは個別にサーボモーターを設定することができます。内部で使用している関数はangle_all_setと同様です。

PuppyCではangle_all_setを使用して前に進むための関数puppy_startと後ろに進むための関数puppy_backを作成しています。

サーボモーターの1番は左前足、2番は右の後足、3番が左の後足、4番が右の前足となっています。

 

 

3.実行

M5StickCをPuppyCの上に載せ、実行すると前に後ろにと交互に動きます。PuppyCの後ろのスイッチをONにしないと書き込みを行っても動作しないので、注意が必要です。スイッチが付いている方が後ろのようです。

 

参考

ESP32データシート