著者:北崎 恵凡
ユーザーコミュニティ「Jetson Japan User Group」のメンバーである筆者が設計した、小型コンピュータボードの「Jetson Nano」と「Raspberry Pi」で共通に使える拡張基板「Jetson & Pi 電力測定ボード」をシェルスクリプトマガジンオリジナルとして作成しました。本特集では、このJetson & Pi電力測定ボードの使い方を紹介します。
シェルスクリプトマガジン Vol.69は以下のリンク先でご購入できます。
図7 電源電圧を表示するサンプルプログラム「ina260.py」のソースコード
1 2 3 4 5 |
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のソースコード
1 2 3 4 5 6 7 8 9 10 11 |
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のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
(略) 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のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
(略) 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のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
(略) 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のソースコード
1 2 3 4 5 6 |
(略) 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のソースコード
1 2 3 4 |
(略) 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のソースコード
1 2 3 4 |
(略) 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) (略) |