加速度センサの計測結果をBLEで飛ばすっていう試み。XIAO nRF52840と秋月AE-ADXL367を使って。
XIAO nRF52840でなんかできんかなって雑な発想で秋月AE-ADXL367(https://akizukidenshi.com/catalog/g/g129428/)を購入。温度とか湿度とかをBLEで飛ばすのよりは加速度のほうがちょっと面白いかもなって。pinoutと結線はこのようにする。
データシートによるとINT2は出力だからn.c.でよくて、ADC_INはn.c.でいいぜって書いてあるのでn.c.で、VREG_OUTはパスコンつなげろって書いてあるけど、秋月のボード上に実装してあるようなのでさらにってことはないと思う。
では、ソフトを作っていくんだけど、ADXL367を制御するArduinoライブラリはなさそうなので、自力でデータシートと格闘しないといけない。まぁたったの全64ページ。格闘というほどではない。で、連続データ取得、INT1ピンにDataReadyをアクティブLowで出したい、ODRは12.5Hz(とりあえず)、測定レンジはフルスケール±4gってことにして、この辺をいじっていけばいいってのがわかる。
で、BLEほうは、Arduinoのexampleに入っているperipheral bleuartを使うことにする。っていうか完全にパクる。<--もうこのへんってデバイスが勝手にやっちゃうのが多すぎ。、、、全部知ろうとすることが無茶なくらい複雑な世の中になってきたのでしょうがないんだけど、複雑な心境ではある。とはいえまずは普通にADXL367を動かしてみる。
- #include <SPI.h>
- #define pinMOSI (10)
- #define pinMISO (9)
- #define pinSCK (8)
- #define pinCS (7)
- #define pinDRDY (6)
- #define ADDRESS_INTMAP1_LOWER (0x2A)
- #define ADDRESS_FILTER_CTL (0x2C)
- #define ADDRESS_POWER_CTL (0x2D)
- #define ADDRESS_STATUS (0x0B)
- #define ADDRESS_XDATA_H (0x0E)
- #define ADDRESS_XDATA_L (0x0F)
- #define ADDRESS_YDATA_H (0x10)
- #define ADDRESS_YDATA_L (0x11)
- #define ADDRESS_ZDATA_H (0x12)
- #define ADDRESS_ZDATA_L (0x13)
- #define ADDRESS_SOFT_RESET (0x1F)
- #define VALUE_INTMAP1_LOWER (0x81)
- #define VALUE_FILTER_CTL (0x40)
- #define VALUE_POWER_CTL (0x02)
- #define VALUE_SOFT_RESET (0x52)
- SPISettings mySPISettings=SPISettings(1000000,MSBFIRST,SPI_MODE0);
- void SPI_writeRegister(uint8_t adr,uint8_t data){
- uint8_t txbuf[3];
- uint8_t rxbuf[3];
- txbuf[0]=0x0A;
- txbuf[1]=adr;
- txbuf[2]=data;
- digitalWrite(pinCS,LOW);
- delayMicroseconds(1);
- SPI.transfer(txbuf,rxbuf,3);
- delayMicroseconds(1000);
- digitalWrite(pinCS,HIGH);
- }
- uint8_t SPI_readRegister(uint8_t adr){
- uint8_t txbuf[3];
- uint8_t rxbuf[3];
- txbuf[0]=0x0B;
- txbuf[1]=adr;
- txbuf[2]=0x00;
- digitalWrite(pinCS,LOW);
- delayMicroseconds(1);
- SPI.transfer(txbuf,rxbuf,3);
- delayMicroseconds(1000);
- digitalWrite(pinCS,HIGH);
- return rxbuf[2];
- }
- volatile uint8_t drdy_detected;
- void interruptHandler_pinDRDY(){
- drdy_detected=1;
- }
- void readStatusAndData(uint8_t* buf){
- buf[0]=SPI_readRegister(ADDRESS_STATUS);
- buf[1]=SPI_readRegister(ADDRESS_XDATA_H);
- buf[2]=SPI_readRegister(ADDRESS_XDATA_L);
- buf[3]=SPI_readRegister(ADDRESS_YDATA_H);
- buf[4]=SPI_readRegister(ADDRESS_YDATA_L);
- buf[5]=SPI_readRegister(ADDRESS_ZDATA_H);
- buf[6]=SPI_readRegister(ADDRESS_ZDATA_L);
- }
- const char char_array[]="0123456789ABCDEF";
- void hex2chars(uint8_t src,char* tgt){
- tgt[0]=char_array[(src>>4)&0x0F];
- tgt[1]=char_array[(src>>0)&0x0F];
- }
- void bytes2chars(uint8_t n,char* strbuf,uint8_t* bytedata){
- uint8_t i;
- for(i=0;i<n;i++){
- hex2chars(bytedata[i],&strbuf[i*2]);
- }
- strbuf[n*2]='\0';
- }
-
- uint8_t buf[7];
- char sendbuf[16];
-
- void setup(){
- uint8_t temp;
- drdy_detected=0;
- pinMode(pinCS,OUTPUT);
- pinMode(pinMOSI,OUTPUT);
- pinMode(pinSCK,OUTPUT);
- pinMode(pinMISO,INPUT);
- digitalWrite(pinCS,HIGH);
- digitalWrite(pinMOSI,LOW);
- digitalWrite(pinSCK,LOW);
- pinMode(pinDRDY,INPUT_PULLUP);
- SPI.begin();
- SPI.beginTransaction(mySPISettings);
- delay(1);
- SPI_writeRegister(ADDRESS_SOFT_RESET,VALUE_SOFT_RESET);
- delay(1);
- temp=SPI_readRegister(ADDRESS_INTMAP1_LOWER);
- while(temp!=VALUE_INTMAP1_LOWER){
- SPI_writeRegister(ADDRESS_INTMAP1_LOWER,VALUE_INTMAP1_LOWER);
- delay(1);
- temp=SPI_readRegister(ADDRESS_INTMAP1_LOWER);
- }
- temp=SPI_readRegister(ADDRESS_FILTER_CTL);
- while(temp!=VALUE_FILTER_CTL){
- SPI_writeRegister(ADDRESS_FILTER_CTL,VALUE_FILTER_CTL);
- delay(1);
- temp=SPI_readRegister(ADDRESS_FILTER_CTL);
- }
- temp=SPI_readRegister(ADDRESS_POWER_CTL);
- while(temp!=VALUE_POWER_CTL){
- SPI_writeRegister(ADDRESS_POWER_CTL,VALUE_POWER_CTL);
- delay(1);
- temp=SPI_readRegister(ADDRESS_POWER_CTL);
- }
-
- delay(100);
- Serial.begin(115200);
- while(!Serial){delay(10);}
- Serial.println("=== AE-ADXL367 control example using XIAO nRF52840 ===");Serial.flush();
- buf[0]=SPI_readRegister(ADDRESS_INTMAP1_LOWER);
- buf[1]=SPI_readRegister(ADDRESS_FILTER_CTL);
- buf[2]=SPI_readRegister(ADDRESS_POWER_CTL);
- bytes2chars(3,sendbuf,buf);
- Serial.println(sendbuf);Serial.flush();
- readStatusAndData(buf);
- bytes2chars(7,sendbuf,buf);
- Serial.println(sendbuf);Serial.flush();
- readStatusAndData(buf);
- bytes2chars(7,sendbuf,buf);
- Serial.println(sendbuf);Serial.flush();
- attachInterrupt(digitalPinToInterrupt(pinDRDY),interruptHandler_pinDRDY,FALLING);
- }
-
- void loop(){
- if(drdy_detected){
- drdy_detected=0;
- readStatusAndData(buf);
- bytes2chars(7,sendbuf,buf);
- Serial.println(sendbuf);Serial.flush();
- }
- }
書き込むとUARTに文字列が出力される。で、平置きでは
4101A4FE741F8C
ってなる。で、計算してみると、
STATUS | XDATA | YDATA | ZDATA | ||
4101A4FE741F8C | 41 | 01A4 | FE74 | 1F8C | |
420 | 65140 | 8076 | unsigned | ||
420 | -396 | 8076 | signed | ||
105 | -99 | 2019 | 2bits shift /4 | ||
0.05126953125 | -0.04833984375 | 0.98583984375 | Scaled *(8/(2^14)) |
USBコネクタ周りに90度回すと
X=0.03857421875
Y=0.931640625
Z=0.0048828125
USBコネクタ部が上空に来るように90度回すと
X=0.9970703125
Y=0.048828125
Z=-0.0390625
いいぞ!では次はBLEで飛ばしてみよう!、、、後で。
ところで、年の瀬だねー。2024年、支えてくれたいろんな人への感謝とともに、あと数日、できるだけ、がんばる。、、、できるだけよ。
0 件のコメント:
コメントを投稿