ラズパイのデータをM5Stack画面に表示

ゴール設定(M5stackの画面にデータを表示する)

ラズパイ(Raspberry Pi)で取得した温度データ、距離センサデータなどをM5stackの画面に表示したい。M5stackにはWifi通信機能が付いているが、今回のデータ通信は、あえてシリアル通信とする。M5stackのボタンを押してテキストでコマンドをラズパイに送信すると、ラズパイからM5stackに数値データが返信されてくるというスクリプトを書く。

事前準備(データ通信のコマンドを決める)

M5stackの画面に表示するデータをラズパイから送信したい。M5stackのボタン3つに音波距離センサーの’Sonic’や’Date’、’Time’というテキストを送信するスクリプトを割り当てする。ラズパイはそれらのテキストを受信したら、対応するスクリプトを実行して結果をM5stackへ送信する。M5stackはループ処理でデータ受信を調べ、ラズパイはデータ受信を割り込み処理で受け付ける。

配線図

準備(ラズパイ側のスクリプト)

最初に[ttyAMA0]を無効にしておくこと。

$ sudo systemctl status serial-getty@ttyAMA0.service
$ sudo systemctl stop serial-getty@ttyAMA0.service
$ sudo systemctl disable serial-getty@ttyAMA0.service
  

pythonで書いたラズパイ側のスクリプト。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import serial
import threading
import datetime
import time
import wiringpi as pi


serCom = serial.Serial('/dev/ttyAMA0', 115200, timeout = 1 )

class serialRead():

    def __init__(self):
        self.threadRead = threading.Thread( target = self.target )
        self.threadRead.start()

    def target(self):
        flag=True
        while flag:
            if( serCom.inWaiting() > 0 ):
                strC = serCom.read( serCom.inWaiting() )
                print( "[%s]" % strC )
                if( strC == "Sonic"):
                    num = 0
                    while num < 10:
                        num = num + 1
                        strDistance = mesure()
                        serCom.write( strDistance )
                        print( strDistance )
                        time.sleep(1.0)

                if( strC == "Date" ):
                    objDate = datetime.date.today()
                    strDate = objDate.strftime("%Y/%m/%d")
                    serCom.write(strDate)
                    print(strDate)

                if( strC == "Time"):
                    objTime = datetime.datetime.now()
                    strTime = objTime.strftime("%H:%M:%S")
                    serCom.write(strTime)
                    print(strTime)

    def quit(self):
        flag=False

def main():
    print( "Start reading..." , serCom.portstr )
    while True:
        try:
            strA = raw_input("send: ")
            serCom.write( strA )
            print( "[%s] sent" % strA )
            if( strA == "exit" ):
                serCom.close()
                threadRead.quit()
                exit()
        except:
            serCom.close()
            threadRead.quit()
            exit()

def sonicInit():
    global TRIG_PIN
    global ECHO_PIN
    global pi
    TRIG_PIN = 18
    ECHO_PIN = 17
    pi.wiringPiSetupGpio()
    pi.pinMode( TRIG_PIN, pi.OUTPUT )
    pi.pinMode( ECHO_PIN, pi.INPUT )
    pi.digitalWrite( TRIG_PIN, pi.LOW )

def mesure():
    pi.digitalWrite( TRIG_PIN, pi.HIGH )
    time.sleep(0.00001)
    pi.digitalWrite( TRIG_PIN, pi.LOW )
    while ( pi.digitalRead( ECHO_PIN ) == pi.LOW ):
        sigoff = time.time()
    while ( pi.digitalRead( ECHO_PIN ) == 1 ):
        sigon = time.time()
    strTemp = str( round((( sigon - sigoff ) * 34000) / 2, 5 )) + "cm"
    time.sleep(1.0)
    return ( strTemp )

if __name__ == '__main__':
    sonicInit()
    threadRead = serialRead()
    main()

続く・・・


ラズパイのデータをM5Stack画面に表示」への3件のフィードバック

      1. 一般ユーザーは閲覧のみ。
        購読者登録したユーザーは、コメント投稿できる
        投稿者承認されたユーザーは、記事投稿できる

コメントを残す