見出し画像

4.Hello World標準出力サンプル-Raspberry Pi Pico Windows C言語プログラミング入門

ここでは次のサンプルプログラムとして"Hollo World”を取り上げます。Picoインストール先の"pico-examples>hello_world>usb"がプロジェクトフォルダです。さきのblinkプロジェクトと異なり、hello_worldにはプロジェクトが2つあります。usb、およびserialプロジェクトです。usbプロジェクトは標準出力をusb経由でシリアルポートに出力します。SerialプロジェクトではGPIOピンに設定されたUARTポートに出力します。今回は、ケーブル配線が不要のため、usb経由での標準出力を確認します。

5.2.1. Hello Worldプログラムのビルド

hello_usb.cのソースリストは以下となります。

#include <stdio.h>
#include "pico/stdlib.h"

int main() {
  stdio_init_all();
  while (true) {
    printf("Hello, world!\n");
    sleep_ms(500);
  }
  return 0;
}

<stdio.h>が必要となります。このヘッダーでusb経由シリアル出力stdioが定義されています。Main先頭で、stdioを初期化します。
stdio_init_all();
次のwhileの永久ループで、500msec毎に、標準出力のusb経由シリアルに"Hello world!"を出力します。先のBlinkプログラム同様に、ビルドします。画面下、ブルーのバーで、ギアマーク横"Build"をクリックします。ビルド完了後の”pico-examples>build>hello_world>usb”のフォルダを開きます。ここにhellow_usb.uf2のファイルが作成されていますので、コピーします。ソースが変更された場合、Uf2ファイル作成日付が、ビルド実行日付になっていることを確認してください。これはビルドが正常に終了し最新の実行ファイルに更新されたことを意味します。変更しなければ、過去ビルドの日付になっています。次にPicoからUSBケーブルを抜き、BOOTSELボタンを押しながら、再度ケーブルを差します。最後にBOOTSELボタンをはなします。PicoがRPI-RP2(X:)、マスストレージとしてPCに認識されますので、uf2ファイルをPicoに書き込みます。

これで、hello_worldプログラムは実行されますがこのままでは確認できません。以下のステップで、ターミナルソフトをインストール、実行し、プログラムが正常に動作していることを確認します。

5.2.2.WindowsPCへのTeraTermVTインストール

現在開発に使用している同じPCでターミナルソフトTera Termを起動させます。インストールされていない場合は以下、https://ja.osdn.net/projects/ttssh2/releases/

からダウンロードし、Tera Termを起動します。

図5.2.2.1

シリアルを選択し、USBシリアルデバイスのポートを選択します。ポート番号は、お使いのPC環境で違ってきます。OKボタンで終了します。

図5.2.2.2

この一覧にPico間のUSBシリアルポートが表示されるのは、uf2プログラムを書き込み、実行した後です。ストレージモード中では一覧に表示されません。PicoのUSB標準出力はPicoが実行されてはじめて、PCで認識でき、このポート一覧に表示されます。

この段階で、Tera Termの画面に "Hello,world!"が表示されますが、ボーレイトを変更する必要があります。上部メニューから「設定」 > 「シリアルポート」を選択します。ここでスピードを115200に変更します。Raspberry Pi Picoのスピード、ボーレイトの初期値は115200です。

図5.2.2.3

「現在の接続を再設定」ボタンをクリックし、表示画面に戻ります。以下、”Hello World"が受信、表示されます。

図5.2.2.4

「編集」>「画面クリア」で画面をクリアできます。

5.3.時刻出力プログラム
次にプログラム改造し、標準出力に時刻を出力するプログラムを作成してみます。Picoにはリアルタイムクロックのライブラリが備わっています。このライブラリを使用します。ただし、電源オフ時の時刻のバックアップ機能ありません。電源オフでもバックアップ可能なRTCボードプロジェクトは、後の12章にあるので参照してください。同時に日付の関数も使用します。ライブラリを追加する場合、Cソースでヘッダーファイルをインクルードする必要があると同時に、CMakeLists.txtにも追加が必要です。

以下、CMakeLists.txtです。

if(TARGET tinyusb_device)
add_executable(hello_usb hello_usb.c

# pull in common dependencies
#target_link_libraries(hello_usb pico_stdlib) # <<<ここを変更
target_link_libraries(hello_usb pico_stdlib hardware_rtc) #<<< hardware_rtc追加

# enable usb output, disable uart output
pico_enable_stdio_usb(hello_usb 1)
pico_enable_stdio_uart(hello_usb 0)

# create map/bin/hex/uf2 file etc.
pico_add_extra_outputs(hello_usb)

# add url via pico_set_program_url
example_auto_set_url(hello_usb)
elseif(PICO_ON_DEVICE)
message(WARNING "not building hello_usb because TinyUSB submodule is not initialized in the SDK")
endif()

ソースリストは以下です。まずrtc.hおよびdatetime.hのインクルードを追加します。次にMain.cの先頭部分で
rtc_init();
rtc_set_datetime(&t);
sleep_us(64);
とリアルタイムクロックを初期化します。Sleep_us(64)は64uec待機します。ハードウエア上必要な待機時間です。あとは永久ループ内でrtc_get_datetime(&t)で現在時間を読み取り、文字列に変換し、USBシリアルに出力します。希望の現在時刻を、datetime tに設定します。

#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/rtc.h"
#include "pico/util/datetime.h"
int main() {
    stdio_init_all();
    char datetime_buf[256];
    char *datetime_str = &datetime_buf[0];
    datetime_t t = {
        .year  = 2023,
        .month = 02,
        .day   = 27,
        .dotw  = 1, // 0 is Sunday, so 5 is Friday
        .hour  = 11,
        .min   = 16,
        .sec   = 00
    };
    rtc_init();
    rtc_set_datetime(&t);
    sleep_us(64);
    while (true) {
        printf("Hello, world!\n");
        rtc_get_datetime(&t);
        datetime_to_str(datetime_str, sizeof(datetime_buf), &t);
        printf("%s\n", datetime_str);
        sleep_ms(1000);
    }
    return 0;
}

画面下、ブルーのバーで、ギアマーク横[Build]をクリックしビルドします。”pico-examples>build>hello_world>usb”のフォルダ内にhellow_usb.uf2のファイルが作成されていますので、コピーします。次にPicoからUSBケーブルを抜き、BOOTSELボタンを押しながら、再度ケーブルを差します。最後にBOOTSELボタンをはなします。PicoがRPI-RP2(X:)、マスストレージとして、PCに認識されますので、uf2ファイルをPicoに書き込みます。TersaTermVTを起動し、プログラムが正常に動いているか確認します。

図5.2.2.5

1秒ごとに、現在の日付、時刻が表示されます。

5.4.Picoオンボード温度計測
Hello worldの最後のプログラム例としてPico内蔵の温度センサー値を読み込み温度ロガーを作成します。Adcライブラリを使用します。CMakeLists.txtにadcライブラリを追加します。以下、CMakeLists.txtに、先のrtcライブラリと同様、追記します。

#target_link_libraries(hello_usb pico_stdlib hardware_rtc)
target_link_libraries(hello_usb pico_stdlib hardware_rtc hardware_adc)

次にCソースリストの変更です。ヘッダーでadcライブラリをインクルードします。
#include "hardware/adc.h"

以下、最終ソースリストです

#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/rtc.h"
#include "pico/util/datetime.h"
#include "hardware/adc.h"

int main() {
    stdio_init_all();
    char datetime_buf[256];
    char *datetime_str = &datetime_buf[0];
    datetime_t t = {
        .year  = 2023,
        .month = 02,
        .day   = 27,
        .dotw  = 1, // 0 is Sunday, so 5 is Friday
        .hour  = 11,
        .min   = 16,
        .sec   = 00
    };
    rtc_init();
    rtc_set_datetime(&t);
    sleep_us(64);
    /* 12-bit conversion, assume max value == ADC_VREF == 3.3 V */
    const float conversionFactor = 3.3f / (1 << 12);
    adc_init();
    adc_set_temp_sensor_enabled(true);
    adc_select_input(4);
    while (true) {
        printf("Hello, world!\n");
        rtc_get_datetime(&t);
        datetime_to_str(datetime_str, sizeof(datetime_buf), &t);
        printf("%s\n", datetime_str);
        float adc = (float)adc_read() * conversionFactor;
        float tempC = 27.0f - (adc - 0.706f) / 0.001721f;
        printf("Onboard temperature = %.02fC\n", tempC);
        sleep_ms(1000);
    }
    return 0;
}

開始されるので、Tera Term VTを起動して結果を確認します。

図5.2.2.6

時刻とともに、温度が表示されるのを確認できます。

この内容、”Raspberry Pi Pico Windows C言語プログラミング入門”は 以下のサイトでPDFでご購入できます。
www.elabnet.jp ショップ
https://www.elabnet.jp/shopdata/#cc-m-product-14710382635

この記事が気に入ったらサポートをしてみませんか?