Znajdywacz słów

Program wydawać się może, że bardziej przydatny byłby krzyżowkowiczowi, niż elektronikowi-hobbyście, ale pozory mylą. Jak wiadomo, na wyświetlaczach 7-segmentowych możemy nie tylko przedstawiać cyfry, ale także coś, co wygląda jak litery. Znalazłem na Wikipedii spis wszystkich możliwych kombinacji segmentów i sporządziłem na tej podstawię listę liter, które można wyświetlić na prostym wyświetlaczu: ABCDEFGHIJLŁNOPRSUYZ. Zaciekawiło mnie ile słów mogę zbudować z tak ograniczonej puli.

Napisałem zatem program, który bada listę istniejących słów pod kątem występowania w niej dozwolonych liter. Użyłem listy PWN-u, pod adresem http://www.sjp.pl/slownik/po.phtml. Ma ona kodowanie windows-1250, ale możemy użyć każdej innej, np. w UTF-8 - ważne, żeby miała po prostu zapisane słowo pod słowem (żadnych przecinków, tabulatorów itp.). Listę wynikowych słów program zapisuje do pliku (bo może ich być bardzo dużo).

Program jest w wersji konsolowej dla Windows. Wymaga .NET 4.0, ale pewnie jest on już zainstalowany w Twoim komputerze.

Z kopytka powstaje toyota i 73 inne słowa.

Oto lista parametrów, wyciągnięta z pomocy:

findwords -d PlikSłownika -l ListaLiter [-e Kodowanie] [-o PlikWyjściowy]
Gdzie:
-d: ścieżka do pliku słownika, gdzie każde słowo jest w kolejnej linii
-l: lista liter, podana jednym ciągiem
-e: kodowanie słownika (w formie takiej, jak wpisuje się w HTML, np. UTF-8).
    Jeśli nie podano, Windows-1250 - typowe kodowanie listy słów PWN-u
-o: ścieżka do pliku wyjściowego.
    Jeśli nie podano, zostanie użyta nazwa słowa.txt

np.
findwords -d słowa-win.txt -e UTF-8 -l ABCDEFGHIJLNOPSUYZ
          -o "%HOMEDRIVE%%HOMEPATH%\Desktop\7segment.txt"

Program operuje równolegle na wszystkich możliwych procesorach, więc wyszukiwanie słów odbywa się całkiem szybko - zwykle to kilka-kilkanaście sekund. Podsumowując, wynik eksperymentu trochę mnie zawstydził - ja przez minutę potrafiłem wymyślić jedynie kilka słów, które da się ułożyć z tych liter, a komputer znalazł ich kilkadziesiąt tysięcy i to w 8 sekund :D Tak więc aplikację uznaję za przydatną.

Link do programu:
http://www.mediafire.com/?84g1c1dj905jz7b

Link do list słów autorstwa PWN:
http://www.mediafire.com/?d0bq97g7rcbulq3

Nazwa brzmi dość groźnie, ale to nieskomplikowane urządzenie, którego zadaniem jest przy jak najmniejszych stratach utrzymać stały prąd w obwodzie wyjścia, niezależnie od obciążenia i napięcia wejściowego.

Trochę teorii

Po co to i dlaczego? Otóż do zasilania mocnych diod LED, które można znaleźć w nowoczesnych latarkach. To niezawodne i wydajne źródła światła, ale jest jeden haczyk, bo powinny być zasilane stałym prądem. Do klasycznej latarki wkładamy zwykle 2 paluszki, które dają w miarę stałe napięcie 3V, które zasila żarówkę. Dlaczego w przypadku diod ten patent by się nie sprawdził? Otóż wszystkie diody mają bardzo stromą charakterystykę. Powoli zwiększając napięcie, trafimy w końcu na taki punkt, w którym pobierany prąd gwałtowanie podskoczy. Wystarczy, że nasze bateria będą miały o 0.1V więcej, aby prąd podskoczył o kilkadziesiąt mA, uszkodzi cenną diodę. Dlatego lepiej patrzeć na prąd, niż starać się precyzyjnie wyregulować napięcie, które waha się z egzemplarza na egzemplarz i w dodatku zależy jeszcze od temperatury.

Jak to się robi? Na 2 sposoby - liniowo i impulsowo. Regulator (stabilizator) liniowy to złożona z 2-3 elementów prosta konstrukcja, oparta np. układzie LM317, która zachowuje się jak "inteligentny rezystor", zmieniając swą oporność tak, aby w obwodzie płynął stały, ustalony prąd. Dzieje się to poprzez spadek napięcia na wewnętrznym tranzystorze, którego nadmiar wydziela się w postaci ciepła. Zatem przy zasilaniu trzywatowej diody o napięciu przewodzenia ~3V prądem 1A z akumulatora 12V będziemy mieć do wytracenia aż 9W ciepła. Sprawność takiego układu wynosi 3V / 12V = 25%. Bardzo słabo. Ale może przynajmniej na nim coś usmażyć.

Problem sprawności rozwiązują przetwornice impulsowe. W liniowych elementem wykonawczym jest mocny tranzystor, którego stopień otwarcia ustala płynący prąd i to na nim odbywa się spadek napięcia i wytracanie energii w postaci ciepła. W przetwornicy impulsowej też znajdziemy tranzystor, ale pracuje on w inny sposób - w pełni otwiera się i zamyka kilkadziesiąt tys. razy na sekundę, a regulacja napięcia odbywa się poprzez dobór stosunku czasu otwarcia do zamknięcia. Skąd taki dziwny pomysł? Otóż jak wiadomo tranzystor w stanie przewodzenia generuje bardzo mały spadek napięcia (typ. 0.2V, max. 1V), więc grzeje się dużo, dużo mniej, niż gdyby był otwarty do połowy.

Jednak pojawia się tu mały problem - taki układ wytwarzałby prąd zmienny o przebiegu prostokątnym, niezbyt zdatny do zasilania czegokolwiek poza żarówką. Aby temu zaradzić, szeregowo montuje się cewkę, która stanowi magazyn energii w momencie, kiedy tranzystor wykonawczy jest zamknięty. Typowo dodaje się też szybką diodę półprzewodnikową, aby zabezpieczyć obwody przetwornicy przed impulsem napięcia o odwrotnej polaryzacji, pojawiającym się w momencie wyłączenia cewki, a także kondensator, dodatkowo wygładzający napięcie wyjściowe. Cały proces włączania i wyłączania cewki odbywa się kilkadziesiąt tys. razy na sekundę, więc  efekt zlewa się w stabilny prąd stały, który może zasilać nie tylko diody, ale nawet wrażliwe mikrokontrolery.

Cewka dzięki swojej zdolności magazynowania energii odciąża przetwornicę (nie musi ona wtedy pobierać prądu), przez co w idealnym (ale niestety nierealnym) układzie dochodzi do takiej konwersji, że Napięcie wejściowe × prąd wejściowy = napięcie wyjściowe × prąd wyjściowy. Tak więc żądna energia nie marnuje się w postaci ciepła. W praktyce jest to bardzo mała ilość - 10-20% na dobrze zaprojektowanej płytce.

CC SMPS, czyli constant current switched-mode power supply

Zaprezentowany układ oparty jest na kostce LM2576. To wyjątkowo tania (~5zł), prosta w złożeniu (5 elementów) i efektywna (η typ. 80%) przetwornica w przyjaznej obudowie TO-220.
Są dwie wersje układu - regulowana i z predefiniowanym napięciem. Nas interesuje ta pierwsza, gdyż posiada pin FEEDBACK, pełniący kluczową rolę w stabilizacji napięcia wyjściowego. Niestety ani nota katalogowa, ani wujek Google nie opisują sposobu stabilizacji prądu. Okazuje się to jednak całkiem proste, tylko trzeba odejść od typowej aplikacji LM2576.

Ale najpierw kilka zdań na temat roli pinu FEEDBACK. Jest to wejście służące przetwornicy do pomiaru napięcia wyjściowego, aby mogła na jego podstawie skorygować swoje parametry pracy (głównie stosunek czasu włączenia do wyłączenia). Dlaczego ten pin jest wyprowadzony, a pomiar nie odbywa się wewnątrz układu scalonego, jak np. w stabilizatorze liniowym 7805? Ano po to, żebyśmy mogli sobie pokombinować :) Przetwornica oczekuje na tym pinie 1.23V i zrobi wszystko co w jej mocy, żeby tyle tam było. Nie na wyjściu, tylko na pinie FEEDBACK. Gdybyśmy chcieli stabilizować napięcie, wstawilibyśmy dzielnik, który dostarczałbym jakąś część napięcia wyjściowego do pinu FEEDBACK, np. 10%, przez co otrzymalibyśmy stabilne 12.3V. A jak stabilizować prąd? Wymyśliłem dwie wersje - prostą i optymalną.


Z prawa Ohma wiemy, że prąd płynąc przez rezystor generuje na nim spadek napięcia. Jeśli wstawimy rezystor w obwodzie masy (tuż przy wyjściu), to po jednej jego stronie będziemy mieć 0V, a po drugiej napięcie o wartości U=I×R. Jak wiadomo, przetwornica zrobi wszystko, aby mieć na pinie FEEDBACK 1.23V. Podłączmy zatem ten pin do naszego rezystora pomiarowego o wartości np. 12Ω. Co się stanie po podłączeniu obciążenia? Przetwornica tak dobierze napięcie, aby prąd płynący w obwodzie wytworzył spadek 1.23V na rezystorze pomiarowym. Stanie się to przy prądzie ~100mA. I nie ważne jakie (w granicach rozsądku) obciążenie podłączymy - prąd będzie zawsze stały. A jak to rozwiązanie prezentuje się pod względem sprawnościowym? Jak wiadomo, na rezystorze pomiarowym dochodzi do spadku napięcia, zatem też do wydzielania się ciepła. W przypadku zasilania diody mocy prądem 700mA będzie to 1.23V×0.7A = 0.86W. Sporo, ale o niebo lepiej niż przy stabilizatorze liniowym.

Okazuje się, że można to poprawić. Widać, że problemem jest rezystor. Wiemy, że P=I²R. Zminimalizujmy zatem R. Możemy oszukać przetwornicę, mierząc spadek napięcia na dużo mniejszym rezystorze (np. 0.1Ω), a potem wzmocnić go 1-10-krotnie. Użyjemy wzmacniacza operacyjnego LM358, który kosztuje 80gr. Z pomocą rezystora i potencjometru skonfigurujemy go jako wzmacniacz nieodwracający, gdzie jako wejście podłączymy sygnał z rezystora pomiarowego, a pin FEEDBACK przetwornicy podepniemy do jego wyjścia, o tak:
Przy tych parametrach prąd 1.23A wytworzy spadek 0.123V na rezystorze pomiarowym, który wzmocniony 10-krotnie "zadowoli" przetwornicę, bo dostanie ona swoje wymarzone 1.23V na pinie pomiarowym.
Policzmy teraz jak ustalić prąd 700mA. Przy takim prądzie na rezystorze 0.1Ω mielibyśmy spadek 0.07V. Jakie musi być wzmocnienie, aby wyszło z tego 1.23V? Mniej więcej 1.23÷0.07=17.6. Zatem aby uzyskać prąd 0.7A należy dobrać wzmocnienie 17.6x i rezystor pomiarowy 0.1Ω. A co ze stratami? 0.7A×0.1Ω=0.07W. To tak śmiesznie niska wartość, że w porównaniu do 3W pobieranych przez diodę, jest kompletnie niewyczuwalna :) Największe straty generuje przetwornica (dla czegoś musi kosztować tylko te 5zł :)) - średnio 1W na 1A p W wyniku pomiarów obliczyłem sprawność tej konstrukcji na η≈75%, przy czym rośnie ona wraz z pobieranym prądem.

Ta wersja daje nam też możliwość płynnej regulacji prądu. Można zauważyć, że potencjometr zapewnia bardzo nieliniowe wzmocnienie, ale przez to prąd jest dużo bardziej liniowy (takie tam skomplikowane wzory i coś tam pewnie w mianowniku :P). Dla R2=100kΩ i potencjometru 50kΩ uzyskujemy zakres ~0-1.25A, czyli całkiem w sam raz do zasilania diód mocy.

Jeśli chcemy iść w wyższe prądy, skorzystajmy z wzoru I=(1.23/Rsc)/(1+R2/R1). Dla ciekawskich: dla układu bez wzmacniacza wzór to tylko I=1.23/Rsc, bo pomiar odbywa się bezpośrednio na rezystorze Rsc, więc korzystamy z czystego prawa Ohma. W wersji ze wzmacniaczem wzmacnia on napięcie na Rsc zgodnie ze wzorem na wzm. nieodwracający, czyli A=(1+R2/R1) razy, zatem "pomaga" przetwornicy A-krotnie, stąd dzielenie przez tą wartość. W praktyce nie jest to super dokładny wzór, bo w grę jeszcze wchodzi napięcie offsetowe i inne niedoskonałości wzm. op., ale do orientacyjnego ustalenia zakresu wystarcza, a dokładnej regulacji możemy dokonać potencjometrem.

Mała uwaga odnośnie źródeł prądowych: nigdy, przenigdy nie podłączajmy do nich diod  kiedy są włączone. Bez obciążenia na wyjściu każdego źródła prądowego pojawia się maksymalne możliwe napięcie. To nie problem, dopóki nie ma kondensatora w obwodzie wyjścia, ponieważ ładuje się on wtedy tym maksymalnym napięciem i oddaje je momentalnie pierwszej podłączonej rzeczy, powodując przepływ bardzo dużego prądu na ułamek sekundy. To wystarcza, aby spalić cenny element. Niestety kondensator wyjściowy jest niezbędny dla zagwarantowania stabilnej pracy przetwornicy i nie można go pominąć. Zatem zawsze pamiętajmy, aby najpierw podłączać diodę, a dopiero potem włączać zasilanie tego typu przetwornicy.

W starszych blokach często znajdziemy "klasyczne" domofony z rzędem przycisków, których naciśnięcie wywołuje dzwonek w odpowiednim mieszkaniu, skąd domownik otwiera nam drzwi. Ale jak otworzyć drzwi, kiedy w domu nie ma nikogo, kto by nas wpuścił, a nie chcemy przy sobie nosić kolejnego klucza? Zatrudnijmy mikrokontroler :)
Zaprezentowany układ składa się z 3 części - modułu wejściowego, modułu przetwarzającego i modułu wyjściowego. Brzmi poważnie, ale to bardzo prosta konstrukcja. Omówię teraz każdy fragment.

Moduł wejściowy

Skrzynka kontrolna domofonu, znajdująca się zwykle na parterze, lub w piwnicy generuje melodyjkę, którą słyszymy, gdy ktoś zadzwoni. Nie jest to wymarzony sygnał do przetwarzania cyfrowego, ale da się z nim coś zrobić. Wystarczy, że poprzez rezystor będziemy impulsami melodyjki ładować niewielki kondensator. Dioda Zenera ograniczy zgromadzone w nim napięcie do stałego poziomu 5V, a równoległy rezystor rozładuje go do 0V po kilku milisekundach, Grunt, że będziemy mieć tam dwa poziomy napięć - 5V, gdy ktoś dzwoni i 0V, gdy nie.

Moduł kontrolny

Tak przygotowany sygnał zostaje spróbkowany przez mikrokontroler ATTiny2313. Używamy zwykłego cyfrowego wejścia. Algorytm w uproszczeniu odczytauje stan tego wejścia 20 razy na sekundę i zlicza ile razy pod rząd było w stanie wysokim. Jeśli będzie to powiedzmy 20 impulsów, to oznacza to kreskę w alfabecie Morse'a. Mniejsza, ale niezerowa wartość oznacza kropkę. Każde pomyślne zdekodowanie symbolu zapełnia nim kolejne miejsce w buforze. Gdy przez odpowiednio długi czas, np. 40 impulsów nie będzie żadnego sygnału, algorytm uznaje, że skończyliśmy wprowadzać kod i przystępuje do porównania bufora z "hasłem". Jeśli się zgadzają, do akcji wkracza kolejna sekcja.

Moduł wyjściowy

Jako, że domofon jest otwierany poprzez zwarcie dwóch styków, gdzie płynie prąd przemienny, utrudnia to nieco zrobienie tego za pomocą mikrokontrolera. Elementem, który potrafi sterować prądem przemiennym jest triak. Problem w tym, że wymaga on sygnału sterującego o polaryzacji takiej, jak ten, którym steruje. Dlatego łączymy go z optotriakiem, który po jednej stronie ma miniaturowy triak czuły na światło, a po drugiej stronie diodę (wszystko jest zamknięte w jednej obudowie DIL). Diodą sterować raczej umiemy. Jej włączenie otwiera optotriak, który przekazuje napięcie o odpowiedniej polaryzacji, które załącza "duży" triak. Elektromagnes zamka w drzwiach zostaje otwarty.
Drugim modułem wyjściowym jest sygnalizacja dźwiękowa, która powiadamia użytkownika tonem o wprowadzeniu poprawnego lub błędnego kodu. Zrealizowałem ją na zwykłym tranzystorze, podłączonym równolegle do mikrofonu. Rezystor R6 ogranicza poziom sygnałów, bo bez niego są one przesadnie głośne.

Oto filmik przedstawiający wygląd i działanie układu:

Ten zasilacz jest wersją deluxe mojego poprzedniego, sprawdzonego modelu, który służył mi 2 lata. Konstrukcja nie jest specjalnie wyszukana, ale dzięki temu łatwo wszystko naprawić, co jest ważne w zasilaczu laboratoryjnym. Urządzenie posiada 2 sekcje - jedną regulowaną, a drugą ze stałym napięciem 5V. Obie wyposażone są w ogranicznik prądowy, który w przypadku sekcji regulowanej jest wielozakresowy, z dodatkowymi zakresami dla różnych diod LED. Regulacja napięcia odbywa się w płynny sposób, z możliwością wyboru konkretnych "typowych" lub "akumulatorowych" napięć, bo zasilacz może służyć też jako uniwersalna ładowarka. Można ładować 1 celę NiMH, 1 lub 4 cele Li-ion lub 12-woltowy akumulator ołowiowy.

Najważniejsze cechy:
  • Precyzyjnie dobrane napięcia predefiniowane: 1.5V, 3.3V, 4.2V, 5V, 9V, 12V, 14.4V, 16.8V
  • Możliwość dokładnego ustawienia dowolnego napięcia za pomocą potencjometrów
  • Ogranicznik prądowy 10mA, 20mA, 50mA, 100mA, 250mA, 350mA, 500mA, 700mA, 1A z przydatnymi dla LED-ów wartościami
  • Dodatkowe wyjście 5V z możliwością ograniczenia prądowego do 20mA
  • Podświetlane przyrządy: woltomierz i dwuzakresowy amperomierz.
Bardzo rozproszona konstrukcja wymaga podłączenia sporej ilości elementów (przełączniki, gniazda, stabilizatory) za pomocą kabli, zatem załączam dwie wersje schematu - z oznaczonymi miejscami do podłączenia przewodów oraz z zamontowanymi częściami. Płytka drukowana jest wykonana taki właśnie w sposób.

Schemat ideowy

W zasilaczu wykorzystano popularne stabilizatory liniowe LM317 w funkcji regulatora prądu i regulatora napięcia. Po wyprostowaniu przez prostownik mostkowy, prąd przepływa przez rezystory pomiarowe RSC, które w ilości 1 lub 2 można wybrać za pomocą przełącznika wyboru zakresu. Napięcie odkładające się na nich, ograniczone do ~0.5V przez dwie diody krzemowe, zasila miliwoltomierz pełniący funkcję amperomierza.

Dalej znajduje się pierwszy stabilizator w konfiguracji ogranicznika prądowego, gdzie jego rezystor został zastąpiony przełącznikiem obrotowym S1 i całą gamą rezystorów, dzięki czemu można wybierać z predefiniowanych wartości ograniczenia. Jeśli zależy nam na jak największym prądzie, można obejść ogranicznik za pomocą przełącznika S2.

Za ogranicznikiem naturalnie znajdziemy regulator napięcia w typowej konfiguracji. Na schemacie narysowano 1 potencjometr wieloobrotowy, ale równie dobrze sprawdzi się kombinacja szeregowa dwóch potencjometrów o wartościach będących w proporcji 1:10.

Kondensator wyjściowy ma niewielką wartość aby chronić podłączane elementy, gdy polegamy na zabezpieczeniu prądowym. Scenariusz zakłada napięcie ustawione na 25V i ogranicznik na 10mA. W momencie podłączenia obciążenia, np. diody LED, popłynąłby przez nią chwilowo duży prąd z naładowanego do 25V kondensatora. Dlatego wartość kondensatora wyjściowego jest taka, by wyeliminować wzbudzanie się stabilizatora i nic ponadto.

Stałe napięcie 5V powstaje dzięki stabilizatorowi 7805. Tutaj również na wyjściu znajdziemy mały kondensator, ponieważ obwód zawiera ograniczenie prądowe. Zbudowane jest ono na miniaturowym LM317L w funkcji ogranicznika prądowego w typowej konfiguracji, ustawionego na 20mA. Można go obejść przełącznikiem S3 i wtedy ogranicza nas już jedynie wydajność układu 7805. Niestety przy jednym uzwojeniu transformatora zasilającego jest ona niska, ponieważ stabilizator musi średnio wytracić w postaci ciepła około 25V różnicy, ale na szczęście przy zasilaniu układów logicznych nie odczuwa się tego.

W środku... Sporo kabli. W sumie nie ma czym się chwalić :P
Jako obudowę zastosowałem szczątki po zasilaczu ATX. Usunąłem z niej jedną ściankę i wstawiłem tam panel z płyty pilśniowej. Ma ona taką zaletę, że łatwo można wycinać w niej nożem kształty - w tym przypadku otwory na wskaźniki i włącznik. Grafikę panelu zaprojektowałem w Inkscape, wydrukowałem, zalaminowałem taśmą klejącą i poprawiłem żelazkiem. Podziałki mierników wykonałem fotografując je dla każdej wartości, a potem złożywszy zdjęcia w Photoshopie jako "smart object" z funkcją nakładania "minimum" wytrasowałem je w Inkscape, dodałem napisy, wydrukowałem i zalaminowałem.


A co do nazwy... :) Ogólnie mówiąc, budowa tego zasilacza była istną drogą przez ciernie. Podczas jego budowy naprzeklinałem się przez niego tak, jak Durczok naprzeklinał się przez Rurka :P

Lampka RGB

Najprostszy trik na poprawienie efektu "wow", jaki sprawia układ, to dodanie do niego czegoś świecącego. Opisywany układ robi 3-krotnie większe wrażenie, ponieważ używa trójkolorowych diod RGB :) Wykorzystuje je bez żadnego konkretnego celu, po prostu aby sobie poświecić na płynnie zmieniający się kolor.


Lampka oparta jest na mikrokontrolerze ATTiny13, taktowanym wewnętrznym zegarem 9.6Mhz. Program, napisany w C, w pętli zapala kolejne składowe kolory (czerwony, zielony i niebieski) na odpowiednio długi czas, który przekłada się na ich średnią jasność. Takie rozwiązane w przeciwieństwie do typowego PWM zapewnia wyższą jasność, bo w dowolnym momencie zawsze pali się w pełni jeden kolor R/G/B - nie ma momentów, kiedy diody są ciemne. Dzięki temu pobór prądu jest stały, a zakłócenia mniejsze.



Proporcje czasów świecenia poszczególnych kolorów ustalane są przez funkcję uruchamianą co pewien czas w przerwaniu timera. Timer dodatkowo sprawdza stan przycisku zatrzymującego zmianę koloru oraz odczytuje przez ADC stan potencjometru regulacji tempa i na jego podstawie kalibruje swoją częstotliwość. Jak widać to sporo operacji, ale z uwagi, że wykonują się one bardzo rzadko w porównaniu do operacji z pętli głównej (czyli przełączania kolorów), nie zakłócają one płynności animacji.



Schemat to nic odkrywczego - mikroprocesor steruje trzema tranzystorami kluczującymi równolegle połączone diody. Daje to średni stały pobór prądu ~80mA. Rezystor R8 może nie być wymagany, ale z dziwnych przyczyn nie mogłem programowo aktywować pull-upa w mikroprocesorze.