Акселерометр ADXL345
Акселерометр – это устройство, которое позволяет измерить динамическое и статическое ускорение по трём осям X, Y и Z. Благодаря статическому ускорению можно определить положение в пространстве (акселерометр как датчик поворота), а благодаря динамическому (движение или встряска) – направление ускорения.
Цифровой акселерометр ADXL345 – это 3-осевой акселерометр с высоким разрешением (13 бит) по осям с пределом до ±16g. Модуль обладает пониженным энергопотреблением и малыми размерами. Информационный обмен с модулем осуществляется по последовательным интерфейсам I2C или SPI (3- или 4-проводной).
Существует множество модулей для Arduino с акселерометром ADXL345. Модуль может выглядеть, например, так:
Схема подключения (I2C):
Для работы воспользуемся библиотекой ADXL345
Код позволяет получить сырые и обработанные данные ускорения по каждой оси.
#include
#include
ADXL345 accelerometer;
void showRange(void)
{
Serial.print("Selected measurement range: ");
switch (accelerometer.getRange())
{
case ADXL345_RANGE_16G: Serial.println("+/- 16 g"); break;
case ADXL345_RANGE_8G: Serial.println("+/- 8 g"); break;
case ADXL345_RANGE_4G: Serial.println("+/- 4 g"); break;
case ADXL345_RANGE_2G: Serial.println("+/- 2 g"); break;
default: Serial.println("Bad range"); break;
}
}
void showDataRate(void)
{
Serial.print("Selected data rate: ");
switch (accelerometer.getDataRate())
{
case ADXL345_DATARATE_3200HZ: Serial.println("3200 Hz"); break;
case ADXL345_DATARATE_1600HZ: Serial.println("1600 Hz"); break;
case ADXL345_DATARATE_800HZ: Serial.println("800 Hz"); break;
case ADXL345_DATARATE_400HZ: Serial.println("400 Hz"); break;
case ADXL345_DATARATE_200HZ: Serial.println("200 Hz"); break;
case ADXL345_DATARATE_100HZ: Serial.println("100 Hz"); break;
case ADXL345_DATARATE_50HZ: Serial.println("50 Hz"); break;
case ADXL345_DATARATE_25HZ: Serial.println("25 Hz"); break;
case ADXL345_DATARATE_12_5HZ: Serial.println("12.5 Hz"); break;
case ADXL345_DATARATE_6_25HZ: Serial.println("6.25 Hz"); break;
case ADXL345_DATARATE_3_13HZ: Serial.println("3.13 Hz"); break;
case ADXL345_DATARATE_1_56HZ: Serial.println("1.56 Hz"); break;
case ADXL345_DATARATE_0_78HZ: Serial.println("0.78 Hz"); break;
case ADXL345_DATARATE_0_39HZ: Serial.println("0.39 Hz"); break;
case ADXL345_DATARATE_0_20HZ: Serial.println("0.20 Hz"); break;
case ADXL345_DATARATE_0_10HZ: Serial.println("0.10 Hz"); break;
default: Serial.println("Bad data rate"); break;
}
}
void setup(void)
{
Serial.begin(9600);
// Инициализация ADXL345
Serial.println("Initialize ADXL345");
if (!accelerometer.begin())
{
Serial.println("Could not find a valid ADXL345 sensor, check wiring!");
delay(500);
}
// Установка диапазона измерений
// +/- 2G: ADXL345_RANGE_2G
// +/- 4G: ADXL345_RANGE_4G
// +/- 8G: ADXL345_RANGE_8G
// +/- 16G: ADXL345_RANGE_16G
accelerometer.setRange(ADXL345_RANGE_16G);
// Показать текущие настройки
showRange();
showDataRate();
}
void loop(void)
{
// Считать сырые данные
Vector raw = accelerometer.readRaw();
// Считать нормализованные данные
Vector norm = accelerometer.readNormalize();
// Вывод сырых данных
Serial.print(" Xraw = ");
Serial.print(raw.XAxis);
Serial.print(" Yraw = ");
Serial.print(raw.YAxis);
Serial.print(" Zraw: ");
Serial.print(raw.ZAxis);
// Вывод нормализованных данных m/s^2
Serial.print(" Xnorm = ");
Serial.print(norm.XAxis);
Serial.print(" Ynorm = ");
Serial.print(norm.YAxis);
Serial.print(" Znorm = ");
Serial.print(norm.ZAxis);
Serial.println();
delay(100);
}
Данная программа вернет примерно такие данные:
Обратите внимание, что на ось Z действует ускорение, близкое к 9,8 м/с^2. Если положить датчик на бок, то ускорения изменятся:
Теперь ускорение по Z близко к 0, а вот Y — близко к 9,8 м/с^2. Эти данные будут меняться при движении. Например, при падении.
Ультразвуковой датчик расстояния Ардуино HC-SR04
Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара – посылая пучок ультразвука, и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них. Ультразвуковые сигналы, генерируемые приемником, отражаясь от препятствия, возвращаются к нему через определенный промежуток времени. Именно этот временной интервал становится характеристикой помогающей определить расстояние до объекта.
Датчик расстояния Ардуино является прибором бесконтактного типа, и обеспечивает высокоточное измерение и стабильность. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия.
Ультразвуковой дальномер HC SR04 имеет такие технические параметры:
Питающее напряжение 5В;
Рабочий параметр силы т ока – 15 мА;
Сила тока в пассивном состоянии
Обзорный угол – 15°;
Сенсорное разрешение – 0,3 см;
Измерительный угол – 30°;
Ширина импульса – 10-6 с.
Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):
Контакт питания положительного типа – +5В;
Trig (Т) – выход сигнала входа;
Echo (R) – вывод сигнала выхода;
GND – вывод «Земля».
Для получения данных, необходимо выполнить такую последовательность действий:
Подать на выход Trig импульс длительностью 10 микросек;
В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.
При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.
Подключение к Arduino
Выполнить подключение ультразвукового датчика расстояния к плате Arduino достаточно просто.
Скетч для подключения датчика hc-sr04 к Arduino
int trigPin = 8; // назначаем имя для Pin8
int echoPin = 9; // назначаем имя для Pin
void setup() {
Serial.begin (9600); // подключаем монитор порта
pinMode(trigPin, OUTPUT); // назначаем trigPin (Pin8), как выход
pinMode(echoPin, INPUT); // назначаем echoPin (Pin9), как вход
}
void loop() {
int duration, cm; // назначаем переменную "cm" и "duration" для показаний датчика
digitalWrite(trigPin, LOW); // изначально датчик не посылает сигнал
delayMicroseconds(2); // ставим задержку в 2 ммикросекунд
digitalWrite(trigPin, HIGH); // посылаем сигнал
delayMicroseconds(10); // ставим задержку в 10 микросекунд
digitalWrite(trigPin, LOW); // выключаем сигнал
duration = pulseIn(echoPin, HIGH); // включаем прием сигнала
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm); // выводим расстояние в сантиметрах
Serial.println(" cm");
delay(1000); // ставим паузу в 1 секунду
}