marți, 16 septembrie 2014

Comanda unui releu de 5V cu 2,5V

In cazul in care avem un releu de 5V, vrem sa-l folosim pentru a comanda "ceva", dar nu dispunem de tensiunea de 5V si in plus vrem sa reducem si puterea disipata a releului avem urmatoarea solutie:


Schema de mai sus este realizata in jurul circuitului integrat MAX4624 ( comutator analog de joasa tensiune ) iar datasheet-ul il gasiti aici.

!!!!!Studiati foaia de catalog ( datasheet-ul ) circuitului integrat MAX4624 in tim ce studiati functionarea schemei

In mod normal puterea consumata de bobina releului este de V2 / Rbob , dar folosind schema de mai sus vom reduce aceasta putere aplicand o tensiune mai mica decat cea normala de 5V.
Plecand de la faptul ca tensiunea necesara activarii unui releu este mai mare decat cea necesara pentru a mentine starea activa a acestuia, adica pentru un releu de 5V este necesara o tensiune de 3,5 volti pentru activare si 1,5V pentru dezactivare, vom folosi o tensiune de 2,5 V pentru ai mentine starea activa.

Tensiune alimentare
Putere
5V
In jur de 450mW
2,5V
In jur de 120mW

Cand inchidem comutatorul S1 curentul circula prin bobina releului si prin C1, iar C2 incepe sa se incarce. Releul ramane inactiv deoarece tensiunea este mai mica decat cea de activare (3,5V).
Constanta de timp RC, formata de R2 si C2, este aleasa astfel incat C1 se incarca aproape complet inainte ca tensiunea la bornele lui C2 sa ajunga la pragul logic ( tensiunea pentru care se considera ca se face trecerea de la un nivel logic la altul ) al circuitului MAX4624. Cand tensiunea de la bornele lui C2 este suficienta pentru pragul logic, circuitul MAX4624 va conecta C1 in serie cu 2,5V si bobina releului. Aceasta actiune duce la cresterea tensiunii la bornele releului in jurul valorii de 5V, adica mai mare de 3,5V, rezultand activarea releului.
C1 se descarca prin bobina, iar tensiunea de la bornele bobinei scade la 2,5V minus caderea de tensiune pe dioda D1, dar va ramane mai mare de 1,5V (tensinea la care releul se dezactiveaza) razultand ramanerea releului activ.
Componentele sunt alese in functie de caracteristicile releului si a tensiunii de alimentare.
R1 protejeaza circuitul MAX4624 de curentul initial ce trece prin C1.
Valoarea lui C1 depinde de caracteristica releului si de diferenta dintre tensiunea de intrare si tensiunea necesara releului pentru a fi inactiv.
Pentru relee ce necesita mai multa energie pentru a fi activate valoarea lui C1 va creste.

marți, 26 august 2014

Programator PIC 16Fxxx si PIC 12Fxxx

In urma unor discutii cu un client mi-am propus sa caut o schema pentru programarea microcontroller-elor  PIC din familia 16Fxxx pentru cei care construiesc montaje cu microcontrollere PIC16Fxxx si nu au cu ce sa le programeze.
Pentru a putea construi un programator pentru uC PIC avem nevoie de circuitul integrat MAX232 sau echivalent ce asigura interfatarea dintre portul serial al PC-ului si microcontroller.
Pe langa MAX 232 avem nevoie de urmatoarele tensiuni ( alimentari ) pentru a aduce uC-ul in starea de programare:

  1. 5V pentru alimentarea pinilor Vdd si Vss
  2. 13....13.5V pentru alimentarea pinului MCLR ( se mai numeste si tensiune de programare Vpp )
Schema de alimentare:


Cu ajutorul semireglabilului R1 vom ajusta valoarea Vpp la exact 13V ( 13.00V ).

!!!!!! In cazul in care Vpp nu este 13V este foarte posibil sa apara eroare de scriere la adresa 0000h.!!!!!!!

Schema programatorului:

Fluxul de date este integrat de R9 si C5 ( 470 si 1nF ).
Circuitul CD4093 are rol de buffer si formator de semnal cu scopul de a elimina zgomotele ce pot falsifica datele ce circula in ambele sensuri ( PC-uC si invers ). Aceste buffere si formatoare de semnal se pot realiza si cu diode si/sau tranzistoare.

!!!!!!! Atentie la tensiunea Vpp si la grupul R9,C5. In cazul in care apare eroare la scrierea la adresa 0000h se elimina C5 si se strapeaza R9.

Tabel conectare programator - uC ( microcontroller ):

Programul software folosit este IC-Prog , pe care il puteti descarca gratuit de la adresa www.ic-prog.com/download.html

joi, 30 ianuarie 2014

LM35 + LCD Display + PIC 16F887 ( un mic termometru digital )

Cu ajutorul acestei aplicatii ( proiect ) vom utiliza convertorul analog-digital al microcontroller-ului PIC16F887 ( in general al oricarui tip de microcontroller ).

Ca senzor de temperatura folosesc LM35 ( ieftin si se gasesc oriunde ) ( datasheet ). Acest senzor va scoate pe iesire o tensiune proportionala cu temperatura, iar gama de masurare a temperaturii este: -55 - 150 grade Celsius. Pentru mai multe detalii consultati datasheet-ul .

Pentru afisearea temperaturii vom folosi un display LCD 2x16 ( doua randuri a cate 16 caractere ).

Inainte de a incepe trebuie sa facem o scurta ( foarte scurta ) introducere in ceea ce inseamna convertorul analog-digital ( ADC ).
-un ADC este un circuit electronic care converteste o marime analogica ( tensiune, curent,...etc ) de intrare intr-o marime digitala de iesire.


O caracteristica importanta a unui ADC este rezolutia acestuia, adica numarul de valori pe care poate sa-l furnizeze convertorul la iesirea sa in intervalul de masura. Lucrand cu date binare , rezolutia se va masura in biti.

Ex: daca rezolutia ADC-ului este pe 10 biti, convertorul poate furniza 1024 valori diferite la iesire.

Sa facem cateva calcule pe exemplul nostru:

  •  LM35 - iesirea se modifica cu 10mV la fiecare grad celsius.
  • ADC-ul microcontrollerului nostru este pe 10 biti
  • Tensiunea de referinta Vref = 5V
  • ADCrez = 5V/1024 = 0,004882=4,88mV
Consideram temperatura ambientala 25,5 grade C si stim ca iesirea lui LM35 se modifica cu 10mV /grad C, in aceste conditii va rezulta ca pentru o temperatura de 25,5 tensiunea pe iesirea senzorului ( LM35 ) va fi:

          25,5 * 10mV = 255mV=0,255V.

Cunoscand aceasta tensiune putem sa calculam ce valoare va avea ADC-ul la iesire astfel:

      VALadc = 0,255 V / 0,004882 V = 52,22950.

Dupa ce am calculat VALadc putem sa calculam si tempratura :

      Temp = VALadc *ADCrez (V) / 10 (mV/C ) = 52,22950 * 0,004882 (V) / 0,01 ( V/C ) =  25,5 C

Stiind toate acestea formula Temp va fi folosita si in programul nostru pentru microcontroller.

Schema proiectului :


Codul sursa:

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

char message1[] = "Temperatura:";

char tempC[15];

unsigned int tempinC;
float temp_value=0;

void main()
 {
ANSEL = 0x04;     // Selectare port AN2 ca fiind analog
ADCON1=0X80;
TRISA = 0x04;
ANSELH=0;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,1,message1);
Lcd_Chr(2,6,223);
Lcd_Chr(2,15,223);
Lcd_Chr(2,7,'C');

do {
tempinC = ADC_Read(2);
temp_value = tempinC*0.4882;           // formula de calcul a temperaturii

FloatToStr(temp_value,tempC);  // conversia in char a valorii lui temp_value

Lcd_Out(2, 1, tempC);

Delay_ms(1000);
 } while(1);
}


Un mic filmulet demonstrativ:



vineri, 17 ianuarie 2014

NETDUINO - Aplicatii cu led-uri folosind Netduino2

Vom avea la baza proiectul de la articolul " Aplicatii cu Led-uri folosind PIC16F877 partea.I " diferenta fiind doar de numarul de led-uri folosite 5 in cazul nostru.

Plecand de la schema:



SPER CA DATA VIITOARE O SA-MI ACHIZITIONEZ O TABLETA GRAFICA PENTRU A FACE DESENELE MAI BINE !!!!!

Va trebui sa aprindem cele 5 led-uri pe rand ( unul dupa altul ) D1 - D5 si apoi sa le stingem tot pe rand ( unul dupa altul ) D5 - D1.

Modul de creare a unui program este:

Visual C# 2010 Express ------- New Project ------ MicroFramwork ------ Netduino2 application ----- etc.

Folosind cunostintele acumulate din articolulPulsare Led ( onboard) Netduino 2 " codul sursa va arata astfel: 

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace NetduinoApplication1
{
    public class Program
    {
        static OutputPort[] led = new OutputPort[8]; //declaram un vector in care tinem 
                                                                         // minte unde sunt conectate cele 5                                                                                // led-uri
        public static void Main()
        {
            int i;
            led[0] = new OutputPort(Pins.GPIO_PIN_D0, false);  // declararea fiecarui led in 
            led[1] = new OutputPort(Pins.GPIO_PIN_D1, false);  //parte, pinul unde este 
            led[2] = new OutputPort(Pins.GPIO_PIN_D2, false);  //conectat si starea lui initiala
            led[3] = new OutputPort(Pins.GPIO_PIN_D3, false);
            led[4] = new OutputPort(Pins.GPIO_PIN_D4, false);

            while (true)
            {
                for (i = 0; i <= 4; i++) // aprinde fiecare led in parte 
                {
                    led[i].Write(true);
                    Thread.Sleep(300); // asteapta 300 milisecunde
                }                               // acest for se executa de 5 ori ( i=0;i=1,i=2,i=3,i=4 )

                for (i = 4; i >= 0; i--) // stinge fiecare led pe rand in ordine inversa fata de                                                     // aprindere
                {
                    led[i].Write(false);
                    Thread.Sleep(300); // asteapta 300 milisecunde
                }                               // acest for se executa de 5 ori ( i=4;i=3,i=2,i=1,i=0 )
            }


        }

    }

}

Mai jos va prezint un filmulet cu realizarea practica:








duminică, 12 ianuarie 2014

PIC - Folosirea Butoanelor (TouchButton) in aplicatii cu microcontroller PIC

In articolul "Aplicatii cu led-uri folosind PIC16F877 partea I" v-am explicat cum putem sa ne jucam cu led-urile implicit si cu porturile microcontroller-ului. In articolul de azi vom vedea cum ne "jucam" cu butoane si anume vom conecta 3 butoane la microcontoler si cate 8 led-uri la porturile B, C, D. Butoanele vor fi conectate la portul A pinii RA1, RA2, RA3.
La apasarea butonului conecat la pinul RA1 se vor aplrinde led-urile de la portul B, la apasarea butonului conectat la pinul RA2 se vor aprinde led-urile de la portul C si la apasarea butonului conectat la pinul RA3 se vor aprinde led-urile de la portul C.

Mai jos va prezint schema electronica realizata in proteus, unde am facut si simularea:


Pe schema: butonul B1 este conectat la pinul RA1 ---- la apasarea lui se vor aprinde ledurile de la portul B
butornul B2 este conectat la pinul RA2 ---- la apasarea lui se vor aprinde led-urile de la portul C;
butonul B3 este conecat la pinul RA3 ---- la apasarea lui se vor aprinde led-urile de la portul D.
 In continuare va afisez codul sursa a programului:

bit stareB,stareC,stareD;

void main() {

  ANSEL  = 0;                                    // Configureaza pinii AN ca fiind digitali
  ANSELH = 0;
  C1ON_bit = 0;                                  // Dezactiveaza comparatoarele
  C2ON_bit = 0;


  TRISA1_bit=1;
  TRISA2_bit=1;               // seteaza pinii RA1,RA2,RA3 ca fiind de intrare
  TRISA3_bit=1;
  TRISB = 0;
  TRISC = 0;
  TRISD = 0;                                 // Configurare PORTC ca iesire
  PORTB = 0;
  PORTC = 0;
  PORTD = 0;                                  // valoarea Initiala a PORTx
  stareB = 0;
  stareC = 0;
  stareD=0;
  
  while(1) {
    if (Button(&PORTA,1,0,1)) {   PORTB=0xFF;
                                                    stareB = 1;
                                                 }
    if (stareB&&Button(&PORTA, 1, 0, 0)) {
                                                                       PORTB=0x00;
                                                                       stareB=0;
                                                                   }
   if (Button(&PORTA,2,0,1)) {
                                                 PORTC=0xFF;
                                                 stareC=1;
                                              }
    if (stareC&&Button(&PORTA, 2, 0, 0)) {
                                                                       PORTC =0x00;
                                                                       stareC=0;
                                                                   }
    if (Button(&PORTA,3,1,1)) {
                                                 PORTD=0xFF;
                                                 stareD=1;
                                                }
    if (stareD&&Button(&PORTA,3,1,0)) {
                                                                      PORTD=0x00;
                                                                      stareD=0;  
                                                                }
  }
}

In program a aparut functia Button() care are urmatoarea structura:

unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);
             unde: unsigned short *port : portul la care este conectat butonul;
                      unsigned short pin : pinul la care este conectat butonul;
                      unsigned short time : intarzierea la apasarea butonului in milisecunde;
                      unsigned shortactive_state : starea butonului apasat/neapasat  ( 1/0 );

if(Button(&PORTA,1,0,1))  : daca butonul conecat la portul a ( PORTA ) pinul 1 (RA1) cu intarzierea 0 este apsat (1) executa ceva.