2018年6月27日水曜日

M5Stack m5cloud を試してみた。その3

ちょっとしたテストも兼ねて HTTP にて Google のホームページの読み込みを行ったあと、何かボタンを押すまで待ち、5秒毎に内蔵の磁気センサーを読んで10回分をまとめて Ambient に送信するコードを書きました。

センサーを読んでクラウドに送ると言った基本的な部分は抑えられたかと思います。

from machine import I2C, Pin
import machine, utime, time
from m5stack import lcd
import urequests
from mpu9250 import MPU9250
import ambient

def format(n, length):
    n = int(n)
    n = str(n)
    l = len(n)
    if l < length:
        n = " " * (length - l) + n
    return n    

def isPushAnyKey():
    if buttonA.isPressed():
        return True
    if buttonB.isPressed():
        return True
    if buttonC.isPressed():
        return True
    return False

def push_any_key():
    lcd.print("Push Any Key.¥n")
    while not isPushAnyKey():
        utime.sleep(0.01)

def lcdPrintln(str):
    print(str)
    lcd.print(str + "\n")

# Fit watch
rtc = machine.RTC()
lcdPrintln("Synchronize time from NTP server ...")
rtc.ntp_sync(server="ntp.nict.jp", tz='JST-9')


# init LCD
lcd.clear()
lcd.setBrightness(200)
lcd.font(lcd.FONT_Default)
lcd.setCursor(0, 0)
lcd.setColor(lcd.WHITE)

# get google 
lcdPrintln("get http://www.google.com")
response = urequests.get("http://www.google.com")
lcdPrintln("status: " + str(response.status_code))
#print(response.text)
push_any_key()

# read gyro
lcd.clear()
lcd.setCursor(0, 0)

am = ambient.Ambient(チャンネルID, "ライトコード")

i2c = I2C(scl=Pin(22), sda=Pin(21))
imu = MPU9250(i2c)
while True:
    data = []
    lcd.clear()
    while len(data) < 10:
        g = imu.magnetic
        x = format(g[0], 6)
        y = format(g[1], 6)
        z = format(g[2], 6)
        lcdPrintln(x + " " + y + " " + z)
    
        dt = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        data.append({"created": dt, "d1": g[0], "d2": g[1], "d3": g[2]})

        utime.sleep(5)
    
    r = am.send(data)
    lcdPrintln("http-status: " + str(r.status_code))


このコード特に問題ないように見えますが、延々と走らせておくと Ambient オブジェクト内でエラーを起こしてプログラムが停止してしまいます。このままでは実用にならないので、自前サーバーを立てることにします。

ちょっと話がそれますが、m5cloud を使わずにオフラインでの開発方法について備忘録。

1. アップロードツールのインストール

$ sudo pip install adafruit-ampy

2. ソースコードのアップロード方法

$ ampy -p /dev/ttyUSB0 put ./flash/main.py /flash/main.py

この方法だと、デバッグ情報などを見るシリアル通信と交互に行う、言い換えるとファイルをアップロードするたびにシリアル接続を切断して、アップロード後につなぎ直すというとてもめんどくさいことになります。

しかし、m5cloudのソースエディタは最少機能なので Visual Studio Code などの使いやすいエディタが使いたいです。なので、ソースの編集は Visual Studio Code で行い、ソースをまるごと m5cloud の IDE にコピペして m5cloud から実機にアップロードというやり方が良い気がします。

0 件のコメント: