JetsonNanoを搭載した拡張ボードのOLEDディスプレイを採用(IP、メモリ、CPUなどのリアルタイム表示)

ロボットをDIYするとき、ロボットへのリモート接続を使用して関連情報を表示できます。つまり、前述のリモート接続VNC-Viewerと、 VNC-Viewerを介して接続されたWinSCPソフトウェアの安全な送信ですが、使用するのが不便な人のためにコンピュータまたはシンプルで直感的になりたい IPアドレス、メモリ、CPUなどのロボットの共通属性を確認するには、通常、小さなディスプレイを使用して直接表示します。

ここで使用するのは、解像度128*32 のOLED ディスプレイで、IP アドレス、メモリ、CPU、ハードディスク サイズなどを表示できます。この情報で十分です。

ディスプレイに情報を表示したい場合は、ドライバーを使用する必要があります. ここでは、Adafruit_Python_SSD1306ドライバーを使用します. 名前が示すように、OLED スクリーンのドライバーはSSD1306と呼ばれ、非常に一般的な OLED ドライバーです. オープン ソース コード: https://github.com/adafruit/Adafruit_Python_SSD1306/

https://github.com/adafruit/Adafruit_Python_SSD1306/blob/master/Adafruit_SSD1306/SSD1306.pyを開きます

SSD1306_I2C_ADDRESS = 0x3C    # 011110+SA0+RW - 0x3C or 0x3D

OLED の I2C ペリフェラル アドレスは0x3Cであることがわかります。これには、画面の駆動に関するすべてのメソッドとレジスタ情報が格納されています。

Linux コマンド

この前に、Jetbotmini によってリアルタイム リフレッシュ表示が有効にされる jetbotmini_stats.service によって実行される stats.py プログラムと、現在テスト中のプログラムを回避するために、両方が同時に I2C ペリフェラル OLED 画面を使用します。異常な衝突を引き起こす

最初に、Jetbotmini コマンド コンソールで OLED サービスの更新操作を停止します: sudo systemctl stop jetbotmini_stats

メモリ、CPU、およびハードディスクの条件は Linux コマンドを使用します

ここでは、テストをwslで直接実行してフォーマットします。

f.shの内容は以下の通りですが、もちろん Windows のバッチ処理と同じようにコマンドを 1 つずつ実行することも可能です。

free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
df -h | awk '$NF=="/"{printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5}'
top -bn1 | grep load | awk '{printf "CPU Load: %.2f\n", $(NF-2)}' 

実行して効果 (メモリ、ハードディスク、および CPU 負荷の使用率と割合) を確認します。

(ベース) tony@TonyComputer:/mnt/c/Users/Tony$ ./f.sh
メモリ使用量: 65/12747MB (0.51%)
ディスク使用量: 4/251GB (2%)
CPU 負荷: 0.00

もちろん、jetbotmini プラットフォーム、つまり Ubuntu システムでもコマンドを実行できます。

新しいファイル: vi f.sh

コピーして貼り付けた後: wq Enter キーを押して保存し、直接実行します: ./f.sh

権限エラーが発生した場合: bash: ./f.sh: Permission denied

ファイルのアクセス許可を変更します: chmod 777 f.sh

次に、OLEDディスプレイにメモリやその他の情報をリアルタイムで表示します。最初に必要なモジュールをインポートします

import time
import Adafruit_SSD1306
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from jetbotmini.utils.utils import get_ip_address
import subprocess

SSD1306 ドライバー

ドライバ SSD1306 の初期化、画面のクリア、フォントの設定などを行います。

# 128x32 显示与硬件I2C:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=None, i2c_bus=0, gpio=1)# 将gpio设置hack为1,以避免平台检测
# 初始化库。
disp.begin()
# 清除显示
disp.clear()
disp.display()
# 为绘图创建空白图像
# 确保创建带有模式为'1'即1位颜色的图像
width = disp.width
height = disp.height
image = Image.new('1', (width, height))
# 获取要在图像上绘制的绘图对象
draw = ImageDraw.Draw(image)
# 画一个黑色填充框来清除图像
draw.rectangle((0,0,width,height), outline=0, fill=0)
# 画一些形状
# 首先定义一些常量,以方便调整形状的大小
padding = -2
top = padding
# 从左到右移动,以跟踪绘图图形的当前x位置。
x = 0
# 加载默认字体
font = ImageFont.load_default()

ドライバー SSD1306 をチェックして、属性とメソッドに慣れることができます。

print(dir(disp))
#['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_buffer', '_gpio', '_i2c', '_initialize', '_log', '_pages', '_rst', '_spi', 'begin', 'clear', 'command', 'data', 'dim', 'display', 'height', 'image', 'reset', 'set_contrast', 'width']

その後、情報は 1 秒ごとに更新され、OLED 画面に表示されます。

while True:
    # 画一个黑色填充框来清除图像。
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # 从这个链接可以获取系统监视的Shell脚本 : 
    #https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
    cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
    CPU = subprocess.check_output(cmd, shell = True )
    cmd = "free -m | awk 'NR==2{printf \"Mem:%s/%sM %.2f%%\", $3,$2,$3*100/$2 }'"
    MemUsage = subprocess.check_output(cmd, shell = True )
    cmd = "df -h | awk '$NF==\"/\"{printf \"Disk:%d/%dGB %s\", $3,$2,$5}'"
    Disk = subprocess.check_output(cmd, shell = True )

    draw.text((x, top),       "eth0:" + str(get_ip_address('eth0')),  font=font, fill=255)
    draw.text((x, top+8),     "wlan0:" + str(get_ip_address('wlan0')), font=font, fill=255)
    draw.text((x, top+16),    str(MemUsage.decode('utf-8')),  font=font, fill=255)
    draw.text((x, top+25),    str(Disk.decode('utf-8')),  font=font, fill=255)

    # 显示图像
    disp.image(image)
    disp.display()
    time.sleep(1)

下の図は、OLEDで表示されるJetbotminiの使用情報のインターフェースです

画面クリア→リアルタイム表示

1. 第一行内容:有线网络的IP地址,这里我使用无线连接的,所以是None

2. 第二行内容:WiFi无线网络的IP地址

3. 第三行内容:运行内存使用情况与已用运行内存百分比

4. 第四行内容:磁盘内存使用情况与已用磁盘内存百分比

おすすめ

転載: blog.csdn.net/weixin_41896770/article/details/129662615