Search This Blog

Thursday, September 10, 2015

Accelerometer LIS3DSH

LIS3DSH က STMicroelectronics ထုတ်တဲ့ 3-axis MEMS accelerometer တခု ဖြစ်ပါတယ်။ Full scale ကို ±2g ကနေ ±16g ထိ အမျိုးမျိုးရွေးလို့ ရပါတယ်။ အရွယ်အစားက လည်း 3mm x 3mm ပဲမို့ သေးသေးလေးပါ။ Digital output ကို SPI ဒါမှမဟုတ် I2C ကြိုက်တာသုံးလို့ရပါတယ်။ Supply voltage က 1.71 V ကနေ 3.6 V ထိပေးလို့ ရပါတယ်။ STEVAL-MKI134V1 adapter board လေး တခုဝယ်ပြီး စမ်းကြည့်ထားတဲ့ အတွေ့အကြုံ လေးအကြောင်း ပြောချင်ပါတယ်။


Figure. STEVAL-MKI134V1 - LIS3DSH adapter board for standard DIL24 socket.


အဲဒီမှာ Acceleration တန်ဖိုးတွေကို 16 bit digital output နဲ့ output data rate (ODR) ကလည်း 1600 ထိထုတ်ပေးနိုင်တာ ကလည်း သဘောကျမိတဲ့ အချက်တခုပါ။
Resolution of its digital output
$$ \text{mg/digit} = \frac{2g - (-2g)}{2^{16}-1} = 61 \text{ } \mu \text{g} = 0.5966 \text{ mm s}^{-2} $$
where the gravity at Singapore is 9781 mm s-2.
ဒါကြောင့် 61 μg/digit ထိ ခွဲခြားဖော်ပြနိုင်ပါတယ်။ အဲဒါက digital output ရဲ့ ခွဲခြားဖော်ပြနိုင်တဲ့ sensitivity (resolution) ဖြစ်ပြီး accelerometer ရဲ့ တကယ် sense လုပ်နိုင်တဲ့ sensitivity (resolution) ကတော့ သူ့ရဲ့ noise floor ကနေ တွက်ယူရပါမယ်။ Datasheet မှာ ဖော်ပြထားတဲ့ သူ့ရဲ့ noise density က 150 μg/sqrt(Hz) ဖြစ်တာကြောင့် bandwidth 100 Hz သုံးမယ်ဆိုရင် သူ့ရဲ့ resolution ကို 1500 μg လို့ရပါမယ်။
$$ An = {150} \times {\sqrt{BW}} = 1500 \text{ } \mu \text{g} = 14.67 \text{ mm s}^{-2} $$


Figure. Pin connection.


Using SPI Interface

SPI interface ကိုသုံးဖို့အတွက် LIS3DSH ကို အောက်ကပုံအတိုင်း ဆက်နိုင်ပါတယ်။ ဒီနမူနာမှာတော့ 4-wires ပဲသုံးပြီး interrupt တွေကို မသုံးပါဘူး။


Figure. LIS3DSH electrical connection using SPI


နမူနာ အနေနဲ့ Arduino Uno နဲ့ LIS3DSH accelerometer ကို SPI သုံးပြီးဖတ်တဲ့ schematic နဲ့ program ကို ပြထားပါတယ်။ Arduino Uno ရဲ့ digital IO တွေက 5V ဖြစ်ပြီး LIS3DSH က 3.3V ပဲသုံးတာမို့ bi-directional logic level converter လေးသုံးပြီး interface လုပ်ဖို့လိုပါတယ်။ STEVAL-MKI134V1 adapter board သုံးပြီး ဆက်ထားတဲ့ Schematic circuit diagram ကို အောက်မှာ ပြထားပါတယ်။


Figure. Schematic circuit diagram for STEVAL-MKI134V1 using SPI.



Figure. Wire connection for SPI.


Serial Peripheral Interface (SPI) - Mode 3, MSB first အတွက် Arduino ရဲ့ SPI library ကို သုံးခဲ့ပါတယ်။

#include <SPI.h>
const int CS_Pin = 10;// set pin 10 as the chip select
SPISettings settingsA(2000000, MSBFIRST, SPI_MODE3); // set up the speed, data order and data mode
//SPI pin configuration: pin 11 as MOSI (SDI), pin 12 as MISO (SDO) , pin 13 as clock (SPC)

int x,y,z;
float K=0.061; // (4000/65535) milli-g per digit for +/-2g full scale using 16 bit digital output

void setup() {
  Serial.begin(9600);
  pinMode (CS_Pin, OUTPUT);  //Chip Select pin to control SPI
  digitalWrite(CS_Pin, HIGH);//Disable SPI
  SPI.begin();
  SPI.beginTransaction(settingsA);

  digitalWrite(CS_Pin, LOW);//Enable SPI
  SPI.transfer(0x20);//Send address of 'Control register 4' to write configuration
  SPI.transfer(0x7F);//Write a value that enables x,y,z accelerometers
  digitalWrite(CS_Pin, HIGH);//Disable SPI
}

void loop() {
  delay(1000);
  digitalWrite(CS_Pin, LOW);//Enable SPI
  SPI.transfer(0xA8);//Send address of LSB of x. Address is auto-increased after each reading.
  x = SPI.transfer(0) | SPI.transfer(0)<<8; //x acceleration 
  y = SPI.transfer(0) | SPI.transfer(0)<<8; //y acceleration
  z = SPI.transfer(0) | SPI.transfer(0)<<8; //z acceleration
  digitalWrite(CS_Pin, HIGH);//Disable SPI
  Serial.println("x=" + String(K*x)+" mg  \ty=" + String(K*y)+" mg  \tz=" + String(K*z)+" mg");
}


Using I2C Interface

I2C interface ကိုသုံးဖို့အတွက် LIS3DSH ကို အောက်ကပုံအတိုင်း ဆက်နိုင်ပါတယ်။


Figure. LIS3DSH electrical connection using I2C
နမူနာ အနေနဲ့ Arduino Uno နဲ့ LIS3DSH accelerometer ကို I2C သုံးပြီးဖတ်တဲ့ schematic နဲ့ program ကို ပြထားပါတယ်။ ပုံမှန်ဆို pin ကို I2C သုံးဖို့ configure လုပ်လိုက်ရင် open drain ဖြစ်ပြီး သူတို့ရဲ့ pin အချင်းချင်းတန်းဆက်ပြီး၊ pull up resistor တခု ချိတ်လိုက်ရင်ရပါတယ်။ ဒါပေမယ့် မီတာနဲ့ တိုင်းကြည့်တဲ့ အခါ Arduino UNO က A4 နဲ့ A5 က open drain တင်မကပဲ အထဲမှာ 5V ကို pull up လုပ်ပေးပုံပါရတဲ့ အတွက် bi-directional logic level converter ကိုသုံးခဲ့ပါတယ်။


Figure. Schematic for bi-directional logic level converter.



Figure. Schematic circuit diagram for STEVAL-MKI134V1 using I2C.



Figure. Wire connection for I2C


I2C (Inter-Integrated Circuit) အတွက် Arduino ရဲ့ Wire Library ကို သုံးခဲ့ပါတယ်။

#include <Wire.h>
int x,y,z;
float K=0.061; // (4000/65535) milli-g per digit for +/-2g full scale using 16 bit digital output
void setup()
{
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
  Wire.beginTransmission(0x1E); // transmit to device #30
  Wire.write(0x20);//Send address of 'Control register 4' to write configuration
  Wire.write(0x7F);//Write a value that enables x,y,z accelerometers
  Wire.endTransmission();// stop transmitting
}

void loop()
{
  delay(1000);
  
  Wire.beginTransmission(0x1E); // transmit to device #30
  Wire.write(0x28);//Send address of LSB of x. Address is auto-increased after each reading.
  Wire.endTransmission();    // stop transmitting

  Wire.requestFrom(0x1E, 6);    // request 6 bytes from slave device #30
  x = Wire.read() | Wire.read()<<8; //x acceleration 
  y = Wire.read() | Wire.read()<<8; //y acceleration
  z = Wire.read() | Wire.read()<<8; //z acceleration
  
  Serial.println("x=" + String(K*x)+" mg  \ty=" + String(K*y)+" mg  \tz=" + String(K*z)+" mg");
}




NXP ရဲ့ LPC54102 dual core ARM microcontroller ကို သုံးပြီး accelerometer တွေနဲ့ ၊ gyroscope ကိုဖတ်တဲ့ code ပါ ရေးကြည့်ခဲ့ပါတယ်။


Figure. A gyroscope and 4 accelerometers on the bottom side, and a dual core ARM microcontroller on top side of an in-house built embedded circuit board (Ø < 1 in).



Figure. An embedded inertial measurement unit using LPC54102 ARM microcontroller.


ADIS16003 accelerometer ကို သုံးပြီး AT89C51CC03 8051 microcontroller နဲ့ဖတ်တဲ့ နမူနာ code လေးကိုပါတွေ့နိုင်ပါတယ်။

No comments:

Post a Comment