Пока оттачиваю модуль за модулем своего умного дома, решил выложить мини-мануал для подключения ультразвукового датчика расстояния, может кому пригодится.
Предисловие.
Модуль умного дома, который я на данный момент проектирую — умный будильник.
По сути, это приложение (оно уже готово на данный момент, альфа-тестируется), которое в определенное время запускает определенную композицию (или несколько рандомных) из списка, плавно увеличивая громкость. Естественно, оно имеет веб-интерфейс, и прочие удобства.
Как известно, наиболее важная функция будильника, кроме звонилки — это выключалка. Примитивная кнопка — не интересна, некоторые ее выключают на автомате. Особо нервные, даже разбивают будильник.
Мне пришла в голову идея, в качестве выключателя будильника, использовать активность тела, то есть себя.
Алгоритм прост: когда наступает время, включаем композиции по кругу, высвечиваем указатель на стене рядом с кроватью (например лазерной указкой), и ждем до тех пор, пока между железкой и красной точкой, что-то появится. Например вставший я. После этого останавливаем композицию.
Чтобы этого достичь, мы поставим в одном конце комнаты (то есть там где будильник — подальше от нас) датчик расстояния, лазер, и будем замерять расстояние до стены, на которую мы будем выводить красную точку. Как только это расстояние будет хоть на 10 см меньше — выключаем будильник.
Как будильник, так и датчик, мы будем подключать к НЕАРДУИНЕ, а точнее к Cubietruck.
Не вдаваясь в подробности будильника (для этого будет другая статья), приведу алгоритм подключения дальномера к Кубитраку.
Ход работы.
1) Датчик подключения
вот такой. Принцип действия — следующий: у него четыре пина, два под питание, trig и echo. Мы должны установить на триггере единицу в течении 10-20 мс, а затем сбросить на ноль, и посчитать сколько по времени будет держаться единица на пине echo. Своеобразный эхолот, а чтоб было читабельнее, так:
a) установили 1 на trig
b) delay 20 ms
c) установили 0 на trig
d) засекли время
e) ждем, пока echo не сбросится на 0
f) считаем, сколько echo пробыл в состоянии единицы
2) Для тех, кто еще не сталкивался с Кубитраком, добро пожаловать на habrahabr.ru/post/216211/. Здесь вы узнаете, как активировать GPIO для Cubietruck.
3) Мы будем использовать пины разъема, находящегося возле USB портов.
4) Для пина триггера, мы будем использовать пин под номером 5, он должен быть установлен на OUT.
5) Для пина эха, мы будем использовать пин 7, он следующий после пина 5, и должен быть установлен на IN.
Отступление. В интернете нет информации по поводу толерантности пинов к 5В (которые выдает логическая единица нашего дальномера). Рискуя жизнью Кубика, я проверил — толерантны. В отличие от Raspberry Pi, да.
6) Питание 5В можем взять откуда угодно. Я взял с питания SATA.
7) Получилось вот такое:
8) Пишем программный код. Я использовал адскую смесь PHP и Linux, поскольку не знаю С, да и наглядно это:
<?php
// Функция низкоуровневого пинга
function ping_hw()
{
// Устанавливаем единицу на триггер нашего дальномера
file_put_contents("/sys/class/gpio/gpio8_pg2/value",1);
// Спим 20 мс
usleep(20);
// Сбрасываем триггер в ноль.
file_put_contents("/sys/class/gpio/gpio8_pg2/value",0);
// Запускаем цикл от одного до 200. По хорошему, делать надо через WHILE, но если расстояние бесконечное, или больше 4-5м, то этот WHILE будет долго крутиться. т.е. делаем своеобразный таймаут "если сигнал не вернулся более чем за 200 мс, прекращаем его ждать"
for ($i=0; $i<200; $i++) {
$a=file_get_contents("/sys/class/gpio/gpio6_pg4/value");
// Если получили единицу с пина Echo - прерываем цикл.
if ($a==0) {break;}
}
// Ждем 20мс на всякий случай.
usleep(20);
return $i;
}
// Для удобства, функция отсеивающая шумовые нули, возвращаемые при пинге
function ping_r()
{
$v=0;
while ($v<1) {$v=ping_hw();}
return $v;
}
// Для еще большего удобства, функция запускающая несколько раз пинг, и вычисляющая среднее арифметическое значение
function ping_sr()
{
for ($c=0; $c<3; $c++) {$val[$c]=ping_r();usleep(20);}
$result=round($val[0]+$val[1]+$val[2]/3,0);
return $result;
}
// Инициализация портов на вывод и на ввод
file_put_contents("/sys/class/gpio/gpio8_pg2/direction","out");
file_put_contents("/sys/class/gpio/gpio6_pg4/direction","in");
// Собственно наш бесконечный цикл
while (1==1) {
$a=ping_sr();
echo "$an";
}
?>
Повторюсь, это не эталон, и вы не обязаны использовать так как написал я. Вы всего лишь можете воспользоваться алгоритмом.
9) Запускаем: php5 rasst.php
10) Видим бегущие циферки. Я не знаю что именно показывают эти циферки, реальное расстояние вам нужно будет посчитать самим, разделив результат на коэффициент (как правило, это скорость звука 340 мс).
Теперь мы знаем, как подключать дальномер к Cubietruck без дополнительных аппаратных костылей.
На закуску, видео:
Спасибо.
Автор: ntfs1984