Magicode logo
Magicode
0
10 min read

Raspberry Pi PicoのSDKを軽く調べてみた

https://cdn.apollon.ai/media/notebox/14600e28-b431-4c34-a279-473c7f30f3a6.jpeg

はじめに

今回は、Raspberry Pi Pico(以下、pico)のSDKについて軽く調べてみた。
ドキュメントを一つ一つ丁寧に読むのは大変なので、以前の投稿で使った加速度センサのサンプルをベースに調べた。

環境

  • PC
    • windows 10
  • pico
  • USBケーブル
    • 家に転がってたものを
  • 加速度センサー(MMA8452Q)
  • 330Ωの抵抗 x 2
    • 動作確認では手元になかったので使ってないが、ドキュメントを見た感じ合った方がよさそう。
  • ブレッドボードやジャンパー
    • VDD/GND用 2 or 4本
    • SCL/SDA用 2本
  • 開発環境
    • Visual Studio Code
  • 動作確認環境
    • TeraTerm

調査ターゲット

mma8451_i2cのサンプルコードをターゲットに、pico SDK関連を調査する。

使われている項目

サンプルコードの中で登場するpico SDK関連のものを整理する。

include ファイル

includeは3つしている。
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/i2c.h"

使っているAPI

  • stdio_init_all
  • i2c_init
  • gpio_set_function
  • gpio_pull_up
  • bi_decl
  • bi_2pins_with_func
  • i2c_write_blocking
  • i2c_read_blocking

API仕様

pico sdk マニュアルもあるが、今回はオンラインのAPIドキュメントで必要なAPIの確認のみ行う。

全体構成

大きく分けると6つのライブラリ群に分けられる模様。
今回使ってるのは

pico/stdlib

Aggregation of a core subset of Raspberry Pi Pico SDK libraries used by most executables along with some additional utility methods. Including pico_stdlib gives you everything you need to get a basic program running which prints to stdout or flashes a LED.
基本的なライブラリを読み込んでいる模様。
この辺り
#include "pico.h"
#include "pico/stdio.h"
#include "pico/time.h"
#include "hardware/gpio.h"
#include "hardware/uart.h"

stdio_init_all()

pico/stdio にあり、上述の通り、stdlibを読み込むことでstdioも読み込んでいる。
標準入出力関係を初期化してくれる。
ここはちょっとよくわからなかった。
When stdio_usb is configured, this method can be optionally made to block, waiting for a connection via the variables specified in stdio_usb_init (i.e. PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS)

i2c_init()

hardware/i2cにある。
名前の通りi2c通信の初期化をする。

第一引数

第一引数はi2c_inst_t* という型のデータだが、i2c_0かi2c_1のどちらかを使うように書かれている。
これらを使えということかな。
今回はi2c_defaultというマクロを使っていて、これが ここで定義されている。
さらにいろいろ定義があるが、 __CONCATで“i2c”とPICO_DEFAULT_I2Cを文字列結合している。 PICO_DEFAULT_I2Cはpico.hで定義されていて 0 である。
なので、 PICO_DEFAULT_I2C_INSTANCEは i2c0 になる。
このi2c0は&i2c0_instである(定義)。

第二引数

Hz単位のBaudrate。
サンプルでは、boardrateを400kHzにしているが、なぜこの値かよくわからなかった。
datasheetを見るとfast modeの時の最大値が400kHzだったが、それのことだろうか?
一旦ここまで

gpio_set_function()

hareware/gpioにあり、stdlibで読み込んでいる。
第一引数で指定したピンを第二引数のGPIO機能を指定する。

第一引数

サンプルでは、はpico.hで指定しているデフォルトピンを使っている。
#ifndef PICO_DEFAULT_I2C
#define PICO_DEFAULT_I2C 0
#endif
#ifndef PICO_DEFAULT_I2C_SDA_PIN
#define PICO_DEFAULT_I2C_SDA_PIN 4
#endif
#ifndef PICO_DEFAULT_I2C_SCL_PIN
#define PICO_DEFAULT_I2C_SCL_PIN 5
#endif
デフォルト以外では下記のペア(SCL, SDAの順)が使える。 
[GP1,GP0]、[GP3,GP2]、 [GP5,GP4]、 [GP7,GP6]、 [GP9,GP8]、 [GP11,GP10]、 [GP13,GP12]、[GP15,GP14]、 [GP17,GP16]、 [GP19,GP18]、 [GP21,GP20]、 [GP27,GP26] https://www.denshi.club/parts/2021/04/raspberry-pi-pico-6.html

第二引数

図のenumの値を入れる。
今回は GPIO_FUNC_I2C

gpio_pull_up()

hareware/gpioにあり、stdlibで読み込んでいる。
治一引数で指定したピンをプルアップする。
これは、加速度センサのdatasheetを読むとプルアップするように書いてある。
The SDA and SCL I2C connections are open drain and therefore require a pullup resistor as shown in the application diagram in Figure 4

i2c_write_blocking()

hareware/i2cにある。
ブロッキングしながら、指定したアドレスに渡したデータを書き込む。

第一引数

i2c_init()と同じ

第二引数

このアドレスは、加速度センサのdatasheetから読み取る。
SAOピンへの入力が0なら0x1C, 1なら0x1D。
このページによるとAがSA0につながっていて、デフォルトは3.3VにプルアップしてつながっているためSAOが1になっている。そのため0x1Dになっている。
もしSA0を0にしたいならGNDにつなぐ。
これは、私が使っているMMA8452Qでも同じ。
https://learn.sparkfun.com/tutorials/mma8452q-accelerometer-breakout-hookup-guide

第三、第四引数

書き込むデータとその長さ

第五引数

ちょっとよくわからなかった。

i2c_read_blocking()

hareware/i2cにある。
指定したアドレスから指定した長さのデータを読み込む

サンプル内の具体的な処理

i2c_write_blocking()に関しては、何度か違う処理をしている。
それについて整理する。

モードの変更

mma8451_set_state()
書き込んでいるbufの中身は下記。
buf[0] = REG_CTRL_REG1; //0x2A
buf[1] = 0x00 or 0x01
datasheetを読むとスタンドバイモード/アクティブモードの切り替えの模様。

ダイナミックレンジの調整

buf[0] = REG_DATA_CFG; //0x0E
buf[1] = range_config; //0x01; // 0x00 for ±2g, 0x01 for ±4g, 0x02 for ±8g
ダイナミックレンジの調整をしていて、ここでは±4gにしている。

センサ値の読み取り

加速度センサのxを読み取るときは、i2c_read_blocking()の前にREG_X_MSB(0x01)を書き込み
yの時はREG_Y_MSB(0x03)、zの時はREG_Z_MSB(0x05)を書き込んでいる。
ちなみに、参考:MSB, LSB https://algorithm.joho.info/network/msb-lsb/

Discussion

コメントにはログインが必要です。