IoT+WEBのためのホームサーバ計画の実装編13。M5STACKに情報を表示させる。
M5STACKなんかスゲー(o^^o)
ホームサーバは基本的にRaspberryPiがあるだけなので、なんら表示機能をもちません。
もちろんLCDなんかでやろうと思ってました。
でも、もうちょっと手軽に、テストとかデバッグの意味合いを含めると、
2行のLCDじゃぁちょっと足りないし、、、
なんてことを考えていたときに、、
あ、、なんだ!M5STACKあるじゃん!
っと思った次第です。
しかも、M5StickCであれば、色々含めると、LCDと金額的にも大差ないし。
とは言え、ひとつのハコにスマートに入れたいので、
最終的にはLCDもつけるつもりではいますけどねぇー。
M5STACKとは何でつなげるかってシリアルでしょ
そう、気軽にという観点で言えば、USBでのシリアル接続が一番気軽なわけで。
ということで、シリアルで受け取って表示させてみましょ。
まずは、スケッチから。
ここでは、ScrollTextWindowというのを使って、スクロールできるようにしときます。
#include <M5Stack.h>
#include <stdio.h>
#include "ScrollTextWindow.h"
//-----------------------------------------------
ScrollTextWindow* pS = 0;
//-----------------------------------------------
void setup(){
M5.begin();
M5.Power.begin();
M5.Lcd.setTextSize(2);//26col 15row
Serial.begin(19200);
pS = new ScrollTextWindow(20,20,BLACK,12,16);
ScrollTextWindow& S = *pS;
M5.Lcd.setTextColor(WHITE, NAVY);
M5.Lcd.drawString(" *FINRED IoT Web world! ",0,0);
M5.Lcd.drawString(" by Hiraide ", 0, 224);
M5.Lcd.setTextColor(ORANGE, BLACK);
S.cls();
S.print("Ready.\r\n");
}
//-----------------------------------------------
void loop() {
ScrollTextWindow& S = *pS;
if ( Serial.available() > 0 ) {
try{
String str = Serial.readStringUntil('\n');
S.print(str);
S.print("\r\n");
}catch(...){
S.print("CATCH EXCEPTION!\r\n");
}
}
delay(100);
}
//-----------------------------------------------
Serialで受け取って、それを表示させてるだけですね。
PythonでM5のSerialを叩く
まぁいくつか注意点はありますが、とりあえずこんな感じで。
#pip install pyserial
import socket
import time
import serial
import serial.tools.list_ports
class hiraM5Serial:
#---------------------------------------------
bou = 19200
ser = None
use_port = None
#---------------------------------------------
#
#---------------------------------------------
def uart_write_read(self,w_data, r_size):
ser.write(w_data) # Write
print('SSend: '+ str(w_data))
r_data = ser.read_until(size=r_size) # Read
print('SRecv: ' + str(r_data))
return r_data
#---------------------------------------------
# 有効なM5-COMポートを自動的に探して返す
#---------------------------------------------
def search(self):
coms = serial.tools.list_ports.comports()
comlist = []
for com in coms:
comlist.append(com.device)
if str(com[1]).startswith("Silicon Labs CP210x USB to UART Bridge"):
self.use_port = com
return True
return False
#---------------------------------------------
# 接続
#---------------------------------------------
def connect(self):
print("self.use_port",self.use_port)
print("self.bou",self.bou)
self.ser = serial.Serial(self.use_port[0], self.bou)
#---------------------------------------------
def write(self,data):
data = data + "\n"
#self.ser.write(data) # 出力
self.ser.write(str(data).encode('utf-8')) # 出力
#---------------------------------------------
def writeRead(self,data,r_size):
self.ser.write(data)
r_data = ser.read_until(size=r_size) # Read
return r_data
#---------------------------------------------
if __name__ == '__main__':
a = hiraM5Serial()
if a.search():
a.connect()
time.sleep(1)
TPL = socket.gethostbyname_ex(socket.gethostname())
a.write("finred serial monitor\nto M5STACK")
a.write("-----------------")
ips = TPL[2]
n = len(ips)
for w in range(n):
a.write(ips[w])
a.write("-----------------")
a.write("happy?")
time.sleep(60)#Pythonが終了すると、M5STACKも再起動される。
気を付けるところが、ホンのちょっとだけ。
serial.tools.list_ports.comports()
ってのを実行すると、まぁ実行可能なCOMポートを見つけてくれるのですが、
これやると、M5STACKが再起動される
ということに遭遇しました。
まぁ大して影響無いんですけどね。
※追記:これはWindows環境の時だけの模様。^^;
あとは、名称として、『Silicon Labs CP210x USB to UART Bridge』かどうかで判断してます。
本来は、なんかコマンド送って、それに対するRESPONSEで判断すべきところですけどね。
※追記:RaspberryPiでは『CP2104 USB to UART Bridge Controller』でした。
結果