HOME | Raspberry Pi | ビジネス書籍紹介 | 2024-04-26 (Fri) Today's Access : 761 Total : 920421. Since 10 Sep. 2019

疑似コンソール
2021.03.06

YouTube でも紹介しています。画像をクリックすると再生できます。

今回は、Adafruit 1.3" Color TFT Bonnet for Raspberry Pi を Raspberry Pi Zero WH の疑似コンソールとして使用します。
このLCDを、システムコンソールとして設定することも可能ですが、カーネルドライバーを書き換えてしまうため、元に戻すのが面倒です。 そこで、Pythonアプリケーションからシステムコンソールのように使えるライブラリーを作成します。


Pimoroni のサイトを散策していたときのことです。普段、アクセスすることのない「Gaming & Arcade」のカテゴリーを間違ってぽちっとしてしまい、運よく発見しちゃいました!
ちなみに、画面右側に写っている「Pico Explorer Base」もお買い上げです!


「ボタンとジョイスティックを備えたコンパクトなカラーディスプレイが必要なあなたにぴったりの商品です」と書かれているではありませんか。 システムコンソールを探していたのですが、このデザインの美しさ!買わないわけにはいきません!ぽちっ!

■とても美しい外観

フロントデザインです。

当然の事なのですが、背面には2x20ピンの Raspberry Pi connector が配置されています。


システムコンソールとして使用した場合です。

■Pinouts

・5.0V - Connected to the display backlight
・3.3V - Connected to the display power and also the STEMMA QT / Qwiic connector
・GND - Ground for everything
・SDA & SCL - I2C data for the STEMMA QT / Qwiic connector. Not used by buttons or display
・GPIO26 - Used to turn the backlight on and off.
・GPIO5 & GPIO6 - Connected to the two front buttons. These pins have 10K pullups to 3.3V so when the button is pressed, you will read a LOW voltage on these pins
・GPIO17, GPIO22, GPIO27, GPIO23 - The four directions on the joystick.
・GPIO4 - Joystick center button.
・SCK, MOSI, CE0 & GPIO25 - These are the display control pins. Note that MISO is not connected even though it is a SPI pin because you cannot read back from the display.
・Not used: GPIO12, GPIO13, GPIO16, GPIO19, GPIO20, GPIO21, GPIO18, GPIO24, TXD, RXD, EEDATA, EECLK, MISO, SPI_CE1

■SPIの有効化
$ sudo vi /boot/config.txt
dtparam=spi=on

■動作環境の整備

Adafruit TFT Bonnet のセットアップは下記のようになっています。
Ref.Python Setup
$ sudo pip3 install adafruit-circuitpython-rgb-display
$ sudo apt-get install python3-pip
$ sudo apt-get install ttf-dejavu
$ sudo apt-get install python3-pil
$ sudo apt-get install python3-numpy
※今回はインストールしていません。


What is CircuitPython?

Adafruit では実行環境に microPython系の CircuitPython を利用してします。 しかし、これを使うと、汎用性が低下してしまうので、標準の ST7789ライブラリーを用いることにします。

Pimoroni 1.3" SPI LCDのサンプルコードを参考にしました。
PIMORONI 1.3" SPI Colour LCD (240x240) Breakout


AdafruitとPimoroniのLCDで使用するピン番号をみてみました。
No AdafruitDescription Pimoroni
3.3V 1 display backlight 1
5V 2 display power 2
GND 6 6
SPI_MOSI19(BCM10) display control 19(BCM10)
SPI_SCLK23(BCM11) display control 23(BCM11)
TFT_DC 22(BCM25) display control 21(BCM9)
TFT_CS 24(CE0/BCM8)display control 26(CE1/BCM7)
TFT_LITE37(BCM26) backlight on and off35(BCM19)
DCとCSおよびbacklightのピン番号が異なっていることがわかります。
※ジョイスティックやボタンの機能は省いています。

まずは、ST7789ディスプレイドライバ用のモジュールをインストールします。

$ sudo pip3 install st7789

Raspberry Pi OS であれば、st7789 が依存するモジュールはすでにインストール済と思われますが、 必要なら、追加インストールしてください。
$ sudo pip3 install pillow
$ sudo pip3 install numpy
$ sudo pip3 install RPI.GPIO
$ sudo pip3 install spidev


scrolling-text.py
先に示した対応表を参考に、Pimoroniで使用しているピン番号から、Adafruit用にピン番号を書き換えます。
disp = ST7789.ST7789(
    port=0,
    cs=ST7789.BG_SPI_CS_FRONT,
    dc=9,
    backlight=19,
    spi_speed_hz=80 * 1000 * 1000
)

 ↓変更

disp = ST7789.ST7789(
    port=0,
    cs=ST7789.BG_SPI_CS_BACK,
    dc=25,
    backlight=26,
    spi_speed_hz=80 * 1000 * 1000
)
ST7789.BG_SPI_CS_FRONT は CE1 の指定なので、ST7789.BG_SPI_CS_BACK に変更して CE0 に変更します。

Source code
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import time

import ST7789


MESSAGE = "Hello World! How are you today?"

# Create ST7789 LCD display class.
disp = ST7789.ST7789(
    port=0,
    cs=ST7789.BG_SPI_CS_BACK,  # BG_SPI_CS_BACK or BG_SPI_CS_FRONT
    dc=25, 
    backlight=26,               # 18 for back BG slot, 19 for front BG slot.
    spi_speed_hz=80 * 1000 * 1000
)

# Initialize display.
disp.begin()

WIDTH = disp.width
HEIGHT = disp.height


img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0))

draw = ImageDraw.Draw(img)

font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 30)

size_x, size_y = draw.textsize(MESSAGE, font)

text_x = disp.width
text_y = (80 - size_y) // 2

t_start = time.time()

while True:
    x = (time.time() - t_start) * 100
    x %= (size_x + disp.width)
    draw.rectangle((0, 0, disp.width, 80), (0, 0, 0))
    draw.text((int(text_x - x), text_y), MESSAGE, font=font, fill=(255, 255, 255))
    disp.display(img)

実行してみましょう。
$ python3 scrolling-text.py


動作確認ができたので、次に疑似コンソール用ライブラリーを作成していきます。

■等幅フォントの確認

システムで利用可能な等幅フォントを確認します。
$ fc-match monospace
LiberationMono-Regular.ttf: "Liberation Mono" "Regular"

フォントの場所は下記の通りです。
/usr/share/fonts/truetype/liberation2/LiberationMono-Regular.ttf

他の等幅フォントを利用したい場合は、適時インストールしてください。

■リングバッファ


File:Ring.buffer.svg - Wikimedia Commons
リングバッファは、予め記憶領域を確保して、読み出し位置と書き込み位置をずらしながら処理を行い、領域の終端に到達したら、領域の先頭に繋げ無限ループ的に利用する仕組みです。 C言語などで開発する場合は、ポインターを使って、テキスト文字列を上書きしていけば済むのですが、Pythonではそういう使い方はできません。
コーディング的に美しくないのですが、リストを使ってリングバッファーっぽいものを実装します。

1.LCDの描画サイズを取得します
disp.begin()
pixel_x = disp.width
pixel_y = disp.height

2.等幅フォントのサイズを取得します
font = ImageFont.truetype("/usr/share/fonts/truetype/liberation2/LiberationMono-Regular.ttf",14)
size_x, size_y = self.draw.textsize("F", font=font)

3.LCDサイズとフォントサイズから1行に表示できる桁数と行数を算出します
col = pixel_x // size_x
row = pixel_y // size_y

4.表示したい文字列を桁数で分割して、複数の配列要素として保存します
line_len = len(msg)
line_num = line_len//col
line_rest = line_len % col
line_from = 0
line_to = col
while line_num > 0:
 buffer[pos] = msg[line_from:line_to]
 line_from += col
 line_to += col
 pos += 1
 line_num -= 1
if line_rest > 0:
 buffer[pos] = msg[line_from:line_len]
 pos += 1

5.表示行数未満の場合は、リストの先頭要素から、LCDに描画します
pos_y = 0
draw.rectangle((0, 0, disp.width, disp.height), (0, 0, 0))
for i in range(row):
 draw.text((0,pos_y), buffer[start], font=font, fill=(255, 255, 255))
 start += 1
 pos_y += size_y
 if start == row:
  start = 0
disp.display(img)

6.再度、表示文字列を追加する場合は、直前に保存した次の配列要素に追加します
 この際、配列が末尾に到達した場合には配列の先頭要素から書き換えます
7.更新した配列要素数に応じてリストの途中から循環する形で、LCDを再描画します

6, 7 に関しては短いコードなので、下記のソースを解析してみてください。

疑似コンソール Source code
from PIL import Image, ImageDraw, ImageFont
import ST7789

class Console:
	def __init__(self):

		# Create ST7789 LCD display class.
		self.disp = ST7789.ST7789(
			port=0,
			cs=ST7789.BG_SPI_CS_BACK,
			dc=25, 
			backlight=26,
			spi_speed_hz=80 * 1000 * 1000
		)

		# Initialize display.
		self.disp.begin()
		self.pixel_x = self.disp.width
		self.pixel_y = self.disp.height
		self.img = Image.new('RGB', (self.pixel_x, self.pixel_y), color=(0, 0, 0))
		self.draw = ImageDraw.Draw(self.img)

		self.size_x, self.size_y = self.getFontSize()
		self.col  = self.pixel_x // self.size_x
		self.row  = self.pixel_y // self.size_y
		self.buffer = ["" for _ in range(self.row)]
		self.pos   = 0
		self.start = 0
		self.scroll = False

	def getFontSize(self,fontName=None, fontSize=None):
		if fontName is None:
			self.font = ImageFont.truetype("/usr/share/fonts/truetype/liberation2/LiberationMono-Regular.ttf",14)
		else:
			self.font = ImageFont.truetype(fontName, fontSize)
		self.size_x, self.size_y = self.draw.textsize("F", font=self.font)
		return self.size_x, self.size_y

	def print(self, msg):
		line_len  = len(msg)
		line_num  = line_len//self.col
		line_rest = line_len % self.col
		line_from = 0
		line_to   = self.col
		while line_num > 0:
			if self.scroll:
				self.start += 1
				if self.start == self.row:
					self.start = 0
			self.buffer[self.pos] = msg[line_from:line_to]
			line_from += self.col
			line_to   += self.col
			self.pos += 1
			if self.pos == self.row:
				self.pos = 0
				self.scroll = True
			line_num -= 1
		if line_rest > 0:
			if self.scroll:
				self.start += 1
				if self.start == self.row:
					self.start = 0
			self.buffer[self.pos] = msg[line_from:line_len]
			self.pos += 1
			if self.pos == self.row:
				self.pos    = 0
				self.scroll = True

		pos_y = 0
		self.draw.rectangle((0, 0, self.disp.width, self.disp.height), (0, 0, 0))
		for i in range(self.row):
			self.draw.text((0,pos_y), self.buffer[self.start], font=self.font, fill=(255, 255, 255))
			self.start += 1
			pos_y += self.size_y
			if self.start == self.row:
				self.start = 0
		self.disp.display(self.img)

使用する場合は、RingBuffer.py をカレントディレクトリーに置いて下記のように呼び出します。
文字列の描画位置を意識することなしに利用できます。

from RingBuffer import Console

cs = Console()
cs.print(message1)
cs.print(message2)
・・・・・

ソースコードにちょっと手を加えるとこんな感じになります。

メッセージ単位で交互に色分けして表示しています。

このコンソール機能は、Twelite Neural Network 第2回で使用する予定です。

■参考文献
等幅フォント
Raspberry Pi(stretch)フォント設定 noto font
ラズパイでフレームバッファ(/dev/fb0)を使用して、直接ディスプレイ画像を入出力する
【 fc-match 】コマンド――フォントのマッチングと優先順位を確認する
原色大辞典
 Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2019.12.13 モバイルバッテリーによる瞬間停電対策
2020.01.01 1280x800 HDMI MONITOR
2020.01.12 micro:bitをコマンドラインで使う
2020.02.04 サーマルプリンタを使う
2020.04.10 電卓を制御して数字を表示する
2020.08.03 Seeeduino XIAO
2020.08.09 LGT8F328P - Arduino clone
2020.09.18 電流計測モジュール INA219
2021.02.16 癒しの電子回路
2021.03.06 疑似コンソール
2021.08.08 電子ペーパー
2021.09.04 AVRマイコン・ATTiny85
2021.09.25 pH測定
2021.11.13 NTP時刻取得と活用
2021.11.27 GPS情報取得
2021.12.11 GR-KURUMI
2021.12.25 ATMEGA328P 3.3V/8MHz
2022.01.11 AS-289R2 プリンタシールド
2022.01.25 TM1637 & ATtiny85
2022.02.22 Raspberry Pi Zero 小道具
2022.03.01 ATTinyCore
2022.03.18 Adafruit QT Py + XIAO Expansion board
2022.07.31 サーマルプリンター番外編:通信筒
2022.09.03 l' art en circuit (回路でアート)
2023.01.01 FTP Server & SPI Flash SD
2023.02.01 LPC810(ARM Cortex-M0+)
2023.02.15 IchigoJam互換機
2023.03.01 Telnet
2023.04.26 USBメモリをUART接続で利用する
2023.05.14 焦電型赤外線モーションセンサー
2023.07.01 文字化けしないキーボード
2023.08.01 Bluetoothサーマルプリンター
2023.08.12 LattePanda 2G/32GB
2023.09.04 SI-3012KS
2023.12.01 疑似コンソール(C言語編)
2023.12.16 昭和レトロ・温度湿度時刻計
2023.12.25 二酸化炭素濃度監視
2024.01.23 なんちゃってmicro:bit
2024.02.07 オリジナル micro:bit
2024.02.23 ESP32 OTA
2024.03.08 TELNETサーマルプリンター


Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/ ・設計から実装までを系統的に説明するモデルベース開発/ ・Arduinoを用いた実際の開発例

最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/ ・コマンド・スクリプトの例が豊富で、動かして学べる!/ ・超基本から解説。これから使いはじめる人にぴったり!/ ・全編フルカラー、スクリーンショットも豊富!

Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/ 2.ネットワークを構築する/ 3.サーバーを構築する/ 4.Webサーバーソフトをインストールする/ 5.HTTPの動きを確認する/ 6.プライベートサブネットを構築する/ 7.NATを構築する/ 8.DBを用いたブログシステムの構築/ 9.TCP/IPによる通信の仕組みを理解する

C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。 本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。

1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説 ・最新の技術が身につく! 今のJavaScriptの書き方・使い方 ・絶対に知っておきたい! アニメーションとイベントの知識 ・プログラミングの基本から実装方法まですべて学べる

図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。 これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。

C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。

Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/ 第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/ 第3部 配布プリント基板で体験!マイコンで動くフィルタ作り

日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現! 【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう 【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう 【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化

ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。

地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる! 地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開

Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。 ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。

ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。 Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。 専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。 本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。

攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc. 世界のトップはなぜプログラマーなのか?

ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場! 高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。 DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。 作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。

Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。 この本では,ベイズ統計学のきほんをやさしく紹介していきます。

白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81


無水エタノールP 500mlx2個パック(掃除)


ケイバ(KEIBA) マイクロニッパー MN-A04


サンハヤト SAD-101 ニューブレッドボード


白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02


[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠


Copyright © 2011-2024 Sarako Tsukiyono All rights reserved®.