投稿

BL652 MAX30102の基礎

イメージ
 BL652 nRF52832でMAX30102を動かす事をめざす。同時に結果をOLEDに吐き出す所をやる。 SSD1306をI2C制御しつつ、もう一つMAX30102もI2Cで接続し、しかもnRF52でMAX30102を制御する事をめざす。 前回のテンプレート から開始する。 ssd1306.cの中のTWIの初期化関数をコールしている所をコメントアウトしてあげて本体のプログラム側で用意する事にする。 /* TWI instance. */ const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(0);  の下の部分に void twi_init (void) {     const nrf_drv_twi_config_t twi_config = {        .scl                = ARDUINO_SCL_PIN,        .sda                = ARDUINO_SDA_PIN,        .frequency          = NRF_DRV_TWI_FREQ_400K,        .interrupt_priority = APP_IRQ_PRIORITY_HIGH,        .clear_bus_init     = false     };    nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);     nrf_drv_twi_enable(&m_twi); } 初期化の関数をもってくる。#include "boards.h"をインクルードし...

BL652 ssd1306とNRF_LOG

イメージ
SSD1306とNRF_LOGでUART経由でシリアルでPCにデータを送信するのを同時にしてみる。片方づつやるのは簡単で、マージする作業、特に、sdk_configの設定ってが厄介。 \SDK\nRF5_SDK_17.1.0_ddde560\components\drivers_ext SDKの下の下にcomponets、その下にdrivers_extがあるので そこにフォルダを追加する。ssd1306。 その下に、nRF用のssd1306 lib(自作)を配置する。 fonts.h fonts.c ssd1306.h ssd1306.c (テストのためにfun_logo.h) ここ からDLできるようにしておく。   右クリックでAdd Existing fileを選択し、上で配置したfonts.cとssd1306.cを選択する。 Optionを開いて、Commonの状態にして、Preprocessor/User Include Directioriesに ../../../../../../components/drivers_ext/ssd1306 を追加する。../../の部分は、他に../../../../../../components/が上にあるので、そこからコピペしてもってくると良い。 インクルードする mainの上で // for using I2C #include "nrf_drv_twi.h" // for using OLED display with SSD1306 #include "ssd1306.h" #include "fun_logo.h" /* 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); mainの中は、 //initialization of SSD1306     SSD1306_Init();...

BL652 UART

イメージ
FT232RLを接続して、PCにUART経由で通信できるようにしてやる。XAIOを用いて https://funasover.blogspot.com/2023/02/nrf-uart.html で同じ事をしている。 【ブレイクアウトボード】 純正のボードnRF52 PCA10040では、UARTのTXはP0.06、RXはP0.08に接続されている。これBL652ではP0.06は19番、P0.08は17番に接続されている。 これらをまたまたエナメル線で接続してやる。(どこでも本来よいのでGPIOのテストに使ったピンをアサインしても本当はよい) 【テストコードのビルト】 exampleの下にあるperipheralの中のuartをコピーする。 example以下に作った自身の作業フォルダーにコピーをとる。ここでは4_BL652_uartという名前にした。 pca10040のフォルダの下、\pca10040\blank\sesにある uart_pca10040.emProject を開いてやる。このままコンパイルするとエラーがいろいろ出るはず。 ①flash_placement.xml この中にある size=0x04を削除 ②unknown type name '__printf_tag_ptr'のエラーは、retarget.cを削除 ③ Projectを右クリック、OptionからCommonを選択して、LibraryでライブラリIOの部分をRTTを選択 これでコンパイルが通るはず。 ピンのアサインは、pca10040に合わせてあるので、このままビルトし、書き込みができるはず。 【UARTテスト】 無事にビルトし、書き込みが出きていれば、エコーバックしてくるのが確認できる。 (送った文字がそのまま画面に出てきて、qを入力すると停止する) 複数の文字の送信については、https://funasover.blogspot.com/2023/02/nrf-uart.html ここまでのフォルダをコピーして、4_2_BL652_uartという名前をつけてみる。 uint8_t  UART_TX_Buffer[UART_TX_BUF_SIZE]; 複数送信するバッファを用意してやる。 末尾に、以下の関数uart_printを定義 void uart_print...

PWM to DC converter 作製編

イメージ
  PWMのdury比を測定してDC電圧に変換する。 一番簡単な方法はローパスフィルタ。 ただ周波数に応じてリップルが除去しきれなかった。設計があいまい過ぎたからだろう。 確実な方法として、PWMのDuty比をマイコンで計測、その計測値からDACに出力電圧をマイコンから指示してDACからDCを出力する事をしてみた。 CNCのモーターのコントローラーとして下のようなドライバーを使っている。 https://www.amazon.co.jp/gp/product/B015F88D32/ref=ewc_pr_img_1?smid=A18ZODZFQ0ZC6B&psc=1 0-5VsignalのピンにDCで電圧を与えてやるとその電圧に応じてモータの回転数が変化する。 これまではここにつけた可変抵抗で手動で回転数を決めていたが、GRBLのソフトからモータの回転数を制御して、ON-OFFもしたいというモチベーションで作ってみた。 マイコンは手元にあった安価なArduinoNano互換を利用。 #include <Adafruit_MCP4725.h> #include <Wire.h>             #include <Adafruit_GFX.h>     #include <Adafruit_SSD1306.h> Adafruit_SSD1306 display (- 1 ); Adafruit_MCP4725 MCP4725; #define pulse_ip 2 int ontime,offtime; float freq,period,duty; void setup () {   pinMode (pulse_ip,INPUT);   display . begin (SSD1306_SWITCHCAPVCC, 0x 3C );   MCP4725 . begin (0x 60 ); } void loop () {    ontime = pulseIn (pulse_ip,HIGH);    offtime = pulseI...

MAX30102-Arduinoテスト1

イメージ
 MAX30102 心拍数モニタバイオセンサーモジュール データシート https://www.analog.com/media/en/technical-documentation/data-sheets/MAX30102.pdf まずネットでの情報が多いのでArduinoではじめてみる。久々にNanoをひっぱり出してきた・・・。サンプルを走らせると何やら数字はかえってくる。 すぐさまスマートウォッチGalaxy Watch5 Pro(4万円はする)で測定した値と比べると10程違う。 ArduinoのExampleが動いた所でつかえるようになるものでもないという事で一つ一つデータシートを読んで動作を確認していくことにする。 まずはI2Cでデータのやり取りを確認する。レジスタFFにPARTIDがあってIDを返してくれるはずなのでそれを読み取ってみる。 0x15を返してくれるはず。 まず  #include <Wire.h>  Wireをインクルードする。結果をシリアルに出力するためにSerial.beginも。 あとはI2Cのコマンドを並べて・・・ #include <Wire.h> void setup () {   // put your setup code here, to run once:     Serial . begin ( 115200 );     Wire . begin (); } void loop () {   // put your main code here, to run repeatedly:   Wire . beginTransmission (0x 57 );   Wire . write (0x FF );   Wire . endTransmission ( false );   Wire . requestFrom (0x 57 , 1 , true );   Serial . println ( Wire . read (),HEX);   delay ( 1000 ); } 0x15を返してくれる。 I2Cの通信が確認できたのでやり取りする関数から用意す...

BL652 Lチカ& GPIO Input

イメージ
 BL652-SA-01のなんちゃんって評価ボードを作成して、SEGGER Embedded Studioからファームの書き込みをしてみた。 XAIOでLチカ( https://funasover.blogspot.com/2023/02/nrf-l.html )をしているのでまずはやる事は同じ。 【BL652-SA-01】 BLE搭載のマイコンで、小さい!かつ安い!450円。Nordicの52832が使われている。半導体不足が叫ばれる中で中華Arduinoでさえ値段が上がっている中では技適もあって安い! 【開発ボードの作製】 ブレークアウトボードキット https://akizukidenshi.com/catalog/g/gK-15567/ が売っているがこれを使わずに、ユニバーサル基板を使って開発ボードを作る。 ① ユニバーサル基板の端に、絶縁のためのカプトンテープを張って、両面テープで固定する。アンテナの部分はユニバーサル基板からはみ出るようにしている。接着剤できっちり止めてもよいと思う。(すぐに出っ張っている部分を触ってしまうので)。 ② ピンソケットを半田で固定する。 わかりやすく、BL652-SA-01のパッドと同じ配列で、コの字になるようにピンソケットを半田する。半田する前に表側に紙を両面テープで張ってあげてから半田をした。 ③ 配線エナメル線を使って BL652-SA-01モジュールの足と、ソケットの足を接続していく。全部で39本半田すると大変なので、まずは使う所だけ。 26、27は電源とGND 5,6はSWDで書き込みするため 30は、nRF52832のP0.17に接続されているのでGPIOのテストに使うため配線 同じく9、これはP0.18に接続されている。 正規のNordicの評価ボード https://docs.zephyrproject.org/1.14.0/boards/arm/nrf52_pca10040/doc/index.html とピン配列を同じにしておくと、サンプルプログラムがそのまま動くから30と9をまず配線している。 正規ボードは、LED1、2がそれぞれP0.17とP0.18に接続されている。 今度は、 https://akizukidenshi.com/download/ds/laird/bl652.pdf のBL...