Autore Topic: Comunicazione USB con periferica  (Letto 2929 volte)

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Comunicazione USB con periferica
« il: 05 Febbraio 2013, 10:03:28 CET »
0
Salve a tutti.

Sto disperatamente cercando informazioni e documentazioni a riguardo ma ho un pò di confusione. La mia necessità ora è di aprire una comunicazione USB tra la mia piattaforma Android e una periferica da me costruita, obbligatoriamente tramite host. Dico così perchè per contenere i costi di sviluppo l'alimentazione della periferica deve passare tramite il cavo usb di comunicazione quindi visto che il tablet stesso è sempre tenuto sotto alimentazione non ha senso aggiungere un terzo filo.Do per scontato che la mia piattaforma android monta usb host. L'idea originale è collegare il cavo usb ad un convertitore seriale che dialoga tramite integrato FTDI. Ho già ricompilato il kernel con i driver dell'integrato. Sempre per contenere i costi di sviluppo e produzione non posso montare schede come arduino, cosa che invece voi tutti utilizzate spesso per queste cose.

Sono in difficoltà, anche volendo comprare libri e manuali ( ne ho già comprato uno ) non trovo nulla di didattico su cui studiare che non sia la guida ufficiale di android.

Devo capire come inviare comunicare, volendo anche una soluzione seriale sarebbe ottima. In fondo già utilizzo ADB per compilare e provare il programma quindi una soluzione deve esserci per forza. Confido in voi guru di androi

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Comunicazione USB con periferica
« Risposta #1 il: 05 Febbraio 2013, 12:02:02 CET »
0
Che io sappia la possibilità di accedere alla funzionalità USB HOST è abbastanza rara su terminali e tablet commerciali, se non attraverso ROM custom (e sembra tu abbia proprio una di queste visto che hai ricompilato il kermel).

Comunque non ho la minima idea se il tablet sia in grado di alimentare adeguatamente una periferica esterna (esempio dubito sia in grado di darti il mezzo ampere tipico dell'USB del PC).

Per quanto riguarda il contenimento costi, mi trovo d'accordo con te se devi fare una produzione su larga scala, ma se è per uso personale/hobbystico, ti invito a riconsiderare arduino (il mese scorso ho visto su ebay una board arduino con ethernet e usb a 20€ spedizione inclusa).

Per esperienza pesonale io ho trovato particolarmente facile usare la connessione Bluetooth con un modulino esterno che converte da BT a UART. Anche perchè gira su qualsiasi terminale con BT, con qualsiasi android da 2.x in su, senza bisogno di ricompilare niente.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Comunicazione USB con periferica
« Risposta #2 il: 05 Febbraio 2013, 12:57:38 CET »
0
grazie per la risposta, sinceramente non ci speravo :D

allora...

la periferica consuma veramente poco. E' solamente un rice/trasmettitore che funziona da centrale. Riceve stringhe di dati da "sottoperiferiche" ad una distanza massima di 50/100 metri. i 500mA/5 V ( che tra l'altro per scrupolo ho misurato col tester e risultano effettivi anche senza carico/connessione ) sono più che sufficienti. L'anno scorso ci alimentavo senza problemi un modulo SIM900 con la possibilità di ricaricare una batteria al litio da 700mA. Questo punto non mi spaventa. Al massimo dovrò verificare che il tablet che andrò a comprare sia "cinese ma non troppo" e che il segnale di alimentazione si stabile ma cavolo.... non è uno standard usb quello?

Devo fare una produzione su vasta scala. Non così vasta ma aggiungere 20 euro di scheda come interfaccia contro i pochi euro dell'integrato FTDI non ha senso ( se non fosse l'unica soluzione ovviamente ).

Il bluetooth l'avevo pensato anche io.... ma ritorniamo ai costi. Evitere il cavo usb ma il tablet consumerebbe più batteria e sarei costretto ad alimentare entrambe le piattaforme ( tablet e periferica ) Con due alimentatori separati. Doppia Spina utilizzata quindi non va bene. Meno fili collega il cliente finale e più siamo contenti. Senza contare che il mio tablet attualmente non ha bluetooth integrato, dovrei attaccarlo tramite usb e l'integrato da montare sul circuito è di costo superiore al FTDI.

Ovvio che in termini hobbistici tutto è visto sotto un altra luce.... e la mia difficoltà è proprio questo. La documentazione più vasta utilizza arduino e implementazioni hobbistiche. Preferiamo investire sui costi di sviluppo ed avere un prodotto di qualità che costi meno rispetto al contrario.
Io sono solo un programmatore. Per lavoro in questi ultimi tempi sto intingendo mani praticamente ovunque ma non ho mai sviluppato su android, è da 3 settimane che sto studiando e sviluppando codice per il nostro lavoro. Ammetto che questo si sta rivelando la più brutta capra da tosare. Sto solo cercando di capire dove andare a studiare seriamente tutta questione, visto che a quanto sembra è tra le meno trattate.

http://developer.android.com/guide/topics/connectivity/usb/host.html#example

Questa è stata la mia migliore fonte di informazioni per ora... anche su http://stackoverflow.com la situazione sembra più trattata ma lo stesso confusa. Per ora mi limito a studiare gli esempi ufficiali sperando di capirci qualcosa. Ma il problema è che non riesco a trovare nemmeno un libro o un manuale più avanzato che tratti seriamente la comunicazione USB.

p.s.: giusto per curiosità per "tablet" intendo uno schermo touchscreen+APC 87-50
http://apc.io/

Qui siete tutti abituati a parlare di samsung e simili...forse ai meno "esperti" sarà curioso sapere che esistono anche le architetture nude e crude su cui smanettare un bel pò e realizzare simpatici lavori. Non vi nascondo che il fomento iniziale in ditta è andato a scemare e stiamo valutando di passare ad un sistema più "standard" ma molto meno costoso, ovvero un semplice tablet touchscreen. Che almeno monta una versione di Android migliore.

In ogni caso il problema usb rimane.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Comunicazione USB con periferica
« Risposta #3 il: 05 Febbraio 2013, 14:04:21 CET »
0
Come avevo accennato, l'host mode è un'introduzione relativamente recente, da android 3.1 in poi (e retro-ported anche nel 2.3.4). Questo aspetto, unito al fatto che non tutti i device ce l'hanno abilitato (ed è anche difficile capirlo dai dati pubblicizzati), spiega come mai trovi poco materiale in circolazione.

Lungi da me dirti cosa devi fare, ma prendete anche in considerazione lo scenario di manutenzione ed eventuale reperibilità dei pezzi negli anni di copertura. Voglio dire: se trovate difficoltà a selezionare un tablet con usb host attivo ed utilizzabile, c'è la possibilità di non trovare rimpiazzo nel futuro, qualora quello selezionato uscisse di produzione (vista la vita molto breve di questi oggetti). Paradossalmente molto soluzioni hobbystiche hanno il pregio di avere una manutenibilità incredibile nel tempo, in quanto si basano su prodotti e tecnologie molto longeve.

Per quanto riguarda le architetture nude e crude, a mio parere ha senso prenderle in considerazione solo se il committente finale ti riconosce (meglio se lo esige) lo sforzo aggiuntivo, altrimenti la rimessa è certa (perchè manutenere anche un sistema operativo potrebbe essere incredibilmente oneroso).

Il mio approccio, anche in ambito professionale (che non riguarda minimamente android), è di mantenere le cose più semplici possibili. Se due cavi di alimentazione possono apparire "brutti", ma rendono tutto incredibilmente più semplice e complessivamente meno costoso, io lo prenderei in considerazione.

My 2 cents
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Comunicazione USB con periferica
« Risposta #4 il: 05 Febbraio 2013, 14:29:24 CET »
0
mi hai aperto un mondo.

ero assolutamente convinto che fosse la modalità host quella "vecchia" mentre accessory fosse quella nuova ed ecco spiegato il motivo di così poca documentazione. Invece c'è poco scritto in giro perché è nuova.... sono sorpreso. Ora capisco anche il senso di un articolo che ho letto qualche giorno fa, parlava della scelta migliore tra le due e le varie implementazioni.

Ma dal momento che la porta USB host è limitata a pochi tablet non basta prendere un qualsiasi tablet, verificare se ce l'ha e in caso di esito negativo ricompilare il kernel con driver e limitazioni tolte come ho già fatto io? Ho dovuto ricompilare il kernel in quanto ho dovuto aggiungere alla scheda che sto utilizzando io i driver touch screen usb del mio video. Un operazione che l'apc non gestisce in automatico. Hai parlato di rom custom e credo sia la stessa cosa. Oppure sto facendo confusione anche su questo punto?

Abbiamo optato inizialmente per l'APC 8750 in quanto permette ( dopo aver aggiustato il kernel ) di utilizzare come periferica I/O un monitor touchscreen di grandi dimensioni. Quello che ho io in laboratorio è a 12 pollici, per l'applicazione i normali tablet da 7/9 pollici risultano essere troppo piccoli. Un compromesso sarebbe stato un 10 pollici. Lo abbiamo trovato per grandi quantità ad un prezzo decisamente accessibile ( sui 160 euro ivato ). Ma tu dici di controllare se ha l'usb host. Io credevo bastasse trovare un tablet che ha porta usb per gestire dati, che sia "aperta o programmabile" e a quel punto ricompilare il kernel ( operazione che facciamo fare conto terzi ) e "riabilitare la porta USB".


In fondo Host Mode a livello hardware dovrebbo essere solo  5 volt che vanno vuoi ad alimentare eventuale periferica. Host mode vuol dire ( per l'utente medio ) poter attaccare una chiavetta usb di memoria esterna. Andando avanti con il tempo dovrebbe essere un must per ogni piattaforma portatile. In più lo standard usb non è appunto standard? credo che ogni tablet abbia in se per natura l'host mode ( quindi i 5 volt 500 mA ) ma che siano controllati via software.... una specie di limitazione di centrale sulle auto sportive.

Supposizioni le mie, intuizioni corrette o tutte cavolate? :D
« Ultima modifica: 05 Febbraio 2013, 14:38:17 CET da AleoxFalco »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Comunicazione USB con periferica
« Risposta #5 il: 05 Febbraio 2013, 15:14:59 CET »
0
Il problema dell'usb host è stato evidenziato anche nei forum "smanettoni" come xdadeveloper, e cioè che è disponibile solo su alcune versioni di sistemi operativi, non è detto che l'hardware lo supporti (anche se lo sarà sempre di più) e anche quando viene dichiarato dal produttore potrebbe avere dei problemi. Ci possiamo appellare quanto vogliamo al fatto che l'usb è uno standard, ma quando hai il pezzo sul banco e non ti funziona, a parole è dura convincerlo.

Comunque se l'APC è un single board mini computer, sicuramente avrà l'host mode, e capisco anche la relativa facilità di ricompilare il kernel.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Comunicazione USB con periferica
« Risposta #6 il: 05 Febbraio 2013, 15:45:33 CET »
0
Ma l'apc monta API 9 2.3 e dalla documentazione ufficiale sembra che questa modalità sia supportata dall'API 10 in poi. E' curioso, forse è una versione assolutamente custom solo per questa scheda.

Forse è il caso di seguire qualche corso all'università, mi accorgo che in campo android ho grandi difficoltà anche a capire concetti primari alla programmazione stessa.

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Comunicazione USB con periferica
« Risposta #7 il: 05 Febbraio 2013, 16:10:59 CET »
0
girovagando per la rete ho trovato questo

http://code.google.com/p/android-serialport-api/

a quanto pare qui c'è tutta una libreria per poter disporre di qualcosa simile ad una porta com per comunicazione seriale/usb. Forse quello di cui ho bisogno io.

Mi informerò e continuerò a postare gli sviluppi.... se a qualcuno possono/potranno servire ora/in futuro

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Comunicazione USB con periferica
« Risposta #8 il: 05 Febbraio 2013, 17:09:37 CET »
0
Se usi il chip del FTDI esiste la documentazione nel sito ufficiale su come intefacciare i CHIP con Android (molti modelli di Arduino hanno il chip FTDI montato):

FTDI Android

Ti ricordo che Android è open source quindi molto spesso basta dare un occhiata ai sorgenti per capire come si interfaccia API di Android ai driver USB.

Il sistema operativo usato da Android è Linux e la libreria principale usata sotto questo sistema operativo per accedere alle periferiche USB è la libusb, si trova nei sorgenti ufficiali di Android nella directory "external/libusb":

Cross Reference: /external/libusb/

da un programma in C è molto facile programmare questa libreria (in rete esistono molti esempi). Interfacciare una libreria in C a un programma Java basta utilizzare JNI (la liberia deve essere compilata nativamente per la CPU in uso con NDK).
adb logcat | tee /tmp/logcat | grep TAG

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Comunicazione USB con periferica
« Risposta #9 il: 06 Febbraio 2013, 17:33:10 CET »
0
grazie... penso che darò un occhiata alla documentazione ufficiale FTDI, un integrato che comunque avevo già volontà di usare.

Quando avrò concluso qualcosa di funzionante posterò un breve scritto

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Comunicazione USB con periferica
« Risposta #10 il: 08 Febbraio 2013, 17:40:13 CET »
0
aggiorno il topic... magari per qualcuno che passa per sbaglio e legge il topic e ha qualche informazione utile... :D

mi sto studiando la documentazione ufficiale. Siamo passati ufficialmente ad android 4.0 utilizzando direttamente un tablet a 10 pollici. Penso che con questa periferica sia tutto molto più facile, soprattutto perchè posso leggerci sopra le chiavette USB quindi le porte sono host per forza ( nella confezione mi hanno dato anche il cavetto :D )

Offline AleoxFalco

  • Nuovo arrivato
  • *
  • Post: 27
  • Poi ci penso
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    APC 87-50
  • Sistema operativo:
    Windows 7
Re:Comunicazione USB con periferica
« Risposta #11 il: 27 Febbraio 2013, 12:01:31 CET »
0
Allora.... qualche novità.

Con un tablet android 4.0 con porta usb host ho sviluppato un programma parallelo che cerca di gestire la comunicazione usb-seriale. Ho seguito alla lettera l'esempio missile launcher dalla documentazione ufficiale.... che dire un buon lavoro!

Ecco il punto però... lancio il programma e tutto bene. Tranne in questo punto
Codice (Java): [Seleziona]
int ris=mConnection.controlTransfer(0x21, 0x9, 0x200, 0, message, message.length, 0);
Log.e("SEND_COMAND","ris: "+String.valueOf(ris));

Tralasciando che mi è ancora in parte oscuro il significato di parte dei parametri di controlTransfer il risultato è -1.
Mi chiedo il perchè... sbaglio a settare i parametri della funzione oppure perchè non collego da nessuna parte la seriale? penso sia la seconda opzione. Allora che ho fatto, ho collegato la seriale ad una porta di un pc su cui è installato un programma di lettura dati da seriale... non leggo niente. Visto che questa volta la comunicazione è fisicamente collegata penso che il problema sia dovuto al settaggio della porta. A che velocità viaggia? che controlli dovrei mettere? il ragionamento che ho fatto è giusto o sbagliato?

Grazie per il tempo che mi state dedicando :D

Post unito: 28 Febbraio 2013, 17:59:03 CET
ho risolto il problema. Usavo la funzione sbagliata. Non capivo che controlTransfer viene usato per inviare dati di settaggio alla porta usb stessa. Usando bulkTransfer e utilizzando l'endpoint1 per l'output riesco finalmente a trasferire byte singoli via seriale al pc
« Ultima modifica: 28 Febbraio 2013, 17:59:03 CET da AleoxFalco, Reason: Merged DoublePost »