ラベル Raspberry Pi Pico の投稿を表示しています。 すべての投稿を表示
ラベル Raspberry Pi Pico の投稿を表示しています。 すべての投稿を表示

2023年4月1日土曜日

Raspberry Pi Pico W発売!

https://www.switch-science.com/products/8171
 スイッチサイエンスが2022年6月に発表した「Raspberry Pi Pico W」を販売開始すると発表しました。価格は1,210円だそうです。技適取得のため発表からずいぶん時間が開きましたが、ようやく発売できるようになったようです。

現在は入手困難な様子ですが手に入ったらちょっといじってみたいと思います。


2022年7月14日木曜日

Pico W のドキュメント

 https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf


どうやらこれがネットワーク機能に関するドキュメントらしい。

アプリケーションノートっていうかSDKの差分マニュアルって感じ。


SDKのインストールの説明の所で"cyw43-driver"と"lwip"をチェックアウトしないとネットワーク機能は使えないと説明されている。

lwIP は組み込み向けのオープンソース TCP/IPプロトコルスタック。


後はCによるサンプルの説明と独自のプロジェクトの作成方法とMicroPythonでの使用方法が説明されていました。

CコードでlwIPのAPIを触る部分は全然説明が無く、これ以上の情報はlwIPのサイト(https://savannah.nongnu.org/projects/lwip/)かpico_wのサンプルコード(https://github.com/raspberrypi/pico-examples/tree/picow/pico_w)を見ろと書いてある。


サンプルコードはこんな感じ

・access_point

・blink

・freertos

・iperf

・ntp_client

・python_test_tcp

・tcp_client

・tcp_server

・wifi_scan


割とローレベルな物しかない印象…


2022年7月11日月曜日

Raspberry Pi Pico W発表!

Raspberry Pi PicoにInfineon CYW43439無線チップを追加搭載して2.4 GHzの無線LAN機能(802.11n)が使えるようになりました!

接続はSPI接続だそうで、CからもMicroPythonからも使えアクセスポイントとしても動作すると書かれています、サンプルコードはWEBサーバーとして動作するようなものだとか。

基本的にピンコンパチっぽいですがアンテナのせいかSWDとかデバッグ用端子は位置が変わってしまっています。ちなみにUSBコネクタはmicroです、どうせならType-Cにして欲しかったところです。


現在はまだ技適が取れてみたいで、技適が取れ次第発売予定となっていました。
発売したら入手していじってみたいと思います。


2021年5月4日火曜日

いつの間にかPICOのSDKがアップデートしていた。

 PICOのドキュメントを見てたら、いつの間にかアップデートしていることに気が付いた。
ヒストリーによると以下の通り

1.4     07/Apr/2021

• Minor corrections
• Added errata E10
• Note about how to update the C SDK from Github
• To accompany the V1.1.2 release of the C SDK

1.4.1     13/Apr/2021
• Minor corrections
• Clarified that all source code in the documentation is under the 3-Clause BSD license.

どうやらC SDKがV1.1.0からV1.1.2にアップデートしたようだが具体的なところはよくわかりません。Windowsでのデバッグ周りがもう少し簡単にならないかなと思う今日この頃。


2021年5月1日土曜日

CO2 測定機にOLEDな0.96インチ ディスプレイを付けてみた!


 LED表示だけだといまいちちゃんと動いてるのかよくわからないので、うちにいくつか転がっていたOLEDの0.96インチ ディスプレイを接続して具体的な数字を表示しました。
SPI接続なのでSDKのSPI関数を使用して制御してます。

void OLED_Init(void)
{
    // SPI initialisation. This example will use SPI at 1MHz.
    spi_init(SPI_PORT, 1000*1000);
    gpio_set_function(PIN_MISO, GPIO_FUNC_SPI);
    gpio_set_function(PIN_SCK,  GPIO_FUNC_SPI);
    gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI);
    gpio_init(PIN_DC);
    gpio_init(PIN_CS);

    // Chip select is active-low, so we'll initialise it to a driven-high state
    gpio_set_dir(PIN_DC, GPIO_OUT);
    gpio_set_dir(PIN_CS, GPIO_OUT);

    OLED_CS_Set();
    OLED_DC_Set();

    sleep_ms(500);
    
    OLED_WrCmd(0xae);
    ...

たぶんディスプレイのベンダーによるものと思われるサンプルコードを元に書きましたが、CSをSPIの機能ではなく単純なGPIOとして動作させている以外は特に何も設定せずに素直に動いてくれました。

だがしかし!0.96インチだと文字が小さい・・・
もう一回り大きくしたいところだけどフォントを自作するのはめんどくさいなぁと思う今日この頃。



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_disk[ 4 /*DISK_BLOCK_NUM*/][DISK_BLOCK_SIZE] =
{
  {
      0xEB, 0x3C, 0x90,   /* BS_jmpBoot */
      0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30,   /* BS_OEMName "MSDOS5.0" */
      0x00, 0x10,   /* ☆BPB_BytePerSec */
      0x01,         /* BPB_SecPerClus */
      0x01, 0x00,   /* BPB_RsvdSecCnt */
      0x01,         /* BPB_NumFATs */
      0x80, 0x00,   /* ☆BPB_RootEntCnt */
      0x00, 0x01,   /* ☆BPB_TotSec16 */
      0xF8,         /* BPB_Media  */
      0x01, 0x00,   /* BPB_FATSz16 */
      0x01, 0x00,   /* BPB_SecPerTrk */
      0x01, 0x00,   /* BPB_NumHeads */
      0x00, 0x00, 0x00, 0x00, /* BPB_HiddSec */
      0x00, 0x00, 0x00, 0x00, /* 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_read( 0, 0, temp_buff, 512);
  if (( temp_buff[510] != 0x55) || (temp_buff[511] != 0xaa))
#endif
  {
    flash_range_erase( FLASH_TARGET_OFFSET, SECTOR_SIZE *4);
    flash_range_program( FLASH_TARGET_OFFSET, msc_disk[0], SECTOR_SIZE *4);
  }
}


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

void flash_read( int32_t sec, int32_t offset, uint8_t *p_buff, int32_t size )
{
  memcpy( p_buff, &flash_target_contents[sec*4096+offset], size);
}


void flash_write( int32_t sec, int32_t offset, uint8_t *p_buff, int32_t size )
{
  if (offset == 0)
  {
    flash_range_erase( FLASH_TARGET_OFFSET+ sec*4096, SECTOR_SIZE);
  }
  flash_range_program( FLASH_TARGET_OFFSET+ sec*4096 +offset, p_buff, size);
}

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

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

pico_set_binary_type(TestMSC copy_to_ram)

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


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


2021年3月31日水曜日

デュアルコア用の機能

マルチコア用の仕組みはこれだけではなくコアの間にSIO(Single-cycle IO block)というブロックがありこの中にFIFO 0 to 1、FIFO 1 to 0というコア間でデータ転送する仕組みとHardware Spinlockというリソースの排他制御の仕組みなどがあります。


SIO(Single-cycle IO block)に含まれる機能
・CPUID
・GPIO Control
・Hardware Spinlock
・Inter-processor FIFO (Mailboxes)
・Integer Divider
・Interpolator



2021年3月30日火曜日

Tiny USB のMIDIクラスの受信ルーチン

先日見つけた Tiny USB のサンプルコードは送信しかしていなかったので受信はどうするのかなと色々見てたのですが特にドキュメントも用意されていない様子。まぁこれぐらいのことはソースコードを読んで理解しろということなのかもしれません。

とりあえずサンプルコードで送信している関数tudi_midi_write24()をgrepしてみるとこれはmidi_device.hというヘッダーファイルにインライン関数として定義されていました。
同列に用意されているAPIは以下の通り。

//--------------------------------------------------------------------+
// Application API (Single Interface)
//--------------------------------------------------------------------+
static inline bool     tud_midi_mounted    (void);
static inline uint32_t tud_midi_available  (void);
static inline uint32_t tud_midi_read       (void* buffer, uint32_t bufsize);
static inline void     tud_midi_read_flush (void);
static inline uint32_t tud_midi_write      (uint8_t jack_id, uint8_t const* buffer, uint32_t bufsize);
static inline uint32_t tudi_midi_write24   (uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3);
static inline bool     tud_midi_receive    (uint8_t packet[4]);
static inline bool     tud_midi_send       (uint8_t const packet[4]);

3バイトメッセージの送信関数はあるのに2バイトメッセージの送信関数は無いんだなという中途半端感はありますが、問題はそこではなく受信関数でした。この中で受信に関係ありそうなのはtud_midi_read()とtud_midi_read_flush()。ソースコードを確認してみたところtud_midi_available()も受信用APIでした。

static inline uint32_t tud_midi_available(void);
受信FIFOにあるデータ数を返す。

static inline uint32_t tud_midi_read(void* buffer, uint32_t bufsize);
受信FIFOにあるデータを指定されたバッファにコピーする。

static inline void     tud_midi_read_flush(void);
受信FIFOをクリアする。

ということらしいのでtud_midi_available()でデータを受信しているか確認してデータがあればtud_midi_read()で読み込むというのが正しそうです。

実際のコードにするとこんな感じ

void MIDI_ReadTask( void )
{
    uint8_t buff[RX_BUFFSIZE];
    
    uint32_t read_size = tud_midi_available();
    if ( read_size > 0 )
    {
        int32_t i;
        read_size = tud_midi_read( buff, RX_BUFFSIZE );

        for ( i=0; i<read_size; i++ )
        {
            printf( "0x%02X ", buff[i] );
        }
        puts(" ");
    }
}

試しにMIDI-OXからノートメッセージを送信してみるとコンソールに正しく表示されました。この関数をメインループの中からポーリングしても良いですがtud_midi_rx_cb()というコールバックの仕組みも用意されているのでこちらから呼ぶのがスマートですね。
RTOSが使えるようになったらここでタスクを起床してMIDI処理をさせる流れです。

void tud_midi_rx_cb(uint8_t itf)
{
    MIDI_ReadTask();
}



2021年3月29日月曜日

「Pico RGB Keypad」を買ってみた!

 秋月で自作基板用の部品を見繕っていたらPimoroniのPico RGB Keypadを見つけ、「これはMIDIコントローラーに良いかも!」と一緒に注文してしまいました。

それが届いたので早速組み立て。といっても半田付けするようなところはなくキーパッドのシリコンパッドをネジ止めするだけです。そして公式のGitリポジトリからサンプルコードを落として、コンパイル、焼きこみ、・・・何も起こらない。

サンプルのソースコードを見るとLEDは薄く点灯してパッドを押すとLEDの色が変化する感じのようです。とりあえず良くわからないのでサンプルコードでUSB-シリアルを使えるように変更してprintfデバッグしてみたところ、どうやらスイッチは正しく読めているがLEDが全く反応しない。PICOのSPI端子の所をオシロで見てもそれなりに動いてそうです。
Pimoroni公式に何か情報ないかと見て回ったのですが、この基板の回路図すらおいてない。まぁ動いてしまえば大したことやってる基板じゃないからサンプルコードだけあれば十分なんだろうけどね。楽しみにしていた分がっかりでした。



2021年3月27日土曜日

Pico用の基板ができた!

 3/14に発注した基板が今日届きました!13日後ということで2週間かからずに手に入るのはなかなか良いのではないかと思います。ほとんどが輸送にかかっている時間なので輸送にお金をかければもっと早くなるんじゃないかと思います。

こんな感じの梱包で届きました。


部品面

半田面

部品を実装するとこんな感じ

ピンヘッダーも付けたのでブレッドボードと組み合わせるもよし、ユニバーサル基板部分も設けているので開発基板としてはそれなりに使えそうです。

だがしかし、肝心のPicoが1枚しかないのでPicoprobeを使った開発がまだできないのが残念。現在追加の発注をしているので届くまではprintfデバッグで頑張ります!


2021年3月26日金曜日

Raspberry Pi Picoはデュアルコア!

Raspberry Pi PicoはRaspberry Pi財団が独自に開発したARM Cortex M0+デュアルコアのRP2040というマイコンが搭載されています。スマホに慣れた人にはデュアルコアなんて当たり前に見えるかもしれませんがARMのM系マイコンのプログラミングをしたことのある人には「え?どうなってんの?」と思わずにはいられないと思います。一般的にはメインメモリへのアクセスの競合を抑えるためにコアにキャッシュを持つのがマルチコアの常套手段だと思うのですがRP2040はM0+コアですからキャッシュなんてありません。RP2040のデータシートを見てみるとどうやらAHB-Lite crossbarというバスと6個に分割されているSRAMに仕組みがありました。AHB-Lite crossbarはクロスバーというだけあり単純なバスではなくSplitterとArbiterの組み合わせにより最大同時4転送できるようになっており分割されたSRAMを個別に割り当てることにより独立動作することが可能になっているようです。

RP2040の主な機能
• Dual Cortex M0+ processor cores, up to 133 MHz
• 264 kB of embedded SRAM in 6 banks
• 6 dedicated IO for SPI Flash (supporting XIP)
• 30 multifunction GPIO
• Dedicated hardware for commonly used peripherals
• Programmable IO for extended peripheral support
• 4 channel ADC with internal temperature sensor, 0.5 MSa/s, 12-bit conversion
• USB 1.1 Host/Device



2021年3月23日火曜日

USB-MIDIのサンプルコードはどこ?

まじめにTinyUSBのドキュメントを読み込むのは大変なのでUSB-MIDIのサンプルコードが無いかなと探していたところpico-sdk/lib/tinyusbにサンプルが含まれているという記事を見つけて、「そうかpico-exampleじゃなくてpico-sdkの方か!」と早速そのフォルダを見てみるとなんとカラでした。
WEBから見るGitリポジトリにはファイルが色々あるのでどうやら落とせてないだけみたい。Gitには詳しくないので色々調べてみたところ、Raspberry Pi Picoに直接関係が無いような部分はsubmoduleで管理しておりドキュメントで書かれているコマンドでは落ちてこないそうです。

ドキュメントに書かれているSDKを落とすコマンド
>git clone -b master https://github.com/raspberrypi/pico-sdk.git

こうするとsubmoduleも全部落としてくれる
>git clone --recursive https://github.com/raspberrypi/pico-sdk.git

私のように既に落としてしまっている場合はpico-sdkフォルダ上から
>git submodule update --init --recursive

とすると全部落としてくれます。


ちなみにUSB-MIDIのサンプルはここにありました。
pico-sdk\lib\tinyusb\examples\device\midi_test

 

2021年3月22日月曜日

Raspberry Pi Pico SDKのタイマー値を読む

スイッチをマジメに読むにはチャタリングの除去をする必要がありますが、タイマー割り込みを設定するほどのことではないのでサンプルコードにちょうど良い物がないかなと探してみたらTiny USBのコードの中でboard_millis()という関数で起動からの積算時間をミリ秒単位で取得していました。ソースコードを見てみるとTiny USBとして抽象化するためにラッピングしているだけのようなので、直接SDKのAPIを呼ぶようにします。
APIとしては to_ms_since_boot(get_absolute_time()) こんな感じでget_absolute_time()でマイクロ秒単位の時間を単純に/1000しているだけのようです。
実際のコードはほぼサンプルコードと同じにして経過時間が達していなければリターンするコードとなっています。

int32_t Switch_Task( void )
{
    static uint32_t start_ms = 0;
    uint32_t s,d,e;
    int32_t i;

    if (to_ms_since_boot(get_absolute_time()) - start_ms < SWITCH_INTERVAL)
    {
        return 0; /* 時間になる前ならリターン */
    }
    start_ms += SWITCH_INTERVAL;
~中略~


int main()
{
    stdio_init_all();

    puts("Raspberry Pi Pico");
      
    while (1) 
    {
        Switch_Task();
    }


2021年3月21日日曜日

The pico project generatorで新しいプロジェクトを作ってみた

プロジェクトを手動で作る方法を延々と説明した後で、GUIでプロジェクトを作成するツールが紹介されてます。初心者にはこちらを先に教えてもらった方がうれしいのではないだろうか?

さっそくGitから落とします。
> git clone https://github.com/raspberrypi/pico-project-generator.git 

フォルダに移動して実行します
> cd pico-project-generator
> pico_project.py --gui 


Project NameとLocationを設定します。LocationはPICO_SDK_PATHがドキュメントにあるような"../../pico-sdk"感じに設定されているとこの相対パスに合うような位置にする必要があります。それを鑑みるとPICO_SDK_PATHは絶対パスで指定しておいた方が面倒がないです。
IDE OptionsにCreate VSCode projectがありますのでチェックしておくとVSCodeのOpen Folder..で開けるようになります。


2021年3月20日土曜日

Raspberry Pi Picoでスイッチ入力してみた

基板を発送したとメールが来たので、中身の方を少しづつ作っていく事にします。
まずはLチカでGPIO出力はやってみているのでブレッドボード上にSWを実装してGPIO入力を確認します。


写真の通りGPIO10とGND間にタクトスイッチを実装します。

通常スイッチ入力の場合、抵抗でプルアップしますがRP2040は各ポートに内蔵プルアップ/プルダウンの機能があるのでそれを有効にします。SDKにgpio_puull_upというAPIが用意されているのでそれを使ってプルアップ抵抗を有効にします。

    gpio_init(SW_PIN);
    gpio_pull_up(SW_PIN);
    gpio_set_dir(SW_PIN, GPIO_IN);

    while (1) 
    {
        if (gpio_get(SW_PIN))
        {
            gpio_put(LED_PIN, 1);
        }
        else
        {
            gpio_put(LED_PIN, 0);
        }
        sleep_ms(10);
    }

実行部分は簡単に押されてGPIOがローレベルになったらそのままLEDのGPIOもローレベルにしてLEDを消灯するというものです。

現状Picoがなかなか入手できないので2枚使ってのSWDデバッグが出来ないのでついでにprintfデバッグをするためのシリアル出力を確認しておきます。

CMakeLists.txtに下記の行を入れます。

pico_enable_stdio_usb(test 1)

標準入出力のヘッダーファイルstdio.hをインクルードします。

#include <stdio.h>

main関数の冒頭で初期化します。

    stdio_init_all();

puts関数で出力します。

    while (1) 
    {
        sw = gpio_get(SW_PIN);
        if (sw)
        {
            gpio_put(LED_PIN, 1);
            if (edge == 0)
            {
                puts("Sw turn high");
            }
        }
        else
        {
            gpio_put(LED_PIN, 0);
            if (edge == 1)
            {
                puts("Sw turn low");
            }
        }
        edge = sw;
        sleep_ms(10);
    }

非常に簡単です、ちなみにCMakeLists.txtの行を入れ替えるだけでUART出力に入れ替えられるようです。SDKさまさまです、とても良くできてると思います。


2021年3月19日金曜日

新規プロジェクトを作る

 サンプルコードを直接変更するのも何なので「Getting started with Raspberry Pi Pico」の「Chapter 7. Creating your own Project」の感じで新規プロジェクトを作成します。

ドキュメントではLinux環境で説明されているのでWindows用に読み替えていきます。

pico-examples/
pico-sdk/
test/

ここにtestフォルダを作成してソースコード(test.c)とCMakeLists.txt、pico_sdk_import.cmakeをコピーします。

CMakeLists.txtの中身はこんな感じ

cmake_minimum_required(VERSION 3.12)
include(pico_sdk_import.cmake)
project(test_project)
pico_sdk_init()
add_executable(test
    test.c
)
pico_enable_stdio_usb(test 1)
pico_add_extra_outputs(test)
target_link_libraries(test pico_stdlib)

pico_sdk_import.cmakeは pico-sdk/external/pico_sdk_import.cmake にあります。

testフォルダ内にbuildフォルダを作成してそこから下記のようにmakeを実行します。

cmake -G "NMake Makefiles" ..
nmake

これでtest.uf2まで作成できます。
ちなみにファイルを追加する場合はCMakeLists.txtにファイル名を追加します。

add_executable(test
    test.c
    add_file.c
)