Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola,estoy empezando en el mundillo de los bots y no tengo mucha idea de programar en C,necesito un algoritmo rastreador para mi SKYBOT con 4 sensores CNY 70.
A ver esa gente experta ke me eche un cable y me pase uno para fijarme un poco en por donde van los tiros,por mas que lo busco en los foros no lo encuentro.
Muchas gracias y nos vemos en CP Bot 07
Fe de Erratas:En el codigo pone set_tris_b(0b00000000) y deberia poner set_tris_b(0b11111111)
Lo he probado de las dos formas.
Lo volvi a comprobar con set_tris_b(0b11111111) y solo definir 2 cnys
Mi sorpresa fue que funcionaba el primer cny (s1)que ni siquiera lo mencionaba en el programa.
#include <16F84A.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#define md_ade PIN_A3
#define md_atr PIN_A2
#define mi_ade PIN_A1
#define mi_atr PIN_A0
#define s4 PIN_4
#define s7 PIN_B7
#define ON output_high
#define OFF output_low
void main()
{
for (;;){
if (input(s4) == 0) {on(md_ade);}else{off(md_ade);}
if (input(s7) == 0) {on(md_ade);}else{off(mi_ade);}
}
}
Gizer_20 te dejo la foto de los cny para aclarar si es V o V invertida.
Opp,la foto...
Como no pongas una foto con más calidad, poco se puede ver.
Yo diria que estan puestos en media luna 😀
Hola!
Te voy ha hacer una pequeña recomendación... cuando programes en c y abras una llave hazlo en una linea nueva y con un tabulador antes...
Llevo un rato intentando seguir tu programa y estoy a punto de cortarme las venas... te quedará más facil de seguir y de entender. Por ejemplo:
#include <16F84A.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#define md_ade PIN_A3
#define md_atr PIN_A2
#define mi_ade PIN_A1
#define mi_atr PIN_A0
#define s0 PIN_B0
#define s1 PIN_B1
#define s2 PIN_B2
#define s3 PIN_B3
#define s4 PIN_B4
#define s5 PIN_B5
#define s6 PIN_B6
#define s7 PIN_B7
#define ON output_high
#define OFF output_low
void main()
{
off(md_ade);
off(mi_ade);
off(md_atr);
off(mi_atr);
for (;;)
{
if (input(s1) == 0)
{
on(md_ade);
}
else
{
for(;;)
{
if (input(s0) == 0)
{
for(;;)
{
if (input(s1) == 0)
{
off(md_ade);
off(mi_atr);
break;
}
else
{
on(md_ade);
on(mi_atr);
}
}
}
else
{
off(md_ade);
break;
}
}
}
if (input(s2) == 0)
{
on(mi_ade);
}
else
{
for(;;)
{
if (input(s3) == 0)
{
for(;;)
{
if (input(s2) == 0)
{
off(mi_ade);
off(md_atr);
break;
}
else
{
on(mi_ade);
on(md_atr);
}
}
}
else
{
off(mi_ade);
break;
}
}
}
}
}
y una segunda recomendación... pon comentarios en el código. Si no dentro de unos dias no entenderás tu propio código.
Otra cosa: es dificil entender el código si no sabemos que sensor es que señal... s0 es el sensor derecho, el izquierdo, el central derecho...
Sobre el segundo programa:
Creo que tienes mal el #define del pin_4 e intuyo que si S7==0 mueves el motor Izq. Supongo que quieres seguir recto cuando los dos están sobre la linea.
#include <16F84A.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#define md_ade PIN_A3
#define md_atr PIN_A2
#define mi_ade PIN_A1
#define mi_atr PIN_A0
#define s4 PIN_B4 //deberia ser #define s4 PIN_B4
#define s7 PIN_B7
#define ON output_high
#define OFF output_low
void main()
{
for (;;)
{
if (input(s4) == 0)
{
on(md_ade);
}
else
{
off(md_ade);
}
if (input(s7) == 0)
{
on(mi_ade); //creo que es así
}
else
{
off(mi_ade);
}
}
}
Particularmente no me gusta lo de utilizar bucles infinitos y salir con un break. Antes que eso utilizaria el while(condición){} o el do{}while(condicion);
Una última pregunta:
¿Conectas directamente los CNY a los pines del PIC o utilizas inversores Trigger-Schmitt?
Salu2!