シェルスクリプトマガジン

特集1 Jetson & Pi 電力測定ボードの使い方(Vol.69記載)

著者:北崎 恵凡

ユーザーコミュニティ「Jetson Japan User Group」のメンバーである筆者が設計した、小型コンピュータボードの「Jetson Nano」と「Raspberry Pi」で共通に使える拡張基板「Jetson & Pi 電力測定ボード」をシェルスクリプトマガジンオリジナルとして作成しました。本特集では、このJetson & Pi電力測定ボードの使い方を紹介します。

シェルスクリプトマガジン Vol.69は以下のリンク先でご購入できます。

Part1 Jetson & Pi 電力測定ボードを動かす

図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)
(略)