OTG – Conectando o Android com o Arduino


OTG- Conectando Arduino com Android

A conexão de dispositivos Android com um Arduino pode ser implementada de diferentes maneiras. Hoje vamos conhecer uma maneira de conexão através de fios, ligando diretamente o celular ou tablet Android com um Arduino. Usaremos para esta conexão o cabo conversor OTG (USB On The Go), encontrado com facilidade nas lojas do ramo.

   Um pequeno comentário acerca deste cabo. Uma passeada pelas lojas de um shopping em Campinas/SP revelou preços de R$ 86,20, R$ 35,00, R$ 29,00 e R$ 5,00 para diferentes cabos com a mesma funcionalidade (OTG). O de R$5,00 foi utilizado em todos os testes realizados aqui e funcionou muito bem. Atenção para não gastar dinheiro atoa :-)

Nossos experimentos foram realizados em um celular ASUS Z00AD, Android versão 5.0. O Arduino foi um Arduino UNO.

O que é um cabo OTG?

Fisicamente é um cabo com um conector USB fêmea de um lado e um conector micro usb de outro. Seu objetivo é permitir que dispositivos USB que operam normalmente como periféricos possam operar como hospedeiro. Por exemplo, quando você conecta um PC (hospedeiro) a um celular, este último está na posição de periférico. Uma impressora ligada a um PC também está na situação de periférico. Muitas vezes este cabo vem na forma de um acoplador, conforme mostrado na figura a seguir:

Acoplador OTG

Acoplador OTG

Com um cabo OTG, um celular pode assumir o papel de hospedeiro, e então controlar um Arduino, uma impressora, um “pen drive”, etc..

Um cabo USB comum contem 4 fios, correspondentes aos sinais de 5V, terra, D+ e D- (dados). Um conector micro USB possui cinco pinos. Este pino adicional é interligado ao terra nos conversores OTG. Esta é a única diferença.

Todos os celulares podem usar o cabo OTG?

Não. É necessário que o hardware seja capaz de identificar a ligação do pino à terra e com isto se reconfigurar para atuar como hospedeiro. E é necessário que o software do dispositivo seja capaz de operar as funções comuns do hospedeiro. Se você já tem o cabo OTG é muito simples testar a capacidade do seu celular. Ligue o cabo OTG no conector micro usb do celular e no outro lado ligue um pendrive com arquivos conhecidos. O gerenciador de arquivos do celular deve ser capaz de ler estes arquivos. Se não ler, provavelmente o seu celular não está preparado para o uso como host.

Lembre-se de desmontar o pendrive antes de retirá-lo do conector. Para isto acesse o menu configurações/armazenamento e procure pelo item desmontar usb.

Uma forma mais completa, que analisa se o seu celular implementa a API completa do OTG, é utilizar a app USB OTG Checker , disponível na Play Store. O aplicativo te informa se o celular reconhece o cabo OTG e qual a versão da API que o mesmo é capaz de executar.

Como fica o aspecto de consumo de energia com o OTG?

Na comunicação USB, o hospedeiro é quem se encarrega de alimentar o periférico. Portanto, o mesmo conector utilizado na carga do celular passa a ser a fonte de alimentação do periférico, o que ocasiona uma descarga mais acentuada da bateria do celular comparada com a operação convencional. Observe que no modo OTG não dá para carregar o celular através do cabo USB!

Uma solução para diminuir o impacto da nova carga sobre a bateria do celular é o uso de um HUB USB ativo, ou seja, HUBs que são eles alimentados por fonte externa. É esta fonte que alimenta todos os periféricos controlados pelo HUB, liberando o hospedeiro desta função.

Um emulador de terminais no Android

A forma mais rápida de controlarmos um Arduino a partir de um Android é utilizando um emulador de terminais. Desta forma podemos enviar comandos para o Arduino e também podemos mostrar na tela os caracteres enviados pelo mesmo.

Existem muitos emuladores de terminal. Utilizamos neste experimento o Serial USB Terminal , de Kai Morich, disponível no Google Play. A instalação é feita da forma convencional, simplesmente acionando-se o botão instalar, após pesquisar por serial terminal na loja de aplicativos.

Para realizar os testes a seguir assegure-se de que você configurou o terminal para 9600, 8, N, 1. Para isto acesse o menu settings a ajuste os valores correspondentemente.

Configurando o Serial USB Terminal

Configurando o Serial USB Terminal

Teste de uma ligação Arduino UNO com o Android Asus Z00AD (Android 5.0)

  • Conexão física: Conecte o cabo OTG ao celular. Ligue um cabo USB padrão no conector fêmea do cabo OTG. O outro lado ligue ao Arduino.
  • Carregue o programa a seguir para o Arduino. Este programa implementa um medidor de temperatura utilizando um termistor, que já foi descrito anteriormente.
/*
 * tempNTC5.ino
 */

 
#include  "Arduino.h"

//includes

 
//defines

#define LED_PLACA    13   
#define SEL_MODE     12  
#define ENTRADA_TERMISTOR  0


#define LIGA_LED_PLACA   digitalWrite (LED_PLACA, HIGH);
#define DESLIGA_LED_PLACA    digitalWrite (LED_PLACA, LOW); 

#define MAX_LEN_ENTRADA     32  
#define MAX_LEN_SAIDA       32  
#define NUMERO_MAXIMO_FUNCOES    4

//variaveis globais
char cDuracao;     
char cPiscadas;  

char chBufferSaida[MAX_LEN_SAIDA];   
char flagMsg;             

char chModo;  

char cIntervalo;  

char cComando; 

int nUltimoValorLido;  
char nFlagLido; 


char chLido;  
char chParam[4]; 
char chCmd[4];    
char chPDU[MAX_LEN_ENTRADA];   
int cIndexEscrita;  


void (*func[NUMERO_MAXIMO_FUNCOES])();


 
void setup()
{

pinMode ( LED_PLACA,OUTPUT); 

pinMode(SEL_MODE,INPUT_PULLUP);


Serial.begin(9600, SERIAL_8N1); 


cDuracao= 10;    
cPiscadas= 6; 

strcpy(chBufferSaida,"$0,tempNTC v 1.0");
flagMsg=1;


cIntervalo= 10;


cComando= 0xFF;


func[0]= reID;
func[1]= leValorTemperatura;
func[2]= configuraIntervalo;


}
 
void  loop()
{
checkTimer();
decodificaCmd();
}


void checkTimer()
{
unsigned long tempoAtual;  
static  unsigned long tempoAnterior100ms;
 
tempoAtual= millis();   
 
if((tempoAtual - tempoAnterior100ms) >= 100L)
    {
    tempoAnterior100ms= tempoAtual;
    loop100();
    }

}
 


void loop100(void)
{
acionaLed();	
enviaMsg();	
leModo();	
selecionaCmd();
converteGraus();
}	



void acionaLed()
{
static char cEstadoLed;
static char cIntervaloAtual;

if (cPiscadas >= 0 )
	{
	if (cIntervaloAtual <= 0) { cIntervaloAtual = cDuracao; -- cPiscadas; cEstadoLed= !cEstadoLed; } if (cEstadoLed == 0) { LIGA_LED_PLACA } else { DESLIGA_LED_PLACA } -- cIntervaloAtual; } } void enviaMsg() { if (flagMsg==1) { LIGA_LED_PLACA strcat(chBufferSaida,"\n"); Serial.print(chBufferSaida); flagMsg=0; DESLIGA_LED_PLACA } } void leModo() { chModo= (char) digitalRead(SEL_MODE); } void selecionaCmd() { static char cTickAD; if (chModo == 1) { if (cTickAD == 0) { cTickAD= cIntervalo; conversorAD(); } else --cTickAD; } else { if (cComando == '1') { conversorAD(); cComando= 0xFF; } } } void conversorAD() { nUltimoValorLido= analogRead(ENTRADA_TERMISTOR); nFlagLido= 1; } void converteGraus() { double fValue; double fTemp; char strSaida[16]; if (nFlagLido == 1) { nFlagLido = 0; fValue= (float)nUltimoValorLido * 0.00488; fTemp= fValue * 27.776 - 38.247; dtostrf(fTemp, 3, 2, strSaida); strcpy(chBufferSaida,"$1,"); strcat(chBufferSaida,strSaida); flagMsg=1; } } void decodificaCmd() { chLido= Serial.read(); if(chLido != -1) { if(chLido != 0x0d) { chPDU[cIndexEscrita]= chLido; if(chLido == 0x0A) { chPDU[cIndexEscrita]=0; processaCmd(); cIndexEscrita=0; } else { ++cIndexEscrita; cIndexEscrita &= (MAX_LEN_ENTRADA -1); } } } } void processaCmd() { int nCmd; strcpy(chCmd,strtok(chPDU,",")); nCmd= atoi(chCmd); strcpy(chParam,strtok(NULL,",")); if(nCmd > (NUMERO_MAXIMO_FUNCOES-1) ||  nCmd < 0)
  {
  strcpy(chBufferSaida,"$255,Comando inexistente");
  flagMsg=1;
  }	  
else 
  (*func[nCmd])(); 
  
}	
	
	
void reID()
{
strcpy(chBufferSaida,"$0,tempNTC v 1.0");
flagMsg=1;
}
	


void leValorTemperatura()
{
cComando= '1';	
	
}



void configuraIntervalo()
{
cIntervalo= (char) atoi (chParam);
}
	

void configuraModo()
{
chModo= (char) atoi (chParam);	
	
}

Conectando o terminal com o Arduino

Abra o aplicativo do terminal. Envie os comando “0” (zero) e “1” Veja as respostas que aparecem na tela.

Controlando o arduino com o androidControlando o arduino com o android

Se você preferir, pode obter o programa (comentado) diretamente na página de downloads do caderno, http://wp.me/P6gfIl-BF , no arquivo de nome pack170816.tar.gz.

Até nosso próximo encontro!

Deixe um comentário