M5stackをUSB接続して、RaspberryPiのホスト名やIPアドレスを表示してみました
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側のコードは、サービス化する必要があります。