Differences

This shows you the differences between two versions of the page.

Link to this comparison view

priot:laboratoare:01 [2024/10/04 00:11]
jan.vaduva
priot:laboratoare:01 [2024/10/15 02:08] (current)
alexandru.bala [Microcontroler]
Line 1: Line 1:
-===== 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-SDKAcest 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 programareaAlegerea 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 ​SPII2C ș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 46: Line 78:
  
 Pe scurt, RP2040 oferă procesare puternică, opțiuni flexibile de memorie, diverse opțiuni de comunicare și periferice integrate, ceea ce îl face potrivit pentru diverse proiecte de dezvoltare. Pe scurt, RP2040 oferă procesare puternică, opțiuni flexibile de memorie, diverse opțiuni de comunicare și periferice integrate, ceea ce îl face potrivit pentru diverse proiecte de dezvoltare.
 +
 +==== Datasheet ====
 +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?
 +
 +  * Prezentare generală: O descriere de bază a RP2040, funcționalitățile sale și tipurile de proiecte pentru care este potrivit.
 +  * Pinout: O diagramă care arată toți pinii de pe cip, funcțiile lor (cum ar fi GPIO-urile pentru conectarea la alte componente) și specificațiile electrice (cum ar fi limitele de tensiune).
 +  * Specificații tehnice: Informații detaliate despre performanța,​ memoria, consumul de energie și alte aspecte tehnice ale RP2040.
 +
 +A avea în vedere:
 +
 +  * Complexitate:​ Fișele tehnice pot fi tehnice. Nu vă faceți griji dacă nu înțelegeți totul de la început! Concentrați-vă pe secțiunile relevante pentru proiectul dvs. (de exemplu, pinii GPIO).
 +  * Exemple limitate: Fișele tehnice pot să nu ofere ghiduri pas cu pas pentru proiecte. Cu toate acestea, ele oferă baza pentru înțelegerea modului de utilizare a RP2040 cu codul dvs.
 +  * Resurse complementare:​ Dacă fișa tehnică este copleșitoare,​ resursele online precum tutorialele și forumurile vă pot ajuta să explicați conceptele într-un mod mai ușor de utilizat.
 +
 +==== Configurarea GPIO-urilor ====
 +Pinii GPIO pot fi utilizați ca ieșiri (LED-uri, motoare, buzzere) sau ca intrări (butoane, senzori).
 +
 +RP2040 are trei periferice care controlează pinii GPIO:
 +
 +  * Pads - controlează pinul sau pad-ul fizic efectiv pe care procesorul îl are în exterior. Acest control reglează parametrii electrici, cum ar fi curentul maxim sau rezistențele de pull-up și pull-down.
 +  * IO Bank0 - conectează și multiplexează pinii perifericului la pad-urile de ieșire. Mai multe periferice utilizează același pad de ieșire pentru a comunica cu exteriorul. De exemplu, în imaginea de mai jos, GPIO0 poate fi utilizat fie pentru:
 +    * SIO - funcția GPIO
 +    * SPI_RX - pinul de recepție pentru perifericul SPI
 +    * I2C0_SDA - pinul de date pentru perifericul I2C0
 +    * UART0_TX - pinul de transmisie pentru perifericul UART0 (portul serial 0)
 +  * SIO - care controlează pinii interiori ai MCU. Acesta este perifericul pe care dezvoltatorii îl folosesc pentru a citi și a scrie valoarea pinilor.
 +
 +==== Simulator Wowki ====
 +Wokwi este o platformă bazată pe web care vă permite să simulați și să prototipați circuite electronice cu microcontrolere. Oferă o interfață vizuală unde puteți glisa și plasa componente, conectați-le cu fire virtuale și scrieți cod pentru a controla comportamentul lor. Wokwi suportă în prezent plăci de microcontrolere populare precum:
 +
 +  * Arduino Uno, Mega, Nano, etc.
 +  * Raspberry Pi Pico
 +  * Plăci ESP32 (generice)
 +  * Plăci multiple STM32
 +
 +De ce să folosiți Wokwi?
 +
 +  * Simulare rapidă și ușoară: Wokwi vă permite să creați și să testați circuite electronice fără a avea nevoie de hardware fizic. Acest lucru poate accelera semnificativ procesul de dezvoltare.
 +  * Interfață intuitivă: Platforma oferă o interfață grafică ușor de utilizat, ceea ce face accesibilă chiar și pentru începători în domeniul electronicii.
 +  * Integrare cu IDE-uri populare: Wokwi se poate integra cu IDE-uri precum Arduino IDE și Visual Studio Code, permițându-vă să scrieți și să compilați codul direct în cadrul platformei.
 +  * Funcționalități avansate: Pe lângă simulare și prototipare,​ Wokwi oferă și funcționalități precum debug-ul, analiza circuitelor și partajarea proiectelor cu alții.
 +
 +Cum funcționează Wokwi?
 +
 +  * Creați un nou proiect: Alegeți un tip de microcontroler și începeți să adăugați componente în circuitul dvs.
 +  * Conectați componentele:​ Folosiți fire virtuale pentru a conecta componentele împreună.
 +  * Scrieți cod: Utilizați editorul de cod integrat pentru a scrie codul care va controla comportamentul componentelor.
 +  * Simulați circuitul: Apăsați butonul de simulare pentru a vedea cum funcționează circuitul dvs. în timp real.
 +
 +Wokwi este un instrument excelent pentru studenții de la Computer Science care doresc să învețe despre electronică și programare. Platforma oferă un mediu sigur și accesibil pentru experimentare și dezvoltare de proiecte.
 +
 +==== Exercitii ====
 +  - Creați un program în Wokwi pentru a clipi un LED conectat la un microcontroler Raspberry Pi Pico (RP2040).
 +    * [[https://​wokwi.com/​projects/​403560205017402369|Folositi template-ul disponibil]]
 +  - 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]]
 +  - 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>​
 +
priot/laboratoare/01.1727989876.txt.gz · Last modified: 2024/10/04 00:11 by jan.vaduva
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