Questa scheda di sviluppo, basata sul chipset FTDI FT232H, si può
utilizzare per gestire dispositivi digitali esterni, come ad esempio sensori, LED, display, buzzer. Questa scheda fornisce collegamenti seriali
sincroni/asincroni, in questa pagina lo useremo principalmente per gestire dispositivi digitali esterni tramite il
protocollo I2C e il protocollo SPI utilizzando
l'interfaccia USB di cui è dotata.
Da notare che questa scheda fornisce 16 entrate/uscite digitali di tipo
GPIO che verranno utilizzate per gestire semplici componenti digitali esterne, quali ad esempio i relais.
Questa scheda purtroppo non supporta dispositivi analogici esterni, per ovviare a questa mancanza useremo, in altra pagina, un'altra scheda di sviluppo adatta a questo scopo.
Prima di gestire questa scheda di sviluppo, bisogna fare in modo che il Sistema Operativo la riconosca correttamente. Qui di seguito affronteremo le problematiche sull'installazione dei driver USB nel sistema operativo Microsoft Windows e in un router, dando per scontato che chi ha un minimo di manualità nella gestione del sistema operativo Linux possa far vedere questa scheda di sviluppo al sistema operativo stesso.
Appena si inserisce questa scheda di sviluppo in una presa USB di un computer con un sistema operativo Microsoft Windows, il sistema operativo la riconoscerà come dispositivo seriale, ovvero come porta COMx. Questo potrebbe essere utile per chi volesse gestire questa scheda di sviluppo come un semplice adattatore USB-Seriale, ma nel nostro caso ci servono i driver USB per gestire questo dispositivo come un vero e proprio dispositivo USB esterno. Per fare questo, dobbiamo eseguire i seguenti passi:
Per gestire questa scheda abbiamo bisogno del linguaggio Python, pertanto è necessario installare Python nel computer, eseguendo i seguenti passi:
c:\Python37-32\Lib\site-packages\usb>python Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import usb.core >>> usb.core.find() <DEVICE ID 0403:6014 on Bus 000 Address 001>Se non viene restituito il "DEVICE ID" oppure se viene restituito un errore, vedere il successivo paragrafo dedicato agli errori.
Appena si inserisce questa scheda di sviluppo in una presa USB di un router con un sistema operativo Linux, il sistema operativo la riconoscerà come dispositivo USB. Possiamo aprire un terminale Telnet o SSH per connetterci al router e digitiamo il comando "dmesg", un esempio di output del suddetto comando è il seguente:
usb 3-1.3: new high-speed USB device number 7 using ehci-platform usbcore: registered new interface driver usbserial usbcore: registered new interface driver usbserial_generic usbserial: USB Serial support registered for generic usbcore: registered new interface driver option usbserial: USB Serial support registered for GSM modem (1-port)
In seguito digitiamo il comando "lsusb", un esempio di output del suddetto comando è il seguente:
Bus 003 Device 007: ID 0403:6014
Per gestire questa scheda abbiamo bisogno del linguaggio Python, pertanto è necessario installare Python nel router, eseguendo i seguenti passi:
admin@RT-AC86U:/# python3 Python 3.7.4 (default, Oct 03 2019, 21:10:12) [GCC 7.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import usb.core >>> usb.core.find() <DEVICE ID 0403:6014 on Bus 003 Address 007>Se non viene restituito il "DEVICE ID" oppure se viene restituito un errore, vedere il successivo paragrafo dedicato agli errori.
Se l'interprete Python non riconosce la scheda di sviluppo oppure se viene restituito un errore, allora bisogna attivare la modalità di DEBUG all'interno dell'interprete Python per capire quale sia il problema. Aprire l'interprete Python ed eseguire le seguenti quattro istruzioni "import os", "os.environ['PYUSB_DEBUG'] = 'debug' ", "import usb.core", "usb.core.find()" - un esempio di output delle suddette quattro istruzioni è il seguente:
admin@RT-AC86U:/# python3 Python 3.7.4 (default, Oct 03 2019, 21:10:12) [GCC 7.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.environ['PYUSB_DEBUG'] = 'debug' >>> import usb.core >>> usb.core.find() 2021-01-05 18:01:09,600 ERROR:usb.libloader:'Libusb 1' could not be found 2021-01-05 18:01:09,603 ERROR:usb.backend.libusb1:Error loading libusb 1.0 backend 2021-01-05 18:01:09,620 ERROR:usb.libloader:'OpenUSB library' could not be found 2021-01-05 18:01:09,621 ERROR:usb.backend.openusb:Error loading OpenUSB backend 2021-01-05 18:01:09,671 ERROR:usb.libloader:'Libusb 0' could not be found 2021-01-05 18:01:09,673 ERROR:usb.backend.libusb0:Error loading libusb 0.1 backend Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/lib/python3.7/site-packages/usb/core.py", line 1297, in find raise NoBackendError('No backend available') usb.core.NoBackendError: No backend available
Il suddetto errore "No backend available" viene visualizzato principalmente su un router poiché il
modulo USB di Python non trova le librerie USB di sistema che devono gestire i dispositivi USB esterni connessi - le librerie di Entware sono posizionate nella
cartella "/opt/lib" e non nella cartella delle librerie del router (che di solito è "/usr/lib").
Per ovviare al suddetto problema:
admin@RT-AC86U:/# python3 Python 3.7.4 (default, Oct 03 2019, 21:10:12) [GCC 7.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.environ['PYUSB_DEBUG'] = 'debug' >>> import usb.core >>> usb.core.find() 2021-01-12 20:11:21,259 DEBUG:usb.backend.libusb1:_LibUSB.__init__(<CDLL '/opt/lib/libusb-1.0.so.0', handle 9e22d0 at 0x9bd8c0>) 2021-01-12 20:11:21,260 INFO:usb.core:find(): using backend "usb.backend.libusb1" 2021-01-12 20:11:21,260 DEBUG:usb.backend.libusb1:_LibUSB.enumerate_devices() 2021-01-12 20:11:21,260 DEBUG:usb.backend.libusb1:_LibUSB.get_device_descriptor(<usb.backend.libusb1._Device object at 0x9cfe00>) <DEVICE ID 0403:6014 on Bus 003 Address 007>
Per riconoscere il dispositivo FTDI, prima di tutto bisogna eseguire il comando "pip install pyftdi"
per installare il modulo Python dedicato PyFTDI (per maggiori informazioni su questo modulo, fare riferimento a
questo sito Internet).
In seguito aprire l'interprete Python ed eseguire le seguenti due istruzioni "from pyftdi.ftdi import Ftdi"
e "Ftdi.show_devices()" - un esempio di output delle suddette due istruzioni è il seguente:
admin@RT-AC86U:/# python3 Python 3.7.4 (default, Oct 03 2019, 21:10:12) [GCC 7.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from pyftdi.ftdi import Ftdi >>> Ftdi.show_devices() Available interfaces: ftdi://ftdi:232h:3:8/1 (Single RS232-HS)
Nel suddetto output, la riga "ftdi://ftdi:232h:3:8/1" rappresenta l'indirizzo FTDI della scheda di
sviluppo - questo indirizzo sarà usato negli script in Python per gestire i dispositivi collegati alla scheda di sviluppo.
Se nel suddetto output dovesse apparire l'errore "No backend available", allora fare riferimento al paragrafo "Errori sul riconoscimento della scheda
di sviluppo" in questa pagina per risolvere il suddetto errore.
La modalità I2C è la più importante modalità che prenderemo in considerazione poiché con tale modalità potremo gestire tanti dispositivi esterni collegandoli alla scheda di sviluppo. La modalità I2C, nella scheda di sviluppo di riferimento, viene attivata cortocircuitando i pin AD1 e AD2 (vedere immagine per maggiori dettagli). I dispositivi I2C presentano tutti almeno 4 connettori, elencati qui di seguito:
Immagine | Scheda di sviluppo | Dispositivo esterno |
---|---|---|
AD0 | SCL | |
AD1 + AD2 | SDA | |
+5V / +3.3V | VCC / V+ | |
GND | GND |
Poiché la modalità I2C riserva i pin AD0-AD2, sulla scheda di sviluppo di riferimento rimangono a disposizione soltanto i pin AD3-AD7 e AC0-AC9 come pin GPIO. Tali pin potrebbero essere usati dai dispositivi esterni per attivare alcune opzioni o modalità, ad esempio il reset del dispositivo esterno.
Nella modalità I2C è possibile gestire il dispositivo esterno, collegato alla scheda di sviluppo, tramite un indirizzo esadecimale, usato da tutti gli script Python per gestire i dispositivi esterni. Per ottenere l'indirizzo esadecimale del dispositivo esterno, andare nel sito Internet di PyFTDI e scaricare il seguente script Python. Una volta scaricato, eseguirlo tramite l'interprete Python. Un esempio di output del suddetto script è il seguente:
admin@RT-AC86U:/# python3 i2cscan.py 0 1 2 3 4 5 6 7 8 9 A B C D E F 0: . . . . . . . . . . . . . . . . 1: . . . . . . . . . . . . . . . . 2: . . . . . . . . . . . . . . . . 3: . . . . . . . . . . . . . . . . 4: . . . . . . . . . . . . . . . . 5: . . . . . . . . . . . . R . . . 6: . . . . . . . . . . . . . . . . 7: . . . . . . . . .
Nel suddetto esempio, l'indirizzo esadecimale del dispositivo è "5D". Da notare la "R" che indica che il dispositivo è di sola lettura (il dispositivo di esempio è un sensore di temperatura). Se al posto della "R" appare una "W", allora è possibile scrivere sul dispositivo esterno.
La modalità SPI è l'altra più importante modalità che prenderemo in considerazione poiché anche con tale modalità potremo gestire dispositivi esterni collegandoli alla scheda di sviluppo. I dispositivi SPI presentano tutti almeno 5 connettori, elencati qui di seguito (vedere immagine per maggiori dettagli):
Immagine | Scheda di sviluppo | Dispositivo esterno |
---|---|---|
AD0 | SCLK / SCK | |
AD1 | MOSI / SDO / DO | |
AD2 | MISO / SDI / DI | |
AD3 | CS / SS | |
+5V / +3.3V | VCC / V+ | |
GND | GND |
Poiché la modalità SPI riserva i pin AD0-AD3, sulla scheda di sviluppo di riferimento rimangono a disposizione soltanto i pin AD4-AD7 e AC0-AC9 come pin GPIO. Tali pin potrebbero essere usati dai dispositivi esterni per attivare alcune opzioni o modalità, ad esempio il reset del dispositivo esterno.
Poiché alcuni script Python richiedono la presenza della libreria Adafruit CircuitPython (un fork della libreria MicroPython), qui di seguito vengono fornite le istruzioni per la sua installazione. Per installare questa libreria eseguire il comando "pip install Adafruit-Blinka", inoltre tenere presente delle seguenti indicazioni di installazione poiché questa libreria richiede obbligatoriamente, per funzionare correttamente con la scheda di sviluppo FT232H di riferimento, la presenza della variabile di ambiente "BLINKA_FT232H=1" (maggiori informazioni si possono recuperare dal sito di Adafruit):
In seguito aprire l'interprete Python ed eseguire le seguenti due istruzioni "import board" e "dir(board)" - un esempio di output delle suddette due istruzioni è il seguente:
admin@RT-AC86U:/# python3 Python 3.7.4 (default, Oct 03 2019, 21:10:12) [GCC 7.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import board >>> dir(board) ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'D4', 'D5', 'D6', 'D7', 'I2C', 'MISO', 'MOSI', 'SCK', 'SCL', 'SCLK', 'SDA', 'SPI', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'ap_board', 'board_id', 'detector', 'pin', 'sys']
Le due istruzioni visualizzano i pin supportati dalla libreria Adafruit CircuitPython per la scheda di sviluppo di riferimento, i pin da "C0" a "D7" sono i pin GPIO, mentre i pin da "I2C" a "SPI" sono i pin riservati alle modalità I2C e SPI.
Poiché alcuni script Python richiedono la presenza del modulo Pillow (un fork della libreria Python Imaging Library), qui di seguito vengono fornite le istruzioni per la sua installazione.