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

Raspberry Pi pico

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月13日 (月)

使い勝手の良いRP2040搭載「Seeed Studio XIAO RP2040」

Seeed Studio XIAO RP2040MicroPythonを使うにおいて、お手軽で使い勝手が良いです。
Type-Cのコネクタで耐久性もよさそうです。リセットボタンもあります。

Image0

■ ボードに関する情報
 PlatformSeeed Studio XIAOSeeed Studio XIAO RP2040Overview

秋月電子でも入手出来ます。
   秋月電子 - Seeed XIAO RP2040
  Image04

ボードの構成
Xinfront
ピンレイアウト
Xinpin
ボード上にはオリジナル版にはない「USER LED」と「RGB LED(NeoPixcel)」が搭載されており、
ボードだけで、ちょっとした実験が出来ます。

利用するにあたり、公式サイトで回路図をチェックしてみました。

■ USER LED
Image03

IO25IO16IO17に割り付けられており、共通アノードに3.3Vが供給されています。
アクティブLOW(ポートがLOWで点灯、HIGHで消灯)のようです。
このため、ボードの起動後の初期状態では USER LEDが点灯するようです。

■RGB LED(NeoPixcel)
Image02

NeoPixcelDINNEOPIXVCCNEO_PWR が割り付けられています。
下のRP2040周りの回路図をみるとNEOPIXGPIO12NEO_PWRGPIO11が割り付けられているのが分かりました。
電源供給もGPIOピンから行っているようです。

Mpu

■USER LED とRGB LED(NeoPixcel)と制御
ピンの割り付けが分かったので、MicroPythonにて操作してみました。

とりあえず、こんな感じでLEDを操作出来ました。

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の方向が異なります。
表示が鏡文字になったり、上下さかさまとなる製品の場合、この変換処理を修正すれば対処できると思います。


2021年3月29日 (月)

Raspberry Pi PicoにUSBキーボードを繋げてみる

Raspberry Pi Picoには、USBホスト機能(USBデバイスを接続できる)があります。
早速動作確認してみました。
結果を先に述べると、利用出来ますね! よしよし (*´ω`*)


■ 利用したサンプルプログラム
   pico-examples/usb/host/host_hid

上記のサンプルは、pico-exsamplesの一括コンパイル時にビルドされますが、
後々の調査・改造のため、今回はこれだけを取り出してビルドしました。

実験の様子
Dscn3018

動作確認出力はPCとのUSB接続出来ないため、シリアルポート経由で行いました。
USB-UARTモジュールを利用し、picoへの5V電源供給もこのモジュールから行いました。
プログラムの書き込み後、マイクロUSBコネクタには変換ケーブルを接続してキーボードを接続しました。

Dscn3022

picoへの5V供給は、40ピンのVBUSから行っています(写真の右側の赤線⇒VBUS、黒線⇒GND )。
これによりUSBデバイスへの5V供給を行うことが出来ます。
動作確認出力はシリアル通信 1ピンGP0(UART0 TX)、2ピンGP1(UART0 RX)を使っています。

実行結果

キーボード打ち込みを行うと、文字入力が出来ました。やったー!
03_20210329091701

このキーボード、IchigoJam Rでは利用出来なかったのですが、問題なさそうです。

ただし、利用したサンプルプログラムではUSキーボード配列用みたいなので、
日本語キーボード対応の調査が必要ですね。

また、キャプスロック等のキーボード上のLEDの点灯制御が出来ていないようなので、
これについても要調査です。

USBキーボードの利用については、何とかなりそうです。
ついでに、手持ちのワイアレスキーボードを試して見ましたが動きました。

Dscn3026

スタンドアロンで稼働する豊四季タイニーBASICは実装出来そうですね。
次は、フラッシュメモリへのデータ保存について調べてみます。
その後は、自作ライブラリの実装&組み込み方法の調査かな..

2021年3月25日 (木)

Pimoroni Pico VGA Demo Baseを入手しました

Raspberry Pi Pico用のVGA出力ボード「Pimoroni Pico VGA Demo Base」入手しました。

 Pimoroni Pico VGA Demo Base
01_20210325160401

海外からの入手です。送料は800円くらいでした。1週間ほどで到着しました。
amazon(jp)でも、扱っているようですが6,200円と割高ですね。


届いた製品
02_20210325161401
左側のユニバーサル基板は、一緒に注文したものです。

作りはしっかりしています。
03_20210325161401

裏の"海賊ロボ忍者さる"と海賊の顔絵、どこかで見覚えがありますねぇ.. 
04_20210325161401

ボード上にpicoを装着、特に問題なく乗せられました。 
05_20210325161401

スペーサー用のネジ穴径に若干問題あり。手持ちのスペーサーが付けられませんでした。
穴が3mmより小さい(2.8mmくらい?)です。

07_20210325161401

仕方なく、丸棒やすりと3mmドリルで穴を広げることにしました。
08_20210325161401

丸棒やすりでぐりぐりした後、3mmドリルが通るようにしました。
09_20210325161401

無事、スペーサーが装着出来ました。
15_20210325161401

準備OK! 早速サンプルプログラムを動かしてみます。


利用したライブラリ&サンプルプログラム
 ■ raspberrypi/pico-extras
    https://github.com/raspberrypi/pico-extras
    公式ライブラリですが、Pico SDKの追加ライブラリ的位置づけのようです。

 ■ raspberrypi/pico-playground
   https://github.com/raspberrypi/pico-playground
   pico-extrasを使ったサンプルプログラムです。
   ビルドにはpico SDKも必要です。

ビルド

ビルド作業はコマンドプロンプト 「Developer Command Prompt for VS2019」上で行いました。
私の環境(Windows 10)では、"D:\Raspberry Pi Pico"にライブラリやサンプルプログラムを配置しています。

実行コマンド
D:
cd "D:\Raspberry Pi Pico"
git clone -b master https://github.com/raspberrypi/pico-extras
git clone -b master https://github.com/raspberrypi/pico-playground.git
setx PICO_EXTRAS_PATH "D:\Raspberry Pi Pico\pico-extras"
cd pico-playground
mkdir build
cd build
cmake -G "NMake Makefiles" -D"PICO_BOARD=vgaboard" ..
nmake

特につまずくことなく、ビルド出来ました。


サンプルプログラムの実行結果

いくつかのサンプルプログラムを書き込んで実行してみました。

ラズパイのあれが動くデモ、表示は綺麗でちらつき等は全く無いです。
10_20210325190401

ゲームの背景っぽいのがスクロールするサンプルプログラム
11_20210325190401

文字を表示するサンプルプログラム
12_20210325190401

13_20210325190401

思っていた以上に、表示が綺麗できっちりと表示が出来てます。
ゲームなんか実装出来そうですね。
表示系は、色々と出来そうです。後はキーボードやゲームパッドが使えると良いですね。。
調べてみます。

 

2021年3月21日 (日)

Raspberry Pi Picoで4桁7セグLEDをダイナミック表示

Raspberry Pi PicoでのC++/C言語プログラミングの練習の継続..
タイマー割り込みの練習として、4桁7セグLEDの表示をやってみました。

01_20210321080701

動いている様子


以前、bluePill(Arduino環境)でやったプログラムを流用してやってみたのですが、意外とハマってしましました。

回路図

02_20210321083201

GP2
GP13ピンを使って、表示を行っています。
GP6GP137セグLEDの点灯制御用で、1つのLEDあたり、4mAを流すようにR1R8の抵抗を330Ωにしています。
GP2GP5は表示する桁の表示制御用です。LED8個用の電流32mAを流すため、スイッチイング用にトランジスタを使っています。

この回路は、あまり良くないです。
GPIO
ピンをシンク(吸い込み)で駆動させるつもりでしたが、
後から、Raspberry Pi PicoではGPIOオープンドレイン出力(オープンコレクタ)の指定で出来ないことが分かり、
変更も面倒なので、無理やり使っています。
とりあえず、タイマー割り込みの練習が目的のため、良しとします。

流用元のBlullPillでは出力ピンをシンク(吸い込み、オープンドレイン出力指定)にして、LEDの駆動電圧の変更(5V3.3V)に
対応出来るようにしていたのですが(2年前はそのようにやっていたらしい)、
今回、安直に出力ピンの動作を 0V or ハイインピーダンス0V or 3.3V に置き換えたところ、
LEDの駆動電圧をHighと異なる電圧にするとまともに動きません。最初、5Vをかかていたため動かなくてハマりました。

GP6
GP13の出力をLow(0V)にした場合にLEDが点灯、High(3.3V)にした場合(本当はハイインピーダンスにしたかった)、
トランジスタのエミッタの電圧が3.3Vの場合と同じになって電位差無しでLEDが消灯します。
トランジスタのエミッタの電圧が5Vの場合は、3.3V5Vで電位差が生じてしまい、不可解な挙動になりました。
ハイインピーダンスに出来れば、3.3Vでも5Vでも電流が流れないです。

Arduinoのプログラムの移植自体は意外と楽ちんでした。

プログラムソース


タイマー割り込みを行うAPIは、高レベルAPIのpico_timehardware_timerの2種類が用意されているようですが、
今回はpico_timeを使っています。
Arduinoのような感じで、抽象化されていて簡単に使うことが出来ました。
ハードウェア的にはタイマーは1つしかないようですが、多重のタイマー割り込みについても、いずれ検証してみます。



2021年3月15日 (月)

Raspberry Pi Picoのリセットボタンの実装

Raspberry Pi Picoリセットボタンが無いんですよね..
これは、ちょっと不便です。

調べてみるNo.30ピンRUNLOW(0V)にするだけでリセット出来るようです。
ちょうど、No.28ピンがGNDタウトスイッチを乗せることが出来ます。

01_20210315094601

タクトスイッチの片側のピンは切断してブレッドボードに乗せました。
02_20210315094601

実際に試してみると、タクトスイッチを押すだけでリセットが出来ました。
これは良い!

更にプログラムの書き込みも、USBコネクタの抜き差しせずに行えるようになりました。
  ①リセットボタンを押し続ける
  ②BOOTSELボタンを押し続ける
  ③リセットボタンを離す
で出来ます。

USBの抜き差し不要、これはかなり良いです (*´ω`*)

製品として、ボード上に乗せる「Pico Reset Button」というのもあるようです。
PIMORONIの製品、秋月電子さんでも扱っているので、そのうち秋月電子さんで販売するかも..

2021年3月11日 (木)

Raspberry Pi PicoでLチカ

Raspberry Pi PicoでのC/C++プロジェクト作成の練習として、8個の外部接続LEDを制御するプログラムを作ってみました。
その時のメモです。開発環境はWindows 10です。

ブレッドボード上での実装の様子
02_20210310191701

動いている様子


単純な点灯ですが、最初のプロジェクトの作成、最初のGIPOの制御ということで、色々と勉強になりました。

ハードウェア面について

まず回路的には、次のような感じでGP2GP9の8個のピンにLEDを接続しています。
01_20210310192101
LEDに流したい電流を4mAとして、順方向電圧VF2.0V、ボードの駆動電圧を3.3Vとすると
電流制御抵抗値R
   R = (3.3 - 2.0) ÷ 0.004 = 325 (Ω)
となります。近い抵抗として330Ωをチョイスしました。

このあたり(LEDのの電圧降下、電流制御用抵抗値の求め方など)は下記のサイトの解説が参考になると思います。
 参考資料:
  ■ LED関連パーツ 専門店 マイクラフト - LED基本知識&自作工作のHowto集
     - LEDの電圧降下とは?
     - LEDの順電流(IF)とは?
 こういった、まとめ・解説はありがたいですね。

さて、ここで1つ 疑問 が..
「Raspberry Pi Picoは、1ポートあたりどれくらいの電流を流せるのか?」
です。

スペック紹介レベルの資料では、記載がありません。調べるのに意外と時間がかかりました。
なんか面白い(複雑な?)機能あり、簡単な記載ができなかたっぽい?です。

Raspberry Pi Pico
GPIOには"pad"という機能があって、その機能の1つに流せる電流強度の設定が出来るようです。
公開されている資料 RP2040 Datasheetの「2.19 GPIO」「2.19.4.Pads」に次のような記載があります。

Pad electrical behaviour can be adjusted to meet the requirements of the externalcircuitry.
The following adjustments are available:
Output drive strength can be set to 2mA, 4mA, 8mA or 12mA
• Output slew rate can be set to slow or fast
• Input hysteresis (schmitt trigger mode) can be enabled
• A pull-up or pull-down can be enabled, to set the output signal level when the output driver is disabled
• The input buffer can be disabled, to reduce current consumption when the pad is unused,
   unconnected or connected to an analogue signal.

2mA、4mA、8mA、12mAのいずれかの設定が可能で、デフォルト値は4mAのようです。
この設定はUser Bank Pad Control register の PADS_BANK0: GPIO0, GPIO1, …, GPIO28, GPIO29 Registers
DRIVE
ので出来るようです。

   04_20210311102201
とりあえず今回は設定変更はせず、デフォルト値の4mAを上限として利用することにします。
このあたりは後ほど調べていきます。超えて流した場合の挙動等、非常に興味深いです。

いずれにしても、12mAが上限ですかね~ 



ソフトウェア面について


最初のプロジェクト作成ということで、手順等を忘れないよう、自分的メモをのこします。

今回は新規にledというフォルダを作成して管理することにます。
プロジェクトは D:\Raspberry Pi Pico\projects\led に配置します。

また、Raspberry Pi Pico SDKは、D:\Raspberry Pi Pico\pico-sdk に配置し
環境変数PICO_SDK_PATHにこのパスを設定しておきます。
   setx PICO_SDK_PATH "D:\Raspberry Pi Pico\pico-sdk"

プロジェクト内の作成ファイル(led下のファイル)
 ① pico_sdk_import.cmake       pico sdk利用のためのファイル
 ② CMakeLists.txt                  プロジェクトファイル
 ③ led.c                                   プログラム本体

①の pico_sdk_import.cmakeは、pico-sdk\external\pico_sdk_import.cmake をコピーして配置します。
②はドキュメントを参考にして新規作成です。内容は次の通りです。

今回はプログラムソースがled.cのみのためCMakeLists.txtの記述はらくちんです。
いずれ、自作ライブラリのビルド、自作ライブラリのリンク等の記述方法についても学んでいきたいと思います。

Lチカの本体のプログラムは次のような感じです。

始めてSDKのAPIをつかいましたが、他のarm用sdkと比較すると、やれクロック活性化だのと前準備が不要でお手軽です。
Arduinoのような感じで利用出来て、大変良いですね。

プログラム的には、LED_PIN配列で8個のIOポートのマッピング、
update()関数に引数に8ビット(8個のLEDの状態)を指定してLEDのオン・オフの設定を行っています。
今回は1つ1つのLEDの状態を設定していますが、8ビット同時出力が出来るか調べて、やってみたいと思います。

一方で直接レジスタ操作して、低レベルなことも出来るようです。
これについても、ちょっとやってみます。


プログラムのビルド

ビルド作業はコマンドプロンプト 「Developer Command Prompt for VS2019」上で行います。
06_20210311113501

プロジェクトファイル(MAKEFILE)の作成
 mkdir build
 cd build
 cmake -G "NMake Makefiles" ..

これで、nmake用のmakeファイルが作成されます。
ファイル構成の変更がない限りは、1回だで実行です。

ビルド
  nmake led

プログラムファイルの更新の都度、nmakeコマンドでビルドします。
これで、build下に led.uf2が作成されます。
あとは、led.uf2Raspberry Pi Picoに書き込むだけです。


追記 2021/03/13

流せる電流の疑問の件、左端のLEDの抵抗を200Ω、150Ω、100Ωと換えていき、
流れる電流を増やす実験をしてみました。

100Ωを接続すると、LEDが点灯しなくなりました(下記の写真)。

07_20210313175101

100Ωの場合、流れる電流は13mAです。
まだ何とも言えませんが、電流制御の機能が働いていて、出力がストップされた感じです。

padの設定を12mAにしてこの挙動が変わるかと試してみました。
下記が検証用のプログラムです。

実行時の出力(設定されていることの確認)
20210315-093255

同じことをやってみましたが、挙動が一緒で100Ωの場合に、LEDが点灯しなくなりました。
もしかしたら、上記プログラムだと設定できていないのかもしれません。
いずれにしても、大きい電流出力防止的な機能があるようです。
もう少し、調べてみます。

2021/03/15 追記

データシートの「5.2.3.5. Interpreting GPIO output voltage specifications」
GIPOの出力特性に関する記載があり、何となく原因が分かりました。
次のグラフは、GPIOピンの出力電圧、流れる電流、padのdriveの設定の関係を示すものです。
(上がHigh、下はlow時)

20210315-120420

GPIOピンにHigh(LEDを点灯させる場合)を出力した場合、
実際の出力電圧は流れる電流が増えるほど下がるようです。またdiveの設定でその傾きは変更可能..
100Ωの抵抗を接続した場合にLEDが消えてしまったのは、順方向電圧低下が原因だと思われます。
あとで、再実験して電圧・電流を測定して検証してみます。