Skocz do zawartości

Pomocna odpowiedź

Sześciany LED są na tyle popularne że ich budowa jest bardzo łatwa (ogromna ilość poradników pokazujących krok po kroku co zrobić) i przez to nudna 😕. Ponieważ wolę wymyślić coś samemu niż zbudować to co pojawiało się już wielokrotnie postanowiłem wykorzystać diody w inny sposób. Wpadłem na pomysł żeby było to coś związanego ze świętami i zdecydowałem się na gwiazdę 🌟.

Tak wygląda efekt końcowy:

IMG_20190112_123051.thumb.jpg.34023fc514cc0bbab3a4321e8993ffff.jpg

Prezentacja wideo

Budowa

Gwiazda składa się z 40 diod połączonych katodami tak, że tworzą kształt gwiazdy. Konstrukcja umieszczona jest na kartonowym szablonie.

IMG_20190112_115214.thumb.jpg.85140e7a084ab0c71e9cbb6ad0443c23.jpg

Do sterowania diodami użyłem 5 połączonych rejestrów przesuwnych 74HC595. Każdej diodzie odpowiada również jeden rezystor 1kΩ. Układ zlutowałem na płytce uniwersalnej. Gwiazda jest podłączona do układu za pomocą przewodów połączeniowych żeńsko-męskich. Nie wygląda to zbyt ładnie ale konstrukcję można szybko zdemontować a układu użyć do sterowania innymi rzeczami. W płytkę można również wpiąć 4 tranzystory i sterować 4 warstwami np. sześcianu led.

IMG_20190112_122811.thumb.jpg.d45b6a29b37d91ff7fd8bbbe2b2924c4.jpg

Obwód prezentuje się następująco:

LED_Star_schemat.thumb.png.89448ac772ef770b7f12262c94a6129b.png

Całością steruje Cytron Maker Uno.

IMG_20190112_120134.thumb.jpg.147852c302ad84837f49530e958af861.jpg

Podłączenie połączonych rejestrów przesuwnych

Rejestry łączymy w następujący sposób:

  • VCC i MR (10 pin rejestru) do 5V
  • GND i OE (13 pin rejestru) do GND
  • DS (14 pin rejestru) pierwszego rejestru do 11 pinu Cytrona
  • ST_CP (12 pin rejestru) wszystkich rejestrów do 10 pinu Cytrona
  • SH_CP (11 pin rejestru) wszystkich rejestrów do 12 pinu Cytrona
  • Q7" do pinu DS kolejnego rejestru
  • Q0 - Q7 do kolejnych diod

Oprogramowanie

Gwiazdą steruję wysyłając 5 bajtów (1 bajt dla każdego rejestru). Kolejne bity w przesłanym bajcie odpowiadają stanowi kolejnych wyjść rejestru. Trzeba pamiętać, że bajty są przekazywane między rejestrami w taki sposób, że pierwszy bajt trafia do ostatniego rejestru, drugi do przedostatniego itd.

Deklaracja pinów które będą użyte do komunikacji z rejestrami:

int latchPin = 10;
int clockPin = 12;
int dataPin = 11;

Do ustawiania stanu diod używam dwóch funkcji. Funkcja writeBytes wysyła po kolei otrzymane bajty. Bajty przekazujemy do funkcji jako tablicę liczb (wartość bajtu zapisana dziesiętnie) np. jeśli przekażemy do funkcji 5 wartości 255 wszystkie 40 diod zacznie się świecić ponieważ każdy rejestr otrzyma wartość 11111111.

void writeBytes(int bytes[], int numberOfBytes) {
	digitalWrite(latchPin, LOW);
	for(int i=0; i<numberOfBytes; i++) {
      		registerState[i] = bytes[i];
		shiftOut(dataPin, clockPin, MSBFIRST, bytes[i]);
	}
	digitalWrite(latchPin, HIGH);
}

Funkcja writePin jest prostsza w użyciu, wystarczy podać numer diody (w tym przypadku od 0 do 39) i stan diody (LOW/HIGH). Funkcja odpowiednio zaktualizuje wartości i je wyśle włączając lub wyłączając diodę o podanym numerze.

void writePin(int pin, bool state){
	int reg = pin / 8;
	int actualPin = pin - (8 * reg);

	digitalWrite(latchPin, LOW);
	for (int i=numOfRegisters; i>=0; i--) {
		if (i == reg){
			bitWrite(registerState[i], actualPin, state);
		}
		shiftOut(dataPin, clockPin, MSBFIRST, registerState[i]);
	}
	digitalWrite(latchPin, HIGH);
}

Z użyciem powyższych funkcji można już pisać różne efekty. Dla przykładu funkcja wypełniająca gwiazdę losowo wyglądają następująco:

void swap(int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
void effectJ(int d) {
	clear();
	int state[8*numOfRegisters];
	for(int i=0; i<8*numOfRegisters; i++) {
		state[i] = i;
	}
	int r;
	for(int i=8*numOfRegisters-1; i>0; i--) {
		r = random(0, i);
		swap(&state[i], &state[r]);
	}
	for(int i=0; i<8*numOfRegisters; i++) {
		writePin(state[i], HIGH);
		delay(d);
	}
}

Kompletny kod znajduje się w załączniku.

IMG_20190112_114955.jpg IMG_20190112_122719.jpg

Shift_Registers.rar

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Programista3, właśnie zaakceptowałem Twój opis, możesz go teraz zgłosić do akcji rabatowej umieszczając link w temacie zbiorczym. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 🙂

Udostępnij ten post


Link to post
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ę »

×