Giuseppe Parrello

 

Scheda di Sviluppo FTDI FT232H


Introduzione

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.


Installazione dispositivo USB

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.


Installazione dispositivo USB in Microsoft Windows 7/8/10

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:

  1. Scaricare l'applicazione "Zadig" dal seguente sito Internet ed eseguirla come utente amministratore.
  2. All'interno della suddetta applicazione aprire il menù "Options" e selezionare la voce "List All Devices".
  3. Selezionare il dispositivo "Single RS232-HS" (USB ID 0403 6014).
  4. Come driver selezionare "libusb-win32" nell'elenco dei driver.
  5. Cliccare sul pulsante "Replace Driver" e attendere il messaggio che conferma l'installazione del driver.
  6. All'interno della finestra "Gestione dispositivi" di Windows controllare che esista la voce "libusb-win32 Usb Devices" direttamente come voce principale (e non all'interno delle voci principali).

Per gestire questa scheda abbiamo bisogno del linguaggio Python, pertanto è necessario installare Python nel computer, eseguendo i seguenti passi:

  1. andare nel sito di Python e scaricare la versione .exe completa (versione 3 o successiva di Python) ed installarla come utente amministratore.
  2. Per impostare le variabili di ambiente ed usare Python direttamente dalla finestra CMD di Windows, riavviare il computer oppure disconnettersi e riconnettersi con l'utente attuale.
  3. Aprire una finestra CMD di Windows, ed eseguire il seguente comando "pip install --upgrade pip wheel pyserial pyusb".
  4. Aprire l'interprete Python eseguendo il comando "python" ed all'interno dell'interprete eseguire le due istruzioni "import usb.core" e "usb.core.find()", come output dovrebbe essere restituito il "DEVICE ID" di questa scheda di sviluppo - un esempio di output delle suddette due istruzioni è il seguente:
    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.

Installazione dispositivo USB in un router

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:

  1. andare nella pagina "Come installare l'interprete Python" di questo sito per installare Python sul router - per gestire questa scheda di sviluppo abbiamo bisogno della versione 3 (o successiva) di Python.
  2. Aprire un terminale Telnet o SSH per connettersi al router ed eseguire il seguente comando "pip3 install --upgrade pip wheel pyserial pyusb".
  3. Sempre all'interno del terminale eseguire il seguente comando "opkg install libusb-1.0 libusb-compat gcc".
  4. Aprire l'interprete Python eseguendo il comando "python3" ed all'interno dell'interprete eseguire le due istruzioni "import usb.core" e "usb.core.find()", come output dovrebbe essere restituito il "DEVICE ID" di questa scheda di sviluppo - 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 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.

Errori sul riconoscimento della scheda di sviluppo

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:

  1. Aprire un terminale Telnet o SSH per connettersi al router e digitare il comando "cd /opt/lib/[python]/site-packages/usb/backend" (al posto di "[python]" inserire la cartella corretta dove è installato l'interprete Python) per entrare nella cartella del modulo Python che gestisce i dispositivi USB.
  2. Creare una copia di backup del file "libusb1.py" eseguendo il comando "cp libusb1.py libusb1.py.src".
  3. Aprire il suddetto file "libusb1.py" con un editor (ad esempio "nano") ed andare alla fine del file all'interno del metodo "get_backend" e cambiare la riga
     _lib = _load_library(find_library=find_library)
    in
     _lib = _load_library(find_library=lambda x: "/opt/lib/libusb-1.0.so.0")
  4. Nella suddetta riga sostituire "/opt/lib/libusb-1.0.so.0" con il file realmente presente nella cartella "/opt/lib" il cui nome inizia con "libusb-1".
  5. Entrare nuovamente nell'interprete Python ed eseguire nuovamente le suddette quattro righe di DEBUG per controllare se questa volta la scheda di sviluppo viene riconosciuta correttamente - ad esempio un output risolutivo potrebbe essere:
    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>
    

 

Riconoscimento dispositivo FTDI

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.

 

Modalità I2C

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

Modalità I2C

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.

 

Modalità SPI

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

Modalità SPI

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.

 

Installazione librerie Python

Installazione libreria Adafruit CircuitPython

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.


Installazione modulo Pillow

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.