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』でした。

結果

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です