Система керування розумним будинком на основі Raspberry Pi. Raspberry Pi для домашньої автоматизації. Структурна схема

Привіт, друзі

Після того, як я випробував можливості системи управління розумним будинком Domoticz на своєму настільний комп'ютері переконався в тому, що вона відмінно доповнює, а де і замінює Mi Home – штатну систему Xiaomi – я вирішив придбати для неї окремий одноплатний комп'ютер – Raspberry Pi. І в цьому огляді розповім про свій досвід.

Вступ

Для тих, хто не читав мій перший огляд про Domoticz - . Буквально після перших вдалих експериментів, я загорівся ідеєю окремої апаратної бази для неї, як робоча платформа настільний ПК не підходить. Вибір свій я зупинив, після штудування пабліків - на Raspberry Pi Model 3 B - компактний, але потужний одноплатний комп'ютер на базі Soc процесора BCM2837 з 4 ядрами Cortex-A53, що працює на частоті 1.2GHz, 1GB ОЗУ та бездротовими модулями Wi-Fiта Bluetoth 4.1.

Комплект

У своє замовлення я включив 4 позиції -

Що цікаво в магазині є дві модифікації – китайська та англійська. На момент покупки китайська коштувала на 7 доларів дешевше, її я й узяв. Чого там китайського – чесно кажучи для мене загадка.

Мідні радіатори для Raspberry Pi - сторінка товару

Ще для повного комплекту вам знадобиться microSD карта- не менше 4 GB та HDMI кабель. У мене в загашнику був і кабель та карта на 32 ГБ, тому купувати не став.

Що в посилці

Через встановлений термін - трохи більше двох тижнів, кур'єр приніс посилку з моїм замовленням.


Розглянемо докладніше. Блок живлення з вилкою Тип С та роз'ємом micro-USB.


Заявлений максимальний струм – 2А при напрузі 5В.


Тестове включення з навантаженням в 2А - показує деяке просідання напруги, але в межах допустимого блок живлення - більш-менш чесний.


Комплект із трьох мідних радіаторів у пакетику, для пасивного охолодження.


Всі радіатори мають квадтарну форму, два радіатори зі штирями та довжиною сторони близько 12 мм та один плоский зі стороною близько 15 мм.


Корпус із темного пластику з видавленим зображенням ягоди малини на кришці.


Розміри корпусу – приблизно 90 на 65 мм



Корпус розбирається на 5 частин - тримається всі клямки, ніяких гвинтів.


З аксесуарами покінчено - час переходити до найголовнішого

RASPBERRY PI 3 MODEL B

Raspberry Pi 3 Model B є прямим спадкоємцем Raspberry Pi 2 Model B. Плата повністю сумісна з попередником, але має більшу продуктивність і нові засоби комунікації:
64-бітним чотириядерним процесором ARM Cortex-A53 з тактовою частотою 1,2 ГГц на однокришталевому чіпі Broadcom BCM2837; вбудованими Wi-Fi 802.11n та Bluetooth 4.1.
Крім того, процесор має архітектуру ARMv53, а значить, ви зможете використовувати улюблену операційну систему: Debian Wheezy, Ubuntu Mate, Fedora Remix і навіть MS Windows 10.


Технічні характеристики докладніше

CPU - Broadcom BCM2837, ARM Cortex-A53 Quad Core, 1.2 GHz
Кількість ядер процесора - 4
GPU - VideoCore IV 3D
RAM - 1 GB
Сховище - microSD
Мережеві можливості
Ethernet 10/100
WiFi 2.4G 150 mb/s
Відео висновок - HDMI
USB порти - 4
Бездротові можливості - Bluetooth
Аудіо висновок – 3,5 Jack
85,6 х 53,98 х 17мм, 45 грам


У коробці є документація та буклет по швидкій установці- До речі на англійською, а також пакет із щільного коричневого паперу з комп'ютером.


На одній з довгих сторін комп'ютера розміщені порти micro USB для повнорозмірного живлення. порт HDMI, CSI-2 Camera port - для підключення камери за інтерфейсом MIPI, 3,5 мм аудіороз'єм. Також на верхній стороні знаходиться модуль процесора і Ethernet/USB Hub lan9514-jzx


На торцевій стороні скомпоновано 4 USB портута порт Ethernet


На іншій стороні материнської платизнаходиться 40 контактів введення/виводу загального призначення(GPIO)


На другому торцевому боці - знаходиться DSI Display Port для підключення штатного дисплея


На нижній стороні плати знаходиться модуль пам'яті LPDDR2 SDRAM – EDB8132B4PB-8D-F


І micro-SD роз'єм для картки пам'яті


Мідні радіатори ставляться на USB/Ethernet Hub та процесор з одного боку


І на чіп пам'яті з іншого. Цей радіатор плоский - не заважає встановленню плати комп'ютера в корпус


У корпус все встановлюється відмінно, гвинтових з'єднань немає - сідає на пластикові виступи.


Усі вирізи на корпусі точно збігаються з роз'ємами комп'ютера



Для запуску нам знадобиться зовнішній монітор (телевізор) з HDMI входом, USB клавіатура, буде зручніше якщо так само буде і мишка і живлення. Монітор, клавіатура та мишка - знадобляться тільки на момент установки, далі достатньо лише блоку живлення.


Встановлення операційної системи

Для установки операційної системи, насамперед необхідно завантажити архів з дистрибутивами - звідси . Поки скачується майже півтора гігабайтний архів, завантажуємо утиліту для форматування SD картки – SD Card Formatter – звідси. Цей дистрибутив набагато компактніший - всього 6 МБ, тому не гаючи часу, встановлюємо програму


і, після установки, вставляємо карту пам'яті в картридер (у вас є картридер чи не правда) і запускаємо SD Card Formatter. У меню Options необхідно встановити “FORMAT SIZE ADJUSTMENT” у “ON”


Дочекавшись завершення завантаження великого дистрибутива, відкриваємо отриманий архів і розпаковуємо його вміст на свіжовідформатовану флешку.

Наступний крок - перший запуск Raspberry Pi (флешку із записаним дистрибутивом, звичайно встановлюємо в нього). Вибачте за якість наступних фото - з екрана телевізора:(

При першому запуску стартує меню вибору операційної системи – що ставити, причому у списку є навіть версія WIndows 10 для Raspberry Pi. На цьому етапі можна вибрати мову (внизу екрана) - російська є та підключиться до Wi-Fi мережі- кнопка Wi-Fi networks


Потрібна мені опораціонка - Raspbian, що базується на Linux Debian - представлена ​​в двох варіантах, lite і повному, з графічним інтерфейсом. Я обрав повну версію


Після цього можемо спокійно йти пити чай з бубликами, установка займе довго.


Періодично вимірюючи температуру під час установки, що я бачив - 38 градусів.

Після завершення встановлення та перезавантаження комп'ютера, завантажується робочий стіл Raspbian


Єдине, що я зробив тут - це в налаштуваннях включив SSH - для того, щоб керувати системою з настільного ПК, все інше я вже робив через термінал.


Для управління Raspberry з настільного ПК, нам знадобиться будь-яка програма термінал, я використовую старий добрий Putty


Ім'я користувача та пароль за замовчуванням - piі raspberry. Для зміни пароля скористайтесь командою passwd.


eth0 - це Ethernet

lo – це локальний інтерфейс 127.0.0.1

wlan0 – це wi-fi інтерфейс


а для того, щоб відредагувати файл з налаштуваннями - вводимо команду

sudo nano /etc/dhcpcd.conf

і в файлі, прогорнувши в кінець додаємо потрібні налаштуванняв залежності від того, який інтерфейс ми будемо використовувати.

Наприклад ми хочемо використовувати адресу 192.168.0.222, маску 255.255.255.0, адресу шлюзу та DNS - 192.168.0.1

Для Ethernet вставляємо

static ip_address=192.168.0.222/24
static routers=192.168.0.1

interface wlan0
static ip_address=192.168.0.222/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1


Для виходу з редактора натискаємо ctrl+x
Для збереження змін – натискаємо “Y” і потім enter

Установка Domoticz

Більшість роботи з налаштування вже закінчено, тепер нам потрібно встановити систему Domoticz. Робиться це однією командою -

sudo curl-L install.domoticz.com | sudo bash

Яка ініціалізує процес загурзки та встановлення системи


У процесі установки інсталятор поставить питання з приводу місця встановлення і т.п. – всі ці моменти я залишив за замовчуванням.


Після успішної установки, інсталятор напише адреси та порти веб-інтерфейсу системи Domoticz


Але для роботи зі шлюзом Xiaomi нам потрібна beta версія системи. Оновлення до версії бети проводиться командами

cd ~/domoticz
sudo ./updatebeta


Після цього ми можемо приступати до додавання пристроїв до системи Domoticz - про це я вже розповідав у своєму попередньому огляді про неї.


На даний момент я вже переніс усі свої робочі сценарії з Windows версіїна Raspberry - до речі варто додати, що обидві системи мирно співіснують одночасно. Для забезпечення безперебійного живленняМінікомп'ютер досить використовувати PowerBank, який дозволяє одночасно живити пристрій і отримувати живлення від зовнішнього джерела.

Відеоверсія огляду:

Усі мої огляди пристроїв Xiaomi у хронологічному порядку - Список

Сподіваюся огляд був корисний та цікавий, дякую за увагу.

Принципова схема підключення кнопки зображена на малюнку 12. Зверніть увагу, що на макетної платизалишається підключеним і світлодіод із прикладу у першій частині статті, але на поточній схемі він не показаний.

Як видно зі схеми, якщо кнопка не натиснута, вхід GPIO5 буде підключений через резистор до шини 3.3 В. Вхідний порт RPi має високий вхідний опір, тому напруга на вхідній лінії буде близько до 3.3 В. Це означає, що при відпущеній кнопці RPi буде визначати стан входу як «лог. 1». Коли кнопка натиснута, напруга на вході дорівнюватиме 0, що є «лог. 0».

Для цієї простої схеми величина опору резистора R1 некритична і може перебувати в діапазоні від 1 кОм до 47 кОм, проте низьких значень слід уникати, оскільки в цьому випадку збільшується струм, який споживається при натисканні кнопки.

Вихідний код програми для читання стану кнопки доступний у розділі завантажень (файл з ім'ям Listing_4(Button).txt). Збережіть код у файлі з ім'ям button-test.pyта запустіть на виконання командою

sudo python button-test.py.

Результат виконання програми виводиться на екран у вигляді повідомлення про поточний стан кнопки та кількість натискань на неї. При виконанні цього прикладу ви помітите, що іноді значення лічильника стає більше реальної кількості натискань на кнопку, і це відбувається через «брязкіт» контактів. Приблизно те саме відбувається і при відпусканні кнопки. Рішення полягає у використанні механізму придушення «брязкоту» контактів (debouncing). Цей механізм може бути як апаратним, і програмним, причому останній поширений більше. У вихідному коді, наведеному у файлі Listing_5(Button_Debounce).txt, придушення брязкальця контактів кнопки реалізовано, і підрахунок кількості натискань кнопки буде більш точним. Єдина відмінність від попереднього коду полягає в тому, що тепер із затримкою 20 мс виконується друга перевірка стану входу - за цей час брязкіт контактів припиняється.

Ще один приклад: вольтметр

Як відомо, плати RPi мають лише цифрові порти вводу/виводу, але в реальному світі використовуються аналогові величини, які, можливо, необхідно вимірювати або контролювати. У наступному прикладі демонструється перетворення аналогової величини в цифровий сигналякий можна прочитати за допомогою входів RPi.

Прикладом може бути дуже простий, але точний вольтметр з діапазоном вимірів 0 … 1 (Малюнки 13, 14). Зверніть увагу, що замінити портативний мультиметр він не може, оскільки не має необхідних ланцюгів захисту, і може вийти з ладу сам або пошкодити плату RPi, якщо використовується для чогось, що виходить за рамки описаних тут прикладів.

У схемі використовується мікросхема AD654 (перетворювач напруга-частота), яка генерує прямокутні імпульси із частотою, яка залежить від вхідної напруги. Цифровий вихід Fout мікросхеми підключено до входу GPIO5 (висновок 29 гнізда GPIO). Максимальна частота прямокутних імпульсів при вказаних на схемі номіналах елементів дорівнює 10 кГц, тому визначення вхідної напруги нам знадобиться точна система відліку часу. Код для цього прикладу (файл Listing_6(Voltmeter).txt) написаний на Сі та використовує бібліотеку wiringpi, написану Гордоном Хендерсоном (Gordon Henderson). Насамперед, встановіть бібліотеку wiringpi, для чого виконайте такі команди:

mkdir development
cd development
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

Збережіть код у файлі з ім'ям voltmeter.c та скомпілюйте його командою

gcc -o voltmeter -lrt -lwiringPi voltmeter.c.

Щоб запустити програму, виконайте таку команду:

sudo./voltmeter.

Для підвищення точності вимірювань у програмі використовується усереднення даних. Тривалість вхідних прямокутних імпульсів швидко вимірюється 64 рази, потім отримані значення підсумовуються і діляться на 64. Після закінчення обчислень включається затримка на секунду для виконання інших процесів, і потім цикл виміру повторюється

Декілька елементів у схемі вольтметра також впливають на точність вимірювань. Конденсатор С1 та резистор R1 задають характеристики перетворення, тому бажано вибрати плівковий поліпропіленовий конденсатор та точний резистор з допуском 1%. Можна використовувати підстроювальний резистор. Напруга живлення схеми 5 В надходить з роз'єму GPIO, але його реальне значення може дещо відрізнятися від 5 В, тому краще використовувати окреме точніше джерело живлення.

Для швидкої перевіркисхеми можна використовувати дільник напруги, що складається із двох резисторів. Схема включення дільника показана у лівій частині схеми вольтметра (Малюнок 12). Якщо резистори прецизійні і напруга живлення точно дорівнює 5 В, розрахунок напруги на виході дільника дає 0.04950 В. Значення, отримане в результаті реального програмного вимірювання, склало 0.04991 В. Непогано для такого простого проекту!

Діоди Шоттки D1 ​​та D2 у схемі не є обов'язковими, але настійно рекомендуються, оскільки вони забезпечать деякий захист мікросхеми, якщо випадково на вхід буде подано напругу поза діапазоном 0…1 В.

Захищені входи

RPi можна захистити від випадкового потрапляння високої напруги, додавши до входів додаткову схему. У деяких випадках дуже гарною і недорогою альтернативою показаній нижче схемі (Малюнок 15) може служити оптрон, здатний захистити входи RPi від напруги до 60 В і впорається з переполюсуванням. Транзистор BC547B у схемі Рисунку 14 можна замінити на 2N3904 або BC549. Допустима потужність розсіювання резистора R1 може бути 0.25 Вт при вхідних напругах до 50 В, інакше краще використовувати 0.5 Вт.

Схема інвертує вхідний сигнал, перемикаючись у «лог. 0» при вхідній напрузі понад 2 ст.

Підключення до 5-вольтової логіки

Пряме підключення пристроїв із 5-вольтовими логічними виходами до входів RPi може вивести плату з ладу. І тут є безліч рішень.

Якщо стан 5-вольтового логічного виходу змінюється відносно повільно, можна розглянути можливість використання резистивного дільника на вході RPi, але до швидких схем такий спосіб не застосовується. Тоді набагато найкращим рішенням буде використання буферної мікросхеми. Для середніх швидкостей (до 100 кГц) цілком підійде схема на N-канальному MOSFET ZVN2110A (Малюнок 16). Ця схема також інвертує вхідний сигнал.

Показаний на схемі транзистор можна замінити ZVNL120A або VN10LP.

При паянні польових транзисторів слід дотримуватись основних запобіжних заходів. Під час складання пристрою спочатку встановіть резистор R3 і лише після цього вийміть MOSFET із захисної упаковки та запаяйте у схему. Резистор R3 забезпечить певний захист.

Швидкість роботи та джиттер

Опитування стану кнопок та управління світлодіодами - події щодо повільні, що вимірюються десятками та сотнями мілісекунд. Іноді зустрічаються набагато більш швидкісні сигнали. Наприклад, пульт від телевізора випромінює інфрачервоні світлові імпульси зі швидкістю 40 тис. разів на секунду. Незважаючи на те, що основний процесор RPi працює на частоті 1 ГГц, робота підсистеми введення/виводу з такою швидкістю не підтримується з ряду причин, як апаратних, так і програмних. Ми розглянемо деякі програмні аспекти теми статті.

RPi працює під управлінням багатозадачної операційної системи (ОС) Linux. Система може превентивно забирати контроль за вашою програмою для виконання інших завдань. Все це відбувається досить швидко, так що здається, ніби мишка, як і раніше, працює під час виконання вашої програми, але насправді вашій програмі і коду драйвера миші ОС надає лише короткі проміжки часу.

Зазвичай це не має значення, але коли вам потрібна обробка коротких або високоточних подій, це може стати проблемою (наприклад, у вигляді джиттера).

Крім того, важливе значення має вибір мови програмування, оскільки деякі бібліотеки підходять краще за інші. Інтерпретовані та компільовані коди можуть виконуватися з різними швидкостями. Коротше кажучи, якщо потрібна дуже точна тимчасова прив'язка подій, можливо, доведеться написати драйвер Linux або використовувати зовнішнє обладнання (наприклад, інший мікроконтролер або логічні схеми та генератор).

Одним із добрих питань, важливих для більш повного використання можливостей RPi, є те, наскільки швидко можна змінювати логічні стани виходів GPIO за допомогою бібліотек Python, Сі та описаного вище командного скрипту.

Щоб дізнатися про це, був написаний код для періодичного перемикання логічного стану вихідного порту, до якого був підключений осцилограф. Результат подано у Таблиці 1.

Таблиця 1. Максимальна частота перемикання виходів при
використання різних мов програмування
Мова
програмування
Частота Тривалість
високого рівня
Тривалість
низького рівня
Python 71.2 кГц 3.9 мкс 10.1 мкс
Сі 5.8 МГц 85 нс 85 нс
Командний скрипт 3.9 кГц 115 мкс 139 мкс

Однак завжди важливо пам'ятати про джиттер, яким обов'язково супроводжується робота ОС Linux. Для випадку простого перемикання світлодіода це, звичайно ж, не проблема. Характер джиттера можна побачити на осцилографі як накладення кількох каналів при синхронізації загальним сигналом (Малюнок 17). Зауважте, що джиттер може приймати безліч значень, незважаючи на те, що сигнали дискретно рознесені на 4 нс (250 МГц), що пов'язано з апаратними особливостями RPi.

Висновок

Тепер ви побачили, що 40-контактний роз'єм GPIO на платах RPi може використовуватися для різних проектів – від керування світлодіодами до електронних схем для вимірювання аналогових величин. З невеликими додатковими схемами адаптації логічних рівнів RPi може взаємодіяти 5-вольтовими пристроями. За допомогою Python дуже легко керувати виходами, так само як не уявляє складності та читання стану входів, а бібліотека wiringpi значно спрощує управління програмістам, які використовують Сі.

Raspberry PI - це пристрій, що має достатню продуктивність для того, щоб на його основі могли бути побудовані роботи здатні розпізнавати образи, виконувати роботу людей та інші подібні пристрої для автоматизації та виконання складних обчислювальних дій. Т.к. тактова частотапроцесора Raspberry PI 3 м.б. 1.2 ГГц а його розрядність 32 біта то Raspberry PI 3 значно перевершує звичайне Arduino у якого тактова частота як правило 16 МГц а розрядність мікроконтролера 8 біт, Arduino безумовно займає своє місце у виконанні операцій, що не вимагають великої продуктивності, але коли її вже не вистачає приходить на допомогу" і перекриває такий великий діапазон можливих застосувань, що можна бути абсолютно впевненим у доцільності придбання даного одноплатного комп'ютера Raspberry PI 3 (можна замовити за посиланням). Т.к. Raspberry PI - це комп'ютер для того щоб його використовувати потрібно на нього встановити операційну систему (хоча існують обхідні шляхи але все ж краще і простіше встановити операційну систему (далі)). Існує багато ос які можна встановити на Raspberry Pi але однією з найпопулярніших (для використання з Raspberry Pi), найбільш підходящим для початківців є ос Raspbian. Для того щоб встановити ос на Raspberry Pi знадобитися micro sd карта з розширювачем для того, щоб її можна було вставити в звичайний комп'ютері записати на неї ос. Sd карта повинна мати не менше 4Гб пам'яті при встановленні повної версії Raspbian і не менше 8Гб для встановлення мінімальних версій Raspbian. Мінімальні версії можуть не мати (і швидше за все не мають) графічного інтерфейсуі багато іншого що може вважатися зайвим і займає місце. Щоб уникнути проблем з відсутністю необхідних файлів, можна встановити повну версію. Можна використовувати SD карту 10го класу та з 32Гб пам'яті (перевірено працює (як див. відео нижче)). Після придбання карти пам'яті її треба вставити в комп'ютер у відповідний роз'єм, після цього подивитися з якою літерою з'явився диск у розділі "мій комп'ютер" і запам'ятати, потім треба завантажити ос з офіційного сайту https://www.raspberrypi.org/downloads/raspbian / натиснувши кнопку "Download ZIP" під "RASPBIAN JESSIE" для завантаження повної версії або під "RASPBIAN JESSIE LITE" для завантаження полегшеної але, для початківців, краще вибрати "RASPBIAN JESSIE" тобто. повну версію. Після скачування архіву "RASPBIAN JESSIE" його потрібно розархівувати, потім завантажити програму (або від сюди https://yadi.sk/d/SGGe1lMNs69YQ), встановити її, відкрити, далі потрібно в правому верхньому кутку вказати букву диска (запам'ятану раніше), знайти розархівований образ ос

І натиснути кнопку "write".

Після чого виведеться вікно із попередженням і в цьому вікні треба натиснути кнопку "Yes",

Після того як запис закінчиться і з'явиться вікно, що повідомляє про успішний запис (Write Successful), потрібно натиснути кнопку "Ok" у цьому вікні.

Потім закрити програму, витягнути карту SD безпечним способомта вставити в Raspberry Pi.

Далі можна підключити до Raspberry Pi usb клавіатуру(або ps2 через ), usb миша та монітор або телевізор через hdmi кабельабо можна підключити ethernet кабель (але це для досвідчених користувачів, тому далі розглянемо перший варіант). Після цього треба підключити живлення через micro usb, наприклад, від зарядного пристроювід смартфон. Після підключення живлення почнеться встановлення операційної системи. Як правило в нових (на момент написання цієї статті) версіях ос вже налаштована можливість зв'язку з Raspberry Pi по SSH і тому для того щоб налаштувати зв'язок з Raspberry Pi 3 по wifi достатньо налаштувати тільки wifi, Для цього в правому верхньому кутку екрана є значок на який потрібно натиснути та вибрати wifi,

Після чого вписати пароль від даного wifi в текстове поле, що з'явилося,

Після цих дій wifi на Raspberry Pi 3 буде налаштований і далі можна буде не використовуючи дроти програмувати Raspberry Pi 3 віддалено по wifi. Після налаштування Raspberry Pi 3 можна вимкнути вписавши в командному рядку(у програмі LXTerminal, яку можна відкрити подвійним клікомпо іконці програми) команду sudo halt або натиснувши відповідні кнопки вимкнення в графічному режимі, після остаточного вимикання можна вимкнути живлення та при наступній подачі живлення Raspberry Pi 3 увімкнутися з wifi. Тепер щоб програмувати Raspberry Pi 3 по wifi потрібно з'ясувати, яка у нього ip адреса. Для того щоб це зробити треба подати харчування на Raspberry Pi 3, дочекатися закінчення завантаження ос, зайти в веб-інтерфейс маршрутизатора (вписавши в рядку браузера 192.168.1.1 або те, що треба для входу в веб-інтерфейс, ввести логін і пароль), знайти вкладку DHCP Leases або щось подібне, знайти там рядок з raspberry та ip адресу Raspberry Pi 3.

Далі потрібно відкрити програму PuTTY (якщо її немає, то перед цим завантажити (або ) і встановити) поставити порт 22, з'єднання по SSH, вписати в поле "Host Name (or IP Adress)" ip адресу Raspberry Pi 3,

Після чого натиснути кнопку "Open" унизу вікна, далі з'явиться чорне вікно з пропозицією ввести логін. За умовчанням логін "pi" - його треба ввести та натиснути enter. Далі треба ввести пароль за замовчуванням "raspberry". При введенні пароля він не відображається – це нормально. Після того як пароль введений невидимими літерами потрібно натиснути enter і якщо все було зроблено правильно ми отримаємо доступ до Raspberry Pi 3 якщо ні то потрібно повторити дії. Після того як отриманий доступ до Raspberry Pi 3 можна його програмувати, спочатку потрібно увійти в папку "pi" для цього треба вписати команду

І натиснути enter (після cd обов'язково пробіл).
Тепер можна відкрити текстовий редактор nano. Nano - це спеціальний текстовий редактор, який є на більшості ос на кшталт Linux і в якому можна написати програму для Raspberry Pi. Для відкриття цього редактора та одночасно з цим створення файлу з назвою "first" та розширенням "py" потрібно вписати команду

І натиснути enter. Відкриється редактор nano і можна зауважити, що його інтерфейс трохи відрізняється але в основному - це те ж чорне поле в яке треба вписувати команди. Т.к. ми хочемо керувати портами введення загального виводу (GPIO) то перш ніж запустити програму з управління цими портами, потрібно підключити до них який-небудь пристрій щоб можна було бачити що управління вийшло. Треба також відзначити що піни налаштовані як виходи у Raspberry Pi можуть видавати дуже невеликий струм (припускаю, що до 25мА) і враховуючи, що Raspberry Pi це все-таки не саме дешевий пристрійто настійно рекомендується подбати від того, щоб навантаження на висновки не було занадто великим. Малопотужні індикаторні світлодіоди, як правило, можуть використовуватися з Raspberry Pi. їм для того, щоб світитися досить невеликого струму. Для першого разу можна зробити пристрій з роз'ємом, двома зустрічно паралельно включеними світлодіодами і резистором з опором 220Ом послідовно включеним зі світлодіодами. Т.к. опір резистора 220Ом, струм обов'язково проходить через цей резистор і немає паралельних шляхів його проходу, напруга на висновках 3.3В струм не буде більше ніж 3.3/220=0.015А=15мА. Підключити це можна до вільних GPIO наприклад до 5 і 13 як на схемі

(розпинання взято з https://en.wikipedia.org/wiki/Raspberry_Pi), виглядати це може приблизно так:

Після того як все акуратно і правильно підключено і є впевненість у тому, що нічого не згорить, можна скопіювати в редактор NANO першу простеньку програму на мовою Python

Import RPi.GPIO як GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(5, GPIO.OUT)
GPIO.output(13, True)
GPIO.output(5, False)
time.sleep(1)
GPIO.output(13, False)
GPIO.output(5, True)
time.sleep(1)
GPIO.output(13, True)
GPIO.output(5, False)
time.sleep(1)
GPIO.output(13, False)
GPIO.output(5, True)
time.sleep(1)
GPIO.output(13, True)
GPIO.output(5, False)
time.sleep(1)
GPIO.output(13, False)
GPIO.output(5, True)
time.sleep(1)
GPIO.cleanup()

Потім натиснути

Після виходу з редактора NANO можна ввести команду

Sudo python first.py

Після цього світлодіоди помигають кілька разів. Тобто. вдалося управляти портами введення виведення загального призначення по wifi! Тепер давайте розглянемо програму і з'ясуємо, як це вийшло.
Рядок:

Import RPi.GPIO як GPIO

Це підключення бібліотеки "GPIO" для керування висновками.
Рядок:

Це підключення бібліотеки "time" для затримок.
Далі йде встановлення режиму GPIO:

GPIO.setmode(GPIO.BCM)

Конфігурація висновків 5 та 13 як виходи:

GPIO.setup(13, GPIO.OUT)
GPIO.setup(5, GPIO.OUT)

Установка логічної одиниці на виведенні 13, встановлення логічного нуля на виведенні 5:

GPIO.output(13, True)
GPIO.output(5, False)

Затримка

Установка логічного нуля на виведенні 13, встановлення логічної одиниці на виведенні 5:

GPIO.output(13, False)
GPIO.output(5, True)

Перекладає всі висновки у вихідний стан та програма завершується. Т.о. можна керувати будь-якими вільними пінами по wifi і якщо зробити живлення 5В від акумулятора то вже можна зробити якогось автономного робота або пристрій не прив'язаний проводами до чогось або стаціонарного. Мова програмування Python (пітон) відрізняється від сі подібних мов, наприклад замість крапки з комою, для завершення команди, у пітоні використовується переклад рядка, замість фігурних дужок використовується відступ від лівого краю який робиться клавішею Tab. Загалом Python це дуже цікава мована якому виходить простий код, що легко читається. Після того, як робота (або гра) з Raspberry PI 3 закінчена можна його вимкнути командою

І після повного вимкнення прибрати харчування. При подачі живлення Raspberry PI 3 вмикається і з ним можна знову працювати (або грати). Замовити Raspberry pi 3 можна за посиланням http://ali.pub/91xb2. Про те, як робиться настройка Raspberry PI 3 і керування його пінами можна подивитися на відео:

Після успішного миготіння світлодіодами можна розпочати повномасштабне вивчення даного комп'ютерата створення проектів використовуючи можливості Raspberry PI 3 які обмежені лише вашою уявою!

Сьогодні четвертий урок, на якому ми попрацюємо з портами GPIO, зокрема миготуємо світлодіодом у різних режимах.

Урок орієнтований на користувачів-початківців і представлений у текстовому та відео-форматах.

Відео четвертого уроку:

Для уроку нам знадобиться:

  • плата Raspberry Pi;
  • кабель живлення;
  • USB-клавіатура;
  • USB-миша;
  • монітор або телевізор із HDMI/RCA/DVI інтерфейсом;
  • кабель, один кінець якого RCA або HDMI, а інший відповідає монітору;
  • SD-карта з уже встановленою ОС Raspbian();
  • світлодіод;
  • кнопка;
  • резистор на 220 Ом
  • 3 дроти «мама-тато»
  • 2 дроти «тато-тато».

Програмування Raspberry Pi GPIO мовою Python

Для сьогоднішнього уроку ми вибрали мову програмування Python.

Python - сучасна об'єктно-орієнтована мова. Він найчастіше використовується для програмування GPIO на Raspberry Pi. Python входить до складу операційної системи Raspbian.

Складання моделі

Для роботи нам потрібно зібрати таку схему:

Схема підключення світлодіода та кнопки до Raspberry Pi

Зверніть увагу, що порти GPIO на Raspberry Pi не підписані, корисно мати роздруковане розпинання.

Розпинання Raspberry Pi. Схема із ledgerlabs.us

Зібрана модель зі світлодіодом та кнопкою

Управління світлодіодом на Raspberry Pi з консолі

Заходимо в LXTerminal і набираємо:

Після цього замість імені користувача на початку рядка має відобразитися >>> .

Вводимо наступні рядки:

Import RPi.GPIO as GPIO #імпорт бібліотеки
GPIO.setmode(GPIO.BOARD) #"увімкнення" GPIO
GPIO.setup(7, GPIO.OUT) #оголошення 7-го піна як вихід

Потім для увімкнення світлодіода можна використовувати команду
GPIO.output(7, 1)

А для вимкнення
GPIO(output(7, 0)

Після роботи з GPIO бажано виконати команду
GPIO.cleanup()

Програма для миготіння світлодіодом на Raspberry Pi

Для автономної роботиСвітлодіод нам потрібно написати і запустити програму. Для цього відкриємо встановлену програму IDLE 3та в меню File натиснемо New. У вікні ми можемо писати програму.

Напишемо:
import RPi.GPIO as GPIO #імпорт бібліотеки для роботи з GPIO
import time #імпорт бібліотеки для очікування
GPIO.setmode(GPIO.BOARD) #"запуск" GPIO


____GPIO.output(7, 1) #ввімкнення світлодіода

____GPIO.output(7, 0) #вимкнення світлодіода
____time.sleep(1) #очікування 1 секунди

Збережемо програму в папці /home/pi.

Тепер ми можемо запустити програму з LXTerminal за допомогою команди
sudo python programname.py

Керування світлодіодом за допомогою кнопки

Покеруємо світлодіодом за допомогою зовнішньої кнопки: коли кнопка затиснута - світлодіод горить, коли віджата - не горить.

Для цього підключимо кнопку порту 5.

Для управління нам знадобиться така програма:

Import RPi.GPIO as GPIO #імпорт бібліотеки GPIO
GPIO.setmode(GPIO.BOARD) #"увімкнення GPIO"
GPIO.setup(7, GPIO.OUT) #оголошення порту 7 як вихід
GPIO.setup(3, GPIO.IN) #оголошення порту 3 як вхід
while True: #нескінченний цикл
____if GPIO.input(3) == False: #якщо кнопка затиснута
________GPIO.output(7, 1) #включаємо світлодіод
____else: #інакше
________GPIO.output(7, 0) #вимикаємо

Управління світлодіодом з клавіатури

Зробимо ще одну програму. Вона змінюватиме стан світлодіода при отриманні порожнього рядка і закінчуватиметься при отриманні іншого рядка.

Import RPi.GPIO як GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
while True:
____str = input("Enter - включення, інше - вихід");
____if str != "":
________break
____else:
________GPIO.output(7, 1)
____str = input("Enter - вимкнення, інше - вихід");
____if str != "":
________break
____else:
________GPIO.output(7, 0)
GPIO.cleanup()

На цьому четвертий урок Raspberry Pi для початківців закінчено, продовження слідує!

З точки зору зовнішніх інтерфейсів Raspberry Pi, як і інші невеликі одноплатні комп'ютери, не дуже відрізняється від звичайного настільного ПК. На платі RPi передбачені USB порти для підключення клавіатури та миші, порт HDMI для підключення дисплея. Однак, завдяки тому, що RPi значно компактніше і дешевше, ніж ПК, стає можливим використовувати їх у різних системахта додатках, де ПК або ноутбуки недоречні.

Нерідко виникає бажання підключити до ПК якісь нестандартні «речі». Можливо, наприклад, що ви захочете використовувати комп'ютер для вимірювання рівня яскравості та автоматичного керування освітленням, або для подачі звукового сигналу при виявленні порушника.

У більш широкому плані, мова йдепро бажання використовувати комп'ютер для управління електронними схемами (виходи) та отримання інформації від схем чи пристроїв (входи).

Саме тут проявляється очевидна перевага RPi та інших SBC, обумовлена ​​ключовою відмінністю між одноплатними комп'ютерами та ПК: одноплатні комп'ютери мають порти вводу/виводу загального призначення - те, чого немає у великих ПК (Малюнок 1).

Через ці висновки (штирьові роз'єми) RPi може взаємодіяти з електронним світом, що складається (крім іншого) датчиків, індикаторів і виконавчих механізмів.

У статті ми розглянемо приклади схем, які можна використовувати як є (або змінити і розширити), разом з прикладами коду кількома мовами програмування.

Роз'єм розширення Raspberry Pi

На малюнку 2 показано розташування та призначення висновків роз'єму розширення Raspberry Pi. Перші висновки подібних роз'ємів на друкованих платах, як правило, можуть бути ідентифіковані квадратним контактним майданчиком на нижньому шарі плати. На 40-контактний роз'єм розширення RPi виведено цифрові входи та виходи, сумісні з логічними рівнями 3.3 Ст.

Сумісність з логічними рівнями 3.3 означає, що RPi інтерпретуватиме вхідний рівень близький до 0 В як логічний «0», а рівень вище 2 В як логічну «1». Подача на вхід напруги вище 3.3 може вивести з ладу RPi. Відповідно, коли GPIO порт налаштований як вихід, RPi буде встановлювати на ньому напругу близьку до 0, або до 3.3.

У статті ми говоритимемо про висновки, зазначені на Малюнку 2 рожевим, білим, червоним та помаранчевим кольором. Інші порти використовуються послідовними інтерфейсами передачі.

Цифрові виходи RPi

Перші кроки: керування світлодіодом

Найпростіший приклад використання виходів - керування світлодіодом або лампочкою, або яким-небудь приводом або двигуном. Для перетворення вихідного сигналу RPi у щось, що керуватиме потрібним пристроєм, зазвичай потрібно електронна схема. Все, що необхідно для невеликого світлодіода – послідовний струмообмежувальний резистор, що захищає світлодіод та вихід RPi. Опір резистора вибирається з діапазону 100 Ом … 1 кОм, залежно від світлодіода, що використовується, і необхідної яскравості при установці на виході логічної «1».

Підключення світлодіода до контактів роз'єму GPIO за допомогою безпаєчної макетної плати показано на малюнку 3, а сама схема - на малюнку 4. З'єднання GND (0 В) було взято з виведення 6 роз'єму GPIO, для управління світлодіодом використовується порт GPIO22 (висновок 15). Можна використовувати будь-який порт GPIO, позначений рожевим кольором на мал. 2.

Після того, як виконані та перевірені всі з'єднання, можна приступати до написання коду або сценарію керування світлодіодом. Вибір мови залежить від вас. Один з прикладів популярною мовою Python міститься в (Листингу 1).

Лістинг 1. Приклад програми на Python для простого миготіння світлодіодом.


import time
import RPi.GPIO як GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, True)
time.sleep(3)
GPIO.cleanup()

Збережіть код у файлі з ім'ям led-test.py , а потім запустіть його, виконавши команду:

sudo python led-test.py

Інша програма (Лістинг 2) демонструє приклад керування світлодіодом. Світлодіод блимає 10 разів. (Примітка: у Python, на відміну від інших мов програмування, важливим є використання відступів у коді).

Лістинг 2. Вихідний код програми на Python (світлодіод блимає 10 разів).

# Світлодіод підключено до GPIO22 (контакт 15)
import time
import RPi.GPIO як GPIO
GPIO.setmode(GPIO.BCM)
for x in range(0,10):
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, True)
time.sleep(0.05)
GPIO.output(22, False)
time.sleep(0.45)

GPIO.cleanup()

Інший спосіб керування портами GPIO базується на використанні Shell-скрипту (сценарію оболонки). Цей метод здається трохи більш складним (якщо ви не любите писати скрипти), але він хороший просто для розширення кругозору, оскільки багато мов програмування часто дозволяють запускати командні скрипти, і в разі необхідності це може бути одним з швидких способівкерування портами GPIO з інших мов. Крім того, описаний в Лістингу 3 спосіб стандартний для різних платформ, тому ваш код може бути перенесений на інші плати.

Лістинг 3. Командний скрипт (Shell-скрипт) для керування світлодіодом, підключеним до GPIO22 Raspberry Pi.

#!/bin/sh
GPIO_PATH=/sys/class/gpio
LED_PIN=22 #GPIO 22 is pin 15
echo "$LED_PIN" > $GPIO_PATH/export
echo "out" > $GPIO_PATH/gpio$LED_PIN/direction
echo "1" > $GPIO_PATH/gpio$LED_PIN/value
sleep 1
echo "$LED_PIN" > $GPIO_PATH/unexport

Перший рядок скрипта виглядає як коментар, але він вказує оболонці Linux, що робити зі скриптом під час виконання, тому змінювати її не можна. Інші рядки скрипта використовуються для контролю відповідного порту GPIO, конфігурування його як виходу, установки на ньому високого рівня і виконання затримки на 1 с. В кінці порту звільняється, щоб дати можливість використовувати його в інших програмах.

Іншою поширеною мовою програмування, з якою ви можете зустрітися, є Сі або його старший брат Сі++. Приклади вихідного кодуна Сі або Сі++ будуть наведені далі, коли ми почнемо працювати з цифровими входами.

Генератор тональних сигналів

Більш цікавим прикладом може бути використання кількох портів GPIO для керування тональним генератором. RPi має роз'єм для підключення навушників, але часто для оповіщення про події (наприклад, для будильника) достатньо простого сигналу або серії сигналів різної тональності.

Принципова схема простого генератора звукових сигналів, виконаного на мікросхемі інтегрального таймера ICM7555, зображена на Малюнку 5. Вигляд конструкції, зібраної на макетній платі, показаний на Малюнку 6. Змінюючи номінали резистора та конденсатора, можна створювати різні тональні сигнали та звуки.

Управління генератором здійснюється за допомогою двох портів GPIO RPi. Один вихід (GPIO22) використовується для увімкнення або вимкнення звуку, а другий (GPIO27) - для перемикання між двома альтернативними частотами сигналу. За бажанням можна вибрати інші тони, змінивши номінали компонентів C1, R1 та R2.

Вихідний код програми на мові Python, що генерує кілька звукових ефектів, наведено в Лістингу 4. Збережіть код у файлі з ім'ям tone-test.py і потім запустіть виконання командою

sudo python tone-test.py.

Лістинг 4. Програма керування генератором звукових сигналів.

import time
import RPi.GPIO як GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(22, GPIO.OUT) # Увімкнути/Вимкнути генератор
GPIO.setup(27, GPIO.OUT) # Зміна тональності

GPIO.output(22, True)
for x in range(0,5):
GPIO.output(27, True)
time.sleep(0.1)
GPIO.output(27, False)
time.sleep(0.2)
GPIO.output(22, False)
time.sleep(0.5)

For x in range(0,5):
GPIO.output(22, True)
time.sleep(0.1)
GPIO.output(22, False)
time.sleep(0.2)
GPIO.output(27, True)
time.sleep(0.2)

For x in range(0,5):
GPIO.output(22, True)
time.sleep(0.05)
GPIO.output(22, False)
time.sleep(0.05)

For x in range(0,10):
GPIO.output(22, True)
time.sleep(0.1)
GPIO.output(22, False)
time.sleep(0.1)
time.sleep(1)

GPIO.cleanup()

Зверніть увагу, що схема живиться напругою 3.3 (виведення 1 роз'єму GPIO). Використовуйте це джерело тільки в тому випадку, якщо впевнені, що схема не споживає значний струм. Шину живлення 3.3 можна навантажувати струмом до 50 мА. За потреби можна скористатися окремим регулятором напруги 5 - 3.3. В і підключити його до джерела живлення 5, доступному на виведенні 2 роз'єму GPIO.

Розглянуті вище схеми живляться низькою напругою та споживають невеликий струм, але іноді необхідно керувати досить потужними зовнішніми пристроями. Декілька типових способів вирішення подібних завдань описані нижче.

Підключення до 5-вольтових логічних пристроїв

Використання RPi для керування 5-вольтовими пристроями не потребуватиме жодних додаткових схем. Логічні входи пристрою з напругою живлення 5 В нормально функціонуватимуть з вихідними сигналами 3.3 портів RPi.

Малопотужні світлодіоди

Для малопотужних синіх та білих світлодіодів може знадобитися напруга вище 3.3 В. Найпростіше управляти одиничним світлодіодом за допомогою транзисторного ключа, що комутує струм шини 5 В (Малюнок 7). Опір резистора R1 розраховується виходячи з технічних характеристикконкретного світлодіода, транзистор - будь-який n-p-nтипу.

Потужні пристрої

Найпростішим і найпоширенішим способом управління потужними пристроями, що живляться від джерела змінного або постійного струму(але не від мережі) є використання реле з транзисторним ключем (Малюнок 8). Підійдуть практично будь-які n-p-n транзистори, зокрема, популярні BC547B, 2N3904 та BC549. При цьому, якщо зовнішній пристрій може працювати від 5 В, подати живлення на реле можна з виведення 2 гнізда GPIO. Але і в цьому випадку не слід забувати про струм споживання. В іншому випадку реле може бути підключено до зовнішнього джерела живлення з дотриманням запобіжних заходів, що виключають попадання зовнішньої напруги на RPi.

Пристрої з живленням від електромережі

Поводження з будь-якими схемами або пристроями, що безпосередньо управляють приладами, підключеними до мережі змінного струмувимагає особливої ​​обережності. Більшість із них просто не відповідає стандартам безпеки, незважаючи на те, що деякі виробники стверджують протилежне. Досить безпечний підхід у тому, щоб знайти готове рішення дистанційного керуванняавторитетного виробника, запропоноване авторитетним постачальником, в якому для керування пристроями, що живляться від мережі, використовуються інфрачервоні або бездротові технології. Наприклад, компанія Energenie пропонує мережні розетки з керуванням по радіоканалу в комплекті з невеликим модулем радіопередавача (Малюнок 9), що підключається безпосередньо до роз'єму GPIO плати RPi, а також приклади програм на Python.

Група реле, світлодіодів чи інших пристроїв

Для керування декількома світлодіодами, реле або іншими пристроями, які живляться від 12 В і споживають менше 200 мА, можна використовувати стародавню мікросхему ULN2803, що випускається більше 25 років. Мікросхема є набір з восьми ключів на основі транзистора Дарлінгтона. Один із варіантів підключення мікросхеми ULN2803 до RPi показаний на Рисунку 10.

Малопотужні двигуни постійного струму

Оптимальним рішенням для керування електродвигунами постійного струму за допомогою RPi є застосування спеціалізованих драйверів або плат розширення, до яких можна підключати крокові двигуни або кілька безщіткових двигунів.