Я вожу светодиоды с помощью сообщений ros.Я написал код Python, который управляет приемом сообщений и управляет светодиодами WS2812
Я использую rpi_ws281x для управления светодиодами (https://github.com/jgarff/rpi_ws281x).
Вот код Python:
#!/usr/bin/env python
from neopixel import *
from ina219 import INA219
from ina219 import DeviceRangeError
import rospy
from std_msgs.msg import String
import json
import simplejson
def updateLeds(leds):
for index, item in enumerate(leds):
print(index, item)
strip.setPixelColor(index, item)
strip.show()
def updateLed(led, color):
strip.setPixelColor(led, color)
rospy.loginfo("Initializing leds")
# LED strip configuration:
LED_COUNT = 4 # Number of LED pixels.
LED_PIN = 10 # 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 = 40 # 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
rospy.init_node('leds_listener', anonymous=True)
rospy.loginfo("Initializing leds")
# Create NeoPixel object with appropriate configuration.
strip = Adafruit_NeoPixel(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()
strip.setPixelColor(0, Color(255, 0, 0)) #GRB
strip.setPixelColor(1, Color(0, 255, 0))
strip.setPixelColor(2, Color(0, 0, 255))
strip.setPixelColor(3, Color(255, 255, 0))
strip.show()
ledColors = [Color(0, 0, 0), Color(0, 0, 0), Color(0, 0, 0), Color(0, 0, 0)]
updateLeds(ledColors)
rospy.loginfo("Initializing leds ok")
def callback(data):
rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)
try:
#parse the json
jsonData = simplejson.loads(data.data)
#check the mode
if jsonData["mode"].lower() == "basic":
led = int(jsonData["values"]["led"])
color = int(jsonData["values"]["color"], 16)
print("led:", led, "color", color)
ledColors[led] = color
#updateLeds(ledColors)
updateLed(led, color)
strip.show()
except ValueError as e:
rospy.logerr("Unable to parse json input ( %s ): %s", data.data, e)
def leds_listener():
rospy.Subscriber('leds', String, callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
if __name__ == '__main__':
try:
leds_listener()
except rospy.ROSInterruptException:
pass
Вот сообщение json в виде строки
#examples of valid message
{
"mode" : basic,
"values" : {
"led" : "0",
"color" : "FF0033"
}
}
Я отправляю сообщение через rostopic, используя следующую строку:
export MY_MSG="data: '{\"values\": {\"color\": \"00FF00\", \"led\": \"1\"}, \"mode\": \"basic\"}'";rostopic pub -1 leds std_msgs/String "$MY_MSG"
И это хорошо работает.
НоТеперь я хотел бы отправлять его периодически, поэтому я использую следующую строку запятой:
export MY_MSG="data: '{\"values\": {\"color\": \"00FF00\", \"led\": \"1\"}, \"mode\": \"basic\"}'";rostopic pub -r 0.2 leds std_msgs/String "$MY_MSG"
И программа показывает мне тот же вывод журнала, но поведение действительно другое. Вместо того, чтобы правильно приводить светодиод, все светодиоды идутдо белого при максимальном значении.
В чем разница между периодическим отправлением сообщения?