အဲဒီမှာ 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} $$
Using SPI Interface
SPI interface ကိုသုံးဖို့အတွက် LIS3DSH ကို အောက်ကပုံအတိုင်း ဆက်နိုင်ပါတယ်။ ဒီနမူနာမှာတော့ 4-wires ပဲသုံးပြီး interrupt တွေကို မသုံးပါဘူး။နမူနာ အနေနဲ့ 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 ကို အောက်မှာ ပြထားပါတယ်။
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 ကို အောက်ကပုံအတိုင်း ဆက်နိုင်ပါတယ်။နမူနာ အနေနဲ့ 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 ကိုသုံးခဲ့ပါတယ်။
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).
ADIS16003 accelerometer ကို သုံးပြီး AT89C51CC03 8051 microcontroller နဲ့ဖတ်တဲ့ နမူနာ code လေးကိုပါတွေ့နိုင်ပါတယ်။





No comments:
Post a Comment