Laboratorul 05 - Arduino: Interfața serială, GPIO și Led-uri

Scopul laboratorului

  • Familiarizarea cu operațiunile cu pinii Arduino
  • Reamintirea cunoștințelor de bază din C

Cuvinte cheie

  • pinMode, digitalWrite, HIGH, LOW, LED
  • for, if, while, vector

Programarea în C

Variabile

Variabilele sunt folosite pentru a stoca diverse informații de tipuri diferite.

variabile.c
#include <stdio.h>
 
int main(void) 
{
      int variable_number = 10;
      char variable_character = 'c';
      float variable_fractional_number = 10.25;
      return 0;
}

Vectori

Vectorii sunt variabile mai complexe de o dimensiune specifică, setată, care pot stoca o listă de valori. De exemplu:

variabile.c
#include <stdio.h>
 
int main(void) 
{
      int arr1[6];
      int arr2[] = { 1,2,3,4,5,6};
      char arr3[] = {'a', 'b', 'c', 'd'};
      char arr4[6] = "hello";
      return 0;
}

If - Else

Propoziția if este o propoziție condițională folosită pentru a executa instrucțiuni în funcție de anumite condiții. Construcția if-else se traduce prin “dacă - altfel”:

if_else.c
#include <stdio.h>
 
int main(void) 
{
      int a = 10;
      if (a == 10) { // Dacă a este egal cu 10          
         // Fă operații dacă a este 10
      } else { // Altfel
         // Fă operații când a este diferit de 10
      }
      return 0;
}

For

Structura for este o structură repetitivă în funcție de o condiție. Mod de utilizare:

for.c
#include <stdio.h>
 
int main(void) 
{
      //for(initialization, condition, operation) {}
      int i;
      for (i = 0; i <= 10; i++) {
          printf("%d ", i); // show i;
      } 
      return 0;
 
      // Codul de mai sus va afișa: 0 1 2 3 4 5 6 7 8 9 10
}

Parcurgerea unui șir

Accesarea unei anumite valori dintr-un vector se face prin index-ul(poziția) valorii din vector.

vector.c
#include <stdio.h>
 
int main(void) 
{
      int i;
      int arr[] = {1,2,3,4,5,6,7,8,9};
      int sum = 0;
 
      printf("%d\n", arr[2]); // afișează 3
 
      for (i = 0; i < 9; i++) { // Pozițiile în vector încep de la 0!!
 
          sum = sum + arr[i]; // calculăm suma tuturor elementelor din vector
      } 
 
      return 0;
}

Funcții

Funcțiile separă sarcini diferite, complexe în părți mai mici care sunt mai ușor de înțeles și programat. Avantajul este că putem refolosi aceste secțiuni de oricâte ori avem nevoie, fără a mai rescrie acele zone de cod de la 0. De asemenea, acestea sunt extrem de utile pentru ascunderea detaliilor de funcționare a unor bucăți de program, ajutând la scrierea și citirea codului. Prin utilizarea funcțiilor, care reprezintă unitatea fundamentală de execuție a programelor din C, se obține o divizare logică a programelor complexe și mari.

vector.c
#include <stdio.h>
 
void show(int nr) {
    printf("%d\n", nr);
}
 
int main(void) 
{
    int x = 10;
 
    show(10); // va printa pe ecran 10
 
    return 0;
}

Arduino. Utilizarea serialei

Pentru a afișa datele citite de pe pini de la senzori ne dorim să utilizăm Seriala de pe Arduino. Seriala este un utilitar similar cu cout din C++.

Mod de utilizare Serială

Funcții:

  • Serial.print(cuvânt) - Afișează cuvânt fără spațiul
  • Serial.println(cuvânt) - Printează cuvânt iar următorul print se va face pe linia următoare
void setup()
{
  Serial.begin(9600); // Setăm frecvența pentru Serial Monitor
  Serial.println("Am început programul");
}
 
void loop()
{
  Serial.print("Salut"); // Printează Salut la infinit!!!
}

La rularea codului de mai sus, în Serial Monitor se va afișa Salut la infinit fără spații între cuvinte: “SalutSalutSalutSalutSalutSalut”

int buton = 2;
void setup()
{
  Serial.begin(9600); // Setăm frecvența pentru Serial Monitor
  Serial.println("Am început programul");
  pinMode(buton, INPUT);
}
 
int buttonState = 0;
void loop()
{
  buttonState = digitalRead(buton);
  Serial.print("Starea butonului este: "); // Mesaj ce se afișează înaintea valorii
  Serial.println(buttonState);             // 0 sau 1 funcție de starea butonului
}

Outputul codului de mai sus va fi:

Am început programul

Starea butonului este 0

Starea butonului este 0

Starea butonului este 0

Am apăsat pe buton

Starea butonului este 1

Starea butonului este 1

Starea butonului este 1

Operații cu pinii Arduino

Pentru a utiliza pinii Arduino, trebuie să setăm modul în care vrem să îi folosim (Input/Output). De exemplu:

void setup() {
    pinMode(PINUL_DORIT, INPUT); // sau
    pinMode(PINUL_DORIT, OUTPUT);
}
 
void loop() {
}

Dacă setăm un pin în modul de output, putem seta tensiunea pe acesta folosind funcția digitalWrite(). De exemplu:

void setup() {
    pinMode(PINUL_DORIT, INPUT);
    pinMode(PINUL_DORIT, OUTPUT);
}
void loop() {
    digitalWrite(PINUL_DORIT, HIGH); // acum avem pe acest pin tensiunea de 5V
    delay(3000); // așteptăm trei secunde
    digitalWrite(PINUL_DORIT, LOW); // acum avem pe acest pin tensiunea de 0V
}

Conectare LED la Arduino

Pentru a conecta un LED, avem nevoie de fire, o rezistență de 220 de Ohmi și bineînțeles un LED. Un exemplu de conectare avem în poza de mai jos:

Circuitul este simplu: de la pinul de alimentare (pinul GPIO digital 3), conectăm rezistența de 220 de Ohmi, apoi conectăm anod-ul LED-ului. De la catod-ul LED-ului vom pleca apoi cu un fir până la un ground (GND) de pe placă. Apoi pentru a aprinde LED-ul va trebui să scriem valoarea HIGH pe pinul 3.

Exerciții

Toate exercițiile vor fi rezolvate pe Tinkercad:

  1. Folosiți interfața serială pentru a afișa la infinit un mesaj de tipul: “Salut, numele meu este X și am Y ani”. Mesajul trebuie să fie afișat unul pe linie, iar X și Y trebuie să fie variabile în cod (Nu folosiți direct valorile voastre).
  2. Folosiți un voltmetru pentru a măsura tensiunea pe pinul GPIO 3. Setați pinul pe HIGH și respectiv LOW și observați cum se schimbă valorile.
  3. Folosind un Arduino, un LED și o rezistență de 220 de ohmi, aprindeți LED-ul (fără a folosi pini GPIO) și apoi măsurați curentul și tensiunea în acel circuit.
  4. Folosind un Arduino, un LED și o rezistență de 220 de ohmi faceți LED-ul să “pâlpâie”. Rezolvați exercițiul în două moduri.
  5. Transmiteți mesajul “SOS” prin codul Morse folosind un Arduino, un LED și o rezistență de 220 de ohmi.
  6. Simulați un semafor pentru mașini și un semafor pentru pietoni care trebuie să fie sincronizate. Semafoarele vor fi implementate folosind LED-uri, iar pentru semaforul de mașini se va folosi un vector.
  7. Conectați la un Arduino un 7 SEGMENT DISPLAY și afișați fiecare cifră pe display. Rezolvați acest exercițiu în două moduri: folosind varianta “anode” și respectiv “cathode”.
  8. Utilizând ecranul de la exercițiul anterior, implementați un numărător care să numere de la 0 la 9.

100

info2/laboratoare/05-old.txt · Last modified: 2021/03/30 15:25 by alexandru.vochescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0