У меня Raspberry Pi 1B под управлением Raspbian 10 (Buster) с установленными Python3, Apache2 и PHP, и я оснащен полосой светодиодов WS2812.
У меня есть простой Python скрипт (PixelTestOn.py, см. ниже), который включает все светодиоды. При использовании следующей команды терминала все светодиоды загораются, и текст в сценарии отображается, как и ожидалось:
sudo python3 PixelTestOn.py*
PixelTestOn.py
#! /usr/bin/env python3
print("PixelTestOn started<br>")
from rpi_ws281x import PixelStrip, Color
# LED strip configuration:
LED_COUNT = 30 # 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 = 40 # Set to 0 for darkest and 255 for brightest
LED_INVERT = True # 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
# Create NeoPixel object with appropriate configuration.
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
# Intialize the library (must be called once before other functions).
strip.begin()
# Switch all pixels on
for i in range(strip.numPixels()):
strip.setPixelColor(i, Color(255, 255, 255))
strip.show()
print("PixelTestOn finished")
exit()
У меня также есть php скрипт (PixelTestOn. php, см. ниже), который должен отображать некоторый текст, выполнить скрипт PixelTestOn.py python, чтобы включить светодиоды, а затем отобразить еще немного текста. При использовании следующей команды терминала отображается код HTML, и все светодиоды загораются, а текст в сценарии python отображается, как и ожидалось:
sudo php PixelTestOn.php
PixelTestOn. php
<html>
<head>
<title>Pixel Test</title>
<h3>Test to turn LEDs on</h3>
<p>Should see all LEDs light up</p>
<p></p>
<p>About to call shell_exec() (5)</p>
<?PHP
echo shell_exec("python PixelTestOn.py");
?>
<p>Returned from shell_exec()</p>
</head>
Однако, когда я ввожу следующее в браузер Chromium, выводится html (не код) и текст в первом операторе print () в начале python код отображается, как и ожидалось, однако светодиоды не загораются, и текст во втором выражении print () в конце кода python не отображается:
localhost/PixelTestOn.php
Если я закомментирую все операторы между 2 операторами print (), затем скрипт выполняется, как и ожидалось, в браузере.
Все файлы хранятся в каталоге / var / www/html, все имеют владельца www-data, и для всех элементов управления доступом установлено значение «Любой».
Вот что я пробовал:
- Использование shell_exe c (), exe c () и system ( ) в скрипте php
- с использованием разных брат wsers (Echo, IE, Chrome) на моих Windows 10 P C и Chrome на Android планшете. Обратите внимание, что S SH включен на Pi.
- Две разные библиотеки управления светодиодами, rpi_ws281x и neopixel
- Common Gateway Interface (CGI). Я не смог заставить это работать с формой html с кнопкой [Submit], когда кнопка была нажата для ввода данных, в браузере появилось сообщение «Internal Server Error».
Мое конечное намерение - создать электронное табло для игры в крикет c на основе безголового Raspberry Pi с индивидуально адресуемыми светодиодами, к которому можно получить удаленный доступ с помощью планшета Android.
Обновление После комментария Джея я попытался запустить «python3 PixelTestOn.py», т.е. без «sudo» в Терминале, и получил следующее сообщение об ошибке после того, как было выведено выражение «ПиксельТест запущен
»:
Can’t open /dev/mem: Permission denied
Traceback (most recent call last):
File “PixelTestOn.py”, line 24, in <module>
strip.begin()
File “/home/pi/.local/lib/python3.7/site-packages/rpi_ws281x/rpi_ws281x.py”, line 130, in begin
raise RuntimeError(‘ws2811_init failed with code {0} ({1})’.format(resp, str_resp))
RuntimeError: ws2811_init failed with code -5 (mmap() failed)
Увидев заявление «Отказано в доступе», я запомнил разрешения для файла «/ dev / mem», а затем ввел следующее, чтобы изменить контроль доступа на «Любой» для всех 3 опций.
sudo 777 /dev/mem
Затем я повторно запустил «python3 PixelTestOn.py» в Терминале и, снова после того, как было выведено выражение «PixelTestOn началось
», получил похожую ошибку mes мудрец, но на этот раз, начиная с:
Can’t open /dev/mem: Operation not permitted
Затем я изменил права доступа к / dev / mem к их первоначальным настройкам