Carrinho i-racer II
Como o carrinho é comandado pelo bluetooth, o jeito mais óbvio de hackeá-lo é substituir o software de controle do carrinho, que roda no Android, por algum outro. Para isso, é necessário descobrir os comandos que o software envia ao carrinho, de maneira a podermos comandá-lo a partir de outros dispositivos.
Existe um documento que descreve esses comandos, mas para testar fiz um "pograminha" para rodar no Arduino e ler os comandos.
Taí o bicho:
#include <SoftwareSerial.h>
SoftwareSerial irace(10, 11); // RX, TX
int BluetoothData;
void setup()
{
Serial.begin(9600);
irace.begin(9600);
Serial.println("Fim Setup");
}
int i=1;
void loop()
{
if (irace.available())
{
BluetoothData=irace.read();
Serial.print(BluetoothData,HEX);
Serial.print(',');
if((i % 20) == 0)
Serial.println();
i++;
}
}
Essa é a tela do software, com a definição do de cada botão de comando.
Em seguida foi só parear o bluetooth do Arduino com o do celular, pilotar o aplicativo e fazer as leituras. Eis alguns exemplos, prá gente entender a bagaça:
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,71,71,71,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,31,31,31,
32,22,22,22,23,23,24,25,25,26,27,27,28,28,29,29,2A,2B,2B,2B,
2C,2C,2C,2C,2D,2D,2D,2D,2D,2D,2D,2D,2D,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2F,2F,2F,2F,2F,2F,2F,2F,20,2F,3F,3F,3F,3F,3F,
3F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,3F,3F,3F,3F,3F,3F,3F,3F,
3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,2F,2F,2F,2F,2F,2F,20,
2F,2F,2E,2C,2B,29,28,27,26,84,83,81,41,62,63,64,65,16,16,17,
17,17,18,18,19,19,1A,1B,1B,1B,1C,1C,1C,1C,1D,1D,1D,1E,1E,1F,
1F,10,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,0,
Quando não pressionamos nada no controle, nenhum dado é enviado. Quando eu toco o centro da Virtual Control Bar ele manda o comando 0. Depois, eu vou variando as direções, o que vc pode perceber pelo primeiro dígito dos número hexa acima. Primeiro eu acionei o carrinho para trás (primeiro dígito 2), depois para a frente (dígito 1). O segundo dígito é a intensidade, que vc vê que vai variando de intensidade à medida que eu desloco o dedo, indo de 2 até F no caso do movimento para trás.
Então é isso, bastaria então fazer um programa que envie esses comandos ao carrinho para que ele possa se movimentar. Moleza, não?
Aqui uma imagem do circuito do Arduino:
Existe um documento que descreve esses comandos, mas para testar fiz um "pograminha" para rodar no Arduino e ler os comandos.
Taí o bicho:
#include <SoftwareSerial.h>
SoftwareSerial irace(10, 11); // RX, TX
int BluetoothData;
void setup()
{
Serial.begin(9600);
irace.begin(9600);
Serial.println("Fim Setup");
}
int i=1;
void loop()
{
if (irace.available())
{
BluetoothData=irace.read();
Serial.print(BluetoothData,HEX);
Serial.print(',');
if((i % 20) == 0)
Serial.println();
i++;
}
}
Essa é a tela do software, com a definição do de cada botão de comando.
Em seguida foi só parear o bluetooth do Arduino com o do celular, pilotar o aplicativo e fazer as leituras. Eis alguns exemplos, prá gente entender a bagaça:
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,71,71,71,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,31,31,31,
32,22,22,22,23,23,24,25,25,26,27,27,28,28,29,29,2A,2B,2B,2B,
2C,2C,2C,2C,2D,2D,2D,2D,2D,2D,2D,2D,2D,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,2E,
2E,2E,2E,2E,2E,2F,2F,2F,2F,2F,2F,2F,2F,20,2F,3F,3F,3F,3F,3F,
3F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,
2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,2F,3F,3F,3F,3F,3F,3F,3F,3F,
3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,3F,2F,2F,2F,2F,2F,2F,20,
2F,2F,2E,2C,2B,29,28,27,26,84,83,81,41,62,63,64,65,16,16,17,
17,17,18,18,19,19,1A,1B,1B,1B,1C,1C,1C,1C,1D,1D,1D,1E,1E,1F,
1F,10,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,
1F,1F,1F,1F,1F,1F,1F,0,
Quando não pressionamos nada no controle, nenhum dado é enviado. Quando eu toco o centro da Virtual Control Bar ele manda o comando 0. Depois, eu vou variando as direções, o que vc pode perceber pelo primeiro dígito dos número hexa acima. Primeiro eu acionei o carrinho para trás (primeiro dígito 2), depois para a frente (dígito 1). O segundo dígito é a intensidade, que vc vê que vai variando de intensidade à medida que eu desloco o dedo, indo de 2 até F no caso do movimento para trás.
Então é isso, bastaria então fazer um programa que envie esses comandos ao carrinho para que ele possa se movimentar. Moleza, não?
Aqui uma imagem do circuito do Arduino:
Comentários
Postar um comentário