Hello, I'm working to add a strip of ws2812b leds under on the top of my arcade. I've been playing with Arduino adalight sketch and hypercon for a while but I can't seem to make them talk to each other.
My hardware is a Rpi 3 b and Arduino mega connected to ws2812b lights, I only have 20 lights set up along the top of the screen from left to right
When I start up the Arduino the LED do two test flashes so I'm pretty sure my wires are set up correctly, my problem is that once they flash they turn off and never respond to the Hyperion program. My logs say I'm connected and that everything is running from hypercon.
Here is the Arduino ino file I'm using
- #include "FastLED.h"
- #define ANALOG_MODE_AVERAGE 0
- #define ANALOG_MODE_LAST_LED 1
- /**************************************
- S E T U P
- set following values to your needs
- **************************************/
- #define INITIAL_LED_TEST_ENABLED true
- #define INITIAL_LED_TEST_BRIGHTNESS 255 // 0..255
- #define INITIAL_LED_TEST_TIME_MS 500 // 10..
- // Number of leds in your strip. set to "1" and ANALOG_OUTPUT_ENABLED to "true" to activate analog only
- // As of 26/1/2017:
- // 582 leaves ZERO bytes free and this
- // 410 is ok
- // tested with 500 leds and is fine (despite the warning)
- #define MAX_LEDS 20
- // type of your led controller, possible values, see below
- #define LED_TYPE WS2812B
- // 3 wire (pwm): NEOPIXEL BTM1829 TM1812 TM1809 TM1804 TM1803 UCS1903 UCS1903B UCS1904 UCS2903 WS2812 WS2852
- // S2812B SK6812 SK6822 APA106 PL9823 WS2811 WS2813 APA104 WS2811_40 GW6205 GW6205_40 LPD1886 LPD1886_8BIT
- // 4 wire (spi): LPD8806 WS2801 WS2803 SM16716 P9813 APA102 SK9822 DOTSTAR
- // For 3 wire led stripes line Neopixel/Ws2812, which have a data line, ground, and power, you just need to define DATA_PIN.
- // For led chipsets that are SPI based (four wires - data, clock, ground, and power), both defines DATA_PIN and CLOCK_PIN are needed
- // DATA_PIN, or DATA_PIN, CLOCK_PIN
- #define LED_PINS 6 // 3 wire leds
- //#define LED_PINS 6, 13 // 4 wire leds
- #define COLOR_ORDER RGB // colororder of the stripe, set RGB in hyperion
- #define OFF_TIMEOUT 15000 // ms to switch off after no data was received, set 0 to deactivate
- // analog rgb uni color led stripe - using of hyperion smoothing is recommended
- // ATTENTION this pin config is default for atmega328 based arduinos, others might work to
- // if you have flickering analog leds this might be caused by unsynced pwm signals
- // try other pins is more or less the only thing that helps
- #define ANALOG_OUTPUT_ENABLED false
- #define ANALOG_MODE ANALOG_MODE_LAST_LED // use ANALOG_MODE_AVERAGE or ANALOG_MODE_LAST_LED
- #define ANALOG_GROUND_PIN 8 // additional ground pin to make wiring a bit easier
- #define ANALOG_RED_PIN 9
- #define ANALOG_GREEN_PIN 10
- #define ANALOG_BLUE_PIN 11
- // overall color adjustments
- #define ANALOG_BRIGHTNESS_RED 255 // maximum brightness for analog 0-255
- #define ANALOG_BRIGHTNESS_GREEN 255 // maximum brightness for analog 0-255
- #define ANALOG_BRIGHTNESS_BLUE 255 // maximum brightness for analog 0-255
- #define BRIGHTNESS 255 // maximum brightness 0-255
- #define DITHER_MODE BINARY_DITHER // BINARY_DITHER or DISABLE_DITHER
- #define COLOR_TEMPERATURE CRGB(255,255,255) // RGB value describing the color temperature
- #define COLOR_CORRECTION TypicalLEDStrip // predefined fastled color correction
- //#define COLOR_CORRECTION CRGB(255,255,255) // or RGB value describing the color correction
- // Baudrate, higher rate allows faster refresh rate and more LEDs
- //#define serialRate 460800 // use 115200 for ftdi based boards
- #define serialRate 115200 // use 115200 for ftdi based boards
- //#define serialRate 500000 // use 115200 for ftdi based boards
- /**************************************
- A D A L I G H T C O D E
- no user changes needed
- **************************************/
- // Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
- uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;
- unsigned long endTime;
- // Define the array of leds
- CRGB leds[MAX_LEDS];
- // set rgb to analog led stripe
- void showAnalogRGB(const CRGB& led) {
- if (ANALOG_OUTPUT_ENABLED) {
- byte r = map(led.r, 0,255,0,ANALOG_BRIGHTNESS_RED);
- byte g = map(led.g, 0,255,0,ANALOG_BRIGHTNESS_GREEN);
- byte b = map(led.b, 0,255,0,ANALOG_BRIGHTNESS_BLUE);
- analogWrite(ANALOG_RED_PIN , r);
- analogWrite(ANALOG_GREEN_PIN, g);
- analogWrite(ANALOG_BLUE_PIN , b);
- }
- }
- // set color to all leds
- void showColor(const CRGB& led) {
- #if MAX_LEDS > 1 ANALOG_OUTPUT_ENABLED == false
- LEDS.showColor(led);
- #endif
- showAnalogRGB(led);
- }
- // switch of digital and analog leds
- void switchOff() {
- #if MAX_LEDS > 1 ANALOG_OUTPUT_ENABLED == false
- memset(leds, 0, MAX_LEDS * sizeof(struct CRGB));
- FastLED.show();
- #endif
- showAnalogRGB(leds[0]);
- }
- // function to check if serial data is available
- // if timeout occured leds switch of, if configured
- bool checkIncommingData() {
- boolean dataAvailable = true;
- while (!Serial.available()) {
- if ( OFF_TIMEOUT > 0 && endTime < millis()) {
- switchOff();
- dataAvailable = false;
- endTime = millis() + OFF_TIMEOUT;
- }
- }
- return dataAvailable;
- }
- // main function that setups and runs the code
- void setup() {
- Serial.begin(serialRate);
- // analog output
- if (ANALOG_OUTPUT_ENABLED) {
- // additional ground pin to make wiring a bit easier
- pinMode(ANALOG_GROUND_PIN, OUTPUT);
- digitalWrite(ANALOG_GROUND_PIN, LOW);
- pinMode(ANALOG_BLUE_PIN , OUTPUT);
- pinMode(ANALOG_RED_PIN , OUTPUT);
- pinMode(ANALOG_GREEN_PIN, OUTPUT);
- }
- int ledCount = MAX_LEDS;
- if (ANALOG_MODE == ANALOG_MODE_LAST_LED) {
- ledCount--;
- }
- #if MAX_LEDS > 1 ANALOG_OUTPUT_ENABLED == false
- FastLED.addLeds<LED_TYPE, LED_PINS, COLOR_ORDER>(leds, ledCount);
- #endif
- // color adjustments
- FastLED.setBrightness ( BRIGHTNESS );
- FastLED.setTemperature( COLOR_TEMPERATURE );
- FastLED.setCorrection ( COLOR_CORRECTION );
- FastLED.setDither ( DITHER_MODE );
- // initial RGB flash
- #if INITIAL_LED_TEST_ENABLED == true
- for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
- {
- showColor(CRGB(v,v,v));
- delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
- }
- for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
- {
- showColor(CRGB(v,v,v));
- delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
- }
- #endif
- showColor(CRGB(0, 0, 0));
- Serial.print("Ada\n"); // Send "Magic Word" string to host
- boolean transmissionSuccess;
- unsigned long sum_r, sum_g, sum_b;
- // loop() is avoided as even that small bit of function overhead
- // has a measurable impact on this code's overall throughput.
- for(;;) {
- // wait for first byte of Magic Word
- for (i = 0; i < sizeof prefix; ++i) {
- // If next byte is not in Magic Word, the start over
- if (!checkIncommingData() prefix != Serial.read()) {
- i = 0;
- }
- }
- // Hi, Lo, Checksum
- if (!checkIncommingData()) continue;
- hi = Serial.read();
- if (!checkIncommingData()) continue;
- lo = Serial.read();
- if (!checkIncommingData()) continue;
- chk = Serial.read();
- // if checksum does not match go back to wait
- if (chk != (hi ^ lo ^ 0x55)) continue;
- memset(leds, 0, MAX_LEDS * sizeof(struct CRGB));
- transmissionSuccess = true;
- sum_r = 0;
- sum_g = 0;
- sum_b = 0;
- int num_leds = min ( MAX_LEDS, (hi<<8) + lo + 1 );
- // read the transmission data and set LED values
- for (int idx = 0; idx < num_leds; idx++) {
- byte r, g, b;
- if (!checkIncommingData()) {
- transmissionSuccess = false;
- break;
- }
- r = Serial.read();
- if (!checkIncommingData()) {
- transmissionSuccess = false;
- break;
- }
- g = Serial.read();
- if (!checkIncommingData()) {
- transmissionSuccess = false;
- break;
- }
- b = Serial.read();
- leds[idx].r = r;
- leds[idx].g = g;
- leds[idx].b = b;
- #if ANALOG_OUTPUT_ENABLED == true && ANALOG_MODE == ANALOG_MODE_AVERAGE
- sum_r += r;
- sum_g += g;
- sum_b += b;
- #endif
- }
- // shows new values
- if (transmissionSuccess) {
- endTime = millis() + OFF_TIMEOUT;
- #if MAX_LEDS > 1 ANALOG_OUTPUT_ENABLED == false
- FastLED.show();
- #endif
- #if ANALOG_OUTPUT_ENABLED == true
- #if ANALOG_MODE == ANALOG_MODE_LAST_LED
- showAnalogRGB(leds[MAX_LEDS-1]);
- #else
- showAnalogRGB(CRGB(sum_r/MAX_LEDS, sum_g/MAX_LEDS, sum_b/MAX_LEDS));
- #endif
- #endif
- }
- }
- } // end of setup
- void loop() {
- // Not used. See note in setup() function.
- }
and here are my config files
// Automatically generated configuration file for Hyperion ambilight daemon
// Notice: All values are explained with comments at our wiki: wiki.hyperion-project.org (config area)
// Generated by: HyperCon (The Hyperion deamon configuration file builder)
// Created with HyperCon V1.03.3 (22.10.2017)
{
// DEVICE CONFIGURATION
"device" :
{
"name" : "MyHyperionConfig",
"type" : "adalight",
"output" : "/dev/ttyACM0",
"rate" : 115200,
"delayAfterConnect" : 0,
"colorOrder" : "rgb"
},
// COLOR CALIBRATION CONFIG
"color" :
{
"channelAdjustment" :
[
{
"id" : "default",
"leds" : "*",
"pureRed" :
{
"redChannel" : 255,
"greenChannel" : 0,
"blueChannel" : 0
},
"pureGreen" :
{
"redChannel" : 0,
"greenChannel" : 255,
"blueChannel" : 0
},
"pureBlue" :
{
"redChannel" : 0,
"greenChannel" : 0,
"blueChannel" : 255
}
}
],
"temperature" :
[
{
"id" : "default",
"leds" : "*",
"correctionValues" :
{
"red" : 255,
"green" : 255,
"blue" : 255
}
}
],
"transform" :
[
{
"id" : "default",
"leds" : "*",
"hsl" :
{
"saturationGain" : 1.0000,
"luminanceGain" : 1.0000,
"luminanceMinimum" : 0.0000
},
"red" :
{
"threshold" : 0.0000,
"gamma" : 2.5000
},
"green" :
{
"threshold" : 0.0000,
"gamma" : 2.5000
},
"blue" :
{
"threshold" : 0.0000,
"gamma" : 2.5000
}
}
],
// SMOOTHING CONFIG
"smoothing" :
{
"type" : "linear",
"time_ms" : 200,
"updateFrequency" : 20.0000,
"updateDelay" : 0
}
},
// NO V4L2 GRABBER CONFIG
// FRAME GRABBER CONFIG
"framegrabber" :
{
"width" : 64,
"height" : 64,
"frequency_Hz" : 10.0,
"priority" : 890
},
// BLACKBORDER CONFIG
"blackborderdetector" :
{
"enable" : true,
"threshold" : 0.0,
"unknownFrameCnt" : 600,
"borderFrameCnt" : 50,
"maxInconsistentCnt" : 10,
"blurRemoveCnt" : 1,
"mode" : "default"
},
// BOOTEFFECT CONFIG
"bootsequence" :
{
"color" : [0,0,0],
"effect" : "Rainbow swirl fast",
"duration_ms" : 3000,
"priority" : 700
},
// JSON SERVER CONFIG
"jsonServer" :
{
"port" : 19444
},
// PROTO SERVER CONFIG
"protoServer" :
{
"port" : 19445
},
// EFFECT PATH
"effects" :
{
"paths" :
[
"/storage/hyperion/effects",
"/usr/share/hyperion/effects"
]
},
// NO KODI CHECK CONFIG
// NO BOBLIGHT SERVER CONFIG
// NO JSON/PROTO FORWARD CONFIG
// LED CONFIGURATION
"leds" :
[
{
"index" : 0,
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 1,
"hscan" : { "minimum" : 0.9000, "maximum" : 0.9500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 2,
"hscan" : { "minimum" : 0.8500, "maximum" : 0.9000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 3,
"hscan" : { "minimum" : 0.8000, "maximum" : 0.8500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 4,
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 5,
"hscan" : { "minimum" : 0.7000, "maximum" : 0.7500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 6,
"hscan" : { "minimum" : 0.6500, "maximum" : 0.7000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 7,
"hscan" : { "minimum" : 0.6000, "maximum" : 0.6500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 8,
"hscan" : { "minimum" : 0.5500, "maximum" : 0.6000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 9,
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 10,
"hscan" : { "minimum" : 0.4500, "maximum" : 0.5000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 11,
"hscan" : { "minimum" : 0.4000, "maximum" : 0.4500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 12,
"hscan" : { "minimum" : 0.3500, "maximum" : 0.4000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 13,
"hscan" : { "minimum" : 0.3000, "maximum" : 0.3500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 14,
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 15,
"hscan" : { "minimum" : 0.2000, "maximum" : 0.2500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 16,
"hscan" : { "minimum" : 0.1500, "maximum" : 0.2000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 17,
"hscan" : { "minimum" : 0.1000, "maximum" : 0.1500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 18,
"hscan" : { "minimum" : 0.0500, "maximum" : 0.1000 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
},
{
"index" : 19,
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
}
],
"endOfJson" : "endOfJson"
}
Sorry for not using pastebin I couldn't figure out how to get it to work.
Thanks for the help!