O
OrangeJuice
Spresense+Spresense拡張ボードの環境でIIS3DWBの加速度センサを利用したいと考えています.
事前にArduinoでは動作確認済みのコードを使って,Spresenseで動作させようとしたところ「IIS3DWB not functioning!」と出て,getChipID関数で正しくデバイスのIDが取得できません.
ソースコードを添付しますので,何かお気づきの点があればご助言いただきたいです.
なお,拡張ボードの電圧設定は5V,IIS3DWBとSpresenseの結線は以下の通りです.
事前にArduinoでは動作確認済みのコードを使って,Spresenseで動作させようとしたところ「IIS3DWB not functioning!」と出て,getChipID関数で正しくデバイスのIDが取得できません.
ソースコードを添付しますので,何かお気づきの点があればご助言いただきたいです.
なお,拡張ボードの電圧設定は5V,IIS3DWBとSpresenseの結線は以下の通りです.
Spresense | IIS3DWB |
---|---|
3.3V | 3.3V |
SPI CS(D10) | SS |
SPI MOSI(D11) | MOSI |
SPI MISO(D12) | MISO |
SPI SCK(D13) | SCK |
GND | GND |
Code:
#include <IIS3DWB.h>
#include "SPI.h"
#define SerialDebug true // set to true to get Serial output for debugging
#define CSPIN 10
/* Specify sensor parameters (sample rate is same as the bandwidth 6.3 kHz by default)
* choices are: AFS_2G, AFS_4G, AFS_8G, AFS_16G
*/
uint8_t Ascale = AFS_4G;
float aRes; // scale resolutions per LSB for the accel
float accelBias[3] = {0.0f, 0.0f, 0.0f}; // offset biases for the accel
int16_t IIS3DWBData[4] = {0}; // Stores the 16-bit signed sensor output
float ax, ay, az, accelTemp; // variables to hold latest accel data values
uint8_t IIS3DWBstatus;
volatile bool IIS3DWB_DataReady = true, IIS3DWB_Wakeup = true;
IIS3DWB IIS3DWB(CSPIN); // instantiate IIS3DWB class
void setup()
{
Serial.begin(115200);
delay(4000);
SPI.begin(); // Start SPI serial peripheral
Serial.print("SPI Start!\n");
// Configure SPI ship select for sensor breakout
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, HIGH); // disable SPI at start
// Read the IIS3DWB Chip ID register, this is a good test of communication
Serial.println("IIS3DWB accel...");
uint8_t c = IIS3DWB.getChipID(); // Read CHIP_ID register for IIS3DWB
Serial.print("IIS3DWB "); Serial.print("I AM "); Serial.print(c, HEX); Serial.print(" I should be "); Serial.println(0x7B, HEX);
Serial.println(" ");
if(c == 0x7B) // check if all SPI sensors have acknowledged
{
Serial.println("IIS3DWB is online...");
Serial.println(" ");
// reset IIS3DWB to start fresh
IIS3DWB.reset();
// get accel sensor resolution, only need to do this once
aRes = IIS3DWB.getAres(Ascale);
IIS3DWB.selfTest();
IIS3DWB.init(Ascale); // configure IIS3DWB
IIS3DWB.offsetBias(accelBias);
Serial.println("accel biases (mg)"); Serial.println(1000.0f * accelBias[0]); Serial.println(1000.0f * accelBias[1]); Serial.println(1000.0f * accelBias[2]);
Serial.println(" ");
delay(1000);
}
else
{
if(c != 0x6A) Serial.println(" IIS3DWB not functioning!");
while(1){};
}
}
/* End of setup */
void loop() {
if(IIS3DWB_DataReady) // Handle data ready condition
{
IIS3DWBstatus = IIS3DWB.DRstatus(); // read data ready status
if (IIS3DWBstatus & 0x01) { // if new accel data is available, read it
IIS3DWB.readAccelData(IIS3DWBData);
// Now we'll calculate the accleration value into actual g's
ax = (float)IIS3DWBData[0]*aRes - accelBias[0]; // get actual g value, this depends on scale being set
ay = (float)IIS3DWBData[1]*aRes - accelBias[1];
az = (float)IIS3DWBData[2]*aRes - accelBias[2];
}
} // end of data ready interrupt handlin
// end sensor interrupt handling
if(SerialDebug) { // report latest accel data
Serial.print("ax = "); Serial.print((int)1000*ax);
Serial.print(" ay = "); Serial.print((int)1000*ay);
Serial.print(" az = "); Serial.print((int)1000*az); Serial.println(" mg");
}
IIS3DWBData[3] = IIS3DWB.readTempData(); // get IIS3DWB chip temperature
accelTemp = ((float) IIS3DWBData[3]) / 256.0f + 25.0f; // Accel chip temperature in degrees Centigrade
// Print temperature in degrees Centigrade
if(SerialDebug) {
Serial.print("IIS3DWB temperature is "); Serial.print(accelTemp, 1); Serial.println(" degrees C"); // Print T values to tenths of a degree C
}
}
/* End of main loop */