В настоящее время я пытаюсь разработать контроллер, который мог бы связываться через Bluetooth с телефоном Android (Galaxy Nexus). Я столкнулся с несколькими проблемами. Кроме того, у меня нет большого практического опыта программирования.
В основе контроллера находится микроконтроллер Arduino, который сканирует состояние 8 цифровых контактов и шести аналоговых контактов (10 бит) и отправляет данные через последовательный порт на микросхему Bluetooth HC-05. Затем телефон Android должен прочитать последовательную информацию, отправленную через Bluetooth, и либо передать пакет на другой телефон - это займет у меня некоторое время, чтобы реализовать, поскольку я очень мало знаю, как работает Интернет, - либо проанализировать и интерпретировать ее для дальнейших действий. взятый
Я прошу понять, как лучше всего это сделать. Что значит «лучше всего»? Мы хотим, чтобы это происходило в режиме реального времени, чтобы, когда я нажимаю кнопку или комбинацию нижних частей, бум, телефон Android начинает действовать достаточно быстро, чтобы человек не заметил задержки.
Затем я хочу связать информацию, которую телефон считывает в последовательном буфере, с соответствующей кнопкой или аналоговым контактом. В случае ошибки или во избежание рассинхронизации
Вот что у меня есть на данный момент. Я еще не тестировал этот код, отчасти потому, что я все еще учусь программировать часть этого проекта для Android, отчасти потому, что мне нужна обратная связь о том, веду ли я себя глупо или это действительно эффективный способ сделать это:
//Initialization
/*
This Program has three functions:
1) Scan 8 digital pins and compile their state in a single byte ( 8 bits)
2) Scans 6 Analogue inputs corresponding to the joysticks and triggers
3) Send this info as packets through seril --> Bluetooth
*/
#include <SoftwareSerial.h>// import the serial software library
#define A = 2
#define B = 3
#define X = 4
#define Y = 5
#define LB = 6
#define RB = 7
#define LJ = 8
#define RJ = 9
#define RX = 10
#define TX = 11
//Pin 12 and 13 are unused for now
SoftwareSerial Bluetooth(RX,TX); //Setup software serial using the defined constants
// declare other variables
byte state = B00000000
void setup() {
//Setup code here, to run once:
//Setup all digital pin inputs
pinMode(A,INPUT);
pinMode(B,INPUT);
pinMode(X,INPUT);
pinMode(Y,INPUT);
pinMode(LB,INPUT);
pinMode(RB,INPUT);
pinMode(LJ,INPUT);
pinMode(RJ,INPUT);
//Setup all analogue pin inputs
//setup serial bus and send validation message
Bluetooth.begin(9600);
Bluetooth.println("The controller has successfuly connected to the phone")
}
void loop() {
//Main code here, to run repeatedly:
//Loop to sum digital inputs in a byte, left shift the byte every time by 1 and add that if the pin is high
for(byte pin = 2, b = B00000001; pin < 10; pin++, b = b << 1){ if (digitalRead(pin)== HIGH) state += b; }
//Send digital state byte to serial
Bluetooth.write(state);
//Loop to read analgue pin 0 to 5 and send it to serial
for( int pin = 0, testByte = 0x8000; pin < 6 ; pin++, testByte = testByte >> 1) { Bluetooth.write(analogRead(pin)+testByte); }
}
//Adding some validation would be wise. How would I go about doing that?
// Could add a binary value of 1000_0000_0000_0000, 0100_0000_0000_0000, 0010_0000_0000_0000 ... so on and then use a simple AND statement at the other end to veryfy what analogue reading the info came from
// so say the value for analgue is 1023 and came from analgue pin 1 I would have 0100_0011_1111_1111 now using an bitwise && I could check it against 0100_0000_0000_0000 if the result is 0100_0000_0000_0000 then I know this is the analogu reading from pin 1
//could easily implement a test loop with a shiting bit on the android side
Разве для меня бессмысленно делать такие битовые смены? В конечном итоге, если я не ошибаюсь, все данные отправляются в байтах (8-битные пакеты), поэтому Bluetooth.write(analogRead(pin)+testByte)
действительно отправит два байта или будет усекать int
данные? как он будет сломан и как его восстановить на стороне андроида?
Как бы вы это реализовали? Есть идеи или советы?