Autor Tema: coche teledirigido x ordenador  (Leído 3385 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado satopek

  • PIC10
  • *
  • Mensajes: 4
coche teledirigido x ordenador
« en: 07 de Mayo de 2006, 14:45:09 »
hola, tenemos un proyecto a medias y nos encontramos con algunos problemas.
queremos hacer un coche teledirigido por ordenador y el coche seria controlado por un PIC 16f84A.
la parte de los motores la tenemos bien, xo tenemos problemas al mandar datos por el puerto serie(para luego enviarlos inhalambricamente).
tenemos un MAX232 para adaptar las señales de RS232 a TTL, xo el problema viene cuando conectamos el cable del puerto serie al circuito adaptador, si tenemos -12v en el cable sin conectarlo, al conectarlo nos cambia a 1,5v (mirando la entrada del MAX232 no la salida)y claro no lo adapta bien despues, la pregunta seria si hacemos algo mal y hay q hacer algun paso intermedio(algo q adapte impedancias, etc)y la posible solucion.
muchas gracias!!

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: coche teledirigido x ordenador
« Respuesta #1 en: 07 de Mayo de 2006, 15:32:28 »
Seguramente algun error de conexiones ?


Desconectado satopek

  • PIC10
  • *
  • Mensajes: 4
Re: coche teledirigido x ordenador
« Respuesta #2 en: 01 de Junio de 2006, 21:44:03 »
gracias Sispic, ahora esta parte ya me funciona, pero como todo principiante me encuentro con más problemas xD.
He conseguido que funciona la parte donde tengo un 16F84A conectado a un driver L293B, con su correspondiente programa (mu cutre xD), pero solo controlo dos motores DC y me gustaría que uno fuera DC para la tración y otro servo para el giro (sin trucar), la pregunta es; con el driver L293B, puede controlar un servo sin tener que hacer que el programa envie el PWM??
muchas gracias!
seguiremos preguntando xD, suerte que hay gente muy amable por aquí que sino...

Desconectado satopek

  • PIC10
  • *
  • Mensajes: 4
Re: coche teledirigido x ordenador
« Respuesta #3 en: 02 de Junio de 2006, 06:51:43 »
otra pregunta xD, la anterior sigue vigente xD. (todo lo pregunto después de un buen rato de buscar por el foro)
el circuito de coche consta de momento de; 2 16f84a, 1 driver L293B y dos motors CC cutrisimos. con la fuente q tengo va bien, xo cuando le quiero poner una pila de 9V (regulada con un 7805) no tira...lo intenta pero no puede. he mirado el consumo y sale 500 mA....claro q la pila no podía... pero tampoco es tan bestia el circuito como para que consuma tanto no??sabeis alguna manera de arreglarlo? a parte de meter una pila más grande xD.
gracias!

Desconectado nostrico

  • PIC10
  • *
  • Mensajes: 33
Re: coche teledirigido x ordenador
« Respuesta #4 en: 02 de Junio de 2006, 14:28:46 »
Saludos Amigo... He leido tu problema y te planteo que no conectes el L293 directo al servo... has un pequeño programa de tiempos y el RTC (timer) para usar el servo y un puerto para la conexión tipo puente H para el L293... El L293 es un buffer de corriente y voltaje por lo que es de potencia y la entrada del servo es simplemente eso una entrada que espera un pulso desde 1ms 1.5ms (centro) y 2 ms otro lado... por aca en el foro te puedes conseguir el driver para CCS y programarlo desde C... Verdaderamente un tiro al suelo... jejeje :)
"La electronica nos salvará..." CZWIENCZEK

Desconectado satopek

  • PIC10
  • *
  • Mensajes: 4
Re: coche teledirigido x ordenador
« Respuesta #5 en: 03 de Junio de 2006, 23:43:29 »
gracias Nostrico!
al final lo he hecho con el microcode studio, creando yo los retardos, os pongo el programa de ejemplo que he hecho para no meter todo el tocho de todo el pic, por cierto, está bien lo que he hecho o es demasiado "a saco"xD? o hay alguna función más especifica para esto? el programa funciona y ya puedo controlar el servo (un futaba s3003).

este es el mini-programa:

input portb.0
output portb.5

inicio:

if portb.0=1 and portb.1=0 then 'derecha
    high portb.5
    pauseus 2000    '(aprox 30º)
    low portb.5
    pauseus 18000   '(aprox 30º)
endif

if portb.0=0 and portb.1=1 then  'izquierda
    high portb.5
    pauseus 1000  '(aprox 150º)
    low portb.5
    pauseus 19000  '(aprox 150º)
endif
 
if portb.0=1 and portb.1=1 then  'centro
    high portb.5
    pauseus 1500
    low portb.5
    pauseus 18500
endif

goto inicio

end

otra preguntilla, jajajaja que pesao el tio....con otro 16f84a he hecho un conversor serie-paralelo, el programa si que no lo he hecho yo, me bajé el firmware de esta página:
http://www.pablin.com.ar/electron/circuito/mc/sertopar/index.htm
y no me funciona. El pic que utiliza es un 16f84, podría ser que no funcionase por eso?ya que el mio es 16f84a. si fuera por eso como podría arreglarlo?(esta en ensamblador)
el fichero .asm es este:
http://www.pablin.com.ar/electron/circuito/mc/sertopar/firmware.asm
muchisimas gracias!!

edit: la entrada al conversor viene de un max232, lo digo pq en el de el enlace lo hace con una simple resistencia.
« Última modificación: 03 de Junio de 2006, 23:46:01 por satopek »

Desconectado nostrico

  • PIC10
  • *
  • Mensajes: 33
Re: coche teledirigido x ordenador
« Respuesta #6 en: 05 de Junio de 2006, 10:56:03 »
Saludos Amigo... Bueno... Te recomiendo dos cosas... Usa el CCS... es mucho mas estable... te envío un programa para el pic para use no 1 solo servo si no los que te de los puertos del pic... solo que debes usas el CCS... y unas interrupciones que son muchisimos mas exactas que estar ajustando tiempos al simple ojo y quitar esa palabra de aproximado... no amigo mío aquí es exacto...
// Ejemplo con un servo FUTABA S3003
// Alimentación y pulsos a 5V
// Cuadro de Tiempos :
//    Periodo 20 ms (Frecuencia 50 Hz)
//    Ancho Pulso minimo 0.5 ms
//    Ancho pulso medio  1.5 ms
//    Ancho pulso maximo 2.5 ms
//    TMR0 a 1:16 -> 1 RTCC cada 4.096 ms
//                -> 1 Tick cada 0.096 / 256 = 0.016 ms
//                -> 20 ms = (4 x RTCC completas) + (1 * RTCC - 30 ticks)
//    Ancho Pulso minimo 0.5 ms ->  31 ticks de TMR0
//    Ancho pulso medio  1.5 ms ->  93 ticks de TMR0
//    Ancho pulso maximo 2.5 ms -> 155 ticks de TMR0

#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define PIN_SERVO1 PIN_B0

const int AJUSTE_FINO_DE_RTCC =  30;
const int ticks_PULSO_MINIMO  =  31;
const int ticks_PULSO_MEDIO   =  93;
const int ticks_PULSO_MAXIMO  = 155;

int1 flagRTCC     = 0;
int   contRTCC    = 0;
int1 flagSERVO1 = 0;
int   tSERVO1     = ticks_PULSO_MEDIO;
char Keypress   =0x00;

void eco_servos(void);
void ajusta_servo(void);

#int_rda
void rda_isr() {
   Keypress=0x00;
   if(kbhit()){
      Keypress=getc();
   }
}

#int_RTCC
RTCC_isr(){
   ++contRTCC;
   if(contRTCC==4){
      set_TIMER0(AJUSTE_FINO_DE_RTCC);
   }
   if(contRTCC==5){
      flagRTCC=1;
      contRTCC=0x00;
   }
}

void main() {

   int ValTIMER0;

   setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
   enable_interrupts(int_rda);
   enable_interrupts(global);
   printf("\r\n\SERVO Commander\r\n\r\n" );
   eco_servos();
   set_TIMER0(0);
   enable_interrupts(INT_RTCC);
   do {
      // DISPARO DEL PULSO PWM
      if(flagRTCC==1){
         flagRTCC=0;
         output_high(PIN_SERVO1);
         flagSERVO1=1;   
      }
      // CONTROL DE ANCHO DEL PULSO PWM
      if(flagSERVO1==1){
         valTIMER0 = get_TIMER0();
         if(valTIMER0>tSERVO1){
            flagSERVO1=0;
            output_low(PIN_SERVO1);
         }   
      }
      // CONTROL DESDE LA RS-232
      if(Keypress!=0x00){
           ajusta_servo();   
         Keypress=0x00;
      }
   } while (TRUE);
}

void ajusta_servo(void){

  switch(Keypress){
    // Periodos Prefijados
    case '1': tSERVO1=ticks_PULSO_MINIMO;
              break;
    case '2': tSERVO1=ticks_PULSO_MEDIO;
              break;
    case '3': tSERVO1=ticks_PULSO_MAXIMO;
              break;
    // Inc Dec Periodo
    case '+': if(++tSERVO1>ticks_PULSO_MAXIMO){
                tSERVO1=ticks_PULSO_MAXIMO;
              }
              break;
    case '-': if(--tSERVO1<ticks_PULSO_MINIMO){
                tSERVO1=ticks_PULSO_MINIMO;
              }
              break;
    // Dame Periodo actual
    case 'r': eco_servos();
              break;
  }
}

void eco_servos(void){
   printf("S=%u\r\n",tSERVO1);
}

Fijate este programa no es mio es del amigo REDPIC... Busca en "Ejemplito 16F876A: Controlando un SERVO con el PIC desde nuestro PC" de verdad es un excelente explicación con bastante irformación...

Ahora fijate... creo que no te funciona... por que debes tomar en cuenta que la entrada serial debe usar un transistor con 10K  en colector 2n3906 y en la base 4.7K para tumbar los +12 y los -12v que salen del PC via serial... sin el uso del Max232...

Si no sabes programar en CCS en este foro puedes realizar un curcillo para C y microcontroladores... esta demasiado bueno...
 Bueno amigo cualkiercosa estamos a la orden...

"La electronica nos salvará..." CZWIENCZEK


 

anything