生成AI技術は、すごいけど、使いこなせるのかは別問題という記事です。
生成AI技術がすごいのは、コードの読み解く能力だと思います。大昔に自分で作成したコードを説明してもらいました。
プロンプトはこれだけです。
このコードを説明して。使われているライブラリから、プラットフォームも推定して下さい。https://github.com/knmb47/msc7128-04/blob/main/msc7128_char_list.py
結果は下の「生成された解説」を見て貰えれば良いですが、それを見ての私の主張は以下です。
- 知らない世界の単語で解説されても意味わからない(IT技術者前提)
- VFD
- MSB/LSB
- OSC
- SPI Mode 3
- 周波数
- その背景にある技術知識がなければ何をしているのかもわからない
- 古めかしいマイコンの知識
- SONYのTA-AV670という機械の画面に文字を出そうとしている
とはいえ、作成者の意図を聞いたところ100%の大正解…。
作成者の意図は、Raspberry PiからOKI MSC7128 VFDをSPIで制御するための基礎検証と、文字コード・表示動作の確認を目的としたテストスクリプトの作成です。
さらに、後続の応用開発や情報共有を見据えたオープンな実験コードという位置づけと考えられます。
これからの時代は、分からないけど分かった気にさせてくれる生成AIと付き合っていくという時代です。
生成AIは本当のところを論理的に分かっていて解説しているわけではありません
本気で注意して生成AIと会話しましょう。
ここからは生成された解説
msc7128_char_list.py の解説(Markdown版)
対象ファイル: msc7128_char_list.py(GitHub)
参考: リポジトリ概要(code to operate VFD of TA-AV670 by python on raspberry pi): https://github.com/knmb47/msc7128-04
概要
- 目的: OKI(沖電気)の MSC7128 VFDコントローラに対して、SPI経由で文字コードの一覧を順送りで書き込み、VFDの表示テストやフォント確認を行うスクリプト。
-
主な処理:
- 1バイトのビット順反転(MSB⇔LSB)を行う
reverse()の実装 - Pythonの文字(
str)をMSC7128のキャラクタコードへ変換するconv_msc() - MSC7128向けのコマンド定数(アドレス設定、文字コード設定、表示桁数、デューティ、ランプテスト)
-
spidevで SPI Mode 3 を初期化し、1kHzの低速で 0〜255 の値を 16個×16ページに分けて送信(送信データはreverse()でビット反転してから送出)
- 1バイトのビット順反転(MSB⇔LSB)を行う
参考: ファイル本文とコメントを参照(
spi.mode = 3、spi.max_speed_hz = 1000、コマンド定義など)。
msc7128_char_list.py: https://github.com/knmb47/msc7128-04/blob/main/msc7128_char_list.py- リポジトリ説明: https://github.com/knmb47/msc7128-04
使われているライブラリ
import spidev
import time
-
spidev: Linuxの/dev/spidev*を介して SPI デバイスにアクセスするためのPythonバインディング。Raspberry Pi などで SPI 周辺機器を操作する際の定番。
本スクリプトではSpiDev()を生成し、mode = 3、xfer2()で転送を行う(コード参照)。
主要関数の説明
1) ビット反転 reverse(a)
def reverse(a):
a = (((a & 0x0f) << 4) | ((a & 0xf0) >> 4)) # ニブル入替
a = (((a & 0x33) << 2) | ((a & 0xcc) >> 2)) # 2ビット単位入替
a = (((a & 0x55) << 1) | ((a & 0xaa) >> 1)) # 1ビット単位入替
return a
- 1バイトのビットエンディアンを反転する定番手法。デバイス側の受信ビット順(MSB first / LSB first)の違いに合わせるために実施。
2) 文字→MSC7128コード変換 conv_msc(c)
- 記号類(
[,\\,],Ⅱ,_,↓,!,%,&,',(,),*,+,,,-,.,/,:,;,<,=,>,?,↑等)を個別の固定番号にマッピング。 - 英字は
A–Zを0–25、a–zを32–57、数字0–9を74–83に変換する算術式(コメント付き)。 - 未サポート文字は
127を返すフォールバック。
※ GitHub表示では一部のreturnが連続して見えますが、意図は「各記号を所定のコードへマッピング」です。
コマンド定数
command_address_set = 0b10000001
command_character_code_set = 0b10011001
command_number_of_display = 0b10111101
command_display_duty = 0b10100101
display_duty_15 = 0b11110000
command_lamp_test = 0b11000011
lamp_test = 0b11111111
lamp_off = 0b00000000
- MSC7128 に送る制御コマンド群(アドレス設定、文字コード設定、表示桁数、デューティ、ランプテストなど)。
- コメントには「OKI MSC7128 の Max OSC Frequency は 270kHz」という記述があり、実際の転送速度は非常に保守的な 1kHz に設定されています。
SPI 初期化とデータ転送
spi = spidev.SpiDev()
spi.mode = 3
# spi.max_speed_hz = 1000000
# spi.max_speed_hz = 100000
spi.max_speed_hz = 1000 # 実効設定
...
while count < 16:
spi.xfer2(
[command_address_set, address_0, command_character_code_set]
+ [reverse(x) for x in range(count*16, count*16+16)],
0, 1000, 8
)
spi.xfer2(
[command_number_of_display, com_displayed_0, command_display_duty, display_duty_15],
0, 1000, 8
)
count += 1
spi.close()
- SPI Mode 3、1kHz で動作。
- 1本目の転送: アドレス設定 → 先頭アドレス(
address_0) → 文字コード設定 → 16バイトの表示データ
(データはreverse()でビット反転した 16 連続値。countにより 0〜255 を 16個×16ページで送る) - 2本目の転送: 表示桁数・デューティ などの制御を反映。
- これを 16回繰り返して**全コード(0〜255)**を送出し、キャラクタ一覧表示を狙った動きをする。
- 注意:
address_0とcom_displayed_0はこのファイル内に定義が無いため、同リポジトリの別スクリプトや設定で補う想定(例:msc7128_rev.py,msc7128_rev4.pyなど)。
参照:
-
msc7128_char_list.py: https://github.com/knmb47/msc7128-04/blob/main/msc7128_char_list.py -
msc7128_rev4.py: https://github.com/knmb47/msc7128-04/blob/main/msc7128_rev4.py
プラットフォームの推定
-
ハード/OS: Raspberry Pi(Linux/Raspberry Pi OS)
- 根拠:
spidevを用いた/dev/spidev*アクセス、リポジトリ説明の “by python on raspberry pi”。
- 根拠:
-
バス/プロトコル: SPI (Mode 3)
- 根拠:
spi.mode = 3とxfer2()によるバイト列転送。
- 根拠:
-
対象デバイス: OKI MSC7128(VFDコントローラ)+ TA-AV670 の VFD
- 根拠: ファイル内コメントとリポジトリの説明。
- 言語/ランタイム: Python 3(Raspberry Pi の標準環境)。
実運用上のポイント
-
未定義シンボル(
address_0,com_displayed_0)を実機構成に合わせて定義する。
先頭アドレスや COM 設定値を示す想定。必要なら同リポジトリの他ファイル(msc7128_rev.py/msc7128_rev4.py)も確認。 -
SPI の有効化と配線。
Raspberry Pi 側で SPI を有効化(raspi-configなど)し、SCLK/MOSI/CS/電源/レベル変換(必要に応じて)を正しく配線する。 -
転送速度。
まずは 1kHz で安定動作を確認し、配線品質に余裕があれば段階的に上げる(コメントでは MSC7128 の最大発振 270kHz に言及)。 -
文字マッピングの微調整。
conv_msc()はデバイス内フォント配列に依存。実機のフォント表に合わせ、必要に応じてマッピングを追加・修正する。
ひとことで
Raspberry Pi から Python + spidev を使い、SPI Mode 3 で OKI MSC7128 にビット反転済みの文字コード列を順に送り、VFDのキャラクタ一覧を表示するテスト用スクリプト。
必要なら、address_0 や com_displayed_0 の定数定義例、配線図、最小動作スクリプトも用意できます。ご利用中のVFD基板の型番・ピン配列がわかれば、実機向けに具体値を提案します。