TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: el_yind en 24 de Mayo de 2011, 09:56:25
-
Bueno para empezar quiero aclarar que yo no soy electronico, soy más informático y me mande con este proyecto que es para controlar unos motores paso a paso para unas cortinas electricas que me estoy armando.
Yo realmente mucho no entiendo de electronica pero mirando un par de ejemplos y cosas llegue a armar "el circuito que necesito"
Básicamente uni lo que me parecio y reze de que ande, pero como era de imaginar no anduvo xD, el problema básico es que lo conecto al puerto USB y no me aparece nada en la PC, tengo windows 7, pero creo que tendría que detectar el dispositivo por lo menos, (si no es asi porfavor diganme como hay que hacer para que detecte el pic y programarlo)
La cuestion es que arme el siguiente esquema en base a otro que habia visto para 1 motor paso a paso con un PIC18F4550 pero como no pude conseguir ese pic lo adapte como pude con un PIC18F2550 y me quedo una cosa asi:
(http://www.aoyind.com/circuito.gif)
Ahora si alguien me pudiese guiar un poco en esto y me ayudara a saber que es lo que está mal o pq no lo detecta lo agradeceria enormemente.
La función en sí del circuito es la siguiente:
El chip va a tener un soft para que desde la pc le envie unos comandos que activen los motores para las 2 cortinas, de modo que den x cantidad de vueltas para cumplir con el recorrido necesario para subirlas o bajarlas, o pararlas en el medio, cada cortina funciona de modo independiente.
Gracias!
-
con un 16f876 tendrias de sobra.y es mas facil de estudiar.ademas no veo muy practico usar usb para controlar los motores.seria mas facil por rs232.y tendrias
una opcion facil de adaptar un modulo bluetooth.que salen por unos 12€.asi no tendrias que poner el PC junto con tu circuito.ya que el usb tiene un limite a la hora de poner un cable demasiado largo.
-
con un 16f876 tendrias de sobra.y es mas facil de estudiar.ademas no veo muy practico usar usb para controlar los motores.seria mas facil por rs232.y tendrias
una opcion facil de adaptar un modulo bluetooth.que salen por unos 12€.asi no tendrias que poner el PC junto con tu circuito.ya que el usb tiene un limite a la hora de poner un cable demasiado largo.
Que tal, gracias por tu respuesta, te comento que el PIC 18f2550 ya lo tengo, y no importaría usar un cable usb pq esta a 1 metro lo necesito manejar, si es mas facil con ese chip pues por ahi me convendría hacer pero mi problema reside principalmente en que yo no se electronica entonces no se armar un circuito de 0, el que publique en el post es en base a unos ejemplos q vi y los modifique como me parecio por eso no se si funciona o no :/ yo ya lo intente armar pero al conectarlo a la pc no pasa nada, no me detecta nada.
Asi que eso nomas, si hay una forma mas simple de controlar los 2 motorcitos seria buenisimo
-
Con que lenguaje estas programando? Tienes un programador? Porque leyendo esto "pero creo que tendría que detectar el dispositivo por lo menos, (si no es asi porfavor diganme como hay que hacer para que detecte el pic y programarlo)" da la sensación que no le has programado nada. O sea, necesitas un hardware adicional para programarlo.
Capaz que tu has visto la implementación de bootloader USB, pero igualmente se necesita programar un código especial en el microcontrolador para que sea detectado por la PC, con un programa especial enviar el Hex y que el mismo se programe.
Saludos!
-
Con que lenguaje estas programando? Tienes un programador? Porque leyendo esto "pero creo que tendría que detectar el dispositivo por lo menos, (si no es asi porfavor diganme como hay que hacer para que detecte el pic y programarlo)" da la sensación que no le has programado nada. O sea, necesitas un hardware adicional para programarlo.
Capaz que tu has visto la implementación de bootloader USB, pero igualmente se necesita programar un código especial en el microcontrolador para que sea detectado por la PC, con un programa especial enviar el Hex y que el mismo se programe.
Saludos!
:o, me acaba de tirar un dato alentador, aunq me haga quedar como un perejil jaja, si, yo compre el PIC y esta virgen, pense que al conectarlo al USB lo detectaba y del mismo modo se podía enviar el firmware. Ahora averiguo donde consigo el aparatito para mandarle el firmware y veo que tal, si llega a funcionar puede ser un muy buen dia :).
Por cierto, el circuito te parece que esta bien??
Gracias!
-
Casi, GND debe estar unido con V- de la fuente de 7V. De esa manera el microcontrolador solo es alimentado mediante USB.
Busca programador JDM, es por puerto serial y bastante sencillo de armar.
Saludos!
-
Hola.
Hace poco hice algo así con el siguiente esquema:
(http://img688.imageshack.us/img688/9295/schf.png)
El motor que use es unipolar.
Para que el PC lo detecte hay que programar el uC y quitarle su "virginidad" :D :D :D (no pude evitarlo)
Saludos
-
Para que el PC lo detecte hay que programar el uC y quitarle su "virginidad" :D :D :D (no pude evitarlo)
:mrgreen: Para que pierda la virginidad no alcanza metiendo el conector USB! :D :D :D
-
Tendrías ese esquema en más grande? porque no llego a leerlo bien.
Casi, GND debe estar unido con V- de la fuente de 7V. De esa manera el microcontrolador solo es alimentado mediante USB.
Busca programador JDM, es por puerto serial y bastante sencillo de armar.
Saludos!
Con respecto a lo que me decias del GND de la fuente de 7v, tiene que entrar al circuito con el GND del usb? pq esa fuente en teoria deberia alimentar solo a los motores.
Ahora estoy viendo como programarle todo, si bien se mucho de programacion, es dificil armar algo sin tener un modelo de pruebas xD
Otra duda que tenia es, esta bien usar los RB0 al RB7 para las salidas del circuito, osea la idea es usar del RB0 al RB3 para un motor y del RB4 al RB7 para el otro, y el chip haria la secuencia necesaria para que el motor gire, pero en mucho ejemplo que vi, usaban otros pines o no se como es que lo hacian.
Yo desde codigo puedo mandarle los pulsos a esos 8 pines tranquilamente?
Alguien que sepa un poco de la programacion de estos pics me podría dar una mano por chat? prometo no molestar demasiado :P, simplemente sacarme un par de dudas. Luego subire el codigo que arme, fotos del proyecto de las cortinas terminadas, un video en lo posible y cualquier información para que otro pueda armarse algo similar.
Porfa mandarme un mensaje privado con su mail y mensajeria que usa :).
Gracias a todos por la ayuda que me brindaron :)
-
Ya que estamos dejo un par de fotos del "circuito" que arme, quedo bastante desprolijo :( pero creo que todas las conexiones estan bien.
Ahora solo faltaría ponerle el firmware y rezar de que ande xD aunque me parece q a este paso es pedir demasiado.
(http://www.aoyind.com/placa1.jpg)
(http://www.aoyind.com/placa2.jpg)
(http://www.aoyind.com/placa3.jpg)
-
GND debes unirlos como comente anteriormente, es la referencia de 0V. Utilizar todo el puerto B para el control esta bien, no genera ningún problema.
Cualquier pregunta en el foro, yo personalmente no utilizo chat.
Saludos!
-
Bueno este es el code que pude armar para lo que quiero, lo raro es que cuando intento debuggearlo con el CCS me tira errores en cualquier cosa como por ejemplo:
Error 45 "cortinas.c" Line 59 (35,36) Subscript out of range
Error 43 "cortinas.c" Line 59 (36,37) Expecting a declaration
y varios asi..
APLICATION_HID.h
// Definición de constantes y funciones:
// Constantes varias:
#define USB_CONFIG_HID_TX_SIZE 32 // Definimos el tamaño del endpoint de salida.
#define USB_CONFIG_HID_RX_SIZE 32 // Definimos el tamaño del endpoint de entrada.
// Comandos de entrada.
#define SUBIR 0x0A
#define BAJAR 0x0B
#define PARAR 0x0C
#define MOTOR1 0x10
#define MOTOR2 0x20
// Definición de funciones:
void USB_debug();
void config_adcon2(void);
cortina.c
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
//#DEVICE ADC=8 // CAD a 8 bits, justificación a a la derecha.
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
//#DEVICE ADC=16 // CAD a 10 bits, justificación a a la izquierda.
#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por software.
// HSPLL: Utilizaremos un cristal de alta velocidad en conjunto con el PLL.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// NODEBUG: No utilizamos código para debugear.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler dividirá la frecuencia del cristal. para HS = 20Mhz, PLL = 5.
// con esto se obtiene: 20Mhz/5 = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Todo el Puerto B como I/O digitales.
// Usamos una frecuencia de trabajo de 48Mhz.
#use delay(clock=48000000)
//===========================================================================
//========================================================================================================
// Incluimos librerías utilizadas por la aplicación.
#include <pic18_usb.h> // Drivers's USB del PIC18F2550.
#include "C:\Users\Javier\Desktop\Cortina\Pro\APLICACION_HID.h" // Definición de funciones y hardware utilizado en el programa.
#include "C:\Users\Javier\Desktop\Cortina\Pro\Descriptor_easyHID.h" // Descriptores HID del proyecto.
#include <USB.c> // Funciones del USB.
// Usamos fast_io, en los puertos B
#use fast_io(b)
void USB_debug(){
//No puse ningun led en el circuito para ver si inicio todo bien :/
usb_wait_for_enumeration(); // Espera a ser enumerado por el host.
}
void config_adcon2(void) {
#asm
movlw 0b10111110
iorwf 0xFC0,1
#endasm
}
//===========================================================================================================
void main(void) // Función Principal.
{
// Variables globales.
int8 recibe[USB_EP1_RX_SIZE]; // Declaramos la variable recibe de 32 bytes.
int8 envia[USB_EP1_TX_SIZE]; // Declaramos la variable envía de 32 bytes.
int8 valorPWM1_H=0; // Valor del semiperiodo alto del PWM1.
int8 MotorR=0;
int8 Estado[2];
int16 Vueltas[2];
int16 Recorrido[2];
int8 Paso[2];
const int8 PasosMotor[8] = {0, 3, 2, 1, 4, 7, 6, 5}; //Los pines que se deben activar con los pasos de los 2 motores
// Configuraciones varias.
set_tris_b(0xF0); // Nibble bajo salidas, el alto entradas.
output_b(0x00); // Inicializamos las salidas a 0.
setup_adc_ports(AN0_TO_AN2); // Configura canales usados por el ADC.
setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad: relog\64.
config_ADCON2(); // Configuramos el ADCON2.
usb_init(); // Inicializamos el stack USB.
usb_task(); // Habilita el periferico usb y las interrupciones.
USB_debug(); // Nos muestra el estado de conección del USB.
Vueltas[0]=0;
Vueltas[1]=0;
Paso[0]=0;
Paso[1]=1;
while (TRUE) // Bucle infinito.
{
if(usb_enumerated()) // Si el dispositivo está configurado...
{
usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE); // Enviamos el paquete de datos por USB.
if (usb_kbhit(1)) // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
{
usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE); // En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....
MotorR=(recibe[1]==MOTOR1 ? 0 : 1);
if (recibe[0]==SUBIR) { // Si recibe comando de control de salidas...
Estado[MotorR] = 1;
Recorrido[MotorR] = recibe[2] * 256 + recibe[3]; //Genero un int16
} else if (recibe[0]==BAJAR) {
Estado[(MotorR] = 2;
Recorrido[MotorR] = recibe[2] * 256 + recibe[3]; //Genero un int16
} else if (recibe[0]==PARAR) {
Estado[MotorR] = 0;
}
}
for (MotorR=0; MotorR<2; MotorR++) {
if (Estado[MotorR] > 0) { //Si no es 0 se tiene que mover
if (Estado[MotorR]==1) {
if (Vueltas[MotorR] >= Recorrido[MotorR]) {
Estado[MotorR]=0;
} else {
Vueltas[MotorR]++;
}
} else if (Estado[MotorR]==2) {
if (Vueltas[MotorR] <= 0) {
Estado[MotorR]=0;
} else {
Vueltas[MotorR]--;
}
}
Paso[MotorR]=Vueltas[MotorR] % 4;
switch(MotorPasos[MotorR * 4 + Paso[MotorR]]) {
case 0 : output_high(PIN_B0); break;
case 1 : output_high(PIN_B1); break;
case 2 : output_high(PIN_B2); break;
case 3 : output_high(PIN_B3); break;
case 4 : output_high(PIN_B4); break;
case 5 : output_high(PIN_B5); break;
case 6 : output_high(PIN_B6); break;
case 7 : output_high(PIN_B7); break;
}
}
}
delay_ms(1); //Dejo una pausa mientras este activado
for (MotorR=0; MotorR<2; MotorR++) { //Desactivo los pines
if (Estado[MotorR] > 0) {
switch(MotorPasos[MotorR * 4 + Paso[MotorR]]) {
case 0 : output_low(PIN_B0); break;
case 1 : output_low(PIN_B1); break;
case 2 : output_low(PIN_B2); break;
case 3 : output_low(PIN_B3); break;
case 4 : output_low(PIN_B4); break;
case 5 : output_low(PIN_B5); break;
case 6 : output_low(PIN_B6); break;
case 7 : output_low(PIN_B7); break;
}
}
}
}
}
}
-
Y a exactamente a que linea seria, o sea, que es lo que hay en esa linea....
Saludos!
-
Y a exactamente a que linea seria, o sea, que es lo que hay en esa linea....
Saludos!
Por ejemplo en estas 2 lineas lo tira
int8 recibe[USB_EP1_RX_SIZE]; // Declaramos la variable recibe de 32 bytes.
int8 envia[USB_EP1_TX_SIZE]; // Declaramos la variable envía de 32 bytes.
aca me tira Expecting identifier set_tris_b(0xF0);
Vueltas[0]=0; aca me tira Expecting a (
Son errores medio raros..
-
Bueno reemplaze el USB_EP1_RX_SIZE y USB_EP1_TX_SIZE por 32.. y magicamente se compilo todo bien, ya genero el .hex
Ahora estaría bueno ver si puedo simular el circuito en algun programa para ver si anda bien el .hex antes de enviarlo al pic.. igual tengo que conseguir el aparatito para mandarle el firmware.
-
El problema era que definiste USB_CONFIG_HID_TX_SIZE y usabas USB_EP1_TX_SIZE :tongue:
Después, para probar podes utilizar el soft Proteus.
Saludos!