— Electronique et Programmation des LED’s —

Visits: 51

Regardez comment réussir un bon feu perpétuel dans vos maquettes, criant de réalisme…!Paper model; Papercraft; Maquette en papier; Maquette en carton; comment faire; how to; diy; star wars; jeep willys; Les plus belles maquettes en papier; real size

Osez la technologie… J’ai essayé d’être le plus complet possible

L’électronique et la programmation Pagode en papier carton; Les plus belles maquettes en papier; pagode Japonaise; japanese Pagoda; tie fighter, electronics led,command led; pic

 

L’éclairage de la Pagode est assuré par un microcontrôleur du type PIC 12F1822(40).

Deux led’s placée dans les alcôves illuminent les Buddah, leur intensité peut être réglée à l’aide d’un petit potentiomètre.

Le microcontrôleur gère également l’effet  »feu » au moyen de trois led’s, deux jaunes et un rouge.

L’effet est obtenu par un algorithme qui produit des différences d’intensités (par PWM).

Vous trouverez le programme C ici.

Le contrôle pourrait être fait à partir de n’importe quel µP, tel que l’Arduino, mais le choix a été fait en fonction de la place, en effet toute l’électronique tient sur une plaque à peine plus grande qu’un Arduino Nano.

Un exemple de carte « breadboard » est joint à la documentation.

Une simple alim 5V, du style chargeur USB, suffit à alimenter le tout.Les plus belles maquettes en papier; pagode Japonaise; japanese Pagoda; tie fighter, electronics led,command led; pic

Schema de Principe :

Paper model; Papercraft; Maquette en papier; Maquette en carton; comment faire; how to; diy; star wars; Les plus belles maquettes en papier; real size; Pagode en papier; Temple Japonais; Pic; Electronique; Electronics; Programma; software

Le Schema :

Paper model; Papercraft; Maquette en papier; Maquette en carton; comment faire; how to; diy; star wars; Les plus belles maquettes en papier; real size; Pagode en papier; Temple Japonais; Pic; Electronique; Electronics; Programma; software

Le Circuit imprimé :

Paper model; Papercraft; Maquette en papier; Maquette en carton; comment faire; how to; diy; star wars; Les plus belles maquettes en papier; real size; Pagode en papier; Temple Japonais; Pic; Electronique; Electronics; Programma; software

Video’s :

 

 

Le Programme :

/*
* File: Feu_camp.c
* Author: Erwin
*
* Created on 20 mai 2019
*
*/

// PIC12F1822 Configuration Bit Settings

// ‘C’ source line config statements

// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection
#pragma config WDTE = OFF // Watchdog Timer Enable
#pragma config PWRTE = OFF // Power-up Timer Enable
#pragma config MCLRE = OFF // MCLR Pin Function Select
#pragma config CP = OFF // Flash Program Memory Code Protection
#pragma config CPD = OFF // Data Memory Code Protection
#pragma config BOREN = ON // Brown-out Reset Enable
#pragma config CLKOUTEN = OFF // Clock Out Enable
#pragma config IESO = OFF // Internal/External Switchover
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable

// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection
#pragma config PLLEN = ON // PLL Enable
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable
#pragma config BORV = LO // Brown-out Reset Voltage Selection
#pragma config LVP = OFF // Low-Voltage Programming Disable

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pic12F1840.h>

#define _XTAL_FREQ 32000000

//++++++++++++++++ Port output definitions
#define Led_red LATA1
#define Led_orange LATA2
#define Led_yellow LATA5
#define Led LATA0

//++++++++++++++++ Led variables
int Led_period = 270;

int Led_counter = 0;
char Led_duty = 150;
int temp_led = 0;

int Led_red_counter = 0;
char Led_red_duty = 0;
char temp_red;
char work_r = 0;
char time_pause_r = 1;

int Led_orange_counter = 0;
char Led_orange_duty = 0;
char temp_orange;
char work_o = 0;
char time_pause_o = 1;

int Led_yellow_counter = 0;
char Led_yellow_duty = 0;
char temp_yellow;
char work_y = 0;
char time_pause_y = 1;

char y,o,r = 0; //Duty random values
char a,b,c = 0; //Speed regulator counter
char z = 0; //Random delay counter

__bit sens_r; //0 = lightning up, 1 = lightning down
__bit pause_r; //speed of lightning
__bit sens_o;
__bit pause_o;
__bit sens_y;
__bit pause_y;

void init()
{
OSCCON = 0b11110000; //int osc = 8Mhz (+PLL on = 32Mhz)

ANSELA = 0b00001000; //AN3 on for pot

TRISA = 0b00011000; //AN3 = input
PORTA = 0x00;

ADCON0 = 0b00001100; //AN3 Selected
ADCON1 = 0b11000000; //Fosc/4, Vref = VDD

T2CON = 0b00000000; //TMR2 prescaler = 1:1, postscaler = 1:1
PR2 = 80; //32Mhz/4 = 125ns * 80 = 10uS (time base)

TMR2IE = 1; //TMR2 INT ON
PEIE = 1;
GIE = 1;

}

void main()
{
init();

temp_red = 200;
temp_orange = 180;
temp_yellow = 150;
TMR2ON = 1;

while(1)
{
//++++++++++ Calculate duty random values
y++;
if(y == 200) //Max illumination for Yellow led
{
y = 1;
}
o++;
if(o == 180)
{
o = 1;
}
r++;
if(r == 150)
{
r = 20;
}
for(z=0;z<(rand()%250);z++) //Random delay
{
__delay_us(330);
}

//+++++++++++ Get value of pot for Led illumination
ADON = 1;
__delay_ms(1);
GO_nDONE = 1;
while(GO_nDONE);
temp_led = ADRESH << 8;
temp_led = temp_led | ADRESL;
Led_duty = temp_led >> 2;
ADON = 0;

}
}

void __interrupt() ISR (void)
{
if(TMR2IF == 1)
{
PR2 = 80;

Led_counter++;
if(Led_counter >= Led_duty) //***********
{ // *
Led = 0; // *
} // ***************
if(Led_counter >= Led_period) //-Led_duty-
{ //variable (AN3 value)
Led = 1; //——–Led_period——-
Led_counter = 0; //fix for all leds
}

if(work_r == 0)
{
if(Led_red_duty == temp_red) //wait for full illumination
{ //to reverse way
sens_r = 1;
}
if(sens_r == 0) //lightning up
{
Led_red_duty++;
work_r = 1;
}
else if(sens_r == 1) //lightning down
{
Led_red_duty–;
work_r = 1;
if(Led_red_duty < 20)
{
Led_red_duty = 20; //Reset all
Led_red_counter = 0;
sens_r = 0;
temp_red = r; //New random duty value
time_pause_r = (r/100)+1; //New random speed value
}
}
}

if(work_o == 0)
{
if(Led_orange_duty == temp_orange)
{
sens_o = 1;
}
if(sens_o == 0)
{
Led_orange_duty++;
work_o = 1;
}
else if(sens_o == 1)
{
Led_orange_duty–;
work_o = 1;
if(Led_orange_duty < 1)
{
Led_orange_duty = 0;
Led_orange_counter = 0;
sens_o = 0;
temp_orange = o;
time_pause_o = (o/100)+1;
if(time_pause_o > 3)
{
time_pause_o = 2;
}
}
}
}

if(work_y == 0)
{
if(Led_yellow_duty == temp_yellow)
{
sens_y = 1;
}
if(sens_y == 0)
{
Led_yellow_duty++;
work_y = 1;
}
else if(sens_y == 1)
{
Led_yellow_duty–;
work_y = 1;
if(Led_yellow_duty < 1)
{
Led_yellow_duty = 0;
Led_yellow_counter = 0;
sens_y = 0;
temp_yellow = y;
time_pause_y = (y/100)+1;
if(time_pause_y > 3)
{
time_pause_y = 2;
}
}
}
}

if(work_r == 1)
{
Led_red_counter++;
if(Led_red_counter == Led_red_duty)
{
Led_red = 0;
}
if(Led_red_counter == Led_period)
{
Led_red_counter = 0;
Led_red = 1;
a++; //**
if(a == time_pause_r) //**
{ //**
work_r = 0; //** Speed regulator
a = 0; //**
} //**
}
}

if(work_o == 1)
{
Led_orange_counter++;
if(Led_orange_counter == Led_orange_duty)
{
Led_orange = 0;
}
if(Led_orange_counter == Led_period)
{
Led_orange_counter = 0;
Led_orange = 1;
b++;
if(b == time_pause_o)
{
work_o = 0;
b = 0;
}
}

}

if(work_y == 1)
{
Led_yellow_counter++;
if(Led_yellow_counter == Led_yellow_duty)
{
Led_yellow = 0;
}
if(Led_yellow_counter == Led_period)
{
Led_yellow_counter = 0;
Led_yellow = 1;
c++;
if(c == time_pause_y)
{
work_y = 0;
c = 0;
}
}

}

TMR2IF = 0;
}