Caută cod

Lecția 22/31: Utilizarea afișajului cu șapte segmente cu Arduino și zaruri electronice | SunFounder Robojax

Lecția 22/31: Utilizarea afișajului cu șapte segmente cu Arduino și zaruri electronice | SunFounder Robojax

În această lecție, explorăm cum să controlăm un afișaj cu șapte segmente folosind un Arduino. În loc să folosim o duzină sau mai multe pini I/O pentru a acționa direct fiecare segment LED, folosim un truc inteligent: un registru de deplasare. Acest cip mic și ieftin ne permite să controlăm toate cele șapte segmente (plus punctul zecimal) folosind doar trei fire de la Arduino. Aceasta este o tehnică fundamentală în electronică care vă permite să extindeți numărul de ieșiri disponibile pe microcontrolerul dvs., făcând posibilă construirea unor proiecte mai complexe fără a vă moderniza placa.

conexiuni pe breadboard din videoclip

Dincolo de contorul de bază, vom construi un zar electronic. Acest proiect nu doar consolidează controlul afișajului, dar introduce și introducerea utilizatorului printr-un buton și conceptul de întreruperi, creând un dispozitiv receptiv și interactiv. Acest ghid se bazează pe o lecție din cursul Robojax Arduino, care folosește kitul SunFounder 3-in-1 Arduino.

Iată câteva idei practice pe care le puteți construi cu aceste cunoștințe:

  • Creați un tabel de scor simplu pentru jocuri precum tenis de masă sau baschet.
  • Construiți un cronometru digital pentru jocuri de societate sau un cronometru de bucătărie.
  • Faceți un generator de numere aleatorii pentru jocuri sau luarea deciziilor.
  • Construiți un termometru digital de bază adăugând un senzor de temperatură.

Hardware și componente

Înainte de a începe, să adunăm componentele necesare. Miezul acestui proiect este registrul de deplasare 74HC595, care este cheia pentru minimizarea numărului de pini necesari. În loc să conectăm fiecare dintre cele șapte segmente direct la Arduino, le conectăm la registrul de deplasare. Arduino trimite apoi datele pentru o cifră serial (câte un bit la un moment dat) către cip, care apoi scoate modelul corect pentru a aprinde segmentele.

  • Arduino Uno (sau placă compatibilă)
  • Afișaj cu șapte segmente (model 5161AS, catod comun)
  • Circuit integrat registru de deplasare 74HC595
  • Buton
  • Rezistoare (220Ω - 330Ω)
  • Fire de legătură
  • Breadboard

Afișajul 5161AS este de tip catod comun. Aceasta înseamnă că toți catozii (părțile negative) ale LED-urilor interne sunt conectați împreună la un pin comun de masă. Pentru a aprinde un segment, furnizați o tensiune pozitivă la pinul său anod specific. 74HC595 acționează ca o punte, preluând date seriale de la Arduino și scoțând semnalele paralele necesare pentru a acționa acești anozi.

Ghid de conexiuni

schema_circuit_6.5_segment
conexiuni_segment_kit_sundounder_3-in-1

Conexiunile registrului de deplasare și ale afișajului pot părea complicate, dar urmărirea diagramei pas cu pas este crucială. Videoclipul (la 04:48) oferă o prezentare detaliată a acestui proces. Cipul 74HC595 are o crestătură la un capăt pentru a identifica pinul 1. Pinii sunt numerotați în sens invers acelor de ceasornic de la crestătură (1-8 pe o parte, 9-16 pe cealaltă).

Iată rezumatul conexiunilor din videoclip:

  • Alimentare și masă: Conectați pinul 8 și pinul 13 al 74HC595 la linia de masă. Conectați pinul 10 și pinul 16 la linia de 5V.
  • Linii de date: Conectați pinii digitali ai Arduino la pinii de date ai registrului de deplasare: Pinul 12 (STcp) la pinul 12 al cipului, Pinul 8 (SHcp) la pinul 11 al cipului și Pinul 11 (DS) la pinul 14 al cipului.
  • Afișaj la registrul de deplasare: Aceasta este partea cea mai complexă. Videoclipul (la 07:18) detaliază fiecare conexiune. De exemplu, segmentul 'a' de pe afișaj se conectează la pinul 6 al cipului, segmentul 'b' la pinul 5 și așa mai departe. Pinii de catod comun ai afișajului sunt conectați la masă printr-un rezistor.

Pentru un ghid vizual și precis, vă rugăm să consultați diagrama oficială de conexiuni:

Conexiunile exacte ale pinilor sunt critice și este ușor să faceți o greșeală. Luați-vă timp și verificați de două ori fiecare fir față de diagramă. Videoclipul este o resursă excelentă pentru a urmări.

Zar

Explicația codului

Două exemple de cod sunt furnizate în această lecție. Primul este un contor simplu, iar al doilea se bazează pe el pentru a crea zarul electronic. Ambele împărtășesc aceeași logică de bază pentru controlul afișajului.

Iată codul pentru contorul de bază:

const int STcp = 12;//Pin conectat la ST_CP al 74HC595
const int SHcp = 8;//Pin conectat la SH_CP al 74HC595 
const int DS = 11; //Pin conectat la DS al 74HC595 

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

În partea de sus a codului, puteți configura cei trei pini conectați la registrul de deplasare. STcp, SHcp și DS sunt atribuiți pinilor Arduino 12, 8 și, respectiv, 11. datArray[] este o parte crucială. Este un tabel de căutare care conține valorile hexazecimale pentru cifrele 0 până la 9. Fiecare valoare reprezintă modelul de segmente care trebuie aprinse pentru acea cifră specifică.

Funcția loop() rulează contorul. Folosește o buclă for pentru a număra de la 0 la 9. În interiorul buclei, codul trimite datele pentru numărul curent către registrul de deplasare. delay(1000) de la sfârșit setează viteza contorului în milisecunde. Schimbă această valoare la 100 pentru o numărare mai rapidă, sau la 500 pentru una mai lentă.

Codul pentru zarul electronic introduce un element nou: introducerea utilizatorului printr-un buton. Principalele modificări de configurare sunt:

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

Aici, buttonPin este setat pe pinul digital 2. Acest pin este special deoarece poate fi folosit ca întrerupere. O întrerupere permite Arduino să oprească imediat ceea ce face atunci când butonul este apăsat, asigurând un răspuns rapid și fiabil. Modul FALLING declanșează întreruperea atunci când butonul este apăsat (semnalul trece de la HIGH la LOW).

Funcția rollDice este apelată de întrerupere. Ea comută variabila state între 0 și 1. Când state este 0, zarul este „în mișcare”, iar bucla principală loop() va afișa numere aleatorii. Când butonul este apăsat din nou, state se schimbă la 1, oprind bucla și afișând rezultatul final. Funcția showNumber() este aceeași ca logica contorului, dar primește un număr ca argument pentru afișare.

Proiect live și demonstrație

Odată ce codul este încărcat, contorul va începe să ruleze, afișând numere de la 0 la 9 cu o întârziere de o secundă (în video la 15:04). Videoclipul demonstrează schimbarea întârzierii pentru a face contorul să ruleze mult mai rapid.

Demonstrația zarului electronic (în video la 20:15) arată butonul în acțiune. Când îl apeși o dată, afișajul începe să alterneze rapid între numere. Apăsând din nou, alternarea se oprește, lăsând afișat un număr aleatoriu între 1 și 6, exact ca un zar real.

Capitole

  • [00:00] Introducere în proiectul afișajului cu șapte segmente
  • [01:25] Înțelegerea afișajului cu șapte segmente
  • [03:51] Fișa tehnică și specificațiile afișajului 5161AS
  • [04:48] Conectarea afișajului și a registrului de deplasare
  • [12:24] Codul Arduino pentru contorul 0-9
  • [15:04] Demonstrația contorului și ajustarea vitezei
  • [16:27] Construirea proiectului zarului electronic
  • [20:15] Demonstrația zarului electronic și debouncing

Imagini

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
Limba: 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
Limba: 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;
}

Resurse și referințe

Fișiere📁

Biblioteci Arduino (zip)