Darkroom timer (didintuvo laikmatis)


Spausdinant nuotraukas analoginiu būdu (apie tai rašiau čia) labai svarbus laikas. Bandžiau suktis iš situacijos naudodamas telefono programelę, bet telefono ekranas, kad ir rodo juodą spalvą, jis yra apšviestas ir skleidžia baltą šviesą.

Tokių prietaisų tikrai yra pirkti, tiek senų rusiškų, tiek šių laikų, modernių. Niekada neteko tokio naudoti. Nusprendžiau susikonstruoti savo. Tad maniškio valdymas yra toks kokį aš jį įsivaizdavau/sugalvojau.

Mano prietaiso mintis yra valdyti didintuvo lempą. Dešiniam šone yra rozetė į kurią jungiasi didintuvas. Didintuvo lempą priverstinai galima įjungti su viršuje esančiu jungikliu. Jungiklis didelis, tad tamsoje problemų jį apčiuopti ir junginėti nekilo.

Užprogramavimas.

Įjungus prietaisą ekrane šviečia nulis. Klaviatūros pagalba galima suvesti laiką sekundėmis. Suvedus laiką pasirenkam kuriam laikmačiui užstatyti suvestą laiką. Jų yra keturi. Tai raidės “A”, “B”, “C” ir “D” klaviatūros dešinėje.

Tarkime noriu, kad didintuvas popierių apšviestu 15sek, 2min pirmoje chemijoje (develop), 1min antroje (stop) ir 2min trečioje (fix).

Tad klaviatūroje suvedu “15” ir spaudžiu “A”, “120” ir spaudžiu “B”, “60” ir spaudžiu “C”, “120” ir spaudžiu “D”.

Paspaudus klaviatūroje “#” prasideda sekos vykdymas. 15’ikai sekundžiu suveikia rėlė ir užmaitina rozetę, ko pasekoje didintuvas apšviečia popierių. Po to pasigirsta pyptelėjimas ir ekranėlyje pasirodo skaičius 120. Laikas popierių dėti į pirmą vonelę. Kas sekunde ekranėlyje skaičius mažėja iki nulio (laikmatis B). Pasiekus nulį, vėl pasigirsta pyptelėjimas. Laikas popierių perkelti į antrą vonelę. Ekranėlyje pasirodo skaičius 60 (laikmatis C). Vėl mažėja iki nulio ir vėl pasigirsta pyptelėjimas. Laikas popierių perkelti į paskutinę vonelę. Ekrane pasirodo 120 (laikmatis D) ir mažėja iki nulio. Paskutinį kartą pasigirsta pypsėjimas. Dabar galima įjungti šviesą ir įvertinti rezultatą.

Viskas sukonstruota WeMos D1 R1 pagrindu. Programuota arduinu.

Žemiau nuotraukoje matosi visos panaudotos detalės.

Nuorodos iš kur pirkau:
WeMos D1 R1 https://www.aliexpress.com/item/32657998940.html
Klaviatūra https://www.aliexpress.com/item/32831963425.html
Ekranėlis (raudonas) https://www.aliexpress.com/item/32867950441.html
Rėlė https://www.aliexpress.com/item/32639452633.html
Spykeriukas https://www.aliexpress.com/item/32955065577.html
Maitinimo šaltinis https://www.aliexpress.com/item/32656713529.html
Jungiklis ir rozetė https://www.ermitazas.lt/
Dėžutė https://rcl.lt/

Klaviatūrai nuskaityti panaudojau Keypad https://playground.arduino.cc/Code/Keypad/
Plačiau kokiu principu veikia: http://www.circuitbasics.com/how-to-set-up-a-keypad-on-an-arduino/

Su klaviatūra buvo dvi bėdos. Pirmoji, kad veikė ne visi klavišai. Išardęs pamačiau, kad naudojami takelių “jumperiai”, kurie, panašu turėjo kažkokią varžą.

Matosi nuotraukoje, kad prilitavau savo “jumperius”. Klaviatūra pradėjo veikti.

Bet štai išlindo antra bėda, kontroleris tiesiog persikraudinėdavo. Pagooglinus randu https://github.com/esp8266/Arduino/issues/3241
Rezultate Keypad.cpp faile 213 eilutėje pridedu yield()
Dabar ji atrodo taip:

while( (waitKey = getKey()) == NO_KEY ) yield();;   // Block everything while waiting for a keypress.

Ekranėlį valdau su TM1637 (galima rasti Arduino Library Manager’yje). Ekranėlis šviečia raudonai (raudonos šviesos nebijo juodai baltas foto popierius). Pagal nutylėjimą jis šviečia gan ryškiai, tamsoje man to nereikia, tad šviesumą mažinu iki minimumo. Kodas:

display.setBrightness(0);

Spykeriukas spiegia gan garsiai, tad bandymo keliu atrenku varžą ir pajungiu nuosekliai. Kokia tai varža nebepamenu, orientavausi į norima garsumą.

Aparatas jau išbandytas, darbas daug smagesnis, veikė taip kaip noriu ir nei kart nepavedė.

ATmega fuse nustatymai

Pirmą kartą bandant nustatyti fuse pagal šį puslapį http://www.engbedded.com/fusecalc kažką sumaišiau ir kontroleris patapo neveiksnus. Nusipirkus antrą kontrolerį ir po kiek laiko vis dėlto vėl prisireikė didesnio dažnio ir čia visai netyčia atradau AVR8 Burn-O-Mat: a GUI for avrdude. Archlinux’e galima įdiegti:

yaourt -S avr8-burn-o-mat

Programa paprasta ir aiški. Antras bandymas pasisekė ir dabar mano kontroleris dirba su išoriniu kvarcu.

Ekranvaizdis_2015-01-27_23-38-27

ATmega16 jungimas su kompiuteriu (USB)

Pirmiausia pramokus šiek tiek kaip elgtis su LED’ais, mygtukais prijungtais prie ATmegos, greitai atsiranda noras surinkta informaciją atiduoti kompiuteriui arba iš kompiuterio pasiųsti tam tikras komandas, kad kontroleris galėtu jas vykdyti.

Taigi pirmasis bandymas buvo pasinaudojus MAX232 ir COM <-> USB perėjimu perduoti/priimti informaciją su kontroleriu. Nežinau tai buvo litavimo klaida, o gal sugebėjau kažkaip sugadinti MAX232, bet niekaip nepavyko priimti duomenų iš ATmegos. Išsiųsti sekėsi puikiai, kontroleris junginėjo LED’us pagal kompiuterio siunčiamas komandas.

Pasibaigus kantrybei buvo nuspręsta atsisiųsti jau pagaminta UART’ą. DealExtreme e parduotuvė čia puikiai pasitarnavo. Pajungus viskas iškarto veikė. Duomenys vaikščiojo į abi puses.

Linux’as įrenginį atpažysta taip:

[ 7884.863380] usbserial: USB Serial support registered for generic
[ 7884.864737] usbcore: registered new interface driver cp210x
[ 7884.864756] usbserial: USB Serial support registered for cp210x
[ 7884.864798] cp210x 2-5:1.0: cp210x converter detected
[ 7884.864951] usb 2-5: cp210x converter now attached to ttyUSB0

Pirma klaida dėl kurios galima ilgam strigti tai RX sujungimas su RX, o TX su TX. Teisingas jungimas būtų ATmegos16A RXD (14’ta koja) reikia jungti su UART’o TX’u, o ATmega16A TXD (15’ta koja) reikia jungti su UART’o RX’u. Reiktu neužmiršti sujungti ir trečiojo laido tai GND.

Kad būtų patogiau, panaudojau laidus iš kompiuterinio korpuso.

IMGP9853.PEF_MLSZSX

Testavimui susikompiliuoju tokį kodą:

// Kvarco taktinis dažnis
#define F_CPU 4000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

// Susijungimo greitis
#define USART_BAUDRATE 9600UL
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)


void USARTInit(uint16_t ubrr_value)
{
   //Set Baud rate

   UBRRL = ubrr_value;
   UBRRH = (ubrr_value>>8);

   /*
   >> Asynchronous mode
   >> No Parity
   >> 1 StopBit
   >> char size 8
   */

   UCSRC=(1<<URSEL)|(3<<UCSZ0);

   //Įjungiam gavima ir siuntimą
   UCSRB=(1<<RXEN)|(1<<TXEN);


}



//Funkcija naudojama duomenims nuskaityti
//Ši funkcija lauks tol kol atsiras kažkokie duomenys
char USARTReadChar()
{
   while(!(UCSRA & (1<<RXC)))
   {
      //Nieko nedarom
   }
   return UDR;
}

//Rašom duomenys į UART'ą
void USARTWriteChar(char data)
{
   while(!(UCSRA & (1<<UDRE)))
   {
      //Nieko nedarom
   }
   UDR=data;
}


void main()
{
   // Kintamasis
   char data;

   // Susijungiam
   USARTInit(BAUD_PRESCALE);

   // Amžinas ciklas
   while(1)
   {
      // Nuskaitom simbolį
      data=USARTReadChar();

      // Nuskaitytą simbolį gražinam atgal tik
      // jį apskliaudžiam laužtiniais skliaustais    

      USARTWriteChar('[');
      USARTWriteChar(data);
      USARTWriteChar(']');

   }
}

Rezultatas:
Ekranvaizdis - 2015.01.26 - 20:49:41

Pirmi žinksniai su ATmega16

Apie šitą gėrį skaičiau jau senokai, bet niekaip neprisiruošdavau. Bet išaušo ta diena.

Pirmiausia užsisakiau programatorių. Kainavo pilnai su siuntimu ~28LTL. Pirktas iš ebay, USBasp klonas (http://www.fischl.de/usbasp/). Atkeliavus programatoriui jau gumos netempiau, nes labai norėjosi išbandyti kaip viskas veikia. Susipirkau ko reikia ir susilitavau schemą pateikta elektronika.lt puslapyje.

Pora pakeitimų, tai šviesos diodai jungti ne per 1…2K kaip parodyta schemoje, o per 330Ω Dar vienas mažas nukrypimas, kad aš nedėjau jokio mygtuko. Pirmoji mintis ir užduotis buvo išmokti junginėti diodus.

Nepaslaptis, kad naudoju Archlinux, to pasekoje programos kodas pateiktas ankščiau minėtam elektronika.lt puslapyje netiko – nesikompiliavo. Su programa Gnome-avrdude įrašius HEX’ą diodai mirksėjo. Taigi mano supratimu problema buvo tame, kad gcc-avr kompiliatorius veikia truputi kitaip nei winavr ir/ar kiti windows’iniai.

Padraugavus su Google pavyko parašyti ir sukompiliuoti štai tokį kodą:

#define F_CPU 1000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

void sleep()
{
   _delay_ms(50);

}

int main(){

DDRD = 0b11111111;

while (1) {
 PORTD = 0b10000001;
 sleep();
 PORTD = 0b01000010;
 sleep();
 PORTD = 0b00100100;
 sleep(); 
 PORTD = 0b00011000;
 sleep(); 
 PORTD = 0b00011000;
 sleep(); 
 PORTD = 0b00100100;
 sleep(); 
 PORTD = 0b01000010;
 sleep(); 
 }
}

Programą kompiliavau štai tokiomis komandomis (programos kodas parašytas test.c byloje):

avr-gcc -mmcu=atmega16 -Os test.c -o test.o
avr-objcopy -j .text -j .data -O ihex  test.o  test.hex

C kodą rašau su Geany (http://www.geany.org/)
Gnome-avrdude konfiguracija USBasp programatoriui yra tokia:

Programmer laukelyje USBasp pasirinkimo nebuvo, todėl jį įvedžiau ranka.
Spustelnam Open, pasirenkame paruošta HEX bylą ir ją atveriame. Atvėrus spustelnam mygtuką kur parodyta mikroschma su rodykle nukreipta į ja. Jei viskas gerai sujungta turite pamatyti štai tokį (ar panašų) rezultatą:

Programa iškarto pradeda veikti. Aukščiau pateiktas kodo rezultatas youtubo filmuke (atsiprašau už kokybe, neturiu jokio geriau filmuojančio aparato):

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close