Stap 10: Software
Het programma is geschreven in de Arduino IDE 1.01.
#include "EEPROM.h"
#define D1 2 / / motor draairichting 1
#define M1 3 / / PWM links motor
#define D2 4 / / motor draairichting 2
#define M2 5 / / PWM rechts motor
#define hoorn 13 / / extra kanaal 1
#define autoOFF 2500 / / milliseconden waarna de robot wanneer stopt de verbinding
#define cmdL "L" / / UART-opdracht voor de linker motor
#define cmdR 'R' / / UART-opdracht voor de juiste motor
#define MAfestival 'H' / / UART-opdracht voor extra kanaal (bijvoorbeeld hoorn)
#define cmdF 'F' / / UART-opdracht voor EEPROM werking
#define cmdr 'r' / / UART-opdracht voor de werking van de EEPROM (lezen)
#define cmdw "w" / / UART-opdracht voor EEPROM bediening (schrijven)
char incomingByte; binnenkomende gegevens
char L_Data [4]; matrix gegevens voor linker motor
byte L_index = 0; index van matrix L
char R_Data [4]; matrix gegevens voor juiste motor
byte R_index = 0; index van de matrix R
char H_Data [1]; matrix gegevens voor extra kanaal
byte H_index = 0; index van matrix H
char F_Data [8]; matrix gegevens voor EEPROM
byte F_index = 0; index van matrix F
char opdracht; opdracht
unsigned long currentTime, lastTimeCommand, autoOFF;
VOID Setup {}
Serial.begin(9600); initialisatie UART
pinMode (Hoorn, uitvoer); extra kanaal
pinMode (D1, uitvoer); uitgang voor motor rotatie
pinMode (D2, uitvoer); uitgang voor motor rotatie
/ * EEPROM.write(0,255);
EEPROM.write(1,255);
EEPROM.write(2,255);
EEPROM.write(3,255); * /
timer_init(); Initialisatie software timer
}
ongeldig timer_init() {}
uint8_t sw_autoOFF = EEPROM.read(0); lezen van de EEPROM "is geactiveerd of als de auto niet te stoppen wanneer de verbinding te verliezen"
Als (sw_autoOFF == '1') {/ / als geactiveerd
char var_Data [3];
var_Data [0] = EEPROM.read(1);
var_Data [1] = EEPROM.read(2);
var_Data [2] = EEPROM.read(3);
autoOFF = atoi (var_Data) * 100; variabele autoOFF ms
}
else if (sw_autoOFF == '0') {}
autoOFF = 999999;
}
anders if(sw_autoOFF == 255) {}
autoOFF = 2500; Indien de EEPROM leeg is, is dafault waarde 2,5 sec
}
currentTime = millis(); Lees de tijd die is verstreken sinds het begin van de toepassing
}
void loop {}
Als (Serial.available() > 0) {/ / als ontvangen van de UART-gegevens
incomingByte = Serial.read(); Raed byte
if(incomingByte == cmdL) {/ / als ontvangen gegevens voor linker motor L
opdracht = cmdL; huidige opdracht
memset(L_Data,0,sizeof(L_Data)); Schakel matrix
L_index = 0; resetten van de matrixindex
}
anders if(incomingByte == cmdR) {/ / als ontvangen gegevens voor linker motor R
opdracht = cmdR;
memset(R_Data,0,sizeof(R_Data));
R_index = 0;
}
anders if(incomingByte == cmdH) {/ / als ontvangen gegevens voor extra kanaal
opdracht = MAfestival;
memset(H_Data,0,sizeof(H_Data));
H_index = 0;
}
anders if(incomingByte == cmdF) {/ / als ontvangen gegevens voor EEPROM op
opdracht = cmdF;
memset(F_Data,0,sizeof(F_Data));
F_index = 0;
}
else if (incomingByte == '\r') command = "e"; einde van regel
else if (incomingByte == "\t") opdracht = 't'; einde lijn voor EEPROM op
Als (opdracht == cmdL & & incomingByte! = cmdL) {}
L_Data [L_index] = incomingByte; elke byte worden opgeslagen in de array
L_index ++; Increment matrixindex
}
anders als (opdracht == cmdR & & incomingByte! = cmdR) {}
R_Data [R_index] = incomingByte;
R_index ++;
}
anders als (opdracht == MAfestival & & incomingByte! = MAfestival) {}
H_Data [H_index] = incomingByte;
H_index ++;
}
anders als (opdracht == cmdF & & incomingByte! = cmdF) {}
F_Data [F_index] = incomingByte;
F_index ++;
}
anders als (opdracht == "e") {/ / als we het lijneinde nemen
Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));
delay(10);
}
anders als (opdracht == 't') {/ / als we de EEPROM lijneinde nemen
Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);
}
lastTimeCommand = millis(); Lees de tijd die is verstreken sinds het begin van de toepassing
}
if(Millis() > = (lastTimeCommand + autoOFF)) {/ / vergelijken van de huidige timer met variabele lastTimeCommand + autoOFF
Control4WD(0,0,0); stoppen met de auto
}
}
VOID Control4WD (int mLeft, int mRight, uint8_t hoorn) {}
BOOL directionL, directionR; motor draairichting L298N
byte valueL, taxateur; PWM M1, M2 (0-255)
Als (mLeft > 0) {}
valueL = mLeft;
directionL = 0;
}
else if (mLeft < 0) {}
valueL = 255 - abs(mLeft);
directionL = 1;
}
else {}
directionL = 0;
valueL = 0;
}
Als (mRight > 0) {}
Taxateur = mRight;
directionR = 0;
}
else if (mRight < 0) {}
Taxateur = 255 - abs(mRight);
directionR = 1;
}
else {}
directionR = 0;
Taxateur = 0;
}
analogWrite (M1, valueL); snelheid voor linker motor instellen
analogWrite (M2, taxateur); snelheid voor juiste motor instellen
digitalWrite (D1, directionL); instellen van de linker motor draairichting
digitalWrite (D2, directionR); instellen van rechts motor draairichting
digitalWrite (Hoorn, hoorn); extra kanaal
}
VOID Flash_Op (char FCMD, uint8_t z1, z2 uint8_t, uint8_t z3, z4 uint8_t) {}
if(FCMD == Cmdr) {/ / als EEPROM gegevens opdracht gelezen
Serial.Print("FData:"); EEPROM gegevens verzenden
Serial.write(EEPROM.Read(0)); waarde van het geheugen met 0 adres leest en op UART afdrukken
Serial.write(EEPROM.Read(1));
Serial.write(EEPROM.Read(2));
Serial.write(EEPROM.Read(3));
Serial.Print("\r\n"); het einde markeren van de transmissie van data EEPROM
}
anders if(FCMD == cmdw) {/ / als EEPROM gegevens opdracht schrijven
EEPROM.write(0,z1); Z1 record aan een geheugen met 0 adres
EEPROM.write(1,z2);
EEPROM.write(2,z3);
EEPROM.write(3,z4);
timer_init(); initialiseren van de timer
Serial.Print("FWOK\r\n"); Stuur een bericht dat de gegevens met succes aan EEPROM geschreven
}
De code maakt gebruik van een bibliotheek om te werken met EEPROM AVR-geheugen. Arduino bord door USART van de Bluetooth-module ontvangt gegevens klaar voor de linker- en motor. Alle eenvoudige berekeningen worden uitgevoerd in de Android applicatie.
De structuur van het project in Eclipse u kunt zien op de screenshot hierboven.
U kunt de broncode voor de Arduino en het project voor verduistering
Downloaden APK toepassing voor Android-apparaat
De nieuwste versie van de software vindt u op deze pagina Video demonstratie de virtueel stuurwiel-modus (versie 1.2 en hoger):
PS Sorry voor mijn slechte Engels