INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(
Witam!
Chciałbym przedstawić wam mój projekt świecącej kostki z LED-ów. Jest to mój pierwszy projekt z wykorzystaniem mikrokontrolera AVR, a także mój pierwszy artykuł. To tyle ze słów wstępu przejdę do opisu projektu.
Potrzebne jest:
- Atmega8
- 27 diod dyfuzyjnych niebieskich
- 9 rezysorów 82 Ohm
- 3 rezystory 4,7 kOhm
- 3 tranzystory BC557B
- stabilizator 7805
- kondensator do stabilizatora 100uF lub inny
- kondensatro 100nF
- złacze IDE10 albo goldpiny
- dodatkowo jakis włacznik, podstawka 28DIP do Atmega8
Ja jeszcze użyłem opornika 10 kOhm i microswitch do resetu, który okazał się zbędny.
Schemat
Opis
piny P1-P9 – tu bedą podłączone anody diod(po 3 w słupku)
piny K1-K3 – tu będą podłączone katody diod(po 9 w poziomie)
P10 – podłączenie z programatora
Schemat płytki tu: Płytka, ale jak ktoś potrzebował plików do jakiś zmian, proszę pisać.
Montaż LED-ów
Żeby sobie ułatwić pracę dobrze sobie przygotować deskę, w której powiercimy otwory na diody.
Bierzemy 9 diod zaginamy katody i lutujemy ze sobą(ma nam powstać coś takiego jak na rysunku). Do tego dolutujemy kabelek, który podłączymy do pinu K. Wykonujemy takich 3.
Zostało nam połączyć te trzy takie razem. Lutujemy je anodami i powstaje mam kostka z LED- ów. Montujemy to do płytki i wlutowujemy wspomniane kabelki z poszczególnych poziomów tak jak na ostatnim rysunku.
Program
#define F_CPU 1000000UL #include "avr/io.h" #include "avr/delay.h" #define Led(kod) PORTB = kod #define Led_9 PORTD |= 16 #define P_1 PORTD = (1<<5)|(1<<6) #define P_2 PORTD = (1<<5)|(1<<7) #define P_3 PORTD = (1<<6)|(1<<7) #define P_FULL PORTD = 195 #define powtorz(co, i) \ ile=i;\ while(1)\ { \ co; \ ile--; \ if(!ile) \ break; \ } void mruganie_po_kolei(); void gwiazda(); void walec_bok(); void walec_gora(); void walec_przod(); void wlaczajaca_kostka(); void matrix(); int main(void) { DDRB |= 0xFF; DDRD |= (1<<2) | (1<<5) | (1<<3) | (1<<4); int ile; while(1) { mruganie_po_kolei(); powtorz(matrix(), 15); wlaczajaca_kostka(); powtorz(walec_bok, 3); gwiazda(); powtorz(walec_przod(), 2); powtorz(gwiazda(), 3); powtorz(walec_gora(), 4); powtorz(matrix(), 10); powtorz(walec_przod(), 3); powtorz(gwiazda(), 5); mruganie_po_kolei(); } return 0; } void gwiazda() { P_2; Led(16); _delay_ms(75); short int time=0; while(1) { time++; P_1; Led(16); P_2; Led(186); _delay_us(10); P_3; Led(16); if(time == 6000) break; } time = 0; while(1) { time++; P_1; Led_9; Led(255); P_2; Led_9; Led(255); P_3; Led_9; Led(255); if(time == 5000) break; } } #include <stdlib.h> void matrix() { static unsigned char srand_value; srand_value++; srand(srand_value); char tab[3]; tab[0] = rand(); tab[1] = rand(); tab[2] = rand(); char led[3]; led[0] = rand()%2; led[1] = rand()%2; led[2] = rand()%2; short int time = 0; while(1) { Led(0); P_1; Led(tab[0]); if(led[0]) Led_9; _delay_us(10); Led(0); P_2; Led(tab[1]); if(led[1]) Led_9; _delay_us(10); Led(0); P_3; Led(tab[2]); if(led[2]) Led_9; time++; if(time>2000) break; } } void mruganie_po_kolei() { #define TIME 50 P_1; Led(1);_delay_ms(TIME); Led(2);_delay_ms(TIME); Led(4);_delay_ms(TIME); Led(8);_delay_ms(TIME); Led(16);_delay_ms(TIME); Led(32);_delay_ms(TIME); Led(64);_delay_ms(TIME); Led(128);_delay_ms(TIME); P_2; Led(1);_delay_ms(TIME); Led(2);_delay_ms(TIME); Led(4);_delay_ms(TIME); Led(8);_delay_ms(TIME); Led(16);_delay_ms(TIME); Led(32);_delay_ms(TIME); Led(64);_delay_ms(TIME); Led(128);_delay_ms(TIME); P_3; Led(1);_delay_ms(TIME); Led(2);_delay_ms(TIME); Led(4);_delay_ms(TIME); Led(8);_delay_ms(TIME); Led(16);_delay_ms(TIME); Led(32);_delay_ms(TIME); Led(64);_delay_ms(TIME); Led(128);_delay_ms(TIME); #undef TIME } void walec_bok() { P_1; Led(56); _delay_ms(100); P_2; Led(7); _delay_ms(100); P_3; Led(56); _delay_ms(100); P_2; Led_9; Led(192); _delay_ms(100); } void walec_przod() { P_1; Led(146); _delay_ms(100); P_2; Led(73); _delay_ms(100); P_3; Led(146); _delay_ms(100); P_2; Led_9; Led(36); _delay_ms(100); } void walec_gora() { P_FULL; Led(128); _delay_ms(100); P_FULL; Led(32); _delay_ms(100); P_FULL; Led(2); _delay_ms(100); P_FULL; Led(8); _delay_ms(100); } void wlaczajaca_kostka() { short int time=0; while(1) { time++; if(time<4000) { P_1;Led(4); _delay_us(10); Led(0); time += 4; } else { if(time<8000) { Led(0); P_1; Led(4); _delay_us(10); Led(0); P_2; Led(16); } else { if(time<12000) { P_1; Led(5); _delay_us(10); Led(0); P_2; Led(16); _delay_us(10); Led(0); P_3; Led_9; } else { if(time<16000) { Led(0); P_1; Led(5); Led_9; _delay_us(10); Led(0); P_2; Led(16); _delay_us(10); Led(0); P_3; Led(68); Led_9; } else { if(time<20000) { Led(0); P_1; Led(69); Led_9; _delay_us(10); Led(0); P_2; Led(16); _delay_us(10); Led(0); P_3; Led(69); Led_9; } else return; } } } } } }
INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(
Jak dla mnie, bez programu jest to kilka obrazków pokazujących jak zlutować diody razem aby wyszedł sześcian… z nie wiadomo po co potrzebnym mikrokontrolerem. I popracuj trochę nad stylem pisania.
Dokładnie – instruktaż bez dziaającego kodu jest tylko pokazaniem jak zlutować LEDy razem – także poprosimy o działający kod ;)
A ja mam jeszcze takie pytanko – w jakim programie zrobiony został ten ładny schemacik?
Pozdrawiam
Schemat został wykonany w KiCad, a jeśli o kod źródłowy to mam ale nie wiem jak go umieścić, gdyż wyszedł bardzo długi.
Wysokość bloku z kodem możesz ograniczyć zaznaczając tą opcję:
Może dało by radę ustawić to ograniczenie jako domyślną opcję?
Jak ja publikowałem artykuł to też się trochę naszukałem jak zwinąć kod, a dużo osób tego wcale nie robi…
W sumie masz rację. Ustawiłem, żeby domyślnie było maksymalnie 500px wysokości :)
Jaki to język ? Arduino processing czy C++ ??
C zwykle
To nie wgram tego przez arduino IDE?
Powinno przez Arduino IDE się wgrać.
Dlaczego 7905 a nie 7805?
Stabilizator 7905 daje napięcie ujemne. Jesteś pewien, że nie użyłeś 7805?
Rzeczywiście, już poprawiam
Zrobiłeś mi smaka żeby zrobić 4x4x4 ew 8x8x8 :D