mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-05 00:59:33 +00:00
Add some info about ir sensors and rework leds.md (#107)
* Create new artile ir_sensors.md Create new article about ir sensors and their compatibility wit python. * docs: edit ir_sensors.md * Fix markdown mistake * Add new article about IR sensors * Add some fix and information about IR transmitter * Add some fix * Add info about py-irsend * Change connections images * Edit summary.md * Edit * Add some info about led and ir sensors * Add some fix about ir and rework article about leds * Fix in led * Reset sitl * fix * Edit * Small fixes * Edit
This commit is contained in:
BIN
docs/assets/led_connection.png
Normal file
BIN
docs/assets/led_connection.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 154 KiB |
@@ -1,5 +1,7 @@
|
||||
# Работа с ИК-датчиками на Raspberry Pi 3
|
||||
|
||||
Инфракрасные датчики – удобный инструмент для передачи каких-либо команд на коптер. Они гибки в настройке и взаимодействие с ними возможно из языка Python.
|
||||
|
||||
## Подключение ИК-приемника
|
||||
|
||||
Большинство ИК-приемников работают и подключаются одинаково. У таких приемников есть 3 пина для подключения: G/GND – земля, V/VCC – питание 5В, S/OUT – сигнал.
|
||||
@@ -12,11 +14,14 @@
|
||||
|
||||
LIRC (Linux Infrared Remote Control) – стабильная и проверенная библиотека с открытым кодом, которая позволяет отправлять и получать команды по инфракрасному порту. LIRC поддерживается Raspbian.
|
||||
|
||||
Для установки модуля LIRC нужно подключить вашу Raspberry Pi к интернету и выполнить консольные команды:
|
||||
Для установки LIRC и сопутствующих модулей нужно подключить вашу Raspberry Pi к интернету и выполнить консольные команды:
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install lirc
|
||||
sudo apt-get install python-lirc
|
||||
pip install py-irsend
|
||||
|
||||
```
|
||||
|
||||
> **Hint** Для корректного редактирования системных файлов требуется иметь права доступа администратора, используйте `sudo` при вызове редактора текста.
|
||||
@@ -57,10 +62,10 @@ driver = default
|
||||
device = /dev/lirc0
|
||||
```
|
||||
|
||||
Все требуемые настройки сделаны, теперь нужно перезагрузить соответствующий демон. Для этого выполните:
|
||||
Все требуемые настройки сделаны, теперь нужно перезагрузить ваше устройство Raspberry Pi для завершения установки. Для этого выполните:
|
||||
|
||||
```bash
|
||||
sudo service lircd resart
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
После перезагрузки проверьте его статус, вызвав команду:
|
||||
@@ -70,8 +75,6 @@ sudo /etc/init.d/lircd status
|
||||
```
|
||||
|
||||
Если вы все сделали правильно, то статус работы должен быть `active`.
|
||||
Перед проведением тестирования лучше будет перезагрузить Raspberry Pi командой `sudo reboot`.
|
||||
|
||||
Чтобы проверить, что установленный модуль LIRC работает, выключите демон `lircd` и вызовите соответствующую команду:
|
||||
|
||||
```bash
|
||||
@@ -98,7 +101,7 @@ pulse 535
|
||||
|
||||
<a name="remote_control"></a>
|
||||
|
||||
В случае, если вы хотите использовать свой ИК-передатчик, вам нужно записать его характерные настройки с помощью прилагающегося модуля `irrecord`. Для этого вам нужно выключить демон `lircd` и вызвать соответствующую команду. Во время клабирбровки пульта точно выполняйте все написанные интсрукции.
|
||||
В случае, если вы хотите использовать свой ИК-передатчик, вам нужно записать его характерные настройки с помощью прилагающегося модуля `irrecord`. Для этого вам нужно выключить демон `lircd` и вызвать соответствующую команду. Во время калибровки пульта точно выполняйте все написанные инструкции.
|
||||
|
||||
> **Hint** Обратите внимание, что на последнем шаге калибровки вам нужно будет задать наименования кнопок, которые вы захотите расшифровать программно. Для того чтобы посмотреть список доступных имен, вызовите команду `irrecord --list-namespace`.
|
||||
|
||||
@@ -106,11 +109,11 @@ pulse 535
|
||||
irrecord -d /dev/lirc0 ~/lircd.conf
|
||||
```
|
||||
|
||||
Если у вас успешно получилось записать конфигурацию вашего пульта, в папке `/home/pi/` должен был появиться файл `введенное-имя.lircd.conf`. Теперь вам нужно перенести записанный конфигурационный файл в рабочую папку `lirc` и перезагрузить демон:
|
||||
Если у вас успешно получилось записать конфигурацию вашего пульта, в папке `/home/pi/` должен был появиться файл `ваше-имя.lircd.conf`. Теперь вам нужно перенести записанный конфигурационный файл в рабочую папку `lirc` и перезагрузить демон:
|
||||
|
||||
```
|
||||
sudo cp ~/lircd.conf /etc/lirc/lircd.conf
|
||||
sudo /etc/init.d/lirc restart
|
||||
sudo cp ~/ваше-имя.lircd.conf /etc/lirc/lircd.conf
|
||||
sudo /etc/init.d/lircd restart
|
||||
```
|
||||
|
||||
Для того чтобы проверить, распознается ли записаная вами конфигурация, вывзовите соответствующий модуль. Теперь при нажатии на кнопки, которые вы записали в ранее созданной конфигурации, в терминал будет выводиться отладочная информация о том, какая кнопка была нажата.
|
||||
@@ -119,23 +122,22 @@ sudo /etc/init.d/lirc restart
|
||||
irw
|
||||
```
|
||||
|
||||
Если вы все сделали правильно, то вы увидите выход похожий на:
|
||||
> **Caution** В случае работы с некоторыми пультами бывают ситуации, когда битовые описания кнопок являются излишними и в таком случае у вас может не работать команда `irw`. Что бы исправить эту ошибку откройте файл `etc/lirc/lircd.conf` и проверьте как выглядит описание ваших клавиш, если оно похоже на `KEY_1 0x00FF6897 0x7EE0CF2C` и во всех строках у вас второе число совпадает, то вам нужно его удалить, что бы строки с назначением кнопок выглядели таким образом `KEY_1 0x00FF6897` и все числа в них были уникальны. После выполнения этих действий закройте файл и перезагрузите демон.
|
||||
|
||||
TODO Добавить реальные строчки раскодированных сигналов пульта
|
||||
Если вы все сделали правильно, то при нажатии кнопки вы увидите выход похожий на:
|
||||
|
||||
```
|
||||
000000007689718e 01 KEY_OK
|
||||
0000000000ff6897 00 KEY_1 pult
|
||||
0000000000ff6897 01 KEY_1 pult
|
||||
0000000000ff9867 00 KEY_2 pult
|
||||
0000000000ff9867 01 KEY_2 pult
|
||||
```
|
||||
|
||||
Это значит, что ваша конфигурация корректно распознается программой и теперь вы можете запрограммировать нужные вам действия в случае нажатия определенной клавиши.
|
||||
|
||||
## Работа с ИК-датчками в Python
|
||||
|
||||
Чтобы иметь возможность использовать сигналы с ИК-приемника в Python программах, требуется установить пакет `python-lirc`, для этого используйте команду:
|
||||
|
||||
```
|
||||
sudo apt-get install python-lirc
|
||||
```
|
||||
Чтобы иметь возможность использовать сигналы с ИК-приемника в Python программах, вам потребуется пакет `python-lirc`. [Установите его](#install) при необходимости.
|
||||
|
||||
Для корректного получения информации в собственном скрипте нужно создать файл `lircrc`, в котором будут храниться настройки ваших кнопок и программный ответ в случае их вызова.
|
||||
|
||||
@@ -213,11 +215,7 @@ irsend SEND_ONCE deviceName keyName
|
||||
+ deviceName - имя пульта, которое вы давали во время его [настройки](#remote_control)
|
||||
+ keyName - имя одной из кнопок, которые были вами заданы во время настройки пульта
|
||||
|
||||
Для того чтобы работать с `irsend` внутри вашего скрипта требуется установить модуль `python-irsend`, для этого используйте команду:
|
||||
|
||||
```bash
|
||||
pip install py-irsend
|
||||
```
|
||||
Для того чтобы работать с `irsend` внутри вашего скрипта, вам потребуется модуль `python-irsend`, при необходимости [установите его](#install).
|
||||
|
||||
Чтобы использовать `irsend` импортируйте библиотеку и вызовите соответствующую команду:
|
||||
|
||||
|
||||
250
docs/ru/leds.md
250
docs/ru/leds.md
@@ -2,105 +2,19 @@
|
||||
|
||||
## Подключение и определение типа ленты
|
||||
|
||||
Есть два основных типа адресуемых светодиодов: WS2812 и WS2812B. Принцип управления один и тот же, однако тайминги разные. Найдите на ленте чип светодиода и определите сколько у него ножек: 6 или 4. Если ножек 6, то это WS2812, если 4 – то WS2812B или его аналог SK6812.
|
||||
> **Note** Документация для версии образа, начиная с 0.14. Для более ранних версий см. [документацию для версий 0.13](https://github.com/CopterExpress/clever/blob/v0.13/docs/leds.md)
|
||||
|
||||
<img src="../assets/timing_with_thumbs.png" height="400px" alt="leds">
|
||||
Подключите светодиодную ленту к питанию +5v - 5v, земле GND - GND и сигнальному порту DIN - GPIO30, GPIO21, GPIO18.
|
||||
|
||||
Т.к. принцип управления одинаковый, то и ленты подключаются одинаково:
|
||||
<img src="../assets/led_connection.png" height="400px" alt="leds">
|
||||
|
||||
| Лента | Raspberry Pi |
|
||||
| :---: | :---: |
|
||||
| GND | GND |
|
||||
| 5V | 5V |
|
||||
| DIN | GPIO21 или GPIO31 |
|
||||
|
||||
Типы лент для обозначения ленты в коде описаны в [файле](https://github.com/jgarff/rpi_ws281x/blob/master/ws2811.h). Основные типы лент – это WS2812\_STRIP \(для WS2812\) и SK6812\_STRIP \(для WS2812B или SK6812\).
|
||||
|
||||
## Установка библиотеки для работы со светодиодной лентой
|
||||
|
||||
Определите папку, в которой будут находиться файлы библиотеки, и открыть путь к этой папке в терминале. По-умолчанию можно использовать домашнюю папку, для перехода в неё нужно выполнить команду:
|
||||
|
||||
```bash
|
||||
cd ~
|
||||
```
|
||||
|
||||
Склонируйте репозиторий библиотеки для работы с LED-лентами на Raspberry Pi:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/jgarff/rpi_ws281x.git
|
||||
```
|
||||
|
||||
Установите [Scons](https://ru.wikipedia.org/wiki/SCons) и [Swig](https://ru.wikipedia.org/wiki/SWIG):
|
||||
|
||||
```bash
|
||||
sudo apt-get install scons python-dev swig
|
||||
```
|
||||
|
||||
Соберите библиотеку с помощью Scons \(команда выполняется внутри папки с исходным кодом библиотеки\):
|
||||
|
||||
```bash
|
||||
cd rpi_ws281x
|
||||
scons
|
||||
```
|
||||
|
||||
Соберите Python-обёртку библиотеки с помощью Swig и установите её для возможности использования в своих Python-скриптах.
|
||||
|
||||
```bash
|
||||
cd python
|
||||
sudo python ./setup.py build
|
||||
sudo python ./setup.py install
|
||||
```
|
||||
|
||||
## Пример программы для светодиодной ленты на RPI3
|
||||
|
||||
Откройте в текстовом редакторе файл `strandtest.py` из папки `python/examples` \(находится в папке с библиотекой\):
|
||||
|
||||
```bash
|
||||
nano strandtest.py
|
||||
```
|
||||
|
||||
Найдите участок кода с настройками ленты:
|
||||
|
||||
```(bash)
|
||||
# LED strip configuration:
|
||||
LED_COUNT = 16 # Number of LED pixels.
|
||||
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).
|
||||
#LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
|
||||
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
|
||||
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
|
||||
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
|
||||
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
|
||||
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
|
||||
LED_STRIP = ws.WS2811_STRIP_GRB # Strip type and colour ordering
|
||||
```
|
||||
|
||||
Поправьте настройки для работы с лентой и сохраните файл. Чтобы использование ленты не мешало работе других устройств на Raspberry Pi, рекомендуется использовать следующие настройки \(настройки подходят для ленты в комплекте с Клевер 3\):
|
||||
|
||||
```bash
|
||||
# LED strip configuration:
|
||||
LED_COUNT = 30 # Number of LED pixels.
|
||||
LED_PIN = 21 # GPIO pin connected to the pixels.
|
||||
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
|
||||
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
|
||||
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
|
||||
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
|
||||
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
|
||||
LED_STRIP = ws.SK6812_STRIP # Strip type and colour ordering
|
||||
```
|
||||
|
||||
Запустите тестовую программу, используя права администратора:
|
||||
|
||||
```bash
|
||||
sudo python strandtest.py
|
||||
```
|
||||
|
||||
Права администратора необходимы для выполнения скрипта, т.к. без них нет доступа к функциям прерывания, которые использует библиотека для работы с лентой.
|
||||
> **Caution** Обратите внимание, что светодиодную ленту нужно питать от стабильного источника энергии. Если вы подключите питание напрямую к Raspberry, то это создаст слишком большую нагрузку на ваш микрокомпьютер. Для снятия нагрузки с Raspberry можно подключить питание к преобразователю `BEC`.
|
||||
|
||||
## Совместимость с ROS и Python
|
||||
|
||||
При запуске программы с помощью sudo пользовательское окружение изменяется и появляются ошибки импорта библиотек, т.к. в окружении отсутствуют необходимые пути. Чтобы добавить в окружение пути к библиотекам Python и пакетам ROS, необходимо добавить в файл `/etc/sudoers` следующие строки:
|
||||
Чтобы корректно работать со светодиодной лентой вам нужно добавить в окружение необходимые пути к библиотекам Python и пакетам ROS, для этого необходимо добавить в файл `/etc/sudoers` следующие строки:
|
||||
|
||||
```bash
|
||||
```
|
||||
Defaults env_keep += "PYTHONPATH"
|
||||
Defaults env_keep += "PATH"
|
||||
Defaults env_keep += "ROS_ROOT"
|
||||
@@ -111,18 +25,66 @@ Defaults env_keep += "ROS_HOME"
|
||||
Defaults env_keep += "ROS_LOG_DIR"
|
||||
```
|
||||
|
||||
## Функции для работы со светодиодной лентой
|
||||
## Пример программы для светодиодной ленты на RPI3
|
||||
|
||||
Для подключения библиотеки и её корректной работы требуется подключить следующие модули: neopixel - для работы ленты, time – для управления задержками, sys и signal для прерываний и формирования управляющего сигнала.
|
||||
Для проверки работоспособности ленты можете использовать приведенный ниже код, данный код поочередно зажжет первые 10 диодов 3 цветами и в конце их погасит.
|
||||
|
||||
```python
|
||||
from neopixel import *
|
||||
import time
|
||||
import signal
|
||||
import sys
|
||||
|
||||
from rpi_ws281x import Adafruit_NeoPixel
|
||||
from rpi_ws281x import Color
|
||||
|
||||
|
||||
LED_COUNT = 10 # Количество светодиодов в ленте
|
||||
LED_PIN = 18 # GPIO пин, к которому вы подсоединяете светодиодную ленту
|
||||
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
|
||||
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
|
||||
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
|
||||
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
|
||||
LED_CHANNEL = 0 # Set to '1' for GPIOs 13, 19, 41, 45 or 53
|
||||
|
||||
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT)
|
||||
|
||||
strip.begin()
|
||||
|
||||
|
||||
def colorWipe(strip, color, wait_ms=50):
|
||||
"""Wipe color across display a pixel at a time."""
|
||||
for i in range(strip.numPixels()):
|
||||
strip.setPixelColor(i, color)
|
||||
strip.show()
|
||||
time.sleep(wait_ms/1000.0)
|
||||
|
||||
|
||||
print('Color wipe animations.')
|
||||
colorWipe(strip, Color(255, 0, 0), wait_ms=100) # Red wipe
|
||||
colorWipe(strip, Color(0, 255, 0), wait_ms=100) # Blue wipe
|
||||
colorWipe(strip, Color(0, 0, 255), wait_ms=100) # Green wipe
|
||||
colorWipe(strip, Color(0, 0, 0), wait_ms=100) # Green wipe
|
||||
```
|
||||
|
||||
Для работы с лентой необходимо создать объект типа **Adafruit_NeoPixel** и инициализировать библиотеку:
|
||||
> **Note** Вы так же можете использовать тестовый код разработчиков данного модуля. Вы можете его [скачать](https://github.com/jgarff/rpi_ws281x/blob/master/python/examples/strandtest.py "Github разработчика") из репозитория разработчика. Обратите внимание, что для корректной работы вам нужно будет изменить импорт модуля `numpixel` на `rpi_ws281x`.
|
||||
|
||||
Сохраните программу в ваш скрипт и запустите его используя права администратора:
|
||||
|
||||
```bash
|
||||
sudo python UourScriptName.py
|
||||
```
|
||||
|
||||
Права администратора `sudo` необходимы для выполнения скрипта, т.к. без них нет доступа к функциям прерывания, которые использует библиотека для работы с лентой.
|
||||
|
||||
## Основные функции используемые для работы со светодиодной лентой
|
||||
|
||||
Для подключения библиотеки и её корректной работы требуется подключить следующие модули: `Adafruit_NeoPixel` и `Color` - для работы ленты и `time` – для управления задержками.
|
||||
|
||||
```python
|
||||
from rpi_ws281x import Adafruit_NeoPixel
|
||||
from rpi_ws281x import Color
|
||||
import time
|
||||
```
|
||||
|
||||
Для работы с лентой необходимо создать объект типа `Adafruit_NeoPixel` и инициализировать библиотеку:
|
||||
|
||||
```python
|
||||
# Создание объекта NeoPixel c заданной конфигурацией
|
||||
@@ -133,91 +95,18 @@ strip.begin()
|
||||
|
||||
Основные функции, которые используются для управления лентой:
|
||||
|
||||
* `numPixels()` - возвращает количество пикселей в ленте. Удобно для цикличного управления всей лентой целиком.
|
||||
* `setPixelColor(pos, color)` – устанавливает цвет пикселя в позиции `pos` в цвет `color`. Цвет должен быть 24 битным значением, где первые 8 бит - красный цвет \(red\), следующие 8 бит - зелёный цвет \(green\) и последние 8 бит - голубой \(blue\). Для получения значения `color` можно использовать функцию `Color(red, green, blue)`, которая составляет это значение из 3х компонент. Каждый компонент должен находиться в диапазоне 0-255, где 0 – отсутствие цвета, а 255 – наибольшая доступная яркость компонента в светодиодном модуле.
|
||||
* `setPixelColorRGB(pos, red, green, blue)` – устанавливает цвет пикселя в позиции pos в цвет, состоящий из компонент `red`, `green`, `blue`. Каждый компонент должен находиться в диапазоне 0–255, где 0 – отсутствие цвета, а 255 – наибольшая доступная яркость компонента в светодиодном модуле.
|
||||
* `show()` – обновляет состояние ленты. Только после её использования все программные изменения перемещаются на светодиодную ленту.
|
||||
|
||||
Остальные функции можно обнаружить, вызвав команду
|
||||
|
||||
```bash
|
||||
pydoc neopixel
|
||||
```
|
||||
|
||||
Результат выполнения команды:
|
||||
|
||||
```bash
|
||||
Help on module neopixel:
|
||||
|
||||
NAME
|
||||
neopixel
|
||||
|
||||
DESCRIPTION
|
||||
# Adafruit NeoPixel library port to the rpi_ws281x library.
|
||||
# Author: Tony DiCola (tony@tonydicola.com)
|
||||
|
||||
CLASSES
|
||||
__builtin__.object
|
||||
Adafruit_NeoPixel
|
||||
|
||||
class Adafruit_NeoPixel(__builtin__.object)
|
||||
| Methods defined here:
|
||||
|
|
||||
| __del__(self)
|
||||
|
|
||||
| __init__(self, num, pin, freq_hz=800000, dma=5, invert=False)
|
||||
| Class to represent a NeoPixel/WS281x LED display. Num should be the
|
||||
| number of pixels in the display, and pin should be the GPIO pin connected
|
||||
| to the display signal line (must be a PWM pin like 18!). Optional
|
||||
| parameters are freq, the frequency of the display signal in hertz (default
|
||||
| 800khz), dma, the DMA channel to use (default 5), and invert, a boolean
|
||||
| specifying if the signal line should be inverted (default False).
|
||||
|
|
||||
| begin(self)
|
||||
| Initialize library, must be called once before other functions are
|
||||
| called.
|
||||
|
|
||||
| getPixelColor(self, n)
|
||||
| Get the 24-bit RGB color value for the LED at position n.
|
||||
|
|
||||
| getPixels(self)
|
||||
| Return an object which allows access to the LED display data as if
|
||||
| it were a sequence of 24-bit RGB values.
|
||||
|
|
||||
| numPixels(self)
|
||||
| Return the number of pixels in the display.
|
||||
|
|
||||
| setBrightness(self, brightness)
|
||||
| Scale each LED in the buffer by the provided brightness. A brightness
|
||||
| of 0 is the darkest and 255 is the brightest. Note that scaling can have
|
||||
| quantization issues (i.e. blowing out to white or black) if used repeatedly!
|
||||
|
|
||||
| setPixelColor(self, n, color)
|
||||
| Set LED at position n to the provided 24-bit color value (in RGB order).
|
||||
|
|
||||
| setPixelColorRGB(self, n, red, green, blue)
|
||||
| Set LED at position n to the provided red, green, and blue color.
|
||||
| Each color component should be a value from 0 to 255 (where 0 is the
|
||||
| lowest intensity and 255 is the highest intensity).
|
||||
|
|
||||
| show(self)
|
||||
| Update the display with the data from the LED buffer.
|
||||
|
|
||||
|
||||
FUNCTIONS
|
||||
Color(red, green, blue)
|
||||
Convert the provided red, green, blue color to a 24-bit color value.
|
||||
Each color component should be a value 0-255 where 0 is the lowest intensity
|
||||
and 255 is the highest intensity.
|
||||
```
|
||||
+ `numPixels()` - возвращает количество пикселей в ленте. Удобно для цикличного управления всей лентой целиком.
|
||||
+ `setPixelColor(pos, color)` – устанавливает цвет пикселя в позиции `pos` в цвет `color`. Цвет должен быть 24 битным значением, где первые 8 бит - красный цвет \(red\), следующие 8 бит - зелёный цвет \(green\) и последние 8 бит - голубой \(blue\). Для получения значения `color` можно использовать функцию `Color(red, green, blue)`, которая составляет это значение из 3х компонент. Каждый компонент должен находиться в диапазоне 0-255, где 0 – отсутствие цвета, а 255 – наибольшая доступная яркость компонента в светодиодном модуле.
|
||||
+ `setPixelColorRGB(pos, red, green, blue)` – устанавливает цвет пикселя в позиции pos в цвет, состоящий из компонент `red`, `green`, `blue`. Каждый компонент должен находиться в диапазоне 0–255, где 0 – отсутствие цвета, а 255 – наибольшая доступная яркость компонента в светодиодном модуле.
|
||||
+ `show()` – обновляет состояние ленты. Только после её использования все программные изменения перемещаются на светодиодную ленту.
|
||||
|
||||
## Почему именно так и можно ли по-другому?
|
||||
|
||||
Основные типы лент, которые используются для Клевера 3, это WS2812, WS2812B и SK6812 \(аналог WS2812B\). Они управляются по одному и тому же принципу: для массива светодиодов в ленте отправляется пакет данных по 24 бита на светодиод; каждый светодиод считывает первые 24 бита из пришедших к нему данных и устанавливает соответствующий цвет, остальные данные он отправляет следующему светодиоду в ленте. Нули и единицы задаются разными сочетаниями длительностей высокого и низкого уровня в импульсе.
|
||||
Основной тип ленты, который используется для Клевера 3 управляются по принципу: для массива светодиодов в ленте отправляется пакет данных по 24 бита на светодиод; каждый светодиод считывает первые 24 бита из пришедших к нему данных и устанавливает соответствующий цвет, остальные данные он отправляет следующему светодиоду в ленте. Нули и единицы задаются разными сочетаниями длительностей высокого и низкого уровня в импульсе.
|
||||
|
||||
Все эти ленты поддерживаются для управления библиотекой [rpi_ws281x](https://github.com/jgarff/rpi_ws281x), при этом для управления используется модуль DMA \(direct memory access\) процессора распберри и один из каналов передачи данных: PWM, PCM или SPI, что гарантирует отсутствие задержек в управлении \(а управляется всё на многозадачной операционке, это важно\).
|
||||
Используемый тип ленты поддерживаются для управления библиотекой [rpi_ws281x](https://github.com/jgarff/rpi_ws281x), при этом для управления используется модуль DMA \(direct memory access\) процессора распберри и один из каналов передачи данных: PWM, PCM или SPI, что гарантирует отсутствие задержек в управлении \(а управляется всё на многозадачной операционке, это важно\).
|
||||
|
||||
Есть некоторые особенности работы с каналами, например при передаче данных с помощью PWM \(ШИМ\) перестаёт работать встроенная аудиосистема распберри, при передаче данных по PCM блокируется использование подключенных цифровых аудиоустройств \(при этом встроенная система работает\), а при использовании SPI \(кстати, требуется специальная настройка размера буфера и частоты GPU распберри для правильной работы\) лед лента блокирует все остальные устройства, подключенные по этому каналу.
|
||||
Есть некоторые особенности работы с каналами, например при передаче данных с помощью PWM \(ШИМ\) перестаёт работать встроенная аудиосистема распберри, при передаче данных по PCM блокируется использование подключенных цифровых аудиоустройств \(при этом встроенная система работает\), а при использовании SPI \(кстати, требуется специальная настройка размера буфера и частоты GPU распберри для правильной работы\) лента блокирует все остальные устройства, подключенные по этому каналу.
|
||||
|
||||
Есть некоторые особенности выбора канала DMA для управления лентой: некоторые каналы используются системой, поэтому их использование может привести к неприятным последствиям, например использование 5 канала рушит файловую систему Raspberry, т.к. этот канал используется при чтении-записи на SD карту. Безопасный канал – 10, он же установлен по умолчанию в приведённой выше библиотеке.
|
||||
|
||||
@@ -226,8 +115,9 @@ pydoc neopixel
|
||||
1. Если нам не важна работоспособность встроенного аудио на распберри \(и мы его не используем, т. к. аудио и лента будут выдавать билиберду в этом случае\), то можно использовать PWM канал \(для этого требуется подключить вход ленты к одному из следующих GPIO портов распберри: 12, 18, 40, или 52 для PWM0 канала и 13, 19, 41, 45 или 53 для PWM1 канала\).
|
||||
2. Если нам не важно наличие на шине SPI других устройств, то можно управлять лентой по каналу SPI \(GPIO на распберри 10 или 38\).
|
||||
Здесь требуется произвести следующие настройки \(только для Raspberry Pi 3\):
|
||||
* увеличить размер буфера передачи данных для поддержки длинных лент, добавив стройку `spidev.bufsiz=32768` в файл `/boot/cmdline.txt`;
|
||||
* установить частоту GPU для правильной частоты работы SPI, добавив строку `core_freq=250` в файл `/boot/config.txt`.
|
||||
+ увеличить размер буфера передачи данных для поддержки длинных лент, добавив стройку `spidev.bufsiz=32768` в файл `/boot/cmdline.txt`;
|
||||
+ установить частоту GPU для правильной частоты работы SPI, добавив строку `core_freq=250` в файл `/boot/config.txt`.
|
||||
+ перезагрузить вашу Raspberry, используя команду `sudo reboot`
|
||||
3. Если нам важна и работа аудио, и подключение к SPI устройств кроме лед ленты, то можно управлять лентой по каналу PCM \(GPIO 21 или 31\). При этом никаких дополнительных манипуляций с Raspberry не требуется.
|
||||
|
||||
Исходя из вышеперечисленных способов управления лентой, наилучшим вариантом, позволяющим управлять лентой, сохранить работоспособность встроенной аудиосистемы и возможность подключения всяческих устройств и датчиков по SPI, является управление по каналу PCM \(GPIO 21\) с использованием 10 канала DMA.
|
||||
|
||||
@@ -72,4 +72,4 @@ QGroundControl автоматически подключится к запуще
|
||||
|
||||
```bash
|
||||
roslaunch mavros px4.launch fcu_url:=udp://@127.0.0.1:14557
|
||||
```
|
||||
```
|
||||
Reference in New Issue
Block a user