投稿

5月, 2023の投稿を表示しています

nRF : MPU6050 DMP pedometer

イメージ
 MUP6050:三軸加速度センサ・三軸ジャイロセンサモジュール  Amazon等で安価に購入できるため、慣性計測装置(IMU:Inertial Measurement Unit)としてはよく使われ情報を多く目にする。ただ、マイコンからの命令で、ジャイロの値を読んだり、加速度センサの値を読み込んだりするのは難易度的に低く、必要なレジスタへの書き込み、読み込みさえできれば値を得る事は難しくない。  一方で、MUP6050の本当の真価を得るためには、DMP(Digital Motion Processor)を使わないとその価値は得られない。DMPは、内部処理機能に必要なプログラム(これはTDKが用意していてバイナリーで配布されている)を送り込みする事で動作させる事ができる。その間マイコンによる監視が不要にできる  しかし以外と情報は少ない。ArduinoでDMP対応のライブラリーが提供されているので参考にはなるが、メモリの都合上、UNO,NANOではそのままでは試す事できない事もあり、情報が少ない。特にnRF系でというと情報がそこそこ少ないので、ここでは、NordicのnRFに移植し、万歩計を実装する手順を記載する。 1.必要ファイルの準備 MUP6050の公式サイト https://invensense.tdk.com/developers/software-downloads/#smartmotion MPU eMD6.12をクリック ログインを求められるので、Usernameとパスワードを入力してログインする。 (アカウントがない場合は、アカウントの作成をする) zipファイルのダウンロードが終わったら適当に解凍する。 エクスプローラーから \motion_driver_6.12\arm\STM32F4_MD6\Projects\eMD6\core\driver\eMPL を開いておく。元にするファイルは、 このフォルダに入っている6つのファイル。 ユーザガイド motion-driver-6-1-user-guide.pdf に記載されているように、I2C関係、時間待ち、時間計測、ログの出力に関する関数を使うプラットフォームにあわせて用意してやる。例題として、TI社のMSP430やSTM社のSTMF4が収録されているので、それを参考にしながら、NordicのnR

BL652 (nRF) MPU 6050 Basic

イメージ
  【回路の構成】 VCCとGND、SDA,SCKの4本だけを接続する。上の写真ではmax30102とカスケードに接続している。むろんマイコンから直接でも。 【基本のやりとり】 テンプレートから開始する。TWI、NRF_LOGが少なくとも使える状態のもの。 ここ。 https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf まずは、write, readする関数を書いてみる。 int main(void)の上に記載する。 void mpu6050_register_write(uint8_t register_address, uint8_t value) { ret_code_t err_code; uint8_t buffer[2] = {register_address, value}; err_code = nrf_drv_twi_tx(&m_twi, 0x68, buffer, sizeof(buffer), true); APP_ERROR_CHECK(err_code); } uint8_t mpu6050_register_read (uint8_t reg_address) { uint8_t data; ret_code_t err_code; err_code = nrf_drv_twi_tx(&m_twi, 0x68, &reg_address, sizeof(reg_address), true); APP_ERROR_CHECK(err_code); err_code = nrf_drv_twi_rx(&m_twi, 0x68, &data, sizeof(data)); APP_ERROR_CHECK(err_code); return data; } whileの外の部分で、  uint8_t mpu6050_ID; としてIDを格納する変数を定義 レジスタ0x75は、WHO_AM_Iになっていて、ここを読みにいけば、I2Cのアドレスである0x68を返してくるはず。 whileの中を以下のようにしてやる。    

nRF max30102 hartrate

イメージ
前回 、 MAX30102をnRFで使えるように、ライブラリー化したので、心拍数が測定できるように  SparkFun Electronicsのhttps://github.com/sparkfun/MAX30105_Breakoutに提供されているheartRateを使ってみる。前回の続きで、Timer、NRF_LOG、TWIが使える状態が前提。 heartRate.cppファイルをcompornents/drivers_ext/max30102と前回作ったフォルダにコピーし、拡張子を.cに変更する。heartRate.hはそのままコピーをとる。フォルダへの紐づけは前回しているのでそのままだがしていない場合はする。 【heartRate.cの改変】 cppファイルであるが、クラスファイルを定義している訳でもなく中身はC言語なので拡張子だけの違い。 改変は本来いらないはずだが、まあそのままだとちゃんとデータを表示してくれなかった。 改変ポイントだけ記載するが、ArduinoIDEとかのシリアルモニタ、シリアルプロットを使って基本的には一つひとつ図示していき確認しながら進める(後でその辺も) まず一番癖のある関数から改変する。 int16_t averageDCEstimator(int32_t *p, uint16_t x) { *p += ((((long) x << 15) - *p) >> 4); return (*p >> 15); } このDC成分を検出する関数。 やっている事の解説。第二引数のx(ダイオードで受けた光検出量が入ってくる)、これを15ビット左にシフト。これは2の15乗(32768)を掛け算する事と同じ、それから現在の*pの値を引く。この*pは基本物理的には、今のAD変換されてくる値の32768倍の値が常に格納されている。引いたものを右側に今度は4ビットシフト。これは2の4乗(16)で割り算する。その割り算した値を*pに足して新な*pとしている。これまでの値に、1/16だけ新しく取得したデータを反映させる処理をしている。 と動作はわかる・・・が、このx uint16で定義しているが、そもそもAD変換されて出てくるのは18bit。つまり最大で262,144の値が入ってくる。一方16bitで示せる整数は

nRF max3102 library

イメージ
 前回で動作の方が理解できたので、SparkFunからMAX30102のArduinoのライブラリーをnRF用にC言語移植するしてみた。ただし緑色を搭載していないMAX30102向けでLEDの個数に応じた汎用性は持たせていない。 APP timerとTWIが使えるようにsdk_configの設定ができている前提からのスタートになる。 (汎用的でないが自分が使っているテンプレートは ここ ) 【ライブラリーの配置】 \components\drivers_extの下にmax30102をいうフォルダーを作ってあげて、 max30102.c max30102.h の二つのファイルを置く。この2つのファイルはここからDLできるようにしておく。 【ライブラリーの読み込み】 embedded srudioでプロジェクトを右クリックして新しいフォルダを作り、名前をmax30102とでもしておく。 Add Existing Fileを選択して、上のファイルのうちmax30102.cを指定する。 User Include Directoriesを開いて、 ../../../../../../components/drivers_ext/max30102 を追記する。../../の所は、他のcomponentsフォルダの指定を参考にするとよい。 【インクルードファイルの定義】 #include "max30102.h" 【設定】 setupをmainの中で一度行う。    //configuration of Max30102     MAX30102_setup(0x1F,4,2,100,69,4096); ここの引数は、SparkFunのライブラリーのexampleになされているのと同じ。 C++と違って引数を割愛する事はできない。 【実際の利用】 試しにシンプルな呼び出しをしてみる。     while (true)     {        NRF_LOG_RAW_INFO("Red:%d\n",MAX30102_getRed());        NRF_LOG_FLUSH();        nrf_delay_ms(200);     } 【参考ソース全体】 **  * Copyright (c) 2009 - 2021, Nord

BL652(nRF) Max30102

イメージ
Max30102、姉妹品のMax30105の情報としてはSparkFunからArduinoのライブラリーが公開されていており、利用されている事も多いのか情報量が最も多い。 このライブラリー何をしているか?というのをマニュアルを参照しながら、nRF、Embedded studio開発下で動くように移植してやってnRFのライブラリーを作る事をめざす。nRFをターゲットとするが、同じ事を他の例えば、STM32系とかで実施するればライブラリーを作っていく事はできるはず。要するに、”理解”さえしていれば。ここではBL652だが、純正のDKやXAIOも同じ事をすれば動くはず。 【下準備】 スタートとして、 前回作ったテンプレート にさらにApp_timerを使えるようにしてあるテンプレートから開始する。(DLは ここ )ssdのドライバーを所定のフォルダに入れてやる必要があるが詳細は、 前回 を参照。 【I2C】 基本テンプレートに入っているのでTWIが使えるように設定をする。 ヘッダーファイル類はそのままでもよいし使うものだけ以外はコメントアウトする。 /* ****************/ /* TWI /* ****************/ /* TWI instance ID. */ #if TWI0_ENABLED #define TWI_INSTANCE_ID 0 #elif TWI1_ENABLED #define TWI_INSTANCE_ID 1 #endif /* TWI instance. */ const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(0); //do not change instance name "m_twi" which is used ssd1306.c void twi_init(void) { const nrf_drv_twi_config_t twi_config = { .scl = ARDUINO_SCL_PIN, .sda = ARDUINO_SDA_PIN, .frequency = NRF_DRV_TWI