This shows you the differences between two versions of the page.
priot:laboratoare:01 [2024/10/06 19:51] jan.vaduva [Exercitii] |
priot:laboratoare:01 [2024/10/15 02:08] (current) alexandru.bala [Microcontroler] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Simulator Wowki, introducere în RP2040 ===== | + | ===== Laboratorul 01: Simulator Wowki, introducere în RP2040 ===== |
Line 6: | Line 6: | ||
Microcontrolerele sunt circuite integrate (IC) mici pe care le puteți programa să îndeplinească diverse sarcini. Acestea au un procesor, memorie și pini de intrare/ieșire (GPIO) pentru a interacționa cu lumea externă. De la jucării până la mașini, microcontrolerele sunt prezente peste tot în electronică. | Microcontrolerele sunt circuite integrate (IC) mici pe care le puteți programa să îndeplinească diverse sarcini. Acestea au un procesor, memorie și pini de intrare/ieșire (GPIO) pentru a interacționa cu lumea externă. De la jucării până la mașini, microcontrolerele sunt prezente peste tot în electronică. | ||
- | RP2040 este un microcontroler puternic și versatil construit de Raspberry Pi Foundation. Acest cip, bazat pe arhitectura ARM, este inima plăcilor de dezvoltare precum popularul Raspberry Pi Pico. De asemenea, folosim RP2040 în placa Marble Pico. | + | **RP2040** este un microcontroler puternic și versatil construit de Raspberry Pi Foundation. Acest cip, bazat pe **arhitectura ARM**, este inima plăcilor de dezvoltare precum popularul **Raspberry Pi Pico**. De asemenea, folosim RP2040 în placa **Marble Pico**. |
| {{ :eap:laboratoare:rpi-pico.jpg?nolink&200 |Raspberry Pi Pico board}} | {{ :eap:laboratoare:marble-pico.jpg?nolink&400 |Marble Pico board}} | | | {{ :eap:laboratoare:rpi-pico.jpg?nolink&200 |Raspberry Pi Pico board}} | {{ :eap:laboratoare:marble-pico.jpg?nolink&400 |Marble Pico board}} | | ||
- | Pentru a debloca potențialul RP2040, Raspberry Pi Foundation a creat Pico-SDK. Acest kit de dezvoltare software (SDK) gratuit și open-source vă oferă instrumentele și bibliotecile necesare pentru a programa RP2040 în C și C++. | + | Raspberry Pi Pico oferă o flexibilitate remarcabilă în ceea ce privește programarea. Alegerea metodei potrivite depinde de nevoile și preferințele tale. Indiferent de metoda aleasă, Pico-SDK oferă o bază solidă pentru dezvoltarea de aplicații embedded. |
+ | Pentru a debloca potențialul microcontroller-ului RP2040, Raspberry Pi Foundation a creat Pico-SDK. Acest kit de dezvoltare software (SDK) gratuit și open-source vă oferă instrumentele și bibliotecile necesare pentru a programa RP2040 în C și C++. | ||
+ | |||
+ | Pe lângă Pico-SDK, există și alte metode eficiente pentru a programa Raspberry Pi Pico, fiecare având propriile avantaje și dezavantaje: | ||
+ | |||
+ | 1. **MicroPython** este o implementare a limbajului Python pentru microcontrolere și sisteme embedded. Oferă avantajele Python-ului, cum ar fi dezvoltarea rapidă și sintaxa simplă, păstrând în același timp o amprentă mică potrivită pentru dispozitive cu resurse limitate. Este ideal pentru prototipuri rapide și proiecte educaționale, deși poate avea performanțe ușor mai scăzute decât C/C++ pentru aplicații care necesită calcule intensive. | ||
+ | |||
+ | 2. **CircuitPython** este o variantă a Python-ului optimizată pentru microcontrolere, cu accent pe ușurința utilizării și integrarea hardware. Este similar cu MicroPython, dar se remarcă prin integrarea superioară cu plăci precum Raspberry Pi Pico și o comunitate în expansiune. Deși excelent pentru proiecte educaționale și de dimensiuni mici spre medii, poate avea unele limitări în comparație cu MicroPython în ceea ce privește gama de biblioteci și funcționalități disponibile. | ||
+ | |||
+ | 3. Alte limbaje: | ||
+ | * **Rust**: Un limbaj de programare modern, sigur și performant, care devine din ce în ce mai popular în dezvoltarea embedded. | ||
+ | * **Assembly**: Pentru aplicații foarte specifice și optimizate, dar necesită o înțelegere profundă a arhitecturii procesorului. | ||
+ | |||
+ | IDE-uri și medii de dezvoltare: | ||
+ | |||
+ | * Thonny: Simplu, ideal pentru începători și MicroPython. | ||
+ | * Visual Studio Code: Versatil, cu extensii pentru C/C++, MicroPython și CircuitPython. | ||
+ | * Arduino IDE: Familiar utilizatorilor de Arduino, configurabil pentru Pico. | ||
+ | * Linia de comandă: Control complet pentru utilizatori avansați. | ||
+ | * Platform IO: Platformă unificată pentru proiecte IoT, inclusiv Pico. | ||
+ | |||
+ | Opțiuni pentru programare cu SDK-ul C: | ||
+ | |||
+ | * VSCode cu extensia oficială Raspberry Pi, de aici:https://github.com/raspberrypi/pico-vscode (vă îndeamnă să citiți PDF-ul pentru instrucțiuni de instalare / utilizare -- so do it!) | ||
+ | * Arduino IDE cu extensie specifică: https://arduino-pico.readthedocs.io/en/latest/install.html (read the docs) | ||
+ | * Pentru Linux: Clonare SDK (https://github.com/raspberrypi/pico-sdk) și instalare pachete necesare, e.g.**gcc-arm-none-eabi build-essential cmake ninja-build** pe Ubuntu>=22.04. | ||
+ | |||
+ | |||
+ | Desi marea majoritatea a proiectelor experimentate in cadrul laboratorului pot fi realizate cu MicroPython sau CircuitPython pentru proiectele mai complexe recomandam utilizarea C/C++ in special din considerente de performanta. De asemenea recomandam sa verificati disponibilitatea bibliotecilor, pentru a va asigura că există biblioteci disponibile pentru limbajul și proiectul dvs. | ||
==== RP2040 ==== | ==== RP2040 ==== | ||
Line 28: | Line 56: | ||
* Memorie: | * Memorie: | ||
* Suport pentru memorie externă: Codul poate fi executat direct din memoria flash externă folosind interfețele SPI, DSPI sau QSPI. O mică cache internă îmbunătățește performanța pentru datele accesate frecvent. | * Suport pentru memorie externă: Codul poate fi executat direct din memoria flash externă folosind interfețele SPI, DSPI sau QSPI. O mică cache internă îmbunătățește performanța pentru datele accesate frecvent. | ||
- | * SRAM internă: Memoria internă (264 kB) poate stoca cod sau date și este accesibilă simultan de diferite părți ale cipului. | + | * SRAM internă: Memoria internă (256 kB) poate stoca cod sau date și este accesibilă simultan de diferite părți ale cipului. |
* Procesare: | * Procesare: | ||
- | * DMA: Canalele DMA (Direct Memory Access) dedicate descarcă sarcinile repetitive de mutare a datelor de la procesoare, îmbunătățind eficiența. | + | * **DMA**: Canalele DMA (Direct Memory Access) dedicate descarcă sarcinile repetitive de mutare a datelor de la procesoare, îmbunătățind eficiența. |
* I/O flexibil: Pinii GPIO pot fi controlați direct sau prin funcții logice integrate. | * I/O flexibil: Pinii GPIO pot fi controlați direct sau prin funcții logice integrate. | ||
* Comunicare: | * Comunicare: | ||
- | * Periferice hardware: Hardware-ul dedicat gestionează protocoalele standard de comunicare precum SPI, I2C și UART. | + | * Periferice hardware: Hardware-ul dedicat gestionează protocoalele standard de comunicare: |
+ | * **UART**: Pentru comunicație serială | ||
+ | * **SPI**: Pentru comunicație serială sincronă | ||
+ | * **I2C**: Pentru comunicație serială multi-master | ||
* I/O programabil (PIO): Controlierele PIO flexibile pot fi configurate pentru diverse funcții de I/O personalizate. | * I/O programabil (PIO): Controlierele PIO flexibile pot fi configurate pentru diverse funcții de I/O personalizate. | ||
- | * USB: | + | * **USB** - poate fi utilizată atât pentru programarea microcontrolerului, cât și pentru comunicația cu alte dispozitive: |
* Controler USB integrat: Oferă funcționalitate USB host sau device sub control software (Full Speed/Low Speed). | * Controler USB integrat: Oferă funcționalitate USB host sau device sub control software (Full Speed/Low Speed). | ||
- | * Convertor analog-digital (ADC): Patru canale ADC pot fi folosite pentru a converti semnalele analogice în date digitale. | + | * Convertor analog-digital (**ADC** - pentru conversia analog-digitală): Patru canale ADC pot fi folosite pentru a converti semnalele analogice în date digitale. |
- | * Ceasuri: | + | * **PWM**: Pentru generarea de semnale PWM (Pulse Width Modulation) |
+ | * **Ceasuri** - pentru măsurarea timpului și generarea de întreruperi: | ||
* Două bucle cu fază blocată (PLL): Generează ceasuri pentru funcții specifice precum USB (48MHz) și sistemul (până la 133MHz). | * Două bucle cu fază blocată (PLL): Generează ceasuri pentru funcții specifice precum USB (48MHz) și sistemul (până la 133MHz). | ||
* Gestionarea puterii: | * Gestionarea puterii: | ||
Line 48: | Line 80: | ||
==== Datasheet ==== | ==== Datasheet ==== | ||
- | P2040, la fel ca majoritatea componentelor electronice, are o fișă tehnică (uneori numită fișă de date sau fișă de specificații). Acest document este ca un manual de instrucțiuni pentru cip, explicând caracteristicile sale și cum să îl utilizați în proiectele dvs. | + | RP2040, la fel ca majoritatea componentelor electronice, are o fișă tehnică (uneori numită fișă de date sau fișă de specificații). Acest document este ca un manual de instrucțiuni pentru cip, explicând caracteristicile sale și cum să îl utilizați în proiectele dvs. |
Ce conține o fișă tehnică RP2040? | Ce conține o fișă tehnică RP2040? | ||
Line 104: | Line 136: | ||
- Proiectați și implementați un program pentru un microcontroler Raspberry Pi Pico (RP2040) care incrementează un contor de la 0 la 9 și afișează numărul curent pe un display cu 7 segmente. Programul ar trebui să includă și un buton de resetare care, atunci când este apăsat, resetează contorul înapoi la 0. | - Proiectați și implementați un program pentru un microcontroler Raspberry Pi Pico (RP2040) care incrementează un contor de la 0 la 9 și afișează numărul curent pe un display cu 7 segmente. Programul ar trebui să includă și un buton de resetare care, atunci când este apăsat, resetează contorul înapoi la 0. | ||
* [[https://wokwi.com/projects/403561096139405313|Folositi template-ul disponibil]] | * [[https://wokwi.com/projects/403561096139405313|Folositi template-ul disponibil]] | ||
+ | - Rescrieti aplicatia de la punctul 2 in MicroPython si observati diferentele de implementare. | ||
+ | |||
+ | ==== Bibliografie ==== | ||
+ | |||
+ | - [[https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf|Datasheet microcontroller RP2040]] | ||
+ | - [[https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf|Datasheet Raspberry Pi Pico]] | ||
+ | - [[https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html|Pico-SDK]] | ||
+ | - [[https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#ga71d35b29e897b9bb4fc881b587b08cab|Documentatie Pico-SDK]] | ||
+ | - [[https://proto-pic.co.uk/content/RPI-PICO-R3-PUBLIC-SCHEMATIC.pdf|Schematic Raspberry Pi Pico]] | ||
+ | |||
+ | <hidden> | ||
+ | - [[https://github.com/raspberrypi/pico-examples/blob/master/blink/blink.c|Rezolvare blink led oficiala, dar prea complexa, merge mai simplu]] | ||
+ | - {{ priot:laboratoare:iot-gpio-task1.c.txt|Rezolvare exercitiu segment counter}} | ||
+ | |||
+ | <code lang ex1.c> | ||
+ | #include "pico/stdlib.h" | ||
+ | |||
+ | #define LED_PIN 2 | ||
+ | |||
+ | int main() { | ||
+ | gpio_init(LED_PIN); | ||
+ | gpio_set_dir(LED_PIN, GPIO_OUT); | ||
+ | while (true) { | ||
+ | gpio_put(LED_PIN, 1); | ||
+ | sleep_ms(250); | ||
+ | gpio_put(LED_PIN, 0); | ||
+ | sleep_ms(250); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | <code lang ex2.c> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | #include <stdint.h> | ||
+ | #include "pico/stdlib.h" | ||
+ | #include "hardware/gpio.h" | ||
+ | |||
+ | #define BTN_GPIO 18 | ||
+ | char segments[] = { 8, 9, 11, 12, 13, 15, 14 }; | ||
+ | char digits[][7] = { | ||
+ | // A B C D E F G | ||
+ | { 1, 1, 1, 1, 1, 1, 0}, // 0 | ||
+ | { 0, 1, 1, 0, 0, 0, 0}, // 1 | ||
+ | { 1, 1, 0, 1, 1, 0, 1}, // 2 | ||
+ | { 1, 1, 1, 1, 0, 0, 1}, // 3 | ||
+ | { 0, 1, 1, 0, 0, 1, 1}, // 4 | ||
+ | { 1, 0, 1, 1, 0, 1, 1}, // 5 | ||
+ | { 1, 0, 1, 1, 1, 1, 1}, // 6 | ||
+ | { 1, 1, 1, 0, 0, 0, 0}, // 7 | ||
+ | { 1, 1, 1, 1, 1, 1, 1}, // 8 | ||
+ | { 1, 1, 1, 1, 0, 1, 1}, // 9 | ||
+ | }; | ||
+ | const uint32_t digit_mask[] = { | ||
+ | // 00000000 00000000 10111011 00000000 | ||
+ | (1 << 8) | (1 << 9) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 15) | (0 << 14), | ||
+ | (0 << 8) | (1 << 9) | (1 << 11) | (0 << 12) | (0 << 13) | (0 << 15) | (0 << 14), | ||
+ | (1 << 8) | (1 << 9) | (0 << 11) | (1 << 12) | (1 << 13) | (0 << 15) | (1 << 14), | ||
+ | (1 << 8) | (1 << 9) | (1 << 11) | (1 << 12) | (0 << 13) | (0 << 15) | (1 << 14), | ||
+ | (0 << 8) | (1 << 9) | (1 << 11) | (0 << 12) | (0 << 13) | (1 << 15) | (1 << 14), | ||
+ | (1 << 8) | (0 << 9) | (1 << 11) | (1 << 12) | (0 << 13) | (1 << 15) | (1 << 14), | ||
+ | (1 << 8) | (0 << 9) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 15) | (1 << 14), | ||
+ | (1 << 8) | (1 << 9) | (1 << 11) | (0 << 12) | (0 << 13) | (0 << 15) | (0 << 14), | ||
+ | (1 << 8) | (1 << 9) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 15) | (1 << 14), | ||
+ | (1 << 8) | (1 << 9) | (1 << 11) | (1 << 12) | (0 << 13) | (1 << 15) | (1 << 14), | ||
+ | }; | ||
+ | const uint32_t digit_mask_all = 0b1111101100000000; | ||
+ | |||
+ | |||
+ | void display_digit(int digit) | ||
+ | { | ||
+ | gpio_set_mask(digit_mask_all); | ||
+ | gpio_clr_mask(digit_mask[digit]); | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | stdio_init_all(); | ||
+ | printf("Hello!\r\n"); | ||
+ | |||
+ | for (int i=0; i<7; i++) { | ||
+ | gpio_init(segments[i]); | ||
+ | gpio_set_dir(segments[i], GPIO_OUT); | ||
+ | } | ||
+ | gpio_init(10); | ||
+ | gpio_set_dir(10, GPIO_OUT); | ||
+ | gpio_init(BTN_GPIO); | ||
+ | gpio_set_dir(BTN_GPIO, GPIO_IN); | ||
+ | gpio_pull_up(BTN_GPIO); | ||
+ | |||
+ | int ctr = 0; | ||
+ | while (1) { | ||
+ | if (!gpio_get(BTN_GPIO)) { | ||
+ | ctr = 0; | ||
+ | }else{ | ||
+ | display_digit(ctr); | ||
+ | ctr = (ctr + 1) % 10; | ||
+ | | ||
+ | sleep_ms(1000); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | </hidden> | ||