Skocz do zawartości

Kurs STM32L4 – #15 – diody RGB WS2812B (liczniki), quiz


Komentator

Pomocna odpowiedź

Kurs STM32L4 – #15 – diody RGB WS2812B (liczniki), quiz

Sterowane cyfrowo diody RGB to elementy, które spotyka się w coraz większej liczbie urządzeń. Są one wygodne dla konstruktorów, bo wymagają tylko jednego pinu mikrokontrolera. Komunikacja z diodami WS2812B wymaga jednak precyzji. Idealnie sprawdzą się tutaj liczniki, dzięki którym wygenerujemy odpowiednie sygnały.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Link do komentarza
Share on other sites

Przypominamy: w komentarzach do kursów rozmawiamy wyłącznie na tematy związane z konkretnym kursem. Mile widziane są również informacje od osób, które korzystały wcześniej z naszych poradników. Wszystko po to, aby kursanci, którzy mają zamiar korzystać z tego kursu nie musieli "przedzierać" się przez dziesiątki postów na inne tematy. Tematy na pytanie, które nie są związane z kursem można zadawać na naszym forum o mikrokontrolerach.

Link do komentarza
Share on other sites

Zachęcam do lektury kolejnej części kursu - tym razem o znanych i lubianych diodach RGB, dzięki którym każdy projekt może zyskać mnóstwo kolorów. Oczywiście diody były tutaj głównie pretekstem do tego, aby pokazać jak (w kolejny sposób) wykorzystać uniwersalne liczniki!

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@michal1210 witam na Forbocie i dziękuję z miłe słowa - cieszę się, że kurs się podoba! Życzę udanych eksperymentów, w razie ewentualnych pytań pisz śmiało na forum 🙂

Link do komentarza
Share on other sites

Muszę przyznać, że totalnie zgłupiałem. Zrobiłem wszystko zgodnie z instrukcjami (kod kopiuj-wklej etc.). A diody zachowują się bardzo dziwnie. A konkretnie, linijka diod czasami zapomina o diodzie numer 0. Żeby znaleźć przyczynę tej usterki zmodyfikowałem kod funkcji main() (wszystko inne pozostawiłem tak samo). Teraz wygląda on tak:

  ws2812b_init();
  HAL_Delay(1000);
  ws2812b_set_color(0, 32, 0, 0);
  ws2812b_set_color(1, 0, 32, 0);
  ws2812b_set_color(2, 0, 0, 32);

  while (1)
  {
	  ws2812b_update();
	  HAL_Delay(250);

Czyli spodziewane zachowanie to: wszystkie diody gasną na sekundę, potem zapalają się trzy pierwsze: czerwona, zielona i niebieska, a potem sytuacja ta się już nie zmienia. Niestety, zamiast tego diody dziwnie mrugają. Żeby ustalić czy to nie jest wina posiadanej przeze mnie linijki, podpiąłem równolegle drugą linijkę spodziewając że będzie się zachowywać jak pierwsza. Efekt jest taki, że druga linijka ma podobny problem, ale mrugnięcia są zupełnie losowe i nie są zsynchronizowane z pierwszą linijką.  

Wygląda to tak: 

 

Na wideo resetuję układ. Jak widać ws2812b_init() nie wyłącza diody 0, ale gaśnie ona przy którymś kolejnym wywołaniu ws2812b_update(), potem zapala się na czerwono i już się nie zmienia. Niestety nie mam oscyloskopu, żeby sprawdzić dokładnie jak wygląda sygnał. Czy ktoś wie z czego może wynikać takie zachowanie?

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć, mam taki problem. Wywołanie funkcji HAL_TIM_PWM_Start_DMA nie powoduje u mnie zmiany wypełnienia sygnału PWM, cały czas jest stan niski. Czy ktoś mógłby mi coś doradzić jak to rozwiązać?

Link do komentarza
Share on other sites

@Gieneq wyszła z tego bardzo ciekawa sytuacja, bo dopiero za 3 próbą tworzenia projektu, kiedy zmieniłem wersję firmware na V1.17.0, wszystko zaczęło działać. Co jeszcze ciekawsze, kiedy wróciłem na V1.17.2 też już wszystko działało, więc w sumie nawet nie dowiedziałem się co było przyczyną.

Link do komentarza
Share on other sites

Dnia 19.12.2021 o 13:21, adamnar napisał:

Witam. Rozwiązałem problem. Program funkcjonuje poprawnie po zmienieniu linijki 

  led_buffer[RESET_LEN + 24 * LED_N] = 100;

na

  led_buffer[RESET_LEN + 24 * LED_N] = 0;

 

Natknąłem się na ten sam problem z linjką - działała niedeterministycznie. Twoje rozwiązanie również mi pomogło. Zakładam, że może to być różnica w konkretnym modelu urządzenia, skoro autorowi kursu to działało w wersji przedstawionej w artykule i nikt inny nie zgłaszał tego problemu, ale może i tak warto dodać o tym informację wewnątrz tekstu - ja sobie przez jakiś czas włosy wyrywałem, nie wiedząc o co chodzi.

Oczywiście pomijając tę niedogodność podnoszę wszystkie kończyny na cześć tego cyklu. Nie natknąłem się nigdy na tak świetny kurs programowania mikrokontrolerów, a może nawet na tak dobry kurs programowania w ogóle 😀

  • Lubię! 2
Link do komentarza
Share on other sites

@rafaljuziu dziękuję za zgłoszenie - sprawdzimy to, aby mieć pewność, że to nie jest jakiś inny błąd.

16 minut temu, rafaljuziu napisał:

Nie natknąłem się nigdy na tak świetny kurs programowania mikrokontrolerów, a może nawet na tak dobry kurs programowania w ogóle 😀

Nawet nie wiesz jak miło czytać takie opinie, dziękuję 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć, mam pytanie odnośnie tego fragmentu. 

static void set_byte(uint32_t pos, uint8_t value)
{
	int i;
	for(i = 0; i < 8; i++)
	{
		if(value & 0x80)
		{
			led_buffer[pos + i] = BIT_1_TIME;
		} else
		{
			led_buffer[pos + i] = BIT_0_TIME;
		}
		value <<= 1;
	}


}

"Jeśli najwyższy bit jest ustawiony na 1, to wstawiamy do tablicy wartość BIT_1_TIME, a w przeciwnym przypadku BIT_0_TIME."

Pytanie brzmi, jak najwyższy bit może być ustawiony na 1 skoro wcześniej w funkcji init ustawialiśmy wszystkie bity dla diod na 0? 

Wszystko mi działa tylko nie rozumiem tego fragmentu. 

Dziękuję z góry za odpowiedź.

Link do komentarza
Share on other sites

3 godziny temu, Kenny napisał:

Pytanie brzmi, jak najwyższy bit może być ustawiony na 1 skoro wcześniej w funkcji init ustawialiśmy wszystkie bity dla diod na 0? 

@Kenny witam na forum 🙂 Który dokładnie fragment masz na myśli? Funkcja set_byte jest używana przez funkcję ws2812b_set_color, gdzie podawane są różne wartości (tam na podstawie numeru diody obliczane są konkretne wartości).

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.