sâmbătă, 10 martie 2012

Mood light

In timp ce cautam sa inteleg cum functioneaza PWM implementat in hardware-ul unui PIC12F683 am dat peste aceasta pagina http://picprojects.org.uk/projects/rgb/ unde autorul prezinta schema pentru un mood light.
Mi s-a parut interesant asa ca am luat schema, am facut mici modificari, am conceput un cablaj in Protel 99SE iar userul glide de pe forumul electronistilor mi l-a facut(ca de obicei la calitate exceptionala-Multumirii).

La schema originala nu am facut mari modificari(am adaugat ICSP ca sunt lenes si nu imi place sa tot scot cipul cind il programez si pentru viitorul apropiat sa inlocuiesc butonul cu un Touch capacitiv).
Dupa ce am primit cablajul am inceput sa montez piesele. Aici am avut prima surpriza neplacuta: ledurile Piranah au un colt tesit care ar trebui sa ne semnalizeze ceva. Practic am constatat ca la cele rosi tesitura insemna ceva(catod) iar la cele verzi si albastre cu totul alt ceva(anod). Noroc ca am verificat inainte de a le monta - deh paranoia, vine cu varsta.
Asa arata dupa montare.
In poza de mai jos se vede ca nu le am cu lipitul. Sau o fi de la stratul de sacaz pe care l-am pulverizat inainte? Oricum glide incepe sa faca cablaje stanate, deci poate o sa arate si lipiturile mele viitoare mai bine .
 Urmatoarele poze sunt cu montajul alimentat(una fara blitz alta cu blitz) pe o secventa care are toate ledurile aprinse(chiar daca nu la intensitatea maxina unele)


Ca soft am folosit asm-ul original dar am inceput deja sa imi fac propriul meu soft(in Hitec C) . Este functional dar mai am de lucru la el(nu am inclus butonul fizic, doar cicleaza niste secvente). Plus ca vreau sa bag si partea capacitiva , nu ar fi frumos sa pun mina pe globul mat in care vreau sa bag montajul si el sa schimbe secventa?

Oricum se site autorul mai are si un cub 5x5x5. Eu o sa incep cu un 3x3x3 ca am niste PIC12F628/648 prin cutie si e un bun inceput. Plus ca pentru 5x5x5 foloseste niste drivere pe care nu prea le gasesc (CAT4016). O sa incerc eventual cu 74HC595 si nistedDrivere pe 8 canale(ceva tip ULN2803) dar asta ramine la capitolul "To Do".
Pe moment sa imi reuseasca 3x3x3-ul.




miercuri, 15 februarie 2012

Solder station with Solomon S10

Dupa indelungate lupte un nou post.
Si o noua realizare pentru mine.
Povestea e un pic mai lunga. Pe forumul electronistilor am gasit o schema pentru o statie de lipit(a lui Wolf). Asa ca pornind de la feedback-urile pozitive am zis sa imi fac si eu una. Motivul principal este date si de faptul ca "chinezaria" mea (Luckey 936D)  am dus-o la serviciu- dehh lucrez la Stat si statul nu are 160Ron pentru una- si cind am avut nevoie acasa, pauza.
Asta a fost ipoteza. Asa ca am luat schema (vezi mai jos) si am conceput un cablaj.

Ca un delasator ce sunt am lucrat direct pe un stick(lenea, cucoana mare) care a decis sa crape. Asa ca avem cablajul dar nu mai aveam dispunerea pieselor. Si imi lua prea mult sa descopar.
Asa ca am comandat un cablaj de pe forumul electronistilor , facut de userul Geomar. Cand a sosit am fost dezamagit de cit de mic si condensat era.
Asa ca iarasi Protel si am facut un nou cablaj. Pe care am reusit sa il si asamblez.
Am doua comentarii la schema. In "inteligenta" mea am presupus cu 7812 nu va avea nevoie de radiator, si din pacate are, deci sunt silit sa ii pun un radiator inalt(sau mic) iar BT136 abia se incalzeste iar eu iam lasat loc de un "bloc" de aluminiu.
Acum vine partea cea mai grea: bagarea in cutie. Am gasit o sursa stricat care ar corespunde cerintelor. Am golit-o, am spalat-o si am inceput sa pozitionez continutul. Eventual cind e gata o sa atasez si o fotografie.
Alt "to do" e sa gasesc un buton pentru potentiometru un pic mai mare ca sa fie mai usor de manevrat.
Sa vad ce gasesc prin piata.
Apoi am vazut o firma care face gravura. Sa vad ce preturi au si poate ii fac si o "faţă" onorabila.  Daca nu va ramine asa cum este.
Acum ca o continuare la statie sunt la faza de a programa un FAN cu PWM. Aveam 2-3 bucati din PIC12F683 , care are un PWM de 10 biti si am zis sa vad daca nu iese ceva. Cablajul e facut, asamblat, acum sunt la programare. Scopul lui va fi acela de a tine statia rece. Sa vedem de imi iese.




marți, 8 noiembrie 2011

Capacitive Touch with PIC12F675. Part 1.

Cum spuneam intr-un post anterior dupa ce am ramas fara senzori capacitivi , m-am suparat si m-am apucat sa mii fac singur. Pornind de la ce aveam pe acasa(in speta PIC12F675) am cautat teoria pentru a implementa.
Asa ca am dat peste aceasta pagina . Acolo e prezentata un model pentru implementarea unui senzor capacitiv. Ce am facut eu nu e identic, doar folosesc ideile de acolo.
Metoda e simpla: un pin al unui port care este setata ca iesire este legat prin doua rezistente la alti doi pini  setati ca intrare. Acest pin de incarcare este dus in 1, se pastreaza valoarea portului care contini pini setati ca intrare intr-o variabila, se duce in 0 portul de incarcare. Daca unul din pad-uri este atins acesta isi pastreaza valoarea de 1 desi portul de incarcare a fost trecut in 0.
Deci , cum spuneam, e foarte simplu. Ce nu imi place este a trebuie efectiv sa fie atins pad-ul, deci un contact fizic(nu am patiti inca niciodata nimic, dar imi este frica de sarcini electrostatice, de fire "calde", etc).


Dupa cum vedeti schema are putine piese si este usor de realizat. Mai jos codul.
Pro: usor de realizat , nu necesita reglaje.
Con: trebuie touch efectiv, adica trebuie efectiv atins pad-ul.


/************************************************************************
*                                                                       *
*   Processor:     12F675                                               *
*                                                                       *
*************************************************************************
*                                                                       *
*   Pin assignments:                                                    *
*       GP4 - indicator LED - Iesire                                   *
*       GP5 - indicator LED sau RS232 - Iesire                          *
*       GP2 - Legat la GP0,1 cu rol de incarcare a capacitati         *
* GP0,1 - Touch PAD                                             *
************************************************************************/
#include <pic.h>
#include <legacy\pic12rf675.h>
#include <stdlib.h>


#define _XTAL_FREQ  4000000     // oscillator frequency for _delay()


#define LED1 GPIO4
#define LED2 GPIO5
#define L_UP GPIO2


/***** CONFIGURATION *****/
// config 4mhz int clock & power-up timer enable & ext reset off & no code protect & no brownout detect 
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS);


//////////////////////////////////////////////////////////////////////
void init_ports(void) {
CMCON = 0x07; //Turn off analog comparator
ANSEL = 0;                  // Turn off ADC
TRISIO = 0b00000011; //Set GP0 si GP1 input  restul output
INTCON = 0; //Disable interrupt
GPIO  = 0; //Turn off all pins
}


void blink(void)
{
LED1 = 1;LED2 = 1;  __delay_ms(200);  LED1  = 0; LED2 = 0; __delay_ms(200);
}


/**************************************************************
                    Main Program
**************************************************************/
void main(void){


volatile union 

    unsigned char Acc2Bits; 
    struct 
    { 
        unsigned b0                  : 1;
        unsigned b1                  : 1;
        unsigned b2                  : 1;
        unsigned b3                  : 1;
        unsigned b4                  : 1;
        unsigned b5                  : 1;
        unsigned b6                  : 1;
        unsigned b7                  : 1;
    }; 
} sGPIO;




init_ports();
blink();


while(1){ //looping


do 
{
L_UP = 1; //il fac high deci impliciti 0,1,2 au 1 la intrare
sGPIO.Acc2Bits = GPIO;
L_UP = 0;


if(sGPIO.b0 == 1) {GPIO &=~(1 << 5 ); } else { GPIO |= (1 << 5 ); };
if(sGPIO.b1 == 1) {GPIO &=~(1 << 4 ); } else { GPIO |= (1 << 4 ); };


__delay_us(200);
} while(1);



} //loping


} //main

Am folosit in cod un union deoarece vreau sa incerc si pe un microcontroler cu mai multi pini(fizici) ca sa pot face 4-5 contacte capacitive dintr-un singur microcontroler. Si am zis eu ca asa imi va fi mai usor.
Am si inceput sa fac proiectul fizic cu un PIC16F628A. Dar timpul .......

O sa incerc sa fac si un film, sa vad unde il pun, pentru a vizualiza functionarea lui in practica.

vineri, 28 octombrie 2011

MAKE more Capacitive Touch not fortune


Dupa cum spune si titlul, o sa imi exprim nemultumirea legata de producatori de componente electronice care produc senzori capacitivi.
In Cretacicul Superior, cautind pe net am gasit referinte la o firma numita "Quantum Research". Acestia produceau niste senzori capacitiv foarte interesanti. Datorita perioadei virful de lance era la acel moment QT100. Acesta venea intr-o capsula DIP8, un circuit cinstit relizat si care functiona si bine. Nu iti mai trebuiau decit un condensator si o rezistenta si gata, totul mergea. Bine, mai aveai de lucru la setarea sensibilitati-in functie de ce era senzorul- dar totusi nu era un capat de lume. Asa ca atunci am facut un efort fianciar si mi-am comandat mai multe QT100 -de pe farnel.co.uk- si asa o perioada am avut suficiente circuite pentru necesitatile curente.
Dar a venit ziua cind sau terminat. Asa ca dai cautare si am constatat ca nu mai erau. Am gasit pe digikey.com insa un model mai "nou" si anume QT118HA. Dupa o complicatenie cu cei de la digikey si un pret de transport IMENS (28,35US$)am avut in mina noile modele. Care sunt in caspula SOT-23-6 deci mai greu de lipit si mai SMD de felul lor. Ok am lucrat cu ele pina le-am terminat si pe astea. De curind am avut nevoie si surpriza nici acestea nu mai erau iar Quantum Research a fost cumparat de Atmel.
Astfel QT100 a devenit  QUANTUM ATMEL QT100A-ISG care e in capsula WSON- de care nu am lipit niciodata- iar ATMEL vinde sub brand propriu modelul AT42QT1010-TSHR. Si acum vine surpriza pretului: modelul QT100A-ISG costa 8.39Ron  iar AT42QT1010-TSHR costa 2.97RON. Al doilea are un pret mai uman dar totusi ....
Azi, miine dispare si asta si o iau de la capat. Asa ca m-am decis sa imi fac propriul senzor capacitiv. Ideea era sa il fac la un pret acceptabil(sa nu intru in criza economica de la el).Deci am pornit in cautarea de cursuri/manuale catre trateaza problema. Si in final am gasit trei metode de implementare a "Capacitive Touch" din care am implementat numai doua (din motive de timp).

Si in caz ca nu ati ghicit, desigur am folosit "micul cu muschi" adica PIC12F675.
In postarea urmatoare o sa prezint schema si codul pentru prima metoda de detectie.











miercuri, 26 octombrie 2011

De unde am achizitionat ...

Am fost intrebat, nu pe blog, de unde mi-am luat microcontrolerele. Initial am cumparat din Romania la niste preturi de m-a apucat durerea de cap. Asa ca am apelat la bunul Ebay si am gasit pe cineva care vindea la preturi mai umane. I-am cerut voie si asa ca aveti link la store-ul lui polida2008 
Oricum de la el am luat si DS18B20. Eu am luat de obicei seturi de 5 pcs sau chiar 10. La bucata nu prea renteaza nici la el, dar la seturi de 5 e ideal.


luni, 24 octombrie 2011

Fan controller with PWM and PIC12F675

Cum spuneam in postul anterior am re-inceput cu PIC12F675. Este un microcontroler foarte bun pentru inceput, care are un oscilator intern astfel ca nu ai nevoie neaparat de un cuartz extern. Apoi fata de fratele lui mai mic PIC12F629 are si ADC pe patru dintre pini  săi, deci e ideal pentru tot felul de aplicatii care necesita un numar mic de pini.
Va dezamagesc dar nu o sa incep cu un montaj de tip flasher/blinker. O sa incep cu un controler de ventilator. De ce? pentru ca aveam nevoie de unul prin cutiile diferitelor mele montaje. Desigur puteam face unul mai simplu cu operationale, dar daca tot incep sa re-invat am zis sa il fac cu acest microcontroler(caci pe acesta il aveam achizitionat la momentul de start al proiectului).

Aveti schema facuta in Protel 99SE, un soft mai vechi dar care m-a slujit cu credinta ani de zile. Paranteza la paranteza: am incercat Eagle dar curba de invatare a fost prea lunga , asa ca am folosit ce stiam, desi la partea de Placer aceasta versiune nu prea exceleaza - adevarul ca nu stiu celelalte softuri cit de bune sunt, dar la Protel prefer sa nici nu lansez Auto Placer-ul ca e pierdere de timp.
Sa comentez un pic despre schema. Deoarece nu am nici un buton am puc MCLR-ul la Vcc printr-o rezistenta de 10K si ii fac disable in configuratie. De ce? Deoarece am incercat sa il folosesc la un alt proiect ca un simplu buton , si isi tragea microcontrolerul niste reseturi de mai mare dragul. Asa ca am devenit paranoia- daca se poate mai mult decit sunt - si prefer sa il tin la Vcc chiar si la microcontrolerele care au un pull-up intern. Paranoia, deh ......
Alta componenta importanta este condensatorul de 100nF C_IC. Acesta il pun NEAPARAT intre pini de Vcc si Vss. Initial nu il puneam si cind iti era lumea mai draga se reseta microcontrolerul. Pina m-am prins am crezut ca nu facusem softul bine , ca nu am facut cablajul bine, si alte motive. Dupa un pic de reserch pe Google, am atasat primul condensator si dintr-o data totul a inceput de functioneze.
REPET, nu uitati sa puneti un condensator , cit mai aproape de pini de alimentare ai microcontrolerului. Pe net unii recomanda si un condensator electrolitic dar pina acum cu un simplu ceramic totul pare sa functioneze bine. El am cumparat niste condensatoare SMD si cind fac cablajul incerc sa fac pozitionarea lui chiar dedesubtul microcontrolerului. Daca nu pot atunci il pun pe soclul de la microcontroler- prefer sa folosesc socluri gold ca sunt mai inalte si pot lipi un condensator normal intre pini de tensiune fara sa afecteze.
Revenim la schema. Ca senzor de temperatura am folosit un DS18B20 pe principiul "asta am". Nu o sa ii fac o prezentare aici caci nu are rost. Daca doriti informatii mai multe despre el gasiti la producator acasa MAXIM . Daca preferati ceva in romaneste va recomand un site foarte bun, de unde sa intelegeti modul lui de functionare, realizat de Catalin-Mihael Bojescu. Nu am cerut voie autorului sa il citez, sper sa nu se supere.
Pentru controlul bunei functionari folosesc un led conectat la GP1 si pe GP2 il folosesc pentru seriala. De asta apare si in schema si conectorul RS232_POWER de unde i-ai tensiunea pentru un modul extern- un montaj cu un MAX232 pentru a avea nivelele de tensiune/semnal pentru co conexiune seriala.
Comanda ventilatorului o fac cu un IFR540. Am ales acest tranzistor datorita caderi mici de tensiune de pe el. Puteam folosi un 2Nxxxx sau un BDxxx dar caderea de tensiune era prea mare, asftel incit daca alimentam de la 12V nu aveam sa obtin turatia maxima a ventilatorului.
Alimentarea microcontrolerului o fac cu un 7805 in capsula TO92. La cit consuma este ultra suficient.
C-am atit despre schema.
Acum sa vorbesc despre "chinurile facerii" la nivel de software.
Sa incepem cu un ...

STATEMENT: URĂSC LIMBAJUL DE ASMBLARE

Acuma ca am lamurit asta, va spun ca am facut softul in HI TECH C, versiunea optimizata - am activat perioada de 45 de zile de trial ca sa imi iasa codul mai mic, caci cu partea de seriala incepea sa nu incapă in memoria microcontrolerului.
Initial codul de baza arata asa



  1. while(1){ //looping

  2. get_temp();
  3. digit=temp_lsb>>4;
  4. digit|=(temp_msb&0x7)<<4;

  5. //FAN_ON = 0;
  6. if(digit>=25 && digit<30){ duty=50; FAN_ON=1;};
  7. if(digit>=30 && digit<35){ duty=100; FAN_ON=1;};
  8. if(digit>=35 && digit<40){ duty=150; FAN_ON=1;};
  9. if(digit>=40){ duty=254;  FAN_ON=1;};

  10. for(i=0; i<300;i=i++)soft_pwm_led_fan(1,5,duty);


  11. } //loping


Functia get_temp() citeste temperatura in doi octetii temp_lsb si temp_msb. Codul din liniile 4 si 5 extrage intregul pe care apoi il verific si stabilesc valoarea pentru PWM. Totul era ok doar ca nu am tinut cont de un simplu lucru: timpul necesar circuitului pentru realizarea conversiei(vezi tabelul de mai jos).


R1R0ResolutionMax Conversion Time
009-bit93,75 mstCONV/8
0110-bit187,5 mstCONV/4
1011-bit375 mstCONV/2
1112-bit750 ms
tCONV




La initializare DS18B20 este in modul 12 bit rezolutie DAR ii ia minim 750ms ca sa poata face conversia. In perioada de conversie ventilatorul nu primeste alimentare, ledul martor se stinge si asa mai departe. 
Deci ori se mareste foarte mult perioada intre citiri succesive ale temperaturi ori .....
Am redus rezolutia la 9 bit, timpul de conversie devenind 93.75ms dar tot este sesizabila oprirea, mai ales daca ventilatorul e la turatie ridicata - un duty mare.
O solutie ar fi fost sa incerc sa fac un executiv de timp reala (care sincer nu stiu daca ar rezolva, cel putin in teorie ar trebui dar la cit de putina memorie are acest microcontroler si tind cont de faptul ca cel mai mic executiv care l-am vazut ocupa 1k de memorie .....), ceea ce e mult prea mult, sau sa gasesc o metoda alternativa-de exemplu sa caut alt circuit dar asta ar insemna alti bani cheltuitii, deci neacceptabil.
Asa ca solutia a fost inglobarea functiei de citire a temperaturi in corpul principal al lui main().
Astfel bucla principala a devenit:

  1. while(1){ //looping

  2. //din motive de timp-timpul de steptare pina se face converisa ca sa aflam temperatura
  3. //modific functia si in loc sa stau fac pwm
  4. //sper sa dispara caderea de viteaza a ventilatorului

  5. DQ_HIGH();
  6. reset();                                 //reset,wait for  18b20 responsion
  7. write_byte(0XCC);                        //ignore ROM matching
  8. write_byte(0X44);                        //send  temperature convert command

  9. if(FAN_ON == 1)for(i=0; i<100;i=i++)soft_pwm_led_fan(1,5,duty);

  10. reset();                                 //reset again,wait for 18b20 responsion
  11. write_byte(0XCC);                        //ignore ROM matching 
  12. write_byte(0XBE);                        //send read temperature command
  13. temp_lsb=read_byte();                         //read temperature low byte
  14. temp_msb=read_byte();                         //read temperature high byte
  15. DQ_HIGH();                               //release general line 

  16. //Store temperature integer digits and decimal digits in 12 bits
  17. digit=temp_lsb>>4;
  18. digit|=(temp_msb&0x7)<<4;

  19. FAN_ON = 0;
  20. if(digit>=20 && digit<25){ duty=50; FAN_ON=1;};
  21. if(digit>=25 && digit<30){ duty=100; FAN_ON=1;};
  22. if(digit>=30 && digit<35){ duty=150; FAN_ON=1;};
  23. if(digit>=35 && digit<40){ duty=200; FAN_ON=1;};
  24. if(digit>=40){ duty=254;  FAN_ON=1;};

  25. for(i=0; i<500;i=i++)soft_pwm_led_fan(1,5,duty);

  26. } //loping



Astfel in loc sa astept fara sa fac nimic, mai trec prin functia de PWM. Pe ventilator nu se sesizeaza perioadele moarte ramase (de la resetul lui DS18B20 si de la celelalte operatiuni necesare pentru functionarea lui) doar ledul clipeste usor. Nu pot aprecia corect cit tine un ciclu PWM-si nici nu am timp de fineturi de acest tip- dar s-ar putea elimina si aceasta clipire, inserind cicluri PWM peste tot unde avem functii de tip delay.
O alta metoda ar renuntarea la PWM pe led,  eventual atasarea unui condensator electrolitic care sa se descarce pe led, dar asta ramiine pe alta data.
Atasat codul functional(cu clipit cu tot).


Update: am vazut astazi o schema in care cineva punea inclusiv o inductanta   intre tensiunea de alimentare si pinul de Vcc, iar condensatorul era inlocuit cu doua condensatoare (pe Vcc si pe Vss cite unul). Banuiesc ca autorul schemei folosea montajele in zone foarte "zgomotoase". Ce e important e faptul ca el spunea ca merge foarte bine. Ca idee de testat pe viitor daca mediul de lucru ar fi cu probleme.














duminică, 23 octombrie 2011

Reintoarcerea la radacini...

Dupa cum spune si titlul blogului o sa incerc sa punctez "chinurile" prin care trec ca sa reinvat ce stiam(oare??) despre microcontrolerele de la Microchip.
Primul contact l-am avut cu ele in facultate. La acel moment PIC16F84 era virful de lance al celor de la Microchip. Asa ca si lucrarea de stat tot cu el a fost -acces pe baza de cartela magnetic  controlata/arhivata de un PC. "Inima" era un PIC16F84 care realiza citirea informatiilor de la cititorul de cartele si urma sa trimita pe un RS485 datele la PC. Cum era greu de gasit la vremea aceea RS485, am realizat cu RS232. Asta e, oricum am luat 9.50 pe lucrare.
Apoi viata ma trimis in cu toate alte directii. Acum am inceput sa reinvat dintr-o necesitate:trebuie sa realizez un dispozitiv pe care il consider necesar pentru siguranta unei incaperi. Asa ca dai cu invatatul.
Doar ca gama de microcontrolere a crescut foarte mult.....
Si pentru aducere aminte o sa incep cu PIC12F675.