Hallo, ich bin neu hier im Forum und habe - kaum zu Glauben ;-) - auch
gleich ein Problem parat.
Aktuell sitze ich an einem Arduino Projekt und bereite dafür
verschiedene Bibliotheken vor. Dabei will ich auch ein einfaches
Serielles Protokoll schreiben und wollte dies mit einer
Beispielapplikation testen.
Dafür habe ich folgende Konstellation aufgebaut:
1
PC (Terminal 1) <=(übliche USB Verbindung)=> Arduino Uno/R3 <=(SW Serial über PIN 6/7)=> USB/Serial Adapter <=> selber PC (Terminal 2)
Als USB/Serial Adapter habe ich folgendes verwendet:
https://www.amazon.de/gp/product/B0757FQ5CX
Der kommt mit 3,3V und 5V zurecht, ich habe aber nur dessen GND mit dem
Arduino verbunden, 3V3 und +5V vom Adapter hängen in der Luft.
Im ersten Schritt habe ich nur RXD mit dem TX Pin (SW Serial, bei mir
Pin 7) und dann den Arduino per USB am PC angeschlossen. Dabei hat schon
der USB/Serial Adapter angefangen zu leuchten, scheinbar wird er schon
über GND/RXD mit Strom versorgt?
Ich habe trotzdem auch den USB/Serial Adapter per USB an den PC
angeschlossen und habe über dessen Verbindung tatsächlich das empfangen
(Terminal 2) können, was der Arduino sendet.
Nun wollte ich natürlich auch die Gegenrichtung testen, habe also
zunächst zur Sicherheit wieder alle USB Verbindungen getrennt und TXD
des USB/Serial Adapter mit RX (bei mir Pin 6) vom Arduino verbunden. Zum
Schluss habe ich auch USB wieder verbunden.
Nachdem ich Daten in Terminal 2 eingegeben, hätte eigentlich was im
Terminal 1 auftauchen müssen, tat es aber nicht. Nach einer Weile habe
ich gemerkt, dass der Arduino nicht mehr als Serielle Schnittstelle
erkannt wurde, stattdessen war im Geräte-Manager „Unbekanntes USB-Gerät
(Fehler beim Anfordern einer Gerätebeschreibung.)“ zu finden.
Abziehen/Anstöpseln oder Windowsneustart hat nicht geholfen, auch mit
getrenntem USB/Serial Adapter.
Zunächst habe ich befürchte, dass ich mir den PC USB Port durch
Rückspeisung kaputt gemacht habe. Nur passt das nach meinem Verständnis
nicht, immerhin habe ich die 3V3/5V extra nicht verbunden und die Tx
Leitung sollte ja dafür gedacht sein mit einem anderen Rx verbunden zu
werden egal ob 5V oder 3,3V Logik. Allerdings bin ich auch kein HW
Experte.
Es hat sich herausgestellt, dass der PC USB Port noch funktioniert. Auch
andere Arduinos werden dort erkannt. Der betroffene Arduino Uno
funktioniert sogar weiterhin an anderen PC USB Ports problemlos.
Nur die Kombination Arduino und dieser eine (ok, inzwischen sind es zwei
:-/ ) Port(s) will nicht.
Für mich macht es den Anschein, dass mein Rechner das „böse“ USB Gerät
erkannt hat und fortan an diesem Port Aussperrt.
Deswegen habe ich mal in der Registry (Win10 Rechner) alle Schlüssel mit
Verbindung zu „COM 3“ gelöscht. Natürlich habe ich die Einträge vorher
gesichert.
Unter
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\VID_2341&PID_0043\<irge
ndeineNummer> gab es noch einen Schlüssel „Properties", auf den ich
keinen Zugriff habe und dessen Zugriffsberechtigung ich auch nicht
ändern konnte. Ob dort noch etwas wichtiges drinne ist kann ich also
nicht sagen. Stattdessen habe ich eben die Werte unterhalb von
VID_2341&PID_0043 gelöscht, die ich konnte. Nach einem Windowsneustart
hat sich nichts an den beschriebenen Verhalten geändert, der Arduino
bleibt an diesem Port stumm, wird nur mit Strom versorgt.
Vor einigen Wochen ist mir etwas ähnliches passiert. Da hatte ich
versehentlich ein anderen Arduino Uno parallel sowohl extern als auch
über USB mit Strom versorgt. Seitdem wollte er außer Strom nix mehr vom
PC entgegennehmen. Da wusste ich zumindest was ich falsch gemacht hatte
und da der PC USB Port noch funktionierte, dachte ich, ich hätte auf
Arduino-Seite was kaputt gemacht. Wie sich nun aber herausstellt spricht
auch dieser Arduino fröhlich an anderen USB Ports und siehe da, sogar an
den bisher verbotenen Port klappt es wieder.
Das deutet für mich darauf hin, dass es keine Sperrliste mit bösen USB
Geräten gibt sondern nur einen Sperreintrag für ein einzelnes Gerät pro
Port. Eventuell macht das ja schon der USB Controller nicht Windows. Das
würde auch erklären warum nicht einmal die VID/PID im Geräte-Manager
richtig angezeigt wird.
So, nun habe ich aber genug Erklärt, nun können meine Fragen kommen :D
Was ist hier schief gegangen? Habe ich hier was falsch gemacht, als ich
den USB/Serial Adapter mit dem Arduino verbunden habe? Hätte ich doch
auch 5V verbinden müssen oder ist gar der USB/Serial Adapter gar nicht
für den beschriebenen Aufbau geeignet? Kann das wirklich ein USB
Rückspeisung gewesen sein, etwa wenn Pin 6, aus welchen Gründen auch
immer, doch als TX konfiguriert war?
Hat schon mal jemand was von diesen Sperreinträgen gehört/gelesen oder
hat eine bessere Erklärung? Wie werde ich die Sperrung wieder los ohne
ein anderes Gerät zu opfern?
Ich hoffe es kann mir hier jemand helfen, ansonsten schon mal danke fürs
lesen bis hier her.
Vielen Dank,
Frank
Frank M. schrieb:> Im ersten Schritt habe ich nur RXD mit dem TX Pin (SW Serial, bei mir> Pin 7) und dann den Arduino per USB am PC angeschlossen. Dabei hat schon> der USB/Serial Adapter angefangen zu leuchten, scheinbar wird er schon> über GND/RXD mit Strom versorgt?
Das nennt sich parasitäre Versorgung und kommt von einer Verletzung
der Absolute Maximum Ratings aus dem Datenblatt: Dort steht, dass der
RXD-Pin nicht mehr als Vcc+0,3V haben darf. Wenn du also keine Vcc hast,
dann ist Vcc = 0V und damit darf der RXD-Pin nur maximal 0V+0,3V = 0,3V
haben.
Aber wenn du nun dort am RXD 5V anlegst, sind das 4,7V zu viel. Dann
beginnt eine ESD-Schutzdiode zu leiten und "zieht" Vcc auf 4,7V. Und mit
Vcc =4,7V läuft dann der Chip los.
Bis du RXD auf low umschaltest und 0V anlegst...
Fazit: du solltest nicht an einen Eingang eines unversorgten ICs eine
Spannung anlegen.
Zum Rest kann ich nicht viel sagen, ausser dass meine USB-Ports auch
manchmal recht seltsame Dinge machen und USB-Kartenleser sowie darin
eingesteckte SD-Karten reproduzierbar erkennen oder auch nicht.
Ich habe jetzt einfach resigniert und nehme ein anderes OS, wenn es
darum geht, solche Zugriffe nachvollziehbar abzuhandeln.
Lothar M. schrieb:> Das nennt sich parasitäre Versorgung und kommt von einer Verletzung> der Absolute Maximum Ratings aus dem Datenblatt: Dort steht, dass der> RXD-Pin nicht mehr als Vcc+0,3V haben darf. Wenn du also keine Vcc hast,> dann ist Vcc = 0V und damit darf der RXD-Pin nur maximal 0V+0,3V = 0,3V> haben.
OK, solange der Chip dadurch keinen Schaden nimmt sollte das ja nicht
stören. Irgend eine Seite muss ich ja zuerst anstöpseln.
Zum Thema "USB-Ports machen seltsame Dinge" kann ich noch etwas
beitragen.
Ich habe Linux vom Stick gebootet (ohne nachzudenken auch genau am
genannten Port, hat aber problemlos geklappt) und auch dort wurde der
Arduino zunächst nicht erkannt. Abziehen/Anstecken hat aber geholfen.
In Windows wurde er aber wieder nicht erkannt, also habe ich nochmals
Linux gebootet und auch hier wurde er nicht mehr erkannt, egal wie oft
ich Abziehen/Anstecken probiert habe.
dmesg sagt:
1
[ 240.764593] usb 1-8: USB disconnect, device number 16
2
[ 254.381359] usb 1-8: new full-speed USB device number 17 using xhci_hcd
3
[ 254.509386] usb 1-8: device descriptor read/64, error -71
4
[ 254.745382] usb 1-8: device descriptor read/64, error -71
5
[ 254.981359] usb 1-8: new full-speed USB device number 18 using xhci_hcd
6
[ 255.109381] usb 1-8: device descriptor read/64, error -71
7
[ 255.345392] usb 1-8: device descriptor read/64, error -71
8
[ 255.453424] usb usb1-port8: attempt power cycle
9
[ 256.105357] usb 1-8: new full-speed USB device number 19 using xhci_hcd
10
[ 256.105602] usb 1-8: Device not responding to setup address.
11
[ 256.313363] usb 1-8: Device not responding to setup address.
12
[ 256.521357] usb 1-8: device not accepting address 19, error -71
13
[ 256.649364] usb 1-8: new full-speed USB device number 20 using xhci_hcd
14
[ 256.649608] usb 1-8: Device not responding to setup address.
15
[ 256.857599] usb 1-8: Device not responding to setup address.
16
[ 257.065355] usb 1-8: device not accepting address 20, error -71
17
[ 257.065448] usb usb1-port8: unable to enumerate USB device
18
[ 273.541357] usb 1-8: new full-speed USB device number 21 using xhci_hcd
19
[ 273.689885] usb 1-8: device descriptor read/all, error -71
Wichtiger als der an ein oder zwei Ports nicht erkannte Arduino wäre mir
aber ob ich an dem Aufbau irgendetwas falsch gemacht habe.
nicht jeder Arduino Uno/R3 hat Trennwiderstände zum USB IC, deswegen
kann es sein das der USB Chip die Leitung festhält!
Ein UNO hat nur eine serielle und wird darüber programmiert, willst du
die nutzen müsstes du die Verbindung zum USB trennen!
Ein Arduio mega2560 hat noch weitere freie serielle Schnittstellen, aber
immer gilt der kann darüber nicht versorgt werden zuerst muss der
Arduino Power bekommen!
Wenn du dann noch was mit 3,3V Pegel anschliessen willst brauchst du oft
auch Pegelwandler, an 5V läuft 3,3V Logik (Verbindung zun Raspi, EPS
o.ä.) manchmal nicht!
Frank M. schrieb:> Vor einigen Wochen ist mir etwas ähnliches passiert. Da hatte ich> versehentlich ein anderen Arduino Uno parallel sowohl extern als auch> über USB mit Strom versorgt
ja versehntlich darf man manchmal Chips nicht falsch verschalten.
zwei 5V Versorgungen zusammen müssen sich nicht vertragen, vor allem
wenn die 5V nicht gleich sind, also eine 5,25V hat und die andere 4,75V
+-5%.
Stefan ⛄ F. schrieb:> Ich schätze, dass du durch die Chips beschädigt hast
wenn das so ist dann nennt man das zerstört und nicht gesperrt.
Der Unterschied kaputt oder geperrt kann leicht getestet werden an einem
anderen PC oder Raspi wo man die Arduino IDE neu erstmalig installiert!
Joachim B. schrieb:> wenn das so ist dann nennt man das zerstört und nicht gesperrt.
Das ist ja auch nichts gesperrt. Mal geht es, mal nicht. So habe ich ihn
jedenfalls in seinen nachgereichten Infos verstanden.
Frank M. schrieb:> Dabei hat schon> der USB/Serial Adapter angefangen zu leuchten, scheinbar wird er schon> über GND/RXD mit Strom versorgt?
Der Adapter hat drei LEDs drauf, welche hat aufgeleuchtet?
RXD, TXD, PWR?
Wie hast Du das mit der Treiber Installation gemacht?
Der Adapter soll als COM Port erscheinen, VID = $10C4, PID = $ EA60.
Wenn das nicht so ist, dann schau mal mit USBviewer nach welche Geräte
installiert sind, am besten alles nicht Aktive entfernen.
Es gibt auch Tools mit denen man belegte COM Ports entfernen kann.
Ansonsten bist irgend wann mal bei Com 200 oder so.
Treiber installation: Am besten von SiLab herunterladen, das zip File in
einem Verzeichnis entpacken, dann vom Gerätemanager aus den Treiber aus
dem Verzeichnis installieren lassen. Niemals das setup oder install exe
ausführen.
Dann den Adapter testen, dazu die Pins RXD und TXD verbinden.
Mit einem Terminal Programm z.B. H-Term Zeichen senden, diese müssen
dann auch empfangen werden.
Wenn das funktioniert, kannst weiter machen.
Am Chiemsee schrieb:> Es gibt auch Tools mit denen man belegte COM Ports entfernen kann.
Du meinst wohl den Gerätemenager. Da kann man inaktive Geräte per
Menüoption einblenden und dann löschen.
Stefan ⛄ F. schrieb:> Du meinst wohl den Gerätemenager
Nein den Gerätemanger meinte ich nicht.
Sondern das hier:COM Name Arbiter Tool V1.0 - Reservierte COM-Ports
freigeben
Das ist so eine Marote die man Windows nicht so leicht ab gewöhnen kann,
das immer wieder ein neuer Com Port im Gerätemanager auftaucht, obwohl
das gleiche Gerät angesteckt wird.
Das funktioniert, so lange das gleiche Gerät immer gleichen USB Port
angesteckt wird. Nur wenn der USB Port gewechselt wird, hat man
plötzlich wieder einen neuen COM Port.
So die Richtige Lösung habe ich dazu noch nicht gefunden, man kann zwar
in der Registrie einen Eintrag ändern, das nur eine bestimmte Anzahl COM
Ports geöffnet werden kann.
Ich nehme aber lieber das Tool wenn es mal wieder so weit ist.
So, Problem gelöst aber nicht verstanden ;-)
Ich hab mir extra einen billigen USB 2.0 Hub geholt. Damit kann ich den
Arduino auch wieder an alle Ports betreiben. Außerdem kann ich damit
auch beide Seiten, also Arduino und Adapter, gleichzeitig mit Strom
versorgen. Ich habe auch zur Sicherheit noch jeweils 100Ohm zwischen die
Datenleitungen gesteckt.
Mit dem Aufbau hat es dann auch problemlos geklappt, Daten fließen in
beide Richtungen.
Zur Diskussion, zerstört oder gesperrt kann ich nur sagen, dass wenn da
HW mäßig was kaputt gegangen ist, dann sicherlich nur eine Kleinigkeit.
Bis auf das eine mal, bei dem es gestern Abend plötzlich unter Linux
auch am „bösen“ USB Port funktioniert hatte, deutet alles auf gesperrt
hin.
Vielleicht war es gestern einfach schon zu spät :-/
Am Chiemsee schrieb:> Der Adapter hat drei LEDs drauf, welche hat aufgeleuchtet?> RXD, TXD, PWR?
Die LEDs sind leider nicht wirklich beschriftet, aber ich würde es so
deuten.
Zunächst hat PWR (rot) geleuchtet, liegt neben GND.
Dann hat RXD (blau) geleuchtet, liegt auch neben RXD.
Das wäre so ja auch erklärlich, zuerst liegt die Spannung an und wenn
der Arduino fertig mit booten ist habe ich testweise was gesendet. Und
das passt auch zu der Beobachtung jetzt mit funktionierendem Aufbau.
Treiber für den Adapter ist installiert, er wird problemlos als COM Port
erkannt.
Es war ja auch nur der Arduino als COM Port verschwunden.
Ich bin nun wieder arbeitsfähig, trotzdem würde ich gerne verstehen was
passiert ist. Für mein Projekt ist dass nicht relevant aber wenn ich
meine Bibliothek veröffentlichen will, dann auch mit Beispielcode. Ich
möchte aber ungern ein Beispiel präsentieren, mit dem man potenziell
sein USB Port zerstört.
Meine Vermutung ist, dass mit anstecken des Adapters eine
Spannungsspitze über TXD zum Arduino Board und von dort irgendwie bis
zum USB Port gewandert ist und dort irgendeine Fehlerbehandlung
ausgelöst hat.
Kann man das Schaltungstechnisch unterdrücken oder mindestens dass
Risiko minimieren?
Muss man dringend die Spannungen auf beiden Seiten gleichzeitig anlegen?
Im übrigen würde ich in meinem Beispielcode auf 2 Arduinos verweisen,
dass Problem mit den unterschiedlichen Logikpegeln entfällt dann schon
mal.
Bei manchen Computern sind die 5V Leitungen mit Polyfuses abgesichert.
Oft erhöht sich ihr Innenwiderstand nachdem sie zum ersten mal ausgelöst
haben. Danach funktionieren an solchen Ports nur noch Geräte mit
geringer Stromaufnahme wie z.B. Mäuse.
Derart "verschlissene" Polyfuses können genau sie zu dünne Kabel und
verschlissene Steckverbinder zu sporadischen Fehlfunktionen führen -
insbesondere bei Geräten ohne eigene Stromversorgung.
Wenn du einen Hub mit eigenem Netzteil verwendest, stören die Polyfuses
des Computers schon mal nicht. Ein Knackpunkt weniger.
Am Chiemsee schrieb:> Das ist so eine Marote die man Windows nicht so leicht ab gewöhnen kann,> das immer wieder ein neuer Com Port im Gerätemanager auftaucht, obwohl> das gleiche Gerät angesteckt wird.
Da kann ich mich nicht beschweren, egal wo ich mich anstöpsle, bekomme
ich immer die selbe COM Port Nummer, nur nach dem Löschen der
Registry-Einträge gab es neue Nummern. Das Tool wird sicherlich nichts
anderes machen als ich manuell gemacht habe.
Aber ich kenne durchaus auch noch den Fall, dass ein COM Port plötzlich
für ein anderes Gerät wiederverwendet wird. Wenn man dann das
ursprüngliche Gerät zusätzlich ansteckt, hat das dann natürlich eine
neue Nummer.
Frank M. schrieb:> Da kann ich mich nicht beschweren, egal wo ich mich anstöpsle, bekomme> ich immer die selbe COM Port Nummer,
Dann hast du Geräte, welche eine Seriennummer mitliefern.
z.B. Arduino UNO und Mega mit dem 16U2 als Serial Adapter tun das so.
Stefan ⛄ F. schrieb:> Bei manchen Computern sind die 5V Leitungen mit Polyfuses abgesichert.> Oft erhöht sich ihr Innenwiderstand nachdem sie zum ersten mal ausgelöst> haben. Danach funktionieren an solchen Ports nur noch Geräte mit> geringer Stromaufnahme wie z.B. Mäuse.
OK, danke für den Hinweis, wieder was gelernt :-)
Gibt es solche Polyfuses auch in Kabeln?
Ich hatte auch ein USB Verlängerungskabel geholt, damit ich zur Not auch
eins kaputt machen kann, falls ich an den USB Leitungen was messen will.
Nun hat sich herausgestellt, dass es schon reicht ein Verlängerungskabel
dazwischen zu haben nur damit die Verbindung klappt.
Häää?
Ich bin nur SW Entwickler, also Entschuldigung, wenn dass hier gleich
Blödsinn ist:
Längere Leitung => grösserer Widerstand => geringer Strom => Polyfuses
"lösen" nicht aus.
Frank M. schrieb:> Gibt es solche Polyfuses auch in Kabeln?
es gibt zwar vieles aber das ist relativ unwahrscheinlich.
Leider gibt es sehr unterschiedliche USB Kabel und auch Qualitäten und
neuerdings ist die Masche mit dicken Kabeln mehr Kupfer vorzugauckeln
dabei ist Kupfer oft dünn und manchmal auch nicht vorhanden nur die
Isolierung ist dick und manchmal fehlen die Datenleitungen bei USB
Netzteile!
Von aussen sieht man es den Teilen ja nicht an!
Manchmal stimmt auch die Impedanz nicht so das einige mitgelieferte
Kabel nur an dem zugehörigen Gerät funktionieren, alles schon seit
Beginn von USB selbst erlebt!
Ich hätte wohl noch etwas genauer ausholen sollten, warum ich gefragt
habe, ob es Polyfuses auch in Kabeln gibt. Bisher hatte ich das Kabel
ausgeschlossen, da es ja an anderen Ports mit den selben Kabel geklappt
hat. Ich habe aber nur 3 Ports probiert. Mit den beiden Frontports habe
ich den Fehler beobachtet. Dort habe ich dass Kabel immer direkt
angeschlossen. Den einen hinteren Port habe ich mit Verlängerungskabel
nach vorne geholt, da hatte ich also immer ein längeres Kabel dabei.
Der andere Arduino hatte ja auch an den vorderen Ports funktioniert.
Dabei hatte ich aber ein anderes USB Kabel genutzt. Wenn statt Arduino +
Kabel einfach nur den Arduino tausche, kann ich den Fehler auch mit
beiden Arduinos beobachten. Der Fehler tritt also nur in Zusammenhang
mit dem einen Kabel auf und auch nur, wenn ich das Kabel direkt ohne
Verlängerung nutze.
Vermutlich haben sowohl das Kabel als auch die beiden Frontports einen
kleinen Schaden.
Inzwischen habe ich auch noch zwei Optokoppler gefunden, damit bin ich
auf jeden Fall auf der sicheren Seite.