フォト
2024年4月
  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        
無料ブログはココログ

MicroPython

2024年3月14日 (木)

Raspberry Pi Pico(MicroPython)でLEDドットマトリックスを使ってみる

先日修正版を公開した「Raspberry Pi Pico MicroPython用の美咲フォントライブラリ」を使って、
MAX7219を使ったLEDドットマトリックスモジュールで日本語表示を試してみました。


MAX7219ベースのLEDドットマトリックスの利用については、文献1が大変参考になりました.. 感謝(*´ω`*)
MAX7219の制御についてては文献2のMike Causerさんが公開しているライブラリを利用しました.. 公開に感謝(*´ω`*)

この実装にあたり、参考にした文献
・文献1.証券所のティッカーみたいな細長い電光掲示板を作る話—MAX7219モジュールとRaspberry Pi Pico (rp2040)とMicrPython
・文献2.micropython-max7219
・文献3.MicroPython libraries framebuf — frame buffer manipulation

Raspberry Pi Pico MicroPython用の美咲フォントライブラリ の最新版では、半角と全角文字を混ぜて表示できます。
半角文字は横4ドットで処理しています。とりあえずは、使えそうかな.. (*´ω`*)

文献3のmicropython-max7219 ライブラリでも半角英数字テキストのスクロール表示メッセージは可能なのですが、
フォントの切り替え不可で、美咲フォントを利用した日本語フォントの表示には対応していません。
そこで、micropython-max7219の Matrix8x8の派生クラスを作成して美咲フォントで日本語表示できるようにしてみました。
MessageBoardクラスを作成しました。
以下は、そのクラス実装のmessageboard.pyとサンプルプログラムのsample_scroll_text.pyです。

ライブラリmax7219.py、messageboard.pyは、pico内にdeviceフォルダを作ってその中に保存します。
ラズパイpicoのmicroPython環境、実現レベルでいい感じと再認識しました(*´ω`*)

ハードウェア構成、結線については文献1、2を参照願います。
pico用に作成しましたが、他の環境でも比較的簡単に移植できると思います。

教育漢字だけだとやはり、ちょっとした文書を表示しようと思うと豆腐(□=教育漢字以外)が表示されてしまいます。
picoでは、フラッシュメモリに余裕があるので全フォント搭載でも問題ないと思うので、対応しようかな..

2024年3月13日 (水)

Raspberry Pi Pico MicroPython用美咲フォントライブラリの更新

前回投稿「美咲フォントの調査(メモ その1)」を元に、
Raspberry Pi Pico MicroPython用の美咲フォントライブラリを修正しました。

更新
・Raspberry Pi Pico MicroPython用美咲フォントライブラリ
   https://github.com/Tamakichi/pico_MicroPython_misakifont

このライブラリに作成にあたり、美咲フォントのBDF形式からPython用のフォントデータ(タプル形式)への変換は、
Pythonでプログラムを組んで生成しました。
BDF Parserという、BDFファイルをお手軽に操作できるライブラリを利用したのですが、
かなり高機能で、今後もBDFファイルを使う場合には利用しようかと思います。

BDF Parser の利用方法の解説は少ないので、個人のメモとして、今後いくつか記述したいと思います。

「Raspberry Pi Pico MicroPython用美咲フォントライブラリ」は、もともとは2012年の美咲フォント 初版をベースにしていたのですが、
初版のBDFはJISコードベースで、それを強引に ユニコードに変換したのでいくつか不具合やバグが混入していました。
今回の修正で、解消できたかと思います(*´ω`*)

本ライブラリは、「教育漢字」に絞っているのですが、フォントデータの生成はPythonでツールを作成したので、
比較的簡単にフォントの追加や別のフォント(BDF形式)の利用にも対応可能です。
ツールについては、別途公開したいと思います。

先行してPython用ライブラリを更新したのですが、Arduino版についても近日中に公開いたします。

2023年2月 9日 (木)

Raspberry Pi Pico MicroPython用のマルチフォントライブラリ

Raspberry Pi PicoMicroPythonは、かなりイケていることが分かり、
Arduino用のフォントライブラリを移植してみました。

■Raspberry Pi Pico MicroPython用のマルチフォントライブラリ
  https://github.com/Tamakichi/pico_MicroPython_Multifont

Arduino用漢字フォントライブラリ SDカード版からの移植なのです。
MicroPythonでは、フラッシュメモリ上にファイルを置いて読み書き出来るので、サックっと移植出来ました。

動作確認(使い物ものになるか)として、
 ・16x16ドットマトリックのNeoPixcel
 ・OLEDディスプレイ SSD1306(I2C接続 128x64ドット)
で遊んでみました。

■16x16ドットマトリックのNeoPixcelで日本語表示(sample_mfont_neopixel.py)
 Dsc00107

全点フル輝度で点灯すると、電力不足でリセットがかかったり動作不安定となります。
本格的に使うには、電源回りの補強が必要です。とりあえず、実験レベルでの動作確認です。

動いている様子
 

動画のデモでは12ドットフォントを指定して表示しています。
とりあえず、見た目上はまともに動いています。スクロールも滑らかです(*´ω`*)
これで、インタプリタ言語で処理しているかと思うと上出来ですね(^^♪

■OLEDディスプレイ SSD1306(I2C接続 128x64ドット) で日本語表示(sample_oled_mfont.py)
Dsc00101

動いている様子


表示は1文字ずつディレイ(時間待ち)を入れて表示しています。
ディレイを抜いてフルスピードにしても表示は遅いです。

遅いI2C接続が足を引っ張っているというより、やはり処理的にちょっとキツイかな。
利用しているSSD1306ライブラリを見直せば何とかなるかもしれません。

メインのプログラムはこんな感じです

定数部分は、各自のご利用ボードに合わせて適宜変更して下さい。
サンプルプログラムでは、「後からインスタンス・メソッドの追加できるか?」を試してみたのですが、出来ますね。

# SSD1306_I2Cに漢字表示インスタンス・メソッドの追加
SSD1306_I2C.drawText = drawText

SSD1306_I2C.drawFont = drawFont3
SSD1306_I2C.newLine = newLine


■まとめ

この記事でやっていることは、いままでArduinoでやってきたことなのですが、
MicroPythonでも、そこそこやれるようですね。しばらくはpicoで遊んでみます。

2023年2月 8日 (水)

MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示

久しぶりのブログ更新です。

Pythonプログラミングのお勉強で、手持ちのRaspberry Pi picoMicroPythonをいじってみたのですが、
インタプリタの処理と思えないほど、サクサクと動いてびっくりです。

8x8ドットNeoPixcelで文字表示をやって見たところ、難なく処理をこなしてくれました。

Dsc00061

動いている様子


メインのそースはこんな感じです。

MicroPythonはコンパイル不要で、C言語よりもお手軽でいいですね(*´ω`*)
文字の表示には美咲フォントを利用しました。とりあえず、モジュール化してみました。
Arduino版を流用しました。
■ Raspberry Pi Pico MicroPython用美咲フォントライブラリ
   https://github.com/Tamakichi/pico_MicroPython_misakifont

サンプルプログラムとして、ドットマトリックスのプログラムを添付しています。
Raspberry Pi Pico
MicroPythonには、
NeoPixcelの制御を行うライブラリが組み込まれているので、
マトリック表示のためのライブラリ部のみを自作しています。
マトリック表示処理の要としては、マトリック表示では、縦・横の座標でピクセルを制御したいところ、
NeoPixcelのライブラリではのピクセルを0からの番号指定のため、
   縦・横 指定 ⇒ 番号(0~)
の変換をするところですかね..

  neomatrix.py:
    # ドットマトリックス 指定座標ピクセル番号変換
    def XYtoNo(self, x, y):
        return self.width*y + x if y&1 else self.width*y + self.width-1 -x

縦yが奇数と偶数で横xの方向が異なります。
表示が鏡文字になったり、上下さかさまとなる製品の場合、この変換処理を修正すれば対処できると思います。