int motB0 = 2;
int motB1 = 3; //PWM
int motA1 = 4;
int motA0 = 5; //PWM
int lec0=A2;
int lec1=A1;
int sensorleft = A7;
int sensorcenter = A6;
int sensorright = A5;
long cont1 = 0;
int l1 = 0;
int l2 = 0;
int l3 = 0;
int f1 = 0;
int f2 = 0;
int f3 = 0;
int f4 = 0;
int f5 = 0;
int f6 = 0;
int buzzer = 6; //El pin al que se conecta el buzzer es el 6
int echo = 8;
int triger = 7;
int vel = 200;
char valorBoton;
char penultimo = 'n';
char antepenultimo = 'm';
char vali = 'b';
void setup()
{
Serial.begin(9600);
pinMode(motA0, OUTPUT);
pinMode(motA1, OUTPUT);
pinMode(motB0, OUTPUT);
pinMode(motB1, OUTPUT);
pinMode(buzzer, OUTPUT); // Pin 6 declarado como salida
pinMode(echo, INPUT);
pinMode(triger, OUTPUT);
digitalWrite(triger, LOW);
digitalWrite(motA0, LOW);
digitalWrite(motA1, LOW);
digitalWrite(motB0, LOW);
digitalWrite(motB1, LOW);
pinMode(sensorright, INPUT);
pinMode(sensorcenter, INPUT);
pinMode(sensorleft, INPUT);
pinMode(lec0,INPUT_PULLUP);
pinMode(lec1,INPUT_PULLUP);}
void loop()
{
l3=analogRead(sensorleft);
l2=analogRead(sensorcenter);
l1=analogRead(sensorright);
if(digitalRead(lec0)==0){
if(digitalRead(lec1)==0){
// Seguidor de linea blanca
if ((l1 > 550 && l2 > 550 && l3 > 550 || l1 < 550 && l2 < 550 && l3 < 550 ) && cont1 > 0) //feedback when comes all sensor on white
{
l1 = f1;
l2 = f2;
l3 = f3;
cont1=cont1-1;//decremento de ciclos para salir de la memoria
}
////////////////////////////////////////////////////////////////////////////
if (l1 > 550 && l2 < 550 && l3 < 550)
{
derecha();
}
else if (l1 < 550 && l2 < 550 && l3 > 550)
{
izquierda();
}
else if (l1 < 550 && l2 > 550 && l3 < 550)
{
adelanter();
cont1 = 20000; // Numero de ciclos para mantener la memoria
}
else
{
if(l1 > 550 && l2 > 550 && l3 > 550 || l1 < 550 && l2 < 550 && l3 < 550) //Detener en caso de 3 sensores en el mismo color
{
alto();
}
}
///////////////////////////////////////////////////////////////////
f1 = l1;
f2 = l2;
f3 = l3; //memory variables
} else{
//A1=0 A2=1 SUMO
// Para volverlo sumo para fondo blanco cambiar los valores del if de la siguiente manera
//l1 > 550 && l2 > 550 && l3 > 550
if(distancia()<150){
if(l1 > 550 || l2 > 550|| l3 > 550)
{
alto();
delay(1000);
atras();
delay(1000);
derecha();
delay(700);
}
else{
adelanter();
}
}
else
{
if(l1 > 550 || l2 > 550 || l3 > 550)
{
alto();
delay(1000);
atras();
delay(1000);
derecha();
delay(700);
}
else{
adelantes();
}
}
}
} else{
if(digitalRead(lec1)==0){
//A1=1 A2=0 Evasor
if(distancia()<15){
alto();
delay(500);
atras();
delay(700);
derecha();
delay(500);
adelanter();
}
else {
adelanter();
}
} else{
//A1=1 A2=1 RC
if(Serial.available() > 0)
{
valorBoton = Serial.read();
if((antepenultimo == 'w'
&& penultimo == 'd'
&& valorBoton == 'h'
)
|| (antepenultimo == 'w'
&& penultimo == 'a'
&& valorBoton == 'f'
))//wdh o waf
{
vali = 'i';
adelanter();
penultimo = 'n'
;
antepenultimo = 'm'
;
}
else if((antepenultimo == 's'
&& penultimo == 'd'
&& valorBoton == 'h'
)
|| (antepenultimo == 's'
&& penultimo == 'a'
&& valorBoton == 'f'
))//sdh o saf
{
vali = 'k'
;
atras();
penultimo = 'n'
;
antepenultimo = 'm'
;
}
else if((antepenultimo == 'a'
&& penultimo == 'w'
&& valorBoton == 't'
)
|| (antepenultimo == 'a'
&& penultimo == 's'
&& valorBoton == 'g'
))//awt o asg
{
vali = 'j'
;
izquierda();
penultimo = 'n'
;
antepenultimo = 'm'
;
}
else if((antepenultimo == 'd'
&& penultimo == 'w'
&& valorBoton == 't'
)
|| (antepenultimo == 'd'
&& penultimo == 's'
&& valorBoton == 'g'
))//dwt o dsg
{
vali = 'l'
;
derecha();
penultimo = 'n'
;
antepenultimo = 'm'
;
}
else if(vali == 'i'
)//Validacion no se suelta adelante
{
adelanter();
if(valorBoton == 't'
)
{
vali = 'b'
;
alto();
}
else if(valorBoton == 'd'
) { //d
derecha();
}
else if(valorBoton == 'a'
) { //a
izquierda();
}
}
else if(vali == 'k'
)//Validacion no se suelta atras
{
atras();
if(valorBoton == 'g'
)
{
vali = 'b'
;
alto();
}
else if(valorBoton == 'd'
) { //d
atrasderecha();
}
else if(valorBoton == 'a'
) { //a
atrasizquierda();
}
}
else if(vali == 'j'
)//Validacion no se suelta izquierda
{
izquierda();
if(valorBoton == 'f'
)
{
vali = 'b'
;
alto();
}
else if(valorBoton == 'w'
) { //w
izquierda();
}
else if(valorBoton == 'a'
) { //s
atrasderecha();
}
}
else if(vali == 'l'
)//Validacion no se suelta derecha
{
derecha();
if(valorBoton == 'h'
)
{
vali = 'b'
;
alto();
}
else if(valorBoton == 'w'
) { //w
derecha();
}
else if(valorBoton == 'a'
) { //s
atrasizquierda();
}
}
//Combinaciones de dos botones:
else if(valorBoton == 'w'
) { //w
adelanter();
}
else if(valorBoton == 's'
) { //s
atras();
}
else if(penultimo != 's'
&& valorBoton == 'a'
) { //a
izquierda();
}
else if(penultimo != 's'
&& valorBoton == 'd'
) { //d
derecha();
}
else if(penultimo == 'w'
&& valorBoton == 'a'
) { //wa
izquierda();
}
else if(penultimo == 'w'
&& valorBoton == 'd'
) { //wd
derecha();
}
else if(penultimo == 'w'
&& valorBoton == 'f'
) { //wf
adelanter();
}
else if(penultimo == 'w'
&& valorBoton == 'h'
) { //wh
adelanter();
}
else if(penultimo == 't'
&& valorBoton == 'a'
) { //ta
izquierda();
}
else if(penultimo == 't'
&& valorBoton == 'd'
) { //td
derecha();
}
else if(penultimo == 's'
&& valorBoton == 'a'
) { //sa
atrasizquierda();
}
else if(penultimo == 's'
&& valorBoton == 'd'
) { //sd
atrasderecha();
}
else if(penultimo == 's'
&& valorBoton == 'f'
) { //sf
atras();
}
else if(penultimo == 's'
&& valorBoton == 'h'
) { //sh
atras();
}
else if(penultimo == 'g'
&& valorBoton == 'a'
) { //ga
atrasderecha();
}
else if(penultimo == 'g'
&& valorBoton == 'd'
) { //gd
atrasizquierda();
}
//Espejo
else if(penultimo == 'a'
&& valorBoton == 'w'
) { //aw
izquierda();
}
else if(penultimo == 'd'
&& valorBoton == 'w'
) { //dw
derecha();
}
else if(penultimo == 'f'
&& valorBoton == 'w'
) { //fw
adelanter();
}
else if(penultimo == 'h'
&& valorBoton == 'w'
) { //hw
adelanter();
}
else if(penultimo == 'a'
&& valorBoton == 't'
) { //at
izquierda();
}
else if(penultimo == 'd'
&& valorBoton == 't'
) { //dt
derecha();
}
else if(penultimo == 'a'
&& valorBoton == 's'
) { //as
atrasderecha();
}
else if(penultimo == 'd'
&& valorBoton == 's'
) { //ds
atrasizquierda();
}
else if(penultimo == 'f'
&& valorBoton == 's'
) { //fs
atras();
}
else if(penultimo == 'h'
&& valorBoton == 's'
) { //hs
atras();
}
else if(penultimo == 'a'
&& valorBoton == 'g'
) { //ag
atrasderecha();
}
else if(penultimo == 'd'
&& valorBoton == 'g'
) { //dg
atrasizquierda();
}
else {
//Si se presionan más de dos botones o no se presionan los adecuados
alto();
penultimo = 'n'
;
antepenultimo = 'm'
;
}
//Actualizar la penultimo
Serial.print(antepenultimo);
Serial.print(" ");
Serial.print(penultimo);
Serial.print(" ");
Serial.print(valorBoton);
Serial.print(" ");
Serial.print(vali);
Serial.println(" ");
antepenultimo = penultimo;
penultimo = valorBoton;
/*if(valorBoton != penultimo) {
penultimo = valorBoton;*/
}
}
}
}
long distancia()
{
long t;
long d;
digitalWrite(triger, HIGH);
delayMicroseconds(10);
digitalWrite(triger, LOW);
t = pulseIn(echo, HIGH);
d = t / 59;
if (d <= 1 || d >= 25)
{
d = 1000;
}
delay(10);
return d;
}
void alto()
{
digitalWrite(motA0, 0);
digitalWrite(motA1, 0);//PWM
digitalWrite(motB0, 0); //PWM
digitalWrite(motB1, 0);
}
void atras()
{
digitalWrite(motA0, 1);
digitalWrite(motA1, 0); //PWM
digitalWrite(motB1, 1); //PWM
digitalWrite(motB0, 0);
}
void adelante()
{
digitalWrite(motA1, 1);
analogWrite(motA0, 50); //PWM
analogWrite(motB1, 50); //PWM
digitalWrite(motB0, 1);
}
void adelanter()
{
digitalWrite(motA1, 1);
digitalWrite(motA0, 0); //PWM
digitalWrite(motB0, 1); //PWM
digitalWrite(motB1, 0);
}
void adelantes()
{
digitalWrite(motA1, 1);
analogWrite(motA0, 80); //PWM
digitalWrite(motB0, 1); //PWM
digitalWrite(motB1, 0);
}
void izquierda()
{
digitalWrite(motA0, 0);
digitalWrite(motA1, 1); //PWM
digitalWrite(motB0, 0); //PWM
digitalWrite(motB1, 0);
}
void derecha()
{
digitalWrite(motA1,0);
digitalWrite(motA0, 0); //PWM
digitalWrite(motB0, 1); //PWM
digitalWrite(motB1, 0);
}
void atrasderecha(){
digitalWrite(motA0, 0);
digitalWrite(motA1, 0); //PWM
digitalWrite(motB0, 0); //PWM
digitalWrite(motB1, 1);
}
void atrasizquierda(){
digitalWrite(motA0, 1);
digitalWrite(motA1, 0); //PWM
digitalWrite(motB0, 0); //PWM
digitalWrite(motB1, 0);
}