2015-04-27 1 views
0

Я пытаюсь работать с этим чипом:код для запуска Attiny85 с WS2812 интегрирован с RGB LED

https://www.adafruit.com/products/1655? ... fgodFpsAow + Attiny85

код я использую ниже, он отлично работает с Arduino, но не с Attiny85 (просто включается и остается между 2-х цветов зеленого и желтого). Есть идеи? Благодаря!

My ATtiny установлен в 8 МГц с потоком данных 800 КГц в библиотеке neopixel.h.

Код приведен ниже.

#include <Adafruit_NeoPixel.h> 
/* 
WS2811/Neopixel pattern switcher for ATtiny85 (and Arduino) 
Requires Adafruit NeoPixel Library 
WS2811 Signal, Digital Pin 4 
Button, Digital Pin 0 
GPL v3 
*/ 
/* 
shin:random pattern selector 
*/ 


// Define 
#define NUM_LEDS 1 //60LED per strip 
#define DATA_PIN 0 //output pin on ATTiny85 
#define BTN_PIN 1 //input pin on ATTiny85 
#define BTN_DELAY 250 //add delay for debounce 
#define NUM_PATTERNS 12 //patterns avail 
#define CTR_THRESH 16 

// Init Vars 
uint8_t j = 0; 
uint8_t pattern=1; 
uint8_t buttonState=0; 
uint8_t lastPix=0; 
uint8_t myPix=0; 
uint8_t direction=1; 
uint8_t counter=0; 
uint8_t colors[3]; 
uint32_t setColor=0; 
unsigned long mark; 

// Start Strip 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, DATA_PIN, NEO_GRB + NEO_KHZ800); 

void setup() { 
    //pinMode(BTN_PIN, INPUT);  
    randomSeed(BTN_PIN); 
    strip.begin(); 
    strip.show(); // Initialize all pixels to 'off' 
} 

void loop() { 
    // if button pressed, advance, set mark 
    //chkBtn(digitalRead(BTN_PIN)); 
    int rand = random(1,13);//1to12 
    // if pattern greater than #pattern reset 
    //if (pattern > NUM_PATTERNS) { pattern = 1; } 
    if (rand > NUM_PATTERNS) { pattern = 1; } 

    // choose a pattern 
    //pickPattern(pattern); 
    pickPattern(rand); 

    // set direction 
    if (direction == 1) { j++; } else { j--; } 

    if (j > 254) { direction = 0; } 
    if (j < 1) { direction = 1; } 

} 

/* pick a pattern */ 
void pickPattern(uint8_t var) { 
     switch (var) { 
     case 1: 
      // scanner, color and delay - RGB 
      scanner(strip.Color(255,0,0),50); 
      scanner(strip.Color(200,0,100),50); 
      scanner(strip.Color(64,0,200),50); 
     break; 
     case 2: 
      // color wipe random RGB 
      colorWipe(strip.Color(random(255), random(255), random(255)),50); 
     break; 
     case 3: 
      // color wave - Hue/Sat/Bright 
      // hue low (0-359), high (0-359),rate,extra delay 
      wavey(200,240,0.06,0); 
     break; 
     case 4: 
      // rainbow firefly, 1px at random 
      colorFirefly(60); 
      counter++; 
     break; 
     case 5: 
      // rainbow solid 
      rainbow(10); 
      counter++; 
     break; 
     case 6: 
      // bounce in and out 
      // tail len, counter, delay 
      bounceInOut(4,counter,20); 
      counter++; 
     break; 
     case 7: 
      // color wipe from center 
      colorWipeCenter(strip.Color(255,0,0),100); 
      colorWipeCenter(strip.Color(255,64,0),100); 
     break; 
     case 8: 
      // solid color 
      colorFast(strip.Color(255,0,0),0); 
     break; 
     case 9: 
      // fade even or odd 
      // 0-359 Hue value, even/odd, delay 
      fadeEveOdd(200,0,20); 
      fadeEveOdd(300,1,20); 
     break; 
     case 10: 
      // show rainbow 
      rainbowCycle(10); 
     break; 

    case 11: 
     // show rainbow 
     theaterChaseRainbow(50); 
     break; 

     case 12: 
     rainbowCycle2(20); 
     break; 
     } 
} 

/* check button state */ 
boolean chkBtn(int buttonState) { 
    if (buttonState == HIGH && (millis() - mark) > BTN_DELAY) { 
     j = 0; 
     mark = millis(); 
     pattern++; 
     return true; 
    } 
    else { return false; } 
} 

void colorFirefly(int wait) { 
     if(myPix != lastPix) { 
      if(counter<CTR_THRESH) { 
      float colorV = sin((6.28/30)*(float)(counter)) *255; 
      HSVtoRGB((359/CTR_THRESH)*counter, 255, colorV, colors); 
      strip.setPixelColor(myPix, colors[0], colors[1], colors[2]); 
      strip.show(); 
      delay(wait); 
      } else { 
      lastPix=myPix; 
      counter=0; 
      colorFast(0,0); 
      } 
     } else { 
      myPix=random(0,strip.numPixels()); 
     } 

} 

// Fill the dots one after the other with a color 
// Modified from Neopixel sketch to break on button press 

void colorWipe(uint32_t c, uint8_t wait) { 
    for(uint16_t i=0; i<strip.numPixels(); i++) { 
     if(chkBtn(digitalRead(BTN_PIN))) { break; } 
     strip.setPixelColor(i, c); 
     strip.show(); 
     delay(wait); 
    } 
} 

// color wipe from center 
void colorWipeCenter(uint32_t c, uint8_t wait) { 
    uint8_t mid=strip.numPixels()/2; 
    strip.setPixelColor(mid,c); 
    for(uint16_t i=0; i<=strip.numPixels()/2; i++) { 
     if(chkBtn(digitalRead(BTN_PIN))) { break; } 
     strip.setPixelColor(mid+i, c); 
     strip.setPixelColor(mid-i, c); 
     strip.show(); 
     delay(wait); 
    } 
} 

// fast version 
void colorFast(uint32_t c, uint8_t wait) { 
    for (uint16_t i = 0; i < strip.numPixels(); i++) { 
     strip.setPixelColor(i, c); 
    } 
    strip.show(); 
    delay(wait); 
} 

// Rainbow Cycle, modified from Neopixel sketch to break on button press 
void rainbowCycle(uint8_t wait) { 
    uint16_t i; 

    // for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel 
    for (i = 0; i < strip.numPixels(); i++) { 
     strip.setPixelColor(i, Wheel(((i * 256/strip.numPixels()) + j) & 255)); 
    } 
    strip.show(); 
    delay(wait); 
    // } 
} 

void rainbow(uint8_t wait) { 
    uint16_t i; 

    //for(j=0; j<256; j++) { 
    for (i = 0; i < strip.numPixels(); i++) { 
     strip.setPixelColor(i, Wheel((i + j) & 255)); 
    } 
    strip.show(); 
    delay(wait); 
    // } 
} 

// scanner 

void scanner(uint32_t c,uint8_t wait) { 
     for(int i=0; i< strip.numPixels(); i++) { 
      if(chkBtn(digitalRead(BTN_PIN))) { break; } 

      colorFast(0,0); 
      strip.setPixelColor(i,c); 
      strip.show(); 
      delay(wait); 
     } 
     for(int i=strip.numPixels(); i>0; i--) { 
      if(chkBtn(digitalRead(BTN_PIN))) { break; } 
      colorFast(0,0); 
      strip.setPixelColor(i,c); 
      strip.show(); 
      delay(wait); 
     }  
} 

// scanner to midpoint 
void bounceInOut(uint8_t num, uint8_t start,uint8_t wait) { 
    colorFast(0,0); 
    uint8_t color=200; 
    for(int q=0; q < num; q++) { 
    if(strip.numPixels()-start >= 0 && start < NUM_LEDS) { 
      strip.setPixelColor(start+q, strip.Color(0,color,0)); 
      strip.setPixelColor(strip.numPixels()-start-q, strip.Color(0,color,0)); 
     } 
    color=round(color/2.0); 
    strip.show(); 
    delay(wait); 
    } 
    if(counter > strip.numPixels()) { counter=0; } 
} 

void fadeEveOdd(int c1,byte rem,uint8_t wait) { 
       for(int j=0; j < CTR_THRESH; j++) { 
         for(int i=0; i< strip.numPixels(); i++) { 
         if(i % 2== rem) { 
          HSVtoRGB(c1,255,(255/CTR_THRESH)*j,colors); 
          strip.setPixelColor(i,colors[0],colors[1],colors[2]); 
         } 
         }   
         if(chkBtn(digitalRead(BTN_PIN))) { break; } 
         strip.show(); 
         delay(wait); 
       } 
       for(int j=CTR_THRESH; j >= 0; j--) { 
         for(int i=0; i< strip.numPixels(); i++) { 
         if(i % 2== rem) { 
          HSVtoRGB(c1,255,(255/CTR_THRESH)*j,colors); 
          strip.setPixelColor(i,colors[0],colors[1],colors[2]); 
         } 
         }    
        if(chkBtn(digitalRead(BTN_PIN))) { break; } 
         strip.show(); 
         delay(wait); 
       } 
} 

// twinkle random number of pixels 
void twinkleRand(int num,uint32_t c,uint32_t bg,int wait) { 
    // set background 
    colorFast(bg,0); 
    // for each num 
    for (int i=0; i<num; i++) { 
     strip.setPixelColor(random(strip.numPixels()),c); 
    } 
    strip.show(); 
    delay(wait); 
} 

// sine wave, low (0-359),high (0-359), rate of change, wait 
void wavey(int low,int high,float rt,uint8_t wait) { 
    float in,out; 
    int diff=high-low; 
    int step = diff/strip.numPixels(); 
    for (in = 0; in < 6.283; in = in + rt) { 
     for(int i=0; i< strip.numPixels(); i++) { 
      out=sin(in+i*(6.283/strip.numPixels())) * diff + low; 
      HSVtoRGB(out,255,255,colors); 
      strip.setPixelColor(i,colors[0],colors[1],colors[2]); 
     } 
      strip.show(); 
      delay(wait); 
      if(chkBtn(digitalRead(BTN_PIN))) { break; } 
    } 
} 

// sine wave, intensity 
void waveIntensity(float rt,uint8_t wait) { 
    float in,level; 
    for (in = 0; in < 6.283; in = in + rt) { 
     for(int i=0; i< strip.numPixels(); i++) { 
     // sine wave, 3 offset waves make a rainbow! 
     level = sin(i+in) * 127 + 128; 
     // set color level 
     strip.setPixelColor(i,(int)level,0,0); 
     } 
      strip.show(); 
      delay(wait); 
      if(chkBtn(digitalRead(BTN_PIN))) { break; } 
    } 
} 

// helpers 

uint32_t Wheel(byte WheelPos) { 
    if (WheelPos < 85) { 
     return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); 
    } else if (WheelPos < 170) { 
     WheelPos -= 85; 
     return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); 
    } else { 
     WheelPos -= 170; 
     return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); 
    } 
} 


// HSV to RGB colors 
// hue: 0-359, sat: 0-255, val (lightness): 0-255 
// adapted from http://funkboxing.com/wordpress/?p=1366 
void HSVtoRGB(int hue, int sat, int val, uint8_t * colors) { 
    int r, g, b, base; 
    if (sat == 0) { // Achromatic color (gray). 
     colors[0] = val; 
     colors[1] = val; 
     colors[2] = val; 
    } else { 
     base = ((255 - sat) * val) >> 8; 
     switch (hue/60) { 
     case 0: 
      colors[0] = val; 
      colors[1] = (((val - base) * hue)/60) + base; 
      colors[2] = base; 
      break; 
     case 1: 
      colors[0] = (((val - base) * (60 - (hue % 60)))/60) + base; 
      colors[1] = val; 
      colors[2] = base; 
      break; 
     case 2: 
      colors[0] = base; 
      colors[1] = val; 
      colors[2] = (((val - base) * (hue % 60))/60) + base; 
      break; 
     case 3: 
      colors[0] = base; 
      colors[1] = (((val - base) * (60 - (hue % 60)))/60) + base; 
      colors[2] = val; 
      break; 
     case 4: 
      colors[0] = (((val - base) * (hue % 60))/60) + base; 
      colors[1] = base; 
      colors[2] = val; 
      break; 
     case 5: 
      colors[0] = val; 
      colors[1] = base; 
      colors[2] = (((val - base) * (60 - (hue % 60)))/60) + base; 
      break; 
     } 

    } 
} 

//Theatre-style crawling lights with rainbow effect 
void theaterChaseRainbow(uint8_t wait) { 
    for (int j=0; j < 256; j++) {  // cycle all 256 colors in the wheel 
    for (int q=0; q < 3; q++) { 
     for (int i=0; i < strip.numPixels(); i=i+3) { 
      strip.setPixelColor(i+q, Wheel((i+j) % 255)); //turn every third pixel on 
     } 
     strip.show(); 

     delay(wait); 

     for (int i=0; i < strip.numPixels(); i=i+3) { 
      strip.setPixelColor(i+q, 0);  //turn every third pixel off 
     } 
    } 
    } 
} 
// Slightly different, this makes the rainbow equally distributed throughout 
void rainbowCycle2(uint8_t wait) { 
    uint16_t i, j; 

    for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel 
    for(i=0; i< strip.numPixels(); i++) { 
     strip.setPixelColor(i, Wheel(((i * 256/strip.numPixels()) + j) & 255)); 
    } 
    strip.show(); 
    delay(wait); 
    } 
} 
+0

Проблема является выбор времени немного обидчивый на кадр передачи данных. Я нашел в тестировании, что создание моего собственного битового кода с ошибкой в ​​c для обработки каждого 24-битного кадра достаточно быстро. Задержка защелки достаточно длинна, чтобы делать все виды кода, чтобы проверить и ввести следующий кадр. У меня есть код, который должен запускать 300 светодиодов со скоростью 60 кадров в секунду. У меня есть чердак в 16Mhz. – djUniversal

ответ

1

Привет всем спасибо за помощь. Я закончил это исправление. Смотрите ниже:

" Память было хорошо, я думаю, вы были правы, что тактовые частоты различны для Arduino и Attiny

Я закончил с использованием библиотеки найти здесь:..

https://github.com/cpldcpu/light_ws2812

Тогда я загрузил пример AVR. Я должен был скопировать библиотеку ws2812 в мой фактический код, как библиотека Arduino не смог найти библиотеку. После этого, что он, наконец, работал.
"

Спасибо за помощь! Dave

+0

Благодарим вас за ссылку на библиотеку, искали что-то для использования на ATTiny85 без оборудования SPI. – MoDu

0

Устранение неисправностей этих плат может быть очень сложным. Моя первоначальная мысль заключается в том, что у вас может быть нехватка памяти на ATtiny. Вы пробовали минимальный код с одной функцией анимации только для тестирования?

Кроме того, похоже, есть много больше активности по этой теме над на электротехническом Stack бирже:

https://electronics.stackexchange.com/questions/24269/checking-memory-footprint-in-arduino

https://electronics.stackexchange.com/questions/74872/memory-management-problems-with-attiny85

2

Другим решением является включение:

ifdef AVR 
include <avr/power.h> 
endif 

и изменить настройки:

#if defined (__AVR_ATtiny45__) 
    if (F_CPU == 8000000) clock_prescale_set(clock_div_1); 
    #endif 

код ниже:

// This is a demonstration on how to use an input device to trigger changes on your neo pixels. 
// You should wire a momentary push button to connect from ground to a digital IO pin. When you 
// press the button it will change to a new pixel animation. Note that you need to press the 
// button once to start the first animation! 

#include <Adafruit_NeoPixel.h> 
#ifdef __AVR__ 
#include <avr/power.h> 
#endif 
#define BUTTON_PIN 0 // Digital IO pin connected to the button. This will be 
          // driven with a pull-up resistor so the switch should 
          // pull the pin to ground momentarily. On a high -> low 
          // transition the button press logic will execute. 

#define PIXEL_PIN 4 // Digital IO pin connected to the NeoPixels. 

#define PIXEL_COUNT 8 

// Parameter 1 = number of pixels in strip, neopixel stick has 8 
// Parameter 2 = pin number (most are valid) 
// Parameter 3 = pixel type flags, add together as needed: 
// NEO_RGB  Pixels are wired for RGB bitstream 
// NEO_GRB  Pixels are wired for GRB bitstream, correct for neopixel stick 
// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) 
// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); 

bool oldState = HIGH; 
int showType = 0; 

void setup() { 
    // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket 
    #if defined (__AVR_ATtiny45__) 
    if (F_CPU == 8000000) clock_prescale_set(clock_div_1); 
    #endif 
    // End of trinket special code 

    pinMode(BUTTON_PIN, INPUT_PULLUP); 
    strip.begin(); 
    strip.show(); // Initialize all pixels to 'off' 
} 

void loop() { 
    // Get current button state. 
    bool newState = digitalRead(BUTTON_PIN); 

    // Check if state changed from high to low (button press). 
    if (newState == LOW && oldState == HIGH) { 
    // Short delay to debounce button. 
    delay(20); 
    // Check if button is still low after debounce. 
    newState = digitalRead(BUTTON_PIN); 
    if (newState == LOW) { 
     showType++; 
     if (showType > 9) 
     showType=0; 
     startShow(showType); 
    } 
    } 

    // Set the last button state to the old state. 
    oldState = newState; 
} 

void startShow(int i) { 
    switch(i){ 
    case 0: colorWipe(strip.Color(0, 0, 0), 50); // Black/off 
      break; 
    case 1: colorWipe(strip.Color(255, 0, 0), 50); // Red 
      break; 
    case 2: colorWipe(strip.Color(0, 255, 0), 50); // Green 
      break; 
    case 3: colorWipe(strip.Color(0, 0, 255), 50); // Blue 
      break; 
    case 4: theaterChase(strip.Color(127, 127, 127), 50); // White 
      break; 
    case 5: theaterChase(strip.Color(127, 0, 0), 50); // Red 
      break; 
    case 6: theaterChase(strip.Color( 0, 0, 127), 50); // Blue 
      break; 
    case 7: rainbow(20); 
      break; 
    case 8: rainbowCycle(20); 
      break; 
    case 9: theaterChaseRainbow(50); 
      break; 
    } 
} 

// Fill the dots one after the other with a color 
void colorWipe(uint32_t c, uint8_t wait) { 
    for(uint16_t i=0; i<strip.numPixels(); i++) { 
    strip.setPixelColor(i, c); 
    strip.show(); 
    delay(wait); 
    } 
} 

void rainbow(uint8_t wait) { 
    uint16_t i, j; 

    for(j=0; j<256; j++) { 
    for(i=0; i<strip.numPixels(); i++) { 
     strip.setPixelColor(i, Wheel((i+j) & 255)); 
    } 
    strip.show(); 
    delay(wait); 
    } 
} 

// Slightly different, this makes the rainbow equally distributed throughout 
void rainbowCycle(uint8_t wait) { 
    uint16_t i, j; 

    for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel 
    for(i=0; i< strip.numPixels(); i++) { 
     strip.setPixelColor(i, Wheel(((i * 256/strip.numPixels()) + j) & 255)); 
    } 
    strip.show(); 
    delay(wait); 
    } 
} 

//Theatre-style crawling lights. 
void theaterChase(uint32_t c, uint8_t wait) { 
    for (int j=0; j<10; j++) { //do 10 cycles of chasing 
    for (int q=0; q < 3; q++) { 
     for (int i=0; i < strip.numPixels(); i=i+3) { 
     strip.setPixelColor(i+q, c); //turn every third pixel on 
     } 
     strip.show(); 

     delay(wait); 

     for (int i=0; i < strip.numPixels(); i=i+3) { 
     strip.setPixelColor(i+q, 0);  //turn every third pixel off 
     } 
    } 
    } 
} 

//Theatre-style crawling lights with rainbow effect 
void theaterChaseRainbow(uint8_t wait) { 
    for (int j=0; j < 256; j++) {  // cycle all 256 colors in the wheel 
    for (int q=0; q < 3; q++) { 
     for (int i=0; i < strip.numPixels(); i=i+3) { 
     strip.setPixelColor(i+q, Wheel((i+j) % 255)); //turn every third pixel on 
     } 
     strip.show(); 

     delay(wait); 

     for (int i=0; i < strip.numPixels(); i=i+3) { 
     strip.setPixelColor(i+q, 0);  //turn every third pixel off 
     } 
    } 
    } 
} 

// Input a value 0 to 255 to get a color value. 
// The colours are a transition r - g - b - back to r. 
uint32_t Wheel(byte WheelPos) { 
    WheelPos = 255 - WheelPos; 
    if(WheelPos < 85) { 
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); 
    } 
    if(WheelPos < 170) { 
    WheelPos -= 85; 
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); 
    } 
    WheelPos -= 170; 
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); 
}