• Localization

PCB su laminatoriumi

Šiuo metu  PCB gamybai pradėjau naudoti laminatorių, plokščių kokybė žymiai pagerėjo nei naudojant lygintuvą. Nebereikia koreguoti takelių su markeriu, o ir takelių plotis labai sumažėjo.

Kad su laminatoriumi būtų galima gaminti PCB plokštes reikia, kad laminatorius įkaistų iki 180 – 200 C temperatūros.  Laminavimui mano modelis įkaista iki 110 C temperatūros. Teko konstruoti termoreguliatorių. Kadangi temperatūros gana aukštos panaudojau termoporą K tipo ir schemos dalį iš litavimo stotelės. LCD ekranas KTMS1201, ATMEGA48 mikroprocesorius (pagal hex failo dydį tinka ir atmega8) . Temperatūros reguliavimas šuoliais mygtuku SET 110 C arba 190 C, 100 C – 110 C laminavimui, 190 C – 200 C plokštėms. Taip pat galima reguliuoti +/- 1 C mygtukais UP , DOWN. Perkaitimo signalizacija LED diodu (iki 220 C), galima prijungti ir zumerį. Kaitimo signalizacija LED diodu.

Įjungus laminatorių įjungiamas  volelių sukimasis ir kaitinimas, pradinė temperatūra nustatyta 100 C.

Dalis kodo panaudota iš kitų tinklapių, kur komentarai lietuvių kalba, tai mano pridėtas kodas. Kodas parašytas Arduino aplinkoje, sukompiliuotas taip patArduino aplinkoje.

Tai mano pirmieji žingsniai mikroprocesorių programavime.

// giedriausweb.lt pritaikytas kodas savo reikmems
//Arduino_DVM
//Simple Proof of concept to display voltyage using a KTM-S1201
//Written by Jeff Albertson Ver 1.0
//Pin 1  LcdVcc    +5V dc power
//pin 2  LcdVss    0V
//pin 3  LcdnSck   Not Serial clock
//pin 4  LcdSi     Serial data
//pin 5  LcdCnD    Select Command or Data mode
//pin 6  LcdnRes   Reset LCD
//pin 7  LcdnBus   LCD not busy
//pin 8  LcdnCs    LCD not Chip select
//pin 9 Pot wiper  Vlc LCD Contrast
//pin10 NC
// LCD out from Arduino
//#define LcdVcc  29 //+5V dc power
//#define LcdVss  28 // 0V
//#define LcdSck  27 //Not Serial clock
//#define LcdSi  26 //Serial data in
//#define LcdCnD  25 //Command or Not data in
//#define LcdnRes  24 //Not reset low = reset
//#define LcdnBus  23 //Not Busy Only output from LCD
//#define LcdnCs  22 //Not Chip select Low = LCD selected
// LCD across Arduino
//#define MEGA
#ifdef MEGA
//+5V dc power
#define LcdVcc  22
// 0V
#define LcdVss  23
//Not Serial clock pin 3
#define LcdSck  24
//Serial data in, pin 4
#define LcdSi   25
//Command or Not data in, pin 5
#define LcdCnD  26
//Not reset low = reset, pin 6
#define LcdnRes 27
//pin 7, Not Busy output from LCD not used if delay(1) after LcdnCs changes
#define LcdnBus 28
//Not Chip select Low = LCD selected, pin 8
#define LcdnCs  29
#else
#define LcdVcc  4 //+5V dc power
#define LcdVss  5  // 0V
#define LcdSck  9  //Not Serial clock pin 3
#define LcdSi   12 //Serial data in, pin 4
#define LcdCnD  13 //Command or Not data in, pin 5
#define LcdnRes 10 //Not reset low = reset, pin 6
#define LcdnBus 11 //pin 7, Not Busy output from LCD not used if delay(1) after LcdnCs changes
#define LcdnCs  8  //Not Chip select Low = LCD selected, pin 8
#endif
//  Put a delay(1) after every LcdnCs change or check LcdnBus
#define t 100
#define t1 10
// The Not Chip select pin is the only unique
// Pin on the LCD all other pins can be paralleled
// for more ktm-s1201 displays

#define adpin 0  //Analog input pin number
#define _Mode 0x40
#define _USync 0x31
#define _FBlink 0x1b
#define _SBlink 0x1a
#define _NoBlink 0x18
#define _DispOn 0x11
#define _Decode 0x15
#define _NoDecode 0x14
#define _LoadPtr 0xE0
#define _SetDp 0xb8   //Set decimal point (Dp)
#define _ClearDp 0x9f //Clear decimal point (Dp)
#define _ClearDsp 0x20 //Clear display memory
// To set Dp you must be in NoDecode mode and point to character (LoadPtr)
//      ---   0x01
#define _| 0x10
// |  0x02
//0x20  ---
//0x40 |   |  0x04
//0x80  --- o 0x08

#define _cet 0x31 //Centigrade
#define _ 0x0     //Space
#define _A  0x77  //
#define _b  0xF4  //
#define _c  0xE0  //
#define _d  0xE6  //
#define _E  0xF1  //
#define _F  0x71  //
#define _G  0xD5  //
#define _H  0x74  //
#define _i  0x04  //
#define _J  0x86  //
#define _K  0x70  //
#define _L  0xD0  //
#define _M  0x76  //
#define _n  0x64  //
#define _o  0xE4  //
#define _P  0x73  //
#define _Q  0xDF  //
#define _r  0x60  //
#define _S  0xB5  //
#define _t  0xF0  //
#define _u  0xC4  //
#define _V  0xD6  //
#define _W  0xF6  //
#define _X  0x56  //
#define _Y  0x72  //
#define _Z  0xEB  //
#define _1  0x06  //
#define _2  0xE3  //
#define _3  0xA7  //
#define _4  0x36  //
#define _5  0xB5  //
#define _6  0xF4  //
#define _7  0x07  //
#define _8  0xF7  //
#define _9  0x37  //
#define _0  0xD7  //
//##################################
int switchPin1 = 2;             // temperaturos mazinimas
int switchPin2 = 3;             // temperaturos didinimas
int switchPin3 = 4;             // temperaturos pasirinkimas 110C arba 200C
int termo = 7;                  // kaitinimo elementas
int perkrova = 6;               // perkaitimo kontrole, uzsidega LED arba suveikia zumeris, atjungiamas kaitinimo elementas
int val;                        // variable for reading the pin status
int val1;
int buttonState;                // variable to hold the button state
int buttonState1;               // SET mygtuko busena
int buttonPresses = 0;          // how many times the button has been pressed
int buttonPressesx = 0;         // SET mygtuko paspaudimai
int maxTemp = 220;               // maksimali leidziama temperatura
int minTemp = 100;               // laminavimo apytiksle temperatura 110 C
int pcbTemp = 190;               // plokstems daryti apytiksle temperatura
int lamTemp = 110;               // laminavimo temperatura

void setup()
{

pinMode(switchPin1, INPUT);     // nustatome kaip iejima
pinMode(switchPin2, INPUT);     // nustatome kaip iejima
pinMode(switchPin3, INPUT);     // nustatome kaip iejima
pinMode(termo,OUTPUT);          // kaitinimo elemento valdymas, isejimas
pinMode(perkrova, OUTPUT);      // perkaitimo signalizacija, led arba zumeris

Serial.begin (115200);

pinMode(LcdSck,OUTPUT);
pinMode(LcdSi,OUTPUT);
pinMode(LcdCnD,OUTPUT);
pinMode(LcdnRes,OUTPUT);
pinMode(LcdnBus,INPUT);
pinMode(LcdnCs,OUTPUT);
pinMode(13,OUTPUT);

//Do one time to Initalize KTM-S1201

digitalWrite(LcdCnD, HIGH); //Put in copmmand mode
digitalWrite(LcdnCs, HIGH); //deselect KTM-S1201
digitalWrite(LcdSck, HIGH);
digitalWrite(LcdSi,  HIGH);
digitalWrite(LcdnRes, LOW); // reset lcd
delay(10);
digitalWrite(LcdnRes, HIGH);
delay(10);
ktmCommand(_Mode);
ktmCommand(_USync);
ktmCommand(_NoBlink);
ktmCommand(_DispOn);
ktmCommand(_NoDecode);
ktmCommand(_ClearDsp);
//Put initial data on KTM-S1201
byte TextString[12] = {
_,_,_,_cet,_,_t,_E,_r,_,_,_,_cet                  };
digitalWrite(LcdCnD, LOW);      //Put in data mode
digitalWrite(LcdnCs, LOW);
delay(1);
int i;
for (int i = 11; i >= 0; i --)//Put in KTM-S1201 Right Character First
{

ktmshiftOut(TextString[i]);
}

digitalWrite(LcdnCs, HIGH); //deselect LCD to display data
delay(1);                    //always delay after LcdnCs change
buttonState1 = val1;
}

void loop()
{

int p = 9;                   //Put Right most L.S.Digit in this location
int c = 0;                   //Put Decimal point here
int n = 3;                   //number of digits
int b;
int vold;
int  v;
int  vs;

v = analogRead(adpin);
//Integer to be displayed
do
{
if (v > maxTemp) {
digitalWrite(termo,LOW);
digitalWrite(perkrova,HIGH);          //LED2 arba zumeris.
}

vs = v;
ktmPrnNumb(vs,p,c,n); //Realios temp. rodymas
ktmPrnNumb(buttonPresses,1,c,n); // pasirinktos temp. rodymas
vold = v;
}
while (vold != v );
if (vs < buttonPresses ) {            // jei reali temp. mazesne uz nustatyta ijungiamas kaitinimo elementas
digitalWrite(termo,HIGH);
}

else if  (vs > buttonPresses) {      // jei reali temp. didesne uz nustatyta isjungiamas kaitinimo elementas
Serial.println ( "ISJUNGTA>>>");
digitalWrite(termo,LOW);
}
// Serial.print ( "Printed: " );
Serial.println ( v );
int sensorValue = digitalRead(2);

//################## temperaturos pasirinkimas laminavimui lamTemp arba pcb pcbTemp
val1 = digitalRead(switchPin3);      // read input value and store it in val
if (val1 != buttonState1) {          // the button state has changed!
if (val1 == LOW) {                // check if the button is pressed
buttonPressesx++;               // increment the buttonPresses variable
}
}
//buttonState1 = val1;
if (buttonPressesx == 1 ) {          //jei mygtuko SET reiksme =1 nustatoma laminavimo temperatura lamTemp
buttonPresses = lamTemp;
ktmshiftOut(0xd7);
}
else if (buttonPressesx == 2 ) {     //jei mygtuko SET reiksme =2 parenkama pcb plokstems daryti reikalinga apytiksle temperatura pcbTemp
buttonPresses = pcbTemp;
}
else if (buttonPressesx >= 2 ){    //jei mygtuko SET reiksme >=2 nustatoma laminavimo temperatura lamTemp
buttonPressesx = 1;
buttonPresses = lamTemp;
}

buttonState1 = val1;

val = digitalRead(switchPin1);      // read input value and store it in val
if (val != buttonState) {          // the button state has changed!
if (val == LOW) {                // check if the button is pressed
buttonPresses++;               // increment the buttonPresses variable
}
}
buttonState = val;
val = digitalRead(switchPin2);      // read input value and store it in val
if (val != buttonState) {          // the button state has changed!
if (val == LOW) {                // check if the button is pressed
buttonPresses--;               // increment the buttonPresses variable
}
}
//buttonState = val;
if (buttonPresses < minTemp) {   // jei temp mazesne uz minimalia
buttonPresses = minTemp;       // tai ji lygi minimaliai minTemp
}
else if (buttonPresses > maxTemp ) {
buttonPresses = maxTemp;
buttonPressesx = 0;
}
else if ( buttonPresses >= 111 ) {
buttonPressesx = 0;
}
else if (buttonPresses <= 109 ) {
buttonPressesx = 0;
}
buttonState = val;
}

void ktmCommand(byte _cmd)
{
digitalWrite(LcdCnD, HIGH);
delay(1);
digitalWrite(LcdnCs, LOW);
delay(1);
ktmshiftOut(_cmd);
delay(1);
digitalWrite(LcdnCs, HIGH); //deselect LCD to display data
delay(1);
}

void ktmshiftOut(byte val)  // same as shiftout command but invert Sck
{
int i;
for (i=0;i<8;i++)
{
digitalWrite(LcdSi,!!(val & (1<< (7-i))));
digitalWrite(LcdSck,LOW);
delay(1);
digitalWrite(LcdSck,HIGH);
}
delay(1);
}

void ktmPrnNumb(int n, byte p,byte d,byte l){
//n is the number to be printed
//p is the position for lsb from right starting at 0 and
//d in the number of digits to the right of the decimal point
//l is length number of digits in n
int nt;
int i;
int j=1;
int r=0;

digitalWrite(LcdCnD, HIGH); //Put in command mode
digitalWrite(LcdnCs, LOW); //Select LCD
delay(1);
ktmshiftOut(_Decode);
ktmshiftOut(_LoadPtr+p*2);
digitalWrite(LcdCnD, LOW);      //Put in data mode
digitalWrite(LcdnCs, LOW);
delay(1) ;
nt = n;
for (i=0;i<l;i++)//display numbers (reverse order)
{
ktmshiftOut(nt%10);
nt=nt/10;
}
j=p*2+d*2;

if (d>0)  //   Set Decimal point
{
digitalWrite(LcdCnD, HIGH); //Put in command mode
digitalWrite(LcdnCs, LOW); //Select LCD
delay(1);
ktmshiftOut(_NoDecode);
ktmshiftOut(_LoadPtr+j);
ktmshiftOut(_SetDp);
delay(1);

}
digitalWrite(LcdnCs, HIGH); //deselect LCD to display data
delay(100);
}

 

 

 

Keletas foto

Trumpas video

 

Informacijos šaltiniai

http://atmega.site40.net/default.php#LCD%2012%20X%201%20%28KTMS1201%29

http://radiokot.ru/lab/controller/32/

http://arduino.cc/en/Tutorial/ButtonStateChange

Muzika

http://freemusicarchive.org/music/Tobetozero/Ornament/06_Elina

[stextbox id=”download” caption=”Siuntiniai”]Eagle, arduino, hex dokumentai[/stextbox]


Tagged , , , , , , . Bookmark the permalink.

15 Responses to PCB su laminatoriumi

  1. Donatas says:

    Laba diena, man reikia RS485-TTL konverterio pagamintumete ? 🙂

  2. Gediminas says:

    O pradedančiajam užteks lygintuvo būdo? 😀

    • admin says:

      Pilnai 🙂

      • Gediminas says:

        Tik nežinau kokio to popieriaus reikia :/ Bandysiu iš žurnalo ar dar kur tą tokį slidų, kiek skaičiau turėtų tikt. Kiti siūlo kreidinį popierių, o čia ne tas, kur dailės pamokose kopijuot paveiksliukams? 😀 Kur vienoj pusėj yra dažai?

        • admin says:

          Naudoju nuo reklaminių bukletų, kuriuos randu pašto dėžutėje. Tinka ir žurnalai, tik reik žiūrėti kad nebūtų padengtas kažkokia plevele ar tai dar kuom, pakenks lazeriniam spausdintuvui. Geriau kad būtų mažiau paveiskliukų.Su kreidiniu popieriumi nebandžiau, todėl negaliu patarti. Ant kreidinio popieriaus man rodos sunkiai kibs tonerio milteliai.

          • Gediminas says:

            Isbandziau ~18val. šitą būdą. Radau kažkokį lankstinuką partijos reklamos 😀 užspausdinau prikaitinau ir gavosi takeliai 🙂
            O kiek skaičiau forumose reik žiūrėt, kad nebūtų laminuotas popierius, tada ragų kontora būna. Fainai taip tų pretendentų galvas su lygintuvu kaitini 😀

          • admin says:

            Smagu, kad gavosi. Bet su laminatoriumi patogiau. Kažkada ir aš su lygintuvu dariau, tik didesnes plokštes kiek sudėtingiau daryti.

  3. Eric says:

    Thanks for the code example. I wouldn’t have been able to figure out the ktm-s1201 LCD without it.

  4. Galimas says:

    ir paprastesnis variantas su maziau vargo. Tiesiog pajungti galios reguliatoriu uz 3Lt ir skaitmenini termometra aukstai temperaturai matuoti iki 300 laipsniu uz ~8Lt 🙂 Tiesa koki popieriu naudoji gamybai?

  5. mindogas says:

    Mačiau esate pasigaminęs ir UV dėžę tad klausimas: o kuri metoda labiau renkatės gaminant PCB?

    • admin says:

      Šiuo metu daugiausiai gaminu PCB su laminatoriumi. UV dėžė daugiau skirta dvipusei PCB ir kai reikia labai plonų takelių, nors paskutiniu metu labai puikiai gaunas ir su laminatoriumi.

  6. Lukas says:

    Sveiki.
    Galvoju pasigaminti kažką panašaus norėčiau susisiekti su jumis kas perdarė šį laminatorių. Nes kitų kontaktų neradau, jeigu galite parašykite man į paštą.

Leave a Reply

Your email address will not be published. Required fields are marked *