Autor Tema: Programación de 2 motores  (Leído 1935 veces)

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

Desconectado jhonjz

  • PIC10
  • *
  • Mensajes: 19
Programación de 2 motores
« en: 04 de Noviembre de 2013, 21:13:24 »
Hola a tod@s. Me encuentro realizando un proyecto en lenguaje C como hobbie, se trata de realizar un carrito a control remoto, ya realicé uno pero ese fué solo secuencial; ahora me encuentro realizando otro que se mueva cada vez que mantenga presionado un botón, ya tengo una parte programada y funciona a la perfección, solo tengo problema en lo siguiente, pero primero les comentaré que llevo para que tengan una idea: dispongo de 4 pulsadores, A, B, C y D. Cuando mantenga presionado el pulsador A, el carrito debe avanzar, de lo contrario no, Cuano mantenga pulsado B, el carrito debe retroceder, de lo contrario no, para esta parte utilizo el integrado de un puente H L293d que me permite invertir el giro de los motores, Ah, lo olividaba, estoy usando dos motores. Ahora sí paso a contarles el problema: cuando quiera presionar C, uno de los motores debe activarse mientras que el otro no, pero cuando voy a simular esta parte las anteriores acciones se bloquean, no sé a qué se debe. Paso a continuación el código en C para que le hechen un vistazo. Por si quieren ver también la simulación les envío el archivo DSN y el .C del código, solo denle descomprimir.

#include "F:\Users\Home\Desktop\Prueba Pulsador\Pulsador.h"
#byte LEDS=0x07//CONFIGURO TODO EL BYTE PARA LOS LEDS EN EL PUERTO C
#byte MOTORES=0x08//CONFIGURO TODO EL BYTE PARA LOS MOTORES EN EL PUERTO D

#bit led_amarillo_1=0x07.0//PARA CONECTAR UN SOLO LED EN EL PIN RC7.0
#bit led_amarillo_2=0x07.1//PARA CONECTAR UN SOLO LED EN EL PIN RC7.1
#bit led_rojo_1=0x07.2//PARA CONECTAR UN SOLO LED EN EL PIN RC7.2
#bit led_rojo_2=0x07.3//PARA CONECTAR UN SOLO LED EN EL PIN RC7.3
#bit pulsador_A=0x05.0//PARA CONECTAR EL PULSADOR A EN EL PIN RA0
#bit pulsador_B=0x05.1//PARA CONECTAR EL PULSADOR B EN EL PIN RA1
#bit pulsador_C=0x05.2//PARA CONECTAR EL PULSADOR C EN EL PIN RA2
#bit pulsador_D=0x05.3//PARA CONECTAR EL PULSADOR D EN EL PIN RA3
#bit MOTOR1_DER=0x08.0//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD0
#bit MOTOR1_IZQ=0x08.1//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD1

#bit MOTOR2_DER=0x08.2//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD2
#bit MOTOR2_IZQ=0x08.3//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD3

#byte tris_led=0x87//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS LED
#byte tris_pulsador=0x85//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS PULSADORES
#byte tris_motores=0x88//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS MOTORES

void main()
{
tris_pulsador=0b11111111;//CONFIGURO LOS PULSADORES COMO ENTRADAS
tris_led=0b11110000;//CONFIGURO LOS LED COMO SALIDAS
tris_motores=0b11110000;//CONFIGURO LOS MOTORES COMO SALIDAS
leds=0x00;//COMIENZAN LOS LEDS APAGADOS
motores=0x00;//COMIENZAN LOS MOTORES APAGADOS

while(1)
{
if(pulsador_A==1)//SI PULSADOR A SE MANTIENE PRESIONADO
{
 led_amarillo_1=1;//SE ENCIENDEN LOS LEDS, AUNQUE SE ENCIENDEN REALMENTE DESDE QUE SE ALIMENTA EL PIC
 led_amarillo_2=1;
 MOTOR1_DER=1;//LOS MOTORES 1 Y 2 DERECHA SE ACTIVAN
 MOTOR2_DER=1;
}
else//DE LO CONTRARIO, SI NO SE MANTIENE PRESIONADO A
{
 led_amarillo_1=1;//LOS LEDS IGUAL CONTINUAN PRENDIDOS
 led_amarillo_2=1;
 MOTOR1_DER=0;//LOS MOTORES EN CAMBIO DEBEN DESACTIVARSE
 MOTOR2_DER=0;
}
if(pulsador_B==1)//SI SE MANTIENE PRESIONADO B
{
 led_rojo_1=1;//CONTINUAN LOS LEDS ENCENDIDOS
 led_rojo_2=1;//LOS MOTORES  Y 2 IZQUIERDA SE ACTIVAN PARA QUE EL CARRITO RETROCEDA
 MOTOR1_IZQ=1;
 MOTOR2_IZQ=1;
}
else//DE LO CONTRARIO, SI NO SE MANTIENE PRESIONADO B
{
 led_rojo_1=1;
 led_rojo_2=1;
 MOTOR1_IZQ=0;//LOS MOTORES 1 Y 2 IZQUIERDA SE DESACTIVAN
 MOTOR2_IZQ=0;
 
}
if(pulsador_C==1)//AQUÍ ES DONDE QUIERO QUE AL PRESIONAR C, EL MOTOR 1 DERECHA SE ACTIVE SOLAMENTE
{

}
else
{

}
}
}

Desconectado ZAR

  • PIC10
  • *
  • Mensajes: 10
Re: Programación de 2 motores
« Respuesta #1 en: 05 de Noviembre de 2013, 03:58:45 »
Saludos, bueno para comenzar me parece que el micro que estas empleando es demasiado para la aplicación en cuestión, podrías emplear uno más pequeño y barato. Por otro lado en la simulación te falto emplear resistencias en los pulsadores y colocar el pin EN1 y EN2 del l293d a nivel alto, esto te evitara problemas al momento de realizar el montaje real, las resistencias fueron colocadas de modo que cumplan con las condiciones de tu programa.

En cuanto al programa el motivo por el cual mostraba los leds encendidos todo el tiempo se debe a tus sentencias “ELSE”, el pic al no detectar que se presiona un pulsador siempre ingresaban a las sentencias “ELSE” en donde se encendían los leds y por eso parecía que los leds se encontraban todo el tiempo encendidos, y como tu condición es que se ejecute una acción solo cuando se presione un pulsador cambie los “IF” por “WHILE” para que se quede ejecutando la acción mientras se presiona el botón ejecutada la misma se pondrá todo en cero y listo. Como no se explica bien en tu comentario para que empleas los leds asumo que son para indicar el estado de cada motor. Espero te sirva de ayuda, dejo el código y la simulación en formato rar bye :).

#include <16f877.h>
#byte LEDS=0x07//CONFIGURO TODO EL BYTE PARA LOS LEDS EN EL PUERTO C
#byte MOTORES=0x08//CONFIGURO TODO EL BYTE PARA LOS MOTORES EN EL PUERTO D

#bit led_amarillo_1=0x07.0//PARA CONECTAR UN SOLO LED EN EL PIN RC7.0
#bit led_amarillo_2=0x07.1//PARA CONECTAR UN SOLO LED EN EL PIN RC7.1
#bit led_rojo_1=0x07.2//PARA CONECTAR UN SOLO LED EN EL PIN RC7.2
#bit led_rojo_2=0x07.3//PARA CONECTAR UN SOLO LED EN EL PIN RC7.3
#bit pulsador_A=0x05.0//PARA CONECTAR EL PULSADOR A EN EL PIN RA0
#bit pulsador_B=0x05.1//PARA CONECTAR EL PULSADOR B EN EL PIN RA1
#bit pulsador_C=0x05.2//PARA CONECTAR EL PULSADOR C EN EL PIN RA2
#bit pulsador_D=0x05.3//PARA CONECTAR EL PULSADOR D EN EL PIN RA3
#bit MOTOR1_DER=0x08.0//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD0
#bit MOTOR1_IZQ=0x08.1//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD1

#bit MOTOR2_DER=0x08.2//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD2
#bit MOTOR2_IZQ=0x08.3//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD3

#byte tris_led=0x87//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS LED
#byte tris_pulsador=0x85//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS PULSADORES
#byte tris_motores=0x88//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS MOTORES

void main()
{
tris_pulsador=0b11111111;//CONFIGURO LOS PULSADORES COMO ENTRADAS
tris_led=0b11110000;//CONFIGURO LOS LED COMO SALIDAS
tris_motores=0b11110000;//CONFIGURO LOS MOTORES COMO SALIDAS
leds=0x00;//COMIENZAN LOS LEDS APAGADOS
motores=0x00;//COMIENZAN LOS MOTORES APAGADOS

while(1)
   {
      while(pulsador_A==1) //SI PULSADOR A SE MANTIENE EN ESTE CICLO
      {
         led_amarillo_1=1; //SE ENCIENDEN LOS LEDS INDICADORES
         led_amarillo_2=1;
         MOTOR1_DER=1;  //LOS MOTORES 1 Y 2 DERECHA SE ACTIVAN
         MOTOR2_DER=1;
      };
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS

      while(pulsador_B==1)//SI SE MANTIENE PRESIONADO B
      {
         led_rojo_1=1;
         led_rojo_2=1;  //LOS MOTORES  Y 2 IZQUIERDA SE ACTIVAN PARA QUE EL CARRITO RETROCEDA
         MOTOR1_IZQ=1;
         MOTOR2_IZQ=1;
      }
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
     
      while(pulsador_C==1)//AQUÍ ES DONDE QUIERO QUE AL PRESIONAR C, EL MOTOR 1 DERECHA SE ACTIVE SOLAMENTE
      {
         led_amarillo_1=1; //SE ACTIVA EL LED QUE INDICA QUE EL MOTOR 1 DERECHA SE ENCIENDE;
         MOTOR1_DER=1;     //SE ACTIVA EL MOTOR
      };
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
     
      while(pulsador_D==1)//AQUÍ ES DONDE QUIERO QUE AL PRESIONAR C, EL MOTOR 1 DERECHA SE ACTIVE SOLAMENTE
      {
         led_amarillo_2=1; //SE ACTIVA EL LED QUE INDICA QUE EL MOTOR 1 DERECHA SE ENCIENDE;
         MOTOR2_DER=1;     //SE ACTIVA EL MOTOR
      };
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS

   };
}


Desconectado jhonjz

  • PIC10
  • *
  • Mensajes: 19
Re: Programación de 2 motores
« Respuesta #2 en: 05 de Noviembre de 2013, 20:57:07 »
Saludos, bueno para comenzar me parece que el micro que estas empleando es demasiado para la aplicación en cuestión, podrías emplear uno más pequeño y barato. Por otro lado en la simulación te falto emplear resistencias en los pulsadores y colocar el pin EN1 y EN2 del l293d a nivel alto, esto te evitara problemas al momento de realizar el montaje real, las resistencias fueron colocadas de modo que cumplan con las condiciones de tu programa.

En cuanto al programa el motivo por el cual mostraba los leds encendidos todo el tiempo se debe a tus sentencias “ELSE”, el pic al no detectar que se presiona un pulsador siempre ingresaban a las sentencias “ELSE” en donde se encendían los leds y por eso parecía que los leds se encontraban todo el tiempo encendidos, y como tu condición es que se ejecute una acción solo cuando se presione un pulsador cambie los “IF” por “WHILE” para que se quede ejecutando la acción mientras se presiona el botón ejecutada la misma se pondrá todo en cero y listo. Como no se explica bien en tu comentario para que empleas los leds asumo que son para indicar el estado de cada motor. Espero te sirva de ayuda, dejo el código y la simulación en formato rar bye :).

#include <16f877.h>
#byte LEDS=0x07//CONFIGURO TODO EL BYTE PARA LOS LEDS EN EL PUERTO C
#byte MOTORES=0x08//CONFIGURO TODO EL BYTE PARA LOS MOTORES EN EL PUERTO D

#bit led_amarillo_1=0x07.0//PARA CONECTAR UN SOLO LED EN EL PIN RC7.0
#bit led_amarillo_2=0x07.1//PARA CONECTAR UN SOLO LED EN EL PIN RC7.1
#bit led_rojo_1=0x07.2//PARA CONECTAR UN SOLO LED EN EL PIN RC7.2
#bit led_rojo_2=0x07.3//PARA CONECTAR UN SOLO LED EN EL PIN RC7.3
#bit pulsador_A=0x05.0//PARA CONECTAR EL PULSADOR A EN EL PIN RA0
#bit pulsador_B=0x05.1//PARA CONECTAR EL PULSADOR B EN EL PIN RA1
#bit pulsador_C=0x05.2//PARA CONECTAR EL PULSADOR C EN EL PIN RA2
#bit pulsador_D=0x05.3//PARA CONECTAR EL PULSADOR D EN EL PIN RA3
#bit MOTOR1_DER=0x08.0//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD0
#bit MOTOR1_IZQ=0x08.1//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD1

#bit MOTOR2_DER=0x08.2//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD2
#bit MOTOR2_IZQ=0x08.3//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD3

#byte tris_led=0x87//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS LED
#byte tris_pulsador=0x85//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS PULSADORES
#byte tris_motores=0x88//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS MOTORES

void main()
{
tris_pulsador=0b11111111;//CONFIGURO LOS PULSADORES COMO ENTRADAS
tris_led=0b11110000;//CONFIGURO LOS LED COMO SALIDAS
tris_motores=0b11110000;//CONFIGURO LOS MOTORES COMO SALIDAS
leds=0x00;//COMIENZAN LOS LEDS APAGADOS
motores=0x00;//COMIENZAN LOS MOTORES APAGADOS

while(1)
   {
      while(pulsador_A==1) //SI PULSADOR A SE MANTIENE EN ESTE CICLO
      {
         led_amarillo_1=1; //SE ENCIENDEN LOS LEDS INDICADORES
         led_amarillo_2=1;
         MOTOR1_DER=1;  //LOS MOTORES 1 Y 2 DERECHA SE ACTIVAN
         MOTOR2_DER=1;
      };
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS

      while(pulsador_B==1)//SI SE MANTIENE PRESIONADO B
      {
         led_rojo_1=1;
         led_rojo_2=1;  //LOS MOTORES  Y 2 IZQUIERDA SE ACTIVAN PARA QUE EL CARRITO RETROCEDA
         MOTOR1_IZQ=1;
         MOTOR2_IZQ=1;
      }
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
     
      while(pulsador_C==1)//AQUÍ ES DONDE QUIERO QUE AL PRESIONAR C, EL MOTOR 1 DERECHA SE ACTIVE SOLAMENTE
      {
         led_amarillo_1=1; //SE ACTIVA EL LED QUE INDICA QUE EL MOTOR 1 DERECHA SE ENCIENDE;
         MOTOR1_DER=1;     //SE ACTIVA EL MOTOR
      };
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
     
      while(pulsador_D==1)//AQUÍ ES DONDE QUIERO QUE AL PRESIONAR C, EL MOTOR 1 DERECHA SE ACTIVE SOLAMENTE
      {
         led_amarillo_2=1; //SE ACTIVA EL LED QUE INDICA QUE EL MOTOR 1 DERECHA SE ENCIENDE;
         MOTOR2_DER=1;     //SE ACTIVA EL MOTOR
      };
      leds=0x00;     //SI SE ENCENDERÍAN LOS LEDS POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS
      motores=0x00;  //SI SE ENCENDERÍAN LOS MOTORES POR LA OPERACIÓN ANTERIOR SERÁN APAGADOS

   };
}




Hola Zar, primero quiero agradecer tu inmenso aporte, has dado precisamente en el clavo.
La razón por la que siempre dejaba los leds encendidos es porque precisamente quiero que se prendan una vez que alimente el pic y se mantengan así todo el tiempo, aunque como tú lo planteas también me parece bien, no he revisado tu código aún, solo simulé la parte donde tenía problemas y es exactamente lo que quería, eres un genio, salduos desde Colombia.

Desconectado ZAR

  • PIC10
  • *
  • Mensajes: 10
Re: Programación de 2 motores
« Respuesta #3 en: 06 de Noviembre de 2013, 00:51:16 »
Me alegra que te pudiera ser de ayuda, te recomendaría emplear un pic más pequeño como el PIC16F84A que es más barato y fácil de encontrar funcionara bien para la cantidad de entradas y salidas que requieres, si te interesa te envió el programa y la simulación saludos. :)
« Última modificación: 06 de Noviembre de 2013, 01:00:37 por ZAR »

Desconectado jhonjz

  • PIC10
  • *
  • Mensajes: 19
Re: Programación de 2 motores
« Respuesta #4 en: 06 de Noviembre de 2013, 20:47:56 »
Hola Zar.
Sí, tienes razón, aparentemente lo que tengo no justifica utilizar un pic tan grande como el 16f877A, sin embargo, es porque tengo pensado conectar igualmente un LCD 2x16 en el puerto B, que me muetre cada una de las acciones que se ejecuten. Muchas gracias de nuevo por tu aporte.

Desconectado ZAR

  • PIC10
  • *
  • Mensajes: 10
Re: Programación de 2 motores
« Respuesta #5 en: 07 de Noviembre de 2013, 13:08:21 »
Me parece muy interesante, espero ver tus progresos éxitos, saludos. :-/ :-/


 

anything