# CircuitPython

CircuitPython è un linguaggio di programmazione open source derivato, come fork, da MicroPython. Grazie alla sua semplicità è adatto anche per studenti e principianti ed è stato creato da Adafruit Industries con l'obiettivo di semplificare l'uso di Python su microcontrollori e dispositivi hardware specifici.
Basandosi su MicroPython, che è una versione ridotta di Python3, eredita molte delle caratteristiche di Python3, rendendo il linguaggio familiare e accessibile agli utenti che già conoscono questo linguaggio. CircuitPython è scritto in linguaggio C che garantisce alte prestazioni e l'uso efficiente delle risorse su dispositivi a risorse limitate come i microcontrollori.
CircuitPython compila il codice sorgente Python in bytecode. Dopo che il codice sorgente è stato compilato in bytecode, l'interprete runtime di CircuitPython esegue questo bytecode sull'hardware del microcontrollore.
All'utente viene presentato un prompt interattivo noto come REPL (Read-Eval-Print Loop), uno strumento che permette agli utenti di interagire con l'interprete Python in tempo reale.
CircuitPython include una varietà di moduli che consentono agli sviluppatori di accedere sia all'hardware di basso livello dei dispositivi supportati che a librerie di livello superiore pensate per facilitare l'apprendimento dei principianti.
CircuitPython è una variante di MicroPython, che è stata originariamente creata da Damien George. La comunità di MicroPython continua a discutere e sviluppare varianti di MicroPython, come CircuitPython.
CircuitPython punta a essere conforme a CPython, l'implementazione di riferimento del linguaggio di programmazione Python. I programmi scritti per schede compatibili con CircuitPython potrebbero richiedere modifiche per funzionare correttamente su altre piattaforme come ad esempio Raspberry Pi.

## Utilizzo

CircuitPython si sta affermando come alternativa per la programmazione dei microcontrollori, che tradizionalmente viene eseguita in linguaggi come C, C++ o assembly. Viene utilizzato anche per la creazione di piccoli dispositivi portatili per videogiochi. Un esempio popolare è l'Adafruit PyGamer, una console portatile programmabile che utilizza CircuitPython e consente di creare e giocare a videogiochi personalizzati.
Lo sviluppatore Chris Young ha portato il suo software di trasmissione e ricezione infrarossi su CircuitPython per facilitare l'interazione tra dispositivi e per aiutare le persone con problemi di accessibilità

## Comunità

La comunità offre supporto agli utenti attraverso una chat room Discord e a un forum di supporto dedicato. Nel 2018 è stato creato anche un account Twitter dedicato alle novità di CircuitPython.
Settimanalmente, dal 15 novembre 2016, viene pubblicata da Adafruit la newsletter dal titolo "Python on Microcontrollers". Questa newsletter fornisce notizie, aggiornamenti e informazioni utili su CircuitPython, MicroPython e, in generale, sull'uso di Python su computer a scheda singola (SBC).
Attraverso il subreddit di Reddit, "r/CircuitPython", vengono fornite notizie su CircuitPython e su progetti correlati. Attualmente conta circa 4.300 membri.

## Supporto hardware

La versione 9.1.0 supporta una gamma di architetture, chiamate "porte" (ports). Ogni "porta" è un'implementazione specifica del linguaggio per un determinato microcontrollore o famiglia di microcontrollori e richiede un adattamento del codice base di CircuitPython per sfruttare al meglio le caratteristiche hardware e le risorse del microcontrollore sottostante.
Le architetture supportate sono:
* atmel-samd: Microchip SAMD21, SAMx5x
* cxd56: Sensore di prossimità Sony
* espressif: Espressif ESP32, ESP32-S2, ESP32-S3, ESP32-C2, ESP32-C3, ESP32-C6
* nordic: Nordic nRF52840, nRF52833
* Raspberry Pi: Raspberry Pi RP2040, RP2350
* stm: famiglia di chip ST STM32F4
Queste porte sono considerate alpha e presenteranno bug e funzionalità mancanti:
* broadcom: schede Raspberry Pi come RPi 4, RPi Zero 2W (bare metal)
* litex: fomu
* mimxrt10xx: NXP i.MX RT10xxx
* renode: simulatore hardware
* silabs: famiglia Silicon Labs MG24
* stm: famiglie di chip ST non-STM32F4
Le versioni precedenti di CircuitPython supportavano il microcontrollore ESP8266, ma il suo supporto è stato abbandonato dalla versione 4.

## Blinka Software Abstraction Layer

Blinka è una libreria di astrazione software sviluppata da Adafruit per permettere l'uso delle API di CircuitPython su dispositivi che eseguono CPython o MicroPython. Questo significa che puoi utilizzare librerie e codice scritto per CircuitPython anche su altre piattaforme, come Raspberry Pi o PC desktop. Questo consente di sviluppare e testare i progetti CircuitPython su una piattaforma familiare (elencati su circuitpython.org), prima di trasferirli su un microcontrollore.
Blinka è una libreria Python installabile tramite ''pip''. Questa libreria consente di eseguire codice scritto per CircuitPython su piattaforme che eseguono Linux, come Raspberry Pi, utilizzando il runtime CPython invece del runtime di CircuitPython. Questo significa che, mentre il codice utilizza le API di CircuitPython fornite da Blinka, l'esecuzione avviene tramite il runtime di CPython. Questo aspetto è ben documentato nella guida CircuitPython Libraries on Linux and Raspberry Pi..

## Moduli (Librerie)

Adafruit può contare su una comunità molto attiva che ha contribuito con una vasta gamma di librerie software per più di 488 sensori e driver.