目次
ラズパイ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, ®, 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, ®, 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からお気軽にご相談ください。
クール電子の概要はこちら
書いてほしい記事のリクエストもお待ちしています。
コメントを残す