Szukaj kodu

Lekcja 22/31: Użycie wyświetlacza siedmiosegmentowego z Arduino i elektroniczna kostka | SunFounder Robojax

Lekcja 22/31: Użycie wyświetlacza siedmiosegmentowego z Arduino i elektroniczna kostka | SunFounder Robojax

W tej lekcji odkrywamy, jak sterować wyświetlaczem siedmiosegmentowym za pomocą Arduino. Zamiast używać kilkunastu lub więcej pinów I/O do bezpośredniego sterowania każdym segmentem LED, stosujemy sprytny trik: rejestr przesuwny. Ten mały, niedrogi układ pozwala nam kontrolować wszystkie siedem segmentów (plus przecinek dziesiętny) za pomocą zaledwie trzech przewodów z Arduino. Jest to podstawowa technika w elektronice, która pozwala zwiększyć liczbę wyjść dostępnych na mikrokontrolerze, umożliwiając budowanie bardziej złożonych projektów bez konieczności wymiany płyty.

okablowanie na płytce stykowej z wideo

Poza podstawowym licznikiem zbudujemy elektroniczną kostkę do gry. Ten projekt nie tylko utrwala sterowanie wyświetlaczem, ale także wprowadza obsługę wejścia użytkownika za pomocą przycisku oraz koncepcję przerwań, tworząc responsywne i interaktywne urządzenie. Ten przewodnik oparty jest na lekcji z kursu Robojax Arduino, który wykorzystuje zestaw SunFounder 3-in-1 Arduino.

Oto kilka praktycznych pomysłów, które możesz zbudować, wykorzystując tę wiedzę:

  • Stwórz prosty tablicę wyników do gier takich jak tenis stołowy czy koszykówka.
  • Zbuduj cyfrowy minutnik do gier planszowych lub kuchenny minutnik odliczający.
  • Zrób generator liczb losowych do gier lub podejmowania decyzji.
  • Skonstruuj podstawowy termometr cyfrowy, dodając czujnik temperatury.

Sprzęt i komponenty

Zanim zaczniemy, zgromadźmy niezbędne komponenty. Rdzeniem tego projektu jest rejestr przesuwny 74HC595, który jest kluczem do zminimalizowania liczby potrzebnych pinów. Zamiast podłączać każdy z siedmiu segmentów bezpośrednio do Arduino, podłączamy je do rejestru przesuwnego. Arduino następnie wysyła dane dla cyfry szeregowo (po jednym bicie na raz) do układu, który następnie wyprowadza odpowiedni wzorzec, aby zapalić segmenty.

  • Arduino Uno (lub kompatybilna płyta)
  • Wyświetlacz siedmiosegmentowy (model 5161AS, wspólna katoda)
  • Układ scalony rejestru przesuwnego 74HC595
  • Przycisk
  • Rezystory (220Ω - 330Ω)
  • Przewody połączeniowe
  • Płytka stykowa

Wyświetlacz 5161AS jest typu wspólna katoda. Oznacza to, że wszystkie katody (strony ujemne) wewnętrznych diod LED są połączone razem do wspólnego pinu masy. Aby zapalić segment, należy podać dodatnie napięcie na jego konkretny pin anody. 74HC595 działa jak most, pobierając dane szeregowe z Arduino i wyprowadzając sygnały równoległe potrzebne do sterowania tymi anodami.

Schemat połączeń

schemat_obwodu_6.5_segment
okablowanie_segmentu_zestaw_sundounder_3-w-1

Okablowanie rejestru przesuwnego i wyświetlacza może wydawać się skomplikowane, ale kluczowe jest dokładne śledzenie schematu krok po kroku. Wideo (o czasie 04:48) zawiera szczegółowy instruktaż tego procesu. Układ 74HC595 ma nacięcie na jednym końcu, aby zidentyfikować pin 1. Piny są ponumerowane przeciwnie do ruchu wskazówek zegara od nacięcia (1-8 po jednej stronie, 9-16 po drugiej).

Oto podsumowanie okablowania z wideo:

  • Zasilanie i masa: Podłącz pin 8 i pin 13 układu 74HC595 do szyny masy. Podłącz pin 10 i pin 16 do szyny 5V.
  • Linie danych: Podłącz piny cyfrowe Arduino do pinów danych rejestru przesuwnego: Pin 12 (STcp) do pinu 12 układu, Pin 8 (SHcp) do pinu 11 układu oraz Pin 11 (DS) do pinu 14 układu.
  • Wyświetlacz do rejestru przesuwnego: To najbardziej skomplikowana część. Wideo (o czasie 07:18) szczegółowo opisuje każde połączenie. Na przykład segment „a” na wyświetlaczu łączy się z pinem 6 układu, segment „b” z pinem 5 i tak dalej. Wspólne piny katody wyświetlacza są podłączone do masy przez rezystor.

Aby uzyskać wizualny i precyzyjny przewodnik, zapoznaj się z oficjalnym schematem połączeń:

Dokładne połączenia pinów są krytyczne i łatwo o pomyłkę. Nie spiesz się i sprawdź każdy przewód dwukrotnie względem schematu. Wideo jest doskonałym źródłem do śledzenia krok po kroku.

Kostka

Wyjaśnienie kodu

W tej lekcji podano dwa przykłady kodu. Pierwszy to prosty licznik, a drugi opiera się na nim, tworząc elektroniczną kostkę. Oba mają tę samą podstawową logikę sterowania wyświetlaczem.

Oto kod podstawowego licznika:

const int STcp = 12;//Pin podłączony do ST_CP układu 74HC595
const int SHcp = 8;//Pin podłączony do SH_CP układu 74HC595 
const int DS = 11; //Pin podłączony do DS układu 74HC595 

int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

Na górze kodu można skonfigurować trzy piny podłączone do rejestru przesuwnego. STcp, SHcp i DS są przypisane do pinów Arduino 12, 8 i 11. datArray[] to kluczowa część. Jest to tabela przeglądowa zawierająca wartości szesnastkowe dla cyfr od 0 do 9. Każda wartość reprezentuje wzorzec segmentów, które mają się zapalić dla danej cyfry.

Funkcja loop() uruchamia licznik. Używa pętli for do liczenia od 0 do 9. Wewnątrz pętli kod wysyła dane dla bieżącej liczby do rejestru przesuwnego. delay(1000) na końcu ustawia szybkość licznika w milisekundach. Zmień tę wartość na 100, aby liczyć szybciej, lub na 500, aby wolniej.

Kod elektronicznej kostki wprowadza nowy element: wprowadzanie danych przez użytkownika za pomocą przycisku. Kluczowe zmiany w konfiguracji to:

const int buttonPin = 2;
//...
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);

Tutaj buttonPin jest ustawiony na pin cyfrowy 2. Ten pin jest wyjątkowy, ponieważ może być używany jako przerwanie. Przerwanie pozwala Arduino natychmiast zatrzymać to, co robi, gdy przycisk jest wciśnięty, zapewniając szybką i niezawodną reakcję. Tryb FALLING wyzwala przerwanie, gdy przycisk jest wciśnięty (sygnał przechodzi z HIGH na LOW).

Funkcja rollDice jest wywoływana przez przerwanie. Przełącza zmienną state między 0 a 1. Gdy state wynosi 0, kostka „się kręci”, a główna pętla loop() będzie losowo wyświetlać liczby. Gdy przycisk zostanie wciśnięty ponownie, state zmienia się na 1, zatrzymując pętlę i wyświetlając końcowy wynik. Funkcja showNumber() jest taka sama jak logika licznika, ale przyjmuje liczbę jako argument do wyświetlenia.

Projekt na żywo i demonstracja

Po wgraniu kodu licznik zacznie działać, wyświetlając liczby od 0 do 9 z jednosekundowym opóźnieniem (na wideo w 15:04). Film pokazuje zmianę opóźnienia, aby licznik działał znacznie szybciej.

Demonstracja elektronicznej kostki (na wideo w 20:15) pokazuje przycisk w akcji. Po naciśnięciu go raz wyświetlacz zaczyna szybko przewijać liczby. Ponowne naciśnięcie zatrzymuje przewijanie, pozostawiając losową liczbę od 1 do 6, dokładnie jak prawdziwa kostka.

Rozdziały

  • [00:00] Wprowadzenie do projektu wyświetlacza siedmiosegmentowego
  • [01:25] Zrozumienie wyświetlacza siedmiosegmentowego
  • [03:51] Karta katalogowa i specyfikacje wyświetlacza 5161AS
  • [04:48] Podłączanie wyświetlacza i rejestru przesuwnego
  • [12:24] Kod Arduino dla licznika 0-9
  • [15:04] Demonstracja licznika i regulacja szybkości
  • [16:27] Budowa projektu elektronicznej kostki
  • [20:15] Demonstracja elektronicznej kostki i eliminacja drgań styków

Obrazy

Wiring on breadboard from video
Wiring on breadboard from video
Circuit 6.5 segment schematic
Circuit 6.5 segment schematic
Dice
Dice
Segment wiring for Sunfounder 3-in-1 kit
Segment wiring for Sunfounder 3-in-1 kit
Segments of segment display
Segments of segment display
Seven segment pins - common cathode
Seven segment pins - common cathode
Seven segment pins - DP decimal pin
Seven segment pins - DP decimal pin
Seven segment pins - common cathode
Seven segment pins - common cathode
902-Lesson 23/31: Arduino code Using Seven Segment Display
Język: C++
/*
Lesson 23/31: Using Seven Segment Display 
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc

*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595 
const int DS = 11; //Pin connected to DS of 74HC595 

int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void setup ()
{
  //set pins to output
  pinMode(STcp,OUTPUT);
  pinMode(SHcp,OUTPUT);
  pinMode(DS,OUTPUT);
}
void loop()
{
  for(int num = 0; num <10; num++)
  {
    digitalWrite(STcp,LOW); //ground ST_CP and hold low for as long as you are transmitting
    shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
    digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data
    delay(1000);
  }
}
903-Lesson 23/31: Electronic dice
Język: C++
/*
Lesson 23/31: Electronic Dice
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc

*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595
const int DS = 11; //Pin connected to DS of 74HC595
const int buttonPin = 2;
int datArray[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,  0x6f};
int number = 0;
int state = 0;

void setup ()
{
  //set pins to output
  pinMode(STcp, OUTPUT);
  pinMode(SHcp, OUTPUT);
  pinMode(DS, OUTPUT);
  pinMode(buttonPin, INPUT);

  attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);
}

void loop()
{
  if (state == 0) {
    showNumber((int)random(1, 7));
    delay(50);
  }
}

void showNumber(int num) {
  digitalWrite(STcp, LOW); //ground ST_CP and hold low for as long as you are transmitting
  shiftOut(DS, SHcp, MSBFIRST, datArray[num]);
  //return the latch pin high to signal chip that it
  //no longer needs to listen for information
  digitalWrite(STcp, HIGH); //pull the ST_CPST_CP to save the data
}


void rollDice() {
  state = !state;
}

Zasoby i odniesienia

Pliki📁

Biblioteki Arduino (zip)