Maszyna losująca na Dzień Nauczyciela » Gembcior.pl

Maszyna losująca na Dzień Nauczyciela

14 października był Dzień Nauczyciela i z tej okazji skonstruowałem skromny upominek który przyda sie każdemu nauczycielowi. Pomyślcie przez chwile przed jak trudnym zadaniem nauczyciele staja każdego dnia. Musza z pośród trzydziestu paru uczniów wybrać jednego ochotnika który przyjdzie do odpowiedzi. I tu z pomocą spieszy mój wynalazek. Zaprojektowałem specjalną maszynkę która losuje jeden numer do odstrzału. Dzięki temu nauczyciele już nigdy więcej nie będą musieli wybierać tylko zdadzą się na zdarzenie losowe.

Jak to działa?

Zabawka sterowana jest mikrokontrolerem ATmega8. Kondensatory C1 oraz C2 filtrują napięcia dla mikrokontrolera. Wyświetlacz LED podłączony został do portów mikrokontrolera przez rezystory ograniczające prąd. Całość potrzebuje zasilania 5V w moim przypadku są to 3 baterie LR03. Schemat ideowy znajduje się poniżej:

Maszynka copy

Trochę bardziej skomplikowany jest program napisany w języku Bascom AVR odpowiedzialny za losowanie przedstawiony poniżej:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
$regfile = "m8def.dat" 'ATmega8
$crystal = 1000000

Config Portc = B1110011
Portc = B0111100
Config Portb = B1011110
Portb = B11111111
Config Portd = Output
Portd = B11111111

Config Timer0 = Timer , Prescale = 1
Config Timer2 = Timer , Prescale = 8
On Timer0 Przerwanie
On Timer2 Przerwanie2
Enable Interrupts

Dim Numer As Byte
Dim Numer2 As Byte
Dim Licznik As Byte
Dim Waz As Byte
Dim Stan_portu As Byte
Dim Stan_portu2 As Byte
Dim A As Byte
Load Timer0 , 100
Load Timer2 , 100
Waz = 0

Portc.5 = 1
Portc.4 = 1
Portd.0 = 0 'Animacja startowa
Waitms 300
Portd.1 = 0
Waitms 300
Portd.2 = 0
Waitms 300
Portd.3 = 0
Waitms 300
Portd.4 = 0
Waitms 300
Portd.5 = 0
Waitms 100
For A = 1 To 4
Portd = B11000000
Waitms 250
Portd = B11111111
Waitms 250
Next A

Do
Portc.5 = 1
Portc.4 = 1

If Pinb.6 = 0 Then 'Losowanie
Portd = 255
Enable Timer0
Enable Timer2
Do
If Pinb.6 = 1 Then
Disable Timer0
Disable Timer2
Exit Do
End If
Loop
Portd = 255
Waitms 100
Stan_portu = Lookup(numer , Ledlcd)
Stan_portu2 = Lookup(numer2 , Ledlcd2)
Do
Portc.5 = 1
Portc.4 = 0
Portd = Stan_portu
Waitms 10
Portc.5 = 0
Portc.4 = 1
Portd = Stan_portu2
Waitms 10
If Pinb.6 = 0 Then
Exit Do
Elseif Pinb.0 = 0 Then
Exit Do
End If
Loop
End If

Portc.5 = 1
Portc.4 = 1

If Pinb.0 = 0 Then 'Funkcja dodatkowa
Portd = 255
Enable Timer0
Enable Timer2
Do
If Pinb.0 = 1 Then
Disable Timer0
Disable Timer2
Exit Do
End If
Loop
Portd = 255
Waitms 100
Do
Portc.5 = 1
Portc.4 = 0
Portd = B11111001
Waitms 10
Portc.5 = 0
Portc.4 = 1
Portd = B11111001
Waitms 10
If Pinb.0 = 0 Then
Exit Do
Elseif Pinb.6 = 0 Then
Exit Do
End If
Loop
End If
Loop

Przerwanie: 'Przerwanie
Load Timer0 , 100
Incr Numer
If Numer = 11 Then Numer = 0
Incr Licznik
If Licznik = 255 Then 'Część odpowiedzialna za wyświetlanie węża podczas losowania
Licznik = 0
Incr Waz
If Waz = 6 Then
Portd.5 = 1
Waz = 0
End If
Portd.waz = 0
Waz = Waz - 1
Portd.waz = 1
Waz = Waz + 1
End If
Return

Przerwanie2:
Load Timer2 , 100
Incr Numer2
If Numer2 = 4 Then Numer2 = 0

Return

Ledlcd:
Data B11000000 , B11111001 , B10100100 , B10110000 , B10011001 , B10010010 , B10010010 , B10000010 , B11111000 , B10000000 , B10010000 ,
Ledlcd2:
Data B11000000 , B11111001 , B10100100 , B10110000 ,

Nie będę opisywał działania całego programu skupie się na kilku najważniejszych fragmentach. Pierwszy przedstawiony poniżej

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Do
If Pinb.6 = 0 Then
Portd = 255
Enable Timer0
Enable Timer2
Do
If Pinb.6 = 1 Then
Disable Timer0
Disable Timer2
Exit Do
End If
Loop
Portd = 255
Waitms 100
Stan_portu = Lookup(numer , Ledlcd)
Stan_portu2 = Lookup(numer2 , Ledlcd2)
Do
Portc.5 = 1
Portc.4 = 0
Portd = Stan_portu
Waitms 10
Portc.5 = 0
Portc.4 = 1
Portd = Stan_portu2
Waitms 10
If Pinb.6 = 0 Then
Exit Do
Elseif Pinb.0 = 0 Then
Exit Do
End If
Loop
End If

odpowiedzialny jest za obsługę przycisku. W momencie wciśnięcia przycisku S1 Portb.6 zwierany jest z masą w tedy wyświetlacz zostaje wyczyszczony oraz następuje odblokowanie przerwania do Timer0 i Timer2 w których losowane są liczby. Następnie program wchodzi w pętlę nieskończoną z której wyjdzie w momencie zwolnienia przycisku S1. Przed wyjściem przerwanie Timer0 i Timer2 jest blokowane. Po wyjściu z pętli znowu zostaje wyczyszczony wyświetlacz po czym wyświetlana zostaje wylosowana liczba na wyświetlaczu. Drugim ważnym fragmentem do omówienia jest wnętrze przerwania.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Przerwanie1:
Load Timer0 , 100
Incr Numer
If Numer = 11 Then Numer = 0
Incr Licznik
If Licznik = 255 Then
Licznik = 0
Incr Waz
If Waz = 6 Then
Portd.5 = 1
Waz = 0
End If
Portd.waz = 0
Waz = Waz - 1
Portd.waz = 1
Waz = Waz + 1
End If
Return

Przerwanie2:
Load Timer2 , 100
Incr Numer2
If Numer2 = 4 Then Numer2 = 0

Przerwanie1 odpowiedzialne jest za losowanie liczby jedności a Przerwanie2 za liczbę dziesiątek. Na początku przerwania załadowywana jest nowa wartość 100 do licznika Timer. Następnie zachodzi zwiększenie wartości zmiennej Numer. Kolejna instrukcja zapobiega przekroczeniu zakresu losowanych liczb i w momencie przekroczenia ustawia wartość na 0. Pozostałe instrukcje odpowiedzialne są za dodatkowy efekt świetlny podczas losowania.

Zaprojektowałem także płytkę PCB widoczną poniżej:

W mojej gotowej już wersji PCB był mały błąd którego nie wykryłem na etapie projektu na szczęście udało się go w ławy sposób naprawić. Na stronie zamieszczam projekt PCB już z poprawionym błędem więc nie ma się czym przejmować.

Całość umieściłem w plastikowej obudowie Z-76 zakupionej na allegro. Szybkę wyciąłem z pudełka na płytę CD na którą nakleiłem folię do przyciemniania szyb w samochodzie. Automa losuje numery z przedziału od 0 do 39 ale po drobnej modyfikacji można zwiększyć zakres do 99. Maszynka zawiera jeszcze jeden dodatkowy przycisk który wykonuję specjalnie zaprojektowaną funkcję dla wychowawczyni mojej klasy. Po wciśnięciu przycisku S2 losowany jest zawsze ten sam numer “ulubionego” ucznia mojej wychowawczyni. Losowany numer można łatwo zmienić w programie.

Wykaz elementów:

8x 470 Ohm
1x 100nF
1x 10uF
2x Tact Switch
1x ATmega8
1x Wyświetlacz 7 segmentowy podwójny, ja użyłem FYD-5621FE

Prezent został wręczony w imieniu całej klasy i okazał się bardzo udany, wszystkim się spodobał. Poniżej galeria i krótki film prezentujący działanie maszynki.

Pobierz:

Załączniki Wielkość
PCB Termotransfer 16,0kb
PCB – Montaż 27,5kb
Program-wsad 1,99kb
Maszyna losująca na Dzień Nauczyciela
Ocena: 5 (2 głosów)

0 Komentarzy

Dodaj komentarz

*

*

Ile jest * Time limit is exhausted. Please reload CAPTCHA.

banner

Korzystając z tej strony wyrażasz zgodę na korzystanie z plików cookie. Zobacz szczegóły

Wykorzystujemy pliki cookie do spersonalizowania treści i reklam, aby oferować funkcje społecznościowe i analizować ruch w naszej witrynie. Informacje o tym, jak korzystasz z naszej witryny, udostępniamy partnerom społecznościowym, reklamowym i analitycznym. Więcej informacji znajdziesz na Jak Google wykorzystuje dane gromadzone podczas korzystania z witryn i aplikacji naszych partnerów.

Zamknij