Les convertisseurs USB / série
Lorsque l'on travaille avec des cartes ARDUINO PRO MINI ou des modules ESP8266 ou ESP32 dépourvus de convertisseur USB, on utilise généralement un convertisseur externe pour charger son application.
Tous les convertisseurs peuvent convenir, à partir du moment où l'on respecte bien la tension d'alimentation et la tension maximale des signaux que la carte peut supporter.
Pendant la phase de maquettage, il peut être pratique d'alimenter le montage complet à partir du convertisseur. Ceux-ci sont en général capables de fournir le courant nécessaire pour une carte PRO MINI et quelques modules peu consommateurs.
S'il s'agit d'une PRO MINI 16MHz, un convertisseur 5V est nécessaire. Une carte 16MHz ne tournerait pas sous 3.3V.
S'il s'agit d'une PRO MINI 8MHz 3.3V, on peut le faire avec un convertisseur 5V ou 3.3V.
Si des modules ne supportant pas 5V (NRF24L01 par exemple) sont connectés à l'ARDUINO, un convertisseur 3.3V est obligatoire.
Un ESP8266 ou ESP32 devra obligatoirement être chargé avec un convertisseur 3.3V, mais une alimentation délivrant au moins 500mA sera nécessaire.
Il faut bien distinguer tension d'alimentation et tension des signaux. En effet certains convertisseurs fournissant des signaux 3.3V ne fournissent pas forcément une tension d'alimentation de 3.3V (câble TTL-232R-3V3 par exemple).
Dans tous les cas, le câblage est le même :
- GND du convertisseur sur GND de la carte
- TX du convertisseur sur RX de la carte
- RX du convertisseur sur TX de la carte
- RTS ou DTR sur le DTR ou GRN de la carte (PRO MINI).
Nous allons examiner quelques modèles de convertisseurs.
Ensuite quelques paragraphes décrivent en détail certaines différences en fonction de l'OS utilisé (Linux, Windows).
1. Les convertisseurs
Il faut prendre garde lors de l'achat de modules à la présence ou l'absence de broches telles que DTR ou RTS qui permettent le chargement automatique d'une carte ARDUINO PRO MINI. En effet bien que les chips proposent un certain nombre de lignes de contrôle, les modules convertisseurs ne les rendent pas forcément disponibles sur les connecteurs du module.Sur une carte ARDUINO PRO MINI, la ligne DTR ou RTS du convertisseur doit être connectée sur la broche DTR ou GRN de la carte. En fait comme on le voit sur le schéma cette broche est reliée au RESET du microcontrôleur.
Si l'on utilise un convertisseur sans ligne DTR ni RTS, on peut appuyer sur le bouton RESET juste avant que le chargement ne commence.
Si l'on doit charger un ESP32 avec deux boutons EN et BOOT, RX et TX suffisent.
1.1. Le CH340 ou CH341
Ce chip est très commun. Il équipe souvent les cartes ARDUINO chinoises UNO, NANO, MEGA. Il a les caractéristiques suivantes :- interface : USB2
- vitesse (baud) : 50bps à 2Mbps
- tension 5V ou 3.3V
- broche de sortie 3.3V
- EEPROM interne (CH340B uniquement)
- EEPROM externe (CH341)
Les autres modèles n'en possèdent pas, cela risque d'être handicapant. Nous verrons pourquoi au paragraphe 3. L'attribution des ports.
Le CH340 est disponibles sous forme de module :
CH340 5V / 3.3V |
En général ces modules ne proposent que les lignes RX et TX. Les lignes DTR ou RTS, bien pratiques pour charger une PRO MINI en automatique, sans appuyer sur le bouton RESET.
La plupart des modules sont équipé d'un CH340G. Je ne connais pas de module équipé d'un CH340B.
1.2. Le FT232R
Ce chip de la société FTDI a les caractéristiques suivantes :- USB2
- vitesse (baud) : 300bps à 3Mbps
- tension 5V ou 3.3V
- broche de sortie 3.3V
- EEPROM interne
- tampon de réception et émission : 128 bytes et 256 bytes
La présence de deux tampons mémoire le rend plus performant dans les vitesses de transmission hautes.
Les modules sont très nombreux :
FT232R 5V / 3.3V |
FT232R 5V / 3.3V |
Ces deux modèle fournissent une alimentation et des signaux 5V ou 3.3V en fonction de la position d'un cavalier.
D'autres modèles proposent un interrupteur à bascule.
Je trouve le modèle rouge assez peu fiable. Les chargements échouent assez fréquemment.
En général ces modules proposent au moins une ligne DTR ou RTS.
Il est intéressant de fabriquer un câble directement enfichable sur la carte cible. Le câblage est dépendant du modèle de convertisseur utilisé :
Convertisseur avec connecteur enfichable sur ARDUINO PRO MINI |
Câble FTDI TTL-232R |
ATTENTION : la tension fournie par le fil VCC rouge est de 5V !
C'est indiqué dans la datasheet.
1.3. Le FT2232H et FT4232H
Pour les applications gourmandes FTDI propose également des convertisseurs à 2 et 4 ports.Ils sont également disponibles sous forme de modules :
Les datasheets :
https://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_FT2232H_Mini_Module.pdf
https://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_FT4232H_Mini_Module.pdf
Une application JTAG :
http://www.avi-plus.com/images/fbfiles/files/HOWTO_JTAG_Interface_STMCLT_Clone_REV2.pdf
Une application personnelle (HUB 4 ports série) :
https://riton-duino.blogspot.com/2020/02/un-hub-4-ports-serie.html
On trouve également des modules chinois sur AliExpress :
FT4232 4 ports |
FT4232 4 ports |
Il a des possibilités intéressantes :
- commutateur d'alimentation (USB ou JACK)
- commutateur 5V / 3.3V sur RX / TX
- 4 ports RX / TX / GND / VCC sur connecteurs JST
FT2232 2 ports |
1.4. Le PL2303
Ce chip de la société PROLIFIC a les caractéristiques suivantes :- USB2
- vitesse (baud) : 75bps à 12Mbps
- tension 5V ou 3.3V
- broche de sortie 3.3V
- EEPROM interne
- tampon de réception et émission : 128 bytes et 256 bytes
Les modules sont aussi très nombreux :
PL2303 5V / 3.3V |
Comme les modules CH340, en général ces modules ne proposent que les lignes RX et TX, pas de DTR ou RTS, bien pratiques pour charger une PRO MINI en automatique, sans appuyer sur le bouton RESET.
1.5. Le CP2102 ou CP2104
Ce chip de la société Silicon Labs a les caractéristiques suivantes :- USB2
- vitesse (baud) : jusqu'à 921600Mbps
- tension 5V ou 3.3V
- broche de sortie 3.3V
- EEPROM interne
- tampon de réception et émission : 576 bytes et 640 bytes
Les modules sont aussi très nombreux :
CP2102 5V / 3.3V |
Apparemment si les FT232R avec commutateur 5V / 3.3V sont très répandus, il n'en va pas de même pour le CP2102 ou CP2104.
La majorité propose deux broches 5V et 3.3V mais qu'en est-il de la tension des signaux ? Cela demande à être approfondi.
En général ces modules proposent au moins une ligne DTR ou RTS.
2. Les drivers
Sous Windows il faudra les installer :CH340 : http://www.wch.cn/download/CH341SER_EXE.html
FT232R : https://www.ftdichip.com/Drivers/VCP.htm
PL2303 : http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41
CP2102 & CP2104 : https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
Attention : il semblerait que certaines versions de PL2303 (PL-2303HXA et PL-2303X) ne soient pas compatibles avec Windows 8 et 10.
Voir la page de téléchargement.
Sous Linux il n'y a rien à faire. Les drivers font partie de la distribution et sont directement utilisables.
3. L'attribution des ports
Lorsque l'on branche un convertisseur ou une carte UNO ou NANO sur un PC, le comportement diffère en fonction de l'OS.3.1. Windows
Windows attribue un port COMX en fonction du driver et surtout du chip convertisseur utilisé.Avec un FT232R ou un PL2303 le port de COM attribué sera différent pour chaque convertisseur, et en rebranchant un convertisseur précédemment utilisé celui-ci retrouvera le même port de COM que lors de sa précédente utilisation.
Ceci explique que sur certains postes de développeurs on peut avoir sous Windows 50 ports de COM déjà attribués.
Avec un CH340 Windows attribuera le premier port de COM libre lors du premier branchement. Ensuite ce port sera réutilisé, s'il est libre, pour tous les convertisseurs CH340.
Il est donc impossible de distinguer un CH340 d'un autre CH340 par son port de COM.
Ceci explique que si l'on branche une UNO sur un PC, qu'on la débranche et qu'on en branche une autre, elle se voit attribuer le même port.
Oui mais pourquoi ? tout simplement parce que le CH340 ne possède pas de mémoire EEPROM pour y stocker un numéro de série.
Un FT232R ou un PL2303 possède une EEPROM et un numéro de série y est inscrit à la fabrication.
Celui-ci est même modifiable par l'utilisateur. Chez FTDI par exemple :
FT_PROG EEPROM Programming Utility
Il est possible sous Windows de changer un numéro de port à l'aide du Gestionnaire de Périphériques :
https://plugable.com/2011/07/04/how-to-change-the-com-port-for-a-usb-serial-adapter-on-windows-7/
Encore une fois cette modification, si le convertisseur est un CH340, s'appliquera à tous les CH340.
3.2. Linux
Linux attribue le premier port TTY libre en partant de ttyUSB0 (ttyACM0 pour certaines cartes, MEGA officielle par exemple).Si on débranche un convertisseur pour en rebrancher un autre, le même port sera attribué de nouveau.
Si on a laissé un logiciel terminal connecté au port TTY précédent, le port suivant sera attribué.
On pourrait être tenté de dire : Linux c'est le bazar !
Non, la gestion est plus simple et plus fiable.
Sous Linux il est possible également de modifier le nom d'un port TTY USB et de le rendre persistant. Il sera nécessaire de passer par udev :
Pour mon exemple concret sur RASPBERRY PI j'ai choisi un port USB sur lequel est branchée une carte PRO MINI avec un émetteur / récepteur 433MHz. Le convertisseur est un FT232R.
Normalement, au boot, le device ttyUSB2 lui est attibué. Je désire ajouter un device ttyUSB433, car je sais que DOMOTICS ne me proposera que des devices commençant par ttyUSB, ttyACM ou ttyAMA.
La commande lsusb permet de lister les ports USB. Ici je recherche un FT232 :
$ lsusb | grep FT232
Bus 001 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
On voit ici l'identifiant constructeur (0403) et identifiant produit (6001).
Ensuite il faut connaître le port TTY l'aide de la commande dmesg. Si le convertisseur vient d'être branché on verra plus facilement ses informations.
Sinon il faudra les rechercher le mot FT232 dans la console avec CTRL-SHIFT-F :
$ dmesg
...
[ 3.562108] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[ 3.562271] usb 1-1.2: Detected FT232RL
[ 3.563289] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB2
Si plusieurs FT232R sont présents on pourra lever le doute en débranchant et rebranchant celui que l'on désire modifier. Le informations se retrouveront en fin de liste.
On peut ensuite utiliser la commande udevadm pour avoir plus d'informations :
$ udevadm info -n /dev/ttyUSB2
P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB2/tty/ttyUSB2
N: ttyUSB2
S: serial/by-id/usb-FTDI_FT232R_USB_UART_A104JP07-if00-port0
S: serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0
S: ttyUSB433
E: DEVLINKS=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A104JP07-if00-port0 /dev/serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0 /dev/ttyUSB433
E: DEVNAME=/dev/ttyUSB2
E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB2/tty/ttyUSB2
E: ID_BUS=usb
E: ID_MODEL=FT232R_USB_UART
E: ID_MODEL_ENC=FT232R\x20USB\x20UART
E: ID_MODEL_FROM_DATABASE=FT232 USB-Serial (UART) IC
E: ID_MODEL_ID=6001
E: ID_PATH=platform-3f980000.usb-usb-0:1.2:1.0
E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_2_1_0
E: ID_REVISION=0600
E: ID_SERIAL=FTDI_FT232R_USB_UART_A104JP07
E: ID_SERIAL_SHORT=A104JP07
E: ID_TYPE=generic
E: ID_USB_DRIVER=ftdi_sio
E: ID_USB_INTERFACES=:ffffff:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=FTDI
E: ID_VENDOR_ENC=FTDI
E: ID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd
E: ID_VENDOR_ID=0403
E: MAJOR=188
E: MINOR=2
E: SUBSYSTEM=tty
E: TAGS=:systemd:
E: USEC_INITIALIZED=49791
FT232R, 0403, 6001 : c'est bien le bon convertisseur.
Il faut relever :
- l'identifiant constructeur : 0403
- l'identifiant produit : 6001
- le N° de série : AL008YL2
- le port TTY : ttyUSB1
/etc/udev/rules.d/99-usb-serial.rules :
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A104JP07", SYMLINK+="ttyUSB433".
Il faut ensuite redémarrer udev :
On trouve beaucoup de commandes du genre :
$ sudo /etc/init.d/udev restart
$ udevadm control --reload-rules && udevadm trigger
Mais ces commandes n'ont pas l'air d'avoir le moindre effet.
Donc je redémarre :
$ sudo reboot
A chaque fois que le kernel verra un device TTY USB ayant ces identifiants et ce numéro de série il l'appellera ttyFT232-1.
Bien entendu il est possible d'ajouter autant de lignes que nécessaire pour différents convertisseurs.
Au redémarrage nous voyons note nouveau port TTY :
$ ls /dev/ttyU*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB433
On peut remarquer que le ttyUSB2 est toujours présent. ttyUSB433 est en fait un lien symbolique sur ttyUSB2 (un alias).
Ici aussi cette modification, si le convertisseur est un CH340, s'appliquera à tous les CH340 car on ne peut pas préciser de N° de série. Dommage.
L'avantage avec Linux est que l'on peut nommer le port TTY à sa convenance. Dans l'exemple je l'ai appelé ttyUSB433.
Ensuite comment distinguer physiquement plusieurs FT232R entre eux ? avec une étiquette, portant le même nom, collée sur le module par exemple.
4. L'attribution des ports au boot
Au démarrage d'une machine, si plusieurs convertisseurs ou plusieurs cartes ARDUINO sont déjà branchés, le N° des ports attribués vont dépendre bien sûr de l'OS et du type de convertisseur.Cela concerne principalement les machines utilisées comme serveur domotique, avec plusieurs cartes ARDUINO branchées en permanence :
- passerelle RFLINK
- passerelle NRF24L01 ou RFM69
- etc.
4.1. Windows
Sous Windows c'est facile : tous les convertisseurs retrouveront le petit nom qu'ils portaient précédemment.Si plusieurs CH340 sont présents, il y aura incertitude, mais en général l'informatique est déterministe et normalement les N° de ports COM seront les même que précédemment, sauf peut être si l'on a interverti les ports USB de deux cartes, ou si la chance n'est pas de notre côté.
L'idéal est donc de n'avoir au maximum qu'un seul CH340 branché au démarrage sur un serveur si l'on veut pouvoir retrouver facilement leurs ports respectifs.
Les autres convertisseurs FT232R ou PL2303 se verront toujours attribuer le même port de COM.
4.2. Linux
Là encore les ports TTY attribués à chaque convertisseur a de fortes chances de rester le même, mais ce n'est pas garanti.La bonne méthode est d'attribuer soi-même avec udev un petit nom reconnaissable comme vu plus haut (3.2. Linux).
Ici aussi si plusieurs CH340 sont présents, il y aura incertitude.
4.3. Exemple
Sur ma RAPBERRY PI qui héberge un serveur DOMOTICZ il y a quatre cartes ARDUINO branchées en USB :- une passerelle RFLINK (ARDUINO MEGA officielle)
- une passerelle MYSENSORS 2.4GHz (ARDUINO NANO + CH340)
- une passerelle MYSENSORS 433MHz (ARDUINO PRO MINI + FT232R)
- un récepteur infrarouge (ARDUINO NANO + CH340)
La MEGA porte le nom /dev/ttyACM0, car c'est une officielle. Si l'on avait affaire à une carte chinoise équipée d'un CH340 il y aurait une incertitude de plus.
Par chance la PRO MINI utilise un FT232R. On peut donc renommer son port série. Il a été renommé ttyUSB-433 à l'aide d'une règle udev.
En général cela se passe bien et les ports sont attribués comme suit :
- récepteur infrarouge : /dev/ttyUSB0
- passerelle RFLINK : /dev/ttyACM0
- passerelle MYSENSORS 2.4GHz : /dev/ttyUSB1
- passerelle MYSENSORS 433MHz : /dev/ttyUSB433
Comme je ne peux rien faire pour résoudre ce problème, à chaque redémarrage (ce n'est pas fréquent) si les ports des deux NANOS sont inversés, je débranche les deux, et je rebranche la carte "récepteur infrarouge" en premier, et la carte "passerelle MYSENSORS 2.4GHz" en second. Tout rentre dans l'ordre.
J'ai récemment développé un HUB 4 ports série :
https://riton-duino.blogspot.com/2020/02/un-hub-4-ports-serie.html
Bâti autour d'un FT4232H (quadruple FT232R), celui-ci me permettra de résoudre tous ces problèmes plus facilement, et accessoirement de libérer au moins deux ports USB.
5. Le bitbang
Qu'est ce que le bitbang ? c'est la possibilité qu'offrent certains convertisseurs de contrôler leurs broches par logiciel.On peut ainsi les transformer en extension d'I/O pour PC, moyennant l'utilisation d'un driver approprié ou non.
FTDI propose D2XX :
https://www.ftdichip.com/Drivers/D2XX.htm
FTDI propose également libftdi et pylibftdi :
https://github.com/lipro/libftdi
https://pypi.org/project/pyftdi/
Une documentation : https://www.ftdichip.com/Support/Documents/AppNotes/AN_373 Bit-Bang Modes for the FT-X Series.pdf
Un exemple ici avec pyftdi :
https://riton-duino.blogspot.com/2020/02/un-hub-4-ports-serie.html#python
Chez Silicon Labs : https://www.silabs.com/community/interface/knowledge-base.entry.html/2018/07/25/how_to_control_gpios-Wot7
Il est facile ensuite de contrôler les broches du convertisseur en PYTHON par exemple en utilisant la librairie libusb et le module pyusb.
5.1. PYTHON
Amusons-nous à piloter un FT4232H avec un script PYTHON.Bien entendu on peut faire la même chose avec des modules FT232R ou FT2232H, et je l'ai d'ailleurs fait avec des modules chinois.
Pour cela il nous faut au préalable installer la librairie pylibftdi :
pip install pylibftdi
Ce script bitbang.py fait clignoter une LED (en série avec un résistance de 470KΩ) branchée sur le port AD0 (TX1) d'un FT4232H ou la broche TX d'un FT232R :
import time
from pylibftdi import Driver
from pylibftdi import BitBangDevice
def get_ftdi_device_list():
"""
return a list of lines, each a colon-separated
vendor:product:serial summary of detected devices
"""
dev_list = []
for device in Driver().list_devices():
# list_devices returns bytes rather than strings
dev_info = map(lambda x: x.decode('latin1'), device)
# device must always be this triple
vendor, product, serial = dev_info
dev_list.append((vendor, product, serial))
return dev_list
def blink_device(dev):
"""
blink PORT0 of device
"""
with BitBangDevice(device_id=dev) as bb:
bb.direction = 0x01
print bb.port
while True:
bb.port = 0x01
time.sleep(1)
bb.port = 0x00
time.sleep(1)
if __name__ == '__main__':
cnt = 0
devices = get_ftdi_device_list()
for device in devices:
print "%d %s" % (cnt, device)
cnt += 1
dev = int(raw_input("select device: "))
print dev
if dev <= cnt:
print "blink_device", dev
blink_device(devices[dev][2])
Le script demande d'abord avec quel convertisseur il doit travailler, après avoir affiché ceux qu'il a trouvé :
$ python bitbang.py
0 (u'FTDI', u'FT4232H MiniModule', u'FTWEQGJE')
1 (u'FTDI', u'FT4232H MiniModule', u'FTWEQY84')
select device: 1
blink_device 1
Il trouve deux mini-modules, ce qui est vrai. Je choisis ne N° 1 et après cela la LED branchée sur le port AD0 clignote !
Cette manipulation peut être intéressante à plus d'un titre :
On peut par exemple écrire sur les entrées et consulter l'état des sorties d'un ARDUINO, afin de réaliser des tests, au lieu de faire ça avec des boutons et des LEDs.
Sous Linux, il faudra accorder les doits d'écriture sur le device USB :
$ cat /etc/udev/rules.d/98-ftdi.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE:="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE:="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE:="0666"
Ce fichier de règles udev est OK pour FT2232H, FT4232H etFT232R (idProduct = 6010, 6011, 6001).
5.2. FT232 et I2C, SPI et autres
Une autre utilisation du bitbanging :- créer de toutes pièces un bus I2C ou SPI
- générer un PWM
- contrôler un PCF8574, un MCP23017, etc.
Comme on le voit les possibilités sont nombreuses.
5.3. FT2232H et ESP32
Voici une dernière utilisation du bitbanging : un module FT2232H peut être utilisé pour réaliser une sonde JTAG pour ESP32. Il existe même un module ESP32-PROG spécialement conçu pour cette utilisation.A tester ...
6. conclusion
J'espère avoir apporté des réponses à quelques questions que vous vous posiez peut-être à propos des convertisseurs USB.Cordialement
Henri
Bonjour
RépondreSupprimerSi on a une necessite d isoler galvaniquement l Usb de Arduino juste pour utiliser le moniteur serie ( sans flasher) :
Quelle solution technique est a privilegier ? Et un adapteur Cp2102 sans ligne DTR peut il convenir ?
Trois fils sont nécessaires pour le moniteur série : GND, TX et RX.
Supprimer