Paprastas, tačiau „sunkus“ valdiklis

Tai štai esmė paprasta – yra jungiklis, nefiksuojams ir jam reikalingas valdiklis, jog jo laikinas paspaudimas būtų konvertuojamas į fiksuotą signalą, kitaip tariant, omenyje turiu – priešrūkinių šviesų jungiklį.  Teoriškai esant tobuloms sąlygomis tai neatrodo ganėtinai sudėtinga, tačiau keblumų kelia ne kas kita, o tai, jog priešrūkinis jungiklis naudojamas ne kur nors prie labaratorinio maitinimo šaltinio, o automobiliuose, kur kone visur pilna trikdžių.

Žinoma šį valdiklį galima realizuoti panaudojant 4 rėles ir 2 diodus:

 

latched_on_off_output_with_momentary_pulse
Rėlinė logika

Viskas gal ir būtų neblogai, tačiau rėlės užima vietos , bei taipogi „klaksi“.

Kitų metodų realizuoti tokį valdiklį yra ganėtinai nemažai , tarkime naudojant 555 timerį, P ir N lauko tranzistorių, logines mikroschemas, mikrovaldiklį ir t.t.

Grubiai tariant jų išbandžiau nemažai ir priėjau išvados, jog geriausiai veikia 1 bito skaitliukas.

 

1_bit_logika
1-bit skaitliukas

 

Čia kaip pavyzdį paėmiau seną prototipinę schemą (trūksta maitinimo diodo) ,  tam , kad būtų daugiau paveiksliukų tekste 😀 .

Na, gal geriau pakalbėsiu apie neveikiančias schemas ir jų neveikimo priežastys.

Kone pati pirmoji schema buvo su lm555 arba ne555 ir t.t. mikroschema. Ji ko puikiausiai veikė, kai jį maitinama būdavo nuo laboratorinio maitinimo šaltinio . Tačiau įdėjus i automobilį pradžioje išlindo toks reikalas, jog jis labai jautriai reaguodavo tai į posūkių signalus ar šiaip į kažką – atsitiktinai įsijungdavo ar išsijungdavo (kalba eina, kai automobilis užvestas) , žinoma tokią problemą išspresdavo diodas ir didelės talpos kondensatorius, na bet tai jau vadinu „chaltūra“.

Taip pat buvau pasigaminęs vieną valdiklį su N ir P lauko tranzistoriais tikslai koks buvo nepamenu, gal irf7319…. Šis bandymas iki automobilio nenukeliavo, kadangi vos tik gavęs maitinimą jo išėjime atsirasdavo +12V, tuomet būtų reikėję papildomai naudoti kažką signalo invertavimui, vėliau pridėti dar vieną tranzistorių signalo stiprinimui ir t.t.

3-iasis bandymas, net nebuvo pagamintas , nes tai jau būtų buvę per daug- norėjau panaudoti mikrovaldiklį, nors schemą ir suprojektavau, jos net kaip ir sakiau, net negaminau.

Galiausiai nusprendžiau panaudoti D tipo flipflop ‘ą – rezultatas geras , tačiau jam reikalinga 5V maitinimas ir būtent dėl to schemoje atsiranda įtampos stabilizatorius. Na bet tai vieni juokai.  Šis variantas jau buvo išbandytas su automobiliais ir jis vis dar tobulinamas.  Paskutiniame variante naudojamos 1g74 , mic5205 mikroschemos, o signalą stiprina išmanusis bts 441 P kanalo lauko tranzistorius.

paskutine_versija
Vėliausiosios valdiklio versijos 3D vaizdas

Žinoma buvo planų bandyti gaminti schemą su pastūmos registrais , bet planai liko planais , jei jau rastas optimaliausias variantas.

Trūksta tik papraščiausio dalyko!

Tai štai, po kurio laiko, kuomet atsirado laisvesnio laiko, nusprendžiau grįžti atgal prie WS212 Led šviesos diodų. Optimizavau programą, bei patobūlinau įgūdžius lituojant 0402 standarto varžytes ir kondensatorius.

20180708_194045
Sulituota bandomoji plokštė
ws212_schema
Scema

Viskas gavosi gana neblogai,   kas susiję su mikrovaldikliu veikia nepriekaištingai, tačiau šiesos diodams buvo pasirinktas per „slabnas“ maitinimo stabilizatorius.  Nors pagal jo  aprašymą, šį keitiklį galima apkrauti iki 3A srove, tačiau, jo generuojamoje įtampoje trikdžiai atsiranda jau ir prie 250mA apkrovos. Tuo metu apytiksli trikdžių amplitudė siekia iki maždaug 900mV , ko pasekoje į tai reaguoja tiek mirovaldiklis tiek ir patys šviesos diodai.

Na, o kas svarbiausia, tai, jog schema buvo išbandyta ir ji veikia. Ateitčiai šį mp1584 led draiverį mėginsiu pakeisti į  tps40200.

Kelių sekundžių video (programos kodo nėra)

Ir pabaigai šiek tiek optimizuota programa, tačiau ji tai pat tstinė. Kitaip, tariant čia sau pačiam špargalkė.

Išskleisti

/*
* begantys posukiai.c
*
* Created: 2018.07.07 18:30:48
* Author : Saulius Stasys
*/

#define F_CPU 16000000
#define slide 15 // laiko intervalas šliaužimui

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

void on (void)
{
//ON
PORTB=0<<PB1; //
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);//apie 0,7uS
PORTB=1<<PB1;
asm(„nop“);asm(„nop“); //apie 0,6uS
}

void off (void)
{
//OFF
PORTB=0<<PB1; //
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);//apie 0,35uS
PORTB=1<<PB1;
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“); //apie 0,8uS
}

void rgb (uint8_t r, uint8_t z, uint8_t m)
{
// 8 bitų spalvų kodų generavimui, kiekvienai spalvai
for (uint8_t j=0;j<3;j++) //3 k. kartojimas zaliai raudonai ir melynai
{
uint8_t a=0, d=128,t=1;
if (j==0) a=z;
if (j==1) a=r;
if (j==2) a=m;

for(uint8_t i=0;i<8;i++) // 8 bitų skaidymas
{
if (a-(d/t)>=0) // konkrečios reikšmės vertimas į dvejetainį kodą
{
a-=(d/t); // jei 1 tai platus signalas
on();
}
else off(); // jei ne siauras
t=t*2; // kintamasis matiekai
}
}

}

void simple (uint8_t r, uint8_t z, uint8_t m, uint8_t sk)
{
//paprastas ledu uzdegimas
for (uint8_t i=0; i<sk; i++)rgb(r,z,m);
_delay_us(50);
}

void snake(uint8_t r,uint8_t z, uint8_t m, uint8_t sk)
{
for (uint8_t i=0;i<sk+1;i++)
{
//gyvate
for (uint8_t o=0;o<i;o++)rgb(r,z,m); _delay_ms(slide);

}
}

int main(void)
{

DDRB=1<<DDB1|0<<DDB2;

while(1)

{
//testas
if(PINB&(1<<DDB2))snake(25,9,0,24); // spalva ir kiek ledų
else simple(5,5,5,24);
}

}