この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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側のコードは、サービス化する必要があります。