Cubietruck & Raspberry Pi & Arduino

  

Добрий час доби, Хабр!

У той час, поки до мене їде багато всякої смакоти, вирішив написати пост. У цьому пості я розповім про взаємодію трьох абсолютно різних систем, в рамках одного міні-проекту.
 
Обмовлюся відразу: цей пост не how-to. Цей пост не претендує на роль універсального рішення. І цей пост не обмежений завданням, про яку він розповідає.
 
 

Передмова.

Будь-яка система розумного будинку, складається з декількох компонентів. І якщо в умах середньостатистичного обивателя, розумний будинок асоціюється з набором датчиків, дисплеєм, і зрідка системами виконання (наприклад жалюзі), то у мене в думці розумний будинок більше асоціюється з Джарвісом (персонаж марвелловского «Залізної Людини»).
Адже завдання розумного будинку зовсім не полягає у виведенні стану датчиків температур, або включенні світла по бавовні. Вона полягає в унікальному комбінуванні різних даних, а потім прийнятті самостійного рішення на основі цих даних, включаючи дані, введені користувачем в процесі роботи системи.
Ці завдання як правило вирішуються центральним компонентом системи, тобто її мозком. Хоча збираються з різних точок будинку.
 
 
Цікаво?
Ласкаво просимо під хабракат…
 
 
Буде великою помилкою стандартизувати топологію такої системи. І справді, якщо наприклад, завдання системи розумного будинку, просто включати світло при русі в коридорі — буде нерозумно спочатку передавати дані з датчика руху в центральну систему, щоб центральна система усвідомила що цей рух, і передала команду у вузол виконання — релейний блок в коридорі. Така система повинна працювати в межах коридору.
Але якщо потрібно з'єднати кілька різношерстих компонентів, тоді починається найвеселіше.
 
 

Що ми будемо робити?

Моргати світлодіодом ми не будемо. Ми будемо моргати LCD-дисплеєм.
Але й моргати ми їм будемо не просто так, а тільки по певної дії. Наприклад відкритого полум'я.
 
 

Що у нас є?

 - У нас є Cubietruck, знайомий нам з мого попереднього поста habrahabr.ru/post/216211 / ;
 - Raspberry Pi B \ 512;
 - Клон Arduino Nano;
 - Дисплейний блок Nokia 5110, 84x48 пікселів, і білим підсвічуванням;
 - Датчик відкритого полум'я Flame Sensor V.2;
 - А ще у нас є коробка сірників і свічка.
 
 

Поїхали!

До складання системи я усвідомив, що ні на Cubietruck, ні на Raspberry Pi нету аналогових входів. Тому довелося задіяти Ардуін. Це виявилося для мене найпростіше і доступне рішення.
До Ардуін я підключив датчик відкритого полум'я, він зайняв всього три дроти.
 
Ардуінку до Кубику підключив недовго думаючи через USB-роз'єм. Гіки скажуть, що це не тру, що треба підключати через UART та інше. І вони виявляться праві. Як підключив я — робити не потрібно! Тим більше не потрібно довіряти своє життя чи здоров'я, чотирьохстах вісімдесяти мегабіта!
 
По-хорошому, дисплейний модуль можна було підключити теж до Кубику, але мені хотілося ускладнити процес небудь залізячки.
Тому я додав в систему Raspberry Pi.
 
На фото, ці пристрої лежать поруч, але насправді Малинка з дисплеєм — незалежна від інших, а поруч лежать для зручності зйомки.
На жаль, у мене в будинку wi-fi, мережевого кабелю немає, і окремого wi-fi модуля для Малинки теж немає. Довелося обійтися милицею на андроиде в режимі модему.
 
Отже, відбуватиметься наступне:
Ардуін читатиме значення датчика відкритої температури. Ці значення (0-1024) вона буде посилати в серійний порт, який підключений до Cubietruck. Малинка, в свою чергу, бачачи значення вище порогового — засвітить дисплей.
 
 

Матчасть.

 
 
 
 
Arduino-блок
Arduino Nano використовує простий скетч, запитувач аналоговий пін, і що виводить значення пина в послідовний порт. Датчик має три входи, 5В, Ground, і OUT, який я підключив до піну А0. Не буду заглиблюватися в установку Arduino IDE, вона стандартна з убунтовского ріпа.
Скетч:
 
const int analogInPin = A0;
void setup() {
  Serial.begin(9600); 
}
void loop() {
  sensorValue = analogRead(analogInPin);            
  Serial.println(sensorValue);      
  delay(10);
}

 
Cubietruck-блок
Коли Ардуінка вставляється в USB Кубика, Лінукс створює пристрій / dev/ttyUSB0, яке можна cat'нуть, згідно з традиціями Лінукса, і отримати поточне значення з порту.
 
Для зручності я написав найпростіший bash-скрипт, постійно зчитує значення порту, і перезаписуючий останнє значення в файл:
 
 
while true; do
        read -n 8 LINE < /dev/ttyUSB0
echo $LINE
        echo $LINE > thermo
done

Окремо варто загострити увагу на способі зчитування. Я вибрав read, тому що йому можна вказати кількість символів для зчитування.
Якщо цього не зробити, а зробити через cat — іноді рядок, що приходить з послідовного порту, буде неповною, тому що Ардуінка вже не подає біти початку і закінчення передачі, а просто відправляє в порт те, що бачить на піне. Іншими словами, пристрою не синхронізуються між собою.
 
Запустивши скрипт, і помахавши палаючої сірником — ми можемо бачити як змінюються наші дані.
 
root@Cubian:/home/cubie# bash scanUSB.sh 

233
254
239
225
253

 Підводний камінь.
Датчик відкритого полум'я — голосно сказано. Се поділилася сприймає полум'я, не як тепло, а швидше як світло зі спектром коротше жовтого включно.
Тому, коли в кімнаті вмикається світло (лампа розжарювання), в будь-якій частині кімнати, датчик починає «фонить» і видавати близько 200 одиниць. Якщо закрити долонькою — менше.
А ось блакитне полум'я газової плити — він не бачить. Загалом неправильний це датчик відкритого полум'я.
 
 
Raspberry Pi-блок
LCD екран до Raspberry PI підключається по інтерфейсу SPI, що не може не пригнічувати. Чорно-білий дисплей, 84х48, без всяких кадрових розгорток та іншої смакоти, займає 8 пінів. Це теж неправильно.
 
 Схема підключення дисплея Nokia 5110 до Raspberry Pi:
 
 RST : пін 18
 CE : пін 24
 DC : пін 16
 DIN : пін 19
 CLK : пін 23
 VCC : пін 1 (3.3 В)
 LIGHT : пін 12 (це потрібно для регулювання яскравості, якщо ми не хочемо — можна просто підключити до 3.3 В)
 GND : корпус
 
 Ставимо WiringPi — лібу для роботи з GPIO:
 
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

 Ставимо пітоновие модулі для повноти пітона:
sudo apt-get install python-dev python-imaging python-imaging-tk python-pip
sudo pip install wiringpi wiringpi2
 
 Якщо не був включений раніше, потрібно включити модуль spidev:
(Коментах рядок blacklist spi-bcm2708)
 
vi /etc/modprobe.d/raspi-blacklist.conf

 
 Ставимо пітоновую примочку для роботи з SPI:
 
sudo pip install spidev

 
 Ставимо фронтенд для роботи з SPI на Пітоні:
 
git clone https://github.com/XavierBerger/pcd8544.git
cd pcd8544
./setup.py clean build
sudo ./setup.py install

 Тепер заради інтересу, ми можемо зайти в приклади, і що-небудь протестувати:
 
cd examples
sudo ./pi_logo.py

 На цьому налаштування дисплея завершена.
 
 
Raspberry Pi-Cubietruck-блок
Є цікава приблуда, sshfs, вона лежить в стандартних репах, і дозволяє монтувати до себе будь віддалений каталог, по протоколу ssh.
Цей метод «розшарений диска», я і вирішив використовувати.
 Запускається sshfs простіше простого:
 
mkdir test
sshfs cubie@192.168.1.39:/home/cubie test

Відтепер після введення правильного пароля, у нас на Малинці в папці test буде вміст Кубікова хом'яка.
 
Все вірно. Тут ми можемо виявити наш файл «thermo», що створюється скриптом на Кубику.
Тут же ми створюємо найпростіший скрипт на будь-якій мові, завдання якого буде зчитувати значення з файлу thermo, і запускати один з examples, які ми компілювали 10 рядків назад. Я вибрав PHP:
 
<?php
$c=file_get_contents("thermo");
if ($c>250) { system('python /home/pi/pcd8544/examples/pi_logo.py');unlink('thermo');}
?>

 
Запустивши його в нескінченному циклі, ми доб'ємося такого результату, як у мене на відео:
 
while [ 1 = 1];do php5 test.php;done

  
Тепер працюю над впровадженням бази даних (почну з MySQL) в якості прошарку, куди датчики можуть записувати параметри, інші пристрої читати, а релейні пристрої виконувати команди, внесені туди «мозком» розумного будинку.
 
 Охоче ​​буду ділитися напрацюваннями .
 
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.