Snow Fall

co i jak zrobiłem...
Awatar użytkownika
ElSor
Site Admin
Posty: 5041
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

Na schemacie jest dosyc powazny blad OUT z U1 jest podlaczone z - AtTiny26 a powinno byc podlaczone z +. :wink:
To tylko dla tych co chca to zlutowac a nie maja za bardzo pojecia o elektronice.
Awatar użytkownika
swietlik
Posty: 489
Rejestracja: sobota 22 lis 2008, 22:39
Lokalizacja: Gdańsk

Post autor: swietlik »

ElSor pisze:Na schemacie jest dosyc powazny blad OUT z U1 [...]
Miałeś na myśli U2 ?

Ale i tak 100pkt. za spostrzegawczość.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Dziękuję Panowie

Błąd poważny :oops:
Już poprawiłem na schemacie, sam się zastanawiam po co tak zaplątałem te połączenia..... :roll:


No to ciąg dalszy zmagań. Dziś udało mi się wyskoczyć z pracy przed czasem i zakupiłem 20 białych LEDów. Wymiana z zielonych (bo takie były) potrwała chwilę i przyszedł czas na testy oprogramowania. I tu zaczęły się problemy, jednak nie dorosłem jeszcze do pełnego wykorzystania przerwań :oops: , trzeba się więc było posiłkować innym rozwiązaniem.
Ale to już widać z listingu....

Dim A As Byte
Dim B As Word At $61
Dim B1 As Byte At $61 Overlay
Dim B2 As Byte At $62 Overlay
Dim C As Bit
Dim D As Byte
Config Porta = Output
Config Pinb.4 = Output
Config Pinb.5 = Output

Do
B = 65535 'załadowanie jedynek czyli wygaszenie wszystkich LEDów
C = 0
For A = 1 To 5 '5 to liczba spadających LEDów

For D = 1 To 200 '200 ustala szybkość spadania
Gosub Wysw
Next D

Shift B , Left 'przesuwanie LEDów o 1 pozycję
Next A

For A = 1 To 17
For D = 1 To 200
Gosub Wysw
Next D

Shift B , Left 'przesuwanie LEDów o 1 pozycję
B = B + 1 ' po przesunięciu trzeba zapełnić puste pole, sterowanie zerem
Next A

Wait 1 'przerwa pomiędzy kolejnymi spadami
Loop

Wysw:
If C = 1 Then Goto Wysb2
Reset Portb.5 'wyświetlanie młodszego bajtu
Set Portb.4

Porta = B1
C = 1
Goto Koniec

Wysb2:
Reset Portb.4 'wyświetlanie starszego bajtu
Set Portb.5

Porta = B2
C = 0

Koniec:
Waitms 1
Return

End


Tak wygląda pacjent podczas pracy:
Obrazek

Oj nakabelkowałem się tym razem ;) Ale jakoś poszło.


Mały filmik jak to działa:
http://www.youtube.com/watch?v=Ze7ODEfh_T0

Niestety przeskoków nie udało się uniknąć przy 16 LEDach, ale z odległości 2 -3 m już jest to mało zauważalne, przy 32 już przeskakiwanie zaniknie. Dobrym sposobem na uzyskanie płynności jest też maksymalne zbliżenie LEDów do siebie.
W układaniu LEDów pomagał mi syn, więc prosta to ta linijka to nie jest ;) z drugiej strony, to płatki śniegu nie lecą prosto jak deszcz :lol:

Na koniec wsady BIN i HEX

Na dziś tyle.
Pozdrawiam
Załączniki
SnowFall16.rar
(995 Bajtów) Pobrany 17 razy
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Saul
Posty: 36
Rejestracja: czwartek 10 gru 2009, 23:59
Lokalizacja: Lubuskie

Post autor: Saul »

Moim zdaniem gdybyś puścił ten śnieg dwa razy szybciej to byłby jeszcze lepszy efekt. Bez sterowania jasnością to jednak duży wpływ na płynność ruchu ma jego prędkość. Im szybciej tym lepiej. Ale wiadomo, bez przesady. :smile:
Czy planujesz włożyć układ w jakąś obudowę i za okno albo na choinkę?
Awatar użytkownika
Bulba
Posty: 331
Rejestracja: środa 06 sie 2008, 10:36
Lokalizacja: Łódź

Post autor: Bulba »

Popieram, 50 do 100% szybciej i bedzie gitara :)
My definition is High Definition.
Bledy w pisowni sa celowe, zamierzone i chronione prawami autorskimi.
Uzywanie podobnych bledow jest zakazane i bezprawne ®
Awatar użytkownika
Fluxor
Posty: 2549
Rejestracja: wtorek 16 gru 2008, 12:17
Lokalizacja: Opole

Post autor: Fluxor »

Mozna zrobic tak zeby pierwsze i ostatnie diody, z tych ktore sie pala mialy mniejsza jasnosc od reszty?
http://specjalistycznyspecjalista.blogspot.com/
POST MOŻE ZAWIERAĆ LOKOWANIE PRODUKTU
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Myślałem już wcześniej o zwiększeniu prędkości, ale w końcu to ma być śnieg. :roll:
Ale zrobiłem próbę i dwukrotne zwiększenie prędkości, dobrze wpłynęło na płynność ruchu.
teraz spadanie trwa około 2s
Właśnie przeglądałem Youtube i zauważyłem, że te "fabryczne" zasuwają dużo szybciej od mojego, od 1s do 2,5s, czyli nie jest źle.

Dodałem w załączniku zmianę czasu spadania na około 2s

Pozdrawiam

PS: Fluxor, niestety aktualnie to przekracza moje możliwości programistyczne, a rozwiązanie układowe.... chciałem żeby było jak najtaniej

PPS: Czy robić wersję softu na 32 LED?
Załączniki
Snow Fall 16 2s.rar
(994 Bajtów) Pobrany 16 razy
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
swietlik
Posty: 489
Rejestracja: sobota 22 lis 2008, 22:39
Lokalizacja: Gdańsk

Post autor: swietlik »

Nie bawiąc się w PWM można na przykład coś w tym stylu:

Dim Ba As Word At $61
Dim Ba1 As Byte At $61 Overlay
Dim Ba2 As Byte At $62 Overlay

Dim Bb As Word At $63
Dim Bb1 As Byte At $63 Overlay
Dim Bb2 As Byte At $64 Overlay

w jednej zmiennej (np. Ba) trzymamy wzorzec dla diod świecących na 100% a w Bb to samo plus dodatkowe zero przed i za wzorcem.

(czyli przykładowo:
1111 1111 1111 0011
1111 1111 1110 0001)

a w procedurze wyświetlającej wystawiać na port naprzemiennie Ba1 z Bb1 i Ba2 z Bb2).

W ten sposób wiodąca i kończąca dioda będą miały 'prawie jak PWM' 50%
Przesuwamy obie zmienne, oczywiście.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Próbowałem takiej metody, lecz te 50% jest niewystarczające, myślę, że dopiero 25% mogło by się okazać OK, ale to spowodowało znaczny rozrost procedur wyświetlających, oraz wprowadzania danych.
Łatwo by się dało wprowadzać dane przy wykorzystaniu 4 bajtowych liczb, bo zamiast samych jedynek, można by wprowadzić jako startowe podane przez Ciebie, ale wtedy stracimy możliwość starowania 32 LEDów, zostanie max 24.
Chyba, że wystarczą 24 sztuki to powrócę do tej koncepcji, tylko z mniejszym wypełnieniem.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
swietlik
Posty: 489
Rejestracja: sobota 22 lis 2008, 22:39
Lokalizacja: Gdańsk

Post autor: swietlik »

Pyra pisze:Próbowałem takiej metody, lecz te 50% jest niewystarczające, myślę, że dopiero 25% mogło by się okazać OK, ale to spowodowało znaczny rozrost procedur wyświetlających, oraz wprowadzania danych.
Ależ nie, żaden rozrost. Dla 50% wyświetlasz naprzemiennie bajty. Dla 33% wyświetlasz jeden raz bajt 'wiodący' i dwa razy bajt 'główny'. Dla 25%....

Napisałem generator przebiegu i zrobiłem próbne uruchomienie na PC.

Oto wynikowy przebieg (jeden pełny cykl dla 4 diod):

Kod: Zaznacz cały

u1[1]=11111111 u1[0]=11111110 u2[1]=11111111 u2[0]=11111111
u1[1]=11111111 u1[0]=11111100 u2[1]=11111111 u2[0]=11111110
u1[1]=11111111 u1[0]=11111000 u2[1]=11111111 u2[0]=11111100
u1[1]=11111111 u1[0]=11110000 u2[1]=11111111 u2[0]=11111000
u1[1]=11111111 u1[0]=11100000 u2[1]=11111111 u2[0]=11110000
u1[1]=11111111 u1[0]=11000000 u2[1]=11111111 u2[0]=11100001
u1[1]=11111111 u1[0]=10000001 u2[1]=11111111 u2[0]=11000011
u1[1]=11111111 u1[0]=00000011 u2[1]=11111111 u2[0]=10000111
u1[1]=11111110 u1[0]=00000111 u2[1]=11111111 u2[0]=00001111
u1[1]=11111100 u1[0]=00001111 u2[1]=11111110 u2[0]=00011111
u1[1]=11111000 u1[0]=00011111 u2[1]=11111100 u2[0]=00111111
u1[1]=11110000 u1[0]=00111111 u2[1]=11111000 u2[0]=01111111
u1[1]=11100000 u1[0]=01111111 u2[1]=11110000 u2[0]=11111111
u1[1]=11000000 u1[0]=11111111 u2[1]=11100001 u2[0]=11111111
u1[1]=10000001 u1[0]=11111111 u2[1]=11000011 u2[0]=11111111
u1[1]=00000011 u1[0]=11111111 u2[1]=10000111 u2[0]=11111111
u1[1]=00000111 u1[0]=11111111 u2[1]=00001111 u2[0]=11111111
u1[1]=00001111 u1[0]=11111111 u2[1]=00011111 u2[0]=11111111
u1[1]=00011111 u1[0]=11111111 u2[1]=00111111 u2[0]=11111111
u1[1]=00111111 u1[0]=11111111 u2[1]=01111111 u2[0]=11111111
u1[1]=01111111 u1[0]=11111111 u2[1]=11111111 u2[0]=11111111
u1[1]=11111111 u1[0]=11111111 u2[1]=11111111 u2[0]=11111111
a to kod źródłowy:

Kod: Zaznacz cały

#define	DIODY 		4
#define	CYKLE  		(16 + DIODY + 1)

union {
	short int	bity;
	unsigned char	bajt[2];
} u1, u2;


char* bits(char* cp, unsigned char c)		// uslugowa - tylko do testu na PC
{
	unsigned char mask = 1;

	for &#40;int i=1; i<=8; i++&#41; &#123;
		cp&#91;8-i&#93; = &#40;c & mask&#41; ? '1' &#58; '0';
		mask <<= 1;
	&#125;

	cp&#91;8&#93; = '\0';

	return cp;
&#125;


void wyswietl&#40;void&#41;                      // tez postac uslugowa do testu na PC
&#123;
	char a&#91;9&#93;, b&#91;9&#93;, c&#91;9&#93;, d&#91;9&#93;;

	// testowo tu tylko bajty na ekran, docelowo bajty na porty naprzemiennie&#58; z u1 i u2

	printf&#40;"u1&#91;1&#93;=%s u1&#91;0&#93;=%s u2&#91;1&#93;=%s u2&#91;0&#93;=%s\n",
		bits&#40;a, u1.bajt&#91;1&#93;&#41;, 
		bits&#40;b, u1.bajt&#91;0&#93;&#41;, 
		bits&#40;c, u2.bajt&#91;1&#93;&#41;, 
		bits&#40;d, u2.bajt&#91;0&#93;&#41;&#41;;
	fflush&#40;stdout&#41;;
	return;
&#125;


void snowfall&#40;void&#41;
&#123;
	while&#40;1&#41; &#123;				            // a snieg pada i pada i pada ...
		u1.bity = u2.bity = 0xffff;

		for&#40;int cykl = 0; cykl <= CYKLE; ++cykl&#41; &#123;
			if &#40;cykl == 0&#41; &#123;
				u1.bity <<= 1;
			&#125;
			if &#40;cykl > 0 && cykl <= DIODY&#41; &#123;
				u1.bity <<= 1;
				u2.bity <<= 1;
			&#125;
			if &#40;cykl == DIODY+1&#41; &#123;
				u1.bity <<= 1;
				u2.bity <<= 1;
				u2.bity += 1;
			&#125;
			if &#40;cykl > DIODY+1&#41; &#123;
				u1.bity <<= 1;
				u1.bity += 1;
				u2.bity <<= 1;
				u2.bity += 1;
			&#125;

			wyswietl&#40;&#41;;		// tu wyjscie na porty
		&#125;

		//sleep&#40;random&#40;20&#41;&#41;; 		// przypadkowa drzemka po każdym cyklu
	&#125;
	return;
&#125;


int main&#40;int argc, char* argv&#91;&#93;&#41; 
&#123;
	snowfall&#40;&#41;;
	return 0;
&#125;
kompilować trzeba z flagą (opcją kompilatora) włączającą standard C99:

Kod: Zaznacz cały

gcc -Wall -std=c99 snowfall.c -o snowfall
albo wyrzucić deklarację zmiennych licznikowych poza pętle.

Przepraszam, że nie w BASCOMie, ale nie znam :oops:
Ostatnio zmieniony piątek 18 gru 2009, 11:09 przez swietlik, łącznie zmieniany 2 razy.
Saul
Posty: 36
Rejestracja: czwartek 10 gru 2009, 23:59
Lokalizacja: Lubuskie

Post autor: Saul »

Idąc Waszym tropem zrobiłem próbną wersję z ośmioma poziomami jasności. Na razie na 8 czerwonych LEDach, ale efekt jest ciekawy nawet przy powolnym przejściu. Jutro dokupię LEDów i zobacze co dalej bo na razie się zastanawiam jak to zmultipleksować przynajmniej x2 :| Chyba, że jakąś dużą Atmegę zaprząc do pracy? Choć to chyba przerost formy nad treścią :roll:
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

swietlik - wiesz co, w wolnej chwili zabiorę się chyba za to rozwiązanie ponownie, posiedzę nad optymalizacją kodu i może będzie OK.
A ja niestety tylko BASCOM, no nie mam talentu do języków ;)

Saul - Ciekaw jestem efektu, to by wyszło prawie jak analogowe.

Wczoraj uruchomiłem wersję z czasem spadania około 2s i stwierdziłem, że nie jest źle, więc trochę lenistwo zwyciężyło .... :oops:

Muszę się Wam przyznać, że od jakiegoś czasu w mej głowie kiełkuje pomysł rozwiązania analogowego, ale cały czas pracuję na maksymalnym uproszczeniem układu.
Aktualnie jest tak, że na jedną diodę przypada tranzystor, rezystor i kondensator. Potrzebny jest tylko dodatkowy układ wyzwalający impulsy startowe.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Saul
Posty: 36
Rejestracja: czwartek 10 gru 2009, 23:59
Lokalizacja: Lubuskie

Post autor: Saul »

Pyra pisze:Saul - Ciekaw jestem efektu, to by wyszło prawie jak analogowe.
Wczoraj kupiłem 32 żółte (były najtańsze :wink:) diody 5mm i zacząłem rozbudowywać układ. Kombinowałem z całkowicie płynnymi przejściami, ale się okazało, że przy większych prędkościach spadku to i tak prawie nie ma wpływu na wrażenie płynności ruchu, zostawiłem więc 8 poziomów jasności. Na razie udało mi się uruchomić układ z 24 LEDami, ale z większą ilością uC też powinien sobie poradzić. Do sterowania użyłem Attiny2313.
W niektórych "profesjonalnych" wersjach snowfall zauważyłem, że ruch śnieżynki jest przyspieszony, a na końcu zostaje punkt, który stopniowo przygasa dając wrażenie, że śnieżynka po upadku topnieje. Próbowałem zrobić to samo, i coś niecoś z tego wyszło. Cała linijka 24-diodowa ma ok. 13,5cm, ale diody są gęsto upakowane więc myślę, że można by z tego zrobić parę cm więcej bez utraty efektu. W sklepowych konstrukcjach na długości 13,5cm jest 18 LEDów, a na długości 16,5cm dają 20szt.

Pod spodem filmik:
[youtube]http://www.youtube.com/watch?v=pVHjbPIU-Bo[/youtube]
Awatar użytkownika
Fluxor
Posty: 2549
Rejestracja: wtorek 16 gru 2008, 12:17
Lokalizacja: Opole

Post autor: Fluxor »

Gratulacje, zaczyna wygladac jak oryginal.
http://specjalistycznyspecjalista.blogspot.com/
POST MOŻE ZAWIERAĆ LOKOWANIE PRODUKTU
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Saul - rewelacja :o
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
ODPOWIEDZ