Définition du numéro de série sur le périphérique série CH340 USB

9

En lisant http://playground.arduino.cc/Linux/Udev, il semble y avoir un moyen d'écrire sur une EEPROM USB-série FTDI pour définir un numéro de série donné, vous permettant d'identifier un nano / autre arduino donné pour le gérer spécifiquement dans UDEV.

J'ai une charge de style nano avec un adaptateur série USB QinHeng Electronics HL-340, qui n'est clairement pas une puce FTDI, et le programmeur FTDI ne fonctionne donc pas. Quelqu'un connaît-il un autre utilitaire / où puis-je trouver des informations pour faire de même avec cette puce?

Actuellement, l'appareil s'identifie avec:

[ 6850.608080] usb 2-1.2: new full-speed USB device number 7 using ehci-pci
[ 6850.701496] usb 2-1.2: New USB device found, idVendor=1a86, idProduct=7523
[ 6850.701505] usb 2-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 6850.701510] usb 2-1.2: Product: USB2.0-Serial
[ 6850.702201] ch341 2-1.2:1.0: ch341-uart converter detected
[ 6850.704210] usb 2-1.2: ch341-uart converter now attached to ttyUSB0

Ce qui est essentiellement inutile, car je ne peux pas identifier la carte donnée attachée (lorsque j'en attache deux, leurs détails sont les mêmes).

jvc26
la source
1
Malheureusement, ce n'est pas vraiment une réponse non plus: la question (car elle ne répond pas s'il existe un moyen d'attribuer un nouveau numéro de série comme on peut le faire pour les puces FTDI), ou résoudre le problème (comme la série udev car toutes ces cartes, comme la Leonardo, est 0, donc udev ne peut pas faire la distinction entre plusieurs cartes connectées au même ordinateur.
jvc26
Mon lien est vers ma réponse qui parle de la création de règles udev pour chaque appareil.
PhillyNJ
1
Si vous pouvez lire le chinois (je ne peux pas), cette page pourrait vous aider: wch.cn/products.php?page=procontent&id=40
Craig
3
Malheureusement @Phil Vallone, le problème est qu'il n'y a pas de série unique pour identifier l'appareil via udev. Afin de détecter et d'identifier un appareil unique, vous avez besoin de quelque chose d'unique pour les différencier. Ces appareils ont le même iSerial, vous ne pouvez donc pas les différencier et ils partagent les mêmes ID de produit et de fournisseur - il n'y a donc pas de différenciateur ... Merci pour votre aide, malheureusement, cela ne résout pas ce problème !
jvc26

Réponses:

3

Il n'y a pas de stockage sur le CH340 et la famille d'UART où vous pourriez mettre un ID unique. C'est également un problème pour le type PL2303. J'ai essayé de trouver des solutions à ce problème. La première et la plus simple est la position de l'appareil sur le bus USB. Il sera unique pour chaque appareil. Si vous utilisez Linux, vous pouvez trouver chaque périphérique sous / dev / serial / by-path. Il y a aussi un / dev / serial / by-id mais il n'y aura qu'une seule entrée pour cet appareil car il montre la dernière connectée. Les puces FTDI auront chacune des entrées uniques ici. Les puces bon marché ne le seront pas, mais elles ont chacune une entrée sous / dev / serial / by-path. Cette position et les noms des périphériques doivent persister lors des redémarrages. Si vous avez apporté de nombreuses modifications à vos périphériques USB, branchez tous les périphériques CH340 sur le même concentrateur, puis branchez-le. Les appareils sont énumérés dans l'ordre où ils sont connectés au concentrateur. Cette astuce à un concentrateur devrait également fonctionner pour MacOS et Windows, ils devraient apparaître dans le même ordre.

Méthodes plus dures - udev. Pour les appareils avec un ID unique tel que FTDI, vous pouvez définir une règle udev qui voit son numéro de série, puis crée un lien symbolique vers cet appareil, c'est simple.

Pour les appareils avec le même ou aucun numéro de série, c'est beaucoup plus complexe. J'ai créé une règle udev qui ressemble à ceci:

SOUS-SYSTÈME == "tty", ATTRS {produit} == "USB2.0-Série", RUN + = "/ usr / local / bin / cheapduino.py% k", ATTRS {idVendor} == "1a86", ATTRS { idProduct} == "7523", ENV {ID_MM_DEVICE_IGNORE} = "1"

lorsque l'appareil correspond au produit et au fournisseur de l'arduino bon marché, il exécute le script 'cheapduino.py' avec l'appareil comme argument, par exemple

cheapduino.py ttyUSB0

Ensuite, le script cheapduino se connecte en série à l'appareil et envoie la chaîne 'ID' et le logiciel sur l'appareil répond DEVID = THX1138 ou autre. Le script crée ensuite un lien symbolique / dev / THX1138 qui pointe vers / dev / ttyUSB0

Cette méthode présente de nombreux inconvénients. Le script doit expirer si le logiciel du cheapduino ne répond pas. De plus, cela n'utilise pas la fonction SYMLINK d'udev, donc il ne nettoiera pas les liens morts lors de la déconnexion, mais il les écrasera lors de la reconnexion. Tous vos bon marché doivent avoir cette fonctionnalité dans leur logiciel, avec différents ID d'appareil définis. Ils doivent tous utiliser le même débit en bauds que le script, sauf si vous voulez écrire un script très complexe qui prend beaucoup de temps. Enfin, cette méthode fonctionne beaucoup mieux à faible débit qu'en débit élevé, qui pour des raisons de synchronisation peut ne pas réussir à chaque fois. (cheapduinos sont bon marché!) 9600 fonctionne bien mieux que 115200 qui fonctionne après plusieurs essais. Mais puisque tous vos Arduinos CH340 doivent avoir la même vitesse avec cette méthode, vous ne pouvez aller aussi lentement que votre appareil le plus rapide.

Cette méthode fonctionne bien, et c'est ce que j'utilise parce que j'ai acheté beaucoup trop de ces choses bon marché.

En fin de compte, achetez de véritables Arduinos ou au moins des Arduinos avec des puces FTDI ou autre chose qui envoie un ID d'appareil unique.

= Riche

Rich Humphrey
la source
2

Si vous voulez distinguer 2 appareils fondamentalement identiques, vous avez 2 façons:

  • branchez-les toujours sur les mêmes ports et utilisez l'arborescence USB pour les différencier
  • créer un protocole de prise de contact, où chaque Arduino utilise un code que vous avez précédemment stocké dans leurs EEPROM respectives. Il pourrait même être possible d'écrire une fonction d'assistance pour UDEV, afin que la fonction d'assistance fasse la poignée de main et indique à UDEV la série qui est stockée dans chaque EEPROM. Cela permettrait d'écrire une règle UDEV pour vos appareils.
Igor Stoppa
la source
1

Mettez un Maxim DS18S20 sur votre carte, chacun a un numéro de série unique et est très bon marché. Il existe de nombreux exemples de logiciels sur Internet utilisant cet appareil. Vous pouvez le mettre sur le nano. pour fonctionner, il a besoin d'une résistance de 4,7 K connectée à +5 et d'une connexion à la terre. Vous pouvez connecter les connexions 5V et Ground de l'appareil à la terre. Il serait facile de supprimer cela sur le nano, puis par une simple communication via une broche, vous pouvez obtenir le numéro de série. Plusieurs packages sont disponibles. Avec précaution, vous pouvez utiliser une broche d'entrée, lire la série et l'enregistrer pour une utilisation future. Quand il commencera, il recommencera. Assurez-vous simplement que l'entrée n'est pas trop basse pendant le processus d'initialisation.

Bonne chance,

Gil

Gil
la source
Une fois que vous ne résolvez pas le problème dans la série USB, mais plutôt avec quelque chose qui nécessite la coopération du processeur sur la carte pour le découvrir, vous pouvez tout aussi bien modifier le chargeur de démarrage pour qu'il contienne un numéro de série lisible à la fois là-bas et dans une application programme (ie "sketch")
Chris Stratton
Quel non-sens. Le DS18S20 est un thermomètre numérique!
Elmue
Oui, c'est un thermomètre; Oui, il possède un numéro de série unique qui ne nécessite pas de changer le code ou l'eeprom sur chaque carte. Peu coûteux et simple. Inconvénient, le micro doit répondre. Il fonctionnera sans changer d'IDE ou de tout firmware, etc., mais il nécessite une broche qui peut être contournée avec un multiplexeur si nécessaire.
Gil
1

Je déteste le dire, mais la réponse est non, il n'y a aucun moyen d'identifier de manière unique plusieurs convertisseurs USB-série basés sur 340.

J'ai le même problème, où j'ai plusieurs (4+) convertisseurs USB-série, n'importe lequel peut être branché sur n'importe quel port, et ils ont été achetés en même temps et sont donc identiques à tous points de vue (y compris iSerial de 0).

Fondamentalement, si je déplace des objets, je dois me connecter à la main pour voir ce qui est attaché, parcourir la sortie dmesg, etc. C'est une grande douleur.

à M

À M
la source