
Qualche anno fa ho scoperto i microcontrollori russi della Milandr. Era il 2013, e gli ingegneri discutevano animatamente i primi risultati del programma federale "Sviluppo della base elettronica e della radioelettronica" per il periodo 2008-2015. A quel tempo, era già stato rilasciato il controller K1986ВЕ9x (nucleo Cortex-M3) e stava appena entrando in scena il controller K1986ВЕ1Т (nucleo Cortex-M1). Quest'ultimo, contenuto in un involucro plastico LQFP-144, era designato nella documentazione come K1986ВЕ1QI (aeronautico), mentre sulla scheda integrata appariva come MDR32F1QI. Sul sito del produttore, ha il suffisso "aeronautico", in quanto possiede interfacce specifiche per l'industria aeronautica (ARINC 429, MIL_STD_1553).
È sorprendente, ma al momento della distribuzione di questi controllori da parte dell'azienda «Milandr» erano stati preparati kit di debug e una libreria di sottoprogrammi per lavorare con le periferiche, "ma senza alcuna garanzia o impegno sulla correttezza della libreria". La libreria è simile alla Standard Peripheral Library della STMicroelectronics. In generale, tutti i controllori ARM basati sul nucleo Cortex-M hanno molto in comune. Per questo motivo, la familiarizzazione con i nuovi controllori russi è avvenuta rapidamente. Inoltre, per coloro che acquistavano kit di debug ufficiali, era disponibile supporto tecnico durante l'utilizzo.

Kit di debug per microcontrollore 1986ВЕ1Т, © Milandr
Tuttavia, col passare del tempo sono emerse le "malattie infantili" dei nuovi chip e librerie. Gli esempi di test delle firmware funzionavano senza problemi evidenti, ma con modifiche sostanziali si verificavano guasti e errori. La prima "avvisaglia" nella mia esperienza sono stati guasti inspiegabili nel funzionamento del controllore CAN. Dopo un anno, sul controllore 1986ВЕ1Т (avionico) di prima revisione è stata identificata una problematica con il modulo . In generale, tutte le revisioni di questi microcontrollori fino al 2016 avevano una validità limitata. Molto tempo e nervi sono stati spesi per identificare questi problemi, la cui conferma può ora essere trovata in .
Una particolarità sgradevole era che lavorare e occuparsi degli errori doveva avvenire non su schede di debug, ma su schede prototipo degli apparecchi previsti per la produzione industriale. Oltre al connettore JTAG, di solito non c'era niente. Collegarsi con un analizzatore logico era complicato e scomodo, e diodi LED e schermi normalmente non erano presenti. Per questo motivo, mi è venuta in mente l'idea di creare la mia scheda di debug.
Da un lato, sul mercato c'erano kit di debug commerciali, oltre a fantastiche schede dall'azienda LDM-Systems di Zelenograd. Dall'altro, i prezzi di questi prodotti sono sconvolgenti, e la funzionalità di base senza schede di espansione non corrisponde alle aspettative. Una scheda con il controller saldato e un connettore a pin non mi interessa. E schede più interessanti sono costose.

Scheda di debug MILANDR LDM-HELPER-K1986BE1QI-FULL, © LDM Systems
L'azienda «Milandr» ha una politica dei prezzi e di marketing peculiare. È possibile richiedere gratuitamente campioni di alcuni circuiti integrati, ma ciò è disponibile solo per le persone giuridiche ed è soggetto a un processo burocratico complesso. In generale, i circuiti integrati in confezione metallo-ceramica sono considerati 'd'oro' sia in senso letterale che figurato. Ad esempio, il controller 1986ВЕ1Т ha un prezzo a Mosca che varia da 14.000 a 24.000 rubli. Il circuito integrato di memoria statica 1645РУ6У costa da 15.000 rubli. Questa è la tendenza dei prezzi per tutti i prodotti. Alla fine, anche gli istituti di ricerca specializzati con contratti statali cercano di risparmiare e si tirano indietro di fronte a tali prezzi. I circuiti integrati in confezione plastica per uso civile sono notevolmente più economici, ma non sono disponibili presso i fornitori popolari. Inoltre, la qualità dei circuiti integrati in confezione plastica, a mio avviso, è inferiore rispetto a quelli 'd'oro'. Ad esempio, non sono riuscito ad avviare il controller K1986BE1QI a una frequenza di 128 MHz senza aumentare il parametro della latenza flash. Contemporaneamente, la temperatura di questo controller è salita a 40-50°C. Invece, il controller 1986BE1T ('d'oro') si è avviato a 128 MHz senza ulteriori impostazioni e rimaneva freddo. È davvero eccellente.

Microcontrollore «Gold» 1986BE1T, (c) Milandr
Sono stato fortunato a trovare il microcontrollore in un involucro di plastica disponibile al pubblico presso LDM Systems, e tutti gli schemi delle schede sono accessibili gratuitamente. Peccato che nella foto del controllore sul sito sia visibile una marcatura che indica che si tratta della revisione 4 del 2014, quindi con difetti. Ho pensato a lungo se acquistarlo o meno. Così sono passati diversi anni...
L'idea di creare una scheda di debug non è mai scomparsa. Col tempo ho definito tutti i requisiti e riflettuto su come disporre tutto su un'unica scheda in modo compatto e a basso costo. Parallelamente, ordinavo i componenti mancanti dai fornitori cinesi. Non avevo fretta: stavo facendo tutto per me. I fornitori cinesi sono noti per la loro disorganizzazione: ho dovuto ordinare le stesse cose in diversi posti per ottenere tutto ciò di cui avevo bisogno. Inoltre, alcune delle memorie si sono rivelate usate: evidentemente erano state dissaldati da strumenti rotti. Questo si è rivelato un problema in seguito.
Acquistare il microcontrollore Milandr K1986ВЕ1QI (avionico) non è un compito semplice. Nello stesso negozio "Chip e Dip", nella sezione "Articoli su ordinazione", ho trovato solo il K1986BE92QI a 740 rubli, ma non era adatto a me. L'unica opzione era acquistare da LDM-Systems una revisione non recente a 2000 rubli. Poiché non sono riuscito a trovare una sostituzione altrove, ho deciso di comprare ciò che era disponibile. Con mio grande piacere, mi hanno venduto un nuovo controllore prodotto nel dicembre 2018, revisione 6+ (1820). E sul sito ancora c'è una vecchia foto, e al momento della scrittura dell'articolo, il controllore non è disponibile...

Microcontrollore K1986ВЕ1QI (avionico) in imballaggio tecnologico, (c) Foto dell'autore
Principali caratteristiche tecniche della mia scheda di sviluppo MDB1986 le seguenti:
- debugger-programmatore integrato, compatibile con J-Link e CMSIS-DAP;
- memoria statica 4Mbit (256k x 16, 10 ns);
- chip di memoria flash 64Mbit, Winbond 25Q64FVSIG;
- ricevitore-trasmettitore dell'interfaccia RS-232 con linee RTS e CTS;
- interfacce e connettori per Ethernet, USB, CAN;
- controller per display a 7 segmenti MAX7221;
- connettore a pin per lavorare con MKIO (MIL_STD_1553) e ARINC429;
- fototransistor Everlight PT17-21C;
- cinque LED colorati, un pulsante di ripristino e due pulsanti personalizzati;
- alimentazione da porta USB 5 volt;
- dimensioni della scheda PCB 100 x 80 mm
Mi sono sempre piaciute le schede della serie STM-Discovery perché hanno un programmator-debugger integrato – ST-Link. Il marchio ST-Link funziona solo con i microcontrollori della STMicroelectronics, ma un paio d'anni fa è stata introdotta la possibilità di aggiornare il firmware di ST-Link per ottenere il SEGGER J-Link OB (on-board) Debugger. Legalmente, c'è una limitazione sull'uso di tale debugger solo con le schede STMicroelectronics, ma di fatto il potenziale non è limitato. Quindi, avendo il J-Link OB, è possibile avere un programmator-debugger integrato sulla scheda di debug. Va notato che nei prodotti "LDM-Systems" è utilizzato il convertitore CP2102 (Usb2Uart), che può solo eseguire il flashing.

Microcontrollori STM32F103C8T6, veri e non, (c) Foto dell'autore
Quindi, era necessario acquistare un originale STM32F103C8T6, poiché i firmware ufficiali non funzioneranno correttamente con un clone. Inizialmente avevo dei dubbi su questa affermazione e ho deciso di provare il controllore CS32F103C8T6 del produttore cinese CKS. Non ho obiezioni sul controllore stesso, ma il firmware ufficiale ST-Link non ha funzionato. J-Link ha funzionato parzialmente: il dispositivo USB veniva riconosciuto, ma il programmatore non svolgeva le sue funzioni e continuava a segnalare che era “defective”.

Errore del debugger su un controllore non originale
Non mi sono fermato e prima ho scritto un firmware per far lampeggiare un LED, poi ho implementato la richiesta IDCODE secondo il protocollo JTAG. Il programmatore ST-Link, che avevo sulla scheda Discovery, e il programma ST-Link Utility hanno programmato senza problemi il CS32F103C8T6. Alla fine, mi sono assicurato che il mio circuito funzionasse. Con mia gioia, il controllore target K1986BE1QI (aviazione) ha restituito il suo IDCODE attraverso la linea TDO.

Oscillogramma della linea di segnale TDO con la risposta codificata IDCODE, (c) Foto dell'autore

Ecco che mi è servito il port SWD per il debug del debugger stesso e per controllare l'IDCODE
Rimaneva l'opzione con il debugger . Assemblare un progetto dai sorgenti ARM è un compito non facile; ho preso il progetto da , e poi ho provato anche DAP42. Purtroppo, Keil uVision si bloccava e non voleva collaborare. Alla fine, ho sostituito il chip del debugger con il marchio STM32F103C8T6 e non ci ho più riprovato.

Funzionamento riuscito del debugger incorporato J-Link STLink V2
Quando tutti i componenti chiave della scheda di debug futura erano disponibili, sono andato su Eagle CAD e ho scoperto che non erano presenti nella libreria degli elementi. Non avevo alternative: ho dovuto disegnarli da solo. Nel contempo, ho realizzato i posti per la memoria, il connettore HanRun per Ethernet e ho aggiunto delle cornici per i resistori e i condensatori. Il file del progetto e la libreria dei componenti possono essere trovati .
Schema elettrico della scheda di debug MDB1986
La scheda è alimentata da una fonte di tensione continua di 5 volt, che proviene dalla porta USB. In totale, la scheda dispone di due porte USB Type-B. Una è per il programmatore, l'altra per il controller K1986BE1QI. La scheda può funzionare con una di queste fonti o con entrambe contemporaneamente. La regolazione del carico più semplice e la protezione delle linee di alimentazione sono implementate tramite diodi Schottky, sul circuito D2 e D3 (SS24). Inoltre, nel circuito si possono vedere i fusibili auto-ripristinabili F1 e F2 da 500mA. Le linee di segnale della porta USB sono protette da un assemblaggio di diodi USBLC6-2SC6.
Il circuito del debugger-programmatore ST-Link è noto a molti e può essere trovato nella documentazione delle schede STM32-Discovery e in altre fonti. Per il primo flashing del clone ST-Link/J-Link-OB/DAP (a scelta), ho portato le linee SWDIO (PA13), SWCLK (PA14), GND. Molti usano UART per il flashing e sono costretti a smontare i ponticelli BOOT. Tuttavia, per me è più comodo SWD, inoltre questo protocollo consente anche il debug.
Quasi tutti i componenti della scheda sono alimentati a 3.3 volt, forniti dal regolatore di tensione AMS1117-3.3. Per attenuare le interferenze elettromagnetiche e i picchi di corrente, vengono utilizzati filtri LC composti da condensatori e induttori della serie BLM31PG.
È importante menzionare il driver del display a 7 segmenti MAX7221. Secondo la specifica, l'alimentazione consigliata è tra 4 e 5.5 volt, e il livello di segnale alto (logico uno) deve essere di almeno 3.5V (0.7 x VCC) quando alimentato a 5V. Per il controller K1986VE1QI (aereo), l'uscita logica corrisponde a una tensione tra 2.8 e 3.3V. È evidente che ci sia una discordanza nei livelli di segnale, il che potrebbe compromettere il funzionamento normale. Ho deciso di alimentare il MAX7221 a 4V e di ridurre i livelli di segnale a 2.8V (0.7 x 4 = 2.8). A tal fine, ho installato in serie un diodo D4 (RS1A o FR103) nel circuito di alimentazione del driver. In totale, la caduta di tensione è di 0.9V (diode Schottky 0.3V e diodo 0.6V), e funziona tutto correttamente.
La maggior parte delle porte del microcontrollore K1986VE1QI (aereo) è compatibile con segnali fino a 5V. Pertanto, non ci sono problemi nell'utilizzo del trasmettitore/ricevitore CAN MCP2551, che funziona anche a 5V. Come trasmettitore/ricevitore RS-232, nel circuito è indicato il chip MAX3232, ma in realtà ho utilizzato lo SN65C3232D della Texas Instruments, poiché funziona a 3.3V e offre velocità fino a 1Mbit/s.
Sulla scheda sono presenti 4 cristalli quartz per l'oscillatore – uno per il debugger (8 MHz) e tre per il microcontrollore target К1986ВЕ1QI (avionico) con valori di 32.768 kHz, 16 MHz, 25 MHz. Questi sono componenti necessari, poiché i parametri del generatore RC integrato variano ampiamente da 6 a 10 MHz. La frequenza di 25 MHz è necessaria per il funzionamento del controller Ethernet integrato. Sul sito di Milandra (forse per errore) è indicato che la versione in plastica dell'Ethernet è assente. Ma ci baseremo sulle specifiche e sui fatti.
Un importante stimolo per la creazione della propria scheda di debugging è stata la possibilità di lavorare con un bus di sistema esterno EBC (external bus controller), che è sostanzialmente una porta parallela. Il microcontrollore K1986ВЕ1QI (aviazione) consente di collegare e lavorare con chip di memoria esterni e dispositivi periferici, come ADC, FPGA, ecc. Le possibilità del bus di sistema esterno sono piuttosto ampie: è possibile lavorare con RAM statica da 8, 16 e 32 bit, ROM e NAND Flash. Per la lettura/scrittura di dati a 32 bit, il controllore è in grado di eseguire automaticamente 2 operazioni corrispondenti per chip da 16 bit, mentre per i chip da 8 bit, ne esegue 4. È ovvio che un'operazione di input/output a 32 bit sarà eseguita più velocemente con un bus dati a 32 bit. Tra i contro, vi è la necessità di operare con dati a 32 bit nel programma, e sulla scheda saranno necessarie 32 tracce.

Chip di RAM statica, usati (indovina quale ha un difetto)
Una soluzione equilibrata è l'uso di chip di memoria a 16 bit. Ho a disposizione chip della Integrated Silicon Solutions Inc. (ISSI IS61LV25616AL, 16 x 256k, 10 ns, 3.3V). Certo, l'azienda «Milandr» ha i suoi chip di memoria statica , ma sono troppo costosi e non disponibili. Come alternativa, ci sono chip compatibili della Samsung K6R4016V1D. Ho già accennato che i chip si sono rivelati usati e l'unità che ho installato inizialmente dava errori e valori casuali sulla 15esima linea di dati. Ci sono voluti alcuni giorni per cercare errori hardware, e c'è stata una grande soddisfazione quando ho sostituito il chip danneggiato con uno funzionante. Tuttavia, la velocità di accesso alla memoria esterna lascia a desiderare.
Bus esterno e modalità StandAloneIl microcontrollore K1986ВЕ1QI (aeronautico) ha una modalità unica StandAlone, progettata per l'accesso diretto da esterno ai controller Ethernet e MKIO (MIL_STD_1553) tramite il bus esterno, mentre il nucleo si trova in uno stato di ripristino, ossia non è utilizzato. Questa modalità è utile per processori e FPGA, dove non ci sono Ethernet e/o MKIO.
Schema di collegamento è il seguente:
- bus data MCU(D0-D15) => SRAM(I/O0-I/O15),
- bus address MCU(A1-A18) => SRAM(A0-A17),
- control MCU(nWR,nRD,PortC2) => SRAM (WE,OE,CE),
- SRAM(UB,LB) sono collegati o tirati a terra tramite una resistenza.
La linea CE è tirata all'alimentazione tramite una resistenza, i pin per la selezione del byte MCU(BE0-BE3) non sono utilizzati. Sotto il spoiler, fornisco il codice di inizializzazione delle porte e del controllore della bus esterna.
Inizializzazione delle porte e del controllore EBC (controllore del bus esterno)
void SRAM_Init (void)
{
EBC_InitTypeDef EBC_InitStruct = { 0 };
EBC_MemRegionInitTypeDef EBC_MemRegionInitStruct = { 0 };
PORT_InitTypeDef initStruct = { 0 };
RST_CLK_PCLKcmd (RST_CLK_PCLK_EBC, ENABLE);
PORT_StructInit (&initStruct);
//--------------------------------------------//
// DATA PA0..PA15 (D0..D15) //
//--------------------------------------------//
initStruct.PORT_MODE = PORT_MODE_DIGITAL;
initStruct.PORT_PD_SHM = PORT_PD_SHM_ON;
initStruct.PORT_SPEED = PORT_SPEED_FAST;
initStruct.PORT_FUNC = PORT_FUNC_MAIN;
initStruct.PORT_Pin = PORT_Pin_All;
PORT_Init (MDR_PORTA, &initStruct);
//--------------------------------------------//
// Address PF3-PF15 (A0..A12), A0 - not used. //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_ALTER;
initStruct.PORT_Pin = PORT_Pin_4 | PORT_Pin_5 |
PORT_Pin_6 | PORT_Pin_7 |
PORT_Pin_8 | PORT_Pin_9 |
PORT_Pin_10 | PORT_Pin_11 |
PORT_Pin_12 | PORT_Pin_13 |
PORT_Pin_14 | PORT_Pin_15;
PORT_Init (MDR_PORTF, &initStruct);
//--------------------------------------------//
// Address PD3..PD0 (A13..A16) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_OVERRID;
initStruct.PORT_Pin = PORT_Pin_0 | PORT_Pin_1 |
PORT_Pin_2 | PORT_Pin_3;
PORT_Init (MDR_PORTD, &initStruct);
//--------------------------------------------//
// Address PE3, PE4 (A17, A18) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_ALTER;
initStruct.PORT_Pin = PORT_Pin_3 | PORT_Pin_4;
PORT_Init (MDR_PORTE, &initStruct);
//--------------------------------------------//
// Control PC0,PC1 (nWE,nOE) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_MAIN;
initStruct.PORT_Pin = PORT_Pin_0 | PORT_Pin_1;
PORT_Init (MDR_PORTC, &initStruct);
//--------------------------------------------//
// Control PC2 (nCE) //
//--------------------------------------------//
initStruct.PORT_PD = PORT_PD_DRIVER;
initStruct.PORT_OE = PORT_OE_OUT;
initStruct.PORT_FUNC = PORT_FUNC_PORT;
initStruct.PORT_Pin = MDB_SRAM_CE;
PORT_Init (MDR_PORTC, &initStruct);
//--------------------------------------------//
// Initialize EBC controler //
//--------------------------------------------//
EBC_DeInit();
EBC_StructInit(&EBC_InitStruct);
EBC_InitStruct.EBC_Mode = EBC_MODE_RAM;
EBC_InitStruct.EBC_WaitState = EBC_WAIT_STATE_3HCLK;
EBC_InitStruct.EBC_DataAlignment = EBC_EBC_DATA_ALIGNMENT_16;
EBC_Init(&EBC_InitStruct);
EBC_MemRegionStructInit(&EBC_MemRegionInitStruct);
EBC_MemRegionInitStruct.WS_Active = 2;
EBC_MemRegionInitStruct.WS_Setup = EBC_WS_SETUP_CYCLE_1HCLK;
EBC_MemRegionInitStruct.WS_Hold = EBC_WS_HOLD_CYCLE_1HCLK;
EBC_MemRegionInitStruct.Enable_Tune = ENABLE;
EBC_MemRegionInit (&EBC_MemRegionInitStruct, EBC_MEM_REGION_60000000);
EBC_MemRegionCMD(EBC_MEM_REGION_60000000, ENABLE);
// Turn ON RAM (nCE)
PORT_ResetBits (MDR_PORTC, MDB_SRAM_CE);
}
Il microcontrollore in package LQFP-144 e la memoria in package TSOP-44 hanno molti pin connessi e occupano molto spazio sulla scheda. Con la mia esperienza nella risoluzione di problemi di ottimizzazione in economia, mi è sembrato chiaro che dovevo prioritizzare il posizionamento di questi chip sulla scheda. Ho trovato numerosi commenti entusiastici in varie fonti riguardo a . Ho scaricato la versione di prova e sono riuscito a esportare il mio progetto da Eagle CAD solo dopo aver rimosso quasi tutti i componenti. Sfortunatamente, anche con 10 elementi, il programma TopoR non mi ha aiutato a posizionarli sulla scheda. Inizialmente, tutti i componenti erano stati collocati in un angolo e poi distribuiti lungo il bordo. Questa soluzione non mi ha soddisfatto, e ho trascorso molto tempo a eseguire la tracciatura della scheda manualmente nell'ambiente che mi è familiare, Eagle CAD.
Un elemento importante del circuito stampato è la serigrafia. Sulla scheda di prototipazione non devono mancare solo le etichette per i componenti elettronici, ma anche tutte le connessioni devono essere contrassegnate. Sul retro della scheda ho posizionato tabelle di riferimento con le funzioni delle porte del controllore (principale, alternativa, sovrascritta, effettiva). Ho ordinato la produzione delle schede in Cina presso la nota azienda PCBWay. Non farò l'elogio, perché la qualità è buona. Possono fare meglio, con tolleranze più strette, ma .

Schede stampate MDB1986, (c) Foto dell'autore
Ho dovuto saldare i componenti ‘in ginocchio’ con un saldatore da 40 watt e stagno POS-61, perché saldo raramente, 1-2 volte all'anno, e la pasta di saldatura si è seccata. Ho anche dovuto sostituire il controllore cinese CS32F103 con l'originale STM32F103, e poi sostituire anche la memoria. In generale, ora sono completamente soddisfatto del risultato, anche se non ho ancora testato il funzionamento di RS-232 e CAN.

La scheda di prototipazione MDB1986 in funzione — illumina e si riscalda, (c) Foto dell'autore
Sul sito di 'Milandra' si possono trovare sufficienti serie 1986BE9 (nucleo Cortex-M3), ma per il microcontrollore K1986BE1QI (avionico) non vedo nulla. Dopo aver esaminato i materiali pubblicati, le guide e i laboratori per le università, sono felice che si stiano formando esperti in tutto il paese per lavorare con i controllori russi. La maggior parte dei materiali didattici è orientata al lavoro con porte di input/output, timer, ADC, DAC, SPI, UART. Vengono utilizzati vari ambienti di sviluppo IDE (Keil, IAR, CodeMaster). In alcune parti si programma utilizzando i registri CMSIS, mentre in altre si utilizza la Libreria MDR. È necessario menzionare la risorsa , che contiene numerosi articoli da programmatori pratici. E, naturalmente, non bisogna dimenticare il .
Duma di MilandrLa microelettronica in Russia sta evolvendo, e in questo processo l'azienda «Milandr» gioca un ruolo significativo. Stanno emergendo nuovi interessanti microcontrollori, come il 1986ВЕ81Т e «Eletrosila» con interfacce SpaceWire e MKIO (simile al 1986BE1 e, probabilmente, con gli stessi problemi), e così via. Tuttavia, per semplici studenti, insegnanti e ingegneri civili, acquistare tali microchip non è realistico. Di conseguenza, la comunità degli ingegneri non sarà in grado di identificare rapidamente errori e problemi di questo microchip. Mi sembra che sia necessario prima produrre microchip in un involucro di plastica, distribuirli tra tutte le parti interessate, e solo dopo la verifica da parte di specialisti (lat. approbatio - approvazione, riconoscimento) si può preparare una revisione in un involucro metallico-ceramico con protezioni da tutti i fattori dannosi. Spero che nel prossimo futuro tutti noi saremo lieti dei nuovi progetti annunciati nelle fiere.
Il circuito stampato di debug sviluppato da me può essere riprodotto, modificato e utilizzato da chiunque nel processo di apprendimento. Prima di tutto, ho creato la scheda per me stesso, ma è venuta così bene che .
Il K1986BE1QI (aviazione) è un controller molto interessante con interfacce uniche, che può essere utilizzato nelle università per l'insegnamento agli studenti. Credo che, una volta corretti gli errori riscontrati nel controller e superati i test di certificazione, questo controller volerà in senso letterale!
Fonte: habr.com
