M5stackをUSB接続して、RaspberryPiのホスト名やIPアドレスを表示してみました

2020.12.21

1 はじめに

CX事業本部の平内(SIN)です。

RaspberryPiは、ディスプレイやキーボードを繋がずに、sshや、リモートデスクトップで利用される場面も多いかと思います。 こんな時、ふと、「このRaspberryPIのアドレスは何だっけ?」となることが多いので、それを確認するデバイスをM5stackで作成してみました。

下記は、利用している様子です。 M5stackをRaspberryPiとUSBケーブルで接続すると、RaspberryPIのCPUシリアル番号、ホスト名、IPアドレスを表示します。

2 M5stack

使用したM5stackは、スイッチサイエンスで購入した、M5Stack Basicです。

プログラムは、ArduinoIDEからM5Stackライブラリを使用して書き込んでいます。

Serial.available() でシリアルのデータ到着を確認し、Serial.readStringUntil('\n') で1行文字列を読み込みます。

1行は、CPUシリアル番号[タブ]ホスト名[タブ]IPアドレス[改行] となっているので、これを分解して表示しています。 disp() は、表示位置、文字サイズ等を指定してLCD表示する関数です。

#include <M5Stack.h>

#define MARGIN 20
#define HIGHT 25

void setup() { 
    M5.begin();
    M5.Power.begin();
    M5.Lcd.setBrightness(200);
    M5.Lcd.fillScreen(BLUE);
}

void disp(int y, int size, char *str) {
    M5.Lcd.setCursor(MARGIN, y);
    M5.Lcd.setTextColor(BLACK);
    M5.Lcd.setTextSize(size);
    M5.Lcd.print(str);
}

void loop() {
    if (Serial.available() > 0) { 
        M5.Lcd.fillScreen(WHITE);
        char serial[1024];
        String str = Serial.readStringUntil('\n');
        str.toCharArray(serial, 1024);
        char *p = strchr(serial, '\t');
        *p = '\0';
        char *hostname = p+1;
        p = strchr(hostname, '\t');
        *p = '\0';
        char *ipAddress = p+1;
        disp(HIGHT,   2, "CPU Serial");
        disp(HIGHT*2, 3, serial);
        disp(HIGHT*4, 2, "hostname");
        disp(HIGHT*5, 3, hostname);
        disp(HIGHT*7, 2, "ipAddress");
        disp(HIGHT*8, 3, ipAddress);
        while(true){
            delay(3000);
        }
    }
    delay(1000);
}

3 RaspberryPi

RaspberryPiには、以下のモジュールを追加しています。

pip3 install pyserial
pip3 install ipget

コードは、以下です。

getCpuSerial()getHostName()及び、getIpAddress() は、それぞれ、CPUシリアル、ホスト名、IPアドレスを取得するものです。

getUsbTty() で、/dev/ttyUSBxを検索し、USBシリアル接続を見つけた場合、M5stackが接続されたという事で、処理が始まります。

serial.Serial(usbTty, 115200) シリアルの初期化は、スピードが115200bpsになっていますが、これは、M5stackの初期値です。

index.py

import serial
import time
import os
import subprocess
import ipget

def getCpuSerial():
    result = subprocess.check_output('cat /proc/cpuinfo', shell=True).decode()
    lines = result.split('\n')
    for line in lines:
        if(line.startswith('Serial')):
            return line.split(':')[1].replace(' ','')
    raise Exception('getSerial()')

def getIpAddress():
    return ipget.ipget().ipaddr("eth0")

def getHostName():
    return os.uname()[1]

def getUsbTty():
    for i in range(30):
        usbSerial = '/dev/ttyUSB{}'.format(i)
        if(os.path.exists(usbSerial)):
            print(usbSerial)
            return usbSerial
    return None


while(True):
    usbTty = getUsbTty()
    if(usbTty != None):
        try:
            hostname = getHostName()
            cpuSerial = getCpuSerial()
            ipAddress = getIpAddress()

            time.sleep(1)
            print("{} fond.".format(usbTty))
            ser = serial.Serial(usbTty, 115200)
            str = '{}\t{}\t{}\n'.format(cpuSerial, hostname, ipAddress)
            ser.write(str.encode())
            print("Send success. {}".format(hostname))
        except:
            print("except.")
    else:
        print("Serial not found.")

    time.sleep(3)

4 最後に

今回は、RaspberryPiのIPアドレス等を、M5stackで確認する要領を試してみました。場面によっては、重宝できるかも知れません。

いつでも使えるようにするには、RaspberryPi側のコードは、サービス化する必要があります。

5 参考にさせて頂いたリンク


MacでM5stackをはじめる
Raspberry Pi と Arduino をUSBシリアル通信(第一弾)