Jag vill ansluta olika USB-enheter till en Arduino Uno (specifikt en gamepad och en webbkamera, men jag är intresserad av det allmänna fallet ). Är det möjligt utan att använda USB-värdskölden, eftersom Uno har en USB-port och USB-till-seriell omvandlare? Jag skulle kunna använda skölden, men jag är nyfiken på om det är nödvändigt.
Sparkfun-webbplatsen säger att:
SparkFun USB Host Shield innehåller alla digitala logiska och analoga kretsar som krävs för att implementera en USB-enhet med full hastighet / värdkontroll med din Arduino.
Innehåller Arduino inte redan detta, utan behöver bara rätt programvara (även om det uppenbarligen är lättare att använda det redan skrivna biblioteket för Host Shield). Eller finns det hårdvarubegränsningar?
Enligt Kan en Ethernet USB-dongel vara i stället för Ethernet-skärm för arduino? (Majenkos svar), det kan i teorin göras med Due, men inte med Uno . Är det i så fall för att Uno använder ATmega16U2 istället för FTDI FT232RL för USB-kommunikation?
Kommentarer
- Jag don ' tänker att det är omöjligt, USB är någon typ av seriell buss med specifika protokoll, dvs enhetsmärkning av delningsenheter till specifika tidsintervall (några liknande protokoll som en tråd). Jag tror att den enda begränsningen är hastighet, därför är synkronisering av alla USB-specifika kommandon och data det som orsakar problem,
- @GeneralChaos Du ' har rätt, det är ' är inte " omöjligt " – men det är mycket opraktiskt. Det finns en programvaruimplementering av en USB-enhet (VUSB) som inte ' behöver någon speciell hårdvara. Det ' är i bästa fall ojämnt och fungerar knappast i bästa tider. Det finns ingen anledning till varför du inte kunde ' t skriva en värdekvivalent – men den kan dock aldrig fungera vid något mer än 1,5 MHz USB 1.0 " Låg hastighet ", så kunde aldrig prata med något annat än ett enkelt tangentbord eller en mus. Saker som Ethernet eller webbkameror är helt omöjliga utan värd- eller OTG-hårdvara, som Due har inbyggt i huvudchipet.
Svar
Först och främst måste du lära dig grunderna för hur USB fungerar.
I USB finns det två huvudsakliga” saker ”: Värdar och enheter.
Du har en värd (vanligtvis din dator) och många enheter (som Arduinos, skrivare, skannrar, webbkameror, WiFi-donglar osv.).
Att vara värd innebär att veta om vilka enheter du ska ha anslutit till dig och hur man kommunicerar med dem. Att vara en enhet innebär att du bara kommunicerar med värden på ditt eget sätt.
Som du kan se är det ett mycket mer komplext jobb att vara värd än att vara en enhet.
Arduinos är enheter . De små USB-gränssnittschipsen de använder är mycket låga och kan bara vara en enhet, aldrig en värd.
Om du vill ansluta en enhet till något måste den vara en värd (Obs: Jag är medvetet ignorerar nav här).
Arduino Due använder ett mycket mer kraftfullt chip och som kan vara värd (med det som kallas On-The-Go-läge).
Att göra det med något mindre kraftfullt än en Due behöver du ytterligare hårdvara som är särskilt utformad för att vara en USB-värd – och det är där USB-värdskölden kommer in. Den har ett chip som är utformat speciellt för att vara en USB-värd så att du kan ansluta en enhet i det.
Ingen av chipsen på Uno är utformade för att vara en värd. De har bara inte makten.
Svar
Nej. USB skiljer strikt mellan värd- och enhetsroller. Några marker har funktionella block som kan utföra endera rollen, men 8u2 / 16u2 är inte exempel på detta.
Typiska USB-seriella omvandlare som FT232, CP210x, CH340, PL2303, etc. är också strikt enheter och oförmögna att vara värdar
Det finns billiga värdkompatibla MCU-apparater som Kinetis KL25Z, men för att använda dem i sin billigaste form behöver du en annan mjukvarumetod (till exempel mbed snarare än Arduino) och mycket mer personlig ansträngning. Teensy-LC är relaterat, men du betalar mer för Arduino-kodladdningshjälparen på den än för MCU som kör ditt program själv.