BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Signalizacija

Ką gi kai jau turiu savo dirbtuves, jas kaip ir viską reikia apsaugoti nuo pašalinių, o ypač nuo ilgapirščių. Tiesa nors ir šiap tokiu bent ten kur gyvenu tokiu beveik nera, na bet kaip sakoma: “atsarga gėdos nedaro”.

Na o įdėja štai tokia: pajungiu 2 IR LED ir 2 IR fototranzistorius, kurie priims is šviesos diodų šviesą, kai nutrūks spindulys reiškias kažkas iėjo i kambarį, fototranzistorius sureguoja ir signalas nueina tarkim i mikrovaldiklį, o šis savo nuožiūra: opt! uždaro duris ir jas užrakina. Ir smalsuolis lieka viduje, na o ją būtų galima išjungti tik tam tikru kodu ar kaip nors kitaip.

Pora pafantazavimu kaip viskas turetu atrodyti:

Su fototranzistoriais bus gana paprasta ledai sviecia ir tiek. IR fototranzistorių gaunama signalą stiprina operacinis stiprintuvas, na o tada signalas i mikrovaldiklį.

Tai dabar šiek tiek reikės palaukt kol visiškai išmeginsiu ir konkrečiai susigalvosiu kur? kas? kaip?.  tada pradesiu det video ir foto viso šio gėrio.

Taigi pirmieji programos fragmentai, kuriuos galima naudoti ir kitiems projektas, na kaip sakant pats pagrindas ant kurio buna lipdomos kitos programos:

Keypad kitap klaviaturos valdymas:

#include <avr/io.h>

int main(void)

{
DDRD = 0b1110000;
PORTD = 0b0000;
DDRB = 0b11111111;

while(1)
{

//pirmas stulpelis
PORTD = 0b1000000;

if(PIND&(1<<DDD0))// pirma eilute
PORTB = 0b1;

if(PIND&(1<<DDD1))//antra eilute
PORTB = 0b11;

if(PIND&(1<<DDD2))//trecia eilute
PORTB = 0b111;

if(PIND&(1<<DDD3))//ketvirta eilute
PORTB = 0b1111;

//anras stulpelis
PORTD = 0b0100000;

if(PIND&(1<<DDD0))// pirma eilute
PORTB = 0b101;

if(PIND&(1<<DDD1))//antra eilute
PORTB = 0b1001;

if(PIND&(1<<DDD2))//trecia eilute
PORTB = 0b10001;

if(PIND&(1<<DDD3))//ketvirta eilute
PORTB = 0b100001;

//trecias stulpelis
PORTD = 0b0010000;

if(PIND&(1<<DDD0))// pirma eilute
PORTB = 0b00011000;

if(PIND&(1<<DDD1))//antra eilute
PORTB = 0b00111100;

if(PIND&(1<<DDD2))//trecia eilute
PORTB = 0b01111110;

if(PIND&(1<<DDD3))//ketvirta eilute
PORTB = 0b11111111;

}

}

Pora pastabu sioje programoje DDRB, PORTB reikalingi tik indikacijai, na cia tam, kad galetumete pamatyti veikimą. O jis gana paprastas jungiamas pirmas stulpelis ir tikrinama kuri is knopkiu ijungta, veliau 1-asis stulpelis isjungiamas ir jungiamas antrasis stulpelis ir vel tikrinama paspausta knopke, na kad butu aiskiau video:

bei schema:

dar truputi info apie schema: PD0…PD3 yra input’ai, o PD4…PD6 junginejama 5V tokiu būdu:

PD4               PD5                 PD6

+5V                 0V                  0V

0V               +5V                  0V

0V                 0V                +5V

junginejimo ciklas amžinas.

Kaip ir viska pasakiau, jei turite klausimų rašykite, geriau forume :D

Taigi , kaip žadėjau schemą baigiau, na gerai nemeluosiu dar liko spynos užrakinimo shemutę pasidaryti, su ja kogero dirbsiu rytoj, na iš pradžiu programa:

#include <avr/io.h>
#include <util/delay.h>

#define kaka _delay_ms(2)
#define mirkt _delay_ms(100)

int main(void)

{
DDRD = 0b1110000;
PORTD = 0b0000;
DDRB = 0b11100000;
DDRA = 0b11;

unsigned char a, b, c, d;
while(1)
{
/////////////////////////////////////////////////////////////////////////////////////////////

if(PINB&(1<<DDB0))//////////jei praejo pro IR sviea//////
{
PORTB = 0b01100000;/////////uzrakina/////////////////////
}
else
{
/////////////////////jei is spinos valdymo bloko ateina 5V///////
if(PINB&(1<<DDB4))
{
//////////jei lenda prie dezes///////////
if(PINB&(1<<DDB3))
{
//////////mirksi signalizacijos lempa ir spiegia garsiakalbis///////
PORTA = 0b11;
mirkt;
PORTA = 0;
mirkt;

/////////////////////////////kodo ivedimas//////////////////
//pirmas stulpelis
PORTD = 0b1000000;

if(PIND&(1<<DDD0))// pirma eilute
PORTB = 0b01100000;

if(PIND&(1<<DDD1))//antra eilute
PORTB = 0b01100000;

if(PIND&(1<<DDD2))//trecia eilute
PORTB = 0b01100000;

if(PIND&(1<<DDD3))//ketvirta eilute
{
a = 1;//////atrakinimo pirmas
}
else
{
a = 0;
}

kaka;
//anras stulpelis
PORTD = 0b0100000;

if(PIND&(1<<DDD0))// pirma eilute
PORTB = 0b01100000;

if(PIND&(1<<DDD1))//antra eilute
{
b = 1;///// atrakinimo antras
}
else
{
b = 0;
}

if(PIND&(1<<DDD2))//trecia eilute
{
c = 1;///// atrakinimo trecias
}
else
{
c = 0;
}

if(PIND&(1<<DDD3))//ketvirta eilute
PORTB = 0b01100000;

kaka;
//trecias stulpelis
PORTD = 0b0010000;

if(PIND&(1<<DDD0))// pirma eilute
PORTB = 0b01100000;

if(PIND&(1<<DDD1))//antra eilute
PORTB = 0b01100000;

if(PIND&(1<<DDD2))//trecia eilute
{
d = 1;///// atrakinimo ketvirtas
}
else
{
d = 0;
}

if(PIND&(1<<DDD3))//ketvirta eilute
PORTB = 0b01100000;

kaka;

PORTD = 0b00000000;
kaka;
//////////////////////////////jei kodas atitinka atrakinam kodu////////////
if(a == 1)
{
if(b == 1)
{
if(c == 1)
{
if(d == 1)
{
PORTB = 0b10000000;
}
else
{
PORTB = 0b01100000;
}
}
else
{
PORTB = 0b01100000;
}
}
else
{
PORTB = 0b01100000;
}
}
else
{
//////////// arba raktu//////////////
if(PINB&(1<<DDB1))
{
if(PINB&(1<<DDB2))
{
PORTB = 0b10000000;
}
}
else
{
PORTB = 0b01100000;
}
}
////////////////////////////////
}
else
{
PORTB = 0b01000000; // uzkertam spyna
}
///////////////////////////////////////////
}
else
{
PORTB = 0;//////////// jei is spynos valdymo bloko niekas neateina viskas ok//////
}
}

////////////////////////////////////////////////////////////////////////////////////
}

}

Kas svarbiausia lygtais visur pakomentavau, o dabar schema su šiokiais tokiais paaiškinimais:

Tai pat dar pora pastabų: PA1 koja skirta garsiniai sirenai, jos schemu galima rasti internete, ko gero kai pilnai viska baigsiu pribraižysiu ir ją.

jei spina yra tik užrakinama PB5, PB6 išejime iš 0 pasikeičia į 5V, jei lendama prie dėžutės ir bandoma ja atidaryti spynos užkirtimui +5V išeina tik iš PB6. O atrakinimui signalas išeina iš PB7.

(Tiesa, prie PB4 neturi būti prijungtas pliusas, čia bandžiau ir pamiršau nutrinti). Durys neatsirakina, tol kol iš PB7 neiseina +5V ir į PB4 neateina 0V.

Žinoma kogero bus dar pilna galybė modifikavimu, bet na kaip sakant geri griaučiai jau yra. Ka gi jei turite klausymų pasiūlymų rašykit, arba čia arba forume.

Štai vakar (2011-03-02) siek tiek pakoregavau kodo ivedimo programos dali (keypad’o), tiesa taipogi pavyzdys yra “griauciu” formoje, tam, kad ji galima butu naudoti ir kitiems projektams:

#include <avr/io.h>
#include<util/delay.h>

#define laiko_tarpas_klaviaturai _delay_ms(2)

#define mykreg DDRD //klaviaturos registras
#define mykio PORTD // myktuku input output registras

#define p_eile PIND&(1<<DDD0) // mygtuku pirma eile
#define a_eile PIND&(1<<DDD1) // mygtuku antra eile
#define t_eile PIND&(1<<DDD2) // mygtuku trecia eile
#define k_eile PIND&(1<<DDD3) // mygtuku ketvirta eile

int main(void)

{
mykreg = 0b1110000;
mykio = 0b0000;

unsigned char an = 0;

while(1)
{

laiko_tarpas_klaviaturai;
//pirmas stulpelis
mykio = 0b1000000;

if(an == 0)
{
if(p_eile)// pirma eilute 1
{
an = 1;
}
else
{
an = 0;
}
}

if(an == 1)
{
if(a_eile)//antra eilute 4
{
an = 2;
}
else
{
an = 1;
}
}

if(t_eile)//trecia eilute 7
an = 0;

if(k_eile)//ketvirta eilute *
an = 0;

laiko_tarpas_klaviaturai;
//anras stulpelis
mykio = 0b0100000;

if(an == 3)
{
if(p_eile)// pirma eilute 2
{
an = 4;
}
else
{
an = 3;
}
}

if(a_eile)//antra eilute 5
an = 0;

if(an == 2)
{
if(t_eile)//trecia eilute 8
{
an = 3;
}
else
{
an = 2;
}
}

if(k_eile)//ketvirta eilute 0
an = 0;

laiko_tarpas_klaviaturai;
//trecias stulpelis
mykio = 0b0010000;

if(p_eile)// pirma eilute 3
an = 0;

if(a_eile)//antra eilute 6
an = 0;

if(an == 4)
{
if(t_eile)//trecia eilute 9
{
PORTB = 0b11111111;
}
else
{
an = 4;
}
}

if(k_eile)//ketvirta eilute #
an = 0;

}
}

Pora paaiskinumų:

dabartinis kodas:14829 suvedus si koda, PORTB igyja logini 1 t.y +5V
Norint pakeisti koda reikia vietoj:

if(an == 0) // nulis parodo skaiciaus sekos pradzia, 1-tas antras skaitmuo, 2-tas trecias skaitmuo ir t.t
{
if(p_eile)
{
an = 1; //jei skaiciaus seka  su paspaustu mygtuku einam iki kito skaiciaus
}
else
{
an = 0; // jei paspaudimas neatitiko skaiciu sekos gryztam i pradine padeti
}
}

parasyti:
if(p_eile)
an = 0;

Arba atvirksciai jei prie kodo norite prideti kita skaiciu. Na bandysiu programa redaguoti taip, kad nereiktu keisti pacios programos, na bet kaip sakant, gera pradzia puse darbo. Si programa geresne uz pirma todel, kad turi buti mygtuku paspaudimo seka pvz.: jei paspaudus 1 paspausi 7 vietoj ketverto reikes koda vesti is naujo ir nereikes spausti visu mygtuku vienu metu kaip buvo pirmojoje programos versijoje.

Va šiandien (2011-03-06)jau daug maž pabaigiau tiek schemą tiek pačią programą. Dabar trumpai apie signalizacija: yra du mikrovaldikliai 1- masis valdymo blokui, 2-asis spynos bei duru valdymui. Na ka čia šnekėti geriau iš kart imetu schemą:

Tiesa yra keletas pakeitimu: panaikinau rakta is vidaus, pakaks ir kodo ivedimo, sumazinau loginiu komponentu kieki (tiesa ju dar nemazai liko).

programa ( pagrindinio bloko):

#include <avr/io.h>
#include<util/delay.h>

#define laiko_tarpas_klaviaturai _delay_ms(2)
#define begam_uzrakine _delay_ms(5000)

#define mykreg DDRD //klaviaturos registras
#define mykio PORTD // myktuku input output registras
#define rinti DDRB // signalizacijos i/o registras
#define oplia PORTB // o/i portas

#define p_eile PIND&(1<<DDD0) // mygtuku pirma eile
#define a_eile PIND&(1<<DDD1) // mygtuku antra eile
#define t_eile PIND&(1<<DDD2) // mygtuku trecia eile
#define k_eile PIND&(1<<DDD3) // mygtuku ketvirta eile

#define raktas PINB&(1<<DDB2) // rakto portas
#define restartas PINB&(1<<DDB3) // rakto myktuko portas

#define off 1<<DDB5 // signalizacijos isjungimui
#define on 1<<DDB6 // signalizacijos ijungimui

#define praejo_ir PINB&(1<<DDB0) // ir fototranzistoriu busenai suzinoti

#define lendi PINB&(1<<DDB1) // dezutes atidarymo jutikliu busenai suzinoti

#define kertam 1<<DDB4 // spynos uzkirtimui

int main(void)

{
mykreg = 0b1110000;
mykio = 0b0000;

rinti = 0b11110000;
oplia = 0b0000;

unsigned char an = 0;

while(1)
{

if(lendi)
{
oplia = kertam;
break;
}
else
{

if(praejo_ir)
{
oplia = on;
}

laiko_tarpas_klaviaturai;
//pirmas stulpelis
mykio = 0b1000000;

if(an == 0)
{
if(p_eile)// pirma eilute 1
{
an = 1;
}
else
{
an = 0;
}
}

if(an == 1)
{
if(a_eile)//antra eilute 4
{
an = 2;
}
else
{
an = 1;
}
}

if(t_eile)//trecia eilute 7
an = 0;

if(k_eile)//ketvirta eilute *
an = 0;

laiko_tarpas_klaviaturai;
//anras stulpelis
mykio = 0b0100000;

if(an == 3)
{
if(p_eile)// pirma eilute 2
{
an = 4;
}
else
{
an = 3;
}
}

if(a_eile)//antra eilute 5
an = 0;

if(an == 2)
{
if(t_eile)//trecia eilute 8
{
an = 3;
}
else
{
an = 2;
}
}

if(k_eile)//ketvirta eilute 0
an = 0;

laiko_tarpas_klaviaturai;
//trecias stulpelis
mykio = 0b0010000;

if(p_eile)// pirma eilute 3
an = 0;

if(a_eile)//antra eilute 6
an = 0;

if(an == 4)
{
if(t_eile)//trecia eilute 9
{
oplia = off;
}
else
{
an = 4;
}
}

if(k_eile)//ketvirta eilute #
an = 0;

}

////////////////////////////////////////////////////////////////////////
}
}

bei spynos valdymo:

#include <avr/io.h>

int main(void)
{

DDRD = 0b0000000;
PORTD = 0b0000000;

DDRB = 0b1111;

while(1)
{
///////////////////////////////////////////////////////

if(PIND&(1<<DDD0)) ///gaunamas signalas jei prie dezutes jutikliu nelendama
{
if(PIND&(1<<DDD1)) // atrakinti spyna is vidaus
{
PORTB = 1<<DDB1;
}
if(PIND&(1<<DDD2)) //rakinti spyna
{
if(PIND&(1<<DDD6))// duru padeties nustatymui
{
PORTB = 1<<DDB0; // jei gaunamas signalas jog durys uzdarytos uzrakinam spyna
}
else
{
PORTB = 1<<DDB2; // jei ne su varikliu uzdarinejam duris
}
}
else
{
PORTB = 1<<DDB1;
}
}
else // jei palindo prie dezutes jutikliai sureaguoja:
{
if(PIND&(1<<DDD3)) // jei tinka raktas is lauko
{

if(PIND&(1<<DDD4)) // jei papaudziam atrakinti spyna
{
PORTB = 1<<DDB1; // ja atrakinam
}
else
{
if(PIND&(1<<DDD5))
{
PORTB = 1<<DDB3;
}
else
{
if(PIND&(1<<DDD6)) // tikrinam duru padeti
{
PORTB = 1<<DDB0;// jei uzdarytos rakinam
}
else
{
PORTB = 1<<DDB2;// jei ne uzdarinejam
}
}
}
}
else// jei rakto nera arba jis neatitinka
{
if(PIND&(1<<DDD6)) // tikrinam duru padeti
{
PORTB = 1<<DDB0;// jei uzdarytos rakinam
}
else
{
PORTB = 1<<DDB2;// jei ne uzdarinejam
}

}

}

///////////////////////////////////////////////////////
}
}

na kagi beliko tik surinkti ir isbandyti :D

Rodyk draugams

Komentarai (14)

  1. [...] Signalizacija [...]

  2. [...] Signalizacija [...]

  3. marius:

    idomu ir kaip idomu.o su kodais tai galetum paprasta mygtuku kombinacija padaryt pvz. http://www.youtube.com/watch?v=B1WjvxLZ6s8

  4. sia beda isprendziau kiek kitaip, na toki dalyka gaminu, kuriame reikia pagalvoti ir taip, kaip galvoja ir lendantysis ten kur nereikia, na vienu zodziu, stengiuos gaminti tokia sistemele, kuriai reiktu kodo ir spec. rakto. Siandien jau beveik baigiau schemute ko gero rytoj visiskai uzbaigsiu, jei neturesiu kitu planu, programa pletojama panasiu tempu kaip ir schema. Taigi atskleisiu kaip sugalvojau gaminti spec. rakta. Signalizacijoje bus signalu generatorius, istacius rakta ( rakte tai pat yra signalu generatorius) su viena knopke paleisiu juos abu vienu metu, ir jei signalas atitinka man atrakina spyna, o is vidaus reikes papildomai suvesti koda ir tiek. Tai pat apgalvojau ir apie tai, jei budamas smalsuolio vietoje ir sugalvociau lysti “po dangciu” automatiskai sureaguotu dezutes davikliai ( kuriuos teko tai pat paciam sugalvoti) spyna butu uzkertama ir sistema isjungta, taip, kad duris butu galima atidaryti tik is lauko. Na jei idomu, per siandien visiskai issprendziau IR spindulio pertraukimo uzdavini, kodo ivedimo klausimus - jie jau daug maz pilnai pabaigti, o rakta, bei visa mechanine dali paliksiu rytdienai. Ir tai po schemos baigimo, surinkimo, gali dar kas nors pasikeisti.

  5. marius:

    beje vietoj (ir led) dek lazerius nes ir kaip led(tik (ir led) nematomas zmogui bet principas tas pats)lazeriai paduos viena tikslu taska o ne kaip (ir led) visa apsvietima kuris bus visai netiklus.nes as kaip labiau technikas o ne elektronikas (nors elektronika ismanau gerai) tai tekao kazka panasaus darit ir man

  6. kaip netikslus testavausi su paprastu 5mm IR led svieciau is kokiu 3m fototranzistorius reagavo kuo puikiausiai: vos tarp led ir fototranzistoriaus pakisus kazka indikacijai skirtas ledas is kart sureguodavo. Taipogi jei su ledu vos siek tiek pakreipdavau kur i sona ant indikacijos ledo tas labai smarkiai pasimatydavo. maksimalus bandant atstumas sieke apie 3.5m daugiau neisejo pritruko vietos dirbuvelese. Ir juk be to lazeriu ir led kainos zenkliai skiriasi. Ir jei pavyks su led’ais si signalizacija bus gana nebrangi signalizacijos sistema

  7. marius:

    pastebeta klaida.kaip tu tarkim budamas dirbtuvese (is vidaus) atidarysi duris jei jos bus uzdarytos :D

  8. pries ieidamas i vidu su raktu isjungiu signalizacija ir einu i vidu arba jei esu viduje ir durys uzrakintos surenku koda ir tuo metu el magnetas bei variklis isjungiami, o kur tiksliau klaida matai gal gali konkretizuoti programoje ar schemoje butinai istaisysiu ir dekui uz pastebejima ;)

  9. marius:

    cia tik toks pastebejimas ir buvo.as labiau uzsimu schemomis kur nera programuojamu kontroleliu o paprasti nusiperki ir pagal schema delioji

  10. marius:

    dar vienas dalykas bet man atrodo cia apie tai pasakei.tarkim tu buni dirbtuvese ir kazkas praeina ir pazeidzia IR led spinduliavimo lauka ir duris uzsidaro.kaip atidarysi

  11. taip jau sakiau kaip: “pries ieidamas i vidu su raktu isjungiu signalizacija ir einu i vidu arba jei esu viduje ir durys uzrakintos surenku koda…” kaip zinia jei signalizacija isjungta tuo metu ji neveikia

  12. norejau paklaust ar si programa tinka su mplab programa?

  13. ne mplab daugiausia pikam skirta tai ji netiks sukompiliuti situ kodu

Rašyti komentarą