Raspberry PI 3 и QT 5.8

Рабочая инструкция. На выполнение требуется примерно 30 часов


sudo apt-get update
sudo apt-get upgrade

sudo apt-get install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libudev-dev libicu-dev libsqlite3-dev libxslt1-dev libssl-dev libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev gstreamer-tools gstreamer0.10-plugins-good gstreamer0.10-plugins-bad libraspberrypi-dev libpulse-dev libx11-dev libglib2.0-dev libcups2-dev freetds-dev libsqlite0-dev libpq-dev libiodbc2-dev libmysqlclient-dev firebird-dev libpng12-dev libjpeg9-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxi-dev libdrm-dev libssl-dev

sudo apt-get install libxcb-xinerama0-dev

Install libpng16-16! Default libpng is too old.

mkdir ~/opt
cd ~/opt

git clone git://code.qt.io/qt/qt5.git

cd qt5

./init-repository

./configure -v -opengl es2 -device linux-rasp-pi-g''+ -device-option CROSS_COMPILE=/usr/bin/ -opensource -confirm-license -optimized-qmake -reduce-exports -release -qt-pcre -qt-libpng -make libs -prefix /usr/local/qt5 &> output

make -j4 &> output_make

sudo make install &> output_make_install

pi@raspberrypi:~ $ cat >> .bashrc
export LD_LIBRARY_PATH=/usr/local/qt5/lib/
export PATH=/usr/local/qt5/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
pi@raspberrypi:~ $ source .bashrc

NRF24LE1 и NRF24LU1. Часть 2

Тут по идее должны быть записи о том, как я успешно боролся с контроллером, пытаясь заставить его работать так, как мне надо.

Но все оказалось проще.

Во-первых, бравые норвежцы слишком перемудрились и сделали так, что все операции ввода-вывода через USB делаются специальным чипом. В принципе, в этом нет ничего плохого, за исключением того, что они позабыли дать доступ к идентификаторам USB напрямую. В итоге фиг вы чего сделаете без драйверов, и заставить LU1 представляться COM портом не получится.

А во-вторых, “the USB chip that these kits use is obsoleted from the supplier, and doesn’t have a driver for 64-bit Windows 7.”, а так же для всяких OS X и прочего.

И наконец, я решил посмотреть в последний SDK (20 апреля 2012 года) и найти там примеры работы с беспроводной частью. Нашел, скомпилировал (если чего, искать в gazel_examples). Там все просто – на “девайсе” что-то суют в P0, а на “хосте” это что-то вылазит оттуда. Очень удобно – на дивайс посадил щуп от генератора, а на хосте смотришь, когда сигналы перестанут приходить.

Условия у меня очень тяжелые.

Screenshot_2015-01-14-12-54-39

И это еще не все сетки, ибо пока я обжимаю телефон для снятия скриншота, наиболее дохлые исчезают. WiFi адаптер tp-link, который воткнут в “малинку”, имеет миниатюрную антенну, но тем не менее честно сообщает о наличии 38 сетей.

Итак, результаты. Результаты хреновые.
1) В пределах комнаты – на троечку. То есть если “дивайс” находится в центре комнаты, то еще нормально. Но если “дивайс” в одном углу комнаты, а “хост” – в другом, то уже идут потери “пакетов”.
2) В пределах квартиры – уверенная двойка. То есть обычная, не капитальная стенка – уже плохо. Две – не видят друг друга.
3) На открытом пространстве (у меня за окнами лес) – метров 30 берет.

Все вышеперечисленное ставит жирный крест на использовании данных контроллеров для меня. Буду использовать другие 🙂

NRF24LE1 и Raspberry Pi. Часть 1

В принципе, этот пост просто перепись моих исследований, ибо в русскоязычном сегменте сети есть только одна, много раз скопированная статья MaxMS (http://habrahabr.ru/post/210974/). В принципе, я довольно много подчерпнул оттуда.

Итак, у меня есть контроллеры на данном чипсете и есть желание сделать с ними что-либо полезное. Но прежде “деланья” чего-либо полезного, надо этот контроллер запрограммировать. Вместе с контроллером ко мне попал “официальный” программатор, но чего с ним можно делать, я даже не разбирался, потому что неспортивно.

Для начала я определил, какая именно версия nrf у меня.

Screen Shot 2015-01-13 at 12.26.57

Судя по плате (плюс я глазами пересчитал выводы), у меня 32х пиновая версия.

А значит, из этой таблички берем среднее

aadd6daf8ee7e68f19eac9fbc8471494

Теперь как программировать. Из той же статьи наиболее приемлемым для меня оказался вариант с Raspberry Pi. Во-первых, у него везде 3,3 вольта, а во вторых, из него легко получается мобильный комплекс – воткнул wifi и питание и все, комп для прошивки готов.

Результатом стал следующий ужас

IMG_0261

Для памяти
RESET и VDD – на 3,3
GND – на землю
FCSN – 24я ножка CE0
PROG – 18я ножка GPIO24
Остальное согласно SPI на малинке. MISO-MISO, MOSI-MOSI и так далее

Затем выкачиваю с гитхаба https://github.com/derekstavis/nrf24le1-libbcm2835 программатор и собираю его

Первая проверка в виде попытки прочитать nvram выдала одни нули. Сначала я подумал, что либо контроллер дохлый, либо что-то не так подключил или какой-нибудь модуль не догрузил (Raspberry в этом отношении очень капризный), но попытка прочитать программу удалась

# ./nrf24le1 read firmware
[nrf24le1] nrf24le1_init: Initializing nRF24LE1

Initiate programming
Number of bytes to read: 16384, max flash size 16384
[nrf24le1] uhet_read: read addr: 0x0xbeae07dd, pack header: 0x3 0x0 0x0, bytes read: 16384
:2000000002024D41808B004180890142808D0000458084345678901200E4FDFCC3ED9FECA4
:200020009E501D908055E4F0A3746CF090805574FFF5F011F645F070F30DBD00010C80DC7A
:2000400022E490808AF0A3F022FFFFA10BC291914FE4FF914FD2912280E7FF0208EA80E17B
:20006000FFFFFF020CEABB010689828A83E0225002E722BBFE02E32289828A83E49322BB28
:20008000010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E51A
:2000A0008229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322F8BB92
:2000C000010DE58229F582E5833AF583E8F0225006E92582C8F622BBFE05E92582C8F22207
:2000E000C5F0F8A3E028F0C5F0F8E582158270021583E038F022A3F8E0C5F025F0F0E5823D
.....

Внутри что-то записано и это что-то не очень похоже на мусор. Но для меня это мусор, ибо я не в курсе, что там записано и для чего.

Теперь надо проверить, что прошивка работает. Читаем в test текущую фирмварь

./nrf24le1 read firmware test

Любым редактором ее портим, но по-своему (я просто записал посрединке немного байтиков со значениями 0х01-0х20) и заливаем назад и пофиг, что работать не будет.

./nrf24le1 write firmware test

И тут же читаем назад, но в другой фаил.

./nrf24le1 read firmware test1

А теперь ищем в test1 наши правки. Если они есть – значит “программатор” работает. У меня все заработало. Теперь можно и свою программу написать 🙂

Посмотрел на официальный SDK, покривился, забрал “правленный”, взял пример с дерганьем порта p0.0

#include <stdint.h>
#include <stdio.h>

//подключение необходимых функций:

#include "src/gpio/src/gpio_pin_configure.c"
#include "src/gpio/src/gpio_pin_val_clear.c"
#include "src/gpio/src/gpio_pin_val_set.c"

#include "delay.h"
#include "src/delay/src/delay_us.c"
#include "src/delay/src/delay_s.c"
#include "src/delay/src/delay_ms.c"

void main()
{
// мигаем портом P0_0
gpio_pin_configure(GPIO_PIN_ID_P0_0, // укажем необходимые параметры
GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT |
GPIO_PIN_CONFIG_OPTION_OUTPUT_VAL_CLEAR |
GPIO_PIN_CONFIG_OPTION_PIN_MODE_OUTPUT_BUFFER_NORMAL_DRIVE_STRENGTH);

while(1)
{
gpio_pin_val_set(GPIO_PIN_ID_P0_0); //установка 1
delay_ms(500);
gpio_pin_val_clear(GPIO_PIN_ID_P0_0); //установка 0
delay_ms(500);

}

}

Пытаемся скомпилировать

# sdcc -Iinclude led_main.c
# ls -l
total 312
drwxr-xr-x 2 root root 4096 Jan 30 2014 include
-rw-r--r-- 1 root root 29083 Jan 13 13:14 led_main.asm
-rw-r--r-- 1 root root 850 Jan 13 13:13 led_main.c
-rw-r--r-- 1 root root 2382 Jan 13 13:14 led_main.ihx
-rw-r--r-- 1 root root 248 Jan 13 13:14 led_main.lk
-rw-r--r-- 1 root root 80283 Jan 13 13:14 led_main.lst
-rw-r--r-- 1 root root 26676 Jan 13 13:14 led_main.map
-rw-r--r-- 1 root root 1129 Jan 13 13:14 led_main.mem
-rw-r--r-- 1 root root 14900 Jan 13 13:14 led_main.rel
-rw-r--r-- 1 root root 80283 Jan 13 13:14 led_main.rst
-rw-r--r-- 1 root root 48610 Jan 13 13:14 led_main.sym
-rw-rw-rw- 1 root root 3087 Jan 31 2014 libs.h
drwxr-xr-x 22 root root 4096 Jan 30 2014 src

Судя по содержимому, мне нужно залить lem_main.ihx. Только формат ему поменять. Заодно и выкачиваю hex2bin (http://hex2bin.sourceforge.net)

# ./hex2bin -p 00 led_main.ihx
hex2bin v1.0.12, Copyright (C) 2012 Jacques Pelletier & contributors

Lowest address = 00000000
Highest address = 000003C2
Pad Byte = 0
8-bit Checksum = FB

Ну теперь полученный led_main.bin можно залить в контроллер.

# ./nrf24le1 write firmware led_main.bin

А теперь посмотрим осциллографом на вывод P0.0

500_500

Как видим, все согласно программе: 500мс включено и 500мс выключено.

Как говорится, ура. Обязательная программа для любого микроконтроллера работает как надо.

Но вообще-то у меня немного другая задача: связать два микроконтроллера между собой по радиоканалу и оценить, насколько он работоспособен в условиях обычной многоэтажки, где диапазон 2,4ГГц забит напрочь и намертво WiFi.

Но это тема следующего поста. Или даже через одного 🙂

Микроконтроллеры или компьютеры?

Первое, что приходит в голову любому, кто желает добавить в автомобиль какого-либо функционала – это добавить в машину немного компьютера. Вещь привычная, как работать понятно, а с мониторчиком и клавиатурой разобраться тоже особых проблем не вызывает.

Собрать стандартную схему “музыку играем, навигатор показываем, в интернет ходим” достаточно легко. Обычный CarPC обходится примерно в 15-20 тысяч рублей и по своему функционалу не напрягаясь переплевывает то, что производители машин предлагают автолюбителям.

Но в этой простоте скрывается много подводных камней. Начиная от проблем с запуском в морозы и заканчивая проблемами с минимальными расширениями типа парктроников, датчиков давления и прочему. Подтверждением тому является много тем на соответствующих форумах.

С другой стороны, микроконтроллеры совершенно не имеют проблем с кнопками, индикаторами и датчиками. А на морозы большинству вообще чихать. Но одновременно они имеют дикие проблемы с высокоуровневым железом типа интернет-свистков или дисплеев. И почему-то обладают налетом этакой элитарности, дескать что бы что-либо на них сделать, надо очень сильно дружить в паяльником и  обладать как минимум кандидатской в области электроники.

Вот, к примеру, моя первая хотелка: обычные маленькие часики в машину. Давайте прикинем, как можно их сделать.

Берем 4 индикатора для циферок и двоеточие для мигания секунд. Берем самое простое, а значит у каждого индикатора 7 ножек (по числу светящихся сегментов), итого 28 ножек. Еще по ножке для “двоеточия” и питания. Итого 30 ножек. Ладно, я знаю как упростить схему до 13 ножек (знание будущего, так сказать).

И? Куда такое количество ножек втыкать в компьютер? Значит надо сидеть придумывать и разрабатывать свою плату расширения.

А затем? Представляете, что будет твориться в компе? “так, надо проиграть следующие 5 секунд музыки, зажечь вон тот индикатор, а вон тот погасить, а там кнопку не нажали? так, надо снова зажечь индикатор, оп-па, GPS чего-то хочет нам рассказать” … Ничего не напоминает? Правильно, мысли новичка за рулем, когда мозг одновременно решает, насколько надо повернуть руль, какую педаль нажать и попытаться вспомнить пункт правил, регламентирующий разъезд на нерегулируемом перекрестке. В большинстве случаев спасает то, что компьютеры все-таки умеют делать это быстро и не свихнувшись при этом.

Но для микроконтроллера задачи позажигать индикторы вообще не стоит. У навороченных контроллеров число ножек для подобных целей измеряется десятками. А с платами расширения их число может легко измеряться сотнями. Зато задачи типа “проиграть mp3” или “показать пользователю картинку” в рамках одного контроллера не решаются никак. Для каждого действия вне установленных рамок требуется свой, отдельный микроконтроллер. В итоге музыку играет один контроллер, голоса типа “поверните налево” обеспечивает второй, а картинки рисует вообще третьий. А все это между собой связано какой-нибудь хитрой шиной … В общем, ужас. И этот ужас старательно поддерживается всеми, кто кормится с этой отрасли. А пользователи недоумевают: как же так, навигатор за 5 тысяч круче и навороченней встроенного в машину, за который отдали 100?

В итоге в реальности нет никакого противостояния между контроллерами и компьютерами. Как и опытный водитель просто не думает, какую педаль и насколько надо нажать, что бы машина поехала или остановилась. Как у него и не возникает мысли вроде “куда и насколько надо повернуть руль, что бы машина повернула?”

Так же поступлю и я. Все тупые задачи будет отрабатывать микроконтроллер. Показать часики, проверить, нажата ли кнопка или замерить напряжение в бортовой сети – все его задачи.

А вот узнать положение машины по GPS, распознать код ошибки или сходить в интернет – этими задачами пусть занимается компьютер.

Мир, дружба и жевачка в одном флаконе.