Собрал недавно
arduino на atmega8, поморгал диодом, захотелось большего.
Начал изучать различные шилды, цены в РФ на них мягко говоря высокие, а собирать самому дороже выйдет, микросхемы тоже ведь покупать надо.
И тут в голову пришло, ведь на работе куча системных плат от различных телефонов. Почти в каждом современном телефоне есть акселерометр, цифровой термометр и т. д., почему их не использовать?
Оказалось в большинстве телефонов используется одна и та же микросхема акселерометра
LIS302DL от ST.
Содержание статьи / Table Of Contents
Скачал даташит, нашел схему включения. Выводы int1, int2, SDO в данном случае не задействованы.
Вытравил платку ЛУТ-ом.
🎁
Плата в Sprint - arduino_giro.lay.7z
1.01 Kb ⇣ 62
Наш файловый сервис предназначен для полноправных участников сообщества "Datagor Electronics".
Для получения файла зарегистрируйтесь и войдите на сайт с паролем.
По питанию поставил кренку на 3,3 вольта. На всякий пожарный добавил два керамических конденсатора на 10 Мкф и 100 нФ в цепь питания, как на даташите. Vdd io запитал от этой же кренки через дроссель, выпаянный из этого же телефона.
Для активации шины I2C кинул перемычку с CS на + питания.
Саму микросхемку приклеил к платке на супер клей и подпаялся к ней навесным монтажом.
Сверху это дело лучше залить клеем, получится этакий компаунд.
Вставил шилд в Ардуину, загрузил скетч:
#include <LiquidCrystal.h>
#include <Wire.h>
int _slave_id = 0x1D;
int backlight_pin = 3;
LiquidCrystal lcd(5,6,7,8,9,10,11);
uint8_t read_register(uint8_t sub)
{
i2c_send(_slave_id, &sub, 1);
return i2c_read(_slave_id);
}
void write_register(uint8_t sub, uint8_t data)
{
uint8_t bytes[] = {sub, data};
i2c_send(_slave_id, bytes, 2);
}
uint8_t i2c_read(uint8_t id)
{
Wire.requestFrom(_slave_id, 1);
while(!Wire.available())
{
delay(10);
}
return Wire.receive();
}
void i2c_send(uint8_t id, uint8_t * data, uint8_t len)
{
Wire.beginTransmission(id);
for(int i = 0; i < len; ++i)
{
Wire.send(data[i]);
}
Wire.endTransmission();
}
void dot_print(int val)
{
int i = val/10;
int f = val%10;
if ( val < 0 )
{
f*=-1;
}
if ( i>=0 )
{
lcd.print("+");
}
lcd.print(i, DEC);
lcd.print(".");
lcd.print(f,DEC);
if (i<10)
{
lcd.print(" ");
}
}
void pretty_print(char x, char y, char z)
{
int xx = x * 100 / 55;
int yy = y * 100 / 55;
int zz = z * 100 / 63;
lcd.clear();
lcd.print("X:");dot_print(xx);lcd.print(" ");
lcd.print("Y:");dot_print(yy);lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Z:");dot_print(zz);lcd.print(" (m/s/s)");
}
#define CTRL_REG2 0x21
#define CTRL_REG1 0x20
void setup()
{
Wire.begin();
lcd.print("Setting up...");
write_register(CTRL_REG2, B01000000);
write_register(CTRL_REG1, B01000111);
pinMode(backlight_pin, OUTPUT);
analogWrite(backlight_pin, 128);
}
void loop()
{
#define OUT_X 0x29
#define OUT_Y 0x2B
#define OUT_Z 0x2D
#define STATUS_REG 0x27
byte status = read_register(STATUS_REG);
#define ZYXDA 0x08
if ( status & ZYXDA == 0)
{
return;
}
char x_val = read_register(OUT_X);
char y_val = read_register(OUT_Y);
char z_val = read_register(OUT_Z);
pretty_print(x_val, y_val, z_val);
delay(200);
}
Если нет дисплея, можно увидеть результат в Serial monitor:
#include <Wire.h>
#define i2cID 0x1D
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
Wire.begin();
Serial.begin(57600);
Serial.println("Wire.begin");
Wire.beginTransmission(i2cID);
Wire.send(0x21);
Wire.send(B01000000);
Wire.endTransmission();
Wire.beginTransmission(i2cID);
Wire.send(0x20);
Wire.send(B01000111);
Wire.endTransmission();
}
void loop()
{
#define outXhigh 0x29
#define outYhigh 0x2B
#define outZhigh 0x2D
#define statusReg 0x27
boolean goodRead;
goodRead = false;
byte status;
status = B00000000;
Wire.beginTransmission(i2cID);
Wire.send(statusReg);
Wire.endTransmission();
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
status = Wire.receive();
}
byte x_val;
Wire.beginTransmission(i2cID);
Wire.send(outXhigh);
Wire.endTransmission();
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
x_val = Wire.receive();
}
byte y_val;
Wire.beginTransmission(i2cID);
Wire.send(outYhigh);
Wire.endTransmission();
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
y_val = Wire.receive();
}
byte z_val;
Wire.beginTransmission(i2cID);
Wire.send(outZhigh);
Wire.endTransmission();
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
z_val = Wire.receive();
goodRead=true;
}
if (goodRead==true)
{
Serial.print(" val= "); Serial.print(x_val, DEC);
Serial.print(":"); Serial.print(y_val, DEC);
Serial.print(":"); Serial.println(z_val, DEC);
}
else
Serial.print("no data");
delay(100);
}
Спасибо за внимание!
Георгий
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.