2021年4月18日日曜日

Visual Studio Codeの設定

 最近、Visual Studio Codeを積極的に使おうと努力しているのですがなかなか手に馴染みません。なんかヒントはないかなとGoogleで検索してみようかと「vs code 」と入力したところで検索候補に「日本語化」と出てきたので、そのまま検索してみたところトップに設定方法がそのまま表示されました。

Visual Studio Codeの日本語化設定

1. Visual Studio Codeを開く

2. メニューから[View]-[Command Palette]を選択

3. [Configure Display Language]を選択

4. [Install Additional Laugage]を選択サイドバーに拡張言語パックが表示されます。


簡単だけど、自分では絶対探し出せない自信がある。とりあえず日本語で表示できるようになりました。




日本語といえばソースコードのコメントが化ける場合があって文字コードの設定を合わせないとと思っていたのですが、実は自動認識の機能がありました、そしてなぜかデフォルトはオフ。どうかしています。

ファイル>基本設定>設定からfiles.autoGuessEncodingと入力しcheckをつけます。


2021年4月11日日曜日

Raspberry Pi Picoのメモリーマップ

 Picoはこのクラスのマイコンにしては潤沢なメモリーを搭載しているのであまりメモリーマップを気にせずにここまで来ましたが、MSCでフラッシュアクセスなんかの活用を考えるとメモリーの使用状況の把握は必須なのでこの機会にメモリマップの表を作成しました。

Picoメモリーマップ
アドレスサイズ用途備考
0x000000000x4000ROMブートコードなど
0x100000000x1000000FlashXIPによりメモリーイメージに展開されている
0x14000000XIP Registers
0x150000000x4000XIP CacheXIP Cacheを無効にしたらSRAMとして使用可能
0x200000000x40000SRAM4個のSRAM Bankをストライピングしている
0x200400000x1000SRAM
0x200410000x1000SRAM
0x210000000x10000SRAM Bank 0
0x210100000x10000SRAM Bank 1
0x210200000x10000SRAM Bank 2
0x210300000x10000SRAM Bank 3


PicoでCO2センサーを作ってみた!

 コロナ騒ぎのニュースの中で換気の目安としてCO2センサーを使うという話しを聞きます。調べてみると部品としてもCO2センサーは数種類出回っているようなのでアマゾンで一番安いのを試しに買ってみました。


失敗だったのはこの基板の仕様をよく読むと入力電圧が5Vとなっていることです。PicoのI/Oは3.3Vなので直接つなげないと思っていたらチップのCSS811のデータシートを見ると入力電圧は1.8~3.6Vとなっていましたので、5V系の基板に接続するために内部でLDOかなんかで3V系に落としていると見ました、それならば大丈夫だろうと3.3Vを接続したところ特に問題なく動きました。


まずはブレッドボードと接続

Pico SDKのI2Cライブラリを使用して送受信します。Arduino用には色々とサンプルコードがありますし実装例もいっぱいあるのですがPicoはもちろんその他の流用できそうなサンプルは無かったので普通にデータ仕様書見ながら初期化ルーチンを書きます。
1. HW_IDやSTATUSを確認する(なくても大丈夫)
2. APP_START(0xf4)に書き込みをして動作開始
3. MEAS_MODE(0x01)にDRIVE_MODEとINTERRUPTを設定する(モード2の場合は0x28)
4. STATUS(0x00)のDATA_READYビットをポーリングする
5. DATA_READYビットが立ったらALG_RESULT_DATAから2バイト読み込む
6. 1バイト目が上位バイトなのでビットシフトして16biti値にする。

最初のうちは0x190(400)ばかりでしたがだんだんそれっぽい数字になってきます。どうやら少しエージングする必要があるそうです。嫁が換気扇を回さずにコンロを使ったりするとかなり数値が上がったのでまぁまぁ目安にはなりそうな感じです。


Picoさえあれば開発用基板はいっぱいあるのでCO2センサー専用に1枚作りました。Picoは漢らしく直接表面実装です!
400-1000ppm    緑LED
1000-1500ppm   :黄1LED
1500-2000ppm   :黄2LED
2000以上            :赤LED

しばらくリビングで我が家の換気状況を見守らせましょう。



2021年4月7日水曜日

追加のPicoが来た!

 Seeedで基板を作る時にPicoをうけ Seeedで基板を作る時にPicoを売っているのを見つけて注文していたのですがようやく送られてきました。

オリジナルの箱に入ってた。

ケーブルとピンヘッダー付きです。

これでようやくPicoprobeを試すことが出来ます。



2021年4月3日土曜日

Raspberry Pi PicoをUSBメモリーにしてみた

 MSCのサンプルアプリは8KByteのRAMドライブを使用していますがこのRAMドライブをフラッシュに置き換えていわゆるUSBメモリー的な動作をするようにしてみました。

まずはRAMドライブが512Byte/セクターになっているのでこれをフラッシュの消去単位である4KByte/セクターに変更します。ブロック数も256ブロックにして合計1MByteのドライブになるようにします。

enum
{
  DISK_BLOCK_NUM  = 256,
  DISK_BLOCK_SIZE = 4096
};


合わせてBPBの内容をこのサイズに合わせます。

uint8_t msc_disk4 /*DISK_BLOCK_NUM*/][DISK_BLOCK_SIZE] =
{
  {
      0xEB0x3C0x90,   /* BS_jmpBoot */
      0x4D0x530x440x4F0x530x350x2E0x30,   /* BS_OEMName "MSDOS5.0" */
      0x000x10,   /* ☆BPB_BytePerSec */
      0x01,         /* BPB_SecPerClus */
      0x010x00,   /* BPB_RsvdSecCnt */
      0x01,         /* BPB_NumFATs */
      0x800x00,   /* ☆BPB_RootEntCnt */
      0x000x01,   /* ☆BPB_TotSec16 */
      0xF8,         /* BPB_Media  */
      0x010x00,   /* BPB_FATSz16 */
      0x010x00,   /* BPB_SecPerTrk */
      0x010x00,   /* BPB_NumHeads */
      0x000x000x000x00/* BPB_HiddSec */
      0x000x000x000x00/* BPB_TotSec32 */

BPBの表記はリトルエンディアンなのでセクターサイズ(BPB_BytePerSec)4096=0x1000が0x00,0x10となり、セクターサイズが8倍になったのでルートエントリー(BPB_RootEntCnt)が0x10から0x80(128個)、トータルセクターサイズ(BPB_TotSec16)は256=0x100なので0x00,0x01となります。

管理情報を予め書いておかないとアクセスできないので未フォーマットの場合(BPBのシグネイチャーが書かれていないことで判断)管理情報をフラッシュに書き込みます。

void msc_init(void)
{
#if 1 /* 0にすると強制フォーマット */
  flash_read00temp_buff512);
  if (( temp_buff[510] != 0x55) || (temp_buff[511] != 0xaa))
#endif
  {
    flash_range_eraseFLASH_TARGET_OFFSETSECTOR_SIZE *4);
    flash_range_programFLASH_TARGET_OFFSETmsc_disk[0], SECTOR_SIZE *4);
  }
}


後は肝心の読み書きAPIのwrite10,read10をフラッシュの読み書きに置き換えます。

void flash_readint32_t secint32_t offsetuint8_t *p_buffint32_t size )
{
  memcpyp_buff, &flash_target_contents[sec*4096+offset], size);
}


void flash_writeint32_t secint32_t offsetuint8_t *p_buffint32_t size )
{
  if (offset == 0)
  {
    flash_range_eraseFLASH_TARGET_OFFSETsec*4096SECTOR_SIZE);
  }
  flash_range_programFLASH_TARGET_OFFSETsec*4096 +offsetp_buffsize);
}

ReadはRP2040のeXecute In Place(XIP)の仕組みのおかげでダイレクトにメモリにマッピングされているように見えますので単純にメモリーコピーで読めます。問題なのは書き込みの方でフラッシュに書き込みを行うとキャッシュのコヒーレンシーの問題が出てしまいキャッシュをクリアする必要があるのですが、このキャッシュの管理がコードを実行しているXIPと共通なのでコードの実行に支障が出て書き込み時にストールしてしまうことがあります。データシートを見ると何か回避策がありそうな感じですが。一般的なセオリーであるフラッシュ書き込み時には別のメモリー(RAM)でコードを実行するという方法で回避します。調べてみると実に簡単にRAM上で実行できました。

CMakeLists.txtに以下の1行を足すだけです。

pico_set_binary_type(TestMSC copy_to_ram)

これで1MByteのUSBメモリーになりました。


Pico側でもこのファイルを読み書きできるように実装すればPCとのデータ共有が楽になるのでアプリケーションの幅が広がるかなと思います。