Autor Tema: Iluminar escaleras de manera progresiva  (Leído 52410 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado polcor

  • PIC10
  • *
  • Mensajes: 2
Re: Iluminar escaleras de manera progresiva
« Respuesta #75 en: 01 de Junio de 2010, 22:59:29 »
buenas.. soy nuevo tb el en tema de los pic's y aplaudo a leeboy por la idea.. el proyecto está muy bueno.. a un grupo de compañeros nos pareció muy interesante y estamos queriendo realizar el mismo cto pero con un 16F84A ya que es el mas comun en el mercado y el mas barato.. :D :D y quisiera saber si es factible realizar este proyecto con dicho PIC..

desde ya.. muchisimas gracias..

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Iluminar escaleras de manera progresiva
« Respuesta #76 en: 01 de Junio de 2010, 23:41:01 »
Si es muy viable usar ese pic, pero para usarlo debes saber cómo y hay que estudiar un poquito el datasheet del micro, con eso será suficiente.
     

Desconectado polcor

  • PIC10
  • *
  • Mensajes: 2
Re: Iluminar escaleras de manera progresiva
« Respuesta #77 en: 01 de Junio de 2010, 23:46:08 »
el datasheet ya lo estudie un poco.. mas bien para la programación en assembler es lo encuentro los problemas.. estoy utilizando el MPLAB IDE v6.61.. el programa que fue publicado ya está en C. existe algun conversor de C a Assembler..?? solo por curiosidad.. o si alguien me puede facilitar las rutinas para el encendido secuencial de los led en Assembler les estaría agradecido. ya que la parte de hardware ya lo tengo terminado.

Gracias..
« Última modificación: 02 de Junio de 2010, 00:43:37 por polcor »

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Iluminar escaleras de manera progresiva
« Respuesta #78 en: 02 de Junio de 2010, 00:49:11 »
Bueno, yo no soy un experto en asm, así que te paso dónde hay ejemplos:

http://www.todopic.com.ar/foros/index.php?topic=12345.0

hay muchos ejemplos de juegos con luces leds...
     

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Iluminar escaleras de manera progresiva
« Respuesta #79 en: 08 de Junio de 2010, 04:33:26 »
Muy bueno el proyecto.

Pero para sensar que la persona esta a punto de subir o bajar las escaleras con que lo harian? Algun sensor IR o de ultrasonido o que cosa? Porque con un boton... donde iria eso? No lo veo bien. Este punto del sensado es el que estoy pensando ahorita, por lo demas.. lo aria lo mas barato posible: un solo pic con varias IOs y PWM por software.

Exitos.
Salu2

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Iluminar escaleras de manera progresiva
« Respuesta #80 en: 11 de Junio de 2010, 12:22:15 »
Busco, pero no encuentro cual me convendria mejor.. me refiero al sensor que sensa (valga la redundancia) cuando la persona esta apunto de bajar o subir las escalres, o mejor dicho, esta a punto de pisar el primer o ultimo escalon de la escalera.

Creo que lo mejor es con un sensor IR, como el IS471F, o quiza con ultrasonido. El problema esque nunca he usado ninguno de los dos y nose que modelo es el que debo de usar... Lo que necesito es obvio para este proyecto: un sensor (ya sea IR o de ultrasonido u otro) que tenga una distancia minima de medio metro aproximadamente supongo para que detecte cuando una persona pasa por alli cuando intenta bajar/subir las escaleras.

Bueno, gracias por la informacion que me puedan brindar sobre estos sensores.
Salu2.

Desconectado Ferblitz90

  • PIC10
  • *
  • Mensajes: 3
Re: Iluminar escaleras de manera progresiva
« Respuesta #81 en: 16 de Junio de 2010, 05:15:14 »
Hola pues te dire que si tienes problemas para controlar una cantidad de leds yo tengo la solucion para ti con un puerto de 8 bits puedes controlar hasta 56 leds de la siguiente manera con el circuito que te pasare en proteus y para especificar el led que exactamente quieres prender necesitas hacer lo siguiente

-Dos Tablas
             1. Una de ellas tiene los 1 y ceros correspondientes del puerto a usar eso no hay problema.
             2. La otra tabla consiste en configurar el puerto a manera que los bits que no estas usando para prender un led esten en alta impedancia.

Esto se logra por ejemplo para prender el primer led de mi circuito tienes que mandar un 1 al puertoB,0 y un cero al puertoB,1 pero antes de mandar unos y ceros debes configurar las impedancias esto quiere decir configurar el puertoB a tal manera que el  puertoB,0 y puertoB,1 sean salidas y todos los demas bits del puertoB sean entradas asi de esta manera no se activaran los demas leds analiza el circuito y si tienes dudas con mucho gusto las aclaro.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Iluminar escaleras de manera progresiva
« Respuesta #82 en: 16 de Junio de 2010, 13:28:47 »
Para los LEDs no tengo problemas y ese circuito que propones seria muy complicado a la hora de la instalacion. Esperaba se pueda hacer con un MUX o algun integrado parecido, mientras lo estoy haciendo directamente con un PIC de 28 pines. Tambien, para la parte de la potencia, lo hago con puros 3904 pero queria preguntar si conocen algun integrado que tenga consigo quiza 8 de estos transistores internamente y me ahora tanto trabajo.

Por otro lado, ya resolvi el tema del sensado haciendolo con IR.


Gracias de todas formas.
Un saludo.

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Iluminar escaleras de manera progresiva
« Respuesta #83 en: 29 de Junio de 2010, 07:57:57 »
Buenas.

Siguiendo con la idea de utilizar  PIC12F en cada punto de luz de la escalera, me he puesto a implementar un sencillo protocolo serie unidireccional ( implementar I2C como slave era complejillo). El protocolo usa 2 hilos : Datos y Reloj y permite enviar comandos de 8 bits desde un PIC master ( que sera un PIC16F o un PIC18F) hacia los puntos de luz ( que serán PIC12F).

Como ahora puedo enviar comandos y solo necesito 4 hilos ( Reloj, Datos, Vcc y Masa) , me quedan 4 pins libres en el PIC12F por lo que he pensado que en vez de utilizar LED blancos en cada punto de luz puedo usar LED RGB de potencia (3W), no hay mucha diferencia de precio... :) :) y conseguir efectos de color en la escalera mola :P :P

Ahora tengo que ver como controlar de manera eficiente, via PWM ese LED RGB desde cada PIC12F, si teneis algo hecho os agradecería la ayuda.


Por ahora lo tengo funcionando en Proteus para probar el protocolo ( que por cierto lo he llamado PUS, Protocolo Unidireccional Serie, je,je ), cuando este más maduro pondré cositas...


Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Iluminar escaleras de manera progresiva
« Respuesta #85 en: 29 de Junio de 2010, 09:50:25 »
Gracias Nocturno, el esquema software que estaba usando era ese: usar el timer para ir descontando el valor de cada PWM.

La pregunta iba dirigida más hacia el HW, ya que atacar el LED de 3W desde el PIC no me vale, y estaba considerando usar un MOSFET como driver para cada LED; pero no sé si habrá una solución mejor usando una fuente de corriente controlable digitalmente, por ejemplo, aunque tampoco quiero complicar mucho el diseño por precio y espacio.

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Iluminar escaleras de manera progresiva
« Respuesta #86 en: 30 de Junio de 2010, 06:07:56 »
Hola de nuevo, os pongo código del master PUS:

Código: [Seleccionar]
//++++++++++++++++++++++++++++++++++++++++++++++++++++++//
#include <16F628a.h>
#FUSES   INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD
#use     delay(clock=4000000)
//#use     rs232(baud=19200,rcv=PIN_A3,BITS=8,sample_early)
#zero_ram


//+++++++++++++++++++++++++++++++++++++++++//
#define LED1     PIN_A0
#define LED2     PIN_A1
#define SW1 PIN_A4
#define SW2      PIN_A5

#define PUS_PC   PIN_B0
#define PUS_PD PIN_B1
#define IN_SEN PIN_B2
//+++++++++++++++++++++++++++++++++++++++++//

#define CMD_ON    0x01
#define CMD_OFF  0x02
#define CMD_FADER_FAST  0x03
#define CMD_FADER_SLOW  0x04
#define CMD_INC_FAST  0x05
#define CMD_INC_SLOW  0x06
#define CMD_DEC_FAST  0x07
#define CMD_DEC_SLOW  0x08


//+++++++++++++++++++++++++++++++++++++++++
//
//
// Protocolo Unidireccional Serie (PUS) ;-)
//
//  Dos Lineas:
//  PD : Dato
//  PC : Reloj
//
//  Dato se lee en flanco de subida PD y debe permanecer
//  hasta siguiente flanco de bajada, si no Error o START.
//
//  Condicion START:
// PD = 0 en flanco de subida de PC.
//      PD = 1 en siguiente flanco de bajada de PC.
//
//       ____      ____      ____      ____
//    __|    |____|    |____|    |____|    |____    PC
//
//         ____   _______   _______
//    ____|    |_|       |_|       |___________|    PD
//
//           ^
//         START 
//                   1        1          0
//  Formato paquete
//  A3 A2 A1 A0 C3 C2 C1 C0
//
//  A : Direccion ( 15  posibles, 0 reservado)
//  C : Comando   ( 15  posibles, 0 reservado)
//
////+++++++++++++++++++++++++++++++++++++++++
//
void PUS_write(int8 add,int8 cmd);

////+++++++++++++++++++++++++++++++++++++++++
////+++++++++++++++++++++++++++++++++++++++++
void main(){

  setup_comparator(NC_NC_NC_NC);     //Comparador deshabilitado
  output_A(0x00);                    //Latch
  set_tris_A(0B0110000);             //Input A4 y A5
  output_B(0x00);                    //Latch
  set_tris_B(0B0000100);    //Input B2

//---------  PROGRAMA PRINCIPAL   -----------------------------\\\\

// Prueba de envio ON/OFFF
  while (1) {

PUS_write (0x01,CMD_ON);
PUS_write (0x02,CMD_OFF);
delay_ms(1000);

PUS_write (0x01,CMD_OFF);
PUS_write (0x02,CMD_ON);
delay_ms(1000);

  }//end while
 
 
}//end main
 
 
////+++++++++++++++++++++++++++++++++++++++++

#define PERIODO_BIT_US  500
void PUS_write(int8 add,int8 cmd)
{
int8 dato, nbits, mask;

dato = (add << 4) & 0xF0;
dato |= (cmd & 0x0F);

output_low(PUS_PD);
output_low(PUS_PC);

// Condicion START
delay_us (2 * PERIODO_BIT_US);
output_high(PUS_PC);
delay_us (PERIODO_BIT_US / 2);
output_high(PUS_PD);
delay_us (PERIODO_BIT_US / 2);
output_low(PUS_PC);

// Envio de los bits
mask = 0x80;
for (nbits = 0; nbits < 8; nbits++)
{
delay_us (PERIODO_BIT_US / 2);
if ((dato & mask) > 0)
output_high(PUS_PD);
else
output_low(PUS_PD);
delay_us (PERIODO_BIT_US / 2);

output_high(PUS_PC);
delay_us (PERIODO_BIT_US);
output_low(PUS_PC);

mask = mask >> 1;
}
delay_us (PERIODO_BIT_US);
output_low(PUS_PD);
delay_us (PERIODO_BIT_US);

// TODO : Envio de paridad

}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++//
 
 

 


Y ahora el de de un nodo receptor:

Código: [Seleccionar]
//++++++++++++++++++++++++++++++++++++++++++++++++++++++//
#include <12F629.h>
#FUSES   INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD
#use     delay(clock=4M)
#use     fast_io(A)
#zero_ram

//+++++++++++++++++++++++++++++++++++++++++//
#define LED      PIN_A0
#define PUS_PC   PIN_A3
#define PUS_PD PIN_A4
//+++++++++++++++++++++++++++++++++++++++++//
#define MAX_LED 100

#define CMD_ON  0x01
#define CMD_OFF  0x02
#define CMD_FADER_FAST  0x03
#define CMD_FADER_SLOW  0x04
#define CMD_INC_FAST  0x05
#define CMD_INC_SLOW  0x06
#define CMD_DEC_FAST  0x07
#define CMD_DEC_SLOW  0x08

char dato_rx = 0;
volatile int8  pwm_act_led = 0;
int8  pwm_led = 0;

// Variable control seceuncia de inicio
//
#define SEQ_INIT_START 0
#define SEQ_INIT_F1 1
#define SEQ_INIT_F2 2
#define SEQ_INIT_F3 3
#define SEQ_INIT_END 4

int16 cont_seq_inicio = 0;
int8 seq_inicio = SEQ_INIT_START;
int8 comando,address;

int8 fader(int8 speed,int1 inicio );

//+++++++++++++++++++++++++++++++++++++++++
//
//
// Protocolo Unidireccional Serie (PUS) ;-)
//
//  Dos Lineas:
//  PD : Dato
//  PC : Reloj
//
//  Dato se lee en flanco de subida PD y debe permanecer
//  hasta siguiente flanco de bajada, si no Error o START.
//
//  Condicion START:
// PD = 0 en flanco de subida de PC.
//      PD = 1 en siguiente flanco de bajada de PC.
//
//       ____      ____      ____      ____
//    __|    |____|    |____|    |____|    |____    PC
//
//         ____   _______   _______
//    ____|    |_|       |_|       |___________|    PD
//
//           ^
//         START 
//                   1        1          0
//  Formato paquete
//  A3 A2 A1 A0 C3 C2 C1 C0
//
//  A : Direccion ( 15  posibles, 0 reservado)
//  C : Comando   ( 15  posibles, 0 reservado)
//
////+++++++++++++++++++++++++++++++++++++++++
//
int8 PUS_dato = 0;

#define PUS_ADDR 0x01

////+++++++++++++++++++++++++++++++++++++++++
////+++++++++++++++++++++++++++++++++++++++++
void main(){

  setup_comparator(NC_NC_NC_NC);      //Comparador deshabilitado
  output_A(0x00);                     //Latch
  set_tris_A(0B011000);               //MCLR=A3= RX input Int_RA3 on Change
  enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
  enable_interrupts(INT_TIMER1);      //Habilitamos interrupcion desborde TMR1
 
// Timer1 para conseguir un tick cada 100us @ 4Mhz
set_timer1(65436);        // 65536-(.000100/(4/4000000))
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  enable_interrupts(INT_RA3);         //Habilitamos interrupcion por cambio de estado
                                      //en pin RA3
//---------  PROGRAMA PRINCIPAL   -----------------------------\\\\

  //while (fader(100,1)) delay_ms(200);

  while (1) {

// 
// Estamos en sequencia de inicio
//
if (seq_inicio != SEQ_INIT_END)
{
switch (seq_inicio)
{
case SEQ_INIT_START : pwm_led = MAX_LED; break;
case SEQ_INIT_F1 : pwm_led = MAX_LED/2; break;
case SEQ_INIT_F2 : pwm_led = MAX_LED/4; break;
case SEQ_INIT_F3 : pwm_led = 0; break;
}

if (cont_seq_inicio++ > 10000)
{
cont_seq_inicio = 0;
seq_inicio++;
}
}
else
//
// Ejecucion normal : chequeamos dato recibido por PUS
//

dato_rx = PUS_dato;
PUS_dato = 0;

if (dato_rx != 0)
{
comando = dato_rx & 0x0F;
address = (dato_rx >> 4) & 0x0F;
if (address == PUS_ADDR)
{
switch (comando)
{
case CMD_OFF : pwm_led = 0; break;
case CMD_ON  : pwm_led = MAX_LED; break;
}
}
   
dato_rx = 0;
  }//if rx             
  }//end while
 
 
}//end main


// ++++++++++++++++++++++++++++++++++++++++++++++++

#define MAX_LED_FADER 8

const int8 led_valor[MAX_LED_FADER] = {0,10,20,30,50,70,80,100};

#define FADER_STOP  0
#define FADER_UP    1
#define FADER_DOWN  2

int8 fase_fader = FADER_STOP;

int8   idx_valor;
int8   speed_fader;

//
// fader
//
// speed : velocidad de la secuencia "fader"
// inicio : flag arranque secuencia
//
// devuelve 0 al finalizar el ciclode "fader", 1 en caso contrario.
//

int8 fader(int8 speed,int1 inicio )
{


    if ((fase_fader == FADER_STOP) && (inicio))
    {
        pwm_led = 0;   
        speed_fader= speed;
    fase_fader = FADER_UP;
    idx_valor  = 0;
    }

 
    if (fase_fader == FADER_UP )
    {
        pwm_led = led_valor[idx_valor++];
       
        if (idx_valor > MAX_LED_FADER)
        {       
        fase_fader = FADER_DOWN;
        idx_valor = MAX_LED_FADER-1;
        }
    }

    if (fase_fader == FADER_DOWN)
    {
        if (idx_valor == 0)
        {
        fase_fader = FADER_STOP;
        }
        else
        {
      pwm_led = led_valor[idx_valor--];           
        }
    }

    return (fase_fader != FADER_STOP);
   
}
 
 
 
//+++++++++++++++   INTERRUPCIONES   +++++++++++++++++++//
#INT_TIMER1
void desborde_TMR1(){        //Interrupcion por desborde de timer cada 100 us

//
// Control PWM del LED
//
pwm_act_led++;
if (pwm_act_led > pwm_led)
        output_low(LED);
else
output_high(LED);

// El ciclo se repite cada 100 * 100us = 10ms. (100Hz)
if (pwm_act_led > MAX_LED) pwm_act_led = 0;

set_timer1(65436);        // 65536-(.000100/(4/4000000))

} // interrupcion TMR1


//
// Gestion del protocolo PUS por interrupcion
//

#define PUS_IDLE  0
#define PUS_START 1
#define PUS_RX    2

int8 PUS_temp = 0;
int8 PUS_nbit = 0;
int8 PUS_status = PUS_IDLE;
int1 PUS_bit = 0;
int8 PUS_error_data  = 0;
int8 PUS_error_start = 0;

#INT_RA
void PUS_recepcion(){        //Interrupcion por cambio de estado en pines

if (input_state(PUS_PC) == 1) // Flanco subida PC
{
switch(PUS_status)
{
case PUS_IDLE  :
// Chequeo inicio de condicion de START
if (input_state(PUS_PD) == 0)
{
PUS_status = PUS_START;
}
break;

case PUS_START :  break;

case PUS_RX    :
// detectamos inicio de bit.
PUS_bit = input_state(PUS_PD);
break;
}


}
else // Flando bajada PC
{
switch(PUS_status)
{
case PUS_IDLE  : break;

case PUS_START :
// Chequeo de condicion de START completa
if (input_state(PUS_PD) == 1)
{
PUS_status = PUS_RX;
PUS_temp  = 0;
}
else // ERROR, reinicio
{
PUS_status = PUS_IDLE;
PUS_error_start++;
}
break;

case PUS_RX:
// Condicion de START ya detectada
// Bit en PD se ha mantenido, guardamos
if (PUS_bit == input_state(PUS_PD))
{

PUS_temp <<= 1;
if (PUS_bit)
PUS_temp |= 0x01;
else
PUS_temp &= 0xFE;

PUS_nbit++;

// Dato completo recibido ?
if (PUS_nbit > 7)
{
PUS_nbit = 0;
PUS_status= PUS_IDLE;
PUS_dato  = PUS_temp;
PUS_temp = 0;
}
}
else // ERROR, reinicio dato
{
PUS_dato  = 0;
PUS_nbit  = 0;
PUS_status= PUS_IDLE;
PUS_error_data++;
}
break;
}

}


 
} //int_ra3
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++//
 
 

 



Saludos.

Desconectado wolfman77

  • PIC12
  • **
  • Mensajes: 82
    • Dos en la ruta
Re: Iluminar escaleras de manera progresiva
« Respuesta #87 en: 06 de Julio de 2010, 16:28:10 »
Hola a todos!
Yo tambien me emocione con este proyecto y empece por mi lado con lo poco que se a ver que me salia, mas o menos tiene color, lo hice en el PSI y lo simule en proteus, coloque pulsadores para subir y bajar, pero se pone un par de infrarrojos y solucionamos ese tema.

El asunto de hacerlo modular no es nada complicado, habia pensado en hacerlo con 5 cables por modulo, 2 de alimentacion, uno de entrada y dos de salida.
Serian dos de salida por que hay que controlar cuando se sube o se baja la escalera, pero es posible reducirlo a un solo cablecito

Les dejo la simulacion por si alguien lo quiere probar, el codigo si quieren lo subo, pero es asquerosamente horrible, tengo que probar un poco mas con shifleft y shiftright, y si me sale lo que tengo en mente me ahorro una banda de codigo.

Saludos!

Martin
Volviendo al mundo de los PIC....

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Iluminar escaleras de manera progresiva
« Respuesta #88 en: 10 de Julio de 2010, 14:21:01 »
Disculpad, pero para conseguir un efecto de encendido o apagado progresivo de los leds no se hace con condensadores, sino mediante la modificación del % duty del PWM.


Nocturno, y, generalmente, a que frecuencia debe estar el PWM? O cual es lo mas recomendable?


Salu2.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Iluminar escaleras de manera progresiva
« Respuesta #89 en: 10 de Julio de 2010, 14:23:22 »
Pues dependerá del tiempo de respuesta del led, la verdad es que no sé responderte a esa pregunta con un argumento sólido. Yo siempre pongo varios KHz pero es probable que exista una frecuencia idónea que venga dada por el tipo de led.


 

anything