Pewnie wielu z Was podłączało kiedyś segmentowy wyświetlacz LED do Arduino i zastanawiało się co będzie jak zabraknie wyjść cyfrowych do ich sterowania. Otóż można wykorzystać interfejs komunikacyjny SPI i rejestry przesuwne. Ale żeby nie namącić Wam w głowach opowiem o wszystkim po kolei.
Po pierwsze układ
Będzie potrzebne oczywiście Arduino. Osobiście polubiłem wersję Nano V3 tak, więc na nim będą zaprezentowane przykłady. Najważniejsze z punktu widzenia tegoż projektu jest znajomość wyprowadzeń w Arduino. Do sterowania wyświetlaczem LED, a właściwie rejestrem przesuwnym, który tym wyświetlaczem steruje potrzebne jest zlokalizowanie wyprowadzeń SPI w Arduino. Poniższe zdjęcie chyba najlepiej to zobrazuje.
Interfejs SPI jest interfejsem szeregowym, którym przesyłane są po kolei bajt po bajcie (informacje) pomiędzy urządzeniami Master i Slave. W tym przypadku urządzeniem Master będzie Arduino, natomiast Slave – rejestr przesuwny HCF4094. Ale wracając do wyprowadzeń. Najważniejsza jest możliwość przesyłania danych. Dane przesyłać będą wyjściem MOSI czyli Master Out Slave In. Wejściem MISO czyli Master In Slave Out nie będziemy się teraz zajmować bo taki wyświetlacz nie ma dla Arduino żadnych informacji. Wyjście SCLK lub CLK, SCL, różnie ludzie to nazywają, jest to wyjście zegarowe, które pozwala zgrać w czasie pracę urządzeń Master i Slave. Natomiast wyjście CS lub jak niektórzy mówią SS jest niczym innym jak Chip Select lub Slave Select, pozwala na wybranie urządzenia z którym ma zajść komunikacja. Pin CS w Arduino podawany jest jako pin 10, ale nie jest to jakieś ograniczenie. Chip Select’em może być dowolne cyfrowe wyjście. To tyle od strony wyprowadzeń o SPI.
Następnym elementem jest wcześniej wspomniany rejestr przesuwny HCF4094. Akurat wykorzystałem rejestr firmy ST, ale jeśli się nie mylę wszystkie 4094 mają znormalizowane wyprowadzenia, ale najlepiej sprawdzajcie w notach katalogowych. U mnie przedstawiało się to w sposób następujący.
Ok, ale co z czym się je. Do wejścia STROBE podłączacie CS z SPI. DATA z MOSI i SCLK z CLOCK. Do VDD podłączacie zasilanie np. 5V z Arduino. OUTPUT ENABLE jest swojego rodzaju sygnałem dla rejestru, żeby zasilił wyjścia od Q1 do Q8. A że wyświetlacz ma działać od zaraz i nie chcę zbytnio komplikować prostej sprawy to zwarłem OUTPUT ENABLE z VDD w takim wypadku rejestr ma zezwolenie na pracę bez potrzeby angażowania do tego Arduino. VSS to oczywiście masa (GND). Przyszła kolej na wyjścia Q1 – Q7. Zakładając, że nasz wyświetlacz ma wspólną katodę to owe wyjścia łączymy z odpowiednimi segmentami wyświetlacza LED. O ile tego co wyżej nie trzeba tłumaczyć to parę słów przydałoby się powiedzieć Q’s i Qs. Każdy rejestr ma na tyle wyprowadzeń że starczy na jeden wyświetlacz LED – pomijam w tym przypadku wyświetlacze powielone, o nich może kiedy indziej. Tak, więc aby połączyć większą ilość rejestrów przesuwnych należy jak wyżej odpowiednio podłączyć wszystkie wyprowadzenia z tą różnicą, że pin DATA kolejnego rejestru podłączamy do wyprowadzenia Qs (pin 9) poprzedniego rejestru. Tym zabiegiem łączymy rejestry szeregowo. Oczywiście wyprowadzenia Q1-Q7 podłączamy odpowiednio do kolejnego wyświetlacza LED. Powinno to wyglądać mniej więcej w ten sposób.
Jakby ktoś potrzebował to wewnętrzna struktura takiego pojedynczego wyświetlacza LED przedstawia się następująco.
Czas na program
Jeśli wszystko mamy już podpięte to nie pozostało nam nic innego jak zaprogramować Arduino odpowiednim programem. Jeśli chodzi o ważniejsze miejsca w kodzie to myślę, że wystarczy odpowiedni komentarz na końcach linii.
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 |
//---Biblioteki #include <SPI.h> //---Stałe #define CS 10 //Chip select #define NOS 10 //Liczba możliwych do wyświetlenia cyfr + kropka (0-9 + "kropka" daje 10 możliwości) #define TIME 1000 //Podstawa czasu (co 1 sekundę licznik będzie się zwiększał o jeden) //---Zmienne byte a = 0; //Cyfra najmłodsza byte b = 0; //Cyfra najstarsza byte displayArray[NOS] = { B00111111, // 0 "jedynka" bitowa = "jedynka" dla włączenia segmentu B00000110, // 1 kolejno w kodzie => DP-g-f-d-e-c-b-a B01011011, // 2 B01001111, // 3 B01100110, // 4 B01101101, // 5 B01111101, // 6 B00000111, // 7 B01111111, // 8 B01100111 };// 9 void setup(){ pinMode (CS, OUTPUT); SPI.begin(); } void loop(){ for(b=0; b<=NOS; b++){ //Pętla odliczająca do 10 (Number Of Sign) if(b == NOS){ //zabezpieczenie przed przepełnieniem ostatniej cyfry (max = 9) b = 0; //wyzeruj ostatnią cyfrę na wyświetlaczu a++; //inkrementuj cyfrę przed "b" na wyświetlaczu } if(a >= NOS){ //zabezpieczenie przed przepełnieniem cyfry "a" (max = 9) a = 0; //wyzeruj cyfrę "a" } digitalWrite(CS, LOW); //Chip-select (możnaby dla każdego rejestru przesuwnego zrobić osobny CS, ale wiąże się to zajęciem większej ilości wyjść cyfrowych) SPI.transfer (displayArray[b]); //Wyślij najstarszą cyfrę (b) do rejestru przesuwnego (cyfra pierwsza od prawej na wyświetlaczu) SPI.transfer (displayArray[a]); //Wyślij najmłodszą cyfrę (a) digitalWrite(CS, HIGH); delay(TIME); //Podstawa czasu } } |
Jak widać w kodzie zdefiniowałem tablicę znaków (cyfr) w postaci bitowej. „Jedynka” oznacza włączenie odpowiedniego segmentu. Jeśli wszystko zrobiliście dobrze to efekt powinien być taki jak na poniższym filmiku.
Z uwagi na to, że SPI jest interfejsem szeregowym to w najprostszej jego postaci bajt, znaki, dane czy jak tam wolicie wysyłane są jeden po drugim, zatem, żeby na wyświetlaczu uzyskać obraz właściwy (nie lustrzany) najpierw wysyłamy bajt najstarszy, a kolejno młodsze. Jak sama nazwa wskazuje rejestry przesuwne przesyłają szeregowo do siebie informacje począwszy od pierwszego na lini (BUS).
No ale dobra, żeby nie było zbyt nudno to spróbujcie zrobić coś takiego.
A Arduino zaprogramujcie następującym kodem.
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 |
//---Biblioteki #include <SPI.h> //---Stałe #define CS 10 //Chip select #define ADD 2 //Przycsik dodawania #define SUB 3 //Przycisk odejmowania #define NOS 10 //Liczba możliwych do wyświetlenia cyfr (0-9 daje nam 10 cyfr + kropka) #define TIME 250 //Podstawa czasu //---Zmienne byte a = 0; //cyfra najmłodsza byte b = 0; //cyfra najstarsza byte displayArray[NOS] = { B00111111, // 0 "jedynka" bitowa = "jedynka" dla włączenia segmentu B00000110, // 1 kolejno w kodzie => DP-g-f-d-e-c-b-a B01011011, // 2 B01001111, // 3 B01100110, // 4 B01101101, // 5 B01111101, // 6 B00000111, // 7 B01111111, // 8 B01100111 }; // 9 void setup(){ pinMode (CS, OUTPUT); pinMode (ADD, INPUT); pinMode (SUB, INPUT); digitalWrite(ADD, HIGH); //Ustawienie stanu wysokiego na wejściu dla przycisku dodającego digitalWrite(SUB, HIGH); //Ustawienie stanu wysokiego na wejściu dla przycisku odejmującego SPI.begin(); //Inicjalizacja połączenia SPI } void loop(){ //Procedura dodawania if(digitalRead(ADD) == LOW){ b++; if(b == NOS){ //zabezpieczenie przed przepełnieniem ostatniej cyfry b = 0; //wyzeruj ostatnią cyfrę na wyświetlaczu a++; //inkrementuj cyfrę przed "b" na wyświetlaczu } if(a >= NOS){ //zabezpieczenie przed przepełnieniem cyfry "a" a = 0; //wyzeruj cyfrę "a" } } //Procedura odejmowania if(digitalRead(SUB) == LOW){ b--; if(b == NOS){ //zabezpieczenie przed przepełnieniem ostatniej cyfry b = 0; //wyzeruj ostatnią cyfrę na wyświetlaczu a--; //inkrementuj cyfrę przed "b" na wyświetlaczu } if(a >= NOS){ //zabezpieczenie przed przepełnieniem cyfry "a" a = 0; //wyzeruj cyfrę "a" } } //Procedura zerowania wyswietlacza if((digitalRead(ADD) == LOW) && (digitalRead(SUB) == LOW)){ a = 0; b = 0; } //Zabezpieczenie przed wyswietaniem bzdur if((b < 0) || (b > NOS)){ b = 9; a--; } if((a < 0) || (a > NOS)){ a = 9; } digitalWrite(CS, LOW); //Chip-select (możnaby dla każdego rejestru przesuwnego zrobić osobny CS, ale wiąże się to zajęciem większej ilości wyjść cyfrowych) SPI.transfer (displayArray[b]); //Wyślij ostatni znak do rejestru przesuwnego (cyfra pierwsza od prawej na wyświetlaczu) SPI.transfer (displayArray[a]); //Wyślij znak poprzedzający znak dopiero co wysłany digitalWrite(CS, HIGH); delay(TIME); //Podstawa czasu } |
Jak powyższy kod działa sprawdźcie sami.
Osobiście podobny wyświetlacz robię dla zaprzyjaźnionej firmy. Mają maszynę gdzie jest zwykły LCD 6×1 i niestety przy pewnych warunkach nasłonecznienia pracownicy muszą wytężać wzrok. A może sami macie jakieś pomysły na zastosowanie takiego wyświetlacza, nie wiem, może wyświetlacz aktualnego biegu w samochodzie ?
Dla tych, którzy by się dziwili stosowania tylu zmiennych globalnych w prostym kodzie powiem tylko, że to są DOBRE PRAKTYKI programowania. Przydadzą Wam się nawyki przy moich bardziej „skomplikowanych” projektach.
Świetny poradnik :)
Mam takie małe pytanie:
posiadam 2 7-mio segmentowe wyświetlacze TDSG 3150-M, jednak posiadają one wspólną anodę.
Czy są jakieś inne rejestry, które pozwolą mi na sterowanie tym wyświetlaczem? Czy może muszę użyć tego samego co Ty, a wyświetlacz podłączyć np tranzystorami do masy, a tranzystory do rejestru?
tranz NPN bazą to procka col. do wysw emiter do masy
dziala takie coś ;)
Możesz próbować dołączyć przed LED’a ULN2803-D czyli zwykłego drivera. Trochę więcej “kabli” wtedy będzie ;P dlatego użyłem właśnie wyświetlaczy LED ze wspólną katodą, żeby nie komplikować tego wszystkiego.
Dla wspólnej anody lepiej wykorzystać chip PCF8574 komunikujący się z Arduino interfejsem I2C [TWI]. Tu potrzeba tylko 2 przewodów i biblioteki Wired. Szyna I2C jest rozwiązaniem typu “bus”: podobnie jak lampki na choince, można podpiąć wiele urządzeń. Każde z urządzeń na szynie I2C ma własny adres. W przypadku chipów PCF8574 można ich podpiąć 8 szt. Jeśli trzeba więcej, to należy użyć chipa PCF8574A mającego inny adres “typu urządzenia”. Tych też można podpiąć 8 szt, a więc w sumie max 16.
Chip ten jest niczym innym niż “wyniesioną” jednostką zawierającą 8 pinów GPIO [uniwersalnych wejść/wyjść cyfrowych].
Komunikacja w I2C polega z grubsza na wysłaniu adresu urządzenia a następnie danych. W przypadku PCF8574 “danymi” jest po prostu bajt, którego bity mówią w jaki stan mają się ustawić poszczególne piny chipa. A więc wysłanie b0000001 spowoduje ustawienie w HIGH pina 0 [zero] a pozostałych w stan LOW.
Ale UWAGA. Pin chipa PCF8574 nie jest w stanie zasilić diody! [nie może pracować w trybie “supply”]. Ale za to może pracować jako “sink” i wciągnąć do 20mA w kierunku uziemienia. A zatem jest idealny do diod sterowanych katodą [m.in. mających wspólną anodę].
Sterowanie polega więc na ustawianiu LOW [zer w bajcie] dla tych nóżek które mają zapalić diodę a HIGH [jedynek] dla tych, które mają diodę zgasić.
Ja sobie kiedyś [w ramach wprawek Arduinowych] zrobiłem na takim rozwiązaniu elektroniczną kostkę do gry na klasycznych 7-mu LED-ach ustawionych tak jak oczka w normalnej kostce.
Jak będziecie zainteresowani, to mogę wstawić kod i obrazek z Fritzinga tej “kostki”.
A nie chciałbyś o tej kostce napisać szerzej ;] Arduinowej kostki do gry chyba tu jeszcze nie było ;P
OK, ale dopiero za tydzień, bo od jutra do soboty jestem zbyt mocno “busy” :-)
Już napisałem szerzej:
http://starter-kit.nettigo.pl/2011/11/pcf8574-czyli-jak-latwo-zwiekszyc-liczbe-pinow-w-arduino/
Zgadzam się z Piotrem – super temat na post :)
A jakby napisać program, gdzie arduino pokazywałby cyfrę, na podstawie podanego napięcia zewnętrznego? np. dla 2vpokazuje cyfre 1 itd.
Nie ma z tym większego problemu, jednak trzeba by trochę pokombinować i niewykluczone, że wygodniej byłoby zastosować SN5446A i kod BCD ;]
A mogłbym liczyć na jakieś dalsze wskazówki bądź pomoc w pisaniu programu do takiej rzeczy? Generalnie chodzi o Wyświetlacz biegów, który powinien być sterowany napięciem zewnętrznym, odrębnym od napięcia. Mogę liczyć na jakąś (przynajmniej podstawową) pomoc ?
Pewnie tak ;] Ale wyświetlacz biegów w czym ?? W samochodzie ?? Skuterze ?? Motocyklu ?? Hmm … a może w rowerze ?? ;]
Samochód z przenznaczeniem do rajdów
Ooo ;] Zakładam, że w samochodzie nie masz CAN’a, a jeśli jest OBD to raczej informacji o biegach nie dostaniesz ;P Ale skoro to jest rajdówka i masz wszystko na wierzchu to można kombinować. Wszelkie projekty, które sterują czymś w oparciu o zmianę rezystancji/napięcia mają jedną zasadniczą wadę. Temperatura pracy. Spełnia to wymagania tylko w ustalonych warunkach, ale w prototypowym rozwiązaniu można by się pokusić o jakiś eksperyment. Miałeś już jakiś pomysł na wykrywanie biegów? Co to w ogóle za samochód?
Pomysł już jest, tylko trzeba go zrealizować. dostaje zewnętrzne napięcie z potencjometra na skrzyni biegów, te napięcie powinno wysterować wyświetlacz, aby pokazywał dany bieg. Projekt jest w 50% procentach gotowy, teraz potrzebuje aby z procesora(nie wiem jakiego) wyszło napięcie w stanie wysokim ok. 0.7V do każdego segmentu, polaryzując tranz. i powodując przepływ prądu.
Fiesta R2
Ja myślę, że trzeba byłoby zrobić to mniej więcej tak:
Przy gnieździe “wajchy” w skrzyni obstalować 6 blaszek [odizolowanych od masy!] w miejscach odpowiadających pozycji wajchy dla każdego z biegów. Do blaszek przylutować przewody i podłączyć je do 6 pinów cyfrowych Arduino albo jakiegoś chipa pośredniego np. PCF8574. Pewnie chip byłby bezpieczniejszy po kosztuje 5 zł a arduino stówkę…
Do wajchy zaś jakąś “krzywkę” ze sprężystego drutu, która będzie maziać po tych blaszkach. Wajcha = masa.
W programie:
– w setupie wszystkie 6 pinów w stan INPUT HIGH [INPUT_PULLUP albo zewnętrzne rezystory PULLUP z min. 10kOm].
– w pętli czytamy stan pinów i tam gdzie mamy LOW znaczy ten bieg jest obecnie wybrany…
A już na dalej na wyświetlacz LED to już wiecie…
Hmm … jeśli już masz sygnał z potencjometru to wystarczy wykorzystać AnalogRead() i odpowiednie warunki do niego, ale musisz pamiętać o odpowiednich “interwałach” pomiędzy stanami przejścia z biegu niższego na wyższy i odwrotnie. Podobnie jak wspomniałem w jednym z komentarzy do artykułu https://majsterkowo.pl/drabinka-rezystorowa-czyli-jak-podlaczyc-wiele-przyciskow-do-jednego-zlacza/
A jakbym użył wcześniej wspomnianego SN5446A i kodu BCD,
to jakby to wyglądało przykładowo taki program ?
A jakby użyć wcześniej wspomnianego SN5446A i kodu BCD,
to jakby przykładowo taki układ wyglądał, pamiętając, że mam już gotową płytkę z wyświetlaczem, i potrzebuje do niej 0.7V w stanie wysokim dla każdego segmentu który miałby się świecić w danej chwili ?
Schemat będzie wyglądał podobnie, coś mniej więcej takiego http://macao.communications.museum/images/exhibits/2_18_6_3_eng.png
Kod BCD jest zunifikowany, odczytując wartość z potencjometru, musisz po warunkach wydać instrukcje do wysłania odpowiedniego bajtu do układu, aby zapalił odpowiednie segmenty na wyświetlaczu. A wyświetlacz mógłbyś dać nawet taki http://www.tme.eu/pl/details/kw1-4003asa/wyswietlacze-led-pojedyncze/lucky-light/# tyle że tu jest wspólna anoda, więc trzeba by pokombinować jak tu już chłopaki pisali z PCF8574
Wyświetlacz mam, ze wspólną anodą, bo to jest 56mm i zasilany 9V. problem wspólnej anody rozwiązałem. tylko teraz sam układ. Gdzie znajde jakies podstawy kodu bcd, żeby móc napisać takie coś, ew. Wysyłając Ci na maila, aby sprawdzić czy jest ok ?
http://pl.wikipedia.org/wiki/Kod_BCD
Nie bój się próbować, naskrob coś w Arduino IDE i zrób układ na płytce stykowej, a później pogadamy co można by poprawić lub ewentualnie jak z problemami sobie poradzić ;]
@mik To jest skrzynia sekwencyjna, i mamy sygnał z potencjometru, który musi być wykorzystany, bo można proste diagnozy wysunąć jeśli zmienimy bieg, a sygnał pozostanie
Może przekombinowe, ale gdyby do mikroprocesora podłączyć dodatkowo jakiś termistor umieszczony w pobliżu potencjometru, to program mógłby się automatycznie kalibrować względem temperatury.
Co o tym sądzicie?
Emil nie ma szansy poprowadzić jeszcze jednego kabla, bo auto jest już gotowe, a potrzebuje sam wyświetlacz
attiny24, można korzystać z bibliotek arduino, i ma przetwornik adc, czyli tak naprawdę analog read zadziała, i można bybyło wszystko ładnie uwarunkować co otym sądzicie ?
Na Attiny możesz wrzucić bootloader Arduino (trzeba sprawdzić czy jest akurat na Attiny24) i programujesz tak jak Arduino. Bardzo wygodne, ale trzeba pamiętać, że pozostaje zrobienie płytki. Jeśli ma to jeździć w rajdówce to raczej trzeba by i tak zrobić płytkę, chociaż dobre opakowanie na arduino nano czy mini też by się nadało ;] (sprawdź w nettigo ;P) Grunt to łatwy i szybki montaż/demontaż ;P Swoją drogą to z powodzeniem robiłem urządzenia, gdzie zaprojektowałem i polutowałem płytki dwustronne w technologii SMD i na procku Atmega328P czyli takie jakie są w Nano i bez większych problemów programowałem to USBasp’em i wszystko działało pod Arduino IDE.
Pozdrawiam ;D
Płytka to nie problem czyli teraz muszę napisac jakiś program sprawdzić czy bootloader arduino ruszy i dopracować program, jako że jestem lakiem w programowaniu mogę prosić o jakieś podstawowe poradniki?
Jeśli chodzi o podstawowe poradniki to każdy Arduino’wiec chyba zaczynał od tego
http://arduino.cc (zakładka Learning) po większości przykładów, a szczególnie tych z funkcjami warunkowymi if() nie będziesz miał problemu z tym programem do wyświetlacza ;]
Taki program napisałem.. nie wiem czy if bd poprawne tak skonstruowane. jeśli źle to jak to napisać inaczej..
gdzie
D2- seg A
D3- SEG B
D4- SEG C
D5- SEG D
D6- SEG E
D7- SEG F
D8- SEG G
Po pierwsze mierząc wartość z analogRead nie zamieniaj jej uparcie na napięcie. Wiem, że w przykładzie z którego korzystałeś tak jest, ale to jest potrzebne tylko jak potrzebujemy mierzyć napięcie. W Twoim przypadku to nie ma sensu. Dajesz tylko prockowi dodatkowych parę instrukcji bez których sobie poradzi lepiej niż z nimi. Wygląda to trochę jak ADC mierzy napięcie i zamienia ją na 10-bitową liczbę po czym Ty zamieniasz ją znowu na napięcie ;]
Po drugie zapomnij o float, niestety Arduino nie ma procka z obsługą działań na liczbach zmiennoprzecinkowych, tak więc zmienna typu float trochu obciąża całego procka bo Arduino próbuje to zrobić po swojemu (tak jak umie), a Tobie to i tak nie jest potrzebne ;]
Po trzecie zwróć uwagę na przykład http://arduino.cc/en/Reference/Map
potencjometrem zmieniasz wartość i otrzymujesz liczbę z zakresu 0-255, a 1023 jest w przykładzie dlatego bo przetwornik ADC w Arduino jest 10-bitowy. Zatem dla poszczególnych biegów uzyskujesz jakąś tam wartość na potencjometrze i liczbę z ADC w Arduino.
Tak, więc jak już masz liczbę z przedziału 0-255 (nie musi być 255 może być każda inna liczba po to jest funkcja map()) to musisz eksperymentalnie założyć jakieś wartości przy których będą się zmieniały liczby na wyświetlaczu. Najłatwiej byłoby Ci wykorzystać mój przykład z rejestrem przesuwnym bo jest chyba najmniej pisania i na pewno mniej gmatwania w pętli LOOP. No ale dobra idąc Twoim tropem to …
… z if()’ami jest akurat tak, że AVR jakim jest oczywiście obdarzony Arduino strasznie nie lubi skomplikowanych warunków. Dlatego opisze Ci przykład dla jednego biegu, a dla reszty powinieneś załapać ;] Krok po kroku (mam nadzieje, że nic nie przeoczyłem):
0 < 1. bieg < (2*21 = 42 czyli ustawiasz zakres dla każdego biegu co 42)
42<2. bieg < 84
i tak dalej i tak dalej. Nie powiedziane, że tymi zakresami się wstrzeliłeś idealnie w przełożenia bo niestety żadna skrzynia biegów nie jest idealna. Ale to już eksperymentalnie sprawdzisz ;]
if((zmierzona wartość > 0) && (zmierzona wartość < 42)){
//zapal odpowiednie segmenty na LED
}
Słowem końcowym powiem tylko, że jakbyś miał problemy dalej, co może się stać, to tłumaczę takie rzeczy o późnej porze tak, więc pisz jakby co do mnie na Facebook’u albo wyślij wiadomość na YouTube ;P
Pozdro
Jutro sb to wszystko ogarne na plytce.. Mam zamiar podlaczyc arduino do potencjometru I dac mu insyrukcje zeby mi rzucil podglad z adc (printin) I sb spisze dla poszczegolnych biegow dajac zapasy po 5 jednostek (bo 5/255 jes ok. 0.02 v a tol skrzyni jest 0.1v porobie warunki wrzucwe program i zobaczymy czy ruszy..
void setup () { } // PĘTLA Void loop() { // USTAWIAM INTEGER int voltage = analog read(A0); //mapuje napiecie voltage = map(voltage, 0, 1023, 0, 255); // BIEG WSTECZNY (3 POZIOME KRESKI) if (5 < voltage < 15){ digitalWrite(D2, HIGH); digitalWrite(D5, HIGH); digitalWrite(D8, HIGH); } // LUZ (0) else if (xx < voltage < xx){ digitalWrite(D2, HIGH); digitalWrite(D3, HIGH); digitalWrite(D4, HIGH); digitalWrite(D5, HIGH); digitalWrite(D6, HIGH); } // BIEG 1 (1) else if (xx < voltage < xx){ digitalWrite(D3, HIGH); digitalWrite(D4, HIGH); } // BIEG 2 (2) else if (xx < voltage < xx){ digitalWrite(D2, HIGH); digitalWrite(D3, HIGH); digitalWrite(D5, HIGH); digitalWrite(D6, HIGH); digitalWrite(D8, HIGH); } // BIEG 3 (3) else if (xx < voltage < xx){ digitalWrite(D2, HIGH); digitalWrite(D3, HIGH); digitalWrite(D4, HIGH); digitalWrite(D5, HIGH); digitalWrite(D8, HIGH); } // BIEG 4 (4) else if (xx < voltage < xx){ digitalWrite(D3, HIGH); digitalWrite(D4, HIGH); digitalWrite(D7, HIGH); digitalWrite(D8, HIGH); } //BIEG 5 (5) else if (xx < voltage < xx){ digitalWrite(D2, HIGH); digitalWrite(D4, HIGH); digitalWrite(D5, HIGH); digitalWrite(D7, HIGH); digitalWrite(D8, HIGH); } } warunki do poprawy piny do poprawy cos jeszczw w oczy sie.rzuca?
Nie wrzucaj tu całego kodu w taki sposób bo się robi bajzel. Przeczytaj jeszcze raz mój komentarz, napisz program, przetestuj, opisz, a jakby co to ciekawy temat na artykuł, nie sądzisz? Daleko mieszkasz od Opola ?
Slask, mikołów.. Mam zmontowane wszystko na plytce i chodzi pieknie.. Wspolna anode rozwiazalem etoda, ze podlaczam katode do cyfrowych wyjsc i przy stanie niskim swieci przy wysokim gasnie.. Przez rezystory 10k wysw jest na 12v wiec prosta matma 12-5=7 a przy 7v nie swieci.. Nie wiem czybylbym dobry w pisaniu artykulu.. Ale material jest.. W kazdym badz razie wszystko chodzi (narazie na plytce stykowej) ale w poniedzialek robie pcb i koncze to
No materiał jest ciekawy ;] Pomyśl nad tym bo doczekać się nie mogę jak to w Fieście zobaczę ;] Rozumiem, że wyświetlacz masz na 12V, nie za bardzo wiem o co Ci chodziło z tym 12V-5V=7V, podłączałeś to przez LED DRIVER’A??
Warto wspomnieć że są też takie fajne rzeczy jak układy MAX7219/7221, którymi można sterować ośmioma wyświetlaczami 7 segmentowymi (+ kropki), ale też np. gotowymi matrycami 8×8 LED http://image.tradevv.com/2008/02/20/nbflying_426062_600/8×8-led-dot-matrix.jpg.
Pomijając ich cenę to można ;] Bez wątpienia do matryc 8×8 są idealne ;] ale też dość ciekawym rozwiązaniem do wyświetlaczy jest SN74LS145N (driver BCD)
Szczery podziw za wytrwałość przy rysowaniu połączeń :)
Dla początkujących fajny opis, wyłożone wszystko na tacy :)
Jedynie co chciałabym zasugerować, jeśli już mowa o “Dobrych praktykach”, to podpinanie wyświetlaczy 7-mio segmentowych w kolejności: dp-a-b-c-d-e-f-g, a w programie tablica displayArray powinna mieć wartości w kolejności g-f-d-e-c-b-a-dp, gdzie dp to najmłodszy bit.
Pozdrawiam :)
Słuszna uwaga ;] Ale w tym wypadku trzeba by poprzekładać “okablowanie” ;]
Da się to prościej zrobić, korzystając z timer w AVR można zrobić multipleksowanie wyświetlacza na samej Atmedze – wymaga to użycia większej ilości portów 8+1 na każdy segment ale działa całkiem ładnie i nie trzeba korzystać z dodatkowych układów.
No pewnie że się da, ale potrzeba więcej portów, które mógłbyś wykorzystać do innych celów. Często w różnych projektach sprawa prezentowania danych jest drugorzędna ;]
A co to za wyświetlacz dokładnie? Jest on np. w sklepie Nettigo?
Znalazłem coś innego (nie potrzebuję “świecącego” wyświetlacza)
http://nettigo.pl/products/32
i zastanawiam się, czy można wykorzystać?
To masz zwykły LCD 16×2 i do arduino stosowany jest najczęściej. Ten przykład z LED’owymi wyświetlaczami dobry jest tam gdzie potrzeba wyraźnego przedstawienia danych, choćby nawet w monitorach napięcia w modelarstwie ;] a na nettigo ciekawym rozwiązaniem jest http://nettigo.pl/products/319
“Dla tych, którzy by się dziwili stosowania tylu zmiennych globalnych w prostym kodzie powiem tylko, że to są DOBRE PRAKTYKI programowania. Przydadzą Wam się nawyki przy moich bardziej „skomplikowanych” projektach.”
hmmmm mnie uczono wprost przeciwnie ale ja studia konczylem w epoce programowania strukturalnego (wmawiali mi zeby unikac inline ….)
No i mi właśnie chodziło o unikanie zmiennych lokalnych ;] Wiadomo, że jak jest kod z 1000 linii to dużo łatwiej jest pozmieniać coś jeśli już na początku kodu zadasz zmienne globalne ;D Jedna zmiana i proszę jest tak jak ma być. Nie trzeba szukać w kodzie zmiennej lokalnej i kombinować czy oby na pewno we wszystkich funkcjach jest tak jak chcemy i czy to działa poprawnie. Tak, więc dobrze jest się przyzwyczaić do zmiennych globalnych ;]
Hmm trochę to skomplikowane dla mnie mimo że bardzo chciałabym się tego nauczyć.
Proponuję zacząć od podstaw ;]
https://majsterkowo.pl/arduino-co-to-jest-i-z-czym-to-sie-je/
i oczywiście
https://majsterkowo.pl/od-czego-zaczac-zabawe-z-arduino/
Kolejny przydatny poradnik z arduino… Czeka mnie noc pełna zabawy :)
Nie “o tuż” tylko “otóż” – pierwszy akapit
Czym więc różni się arduino od zwykłego mikrokontrolera za 10zł? bo zastanawiam się czy kupować.
Może zacznij od przeczytania tego ;D
https://majsterkowo.pl/arduino-co-to-jest-i-z-czym-to-sie-je/
Późnij przeczytaj to ;]
https://majsterkowo.pl/programowanie-mikrokontrolerow-za-pomoca-programatora-usbasp/
A jakbyś już wolał Arduino to przeczytaj to ;P
https://majsterkowo.pl/porownanie-wszystkich-dostepnych-wersji-arduino/
i to
https://majsterkowo.pl/od-czego-zaczac-zabawe-z-arduino/
A tak na marginesie Arduino to mikrokontroler opatrzony rezonatorem i konwerterem na wirtualny USB na jednej małej płytce ;D Wygoda no i swoją drogą jakość ;] Cena trochę wysoka, ale jakby odjąć marże to wychodzi tyle co byś miał samemu zrobić identyczną płytkę w technologii SMD ;P możesz zlecić płytkę albo wytrawić samemu. Wtedy musisz doliczyć chemię no i w obu przypadkach dolicz do tego np. USBasp’a żeby wrzucić bootloader do uC ;D
Decyzję podejmij sam ;D
Wszystko możesz wsadzić na płytkę stykową, ale czasami brakuje miejsca, żeby tą płytkę stykową gdzieś wsadzić ;D
Właśnie takiego tutoriala szukałem, bardzo dobrze i przystępnie opisany kawałek wiedzy – dzięki!
Może kolega opisze, jak zrobić termometr, albo zegarek na tych wyświetlaczach led.
“Dla tych, którzy by się dziwili stosowania tylu zmiennych globalnych w prostym kodzie powiem tylko, że to są DOBRE PRAKTYKI programowania”
Z tego czego mnie uczono, dobra praktyka programowania jest jednak eliminowanie i unikanie zmiennych globalnych :)
Witam !
Skorzystałem z tego poradnika , wszystko działa ale mam pytanie. Mam wyświetlacz LTC571P-B ( 3 cyfrowy 7-seg. czerwony ) ze wspólna katodą. Przy pomocy układów HCF4094 jestem w stanie zapalać albo drugie cyfry albo trzecie ale nie umiem sterować jednocześnie obydwoma, czy to w ogóle możliwe ?
Wiem że pierwszy segment może wyświetlić tylko cyfrę “1” .
Wyświetlacz ma tylko 12 wyprowadzeń z czego jedno jest nieużywane a trzy obsługują katody dla poszczególnych cyfr.
Może mi ktoś pomóc ? Czy jest możliwe sterowanie tym wyświetlaczem podobnie jak to jest w tym poradniku przy pomocy HCF4094 ?
Witam,
Czy mogę podłączyć w ten sposób wyświetlacz 4-cyfrowy? Można podpiąć bezpośrednio do portu, nie przekraczając dopuszczalnego natężenia?
kolego, to są niestety herezje…
żaden zdrowy na umyśle programista nie “przyzwyczaja się do zmiennych globalnych…zmienne lokalne mają swój cel, dlaczego? radze doczytać o tym jak kompilatory zarządzają pamięcią!
Zapraszam https://www.youtube.com/watch?v=WveG5tsV6p0
Witam.
Chcę skonstruować układ, ktory zapewni dzialanie urzadzenia do zabawy dla dzieci(zdjecie w zalaczniku).
Sterownik w polaczeniu zapewne z przekaznikiem, licznikiem impulsow i wyswietlaczem maja za zadanie:
-wlaczac losowo w rownych odstepach czasu jeden z 16 przyciskow
-liczyc i wyswietlac liczbe w tempo wcisnietych przyciskow
-wyswietlac, odmierzac czas gry (do zakonczenia)
-dobrze byloby aby istniala mozliwosc sensownego zintegrowania wrzutnika monet i czegos do odtwarzania dzwiekow
Nie znam się na tym więc proszę kogoś mądrego o doradzenie jakich elementów potrzebuje i jak je połączyć. Jeśli ktoś chce zrobić to odpłatnie proszę o ofertę na maila.
wieslaw
ja chciałbym sterować 2×2 led cyfrowe wspólna anoda +ULN 2803 D+2×2 przyciski/dwie cyfry lewa +dwie cyfry prawa srtona +przyski do kazdej strony/- b.prosze o pełny schemat +SOFT TAKIEGO PODŁĄCZENIA-jestem początkujący.
Dziękuję.