По воздуху то будет работать, а в воду не засунете!
Лучшие сообщения pi
-
Подключение по HDMI_0
Купил я себе сей аппарат, но с ходу начались проблемы. Сначала думал вообще не исправный. Подключил малинку на первый порт HDMI_0 к телевизору - нет видеосигнала. Переставил систему на флешке, покопался в конфиге, задал сейфмоде, и усилил сигнал. После перезагрузки и включение в HDMI_1 порт телевизор малинку увидел. Но в разбиан под второй порт нельзя было выбрать HD разрешения. Покопавшись еще в конфиге смог таки задать нужное мне разрешение и частоту развертки, но вылезла другая проблема - проигрыватель VLC показывает только черный экран в полноэкранном режиме если шнур включен во второй порт HDMI_1. Переключился на первый HDMI_0, о чудо, все работает, но до первой перезагрузки, то есть телевизор работает от порта номер 0 если перегрузиться на первом и на горячую переключиться на нулевой. Если включить малинку сразу подключенную на нулевой HDMI то на телевизоре нет видеосигнала. Что же делать как же быть, куда копать?
-
RE: Ввод ключевого слова для выхода из цикла
@Sailwork#6598 Есть у кого какие-нибудь идеи реализации такого алгоритма
Да какие тут идеи?! Ситуация обсосанная тысячу раз. Без привязки к языку программирования:
- Создаём переменную, управляющую повторением цикла и присваиваем ей значение TRUE
- Создаём нить, которая висит на ожидании ввода с клавиатуры. По нажатию Enter проверяется, что введено. Если это команда остановки, то переменной цикла присваиваем FALSE и завершаем нить.
- Запускаем основной цикл, который крутится пока управляющая переменная TRUE
-
Обновление форума
Форум обновился.
Старые сообщения удалось перенести, но информация об авторах сообщений утеряна.
Поэтому у всех старых сообщений один и тот же автор -
Подключение DC электромоторов к Raspberry Pi через драйвер L298N
Если вы захотите собрать робота на колёсах, то столкнётесь с необходимостью изучения принципов работы управляющего электромоторами драйвера. Самый простой, недорогой и распространённый драйвер - L298N . Он может управлять скоростью и направлением вращения электромоторов
Управление DC электромоторами
Управление электромотором подразумевает под собой управление скоростью и направлением его вращения. Это достигается сочетанием двух методов:
ШИМ (широтно-импульсная модуляция) для управления скоростью вращения
H-Bridge - для управления направлением вращенияУправление скоростью вращения при помощи ШИМ
Скорость вращения мотора регулируется через изменение уровня подаваемого на него напряжения.
ШИМ это методика, суть которой состоит в том, что среднее значение напряжение на входе регулируется серией импульсов ВКЛ-ВЫКЛ, т.е быстрыми включениями и выключениями подачи напряжения питания к двигателю.
Средняя величина напряжения будет пропорциональна коэффициенту заполнения (ширине) импульса - чем больше коэффициент, тем выше напряжение, и наоборот.
Эта картинка иллюстрирует данную зависимость:
H-Bridge
Направление вращения регулируется сменой полярности входного напряжения. Стандартным способом реализации такой смены является H-Bridge
В электрической цепи (которая визуально напоминает букву Н) H-Bridge присутствуют 4 ключа с мотором в центре этой цепи.
Полярность входного напряжения на моторе будет зависить от того, какая пара ключей замыкает цепь в настоящий момент. Вот так это выглядит:
L298N - драйвер электромотора
Основой этого модуля является чёрный чип с радиатором. L298N является двухканальным драйвером, и следовательно может независимо управлять двумя электромоторами. Поэтому данный драйвер хорошо подходит для использования в двухколёсных роботах, поворот которых осуществляется за счёт разницы в скорости вращения правого и левого колеса.
Питание драйвера
Питание к L298N подаётся через трёхконтактный зажимной терминальный разъём (провода вставляются в разъём и зажимаются вращением винта на разъёме).
- 1 контакт Vs - питание, которое будет подаваться через драйвер на моторы;
- 2 контакт GND - земля;
- 3 контакт Vss - питание 5V для управляющего драйвером устройства, в качестве которого может выступать микроконтролер или Raspberry Pi)
L298N имеет также встроенный стабилизатор (78M05) напряжения до 5V. Когда установлен джампер, то этот стабилизатор работает и с контакта Vss можно снимать 5V 0.5А для питания управляющего драйвером устройства. Когда джампер снят, то стабилизатор выключен, а значит нам нужно питатьуправляющее драйвером устройство от независимого источника питания.
Использование джампера запрещено, при подаче на 1-ый контакт (Vs) напряжения, превышающего 12В. Это может привести к выходу из строя стабилизатора78M05 .
Если джампер установлен, то контакт Vss работает как выход . Подавать на него напряжение извне в этом случае запрещено
Падение напряжения на L298N
Падение напряжение на драйвере может достигать 2В, за счёт падения напряжения на транзисторах Н-Моста. Таким образом, при подаче на контакт Vs 12В до электромоторов дойдёт только 10В, а значит они не смогут выйти на максимум своих оборотов (естественно речь идёт о 12-ти вольтовых DC электромоторах). Таким образом напряжение, подаваемое на контакт Vss должно быть на 2V выше напряжения работы электромотора (14В для 12-ти вольтовых моторов, 7В для пятивольтовых соответственно)
Подключение DC электромоторов к драйверу
Электромоторы подключаются к зажимным контактам по краям платы.
Можно подключать электромоторы, рассчитанные на напряжение 5-35V. Максимальный ток от драйвера к каждому мотору - 2А (если источник питания драйвера умеет отдавать столько тока)Контакты контроля направления вращения
Используя контакты IN1-IN4, можно менять направление вращения электромоторов (различные уровни напряжения на этих контактах приводят к замыканию нужных пар ключей Н-Моста драйвера L298N) - по часовой стрелке или в обратном направлении.
Контакты IN1 IN2 управляют направлением вращение первого электоромотора (А), IN3 IN4 - второго электромотора (В) Направление вращения моторов зависит от того, какой уровень напряжения (высокий или низкий) подаётся на эти контакты.
Возможно 4 варианта:
- Низкий уровень напряжения на обоих контактах - мотор выключен
- Высокий уровень напряжения на обоих контактах - мотор выключен
- In1 высокий уровень, In2 низкий уровень - мотор вращается вперёд
- Ln1 низкий уровень, In 2 высокий уровень - мотор вращается назад
Контакты контроля скорости
Для управления скоростью вращения моторов используется контакты ENA (мотор А), ENB(мотор В)
Низкий уровень - мотор отключен, высокий уровень - мотор работает на максимальных оборотах, ШИМ - различная скорость вращения в зависимости от коэффициента заполнения импульсов. По умолчанию на этих контактах установлены джамперы, их следует снять, если вы хотите управлять оборотами.
Подключение L298N к Raspberry Pi
Теперь, когда мы хорошо знакомы с драйвером L298N, можно подключить к нему питание, моторы и Raspberry Pi
Raspberry Pi я запитал через 5V внешний аккумулятор PowerBank. Поскольку у меня не было аккумулятора на 12V драйвер L298N я запитал от того же внешнего аккумулятора, вставив в него повышающий DC/DC преобразователь
В следующей статье рассмотрим программирование двухколёсного робота с драйвером L298N
-
RE: Из Питера кто сможет помочь со сборкой малины? Не бесплатно
Как понять "сборка" малины? Блок питания воткнул - вся сборка.
Или вы работников ищите для сборки ягод в садах?
-
Использование Raspberry Pi как беспроводной точки доступа
Raspberry Pi внутри Ethernet сети может выступать как беспроводная точка доступа для беспроводных устройств.Существует два режима работы такой точки доступа - обычный и мост. В обычном режиме Raspberry Pi создаёт дополнительную сеть, которая изолирована от Ethernet сети. Схема сети для этого режима:
Если вам нужно раздать существующее Ethernet соединение беспроводным устройствам, то на Raspberry Pi нужно настраивать как точку доступа, работающую в режиме моста:
В этой статье сначала рассмотрим обычный режим, а потом мостПодготовка
Для настройки необходим администраторский (root) доступ к Raspberry Pi.
Подключите Raspberry Pi к Ethernet сети кабелем и загрузите его.
В этой статье предполагается, что сеть с IP адресами 10.10.0.0/24 основная, а Raspberry Pi управляет сетью для беспроводных клиентов 192.168.4.0/24
Также для тестирования точки доступа необходим клиент беспроводной сети(ноутбук, смартфон, и т.д)
Установка необходимого ПО
Чтобы Raspberry Pi мог работать как точка доступа необходимо установить пакет hostapd
sudo apt install hostapd
Активируйте службу беспроводной точки доступа и включите для неё автозапуск после загрузки:
sudo systemctl unmask hostapd sudo systemctl enable hostapd
Чтобы предоставить беспроводным клиентам службы управления сетью (DNS, DHCP) установите пакет dnsmasq
sudo apt install dnsmasq
Чтобы настройки файервола не сбрасывались после перезагрузки, установим пакет netfilter-persistent и плагин к нему iptables-persistent.
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
Установка ПО закончена и далее нам предстоит его настроить
Настройка маршрутизатора
Raspberry Pi поднимет отдельную одиночную беспроводную сеть и будет управлять ей. А также маршрутизировать трафик между клиентами беспроводной сети и клиентами основной Ethernet сети и роутером.
Для беспроводной сети на Raspberry Pi запущен DHCP сервер, для работы которого требуется присвоить беспроводному интерфейсу (wlan0) статический IP адрес
Присваиваем статический IP адрес (192.168.4.1) точке доступа:
sudo nano /etc/dhcpcd.conf
В конец файла добавьте следующие строки:
interface wlan0 static ip_address=192.168.4.1/24 nohook wpa_supplicant
Настройка маршрутизации и IP маскарадинга
В этом разделе рассмотрим вопрос доступа беспроводных устройств из вспомогательной сети, организованной Raspberry Pi, к компьютерам основной Ethernet-сети и интернету.Для включения маршрутизации добавим в конфиг /etc/sysctl.d/routed-ap.conf строку:
# Enable IPv4 routing net.ipv4.ip_forward=1
Активация маршрутизации откроет участникам сети 192.168.4.0/24 доступ к основной сети и доступ в Интернет через основной роутер. Raspberry Pi может подменять IP адреса участников беспроводной сети своим IP адресом в основной сети, используя правило "маскарада" в своём файерволе, чтобы разрешить сетевой трафик между участниками беспроводной сети и Интернетом без изменения настроек роутера.
Основной роутер будет воспринимать весь трафик от клиентов беспроводной сети, как трафик от Raspberry Pi
Весь входящий трафик будет поступать на Raspberry Pi и перенаправляться клиенту беспроводной сети
Добавляем новое правило в файервол Raspberry Pi:sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Сохраняем правило при помощи netfilter-persistent, чтобы оно не сбросилось при перезагрузке.
sudo netfilter-persistent save
Настройки файервола хранятся здесь - /etc/iptables/. Не забывайте использовать netfilter-persistent при внесении изменений в правила файервола.
Настройка DHCP и DNS для беспроводной сети
Службы DHCP и DNS предоставляются пакетом dnsmasq. В стандартном конфиге dnsmasq содержатся примеры всех возможных настроек, нам нужны только некоторые, поэтому проще создать конфиг с нуля. На всякий случай сохраняем старый конфиг и создаём новый с таким же именем:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo nano /etc/dnsmasq.conf
Прописываем настройки в конфиг:
interface=wlan0 # Listening interface dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h # Pool of IP addresses served via DHCP domain=wlan # Local wireless DNS domain address=/gw.wlan/192.168.4.1 # Alias for this router
Raspberry Pi будет выделять клиентам IP-адреса в диапазоне 192.168.4.2-192.168.4.20
Клиенты могут обращаться к RaspberryPi по доменному имени gw.wlan
В разных странах действуют свои телекоммуникационные правила и разрешённые для радиопередачи диапазоны. Операционная система Linux помогает пользователям выполнять эти правила
В операционной системе Raspberry Pi OS работа беспроводной сети в диапазоне 5GHz запрещена до тех пор, пока пользователь не внесёт в настройках двухбуквенный код страны (RU для России).
Настройка ПО
Чтобы убедиться, что работа Wi-Fi не заблокирована выполните команду
sudo rfkill unblock wlan
Далее создадим конфиг hostpad ( /etc/hostapd/hostapd.conf) и пропишем в него настройки:
country_code=RU interface=wlan0 ssid=NameOfNetwork hw_mode=g channel=7 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=AardvarkBadgerHedgehog wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
Обратите внимание, что имя сети (параметр ssid) и пароль (параметр wpa_passphrase) не должны содержать кавычек. Пароль должен иметь длину от 6 до 64 символов
Указание кода страны позволяет Raspberry Pi использовать для передачи данных разрешённые в этой стране частоты.
Чтобы использовать для передачи данных диапазон 5 GHz, нужно поменять параметр hw_mode=g на hw_mode=a. Возможные значения параметра hw_mode:
a = IEEE 802.11a (5 GHz) (доступно начиная с модели Raspberry Pi 3B+) b = IEEE 802.11b (2.4 GHz) g = IEEE 802.11b (2.4 GHz)
После смены режима hw_mode, возможно потребуется и смена номера канала (параметр channel)
Завершение
Теперь осталось только перезагрузиться.
В следующей статье рассмотрим организацию точки доступа на Raspberry Pi в режиме моста
-
RE: О реальном времени
Не совсем понятно, что есть «двухпортовая память».
Наверно разумно говорить: «память должна быть подключена к контроллеру и малине так что бы малине обеспечивался прямой доступ к памяти».
Но зачем?
В большинстве контроллеров есть достаточный объём встроенной памяти что бы организовать буфер для хранения данных пока они не будут переданы малине и достаточное быстродействие что бы успевать передавать накопленные данные через параллельный интерфейс.
То есть логика работы получается такая:
Контроллер в прерываниях обрабатывает события, вычисляет приход события с точностью до 1 одного своего такта, например, используя таймер, полученный результат записывает в буфер организованный в его памяти по принципу FIFO, а в моменты, когда прерываний нет отдаёт малине данные из буфера.
Если данные 8 бит, то потребуется всего 10 линий связи: 0...7=DATA, 8=RD, 9=READY.
Алгоритм передачи например такой:
Малина ставит лог1 на RD и ожидает на READY появление лог1, как только есть такое то считывает данные с линий DATA, сбрасывает RD в лог0 что является сигналом для контроллера перейти к следующей ячейке буфера, как только это сделано READY сбрасывается в лог0, далее процесс повторяется.
Если данных в буфере нет, то линия RD будет установлена в лог1 а линия READY так и будет с уровнем лог0, как только придёт первый же байт данных в буфер то READY будет установлена и данные будут считаны.Банальные AVR контроллеры обладают быстродействием под 16МГц и даже 20МГц, если и этого мало то можно применить STM32F103R8T6 а это 72МГц, то есть можно фиксировать события с точностью 1/72 000 000 секунды. Если и этого нехватает, то тогда да, потребуется применить DRAM и сделать всё на ПЛИС, тогда можно и 700МГц.
Возможно (зависит от задачи) есть вариант и более простого решения: зачем мучить малину, применять RAM, контроллеры, когда например событие происходит относительно редко — можно обойтись высокочастотным генератором и высокоскоростным счётчиком который засчёлкивается по событию и имеет некий интерфейс (I2C или SPI или параллельный) для считывания результата счёта, достаточно лишь будет по появлению события считывать результат с счетчика, сбрасывать его и далее пусть считает время до события хоть с точностью 1/5000 000 000 секунды (за это время электрический импульс в проводе успеет пробежать лишь 6 сантиметров). Подходящие счётчики можно найти в составе некоторых микросхем синтезаторов частоты.
Недавние сообщения pi
-
Raspberry Pi 5 16 Gb RAM
Первые версии Raspberry Pi 5, появившиеся осенью 2023 года, были представлены двумя модификациями - c 4 и 8Гб оперативной памяти. Летом 2024 года к ним добавилась модификация с 2Гб оперативной памяти.
Сегодня начинаются продажи модели Raspberry Pi 5 с 16Gb оперативной памяти,
официальная цена - 120$Трехкратный прирост производительности между Raspberry Pi 4 и Raspberry Pi 5 открывает возможности для таких приложений, как большие языковые модели и вычислительная гидродинамика, которые выигрывают от большего объема памяти на ядро. И хотя Raspberry Pi OS оптимизирована для низких базовых требований к памяти, тяжелые дистрибутивы, такие как Ubuntu, получают значительное преимущество от увеличенной емкости памяти при использовании в качестве настольной системы.
Появление 16Гб версии Raspberry Pi 5 стало возможным благодаря новой ревизии (D0) процессора Broadcom BCM2712, который теперь поддерживает работу с чипами оперативной памяти объёмом более 8Gb
-
Установка
Образ операционной системы для записи на SD-карту
https://updates.volumio.org/pi/volumio/3.785/Volumio-3.785-2024-12-16-pi.zipVolumio — это операционная система, созданная специально для воспроизведения музыки. Она:
- Поддерживает аудиофайлы высокого разрешения (FLAC, WAV, DSD и т. д.).
- Работает как медиасервер и аудиоплеер.
- Имеет удобный веб-интерфейс для управления (с любого устройства через браузер или приложение).
- Поддерживает стриминговые сервисы, такие как Spotify, TIDAL, Qobuz и интернет-радио.
- Легко интегрируется с аудиофильскими USB-ЦАПами (цифро-аналоговыми преобразователями) для максимального качества звука.
-
Raspberry Pi и умный дом
Многие пытаются собрать «Умный дом» своими руками. При выборе системы стоит учитывать не только ассортимент и стоимость конечных устройств, но и возможности контроллера.
Большинство контроллеров сразу готовы к работе «из коробки», но представляют ограниченные возможности. Однако нередко именно гибкость и возможность лёгкой интеграции является основополагающим критерием при выборе. И вот, появился долгожданный «кубик Lego» для систем автоматизации на базе технологии Z-Wave, который обладает желаемой гибкостью и в то же время большим функционалом и низкой ценой. Плата расширения RaZberry для Raspberry Pi, превращает самый популярный и дешёвый мини-компьютер в Z-Wave контроллер домашней автоматизации.
RaZberry — это решение три в одном:- плата с трансивером Z-Wave ZM3102
- прошивка для ZM3102, расширяющая возможности стандартных прошивок для стиков
- ПО Z-Way
Железо
В ОС Linux RaZberry виден как com-порт /dev/ttyAMA0. Плата по сути состоит из
- трансивера ZM3102,
- памяти EEPROM для хранения данных сети Z-Wave,
- PCBA антенны
- коннектора ножек UART для GPIO Raspberry Pi.
Реально используется только ножки Vcc, Gnd, TX и RX. Остальные ножки не используется для работы платы и лишь помогают её крепче зафиксировать. В теории эти ножки можно использовать для других нужд.
Прошивка
Плата предоставляет интерфейс полностью совместимый с Sigma Designs Serial API, что даёт возможность использовать не только прилагаемое ПО Z-Way, но и любое другое ПО для Z-Wave (Open Z-Wave, LinuxMCE, FHEM или самописное), а также облачный сервис Z-Cloud (см. инструкцию).
Плата также предоставляет расширение протокола Sigma Designs Serial API от Z-Wave.Me, которое необходимо для работы ПО Z-Way.
Прошивка также позволяет обновлять себя по UART, что позволит не только исправить возможные баги в будущем, но и сменить версию прошивки с той, что установлена по умолчанию (SDK 4.54.01) на более старую 5.03, не имеющую полезных функций NWI, Explorer Frame и Random HomeId, но включающую функционал SUC/SIS. (Для внимательных: да, я не ошибся, 4 > 5Программное обеспечение
Z-Way устанавливается поверх Raspbian wheezy путём запуска команды
wget ‐q ‐O ‐ http://razberry.z-wave.me/install | sudo bash
Скрипт установки
- поставит Z-Way в /opt/z-way-server
- пропишет в /etc/init.d/Z-Way скрипт для запуска,
- добавит его в авто запуск и настроит порт ttyAMA0.
После перезагрузки (для применения настроек ядра для ttyAMA0 — по умолчанию Raspbian использует UART для консоли) сервер готов к работе.
В браузере откройте http://IP_OF_RASPBERRY:8083 и начните строить сеть Z-Wave.
Рассмотрим подробней поставляемое в комплекте с RaZberry ПО Z-Way.
Оно состоит из нескольких частей:- библиотека libzway — основа движка Z-Wave, предоставляющая C API для простой работы с Z-Wave (зависит от pthreads, zlib, openssl)
- библиотека libzwayjs — биндинг между C и JavaScript движком Google V8. Предоставляет простое JS API для работы с сетью Z-Wave (зависит от libv8 и libzway)
- библиотека libzwayhttp — HTTP сервис для обслуживания внешних клиентов, в том числе пользовательские интерфейсы. Предоставляет JSON API (зависит от libmicrohttpd, openssl, libzwayjs и libzway)
- main.cpp — обвязка для запуска всех сервисов вместе, чтения конфигов и параметров командной строки
Такая структура позволяет использовать разные уровни интеграции с составными частями Z-Way.
Для проектов, где важна производительность, доступен API уровня C (в комплекте есть заголовочные .h файлы для libzway), для проектов, где нужна оперативная разработка, проще использовать JS API.
Важно, что оба интерфейса имеют сходную структуру, что позволяет просто портировать код с JavaScript на C после быстрого прототипирования.Далее я опишу API уровня JavaScript и покажу, как создавать простые правила автоматизации. Интерфейс уровня C останется за рамками данной статьи.
Стоит заметить, что синтаксис в движке JavaScript Z-Way на стороне сервера сделан по аналогии с тем, что было реализовано для Z-Cloud на стороне клиента — см. описание API Z-Cloud.
Для дальнейшего чтива предполагается, что читатель уже знаком с особенностями протокола Z-Wave (см.подробное описание протокола Z-Wave).
Всё относящееся к Z-Wave в пространстве имён JavaScript находится в глобальном объекте zway, который предоставляет полное дерево данных и методов над устройствами Z-Wave.
Дочерний объект controller, содержит данные специфические для контроллера Z-Wave, а также список устройств devices.
Каждое устройство содержит структуру данных (data), а также список каналов устройства (instances).
Каждый канал имеет список Классов Команд Z-Wave, поддерживаемых устройством. На Классе Команд имеются методы для вызова функций (Set, Get, ...), а также дерево данных (data), где хранится вся информация о Классе.
Графически это можно иллюстрировать примерно так (картинка из документации):
Структура API асинхронна и делится на две части:
- отправка команд и запросов
- получение событий изменения состояний
Отправка команд осуществляется запросами вида
zway.devices[2].instances[0].commandClasses.Basic.Set(0)
(этот пример выключит свет).
Функция .Get() отправит запрос значения устройству.zway.devices[2].RequestNodeNeighbourUpdate() попросит устройство обновить соседей, а командаzway.AddNodeToNetwork(1) запустит процесс добавления нового устройства к сети.
Более подробно все команды описаны в документации на странице документации проекта RaZberry.
Каждому запросу можно добавить два дополнительных параметра: callback-функции для успешной и неудачной отправки.
Команды ставят в очередь на отправку соответствующие пакеты. Отправка осуществляется через Sigma Designs Serial API, реализованную на плате расширения RaZberry. Вся магия Z-Wave скрыта под этим уровнем абстракции: для устройств на батарейках эти пакеты помечаются как ожидающие пробуждения, для шифрования идёт предварительный обмен ключами, для экономии заряда батареек и времени в эфире некоторые пакеты стыкуются вместе и многое другое…
Как и в любом протоколе, в Z-Wave много своих тараканов, которые все находятся под ковром API Z-Way и не вылезают оттуда.
Все полученные от устройств данные записываются в дерево data, относящееся к устройству или Классу Команд.
Каждый элемент дерева data имеет атрибуты value (значение элемента), updateTime и invalidateTime (timestamp дат обновления и устаревания значения), name (имя). Структура дерева тоже подробно описана в документации.
Для получения уведомлений об изменении значений дерева существует система подписок на события. Функция bind для каждого элемента дерева позволяет привязать callback функцию к изменению данных.
zway.devices[2].instances[0].commandClasses.Basic.data.level.bind(function (type[, arg]) {}, [arg, [watchChildren=false]]);Опциональный аргумент arg, передаваемый bind будет передан в callback функцию и пригодится для передачи дополнительных параметров для разделения разных событий, имеющих общий callback-обработчик. Параметр watchChildren (true или false) позволяет отслеживать не только изменения данного элемента дерева, но и дочерних. Объект this в callback функции — это элемент дерева data, на котором запускается bind: this.value — значение, this.updateTime — дата последнего обовления и т.д. Аргумент type содержит битовую маску типа изменения (изменён, обновлён, удалён, устарел,… — подробно все значения описаны в ZDefsPublic.h, который входит в комплект ПО).Аналогично есть функция bind на глобальном объекте zway, которая позволяет отслеживать изменения в массивах devices, instances и commandClasses:zway.bind(function(type, nodeId, instanceId, commandClassId) {}, [mask = 0xffff])Аргумент type указывает на характер изменения (добавлено/удалено устройство/канал/класс команд или сохранён файл с деревом данных на диск (ZDDX-файл). Триплет nodeId, instanceId, commandClassId указывает на изенённый объект.Отписаться от событий можно функцией unbind.Для упрощения синтаксиса можно опускать слова commandClasses, instances[0] (именно нулевой канал!), .value(level == 0 аналогично level.value == 0, но при JSON-сериализации без .value будет сериализован весь элемент дерева с его атрибутами, а только значение).
Стоит обратить внимание, что глобальный объект zway является нативным в v8, т.е. это не обычный JavaScript объект: у него можно лишь менять данные элементов дерева. Все остальные изменения в дереве игнорируются.Приведём несколько примеров:Запуск shell-команд при получении контроллером событий Basic Set от других устройств сети (например, выключатель ассоциирован с контроллером с каналом 1 при помощи MultiChannelAssociation)var instanceId = 1; var ctrlNodeId = zway.controller.data.nodeId.value; // Get controler Node Id if (zway.devices[ctrlNodeId] && zway.devices[ctrlNodeId].instances[instanceId]) { // Check that instance object exists var basicCC = zway.devices[ctrlNodeId].instances[instanceId].Basic; if (basicCC) { // check that Basic exists basicCC.data.level.bind(function() { // bind to Basic level value system("echo " + this.value); }); } }
Автоматическое отключение диммера света через 10 секунд после включения (для реле используйте SwitchBinary вместо SwitchMultilevel). (Здесь предполагается, что устройство умеет отправлять отчёты и ассоциировано с контроллером)
var nodeId = 2; var instanceId = 0; var _tmr = null zway.devices[nodeId].instances[instanceId].SwitchMultilevel.data.level.bind(function() { var node = args[0]; var instance = args[1]; if (_tmr) { clearTimeout(_tmr); } _tmr = null; if (this.value > 0) { _tmr = setTimeout(function () { zway.devices[nodeId].instances[instanceId].SwitchMultilevel.Set(0); _tmr = null; }, 10*1000); } });
тут стоит обратить внимание, что для запуска данного кода несколько раз нужно вводить массив _tmr для каждого устройства/канаоа)
Выполнение JavaScript кода
Куда вставлять этот JavaScript код? Есть несколько способов выполнить данный код:Записать код в файл и положить его на SD-карту Raspberry Pi в папку /opt/z-way-server/[ваша папка]. Далее этот код можно исполнить из automation/main.js: executeFile(pathToJavaScriptFile).Вы также можете прописать ваш собственный JavaScript файл в config.xml вместо родного файла RaZberry.Отправить его по HTTP через Z-Way JSON API
Теперь опишем Z-Way HTTP/JSON API
Данный интерфейс взаимодействия с сервером Z-Way использует протокол HTTP и формат JSON для передачи данных. С его помощью не сложно создать графические интерфейс для сервера автоматизации.Команды кодируются прямо в URL запроса, а ответы приходят в привычном аяксерам JSON формате.Запрос
/ZWaveAPI/Data/ предоставляет JSON структуру полного дерева обновлений с момента времени . Она имеет вид{ path1: object1, path2: object2, ... updateTime: }
- Здесь pathN — это путь к изменившемуся элементу дерева,
- objectN — новое значение этого элемента.
- updateTime — время формирования обновлений (его нужно указать в следующем запросе, чтоб получить обновления)
Если запросить /ZWaveAPI/Data/0, то сервер вернёт полную структуру данных.
Запрос /ZWaveAPI/Run/ запускает JavaScript код zway..
Этот запрос аналогичен более общему /JS/Run/ и создан для совместимости с API сервиса Z-Cloud.
Запрос /JS/Run/ выполняет в v8 движке и возвращает в виде JSON результат выполнения этой команды.
Другие команды описаны в документации.
Несколько примеров:http://localhost:8083/ZWaveAPI/Run/devices[2].SwitchMultilvel.data.level.value
— возвращает последний полученный от устройства уровень яркости (стоит перед чтением послать
SwitchMultilevel.Get())http://localhost:8083/ZWaveAPI/Run/devices[3].instances[1].SensorMultilvel.data.level.value
— возвращает последнее полученный от устройства значение датчика (стоит перед чтением послать
SensorMultilevel.Get())http://localhost:8083/ZWaveAPI/Run/devices[2].Basic.Set(0)
— выключает устройство
Напомним, instances[0], commandClasses и value можно опустить.!Не забывайте, что некоторые символы требуется явно кодировать перед отправкой (url encode): например, + { }.
Вместе с софтом поставляется базовый интерфейс для браузера. Он тоже использует Z-Way JSON API для взаимодействия с сервером. Его код удобно использовать для изучения работы API. Также может оказаться полезным расширение для jQuery для отслеживания обновлений дерева, полученных запросом/ZWaveAPI/Data/Вот так выглядит взаимодействие разных слоёв системы (картинка из документации):
Через некоторое время планируется написание JS скриптов для автоматизации, предназначенных для простых пользователей (кривые заготовки уже лежат в папке automation). Их можно будет использовать совместно с собственными скриптами пользователя, т.е. собственные скрипты можно уже начинать писать и использовать в ваших проектах.
Где взять?
Raspberry Pi продаются на сайтах RS components или Farnell.Плата RaZberry и другое Z-Wave оборудование доступно в интернет-магазине Z-Wave.Me и других.
Пора автоматизировать!
Уверен, RaZberry станет удобным решением для построения бюджетных систем автоматизации на базе Z-Wav
-
Установка
Операционная система для домашнего кинотеатра с плеером Kodi (XBMC), продолжение ОС OpenELEC, разработка которой была остановлена
-
Установка К - Офиса
Запутался я с пакетами К-Офиса и поэтому решил поставитьсразу по сети с инета. Запустил на Raspy с консоли:
sudo apt-get install koffice
С первой попытки не удалось. Половина пакетов не находилась, либо не ставилась. В конце установки была рекомендация обновиться либо повторить попытку.
Обновился:
sudo apt-get update
Запустил опять установку:
sudo apt-get install koffice
Через десять минут примерно офис был установлен.
Впечатления: есть всё что надо, но тормозит конкретно при открытии приложений.
С графикой работать не вариант. Полный тормоз.
Вывод: на Распи применять проблематично.
-
Raspberry Pi подключение GPS USB приемника
Недавно нашел у себя USB-GPS приемник, если не ошибаюсь модель от GlobalSat BU 353. Вот и решил его подключить к Raspberry Pi. После подключения он обнаружился хорошо , проблем вообще не было никаких:
#lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial PortBus 001 Device 005: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)
Вот наш девайс: Prolific Technology, Inc. PL2303 Serial Port
В /dev/ появилось новое устройство ttyUSB0, к нему и будем подключаться, насколько я помню, у большинства подобных девайсов скорость 4800. Ниже скрипт на PHP с использованием свободной библиотеки php_serial.class.php, с ней довольно просто работать.
#!/usr/bin/php5 // подключаем библиотеку require("php_serial.class.php"); $serial=new phpSerial(); // выбираем порт $serial->deviceSet("/dev/ttyUSB0"); // скорость $serial->confBaudRate(4800); // ниже параметры как правило стандартные $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); // открываем порт $serial->deviceOpen(); $loop=1; while($loop==1){ $get=$serial->readPort(); // если включить print , то будут все строки NMEA протокола // print $get; if(substr($get,1,5) == "GPGGA") { // если включить print , то будет только $GPGGA //print $get; // парсим строку list($gga,$time,$lat,$NS,$lng,$EW,$state)=explode(",",$get); /* расшифровка строки $GPGGA,155004.000,4253.9372,N,04108.1511,E,1,08,1.2,18.4,M,27.4,M,,0000*68$GPGGA -- название пакета 155004.000 -- время гринвич 4253.9372,N,-- широта 04108.1511,E,-- доолгота 1-- если 1 то данные достоверны , если 0 то данные сомнительные в данном случае это переменная $state остальное можно прочитать в справочниках по NMEA протоколу,08,1.2,18.4,M,27.4,M,,0000*68*/ if($state == "1") { /* сохраняем в текстовый файл , но не обязательно, можно закомментировать и использовать перенаправление через print, типа #./gps.php > куда то, или #./gps.php | proga.sh */ // путь куда положить файл $fp=fopen('/h/pi/robot/gps/gga.txt','wt'); if($fp) { fputs($fp,$get); // print $get; } fclose($fp); //ставим задержку 10 секунд , но реально лучше ставить минуты 3-5 , зависит от задачи sleep(10); } }} $serial->deviceClose();?>
Это был простой пример , как получить данные из GPS приемника, обработку полученных данных можно реализовать разными способами, равно как и запуск скрипта. Я поставил периодичность запросов 10 секунд чисто для примера, хотя можно убрать sleep(10) и запускаться через cron.
Ниже рабочий пример скрипта для отображения координат на картах Google.
// получим данные из текстового файла $gga=shell_exec("cat /home/pi/robot/gps/gga.txt"); // пропарсим строку list($gga,$time,$lat,$NS,$lng,$EW,$state)=explode(",",$gga); // показываем полученные данные print "Time: ".$time." Lat: ".$lat." Lang: ".$lng." State: ".$state; // преобразуем широту и долготу к формату Google $Lat=round(floor($lat/100)+(($lat/100)-floor($lat/100))/0.6,6); $Lng=round(floor($lng/100)+(($lng/100)-floor($lng/100))/0.6,6); // диаметр круга $Acc="20"; // дальше обработка данных средствами Google API 3 print " Google Maps JavaScript API v3(Street View) function initialize() { var moscow = new google.maps.LatLng(".$Lat.",".$Lng."); var mapOptions = {center: moscow,zoom: 18,mapTypeId: google.maps.MapTypeId.SATELLITE,panControl: false,zoomControl: true,mapTypeControl: false,scaleControl: false}; var map = new google.maps.Map(document.getElementById(\"map_canvas\"), mapOptions); var circle = new google.maps.Circle({radius: ".$Acc.",map: map, center: moscow,fillOpacity: 0.2,strokeOpacity: 0.5,strokeColor: '#00CCCC', fillColor: '#33CCFF', strokeWeight: 1 }); var marker = new google.maps.Marker({position: moscow,map: map,title:\"Lat:".$Lat." Long:".$Lng." Acc:".$Acc." \" }); } "; ?>
-
Управление рабочим столом Raspberry Pi.
Для управления нам нужно скачать файл xrdp вот здесь http://www.xrdp.org/ далее закинуть файл на Raspberry Pi и ввести в консольной меню
sudo apt-get install xrdp
потом заходим Подключение к удаленно рабочему столу искать у виндовсе и вуаля у нас есть рабочий стол Raspberry Pi.Вот здесь можете глянуть на моё видео
-
Raspberry Pi. Расширяем дисковое пространство
Одноименная публикация находится у меня в блоге. Там более подробно это расписано.А здесь -- для продвинутых я перечисляю только основные шаги.
- Заводим на Яндекс-Диске аккаунт. Как это сделать -- читайте тут http://disk.yandex.ru/how-to/2. Устанавливаем модуль для работы с удаленной файловой системой (со своей "удаленной помойкой"):
$ sudo apt-get install davfs2
- Создаем директорий, куда будет проецироваться содержимое "помойки":
$ mkdir yandex.disk
- Подключаем "помойку" командой:
$ sudo mount -t davfs \ -o uid=alex,gid=alex \ # Здесь вы должны подставить имя своей учетной записи https://webdav.yandex.ru \ # Это ссылка на ресурс удаленной помойки /home/alex/yandex.disk # А это указатель на локальный директорий
Можно прописать эту команду в.profile или занести параметры в /etc/fstab. Тогда при загрузке Малинукса все сразу само срастается.- Если вы предпочетаете юзать графическую консоль, то лучше зайдите ко мне в блог. Там есть и описание, и имеются скриншоты. http://zhevak.wordpress.com/2013/08/27/raspberry-pi-расширяем-дисковое-пространство/
Я приношу всем свои извинения -- я потратил полчаса времени, но так и не смог осилить форматирование.