fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Algoritmo rastreado...
 
Avisos
Vaciar todo

Algoritmo rastreador en C

28 Respuestas
9 Usuarios
0 Reactions
11.6 K Visitas
chentinox
Respuestas: 15
Topic starter
(@chentinox)
Active Member
Registrado: hace 18 años

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

Responder
27 respuestas
makabra
Respuestas: 107
(@makabra)
Estimable Member
Registrado: hace 18 años

Lo que puedes hacer es hacerte una tabla de la verdad y programar utilizando "if" o "switch" lo que debe hacer cada uno de los motores en cada uno de los casos posibles.

Responder
jorcoval
Respuestas: 418
(@jorcoval)
Reputable Member
Registrado: hace 18 años

Te paso un código muy sencillo, utilizando 2 CNY. Para 4 es similar pero podrás ajustar mejor los ángulos si sigues el consejo de Makabra y te apoyas en mi código.
#include <pic1687x>

#define parado 49 // 1.5mseg
#define derecha_adelante 49-10 // +0.3mseg
#define derecha_atras 49+10 // -0.3mseg
#define izquierda_adelante 49+10 // -0.3mseg
#define izquierda_atras 49-10 // +0.3mse

void progPWM (unsigned char i, unsigned char d);

/*
VARIABLES
RB2: Bumper Izquierdo
RB5: Bumper Derecho
RB3: Infrarrojo Izquierdo
RB4: Infrarrojo Derecho
*/

void main (void)
{
TRISC=0x00;
PORTC=0x00;
T2CON=0x00; // Predivisor por 1
PR2=163; // Fpwm=50Hz para cristal 32'768kHz
progPWM(parado,parado);
TMR2ON=1;

do
{
if (RB2==1) // Bumper izquierdo
{
progPWM(59,39);
while(RB2==1);
//progPWM(izquierda_adelante,derecha_adelante);
}

if (RB5==1) // Bumper derecho
{
progPWM(59,39);
while(RB5==1);
//progPWM(izquierda_adelante,derecha_adelante);
}

if ((RB3==0) && (RB4==0)) //los 2 detectan blanco
{
progPWM(39,59);
while((RB3==0)&&(RB4==0));
}
else if ((RB3==1) && (RB4==0)) //izquierdo=negro y derecho=blanco
{
progPWM(39,49);
while((RB3==1)&&(RB4==0));
progPWM(39,59);
}
else if((RB3==0) && (RB4==1))
{
progPWM(49,59);
while((RB3==0) && (RB4==1));
progPWM(39,59);
}
}
while(1);
}

void progPWM (unsigned char i, unsigned char d)
{
CCPR1L=d>>2;
CCP1CON=((d<<4>>2;
CCP2CON=((i<<4)&0x30)|0x0f;
}

Responder
gizer20
Respuestas: 1570
(@gizer20)
Noble Member
Registrado: hace 19 años

La verdad es que hasta cuatro tiene que ser facil, pero cuando la cosa llega a los 6 y 8 sensores no me kiero ni imaginar la tabla de la verdad y todas las posibilidades que pueden salir y que hay que programar

Responder
chentinox
Respuestas: 15
Topic starter
(@chentinox)
Active Member
Registrado: hace 18 años

Jorcoval ,gracias ,bueno gracias a todos los que respondeis,la verdad es que no tengo ni idea de lo que es la tabla de la verdad y mucho meno s programar en C.
Mi idea es para un skybot que monte en la CPBot 06 y basandome en el programa linea.c para 2 sensores de la web queria incluir que...
Si los sensores de los 2 extremos=negro siga de frente en el proximo crue.
Si el sensor derecho2 = negro en el proximo cruce gire a la derecha.
Si el sensor izquierdo2=negro en el proximo cruce gire a la izquierda.

El proximo cruce lo interpretamos como Blanco,Blanco en los sensores centrales(sensores 3 y 4)

//-- Especificar el pic a emplear
#define __16f877
#include "pic16f877.h"

//-- Definiciones para los motores. Estos valores define
//-- los movimientos del robot
#define AVANZA 0x1C
#define ATRAS 0x16
#define IZQUIERDA 0x1E
#define DERECHA 0x14
#define STOP 0x00

//-- Definiciones de los sensores
#define SENSOR1 0x01
#define SENSOR2 0x20
#define SENSOR3 0x40
#define SENSOR4 0x80

//-- MOdificar esto para indicar la colocacion de los sensores
#define IZQUIERDO SENSOR4
#define DERECHO SENSOR3
#define IZQUIERDO2 SENSOR2
#define DERECHO2 SENSOR1

unsigned char sensores;
void main(void)
{

//-- Configurar puerto B
TRISB=0xE1;

//-- Inicialmente robot parado
PORTB=STOP;

for (;;) {
sensores=PORTB& (IZQUIERDO | DERECHO); // Leer sensores
switch (sensores) {
case (IZQUIERDO | DERECHO): //-- Caso negro-negro
PORTB=AVANZA;
break;
case DERECHO: //-- Caso Blanco-negro
PORTB=DERECHA;
break;
case IZQUIERDO: //-- Caso Negro-Blanco
PORTB=IZQUIERDA;
break;
default:
PORTB=STOP;
}
}
}

😳 😳 😳 😳 😳 😳 😳

Responder
Página 1 / 6
Compartir: