• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
WS2812B + enkoder do sterowania jasnością diód
#1
Witam, 
Proszę o wsparcię w dokończeniu programu uzupełniając go o możliwość sterowania enkoderem obrotowym jasnością diód programowalnych WS2812B. Coś próbowałem dodać jednak niestety brakuje mi już pomysłów na to jak można to dodać. Załączam projekt do UNO.


Załączone pliki
.zip   serce.final.ver1.zip (Rozmiar: 1.67 KB / Pobrań: 2)
 
Odpowiedź
#2
Jaki kurs Arduino skończyłeś?
 
Odpowiedź
#3
(13-11-2018, 20:07)kaczakat napisał(a): Jaki kurs Arduino skończyłeś?

Nie skonczyłem żadnego kursu Arduino, kiedyś w szkole programowałem uC AVR. Raczej bardzo amatorsko podchodzę do tenatu
 
Odpowiedź
#4
(13-11-2018, 19:15)przemek_t24 napisał(a): Witam, 
Proszę o wsparcię w dokończeniu programu uzupełniając go o możliwość sterowania enkoderem obrotowym jasnością diód programowalnych WS2812B. Coś próbowałem dodać jednak niestety brakuje mi już pomysłów na to jak można to dodać. Załączam projekt do UNO.

Pokaż te próby, bo jak na razie to liczba możliwych prób jest większa niż liczba atomów we Wrzechświecie. Przypuśćmy, ze znajda się chętni aby dać każdą możliwa odpowiedź, ile tryliandów lat będziesz potrzebował aby je wszystkie przeczytać?
Daruj sobie ZIP,linki,ipt, nikt na to nie bedzie marnował czasu. nie jest obowiązkiem forumowiczów rozpakowywać jakieś ZIPy. Wiem z praktyki,ze niktego nie bedzie robił. Umieść kod jak się należy!

Czytałeś inne posty zanim napisałeś swój?
Na 99,99% nie,a jeśli czytałeś,to bez zrozumienia, jak nie zrozumiałeś,to nawet gdy dostaniesz gotowca, nie dasz rady tergo skompilować.
 
Odpowiedź
#5
(13-11-2018, 20:23)es2 napisał(a):
(13-11-2018, 19:15)przemek_t24 napisał(a): Witam, 
Proszę o wsparcię w dokończeniu programu uzupełniając go o możliwość sterowania enkoderem obrotowym jasnością diód programowalnych WS2812B. Coś próbowałem dodać jednak niestety brakuje mi już pomysłów na to jak można to dodać. Załączam projekt do UNO.

Pokaż te próby, bo jak na razie to liczba możliwych prób jest większa niż liczba atomów we Wrzechświecie. Przypuśćmy, ze znajda się chętni aby dać każdą możliwa odpowiedź, ile tryliandów lat będziesz potrzebował aby je wszystkie przeczytać?
Daruj sobie ZIP,linki,ipt, nikt na to nie bedzie marnował czasu. nie jest obowiązkiem forumowiczów rozpakowywać jakieś ZIPy. Wiem z praktyki,ze niktego nie bedzie robił. Umieść kod jak się należy!

Czytałeś inne posty zanim napisałeś swój?
Na 99,99% nie,a jeśli czytałeś,to bez zrozumienia, jak nie zrozumiałeś,to nawet gdy dostaniesz gotowca, nie dasz rady tergo skompilować.

Wstawiam poprawnie kod. Ja rozumiem że napewno jesteście dużo bardziej doświadczeni jeżeli chodzi o programowanie dlatego proszę o wyrozumiałość ale też nie jestem kompletnym tumanem Wink
Kod:
#include <Adafruit_NeoPixel.h>

#ifdef __AVR__
#include <avr/power.h>
#endif

//*********************************KONFIGURACJA***********************************

#define PIN 2
#define DIODE_COUNT 25
#define JASNOSC 50

//*********************************INICJALIZACJA**********************************

Adafruit_NeoPixel strip = Adafruit_NeoPixel(DIODE_COUNT, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
#if defined (__AVR_ATtiny85__)
 if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif

 strip.begin();
 strip.show(); // WYGASZA WSZYSTKIE DIODY
 strip.setBrightness(JASNOSC);
}

//*******************************PĘTLA EFEKTÓW************************************

void loop() {

    colorWipe(strip.Color(127, 0, 0), 80); // Wypełnienie na czerwono
    delay (50);
    colorWipe(strip.Color(0, 127, 0), 80); // Wypełnienie na zielono
    delay (50);
    colorWipe(strip.Color(0, 0, 127), 80); // Wypełnienie na niebiesko
    delay (50);
    colorWipe(strip.Color(127,127 , 127), 80); // Wypełnienie na biało
    delay (50);
    rainbow(40); // Efekt teczy ver.1
    theaterChaseRainbow(120); // Przemiatanie teczy
    rainbowCycle(30); // Efekt Fade - tecza ver.2
    theaterChase(strip.Color(127, 0, 0), 100); // Przemiatanie czerowne
    theaterChase(strip.Color(0, 127, 0), 100); // Przemiatanie zielone
    theaterChase(strip.Color(0, 0, 127), 100); // Przemiatanie niebieskie
    colorWipe_re(strip.Color(127, 0, 0), 80); // Odworcone wypełnienie czerwone
    delay (50);
    colorWipe_re(strip.Color(0, 127, 0), 80); // Odwrocone wypełnienie zielone
    delay (50);
    colorWipe_re(strip.Color(0, 0, 127), 80); // Odwrocone wypełnienie niebieskie
    delay (50);
    rainbowCycle_re(40); // Odwrocony Fade
    random_RGB(40); // Random
    colorWipe_re(strip.Color(0, 0, 0), 80); // CLEAR
    delay (35);    
}

//**********************************FUNKCJE**************************************

// 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 colorWipe_re(uint32_t c, uint8_t wait) {
 for (uint16_t i = strip.numPixels(); i > 0; i--) {
   strip.setPixelColor(i - 1, 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);
 }
}
void rainbow_re(uint8_t wait) {
 uint16_t i, j;

 for (j = 255; 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 * 3; j++) { // 3 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 rainbowCycle_re(uint8_t wait) {
 uint16_t i, j;

 for (j = 255; j < 256 * 3; j--) { // 3 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 < 2; q++) {
     for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
       strip.setPixelColor(i + q, c);  //turn every third pixel on
     }
     strip.show();

     delay(wait);

     for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
       strip.setPixelColor(i + q, 0);      //turn every third pixel off
     }
   }
 }
}
void random_RGB(uint8_t wait){
for (int j = 0; j < 5; j++){  
 for(int i=0;i<DIODE_COUNT;i++){

// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
//I used the random number generator with input random(min,max)
//to select random RGB values between 0-255
   strip.setPixelColor(i, strip.Color(random(0,255),random(0,255),random(0,255)));

   strip.show(); // This sends the updated pixel color to the hardware.

   delay(wait); // Delay for some random period of time (in milliseconds), between 100 milliseconds and 1 second.

   }
 }
}
//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 < 2; q++) {
     for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
       strip.setPixelColor(i + q, Wheel( (i + j) % 127)); //turn every third pixel on
     }
     strip.show();

     delay(wait);

     for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
       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);
}

//********************************************KONIEC***********************************
 
Odpowiedź
#6
Ja tez jestem amatorem, kurs znajdziesz tu: https://forbot.pl/blog//kurs-arduino-pod...rsu-id5290 . Wystarczy zainstalować bibliotekę do encodera i powiązać jego działanie ze zmienną odpowiedzialną za jasność LED. Zmień sobie "#define JASNOSC 50" na zmienną o zakresie zgodnym z tym jakie jasność może przybierać wartości. 
Zauważ też, że kurs ma dwie części.
 
Odpowiedź
#7
No widzę, że kolega otrzymał wsparcie od naszych przodowników pomagania.
Teraz, jak już ochłonąłeś z nadmiaru pomagactwa, zrób jako piszę.
Ściągnij sobie bibliotekę Rotary, i w swoim projekcie dopisz parę linijek kodu.
Musisz zmienić pin, pod który podpiąłeś pasek z diodami. INT2, oraz INT3 obsługują przerwania sprzętowe i będzie to nam potrzebne. Podepnij więc swój enkoder pod piny 2 i 3.
Na samym początku, na górze wpisz

Kod:
#include <rotary.h>

Dołączysz wtedy bibliotekę obsługi enkodera.
Teraz stworzymy obiekt klasy Rotary.

Kod:
Rotary enkoder = Rotary(2,3); // enkoder to nazwa własna i możesz ten obiekt nazwać jak chcesz.

Instrukcję 
Kod:
strip.setBrightness(JASNOSC);
przenieś do funkcji loop();
Napiszemy też funkcję obsługi przerwania od enkodera.
To znaczy, gdy obrócisz pokrętłem, na INT2 podany zostanie impuls, który zatrzyma wykonywany program i zacznie wykonywać program obsługi przerwania.

Kod:
ISR(PCINT2_vect) {
  unsigned char result = enkoder.process();
  if (result) {
        if (result == DIR_CW) JASNOSC++;
        else JASNOSC--;
        if (JASNOSC >=255) JASNOCS=255;
        if (JASNOSC <=0) JASNOSC=0;
        }
 }

I powinno być dobrze.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
@Robson, jeśli post wygląda tak: "kolega wchodzi na forum remontowe, pokazuje zdjęcie pędzla z google-grafika i prosi o dokończenie malowania pokoju, bo sam nigdy tego nie robił" to raczej nie ma tłumu w kolejce (nawet amatorów jak ja) by umówić się o której mogą podjechać ze swoimi narzędziami i materiałami. Ja tam co najwyżej mogę zaproponować fotkę wzorków, które akurat użyłem w podobnym pokoju, poradę by wcześniej zagruntował i zwykle link do miejsca, gdzie można zdobyć podstawy malowania. Czasami nawet podjadę jak mam nieprzetestowany szprej i namaluję jakieś jaja na ścianie dla próby Big Grin (choć to rzadko pomaga).
Mam nadzieję, że się nie obraził tylko przerabia kurs i wróci dopytać o to czego nie zrozumiał.
 
Odpowiedź
#9
A Ty kolego nie obraź się na mnie.
Po prostu przeanalizowałem sobie profil członków naszego zacnego forum i wyszło mi, że jeśli kolega pytacz prosi o wsparcie polegające na dopisaniu paru linijek kodu, to jeśli ktoś ma ochotę napisać tych parę linijek bez uszczerbku na swoim ego, to niech napisze.
Z merytorycznego punktu widzenia, pewnie wartość zerowa, ale nie na tym polega idea Arduino.
Większość młodzieży nie zdaje sobie sprawy, że każdy błyskawiczny sukces wymaga co najmniej kilkunastu lat przygotowań, ale nie jest to pretekst do zniechęcania ich w realizacji swych marzeń.
Prędzej czy później natrafią na ścianę, ale niech będą choć trochę na nią przygotowani.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#10
Ścianą,to jest WS2812 i AVRmega/tiny.

Wszystkie biblioteki jakie widziałem dla Arduino, doWS2812, są blokujące i nadają się tylko do zabawy z niewielką ilością LED albo gdy poza sterowaniem LED-am, nie jest robione praktycznie nic.

Da się to zrobić na UART, wywołując przerwania blisko 300tysięcy razy na sekundę a stosując pewną sztuczkę połowę tego ale 16MHz to za mało. Wymagane min to 18MHz a wskazane 20.Nawet przy 20MHz z wstawkami ASM obciążenie jest bardzo duże i pojawi się kolejna ściana, jak dobrze zrealizować przerwania od innych USART jeśli są potrzebne.
Da się ale jest przy tym dużo roboty:
https://youtu.be/h2RKAJZdVl4
https://youtu.be/aM9hy4EpleY
https://youtu.be/hBovo7Y0fRY
Jak widać, można dekodować DMX, nie tracąc przy tym ramek, sterować nawet 1500led i w tym samym czasie nadawać DMX. Niestety, łatwo nie jest i nie polecam tego robić, bo wstawki ASM, dobra znajomość C, to raczej nie dla początkującego. Lepiej wziąć coś z DMA (XMEGA, ARM) i jest łatwo i przyjemnie.

Nie wspominam o użyciu SPI, bo jest zdecydowanie gorsze od USART i to z kilku powodów, natomiast I2C,w AVR, nie nadaje się do WS2812.

Tak jak nieporozumieniem jest obsługa na AVR LCD 320x240 kolor 16-bit lub większych bez akceleratora (np FT8xx), czy Fat na uC z 2kB RAM, tak i WS2812 na AVR.
Arduino IDE, z tego co czytam w EP 10 i11/2018, wspiera już ARM w sensowny sposób. Należałoby, do poważniejszych zadań, używać ARM, które przeważnie, w lepszych od AVR konfiguracjach, są tańsze od AVR. Co do szybkości, ARM, przy tym samym zegarze co AVR, jest ok 7 razy szybszy. Max zegar AVR,to 20MHz, ARM, zależnie od rodziny, 48, 72, 80, 100MHz (pomija bardziej wypasione 200 czy 600MHz a nawet więcej). Najwolniejszy więc,48MHz ARM, jest szybszy, od najszybszego AVR ok 17 razy, 100MHz ARM ok 35 razy,do tego, niektóre serie, mają FPU. Fakt, ze "zdolni" Arduinowcy, zabiją każda szybkość, przez delay, czy
Kod:
while( przycisk ):
Najwolniejszy ARM, używając DMA, obciąża CPU ok 2% podczas sterowania WS2812, w AVR, używając USART i przerwań, przy 20MHz, obciążenie ok 90%. Niewielka różnica ?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości