著者:北崎 恵凡
ユーザーコミュニティ「Jetson Japan User Group」のメンバーである筆者が設計した、小型コンピュータボードの「Jetson Nano」と「Raspberry Pi」で共通に使える拡張基板「Jetson & Pi 電力測定ボード」をシェルスクリプトマガジンオリジナルとして作成しました。本特集では、このJetson & Pi電力測定ボードの使い方を紹介します。
シェルスクリプトマガジン Vol.69は以下のリンク先でご購入できます。![]()
![]()
図7 電源電圧を表示するサンプルプログラム「ina260.py」のソースコード
import smbus
i2c = smbus.SMBus(1)
word = i2c.read_word_data(0x40, 0x02) & 0xFFFF
result = ( (word << 8) & 0xFF00 ) + (word >> 8)
volt = result * 1.25 / 1000
図9 ina260_adafruit.pyのソースコード
import time
import board
import adafruit_ina260
i2c = board.I2C()
ina260 = adafruit_ina260.INA260(i2c)
while True:
print("Current: %.2f Voltage: %.2f Power: %.2f"
%(ina260.current, ina260.voltage, ina260.power))
time.sleep(1)
図12 ina260_plot.pyのソースコード
(略)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
(略)
NUM_BUF_POINTS = 180
PLOT_INTERVAL = 1000
def get_values():
return([float("{0:.2f}".format(ina260.current / 1000)), float("{0:.2f}".format(ina260.voltage)), float("{0:.2f}".format(ina260.power / 1000))])
(略)
def plot(i):
global Data
zone_names = get_names()
zone_temps = get_values()
print(zone_temps)
Data = np.append(Data, np.array([zone_temps]), axis = 0)
if i >= NUM_BUF_POINTS:
Data = np.delete(Data, 0, axis = 0)
plt.cla()
plt.plot(Data, marker = 'x')
plt.xlim(0, NUM_BUF_POINTS)
plt.ylim(0.0, 10.0)
plt.title('Current Monitor', fontsize = 14)
plt.xlabel('Time', fontsize = 10)
plt.ylabel('Current[A],Voltage[V],Power[W]', fontsize = 10)
plt.tick_params(labelsize=10)
plt.grid(True)
plt.legend(labels = zone_names, loc = 'upper left', fontsize = 10)
def main():
global Data
zone_names = get_names()
print(zone_names)
Data = np.empty((0, len(zone_names)), float)
fig = plt.figure(figsize=(10, 4))
ani = animation.FuncAnimation(fig, plot, fargs = (), interval = PLOT_INTERVAL)
plt.show()
(略)
図14 ssd1306_stats.pyのソースコード
(略)
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
(略)
i2c = busio.I2C(SCL, SDA)
(略)
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
(略)
width = disp.width
height = disp.height
image = Image.new("1", (width, height))
(略)
draw = ImageDraw.Draw(image)
(略)
cmd = "hostname -I | cut -d' ' -f1"
IP = subprocess.check_output(cmd, shell=True).decode("utf-8")
cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
CPU = subprocess.check_output(cmd, shell=True).decode("utf-8")
cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%s MB %.2f%%\", $3,$2,$3*100/$2 }'"
MemUsage = subprocess.check_output(cmd, shell=True).decode("utf-8")
cmd = 'df -h | awk \'$NF=="/"{printf "Disk: %d/%d GB %s", $3,$2,$5}\''
Disk = subprocess.check_output(cmd, shell=True).decode("utf-8")
(略)
draw.text((x, top + 0), "IP: " + IP, font=font, fill=255)
draw.text((x, top + 8), CPU, font=font, fill=255)
draw.text((x, top + 16), MemUsage, font=font, fill=255)
draw.text((x, top + 25), Disk, font=font, fill=255)
(略)
disp.image(image)
disp.show()
図19 ina260_oled.pyのソースコード
(略)
import adafruit_ina260
i2c2 = board.I2C()
ina260 = adafruit_ina260.INA260(i2c2)
(略)
c = ina260.current
v = ina260.voltage
p = ina260.power
print("Current: %.2f Voltage: %.2f Power: %.2f" %(c, v, p))
(略)
draw.text((x, top + 0), "Current(mA): " + str("{0:.2f}".format(c)) + ' ', font=font, fill=255)
draw.text((x, top + 14), "Voltage(V): " + str("{0:.2f}".format(v)) + ' ', font=font, fill=255)
draw.text((x, top + 28), "Power(mW): " + str("{0:.2f}".format(p)) + ' ', font=font, fill=255)
(略)
disp.image(image)
disp.show()
(略)
図21 ssd1306_jp_font.pyのソースコード
(略)
font = ImageFont.truetype('usr/share/fonts/truetype/fonts-japanese-gothic.ttf', 14)
(略)
draw.text((x, top + 0), "てすと", font=font, fill=255)
draw.text((x, top + 14), "日本語", font=font, fill=255)
(略)
図28 imagenet-console_oled.pyのソースコード
(略)
draw.text((0, 0), "分類: " + translator.convert(class_desc), font=font, fill=255)
draw.text((0, 14), "確率: " + "{:0.2f}%".format(confidence * 100), font=font, fill=255)
(略)
図32 imagenet-camera_oled.pyのソースコード
(略)
draw.text((0, 0), "分類: " + translator.convert(class_desc), font=font2, fill=255)
draw.text((0, 14), "確率: " + "{:0.2f}%".format(confidence * 100), font=font2, fill=255)
(略)