USB OTG als Steuerung verwenden

  • Guten Tag Zusammen,
    Ich bin volllkommen neu in der Android App Programmierung und hätte nun mal eine Frage an euch.
    Ich möchte ein Projekt realisieren, in dem ich mit einem Android Smartphon ein Schloss schalten möchte... Das ganze soll über ein Kabel funktionieren, da ich nicht extra noch ein Bluetooth Modul für das schloss bauen möchte.
    Ich hatte bereits folgenden Ansatz:


    Um das Schloss zu Öffnen möchte ich ein Mosfet schalten welches vom Smartphone gesteuert wird. Wenn ich über USB OTG das Smartphone als Host festlege, sollte dieses ja die SPannungsversorgung bereitstellen.


    Jetzt ist meine Frage ob es möglich ist softwaretechnisch zwischen USB Host und Accessory Mode zu wechseln und somit die Spannung auf der USB Schnittstelle an- und auszuschalten? Gerne bin ich auch für andere Konzepte offen.


    Vielen Dank im Voraus
    Tobi

  • puuh das klingt abenteuerlich, da bin ich echt gespannt inwieweit das klappt.


    aber wozu ein bluetooth modul? NFC geht auch ;)


    zu deiner frage:
    Ich glaube nicht dass das so einfach geht, sicherheit und so, aber vielleicht wenn es gerootet ist.

  • Ich fürchte, das wird so nicht ausreichend sein.
    Einerseits kannst Du nicht Appseitig vom Host in den Accessory Modus wechseln. Für den Schlossöffner benötigst Du die Spannung ja im Normalfall nur ganz kurz. (Unter 1 Minute)
    Der USB Host Modus legt ja aber nicht nur die Spannung an, er konfiguriert das komplette Gerät einmal durch, um als Host zu agieren.
    Wenn man den Modus verlässt, konfiguriert sich das komplette Gerät wieder durch, um als Client zu arbeiten.
    Diese Vorgänge benötigen Zeit und mit Deinem Ansatz kann es durchaus passieren, dass die Wechsel schneller erfolgen als diese Konfigurationen abgeschlossen werden können.


    Hinzu kommt, dass die gängigen USB Schnittstellen ~5V bei 100/500/900mA liefern.
    (Gibts da schon USB 3.0 drin?)
    Bessere Versorgung bekommst Du mit USB 3.1 Typ C, je nach Typ von 5V 2A bis hin zu 20V 5A.
    Allerdings speist das Telefon die Schnittstelle, über 5V/2A wirst Du da nicht kommen.
    Ich kann nicht beurteilen, ob das Deinem MOSFET reicht um auf zu machen und ob es dem Schloss genügt, um sich zu entriegeln.
    Da müsstest Du entsprechend die Spezifikationen vergleichen und gegebenenfalls einen Hochleistungs-MOSFET an der Steckdose nutzen, um den Steuerstrom entsprechend hochzupushen.


    Wie dem auch sei, die Spannungsversorgung des USB Host Modus ist eben genau dafür gedacht: Zur Spannungsversorgung.
    Damit würdest Du also Deinem MOSFET erst einmal nur die SOURCE Spannung zur Verfügung stellen. Ob es eine gute Idee ist, ihm diese wieder zu entziehen, kann ich nicht beurteilen. So viel Hardware habe ich nicht gemacht. Ich kann es mir aber nicht vorstellen.
    In jedem Fall benötigst Du aber auch einen Steuerstrom GATE, sonst passiert gar nix. (Ich gehe mal von einem selbstsperrenden MOS aus, wäre sonst blöd für ein Schloss.)


    Natürlich könntest Du jetzt die Spannung auf auf GATE legen, aber das halte ich für völlig falsch.
    Zwirbel lieber das USB Kabel auseinander, leg die Spannung auf SOURCE und nimm ein Steuerkabel für GATE.
    (Also ROT auf SOURCE, SCHWARZ sowie PIN 4 auf N, GRÜN auf GATE)
    WEISS dürftest Du nicht brauchen, da Du ja keine Antworten vom Gerät erwartest. ;)
    (Natürlich könntest Du das Ding an DRAIN klemmen und signalisieren: OFFEN (Strom fließt))


    Dann implementierst Du gemäß des USB Host Guides der Android Seite die Kommunikation und es sollte soweit alles laufen.
    (WENN denn die Spannung der Steuerleitung für den GATE Deines MOSFET ausreicht. Ich finde keine Informationen darüber, wie viel da so bei rum kommt.)


    Noch zu beachten wäre allerdings, dass Dein MOSFET nicht zu viel Strom zieht.
    Gemäß Standard sollte das Ding maximal 100mA ziehen und bei einem Mehrbedarf fragen. Du müsstest also im Idealfall einen USB Controller vor Dein MOSFET setzen, dass sich um die Aushandlung des Stroms kümmern und in dem Zusammenhang auch gleich die Steuerung des MOSFET übernehmen kann.


    So würdest Du die Sache jedenfalls 'richtig' im Sinne von 'dem USB Standard entsprechend' machen.
    Wenn Dein MOSFET zu viel Strom zieht, kann es nämlich passieren, dass Dir das Energiemanagement Deines Smartphones durcheinander kommt oder, schlimmer noch, es Dir Deinen Port zersemmelt.
    (Also immer schön auf einem ganz alten und unwichtigen Testgerät, bestenfalls mit abgelaufener Gewährleistung rumprobieren.)


    Wenn Du dann noch einen Microcontroller zwischen setzt, kann der Dir vielleicht noch tollere Informationen auf Deinen USB Controller schieben.
    'Habe geöffnet' und 'Habe geschlossen' statt 'OFFEN' zum Beispiel.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    Einmal editiert, zuletzt von Marco Feltmann ()

  • Zunächst einmal Danke für die ausführliche Antwort:)


    Dass dies nicht softwareseitig zu wechseln geht is natürlich sehr blöd...


    Die Spannungsversorgung des Mosfets ist allerdings extern und die Spannung des Smartphones wird lediglich als Gatespannung zum Versorgen des Mosfets benötigt.
    Hierbei liegt die dauert bei ca. 100 ms.


    Vielleicht wäre es eine Möglichkeit das Smartphone dauerhaft als Host zu versorgen. Dann müsste ich allerdings eine Datenleitung an das Gate anschließen..
    Hier ist dann aber die Möglichkeit ob es möglich ist einen 100 ms langen High-Pegel über Data+ zu senden. Was denkt ihr darüber?

  • Über den DATA+ kannst Du senden was Du möchtest.
    Das Senden sollte asynchron erfolgen, du kannst also beispielsweise einen Bytestream starten, der eine 1 nach der Anderen durch die Leitung pumpt.
    Ein Timer beendet dann nach 100ms diesen Bytestream sauber.


    Alternativ berechnest Du Dir die vermutliche Übertragungszeit des Bytestreams.
    Theoretisch hat USB 2.0 eine Geschwindigkeit von 480MBit/s, also 480.000.000 Bit pro Sekunde.
    (Hier handelt es sich nicht um Megabyte, sondern um Megabit, also nicht mit 1024 rechnen!)


    Du brauchst nur 1/10 einer Sekunde, also 48.000.000 Bit.
    Entspricht also einem Bytestream von 48 Millionen true Werten, also einem ungefähr 45,8MB großes Dokument…


    Ich weiß allerdings nach wie vor nicht, wie groß der High Pegel (in Spannungs– und Stromwerten) sein muss und was so ein TRUE auf dem DATA+ (in Spannungs– und Stromwerten) liefert. Eventuell musst Du noch einen Spannungswandler zwischen klemmen, der aus einem 100mV/10mA Signal etwas für den MOSFET verständliches baut.
    Hinzu kommt, dass ich absolut keine Ahnung habe, wie zuverlässig USB im Hinblick auf Datenoptimierungen, verlorene Datenpakete oder Latenzen ist, sprich: Wenn mein Port fleißig Einsen sendet, feuert das System sie dann so raus, wie sie rein kommen? Schickt es den Kram byteweise? Schickt es einzelne Pakete erneut? Wartet es auf Antworten von der Gegenstelle?
    Hier musst Du Dich ganz genau mit der Spezifikation von USB auseinandersetzen, um abklären zu können, ob das überhaupt das kann was Du gern hättest.
    Ein einfaches Stromkabel mit einem Schalter dran ist es halt nicht. Mehr so ein Morsedings. Solange Du die Morsezeichen nicht verstehst, kannst Du da nicht viel machen. Wenn alle maximal 3 Zeichen pro Buchstaben mit fest definierten Pausen verwenden, kannst Du da auch nicht ohne Weiteres ausbrechen.


    Eventuell brauchst Du wirklich eine zwischengeschaltete Logik, die noch auf 'Mach auf!' und 'Mach dicht!' reagiert. Oder auf 'Mach auf!' hört und eigenständig nach 100ms zu macht.


    Du bewegst Dich hier in einem Schattenbereich zwischen Software– und Hardwaredevelopment.


    Bevor Du jetzt hier anfängst nach allen Richtungen zu suchen, würde ich wie folgt vor gehen:

    • Altes passendes USB Kabel suchen
    • Altes unwichtiges Android Gerät suchen
    • Kabel aufschneiden und +5V an das Gate legen
    • Anderes Ende ins Gerät stecken (Hoffentlich das Kabel am richtigen Ende aufgeschnitten… ;))
    • Manuell den Host Modus aktivieren und wieder deaktiveren

    Wenn's dann klackt kannst Du in der Richtung weiter recherchieren. Wenn nicht, musst Du Dir was Anderes überlegen.


    Aber wie gesagt geht das schon fast in den Bereich Microcontroller/Embedded Development.
    Denn eigentlich ist so ein USB nur zur Kommunikation gedacht, mit diesen Kommunikationen irgendwas anfangen sollte die Gegenstelle.
    Und das ist dann Embedded Development und wohl auch das Haupt'problem' bei diesem Projekt.


    Denn wenn das erst mal steht (Power via USB [oder extern], Ansteuerung via DATA+ von USB, eine USB Nachricht reicht zum Öffnen) kannst Du da nachher ranpappen was Du willst. Arduino mit Bluetooth oder NFC, eine alte Microsoft Tastatur, EveryKey, einfach alles, wenn es denn irgendwie USB spricht. ^^

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    2 Mal editiert, zuletzt von Marco Feltmann ()

  • Zunächst einmal vielen Dank für deine ausführliche Antwort. Jetzt habe ich allerdings noch ein paar fragen.


    1. Bist du dir sicher dass es nicht möglich ist den USB Host Mode softwareseitig ein- und auszuschalten und somit die Spannung hinzuzuschalten? Wie wird der Host denn dann aktiviert? Der USB OTG Adapter is ja eigentlich nur ne Brücke zwischen Masse und ID. Also wie funktioniert das ganze mit dem USB OTG?
    Ich denke wenn ich den Host Mode manuell ein und ausschalte wird es auf jedenfall funktionieren, jedoch muss das ja irgendwie mit software realisierbar sein...


    2. Ist es überhaupt möglich einfach Bits auf den USB Bus zu geben, denn das Mosfet ist ja eigentlich kein Device mit dem das Smartphone kommunizieren kann, ist ja kein Mikrocontroller oder sowas. Ich habe dazu mal ein Schema erstellt wie meine idee war (s. Anhang)


    3. Hast du eine andere Idee wie ich so günstig wie möglich ein Signal aus dem Smartphone bekomme um das Mosfet zu schalten?




    Danke für die Hilfe! :)

  • 1. das wird normalerweise ganz tief versteckt im Kernel gemacht. OTG geht so: Kurzschluß am ID pin erkennen (das macht Hardware und löst einen Interrupt aus), Wandler von Akkuspannung im Gerät auf 5V einschalten und warten dass sich das angeschlossene Gerät per USB-Protokoll meldet (dann wird ausgehandelt wie schnell es ist, welchen Strom es haben will und was für ein Gerät es ist). Das alles bekommt man in Android selbst auf der Kommandozeile (adb) nicht mit. Nur das Ergebnis dass z.B. ein USB-Speicherstick erkannt wurde. Falls Du extrem viel Glück hast, gibt es bei Deinem Kernel im /sys eine Möglichkeit das gezielt zu schalten.


    2. Bits auf USB-Bus schreiben geht auch nur wenn Du einen Kerneltreiber für den USB-Controller auf Deinem speziellen Prozessor hast. Dann gibts entweder einen Test-Mode wo man gezielt Spannungen auf D+ oder D- schalten kann (0, floating, 3,3V). Oder man kann den USB-Port auf UART schalten (falls das eingebaut ist). Aber alles das geht nicht auf Android-Ebene sondern Du mußt ein Cyanogenmod installieren und den Kernel hacken.


    3. Es gibt Bluetooth-Module z.B. mit RS232-Interface für ca. 10€ (schaue mal auf Aliexpress). Das ist nicht sooo viel mehr als ein USB-Stecker + Kabel kostet und Du kannst über stty den RTS "fernsteuern". Und das Risiko das Handy zu beschädigen ist kleiner. Du mußt im Schaltplan nämlich S mit GND vom USB (also dem Gerät) verbinden - sonst ist die Gate-Source-Spannung undefiniert.


    Zum MOSFET: am Gate zieht der gar keinen Strom, das reicht eine Steuerspannung (Gate-Source-Spannungsdifferenz). Das ist ja der Witz an FETs gegenüber bipolaren Transistoren.


    Also in Summe scheint mir für den Anwendungsfall ein Microcontroller-Modul mit eingebautem Bluetooth besser geeignet zu sein. Da kannst Du dann auch Sicherheitsmechanismen einbauen.

  • Hi,


    ich würde das Konzept mit dem USB-OTG noch mal grundsätzlich überdenken. Ich selber habe schon mal über USB-OTG und das IOIO Board diverse Experimente gemacht und sogar gute Ergebnisse erzielt. Allerdings ist das abhängig vom verwendeten Smartphone/Tablet und man kann sich nicht darauf verlassen, dass die zukünftigen Geräte sich identisch verhalten.


    Alle meine aktuellen Projekte bei denen ich von meinem Android Geräte etwas steuern funktionieren über WiFi. Dabei habe ich einen programmierbaren Mikrocontroller der WiFI onboard hat und sich entweder mit einem existierendes Netz (Router) verbinden kann oder selber ein Netz erstellt (so kann man sich vom Handy aus direkt mit dem Mikrocontroller verbinden ohne einen zus. Router zu nutzen).


    Das schöne an dem Mikrocontroller ist, der ist nicht viel Größer als ein Fingernagel, kostet nur ca. 3 Euro und ist in Lua (ähnlich wie JavaScript) zu programmieren.


    Ach ja, dass Ding heißt esp8266 und es gibt unterschiedliche Ausführungen. Ich nutze bei kleinen Projekten gerne den ESP-02 und bei größeren Projekten den ESP-21 oder den ESP-201. Ich bestelle sie immer bei Aliexpress. Dass dauert dann zwar immer ein wenig, aber wenn man gut plant ist das kein Problem.


    Die Kommunikation realisiere ich dann mit http. Das ist einfach, funktioniert auch durch viele Firewalls und ist in den meisten Fällen mehr als ausreichend.


    Hier noch ein Link zu einem Projekt dass ich mit einem ESP-12 realisiert habe.
    http://www.dieletztedomain.de/…nsoren-am-esp8266-update/

  • Zunächst Danke für die Antworten



    1. das wird normalerweise ganz tief versteckt im Kernel gemacht. OTG geht so: Kurzschluß am ID pin erkennen (das macht Hardware und löst einen Interrupt aus), Wandler von Akkuspannung im Gerät auf 5V einschalten und warten dass sich das angeschlossene Gerät per USB-Protokoll meldet (dann wird ausgehandelt wie schnell es ist, welchen Strom es haben will und was für ein Gerät es ist). Das alles bekommt man in Android selbst auf der Kommandozeile (adb) nicht mit. Nur das Ergebnis dass z.B. ein USB-Speicherstick erkannt wurde. Falls Du extrem viel Glück hast, gibt es bei Deinem Kernel im /sys eine Möglichkeit das gezielt zu schalten.


    2. Bits auf USB-Bus schreiben geht auch nur wenn Du einen Kerneltreiber für den USB-Controller auf Deinem speziellen Prozessor hast. Dann gibts entweder einen Test-Mode wo man gezielt Spannungen auf D+ oder D- schalten kann (0, floating, 3,3V). Oder man kann den USB-Port auf UART schalten (falls das eingebaut ist). Aber alles das geht nicht auf Android-Ebene sondern Du mußt ein Cyanogenmod installieren und den Kernel hacken.

    Ja ich denke auch dass es durchaus einfachere Möglichkeiten wie z.B. das Verwenden eines Bluetooth Moduls oder wenn ich es wirklich über USB mache, dann einen USB-fähigen Mikrocontroller verwenden.


    Das heißt wenn ich wirklich nichts dazwischen schalten (also kein µC) will, dann muss ich tief im Kernel Dinge abändern von denen ich keine Ahnung hab? Wie meinst du das mit "/sys in meinem kernel"?


    Das Problem in meiner Konzept ist auch dass das Smartphone ja eigentlich nicht mit dem Mosfet kommunizieren kann. Das heißt es wird ja sicherheit keine Rückmeldung vom Mosfet erhalten.

    Hi,


    ich würde das Konzept mit dem USB-OTG noch mal grundsätzlich überdenken. Ich selber habe schon mal über USB-OTG und das IOIO Board diverse Experimente gemacht und sogar gute Ergebnisse erzielt. Allerdings ist das abhängig vom verwendeten Smartphone/Tablet und man kann sich nicht darauf verlassen, dass die zukünftigen Geräte sich identisch verhalten.

    Ich nehme also an dass dieses IOIO Board von dem du redest eine Mikrocontroller besitzt und du ganz normal über USB mit diesem kommunizierst? Das wäre dann ja auch wieder die Methode normale USB Kommunikation mit einem µC oder?

  • Genau. Ist echt schon sehr praktisch, wenn man mit dem Android Gerät etwas steuern möchte und kein Funk (WiFi oder Bluetooth) nutzt. Besonders, weil Du den Mikrocontroller nicht extra programmieren musst. Die komplette Programmierung erfolgt in der Android App. Aber ich habe schon vor einiger Zeit bei mir alles auf Funk umgestellt.


    Details dazu findest Du z.B. hier.


    http://6om.de/7c3y

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!