Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów '74HC595'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 2 wyniki

  1. Witam wszystkich forumowiczów. Jest to mój pierwszy post na forum i jednocześnie pierwszy "większy" projekt na Arduino. Jestem dosyć początkujący, jeżeli chodzi o teoretyczne aspekty elektroniki i prosiłbym o sprawdzenie mojego schematu. Mam problem z multipleksowaniem wyświetlaczy 7-segmentowych o wspólnej anodzie. Cyfry na nich są wyświetlane ale widoczna jest na nich "poświata" liczby, która znajduje się po prawej stronie. Sterowanie pojedynczą liczbą odbywa się za pomocą ekspandera PCF8574 (na schemacie zaznaczone jako A, B, C...), a o tym na który wyświetlacz ona trafi zajmują się 3 rejestry przesuwne 74HC595 (D1...D24 na schemacie). Poniżej załączam schemat. A na zdjęciu poniżej jak to wygląda na wyświetlaczach: Myślałem, że to wina braku kondensatorów przy rejestrach przesuwnych (na początku ich nie było), ale pomimo dodania ich problem nadal występuje. Widać to dobrze na pojedynczym wyświetlaczu w centrum kadru , gdzie powinno być 1, a prześwituje również 2 znajdujące się po prawej stronie. Wyświetlacz ten (również nie wiem czemu) świeci dużo jaśniej niż pozostałe, ale możliwe, że jest innego typu/producenta (wnioskuję po innym ułożeniu pinów). Wspomniany kondensator znajduję się na przy pinie Vcc, a więc możliwie blisko tak jak wskazuje na to dokumentacja układu. Poniżej zdjęcie jego położenia (pierwszy układ to ekspander, dalej 3 rejestry). Całość sterowana jest przez Arduino Uno i jedna z moich hipotez jest taka, że zapis stanu wyjściach ekspandera PCF8574 trwa za długo. Cyfry, które mają zostać wyświetlone, przychodzą z portu szeregowego i są typu string. Napis ten konwertowany jest na tablicę liczb w postaci binarnej, np. 0 to 0b11111100 (czyli 0b[a][c][d][e][f][g][dp]). Każda cyfra jest zanegowana, tak aby na ekspanderze był stan niski, jeśli segment ma zostać zapalony. Poniżej kod, który jest odpowiedzialny za wyświetlanie liczb: //Pin connected to ST_CP of 74HC595 int latchPin = 8; //Pin connected to SH_CP of 74HC595 int clockPin = 12; ////Pin connected to DS of 74HC595 int dataPin = 11; void loop() { //... String stringForDisplay = "181181181123450000"; byte len; byte* bytes = stringToSegment(stringForDisplay, len); /* Zmienna len jest referencją, zwraca długość tablicy. Tablica wyjściowa może mieć mniejszą długość, jeśli w napisie wystąpi kropka - jest ona dodawana do poprzedniej cyfry. */ unsigned long i = 1; for (byte index = 0; index < len; index++) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, i >> 16); shiftOut(dataPin, clockPin, MSBFIRST, i >> 8); shiftOut(dataPin, clockPin, MSBFIRST, i); displayDataLines.write8(bytes[index]); digitalWrite(latchPin, HIGH); i = i << 1; } delete bytes; //... } Każdą sugestię mogę sprawdzić, ponieważ układ aktualnie zmontowany jest na płytce "edukacyjnej".
  2. Sześciany LED są na tyle popularne że ich budowa jest bardzo łatwa (ogromna ilość poradników pokazujących krok po kroku co zrobić) i przez to nudna 😕. Ponieważ wolę wymyślić coś samemu niż zbudować to co pojawiało się już wielokrotnie postanowiłem wykorzystać diody w inny sposób. Wpadłem na pomysł żeby było to coś związanego ze świętami i zdecydowałem się na gwiazdę 🌟. Tak wygląda efekt końcowy: Prezentacja wideo Budowa Gwiazda składa się z 40 diod połączonych katodami tak, że tworzą kształt gwiazdy. Konstrukcja umieszczona jest na kartonowym szablonie. Do sterowania diodami użyłem 5 połączonych rejestrów przesuwnych 74HC595. Każdej diodzie odpowiada również jeden rezystor 1kΩ. Układ zlutowałem na płytce uniwersalnej. Gwiazda jest podłączona do układu za pomocą przewodów połączeniowych żeńsko-męskich. Nie wygląda to zbyt ładnie ale konstrukcję można szybko zdemontować a układu użyć do sterowania innymi rzeczami. W płytkę można również wpiąć 4 tranzystory i sterować 4 warstwami np. sześcianu led. Obwód prezentuje się następująco: Całością steruje Cytron Maker Uno. Podłączenie połączonych rejestrów przesuwnych Rejestry łączymy w następujący sposób: VCC i MR (10 pin rejestru) do 5V GND i OE (13 pin rejestru) do GND DS (14 pin rejestru) pierwszego rejestru do 11 pinu Cytrona ST_CP (12 pin rejestru) wszystkich rejestrów do 10 pinu Cytrona SH_CP (11 pin rejestru) wszystkich rejestrów do 12 pinu Cytrona Q7" do pinu DS kolejnego rejestru Q0 - Q7 do kolejnych diod Oprogramowanie Gwiazdą steruję wysyłając 5 bajtów (1 bajt dla każdego rejestru). Kolejne bity w przesłanym bajcie odpowiadają stanowi kolejnych wyjść rejestru. Trzeba pamiętać, że bajty są przekazywane między rejestrami w taki sposób, że pierwszy bajt trafia do ostatniego rejestru, drugi do przedostatniego itd. Deklaracja pinów które będą użyte do komunikacji z rejestrami: int latchPin = 10; int clockPin = 12; int dataPin = 11; Do ustawiania stanu diod używam dwóch funkcji. Funkcja writeBytes wysyła po kolei otrzymane bajty. Bajty przekazujemy do funkcji jako tablicę liczb (wartość bajtu zapisana dziesiętnie) np. jeśli przekażemy do funkcji 5 wartości 255 wszystkie 40 diod zacznie się świecić ponieważ każdy rejestr otrzyma wartość 11111111. void writeBytes(int bytes[], int numberOfBytes) { digitalWrite(latchPin, LOW); for(int i=0; i<numberOfBytes; i++) { registerState[i] = bytes[i]; shiftOut(dataPin, clockPin, MSBFIRST, bytes[i]); } digitalWrite(latchPin, HIGH); } Funkcja writePin jest prostsza w użyciu, wystarczy podać numer diody (w tym przypadku od 0 do 39) i stan diody (LOW/HIGH). Funkcja odpowiednio zaktualizuje wartości i je wyśle włączając lub wyłączając diodę o podanym numerze. void writePin(int pin, bool state){ int reg = pin / 8; int actualPin = pin - (8 * reg); digitalWrite(latchPin, LOW); for (int i=numOfRegisters; i>=0; i--) { if (i == reg){ bitWrite(registerState[i], actualPin, state); } shiftOut(dataPin, clockPin, MSBFIRST, registerState[i]); } digitalWrite(latchPin, HIGH); } Z użyciem powyższych funkcji można już pisać różne efekty. Dla przykładu funkcja wypełniająca gwiazdę losowo wyglądają następująco: void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void effectJ(int d) { clear(); int state[8*numOfRegisters]; for(int i=0; i<8*numOfRegisters; i++) { state[i] = i; } int r; for(int i=8*numOfRegisters-1; i>0; i--) { r = random(0, i); swap(&state[i], &state[r]); } for(int i=0; i<8*numOfRegisters; i++) { writePin(state[i], HIGH); delay(d); } } Kompletny kod znajduje się w załączniku. Shift_Registers.rar
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.