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

« 2021年2月 | トップページ | 2021年4月 »

2021年3月の6件の記事

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

「Arduino STM32 リファレンス 日本語版」が2万アクセス突破!

何気に自分用にまとめていた「Arduino STM32 リファレンス 日本語版」が2万アクセス突破!
ScrapBox、ページ参照数のカウンター機能があるんですね~ 気付きませんでした)
微妙に閲覧されているんですね。内容的に中途で放置している状況、申し訳ないです。

01_20210326112601

豊四季タイニーBASIC for Arduino STM32」の開発のためのArduino STM32の解析メモ、
ついでにScrapBoxの使い具合を知るために作成したのですが、労力が活用されるのは嬉しいです。

ただし、かつてのNAVERのように、内容を理解していない人が小銭稼ぎで、丸写し転用・公開はノーサンキュです。
NAVERといえば、一次ソース公開者に利益分配するとか言ってましたが曖昧にしたまま、結局は何もせず終了

関連会社のLINEについても、ここにきてやっと以前からエンジニアの間での常識だった問題が
やっと一般にも知られてきましたね~
常識のあるエンジニアさんは、何年も前から「私はLINEは使わない」っていってましたよね~
こういう情報が中々伝わらないのも、日本のマスゴミが、顧客スポンサーの批判報道には消極的だからでしょうね..

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が消えてしまったのは、順方向電圧低下が原因だと思われます。
あとで、再実験して電圧・電流を測定して検証してみます。

« 2021年2月 | トップページ | 2021年4月 »