Paso 10: Software
El programa fue escrito en Arduino IDE 1.01.
#include "EEPROM.h"
#define D1 2 / / dirección de rotación del motor 1
#define M1 3 / PWM izquierda motor
#define D2 4 / / dirección de rotación del motor 2
#define M2 5 / PWM derecha motor
#define cuerno 13 / / adicional canal 1
#define autoOFF 2500 / / milisegundos después de que el robot detiene cuando la conexión
#define cmdL 'L' / / UART-comando para motor izquierdo
#define cmdR 'R' / / UART-comando para motor adecuado
#define cmdH 'H' / / UART-comando de canal adicional (por ejemplo cuerno)
#define cmdF 'F' / / UART-comando para el funcionamiento de EEPROM
#define cmdr 'r' / / UART-comando para el funcionamiento de EEPROM (leer)
#define cmdw 'w' / / UART-comando para el funcionamiento de EEPROM (escritura)
char incomingByte; datos de entrada
char L_Data [4]; datos de la matriz para el motor izquierdo
byte L_index = 0; Índice de la matriz L
char R_Data [4]; datos de la matriz para el motor derecho
byte R_index = 0; Índice de la matriz R
char H_Data [1]; datos de la matriz de canal adicional
byte H_index = 0; Índice de la matriz H
char F_Data [8]; datos de la matriz de EEPROM
byte F_index = 0; Índice de la matriz F
comando de Char; comando
currentTime largo sin firmar, lastTimeCommand, autoOFF;
void setup() {}
Serial.Begin(9600); inicialización de UART
pinMode (cuerno, salida); canal adicional
pinMode (D1, salida); salida para la rotación del motor
pinMode (D2, salida); salida para la rotación del motor
/ * EEPROM.write(0,255);
EEPROM.write(1,255);
EEPROM.write(2,255);
EEPROM.write(3,255); * /
timer_init(); temporizador software de inicialización
}
void timer_init() {}
uint8_t sw_autoOFF = EEPROM.read(0); leer EEPROM "está activada o no detener el coche cuando se pierde la conexión"
Si (sw_autoOFF == '1') {/ / si está activado
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; autoOFF variable ms
}
else if (sw_autoOFF == '0') {}
autoOFF = 999999;
}
otra cosa if(sw_autoOFF == 255) {}
autoOFF = 2500; Si la EEPROM está en blanco, valor de dafault es 2,5 seg
}
currentTime = millis(); leer que el tiempo transcurrido desde el inicio de la aplicación
}
void loop() {}
Si (Serial.available() > 0) {/ / Si recibe datos del UART
incomingByte = Serial.read(); Raed bytes
if(incomingByte == cmdL) {/ / Si recibe datos para el motor izquierdo L
comando = cmdL; comando actual
memset(L_Data,0,sizeof(L_Data)); limpiar matriz
L_index = 0; Índice de reajuste de la matriz
}
otra cosa if(incomingByte == cmdR) {/ / Si recibe datos para el motor izquierdo R
comando = cmdR;
memset(R_Data,0,sizeof(R_Data));
R_index = 0;
}
otra cosa if(incomingByte == cmdH) {/ / Si recibe datos por canal adicional
comando = cmdH;
memset(H_Data,0,sizeof(H_Data));
H_index = 0;
}
otra cosa if(incomingByte == cmdF) {/ / Si recibe datos de op EEPROM
comando = cmdF;
memset(F_Data,0,sizeof(F_Data));
F_index = 0;
}
else if (incomingByte == '\r') comando = 'e'; final de línea
else if (incomingByte == '\t') comando = ' t '; final de línea para op EEPROM
Si (comando == cmdL & & incomingByte! = cmdL) {}
L_Data [L_index] = incomingByte; almacenar cada byte en la matriz
L_index ++; Índice de incremento de la matriz
}
else if (comando == cmdR & & incomingByte! = cmdR) {}
R_Data [R_index] = incomingByte;
R_index ++;
}
else if (comando == cmdH & & incomingByte! = cmdH) {}
H_Data [H_index] = incomingByte;
H_index ++;
}
else if (comando == cmdF & & incomingByte! = cmdF) {}
F_Data [F_index] = incomingByte;
F_index ++;
}
else if (comando == 'e') {/ / si tomamos el final de línea
Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));
Delay(10);
}
else if (comando == ' t ') {/ / si tomamos el extremo de la línea EEPROM
Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);
}
lastTimeCommand = millis(); leer que el tiempo transcurrido desde el inicio de la aplicación
}
if(Millis() > = (lastTimeCommand + autoOFF)) {/ / Comparar el tiempo actual con lastTimeCommand variable + autoOFF
Control4WD(0,0,0); parar el coche
}
}
void Control4WD (int mLeft, int mRight, uint8_t cuerno) {}
bool directionL, directionR; Dirección de rotación del motor L298N
valueL bytes, tasador; PWM M1, M2 (0-255)
Si (mLeft > 0) {}
valueL = mLeft;
directionL = 0;
}
else if (mLeft < 0) {}
valueL = 255 - abs(mLeft);
directionL = 1;
}
Else {}
directionL = 0;
valueL = 0;
}
Si (mRight > 0) {}
Tasador = mRight;
directionR = 0;
}
else if (mRight < 0) {}
Tasador = 255 - abs(mRight);
directionR = 1;
}
Else {}
directionR = 0;
Tasador = 0;
}
analogWrite (M1, valueL); ajustar la velocidad del motor izquierdo
analogWrite (M2, tasador); ajustar la velocidad del motor adecuado
digitalWrite (D1, directionL); establecer dirección de rotación del motor izquierda
digitalWrite (D2, directionR); establecer el sentido de rotación derecho motor
digitalWrite (cuerno, cuerno); canal adicional
}
void Flash_Op (char FCMD, uint8_t z1, z2 uint8_t, uint8_t z3, z4 de uint8_t) {}
if(FCMD == CMDR) {/ / si el comando de lectura de datos de EEPROM
Serial.Print("FData:"); enviar datos EEPROM
Serial.Write(EEPROM.Read(0)); leer valor de la memoria con dirección 0 e imprimir a UART
Serial.Write(EEPROM.Read(1));
Serial.Write(EEPROM.Read(2));
Serial.Write(EEPROM.Read(3));
Serial.Print("\r\n"); marcar el final de la transmisión de datos EEPROM
}
otra cosa if(FCMD == cmdw) {/ / si los datos EEPROM escriben comando
EEPROM.write(0,z1); registro de Z1 a la memoria con dirección 0
EEPROM.write(1,z2);
EEPROM.write(2,z3);
EEPROM.write(3,z4);
timer_init(); reinicializar el temporizador
Serial.Print("FWOK\r\n"); Enviar un mensaje de que los datos con éxito es escribir EEPROM
}
El código utiliza una librería para trabajar con memoria EEPROM AVR. Placa Arduino por USART del módulo Bluetooth recibe datos listos para el motor izquierdo y derecho. Se realizan todos los cálculos básicos en la aplicación de Android.
La estructura del proyecto en Eclipse se puede ver en la imagen superior.
Puede descargar el código fuente para el Arduino y el proyecto para Eclipse
Descargar Aplicación APK para dispositivos Android
La versión de software más reciente puede encontrarse en esta página Video de demostración del modo de volante virtual (versión 1.2 y superiores):
P.D. Perdón por mi mala Inglés