Raspberry Pi PicoでI2C温度湿度センサの読み取り

アイキャッチ

ラズパイPicoで温度湿度を取得

I2CやSPIのシリアル通信で計測値を読み出せるセンサーICはいろいろあります。ブログであまり見かけないウルト (Würth Elektronik) の温湿度センサーで温度と湿度を読んでみました。

実験風景

使用したのはRaspberry Pi Pico と、温湿度センサー (WSEN-HIDS) の評価ボードなど。

  • Raspberry Pi Pico
  • WSEN-EVAL HIDS
  • PicoProbe ジグ基板 (製作基板)
  • デバッグ中のベースボード (製作基板)

ブロック図と回路図

ブロック図

ブロック図です。CPUとセンサーとの接続はI2Cにしました。(このセンサーはSPIでも通信できる)

ブロック図

PicoProbe はラズパイPicoを使ったラズパイPico用のデバッガです。詳しくは公式ドキュメント などを参照してください。

回路図

こちらが簡単な回路図。(画像クリックで拡大)

I2CのプルアップはラズパイPico (PR2040)の内部でできますが、流用した基板の関係で外部にも1kΩをつけています。

回路図

ソースコード

センサーについて詳しくは別記事にまとめますが(作成中)、ここではメーカーのウルトから提供されているSTM32向けのサンプルデザインを使って動かした方法を書きます。C言語です。

ラズパイPicoのI2Cドライバで動作するように、サンプルデザインの platform.c と WSEN_HIDS_EXAMPLE.c ファイルを書き換えました。サンプルには精度が3種類 (float, uint16, uint8 ) ありましたが、動作がシンプルそうな uint8 で実験します。

Picoで動いたソースコードの肝の部分。

WSEN_HIDS_EXAMPLE.c

インクルードと初期化処理の部分

#include "hardware/gpio.h"
#include "hardware/i2c.h"
#include "hardware/uart.h"
#include "pico/binary_info.h"
#include "wsen_sensor/WSEN_HIDS_2523020210001.h"
/* I2C setup */
i2c_init(i2c_default, 100 * 1000);
gpio_set_function(20, GPIO_FUNC_I2C);
gpio_set_function(21, GPIO_FUNC_I2C);
gpio_pull_up(PICO_DEFAULT_I2C_SDA_PIN);
gpio_pull_up(PICO_DEFAULT_I2C_SCL_PIN);
bi_decl(bi_2pins_with_func(PICO_DEFAULT_I2C_SDA_PIN, PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C));

/* UART setup */
uart_init(uart0, 115200);
gpio_set_function(0, GPIO_FUNC_UART);
gpio_set_function(1, GPIO_FUNC_UART);

/* LED on */
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 1);

platform.c

順番に、インクルード、I2CのRead、I2CのWriteの部分

#include "pico/stdlib.h"
#include "hardware/i2c.h"
static HAL_StatusTypeDef I2Cx_ReadBytes(i2c_inst_t *handle,
                                        uint8_t addr,
                                        uint16_t reg,
                                        uint16_t numBytesToRead,
                                        uint8_t slaveTransmitterMode,
                                        uint16_t timeout,
                                        uint8_t *value)
{
  int state;
  if (slaveTransmitterMode == 0)
  {
    i2c_write_blocking(i2c0, addr, &reg, numBytesToRead, true);
    state = i2c_read_blocking(i2c0, addr, value, numBytesToRead, false);
    return state == PICO_ERROR_GENERIC ? HAL_ERROR : HAL_OK;
  }
  else
    return HAL_ERROR;
}
static HAL_StatusTypeDef I2Cx_WriteBytes(i2c_inst_t *handle,
                                         uint8_t addr,
                                         uint16_t reg,
                                         uint16_t numBytesToWrite,
                                         uint16_t timeout,
                                         uint8_t *value)
{
  int state;
  i2c_write_blocking(i2c0, addr, &reg, numBytesToWrite, true);
  state = i2c_write_blocking(i2c0, addr, value, numBytesToWrite, false);
  state = i2c_write_blocking(i2c0, addr, value, numBytesToWrite, false);
  return state == PICO_ERROR_GENERIC ? HAL_ERROR : HAL_OK;
}

あと、platform.h にSTMのHALのtypedefを追加。

typedef enum
{
  HAL_OK = 0x00U,
  HAL_ERROR = 0x01U,
  HAL_BUSY = 0x02U,
  HAL_TIMEOUT = 0x03U
} HAL_StatusTypeDef;

結果

読み取った値はUART出力されます。湿度10%、温度29℃。

エアコンの設定温度が29℃だったので妥当な結果かなと思います。(湿度は怪しいですが…)

Wuerth Elektronik eiSos Sensors SDK version 2.0
This is the example program for the HIDS sensor connected via I2C.
**** HIDS_isInterfaceReady(): OK ****
**** HIDS_DEVICE_ID_VALUE: OK ****
HIDS RH (int8) = 10%
HIDS temperature (int8) = 29 degrees Celsius

参考資料

(リンクは 2022/08/17 時点)

Raspberry Pi Pico (マイコンボード)

Raspberry Pi Documentation
Getting started with Raspberry Pi Pico
Raspberry Pi Pico C/C++ SDK

WSEN-HIDS (温湿度センサー)

WSEN-HIDS (252502021000) 製品ページ
WSEN-HIDS (252502021000) マニュアル

WSEN-EVAL HIDS 製品ページ
WSEN-EVAL HIDS マニュアル

SDK
SDKマニュアル

ハードウェア開発の問い合わせについて

クール電子という屋号で電子回路設計の事業をしています。FPGAや基板回路、画像処理・信号処理を中心にハードウェア開発をカスタムで行っています。試作のみや小ロット対応できます。

お問い合わせフォームTwitterのDMからお気軽にご相談ください。

クール電子の概要はこちら

書いてほしい記事のリクエストもお待ちしています。

スポンサーリンク




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です