Arduino + bil + Android = RC (2 / 5 steg)
Steg 2: Programmera din Arduino UNO
Nu du är redo att gå men du behöver konfigurera din arduino för att utföra trick
I detta fall använt jag en app som kallas Bluetooth commander tillgänglig i google play. Demo skiss finns i kolumnen beskrivning.
En annan app som kallas Android Bluetooth google play är mycket lätt att använda som du kan använda den direkt enda skillnaden är att den förra kan styra hastigheten på bil. Så föredrar jag till den första,
Ladda ner appen och demo skissen
Det ser ut så här
#define VERSION "\n\nAndroTest V2.0 - för V5. X-App (6 knapp version)"
V2.0 ändras till ren ASCII-kommunikationsprotokoll ** inte bakåtkompatibel **
V1.4 förbättrad kommunikation fel hantering
V1.3 nya namn för publicering, postat den 09/05/2014
V1.2 textvisning ** inte bakåtkompatibel **
V1.1 heltal display
V1.0 6 knappar + 4 data char genomfört
Demo-inställning:
Knappen #1 kontroller pin #13 LED
Knapp #4 växla datafield display kurs
Knappen #5 konfigurerad som "push"-knappen (tillfällig)
Andra knapparna Visa demo meddelande
Arduino pin #2 till TX BlueTooth-modul
Arduino pin #3 till RX BlueTooth-modul
Kontrollera din BT styrelse är bps
bättre ta bort SoftSerial för PWM baserat projekt
För Mega 2560:
ta bort #include "SoftwareSerial.h", SoftwareSerial mySerial(2,3);
Sök/Ersätt mySerial >> Serial1
#18 RX bluetooth modul-stifts, pin #19 till TX bluetooth-modul
#include "SoftwareSerial.h"
#define STX 0x02
#define ETX 0x03
#define ledPin 13
#define SLOW 750 / / Datafields uppdateringsfrekvens (ms)
#define snabb 250 / / Datafields uppdateringsfrekvens (ms)
SoftwareSerial mySerial(2,3); BlueTooth-modul: pin #2 = TX pin #3 = RX
byte cmd [8] = {0, 0, 0, 0, 0, 0, 0, 0}; -byte
byte buttonStatus = 0; första Byte skickas till Android-enhet
lång previousMillis = 0; kommer att lagra förra gången knappar status uppdaterades
lång sendInterval = långsam; intervallet mellan knappar status överföring (millisekunder)
String displayStatus = "xxxx"; meddelande till Android-enhet
void setup() {
Serial.BEGIN(57600);
mySerial.begin(57600); 57600 = max värde för softserial
pinMode (ledPin, produktionen);
Serial.println(version);
While(mySerial.available()) mySerial.read(); Tom RX buffert
}
void loop() {
IF(mySerial.available()) {/ / data tas emot från smartphone
Delay(2);
CMD [0] = mySerial.read();
om (cmd [0] == STX) {
int jag = 1;
While(mySerial.available()) {
Delay(1);
CMD [i] = mySerial.read();
om (cmd [i] > 127 || jag > 7) bryta; Kommunikationsfel
IF((CMD[i]==ETX) & & (jag == 2 || jag == 7)) bryta; Knappen eller Joystick data
i ++;
}
om (jag == 2) getButtonState(cmd[1]); 3 bytes ex: < STX "C" ETX >
annat if(i==7) getJoystickState(cmd); 6 byte ex: < STX "200" "180" ETX >
}
}
sendBlueToothData();
}
void sendBlueToothData() {
statiska lång previousMillis = 0;
lång currentMillis = millis();
om (currentMillis - previousMillis > sendInterval) {/ / skicka data tillbaka till smartphone
previousMillis = currentMillis;
Dataramen överförs tillbaka från Arduino till Android-enhet:
< 0X02 knappar ange 0X01 DataField #1 0x04 DataField #2 0x05 DataField #3 0x03 >
< 0X02 "01011" 0X01 "120.00" 0x04 "-4500" 0x05 "motor aktiverat" 0x03 > / / exempel
mySerial.print((char)STX); Start av överföring
mySerial.print(getButtonStatusString()); mySerial.print((char)0x1); knappar status feedback
mySerial.print(GetdataInt1()); mySerial.print((char)0x4); DataField #1
mySerial.print(GetdataFloat2()); mySerial.print((char)0x5); DataField #2
mySerial.print(displayStatus); DataField #3
mySerial.print((char)ETX); Avsluta av överföring
}
}
Sträng getButtonStatusString() {
String bStatus = "";
för (int jag = 0; jag < 6; i ++) {
om (buttonStatus & (B100000 >> jag)) bStatus += "1";
annat bStatus += "0";
}
återvända bStatus;
}
int GetdataInt1() {/ / Data dummy värden skickas till Android-enhet för demo ändamål
statisk int jag = -30; Ersätta med egen kod
i ++;
IF(i >0) jag = -30;
tillbaka i;
}
flyta GetdataFloat2() {/ / Data dummy värden skickas till Android-enhet för demo ändamål
statisk float jag = 50; Ersätta med egen kod
i-=.5;
om (jag < -50) jag = 50;
tillbaka i;
}
void getJoystickState (byte data[8]) {
int joyX = (data [1]-48) * 100 + (data [2]-48) * 10 + (data[3]-48); få Int från ASCII-representation
int joyY = (data [4]-48) * 100 + (data [5]-48) * 10 + (data[6]-48);
joyX = joyX - 200. Offset till undvika
joyY = joyY - 200; överföring av negativa tal
om (joyX < -100 || joyX > 100 || joyY < -100 || joyY > 100) återvända; meddelande fel
Din kod här...
Serial.Print ("Joystick ståndpunkt:");
Serial.Print(joyX);
Serial.Print (",");
Serial.println(joyY);
}
void getButtonState (int bStatus) {
växel (bStatus) {
// ----------------- BUTTON #1 -----------------------
fallet "A":
buttonStatus | = B000001; VIDARE
Serial.println ("\n** Button_1: ON **");
din kod...
displayStatus = "LED";
Serial.println(displayStatus);
digitalWrite (ledPin, hög);
bryta;
fallet "B":
buttonStatus & = B111110; UTANFÖR
Serial.println ("\n** Button_1: OFF **");
din kod...
displayStatus = "LED";
Serial.println(displayStatus);
digitalWrite (ledPin, låg);
bryta;
// ----------------- BUTTON #2 -----------------------
fallet "C":
buttonStatus | = B000010; VIDARE
Serial.println ("\n** Button_2: ON **");
din kod...
displayStatus = "Button2";
Serial.println(displayStatus);
bryta;
fall skulle ":
buttonStatus & = B111101; UTANFÖR
Serial.println ("\n** Button_2: OFF **");
din kod...
displayStatus = "Button2";
Serial.println(displayStatus);
bryta;
// ----------------- BUTTON #3 -----------------------
fallet "E":
buttonStatus | = B000100; VIDARE
Serial.println ("\n** Button_3: ON **");
din kod...
displayStatus = "Motor #1 aktiverad"; Demo textmeddelande
Serial.println(displayStatus);
bryta;
fallet "F":
buttonStatus & = B111011; UTANFÖR
Serial.println ("\n** Button_3: OFF **");
din kod...
displayStatus = "Motor #1 slutade";
Serial.println(displayStatus);
bryta;
// ----------------- BUTTON #4 -----------------------
fallet "G":
buttonStatus | = B001000; VIDARE
Serial.println ("\n** Button_4: ON **");
din kod...
displayStatus = "Datafield uppdatera";
Serial.println(displayStatus);
sendInterval = snabb;
bryta;
fallet "H":
buttonStatus & = B110111; UTANFÖR
Serial.println ("\n** Button_4: OFF **");
din kod...
displayStatus = "Datafield uppdatera";
Serial.println(displayStatus);
sendInterval = långsam;
bryta;
// ----------------- BUTTON #5 -----------------------
fallet "I": / / konfigurerad som momentan knapp
buttonStatus | = B010000; VIDARE
Serial.println ("\n** Button_5: ++ sköt ++ **");
din kod...
displayStatus = "Button5:
";
bryta;
fallet "J":
buttonStatus & = B101111; UTANFÖR
/ / din kod...
bryta;
// ----------------- BUTTON #6 -----------------------
fallet "K":
buttonStatus | = B100000; VIDARE
Serial.println ("\n** Button_6: ON **");
din kod...
displayStatus = "Button6"; Demo textmeddelande
bryta;
fallet "L":
buttonStatus & = B011111; UTANFÖR
Serial.println ("\n** Button_6: OFF **");
din kod...
displayStatus = "Button6";
bryta;
}
// ---------------------------------------------------------------
}