Das senden der Daten von arduino über bluetooth serial
Ich versuche momentan das design eines controller, dass würde die Kommunikation über Bluetooth an ein android-Handy (Galaxy Nexus). Ich bin vor ein paar Herausforderungen. Auch ich habe nicht viel praktische Programmiererfahrung.
Den Kern des Controllers befindet sich ein Arduino-mikrocontroller, die scans der Zustand der 8 digital-pins und sechs analoge pins (10 bit) und sendet die Daten über einen seriellen, einem HC-05 Bluetooth-chip.
Das android-Handy sollten dann Lesen Sie die serielle Informationen gesendet über Bluetooth und entweder übertragen Sie das Paket an ein anderes Telefon - Das wird mich eine Weile zu implementieren, wie ich weiß, sehr wenig, wie das internet funktioniert - oder analysieren Sie und interpretieren Sie für das weitere Vorgehen getroffen werden
Was ich verlange sind die Einsicht, der beste Weg zu gehen über das tun dies. Was nun am besten zu bedeuten???
Wir werden ich möchte es wirklich mal so, wenn ich eine Taste drücken oder eine Kombination von Böden, boom, android-Telefon nimmt die Handlung schnell genug für einen Menschen nicht wahrzunehmen, eine Verzögerung.
Dann möchte ich in der Lage zu assoziieren die Informationen, die das Telefon liest den seriellen Puffer auf die entsprechende Schaltfläche oder Analog-pin. In Fall gibt es einen Fehler oder um zu vermeiden, dass Sie fallen out of sync
Hier ist was ich habe, so weit. Ich habe nicht getestet code noch, teilweise, weil ich bin immer noch lernen, wie die Programmierung der android-Teil dieses Projekts, zum Teil, weil ich möchte etwas feedback, ob ich bescheuert bin oder ist dies tatsächlich eine effektive Weg, dies zu tun:
//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
Ist es sinnlos für mich zu tun, bit-Verschiebungen wie diese? Letztlich, wenn ich mich nicht Irre, werden alle Daten gesendet werden als bytes ( 8 bit-Pakete), so wird die Bluetooth.write(analogRead(pin)+testByte)
tatsächlich senden zwei bytes oder wird es abgeschnitten den int
Daten? wie werden Sie abgebaut und wie kann ich mich erholen, es auf dem android Ende?
Wie würden Sie gehen über die Umsetzung dieser? Irgendwelche Erkenntnisse oder Hinweise?
InformationsquelleAutor Ethienne | 2014-02-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist toll, dass Sie lernen! Einige Vorschläge:
Ihren code leichter zu Lesen, zu verstehen und zu pflegen, wenn Sie Raum, in dem es ein bisschen, besonders durch hinzufügen von Zeilenumbrüchen...
Können Sie auch die shift-Operatoren mit Werten, die andere als eine. also anstatt zu halten eine Verschiebung Maske, die Sie dann hinzufügen, verwenden Sie einfach die eine einfache variable. Eine weitere klassische Art und Weise zu tun, was Sie auszudrücken in der ersten looop wäre so etwas wie dieses:
Die zweite Schleife getan werden könnte, ähnlich:
Beachten Sie, dass die Bluetooth-Funktion.write () - Aufruf sendet ein byte, also dieser code sendet zuerst das höchstwertige byte, dann die Beine.
Schließlich, möchten Sie wahrscheinlich zu null Ihre state-variable am Anfang der loop() -- ansonsten, sobald ein bit gesetzt ist es wird nie gelöscht.
Möchten Sie vielleicht denken über das, was Sie senden, um das Telefon. Es werden binäre Daten, und das kann schwierig sein, zu behandeln-wie Sie wissen, Anfang und Ende, und oft einen Wert misinterpretted als steuerzeichen messing, die Sie bis große Zeit. Überlegen Sie, ob Sie es in einem formatierten, lesbaren string mit einem newline am Ende.
Ich hoffe, das hilft.
Nicht sicher über die Effektivität Problem-ein Anderer Ansatz wäre, zu Kodieren, die Ergebnisse also zumindest ist es druckbaren Zeichen zu vermeiden, die control-code-Probleme. Beachten Sie auch, dass Sie nicht davon ausgehen, dass Bluetooth für die Zeichen, so schnell wie Sie können Sie zu senden. Es wird Puffer die Zeichen und senden Sie Sie, so gut es kann. Je nachdem, wie die Schnittstelle funktioniert (ich habe nicht geschaut), kann es wegwerfen chars kann es nicht senden, oder es wird eine Art von "flow control" - beides kann nicht gut sein für das, was Sie tun möchten.
InformationsquelleAutor bobwki
Den Arduino-Ende das ist mehr als schnell genug, um zu tun, was Sie tun möchten, und Sie brauchen sich keine sorgen, auch nur im geringsten über die Minimierung der Anzahl der bytes, die Sie senden von der Mikro-auf das Telefon, wenn du redest so eine winzige Menge von Daten. Ich bin mir nicht ganz klar, was Sie senden, um das Telefon, werden Sie wollen, einen anderen Wert für jeden button, also wenn eine Taste gedrückt wird sendet er so etwas wie:
Taste Gedrückt Wurde, die Taste Nummer (Zwei bytes)
Und wenn es ein analoger Wert:
Analog-Wert Lesen, analogwert MSB -, Analog-Wert LSB (vorausgesetzt, der analoge Wert, der größer ist als acht bits
Ich weiß nicht, den Arduino-code, die Sie verwenden, aber mein Verdacht ist, dass diese Zeile:
Bluetooth.write(analogRead(pin)+testByte)
Senden würde, der ein byte, das ist die neben der analogen Wert und was auch immer testByte ist.
Würden Sie in der Lage sein einen link zu posten die Dokumentation für diese API?
Jede Verzögerung mit all dies wird kommen auf dem Handy-Ende. Bitte beschäftigen Sie sich nicht im geringsten zu versuchen, zu speichern ein byte oder zwei an das Arduino-Ende! (Ich bin derzeit dabei ein Projekt mit einem Cortex M3 zu senden, Daten über ein Bluetooth-Modul auf Android-Handys, und wir sind Versandkosten werden mehrere k-Daten um. Ich weiß aus dieser Erfahrung den Unterschied zwischen zwei und zwanzig bytes ist nicht von Bedeutung in Bezug auf die Verzögerung.)
InformationsquelleAutor DiBosco
Kann es gut sein, für Sie entscheiden, für Sie bereit zur Verfügung-bluetooth-terminal-apps für Ihr android Handy. Auf Google play, nur wenige apps sind:
1) https://play.google.com/store/apps/details?id=arduino.bluetooth.terminal&hl=de
2) https://play.google.com/store/apps/details?id=com.sena.bterm&hl=de
(und einige mehr sind verfügbar auf Google play).Dies wird helfen, Sie konzentrieren sich nur auf controller-Seite Entwicklung.
InformationsquelleAutor SunGa