This shows you the differences between two versions of the page.
info2:laboratoare:05-old [2021/03/29 23:45] alexandru.vochescu created |
info2:laboratoare:05-old [2021/03/30 15:25] (current) alexandru.vochescu [Exerciții] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Lab 02 - GPIO operations ===== | + | ====== Laboratorul 05 - Arduino: Interfața serială, GPIO și Led-uri ====== |
- | ===== Purpose ===== | + | ===== Scopul laboratorului ===== |
- | * Get familiar with operations related to Arduino pins | + | * Familiarizarea cu operațiunile cu pinii Arduino |
- | * Get familiar with the basic concepts of programming | + | * Reamintirea cunoștințelor de bază din C |
- | ===== Keywords ===== | + | ===== Cuvinte cheie ===== |
* pinMode, digitalWrite, HIGH, LOW, LED | * pinMode, digitalWrite, HIGH, LOW, LED | ||
* for, if, while, vector | * for, if, while, vector | ||
- | ===== Programming concepts ===== | + | ===== Programarea în C ===== |
+ | |||
+ | ==== Variabile ==== | ||
+ | Variabilele sunt folosite pentru a stoca diverse informații de tipuri diferite. | ||
- | ==== Variables ==== | ||
- | Variables are ways in which we store values of certain types. | ||
<code c variabile.c> | <code c variabile.c> | ||
Line 26: | Line 27: | ||
</code> | </code> | ||
- | ==== Arrays ==== | + | ==== Vectori ==== |
- | Arrays are complex variables of a certain size that can store a list of values. Example: | + | Vectorii sunt variabile mai complexe de o dimensiune specifică, setată, care pot stoca o listă de valori. De exemplu: |
<code c variabile.c> | <code c variabile.c> | ||
Line 43: | Line 44: | ||
==== If - Else ==== | ==== If - Else ==== | ||
- | The if statement is a conditional sentence used to execute instructions based on certain conditions. The if-else construction translates to "if - otherwise": | + | 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”: |
<code c if_else.c> | <code c if_else.c> | ||
Line 52: | Line 53: | ||
{ | { | ||
int a = 10; | int a = 10; | ||
- | if (a == 10) { //if a is equal to 10 | + | if (a == 10) { // Dacă a este egal cu 10 |
- | // do operations when a is 10 | + | // Fă operații dacă a este 10 |
- | } else { // Else | + | } else { // Altfel |
- | // do operations when a is different from 10 | + | // Fă operații când a este diferit de 10 |
} | } | ||
return 0; | return 0; | ||
} | } | ||
</code> | </code> | ||
+ | |||
==== For ==== | ==== For ==== | ||
- | The for structure is a repetitive structure dependent on a condition. Usage: | + | Structura for este o structură repetitivă în funcție de o condiție. Mod de utilizare: |
<code c for.c> | <code c for.c> | ||
Line 75: | Line 77: | ||
return 0; | return 0; | ||
| | ||
- | // The code above will display: 0 1 2 3 4 5 6 7 8 9 10 | + | // Codul de mai sus va afișa: 0 1 2 3 4 5 6 7 8 9 10 |
} | } | ||
</code> | </code> | ||
- | ==== Iterate an array ==== | + | |
- | Accessing a certain value in an array is done by the index (position) of the value in the array. | + | ==== Parcurgerea unui șir ==== |
+ | Accesarea unei anumite valori dintr-un vector se face prin index-ul(poziția) valorii din vector. | ||
<code c vector.c> | <code c vector.c> | ||
Line 90: | Line 94: | ||
int sum = 0; | int sum = 0; | ||
| | ||
- | printf("%d\n", arr[2]); // show 3 | + | printf("%d\n", arr[2]); // afișează 3 |
- | for (i = 0; i < 9; i++) { // the positions in arrays start from 0!! | + | for (i = 0; i < 9; i++) { // Pozițiile în vector încep de la 0!! |
| | ||
- | sum = sum + arr[i]; // the sum of all the elements in the array | + | sum = sum + arr[i]; // calculăm suma tuturor elementelor din vector |
} | } | ||
| | ||
Line 101: | Line 105: | ||
</code> | </code> | ||
- | ==== Functions ==== | + | ==== Funcții ==== |
- | The functions divide complex tasks into small pieces that are easier to understand and to program. These can be reused for other occasions, instead of being rewritten from scratch. Also, the functions are useful for hiding the operating details of certain parts of the program, helping in its working mode. Using functions, which represent the fundamental unit of execution of C programs, a logical division of large and complex programs is obtained. | + | 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. |
<code c vector.c> | <code c vector.c> | ||
Line 108: | Line 112: | ||
#include <stdio.h> | #include <stdio.h> | ||
- | void show(int number) { | + | void show(int nr) { |
- | printf("%d\n", number); | + | printf("%d\n", nr); |
} | } | ||
Line 116: | Line 120: | ||
int x = 10; | int x = 10; | ||
| | ||
- | show(10); // it will show 10 | + | show(10); // va printa pe ecran 10 |
| | ||
return 0; | return 0; | ||
} | } | ||
</code> | </code> | ||
- | ===== Arduino pins operations ===== | + | |
- | To use the pins of the Arduino, we need to set the way we want to use them (INPUT/OUTPUT). Example: | + | ===== 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 | ||
+ | <code arduino.c> | ||
+ | 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!!! | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | La rularea codului de mai sus, în Serial Monitor se va afișa Salut la infinit fără spații între cuvinte: "SalutSalutSalutSalutSalutSalut" | ||
+ | |||
+ | <code arduino.c> | ||
+ | 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 | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
<code arduino.c> | <code arduino.c> | ||
void setup() { | void setup() { | ||
- | pinMode(MY_PIN_IN, INPUT); | + | pinMode(PINUL_DORIT, INPUT); // sau |
- | pinMode(MY_PIN_OUT, OUTPUT); | + | pinMode(PINUL_DORIT, OUTPUT); |
} | } | ||
+ | |||
void loop() { | void loop() { | ||
} | } | ||
</code> | </code> | ||
- | If we set a pin to OUTPUT mode, we can now output voltage to this pin using digitalWrite(). Example: | + | Dacă setăm un pin în modul de output, putem seta tensiunea pe acesta folosind funcția digitalWrite(). De exemplu: |
<code arduino.c> | <code arduino.c> | ||
void setup() { | void setup() { | ||
- | pinMode(MY_PIN_IN, INPUT); | + | pinMode(PINUL_DORIT, INPUT); |
- | pinMode(MY_PIN_OUT, OUTPUT); | + | pinMode(PINUL_DORIT, OUTPUT); |
} | } | ||
void loop() { | void loop() { | ||
- | digitalWrite(MY_PIN_OUT, HIGH); //on this pin we now have 5V | + | digitalWrite(PINUL_DORIT, HIGH); // acum avem pe acest pin tensiunea de 5V |
- | delay(3000); // wait 3 seconds | + | delay(3000); // așteptăm trei secunde |
- | digitalWrite(MY_PIN_OUT, LOW); //now we have 0V on this pin | + | digitalWrite(PINUL_DORIT, LOW); // acum avem pe acest pin tensiunea de 0V |
} | } | ||
</code> | </code> | ||
- | ===== Exercises ===== | + | ==== Conectare LED la Arduino ==== |
- | All exercises will be performed on[[https://www.tinkercad.com/| Tinkercad]] | + | |
- | - Use a voltmeter to measure the voltage on GPIO pin number 3. Set the pin to HIGH and LOW and notice how the values change. | + | 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: |
- | - Using an **ARDUINO**, a **LED** and a **220 ohm RESISTOR**, turn on the LED (don't use GPIO pins), then measure the current and the voltage on that circuit. | + | |
- | - Using an **ARDUINO**, a **LED** and a **220 ohm RESISTOR**, make the LED blink. Solve this exercise in two ways. | + | {{:info2:laboratoare:led_arduino.jpeg?400|}} |
- | - Simulate a car traffic light and a pedestrian traffic light to be synchronized. The traffic lights will be implemented using LEDs and will iterate an array. Solve this exercise in two ways. | + | |
- | - Connect to an **ARDUINO** a **7 SEGMENT DISPLAY** and using helper functions, display each number on the display. Solve this exercise in two ways: use a common anode 7 segment display, then a common cathode one. | + | 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. |
- | - Using the 7 segment display implement a counter that displays the numbers from 0 to 9. | + | ===== Exerciții ===== |
+ | Toate exercițiile vor fi rezolvate pe [[https://www.tinkercad.com/| Tinkercad]]: | ||
+ | - 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). | ||
+ | - 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. | ||
+ | - 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. | ||
+ | - 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. | ||
+ | - Transmiteți mesajul "SOS" prin codul Morse folosind un **Arduino**, un **LED** și o **rezistență de 220 de ohmi**. | ||
+ | - 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. | ||
+ | - 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". | ||
+ | - Utilizând ecranul de la exercițiul anterior, implementați un numărător care să numere de la 0 la 9. | ||
{{:info2:laboratoare:arduino-7-segment-display.png?200|100}} | {{:info2:laboratoare:arduino-7-segment-display.png?200|100}} | ||
- | - Connect 5 LEDs and control them so that each one flashes one at a time: first once, second twice, etc. | ||
- | - Use an LED to signal a word in morse code. | ||
- | - Use a buzzer to do the same. | ||