Pessoal,
Segue mais um interessante dispositivo que pode ser utilizado em projetos com o Arduino. Com esta placa podemos comunicar o Arduino com smartphones (Android, Iphone, HTC) tornando ainda mais vastas as possibilidades de ligação entre esses dois aparelhos.
Modem para utilizar a conexão de áudio entre um smartphone (Iphone e Android) e o Arduino.
Existem várias formas de fazer o Arduino se comunicar com seu Smartphone Android ou seu Iphone, como bluetooth, wifi, outros. Porem uma forma muito mais simples de fazer isso é através da entrada de áudio.
Telefone de diferentes empresas possuem pinagens de áudio diferentes como por exemplo o Samsung Galaxy e o Iphone, esta placa possui um switch para se tornar compatível com diferentes modelos como Samsung, Apple, HTC.

Devido ao software utilizar um conexão de áudio para comunicação, alguns dados corrompidos podem aparecer de tempos em tempos, é recomendado que leve este fato em consideração durante a codificação de seu software, verifique como evitar isso na biblioteca do Arduino e no exemplo descrito mais abaixo.
O Arduino Softmodem pode ser utilizado em vários projetos, conforme será mostrado logo abaixo.
O Arduino Softmodem pode ser utilizado em vários projetos, conforme será mostrado logo abaixo.
Como funciona:
Basicamente, o controle remoto funciona da seguinte forma, o acionamento de um botão irá dispara um gatilho e o microcontrolador na placa irá codificar o comando em formato binário, em seguida controlar o LED para que pisque em uma determinada frequência.
Basicamente, o controle remoto funciona da seguinte forma, o acionamento de um botão irá dispara um gatilho e o microcontrolador na placa irá codificar o comando em formato binário, em seguida controlar o LED para que pisque em uma determinada frequência.
A estrutura será a mesma, se quisermos fazê-lo para smartphones, o aparelho deve ser capaz de codificar um comando e controlar o LED, como não há acesso direto a partir do telefone para o LED, precisaremos de um microcontrolador para ouvir a entrada do smartphone, e piscar o LED de acordo.
A fim de ser compatível com quase todos os smartphones, incluindo iPhone e Android, escolhemos a entrada de áudio como a interface entre o telefone e o microcontrolador, isto significa que será usada o sinal de áudio para representar o comando, que será decodificado pelo softmodem e lido pelo microcontrolador.
Para este exemplo utilizaremos os seguintes componenetes:
Arduino Uno x 1 (como o microcontrolador)
Soft modem x 1
IR LED x 1
Arduino breadboard shield x 1(somente para uma prototipação mais limpa)
Arduino Uno x 1 (como o microcontrolador)
Soft modem x 1
IR LED x 1
Arduino breadboard shield x 1(somente para uma prototipação mais limpa)
Fio para Headphone x 1
Configurando o Hardware:
A configuração do hardware é bem simples, conecte o softmodem aos pinos do Arduino e conecte o breadboard shield logo em cima, depois conecte o IR LED no pino 3 do Arduino UNO (PWM). Finalmente conecte o softmodem e o iphone através do cabo de audio.
Codificando o Arduino:
O Arduino UNO deverá cuidar para que o Led pisque quando acionado e também escutar aos comandos do softmodem. Quando lidamos com a entrada do softmodem, o código do comando enviado por ele pode ter o tamanho de vários bytes, assim devemos utilizar um buffer de entrada para receber o comando completo. Utilizaremos 3 bibliotecas em nosso código, Controle IR (IRremote), Softmodem e buffer (ByteBuffer).
Na configuração devemos inicializar o softmodem e o buffer.
void setup()
{
Serial.begin(9600);
// Initialize the buffer with a capacity for 4 bytes
buffer.init(4);
delay(1000);
modem.begin();
}
Na função de Loop o Arduino ficará escutando o softmodem. Emquanto o modem estiver livre, receberemos 2 Bytes do softmodem. Devemos checar se devemos limpar o buffer. Se não, colocaremos os 2 Bytes no buffer. É assim que recebemos o comando do modem, após areceber o comendo, simplesmente usamos a função IRsend para enviar o comando para o IR LED através do protocolo NEC.
void loop() {
while(modem.available()){
int c = modem.read();
if((buffer.getSize() == 4 || buffer.getSize() == 0) && c == 0xFF) {
buffer.clear();
} else {
buffer.put(c);
}
}
if(buffer.getSize() == 4) {
long cmd = buffer.getLong();
Serial.print("Sending cmd: ");
Serial.println(cmd, HEX);
irsend.sendNEC(cmd, 32); // NEC Protocol command
delay(100);
}
O Arduino UNO deverá cuidar para que o Led pisque quando acionado e também escutar aos comandos do softmodem. Quando lidamos com a entrada do softmodem, o código do comando enviado por ele pode ter o tamanho de vários bytes, assim devemos utilizar um buffer de entrada para receber o comando completo. Utilizaremos 3 bibliotecas em nosso código, Controle IR (IRremote), Softmodem e buffer (ByteBuffer).
Na configuração devemos inicializar o softmodem e o buffer.
void setup()
{
Serial.begin(9600);
// Initialize the buffer with a capacity for 4 bytes
buffer.init(4);
delay(1000);
modem.begin();
}
Na função de Loop o Arduino ficará escutando o softmodem. Emquanto o modem estiver livre, receberemos 2 Bytes do softmodem. Devemos checar se devemos limpar o buffer. Se não, colocaremos os 2 Bytes no buffer. É assim que recebemos o comando do modem, após areceber o comendo, simplesmente usamos a função IRsend para enviar o comando para o IR LED através do protocolo NEC.
void loop() {
while(modem.available()){
int c = modem.read();
if((buffer.getSize() == 4 || buffer.getSize() == 0) && c == 0xFF) {
buffer.clear();
} else {
buffer.put(c);
}
}
if(buffer.getSize() == 4) {
long cmd = buffer.getLong();
Serial.print("Sending cmd: ");
Serial.println(cmd, HEX);
irsend.sendNEC(cmd, 32); // NEC Protocol command
delay(100);
}
Há uma questão que encontramos quando nós rodamos o código. Ambos irRemote e biblioteca SoftModem estão usando timer2, por isso tivemos de descomentar a linha 61 na biblioteca IRremoteInt.h para resolver o conflito.
App IOS:
Esta demonstração é bem simples, temos dois botões na tela e cada botão representa um comando. Temos também uma info view onde é possível alterar os comandos para cada botão. Usaremos um gerados serial para codificar o comando de áudio, sinal este que será recebido pelo modem.
- (void)buttonPressed:(UIButton*)button {
NSString* buttonKey = (button.tag == 1) ? @"first" : @"second";
NSString* hex = [[NSUserDefaults standardUserDefaults] stringForKey:buttonKey];
hex = [hex substringFromIndex:2];
NSData* hexData = [hex hexToBytes];
//NSLog(@"%@", hex);
//NSLog(@"%@", [hex hexToBytes]);
[APP_DELEGATE.generator writeByte:0xff];
[APP_DELEGATE.generator writeBytes:[hexData bytes] length:hexData.length];
}
Exemplos:
Seguem alguns exemplos que utilizam a porta de áudio para comunicação, como o leitor de cartão de crédito móvel.
Bibliotecas: