Hola, soy nuevo en este foro y también en arduino, me gustaría saber si podrían ayudarme con un código o algún lugar donde pueda investigar sobre lo siguiente:
Tengo un robot (dos motores y llantas) que tiene un sensor ultrasónico. Este esta conectado al arduino y funciona bien, o sea, puede "caminar" o detectar objetos para no chocar. Lo que deseo que haga es que camine sin chocar un tiempo, luego que se detenga y no haga nada por otro lapso de tiempo y luego que continúe con la rutina de caminar sin chocar. Hasta ahora puedo hacer que camine y no choque; o que camine, espere un tiempo y vuelva a caminar, pero no puedo hacer que haga las dos cosas al mismo tiempo, o sea, caminar y no chocar, luego detenerse por un tiempo y volver a caminar sin chocar.
Si ya existe algún código similar donde pueda orientarme seria de gran ayuda, o si pueden darme ideas de que hacer serán bienvenidas.
Qar2015:
Hola, soy nuevo en este foro y también en arduino, me gustaría saber si podrían ayudarme con un código o algún lugar donde pueda investigar sobre lo siguiente:
Tengo un robot (dos motores y llantas) que tiene un sensor ultrasónico. Este esta conectado al arduino y funciona bien, o sea, puede "caminar" o detectar objetos para no chocar. Lo que deseo que haga es que camine sin chocar un tiempo, luego que se detenga y no haga nada por otro lapso de tiempo y luego que continúe con la rutina de caminar sin chocar. Hasta ahora puedo hacer que camine y no choque; o que camine, espere un tiempo y vuelva a caminar, pero no puedo hacer que haga las dos cosas al mismo tiempo, o sea, caminar y no chocar, luego detenerse por un tiempo y volver a caminar sin chocar.
Si ya existe algún código similar donde pueda orientarme seria de gran ayuda, o si pueden darme ideas de que hacer serán bienvenidas.
Gracias!
Si posteas el codigo que ya has hecho sera mas facil que alguien te ayude.(usa los tag adecuados para postear codigo,si no sabes como repasa las normas del foro)
int izqA = 5; // controla motor izquierdo hacia adelante
int izqB = 6; // controla motor izquierdo hacia atras
int derA = 9; // controla motor derecho hacia adelante
int derB = 10; // controla motor derecho hacia atras
int vel = 220; // Velocidad de los motores (0-255)
unsigned long anteriorMillis = 0;
long encendido = 30000;
long apagado = 50000;
int ledPin = 13;
int ledEstado = HIGH;
int pecho = 3; // echo del ultrasonico
int ptrig = 4; // trig del ultrasonico
int duracion, distancia; // para calcular distacia
// --------gira hacia atras al detectar un obstaculo---------
void atras()
{
if (distancia <= 15 && distancia >=3 )
{
analogWrite(derB, vel);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
}
// ------genera el pulso del sensor ultrasonico-------
void calculo()
{
digitalWrite(ptrig, HIGH); // genera el pulso de trigger por 10ms
delay(0.01);
digitalWrite(ptrig, LOW);
duracion = pulseIn(pecho, HIGH); // Lee el tiempo del echo
distancia = (duracion/2) / 29; // calcula la distancia en centimetros
delay(10);
}
void setup() {
pinMode(derA, OUTPUT);
pinMode(derB, OUTPUT);
pinMode(izqA, OUTPUT);
pinMode(izqB, OUTPUT);
pinMode(pecho, INPUT);
pinMode(ptrig,OUTPUT);
pinMode(ledPin,OUTPUT);
attachInterrupt(1, atras, RISING); // interrupcion al detectar un objeto.
}
void loop() {
unsigned long actualMillis = millis();
if((ledEstado == LOW) && (actualMillis - anteriorMillis >= apagado))
{
// enciende motores hacia adelante y el LED por 30 segundos
ledEstado = HIGH;
anteriorMillis = actualMillis;
digitalWrite(ledPin, ledEstado);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, vel);
analogWrite(izqA, vel);
/* En esta parte deseo que al estar en movimiento
* durante ese tiempo me detecte los objetos y no choque.
*/
//calculo(); .............?? puedo generar el pulso desde aqui? y a traves del attachInterrupt no chocar?
}
else if ((ledEstado == HIGH) && (actualMillis - anteriorMillis >= encendido))
{
// detiene motores y apaga el LED por 50 segundos
ledEstado = LOW;
anteriorMillis = actualMillis;
digitalWrite(ledPin, ledEstado);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
}
La estrategia clásica para esto es realizar máquinas de estado finito. Abstrae en que situación puede estar tu robot (caminar hacia adelante, girar, esperando para caminar, etc), identifica que es lo que hace que cambie (detectar un objeto, el tiempo para empezar a caminar pasa, etc). Hazte un diagrama e implementa el código.