пʼятниця, 22 січня 2016 р.

Запуск графічних програм на Beaglebone Green

Beaglebone Green (BBG) - спрощений варіант Beaglebone Black (BBB), особливістю якого є відсутність HDMI конектора, окремого роз'єму живлення та наявність двох groove конекторів (SPI та UART2) для легкого підключення периферії.

Відсутність HDMI означає відсутність Xorg сервера, адже Xorg може працювати лише за наявності графічної карти. Хоча і існує проект Xdummy, який запускає Xorg з драйвером віртуальної відеокарти, є й інші методи запуску графічних програм на BBG. Одна з них xvfb - X virtual frame buffer - програма, яка створює в пам'яті образ дисплею і дозволяє графічним програмам здійснювати вивід на нього. Робота з xvfb дозволяє підключати до нього x11vnc і керувати таким віртуальним середовищем по мережі. Цей підхід покроково описаний в статті:

http://www.richud.com/wiki/Ubuntu_Fluxbox_GUI_with_x11vnc_and_Xvfb

Але навіщо такі складнощі? Адже в базовій конфігурації BBG укомплектований програмою xtightvncserver та ще й з налаштованим мереджером вікон openbox. Все, що нам залишається, налаштувати автозапуск xtightvnc і перевірити його роботу. Інструкція по запуску і налаштуванню xtightvnc можна знайти в інтернеті. Є приклад налаштування старих (SysV init) систем та сучасних (systemd) дистрибутивів:

http://www.penguintutor.com/raspberrypi/tightvnc-sysv

http://www.penguintutor.com/raspberrypi/tightvnc

https://www.digitalocean.com/community/tutorials/how-to-set-up-vnc-server-on-debian-8

Отже, я спробую покроково розповісти, як це робив я на BBG.
1 Крок: Встановлюємо  xtightvncserver (насправді він вже встановлений, тож просто переконуємося, що він дійсно є):

$ sudo apt-get install xtightvncserver

2 Крок: Запускаємо vncserver. При першому запуску програма запитає пароль для доступу і його підтвердження. В подальшому використовуватиме цей збережений пароль:

$ vncserver

3 Крок: Підключаємося до нього за допомогою vncviewer-а з іншого комп'ютера. Вводимо пароль і насолоджуємося сесією openbox на BBG. IP-адресу слід змінити на потрібну у нашому середовищі. :1 означає підключитися до 1 екрану на порт 5901:

$ vncviewer 192.168.0.26:1

Тепер спробуємо поставити vncserver в автозапуск системи.

1 Крок: Зупиняємо сервер:

$ vncserver -kill :1

2 Крок: створюємо скрипт для запуску/перезапуску та зупинки сервера і робимо його виконуваним:

$ sudo nano /usr/local/bin/vncserver

В цьому файлі формуємо скрипт керування сервісом:

#!/bin/bash
PATH="$PATH:/usr/bin/"
DISPLAY="1"
DEPTH="16"
GEOMETRY="1024x768"
OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

case "$1" in
start)
/usr/bin/vncserver ${OPTIONS}
;;

stop)
/usr/bin/vncserver -kill :${DISPLAY}
;;

restart)
$0 stop
$0 start
;;
esac
exit 0




Далі надаємо права:


$ chmod +x /usr/local/bin/vncserver 

3 Крок: на основі скрипта /usr/local/bin/vncserver створюємо сервіс і ставимо його в автозапуск systemd:

$ sudo nano /lib/systemd/system/vncserver.service

Сервіс запускаємо від імені користувача debian BBG з можливістю перезапуску при аварії. Тому у файл налаштування прописуємо таке:

[Unit]
Description=Manage VNC Server on this droplet

[Service]
Type=forking
ExecStart=/usr/local/bin/vncserver start
ExecStop=/usr/local/bin/vncserver stop
ExecReload=/usr/local/bin/vncserver restart
User=debian

Restart=on-failure

[Install]
WantedBy=multi-user.target 
 
 


Перезапускаємо systemd і активуємо наш сервіс:

$ sudo systemctl daemon-reload

$ sudo systemctl enable vncserver.service

З точки зору безпеки варто обмежити доступ до BBG ззовні і використовувати SSH-тунелювання. Для цього у файлі /usr/local/bin/vncserver парметр OPTIONS слід доповнити обмеженням -local. Ось так:

OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY} -localhost"

Після цього підключитися ззовні неможливо. Слід створювати SSH-тунель або застосовувати реверсне з'єднання (його теж бажано робити через SSH-тунель). Для створення реверсних з'єднань існує утиліта vncconnect:

$ vncconnect -display :1 yourhost.yourdomailn

Тоді, якщо на віддаленій машині запущений vncviewer в режимі очікування з'єднання, відбудеться реверсне підключення від BBG до віддаленої машини, з якої можна буде керувати BBG. Ось так запускаємо на віддаленому комп'ютері переглядач:

$ ssvncviewer -listen

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

четвер, 21 січня 2016 р.

Оновлення прошивки на Esp8266

Оновлення прошивки на модулях Esp8266 доволі простий процес. Для цього слід перевести модуль в режим завантаження прошивки (підключити вихід GPIO0 на GND) і включити  живлення.

Оновлення здійснюється за допомогою інструмента esptool.py. Він створюється при компіляції esp-open-sdk в окремій папці esptool. Правда при спробі встановити esptool в системі згідно README мені видало помилку про відсутність модуля setuptools для Python. Ну, що ж встановимо його:

sudo apt-get install python-setuptools

Далі запускаємо інсталяцію esptool.py в систему, щоб він був доступний звідусіль. З каталога esp-open-sdk/esptool:

python setup.py install

Далі шукаємо необхідні прошивки в каталозі esp-open-sdk/sdk/bin/at/noboot/:
eagle.flash.bin та eagle.irom0text.bin. Але незрозуміло одне: куди який файл заливати?

І тут на допомогу приходить великий Гугль та "kacang bawang" з його статейкою: http://kacangbawang.com/latest-at-firmware-for-esp8266-with-512k-flash/

З неї визначаємо оптимальну команду для прошивки цих двох файлів:

esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash 0x40000 eagle.irom0text.bin 0x00000 eagle.flash.bin

Чекаємо кілька секунд і... вуаля! У нас найновіша прошивочка. Перемикаємо модуль в режим бойової роботи і перевіряємо функціональність.

AT+GMR
AT version:0.50.0.0(Sep 18 2015 20:55:38)
SDK version:1.4.0
compile time:Sep 18 2015 21:32:07

Оце й давно я скомпілював прошивку! Просто не мав змоги її перевірити раніше. Можна, мабуть, вже й оновитися.

Я упустив процес компіляції esp-open-sdk. При нагоді опишу. Але для тих, хто цікавиться, ось ресурс, згідно якого як це робив:

http://www.esp8266.com/wiki/doku.php?id=setup-linux-compiler-esp8266

А ще краще дивитися на ресурсі розробника:

https://github.com/pfalcon/esp-open-sdk

середа, 20 січня 2016 р.

WIFI сервер на ESP8266 за допомогою AT-команд


Мабуть, найдешевший з існуючих на сьгодні WIFI модулів - на базі ESP8266. Варіантів виконання його є багато, і всі вони відрізняються кількістю зовнішніх портів вводу/виводу, об'ємом пам'яті та наявністю додаткового спів-мікроконтролера (саме так, є й такі варіанти, наприклад ESP-14).
Можливості цих модулів достатньо широкі. Вони можуть працювати в режимі робочої станції, точки доступу і навіть(!) в комбінованому режимі. Існують цілі SDK та IDE для написання своїх прошивок. 
Хочу поділитися своїм досвідом перших експериментів з модулем ESP-12Q. Модуль живиться від 3.3В (5В подавати не можна). Так само не можна подавати 5В на вхідні ніжки. Підключення до комп'ютера здійснюється за допомогою перетворювача USB/UART-TTL з можливістю видавати сигнали з рівнями 3.3В. Ніжки GPIO15 та GND підключаються на GND живлення, a GPIO0, GPIO2, EN (CH_PD) та VCC на +3.3В. Сигнальні ніжки бажано підключати через опори по 1..10k, але в крайньому разі можна обійтися і без них.

Заводська прошивка дозволяє працювати з ESP-12Q як зі звичайним модемом за допомогою АТ-команд. Примусити цей невеличкий модуль виступати в ролі сервера не так вже й важко. Для цього в терміналі (я використовую minicom) вводимо такі команди:

AT+CWSAP_DEF="ESP12Q","1234567890",5,3
AT+CWDHCP=0,1
AT+CWMODE_DEF=2
AT+CIPMUX=1
AT+CIPSERVER=1

Перша команда налаштовує параметри точки доступу SSID мережі, пароль, номер WIFI-каналу, та тип шифрування.
Друга команда активує DHCP сервер на точці доступу.
Третя команда переводить модуль в режим чистої точки доступу SoftAP.
Наступна команда перемикає в режим мультипотокової взаємодії (ця опція обов'язкова для режиму сервера)
Остання команда нарешті запускає модуль в режимі сервера, який дозволяє підключатися до нього за допомогою telnet або інших програм.

Після цих налаштувань в переліку доступних WIFI мереж буде видно ESP12Q. Пароль доступу до неї 1234567890. Як тільки підключилися до точки доступу, запускаємо telnet:

# telnet 192.168.4.1 333

По замовчуванню сервер використовує порт 333 для вхідних з'єднань, але його можна змінити в команді AT+CIPSERVER=1,[port].

Після підключення можна спокійно отримати повідомлення, набрані в telnet у вигляді:

+IPD,4,n:xxxxxxxxxx

Надіслати ж дані можна також за допомогою АТ-команди:

AT+CIPSEND=0,5
>HELLO

При експериментах стикнувся з тим, що minicom не сумісний по сигналах '\r\n'. Для виконання команди слід було натискати Enter, а потім Ctrl+Enter. Інакше відповідь була завжди ERROR.