Antarmuka Port Serial dengan C++

Gunakan Class Serial berikut:

//File: Serial.h
#ifndef SERIALCLASS_H_INCLUDED
#define SERIALCLASS_H_INCLUDED

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

class Serial
{
    private:
        //Serial comm handler
        HANDLE hSerial;
        //Connection status
        bool connected;
        //Get various information about the connection
        COMSTAT status;
        //Keep track of last error
        DWORD errors;

    public:
        //Initialize Serial communication with the given COM port
        Serial(char *portName);
        //Close the connection
        ~Serial();
        //Read data in a buffer, if nbChar is greater than the
        //maximum number of bytes available, it will return only the
        //bytes available. The function return -1 when nothing could
        //be read, the number of bytes actually read.
        int ReadData(char *buffer, unsigned int nbChar);
        //Writes data from a buffer through the Serial connection
        //return true on success.
        bool WriteData(char *buffer, unsigned int nbChar);
        //Check if we are actually connected
        bool IsConnected();


};

#endif // SERIALCLASS_H_INCLUDED

//File: Serial.cpp
#include "Serial.h"

Serial::Serial(char *portName)
{
    //We're not yet connected
    this->connected = false;

    //Try to connect to the given port throuh CreateFile
 #if _MSC_VER && !__INTEL_COMPILER
    const size_t cSize = strlen(portName) + 1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs_s(NULL, wc, cSize, portName, cSize);
    this->hSerial = CreateFile(wc,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
#else
    //Try to connect to the given port throuh CreateFile
    this->hSerial = CreateFile(portName,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
#endif

    //Check if the connection was successfull
    if(this->hSerial==INVALID_HANDLE_VALUE)
    {
        //If not success full display an Error
        if(GetLastError()==ERROR_FILE_NOT_FOUND){

            //Print Error if neccessary
            printf("ERROR: Handle was not attached. Reason: %s not available.\n", portName);

        }
        else
        {
            printf("ERROR!!!");
        }
    }
    else
    {
        //If connected we try to set the comm parameters
        DCB dcbSerialParams = {0};

        //Try to get the current
        if (!GetCommState(this->hSerial, &dcbSerialParams))
        {
            //If impossible, show an error
            printf("failed to get current serial parameters!");
        }
        else
        {
            //Define serial connection parameters for the arduino board
            dcbSerialParams.BaudRate=CBR_9600;
            dcbSerialParams.ByteSize=8;
            dcbSerialParams.StopBits=ONESTOPBIT;
            dcbSerialParams.Parity=NOPARITY;
            //Setting the DTR to Control_Enable ensures that the Arduino is properly
            //reset upon establishing a connection
            dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;

             //Set the parameters and check for their proper application
             if(!SetCommState(hSerial, &dcbSerialParams))
             {
                printf("ALERT: Could not set Serial Port parameters");
             }
             else
             {
                 //If everything went fine we're connected
                 this->connected = true;
                 //Flush any remaining characters in the buffers
                 PurgeComm(this->hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR);
                 //We wait 2s as the arduino board will be reseting
                 Sleep(2000);
             }
        }
    }

}

Serial::~Serial()
{
    //Check if we are connected before trying to disconnect
    if(this->connected)
    {
        //We're no longer connected
        this->connected = false;
        //Close the serial handler
        CloseHandle(this->hSerial);
    }
}

int Serial::ReadData(char *buffer, unsigned int nbChar)
{
    //Number of bytes we'll have read
    DWORD bytesRead;
    //Number of bytes we'll really ask to read
    unsigned int toRead;

    //Use the ClearCommError function to get status info on the Serial port
    ClearCommError(this->hSerial, &this->errors, &this->status);

    //Check if there is something to read
    if(this->status.cbInQue>0)
    {
        //If there is we check if there is enough data to read the required number
        //of characters, if not we'll read only the available characters to prevent
        //locking of the application.
        if(this->status.cbInQue>nbChar)
        {
            toRead = nbChar;
        }
        else
        {
            toRead = this->status.cbInQue;
        }

        //Try to read the require number of chars, and return the number of read bytes on success
        if(ReadFile(this->hSerial, buffer, toRead, &bytesRead, NULL) && bytesRead != 0)
        {
            return bytesRead;
        }

    }

    //If nothing has been read, or that an error was detected return -1
    return -1;

}


bool Serial::WriteData(char *buffer, unsigned int nbChar)
{
    DWORD bytesSend;

    //Try to write the buffer on the Serial port
    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))
    {
        //In case it don't work get comm error and return false
        ClearCommError(this->hSerial, &this->errors, &this->status);

        return false;
    }
    else
        return true;
}

bool Serial::IsConnected()
{
    //Simply return the connection status
    return this->connected;
}


Berikut contoh koneksi pengiriman data

#include <iostream>
#include "windows.h"
#include "Serial.h"

#include <thread>
#include <chrono>

using namespace std;

void delay(int ms){
    std::this_thread::sleep_for (std::chrono::milliseconds(ms));
}

int main(int argc, char** argv) {

    char alamatPort[] = "\\\\.\\COM7";
    Serial* s = new Serial(alamatPort);

	char dataOn[256] = "on1\n"; //"Nyala!";
	char dataOff[256] = "off0\n"; //"mati!";

	cout<<"isikan angka 1 untuk menyalakan, atau 0 untuk mematikan"<<endl;


	int jawab;
	do{
        cin>>jawab;;

        if(jawab==0)
            s->WriteData(dataOff, sizeof(dataOff));
        if(jawab==1)
            s->WriteData(dataOn, sizeof(dataOn));
        if(jawab==2)
            for(int a=0;a<5;a++){
                s->WriteData(dataOn, sizeof(dataOn));
                delay(500);
                s->WriteData(dataOff, sizeof(dataOff));
                delay(500);
            }
	}while(jawab<3);

	return 0;
}

Berikut contoh untuk mengirim dan menerima data

#include <iostream>
#include <stdio.h>
#include <tchar.h>
#include "Serial.h" // Library described above
#include <string>


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
char alamatPort[] = "\\\\.\\COM7";
Serial* SP = new Serial(alamatPort);    // adjust as needed

void* baca(void* data)
{

    char incomingData[256] = "";            // don't forget to pre-allocate memory
    //printf("%s\n",incomingData);
    int dataLength = 256;
    int readResult = 0;


    while (SP->IsConnected())
    {
        readResult = SP->ReadData(incomingData, dataLength);
        if (readResult > 0) {
            printf("%s\n", incomingData);
        }
        //printf("Bytes read: (-1 means no data available) %i\n",readResult);

        //std::string test(incomingData);

        //printf("%s",incomingData);
        //test = "";

        Sleep(500);
    }
    return NULL;
}

void* tulis(void* data)
{
    while (SP->IsConnected())
    {
        char outgoingData[256] = "";
        char keluar[256] = "keluar";
        int dataLength = sizeof(outgoingData);        // don't forget to pre-allocate memory
        scanf_s("%255s", outgoingData, dataLength);

        if (outgoingData != "")
        {
            if (strcmp(outgoingData, "OK") == 0) {
                printf("Pengiriman selesai\n");
                return NULL;

            }
            if (SP->WriteData(outgoingData, dataLength))
            {
                printf("Data send:%s\n", outgoingData);
            }
        }

        Sleep(500);
    }
    // do stuff...
    return NULL;
}

#if _MSC_VER && !__INTEL_COMPILER
#include <thread>

int main(int argc, char** argv) {
    printf("Welcome to the serial test app!\n\n");
    if (SP->IsConnected())
        printf("Serial sudah terhubung\n");
    int status;
    std::thread thrd_1(baca,(void*)0);
    std::thread thrd_2(tulis, (void*)0);

    thrd_1.join();
    thrd_2.join();

}
#else
// thread example
#include <pthread.h>

int main(int argc, char** argv) {
    printf("Welcome to the serial test app!\n\n");
    if (SP->IsConnected())
        printf("Serial sudah terhubung\n");

    pthread_t thrd_1;
    pthread_t thrd_2;
    int status;

    pthread_create(&thrd_1, NULL, baca, (void*)0);
    pthread_create(&thrd_2, NULL, tulis, (void*)0);

    pthread_join(thrd_1, (void**)&status);
    pthread_join(thrd_2, (void**)&status);

    printf("Terima kasih");

    return 0;
}
#endif

TL494C not TL949

by https://e2e.ti.com/members/5183115

C1 220uF 50V
C2 220uF 50V
C3 1uF
C4 220uF 50V
C5 220uF 50V
C6 1uF
C7 1uF
C8 100nF
C9 100nF
C10 1uF(recommended to increase it to improve soft start)
C11 Not Applicable
C12 100nF
C13 1nF
C14 100nF
C15 100nF
C16 100nF
C17 1nF
D1 SS54
D2 MBR20100CS
G1 NCE6075
L1 47uH
Q1 D884
Q2 Y1
Q3 Y2
R1 Not Applicable
R2 4K3
R3 15K
R4 Not Applicable
R5 1K5
R6 10K
R7 10K
R8 10K (recommended to increase it to improve soft start)
R9 10K
R10 22R
R11 1K
R12 4R7
R13 240K
R14 Not Applicable
R15 22R
R16 10K
R17 1K
R18 0R
R19 0R01
RV1 10K
RV2 5K
U1 TL494C
ZD1 WL

Kode warna dioda

Kode warna dioda

MELF/mini-MELF/LL-34 Package Diodes

The SOD-80 package, also known as mini-MELF, is a small ( glass, sometimes plastic) cylinder with metal ends.

MELF package L=4.9mm D=2.5mm
mini-MELF (SOD80C) L=3.5mm D=1.6mm
LL-34 L=3.4mm D= 1.4mm

sod-80 package diagram

Code marked devices

Marked 2Y4 to 75Y (E24 series) BZV49 series 1W zener diodes (2.4 – 75V)

Marked C2V4 TO C75 (E24 series) BZV55 series 500mW zener diodes (2.4 – 75V)

The cathode end is indicated by a coloured band.


Coloured band marked devices (MELF/SOD-80)

CATHODE BAND(S)Device
BlackBAS32, BAS45, BAV105 LL4148, 50, 51,53, LL4448 BB241,BB249
Black BrownLL4148, LL914
Black OrangeLL4150, BB219
Brown GreenLL300
Brown BlackLL4448
RedBA682
Red OrangeBA683
Red GreenBA423L
Red WHiteLL600
Orange YellowLL3595
YellowBZV55,BZV80,BZV81 series zeners
GreenBAV105, BB240
Green BlackBAV100
Green BrownBAV101
Green RedBAV102
Green OrangeBAV103
GreyBAS81, 82, 83, 85, 86
WhiteBB219
White GreenBB215

Some manufacturers have a generic type coding scheme for MELF and mini-MELF diodes.
That for Vishay/General Semiconductor is shown below:

CATHODE BANDMini MELF Device Type
BlackGeneral purpose
YellowSwitching
GreenSchottky
BlueZener
CATHODE BANDMELF Device Type
BlackZener
GreenSchottky

Rohm LL-34 package Zener Diodes RLZ Series
Three band colour code Third band is always Green

Type1st Band2nd Band3rd BandType1st Band2nd Band3rd Band
RLZ3.6BBlackPurpleGreenRLZ12BRedBlackGreen
RLZ3.9BBlackGrayGreenRLZ13BRedBrownGreen
RLZ4.3BBrownWhiteGreenRLZ15BRedRedGreen
RLZ4.7BBrownBlackGreenRLZ16BRedOrangeGreen
RLZ5.1BBrownBrownGreenRLZ18BRedYellowGreen
RLZ5.6BBrownRedGreenRLZ20BRedGreenGreen
RLZ6.2BBrownOrangeGreenRLZ22BRedBlueGreen
RLZ6.8BBrownYellowGreenRLZ24BRedPurpleGreen
RLZ7.5BBrownGreenGreenRLZ27BRedGrayGreen
RLZ8.2BBrownBlueGreenRLZ30BRedWhiteGreen
RLZ9.1BBlackPurpleGreenRLZ33BOrangeBlackGreen
RLZ10BBlackGrayGreenRLZ36BOrangeBrownGreen
RLZ11BBlackWhiteGreenRLZ39BOrangeRedGreen

MELF/mini-MELF/LL-34 Package Diodes

The SOD-80 package, also known as mini-MELF, is a small ( glass, sometimes plastic) cylinder with metal ends.

MELF package L=4.9mm D=2.5mm
mini-MELF (SOD80C) L=3.5mm D=1.6mm
LL-34 L=3.4mm D= 1.4mm


Code marked devices

Marked 2Y4 to 75Y (E24 series) BZV49 series 1W zener diodes (2.4 – 75V)

Marked C2V4 TO C75 (E24 series) BZV55 series 500mW zener diodes (2.4 – 75V)

The cathode end is indicated by a coloured band.


Coloured band marked devices (MELF/SOD-80)

CATHODE BAND(S)Device
BlackBAS32, BAS45, BAV105 LL4148, 50, 51,53, LL4448 BB241,BB249
Black BrownLL4148, LL914
Black OrangeLL4150, BB219
Brown GreenLL300
Brown BlackLL4448
RedBA682
Red OrangeBA683
Red GreenBA423L
Red WHiteLL600
Orange YellowLL3595
YellowBZV55,BZV80,BZV81 series zeners
GreenBAV105, BB240
Green BlackBAV100
Green BrownBAV101
Green RedBAV102
Green OrangeBAV103
GreyBAS81, 82, 83, 85, 86
WhiteBB219
White GreenBB215

Some manufacturers have a generic type coding scheme for MELF and mini-MELF diodes.
That for Vishay/General Semiconductor is shown below:

CATHODE BANDMini MELF Device Type
BlackGeneral purpose
YellowSwitching
GreenSchottky
BlueZener
CATHODE BANDMELF Device Type
BlackZener
GreenSchottky

Rohm LL-34 package Zener Diodes RLZ Series
Three band colour code Third band is always Green

Type1st Band2nd Band3rd BandType1st Band2nd Band3rd Band
RLZ3.6BBlackPurpleGreenRLZ12BRedBlackGreen
RLZ3.9BBlackGrayGreenRLZ13BRedBrownGreen
RLZ4.3BBrownWhiteGreenRLZ15BRedRedGreen
RLZ4.7BBrownBlackGreenRLZ16BRedOrangeGreen
RLZ5.1BBrownBrownGreenRLZ18BRedYellowGreen
RLZ5.6BBrownRedGreenRLZ20BRedGreenGreen
RLZ6.2BBrownOrangeGreenRLZ22BRedBlueGreen
RLZ6.8BBrownYellowGreenRLZ24BRedPurpleGreen
RLZ7.5BBrownGreenGreenRLZ27BRedGrayGreen
RLZ8.2BBrownBlueGreenRLZ30BRedWhiteGreen
RLZ9.1BBlackPurpleGreenRLZ33BOrangeBlackGreen
RLZ10BBlackGrayGreenRLZ36BOrangeBrownGreen
RLZ11BBlackWhiteGreenRLZ39BOrangeRedGreen

Gender Konektor DB9 pada RS232

DTE vs DCE

DTE adalah Data Terminal Equipment, dimana sumbaer data dan pengolahannya ada di bagian ini. Untuk koneksi SPI ini dinamakan Master. Sedangkan DCE atau Data Circuit terminating Equipment adalah perangkat periferal dari DTE. Ini dinamakan Slave pada antarmuka SPI.

DTE dan DCE

Gender koneksi DTE dibanding DCE

Pada koneksi DTE dalam banyak kasus biasanya jenis MALE, sedangkan untuk DCE adalah yang female. Namun tidak semuanya seperti ini, harus pintar membaca petunjuk atau datasheet.

Image result for de-9 pinout female male
Male untuk DTE dan Female untuk DCE

Pinout

Untuk koneksi RS232 dasar, biasanya hanya perlu Rx, Tx dan Ground. Beberapa peralatan mungkin memerlukan pin kontrol tambahan. Berikut bagaimana pengaturan pin menempatkan Tx ke Rx, DTR ke DSR, dan RTS ke CTS.

Pinout DB9 pada RS232 untuk Male (DTE) dan Female (DCE)

Contoh modul untuk DTE dan DCE

테크 선전 아두이노, 라즈베리파이, 마이크로비트
Modul untuk DCE dengan konektor Female
Amazon.com: NulSom Inc. Ultra Compact RS232 to TTL ...
Modul untuk DTE dengan konektor Male

Null Modem

Null modem dibutuhkan untuk koneksi DTE ke DTE (Male – Male) atau DCE ke DCE (Female-Female)

RS232 cable
Null Modem untuk Male to Male (DTE to DTE)

String dan Pointer C++

typedef struct
{
  int x, y;
  short life;
  char *nama;
} Man;

void setup() {
  Serial.begin(9600);

  //menggunakan 4 memori untuk string
  String hi = "Hello";
  String names = "World";
  String hello = hi + " " + names;

  //menggunakan 1 memori
  String greeting = hi;
  greeting.concat(" ");
  greeting.concat(names);



  String tempname = "Temperature";
  String temp = "23C";
  PrintVal1(tempname, temp); //membuat string redundan. Lihat fungsi
  PrintVal2(tempname, temp); //pass by reference, tidak redundan. Lihat fungsi

  char thestring[30] = "This is a string";
  //thestring = "New content"; //cara yang salah, panjang string harus sama!
  strcpy(thestring, "New content"); //good method

  char isgood[8] = "is good";
  //char allbad[38] = thestring + isgood; //cara yang salah, ini adalah operasi biner. gunakan strcat
  char allgood[38];
  strcat(allgood, thestring); strcat(allgood, isgood);



  char a[2] = "A"; char b[2] = "A";
  if (a == b) {}//cara yang salah, akan selalu bernilai false
  if (strcmp(a, b) == 0 ) {} //car yang benar, atau gunakan strcasecmp()


  //pointer
  int var = 0;
  int arr[] = {1, 2, 3};
  int *ptr;           //init, don't set to NULL (destroy), *ptr = 0, first address? no!
  ptr = &var;         //to address of var, not the value of var
  *ptr = 50;;         //pointer content is 50
  //ptr = 50;         //pointer (address) is 50
  //ptr++;            //pointer address + 1

  ptr = arr;         //to array
  ptr[0] = 50;      //array number 0, is 50
  ptr = &arr[0];     //equal to above, array number 0 is 50

  Man *ptrMan;
  Man manusia = {0, 0, 0, NULL};
  manusia.life = 9;       //kucing :D
  manusia.nama = "Todol"; //pointer in struct
  ptrMan = &manusia;
  ptrMan-> life = 0;         //mati
  
  char *pString = "This is text"; //not safe to change content! don't do!
  const char *pStringSafe = "This is text"; //display warning when change content

  char temperature[] = "23C"; //constant
  //Following syntax is not compiler friendly, it will be unhappy
  PrintValP("Temperature", temperature);
  //The following will make compiler happier (look at the fuction!)
  PrintValPC("Temperature", temperature);

  PrintString(temperature);
}


//make 2 new strings, redundant string
void PrintVal1(String tag, String value) {
  Serial.print(tag);
  Serial.print(" = ");
  Serial.println(value);
}

//pass by reference
void PrintVal2(String &tag, String &value) {
  Serial.print(tag);
  Serial.print(" = ");
  Serial.println(value);
}

//pass by pointer
void PrintValP(char *tag, char *value) {
  Serial.print(tag);
  Serial.print(" = ");
  Serial.println(value);
}
void PrintValPC(const char *tag, const char *value) {
  Serial.print(tag);
  Serial.print(" = ");
  Serial.println(value);
}
void PrintString(const char *str) {
  const char *p;
  p = str;
  while (*p) {
    Serial.print(*p);
    p++;
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

Panelisasi PCB

Saat ukuran desain PCB kecil, katakanlah 2×3 cm, dan akan dibuat pada PCB dengan ukuran 10 x 10 cm, maka desain PCB dapat dibuat panel. PCB ukuran 10 x 10 akan dapat menampung setidaknya 12 desain PCB 2×3 cm.

Buka pada Panel Properties dan isikan ukuran PCB 100mm x 100mm. Tentukan jarak antar desain PCB 2mm.
Buka folder gerber pada menu Add Gerber Folder
kanan pada instance lalu pilih menu Add Instance. Lakukan 11 kali, hingga instance menjadi 12.
Pilih Autopack agar instance (desain board PCB) tertata otomatis.
Tambahkan Breaktab dengan Insert Breaktabs, untuk menyanbungkan instance. Atau pilih Create Breaktabs untuk penambahan Breaktab secara otomatis
Ekspor hasil gerber yang sudah digabung (Merged) ke folder
Tampilan proses eksport
Cek Gambar hasil gerber. Jika ada yang rusak, perlu diulangi.

Zip semua file gerber dan siap untuk dimasukkan ke percetakan atau dibuka dengan FlatCam untuk dicetak lewat CNC. Atau dapat juga dicetak di printer untuk metode toner transfer dan photoresist.

Konfigurasi FlatCAM

Konfigurasi untuk VBit 0.2mm pada PCB 1 Oz

Konfigurasi untuk VBit 0.2mm pada PCB 1 Oz. Pada CNC yang saya gunakan, konfigurasi terbaik adalah:
Tool Dia: 0.3
Width Passes: 3
Pass Overlap: 0.15
Combine passes: v

Cut Z: -0.075
Travel Z: 2.54
Feed Rate: 254
Tool Dia:0.3

Konfigurasi untuk Millier 2 Flute 0.6mm pada PCB 1 Oz. Pada CNC yang saya gunakan, konfigurasi terbaik adalah:
Tool Dia: 0.5
Width Passes: 2
Pass Overlap: 0.25
Combine passes: v

Cut Z: -0.038
Travel Z: 2.54
Feed Rate: 128
Tool Dia:0.5

Pembuatan PCB dengan DEET (Lotion anti nyamuk)

Desain PCB

  1. Lebar track >= 20mil (0,5 mm), jarak antar track >= 20mil (kecuali ada smd yang jarak kakinya 10 mil, tidak masalah)
  2. Cetak via, hole, top/bottom dan dimension untuk Toner transfer.
  3. Cetak tCream/bCream, hole, dan dimension untuk masking. Atau cukup pilih tStop/bStop, cetak dengan memilih solid dan black.



A. Persiapkan PCB:
PCB harus bebas korosi. Jika banyak minyak, pertama tama bersihkan tembaga menggunakan sabun cuci piring lalu keringkan. Anginkan atau jemur PCB hingga kering. Jika sudah tidak ada minyak yang menempel pada tembaha, gosok tembaga menggunakan penggosok panci atau ampelas halus. Lalu bersihkan debu butiran menggunakan tisu atau kertas polos dan alkohol 95%. Jika menggunakan aceton murni akan lebih baik. Aceton ini bukan yang digunakan untuk pembersih kuku, karena biasanya aseton jenis ini sudah dilarutkan dengan air, alkohol, vitamin dan pewangi.

Catatan:
PCB harus bebas dari minyak dan korosi, sehingga toner atau senyawa lain mudah menempel. Dissarankan untuk membersihkan dengan alkohol/aseton. Membersihakn dengan air dapat menjadikan air bereaksi dengan tembaga dan membentuk korosi.

B. Proses transfer toner
1.Siapkan kertas fotokopi yang sudah di-mirror. Potong sesuai ukuran. Tempelkan bagian toner ke tembaga dan kunci dengan isolasi jika perlu.
2. Tuang beberapa titik di diethyltoluamide (DEET), biasanya ada pada lotion anti nyamuk, di atas kertas dan usapkan hingga kertas menjadi transparan. Jika belum transparant, tambahkan sedikit-demi sedikit. Jangan menambahkan terlalu banyak karena dapat mengakibatkan kertas bergelombang, dan menjadikan toner terlalu lembek.
3. Tambahkan sedikit air cukup dengan mencelupkan tangan di air lalu usapka menggunakan tangan di kertas. Tutup dengan cellophane atau mika bungkus kado.
4. Gunakan koin atau kartu PVC untuk menggosok mika secara merata dan urut dari ujung ke ujung. Jangan terlalu keras menekan, terlalu keras menekan mangakibatkan toner menyebar, jalur jadi menebal dan bisa terhubung di sebelahnya. Lakukan hingga merata.
5. Lepas mika lalu lepas kertas perlahan. Saat melepas kertas kadang menjadikan beberapa toner di pinggir jalur ikut terlepas bersama kertas. Jika masih ada yang menempel di kertas, gosok ulang denga kartu PVC.
6. Saat kertas sudah terlepas, keringkan toner dengan menganginkan. Atau dapat juga memanaskannya dengan korek api pada bagian tembaganya pada api biru. Pengeringan dapat dilakukan dengan menaruh PCB pada pada wajan dengan tembaga menghadap ke atas sampai warna tembaga sedikit berubah pucat. Kurang lebih 1 menit dengan api sedang. Awas: Jika terlalu panas, PCB dapat melengkung. Lalu segera masukkan ke air dingin segera setelah PCB dipanasi. Air dingin digunakan untuk mendinginkan secara cepat, sehingga toner mengeras kembali.
7. Jika masih ada kertas yang menempel, lanjutkan dengan mengelus-elus pcb dengan jari hingga lapisan kertas yang menempel pada toner terlepas.
8. Cek jalur PCB jika ada yang terlepas/teputus, gambar jalur dengan spidol anti air. PAstikan PCB dalam kondisi kering. Jika ada jalur bersebelahan yang terhubung, kerok sedikit menggunakan cutter atau jarum.


C. Etching
1. Gunakan Feri Chorida 1 gram + 100 ml Air. Atau dapat gunakan campuran 1 bagian Asam Chlorida dan 2 bagian Peroxida (HCl + 2H2O2) + 4 bagian Air. Jika sulit ditemukan bisa menggunakan 2 bagian Wipol / WPC + 1 bagian Vanish.
2. Masukkan PCB dengan tembaga menghadap ke atas. Jika menggunakan FeCl, perlu digoyangkan. Namun jika menggunakan HCl cukup diamkan dan amati hingga tembaga larut.
3. Jika ada toner yang terkoyak, angkat dan keringkan dengan ditiriskan dan dianginkan. Jangan mengeringkan dengan cara diusap karena toner dapat terkelupas. Lalu gambar jalur toner yang putus dengan drawing pen atau spidol anti air. Kemudian masukkan lagi.
4. Angkat dan tiriskan PCB ke tisue. Bersihkan menggunakan aseton (pembersik kutek)
5. Jika ada minyak atau korosi, amplas dengan amplas terhalus (nomor 1)

D. Persiapkan Curabe UV Solder Mask (CUVSM) / Dry film solder mask
1. Cureble UV harus bebas dari minyak, Minyak digunakan untuk melumasi agar tidak mudah beku. Jika Curable UV terlalu cair dan keliatan ada minyaknya, taruh curable di atas tisue dan biarkan beberapa saat. Minyak mengakibatkan curable sulit menempel ke PCB.
2. PCB harus dalam keadaan bersih. Lihat poin A.
3. Tuangkan pasta CUVSM yang sudah tanpa minyak, atau minyak sudah tidak tampak, ke PCB.
4. Gunakan plastik pembungkus kado (cellophane) untuk menutup CUVSM. Jika menggunakan plastik mika fotokopi, bisanya hasit akhir solder mask malah menempel ke mika. Jika menggunakan plastik pembungkus makanan biasanya membuat CUVSM tidak rata (bergelombang).
5. Pasang mika tebal atau kaca untuk menekan cellophane yang dipasang menempel CUVSM. Tekan hingga permukaan rata. Jika jalur PCB belum terlihat, tekan kaca/mika lebih kuat lagi
6. Siapkan hasil cetakan solder paste area yang dicetak di kertas polos dan tambahkan minyak baby oil / kayu putih hingga transparan. Cetakan solder paste dapat juga dicetak di kertas transparant atau difotokopi, sehigga tidak memerlukan minyak untuk menjadikan trasnparan. Namun perlu di cek apakah warna hitam masih tembus? jika tebus maka pasang 1 lapis lagi agar bener-benar warna hitamnya tidak tembus cahaya. Penggunaan transparant ditujukan agar saat memasang di atas CUVSM jalur dapat terlihat jelas, dibandingkan menggunakan kertas yang diberi minyak.
7. Gunakan penjepit jika inggin menggunakan kaca untuk dapat meratakan CUVSM. Pasang kertas transparan di atas cellophane sesuai relief yang diinginkan, dengan bagian permukaan cetak di bawah. Hal ini agar cahaya tidak terdispersi saat menyinari CUVSM. Jangan pula menaruh mika tebal atau kaca tebal diatas kertas transparan, karena mengakibatkan penyinaran tidak maksimal. Kaitkan dengan isolasi jika perlu, agar posisi tidak mudah berubah.
8. Gunakan Lampu UV atau pengering UV HP atau pengering kuku kutek atau apapun yang dapat menyinari gelombang UV. Lama penyinaran tergantung dari kuat cahayanya. Untuk UV 8 watt TL, membutuhkan 4 – 5 menit. Untuk 2×9 watt (2 lampu pengering kuku) cukup 20 – 30 detik. Disarankan untuk mencoba menyunari CUVSM di kertas yang tidak terpakai dan tandai dari 1 s.d 7 menit. Cari lama penyinaran yang tepat, dimana CUVSM sudah mulai mengeras dan mengkilap. Pastikan pula CUVSM yang menenpel di kertas juga sudah mengeras, sehingga tidak lagi dijumpai dalam bentuk pasta.
9. Lepas cellophane secara perlahan dengan menggeser sedikit demi sedikit pada pucuknya. Usahakan saat membuka cellophane, sudut cellophane tidak leboh dari 5 derajat terhadap PCB.
10. Bersihkan sisa pasta CUVSM yang tidak mengeras, yang tidak mendapatkan sinar UV, dengan menempel – tempel dengan tisue kering hingga tidak ada pasta CUVSM yang bsa menempel ke tisue. Tuang sedikit aseton ke tisue dan ulangi tempel-tempel ke pasta CUVSM. Jangan digosok, karena dapat menjadikan CUVSM yang telah menempel ke PCB, yang mengeras, terkoyak dan lepas dari ikatan tembaga. Jika ada lubang yang tertutup pasta, gunakan aseton yang dituang di wadah dan masukkan PCB dengan digoyang goyangkan agar pasta larut. Penggunaan tiner tidak disarankan, karena bisa mengupas CUVSM yang sudah keras. Penggunaan alkohol 70% juga tidak disarankan karena pasta malah dapat berpindah di tempat lain, karena pasta tidak menempel di tissue yang ada alkoholnya.
11. Saat pasta sudah bersih, ulangi penyinaran hingga 1 jam. Ini digunakan untuk mengeraskan CUVSM dan membuatnya lebih menempel ke tembaga. Jika perlu, panaskan PCB ke suhu 250C selama bebrapa menit dengan blower atau pemanggang. Dapat juga jemur di bawah matahari terik selama 2 jam.
12. Masukkan kapas atau tisue ke AgNO3 (perak nitrat) dan tempel-tempel (tap) ke PCB. Jika memiliki AgNO3 ukuran banyak, PCB dapat dicelupkan selama 3 menit.

Konfigurasi kedalaman guratan PCB 1 oz adalah -0.078 s.d -0.10 mm

PCB dengan Dry Film Photoresist

Membuat jalur PCB dapat menggunakan beberapa cara, dari mulai menggambar menggunakan tinta anti air, sablon, toner transfer, dan salah satunya adalah menggunakan Dry Film Photoresist. Berikut langkahnya

A. Pembersihan PCB
PCB dapat cukup dibersihkan dengan digosok menggunakan sabut cuci piring Scotch-Brite, atau sabut per cuci, atau menggunakan amplas yang paling halus. Lalu usap dengan aseton bila perlu. Aseton dapat dibeli di toko kimia atau di toko swalayan sebagai pembersih kutek (cat kuku).

Jika ada minyak yang menempel pada PCB, biasanya bekas sidik jari, dapat dibersihkan dengan sabun cuci dan keringkan. Setelah itu baru digosok dengan sabut cuci atau amplas.

B. Potong PCB sesuai ukuran
Pemotongan FR2 dapat dilakukan dengan cutter. Tandai dengan cutter di sisi tembaga dan sisi sebailknya. Lalu tekan di tempat rata dan patahkan. Pemotongan FR4 perlu menggunakan gergaji besi atau semarcamnya.

C. Siapkan DFP
Siapkan DFP dengan memotong sesuai ukuran lalu buka strip plastik pelapis menggunakan isolasi.

D. Pasang DFP ke PCB
Ada beberapa cara untuk masang DFP ke PCB.
1. Cara Kering, pastikan PCB kering lalu pasang DFP dari sudut dan ditekan menggunakan jari lalu ratakan dengan rakel / kartu ATM.
2. Cara Basah, berikan bantuan sedikit air murni (jangan pakai sabun) di PCB lalu pasang DFP dari arah diteteskannya air.
Jika memiliki laminator dapat dilaminating dengan suhu kurang dari 100 derajat. Beberapa tutorial ada yang menggunakan blower suhu rendah untuk memanasi DFP, namun pastikan suhu < 100 derajat.
Penting: Tunggu 15 menit agar kering dan perekat DFP aktif, tidak disarankan langsung disinari walaupun sudah kering!

E. Siapkan desain PCB negatif
Siapkan cetakan negatif dari jalur PCB. Dapat menggunakan kertas transparan, jika memiliki printer laser. Atau cukup difotokopi di kertas transparan. Jika kesulitan, dapat pula dicetak di printer tinta.
Untuk cetakan di kertas transparan, biasanya ada toner, gambar hitam, yang agak transparan. Solusinya adalah mendobeli gambar dan diisolasi. Sedangkan jika dicetak di kertas HVS, nantinya cukup diberikan minyak, semisal minyak baby oil agar kertas menjadi trasnparan.

F. Pasang desain ke PCB
Pasang desain ke PCB. Untuk desain pada kertas HVS, tempelkan, isolasi bagian pinggir dan tuang minyak hingga semua kertas transparan. Kertas akan menempel ke PCB karena daya ikat minyak. Sedangkan jika menggunakan kertas transparan, maka selain diisolasi bagian pinggir, perlu ditindih dengan kaca agar benar-benar menempel sempurnya.

G. Penyinaran
Penyinaran dapat dilakukan di matahari terik kurang lebih 1 menit. Atau dapat juga menggunakan lampu UV untuk cek uang 18 Watt, dengan waktu 5 menit. Atau dapat juga menggunakan lampu UV pengering kutek kuku 1.5 menit (90 detik) untuk film berupa kertas yang diolesi minyak.
Jika menggunakan film berupa mika trasnparan (biasanya perlu didobel untuk mendapatkan hitam sempurna), lama penyinaran dengan UV pengering kuku cukup 20 – 30 detik saja.
Lama penyinaran tergantung dari intensitas sinar UV. Lakukan percobaan penyinaran dengan mengambil sampel DFP ukuran kecil.

H. Melepas lapisan pelindung DFP
Lepas plastik pelindung DFP dengan menggunakan isolasi.

I. Bersihkan DFP
DFP yang tidak terkena sinar UV akan tetap menjadi pasta, sedangkan yang terkena sinar UV akan mengeras. Bersihkan DFP yang berbentuk pasta dengan Na2CO3 atau soda Ash (1 gram/100ml). Jangan terlalu banyak menggunakan sida ash, perabdingan yang lebih besar mengakibatkan DFP mudah lepas dan larut!
Jika kesulitan mendapatkan Soda Ash, dapat juga menggunakan detergen cuci baju yang mengandung Na2CO3. Rendam beberapa saat lalu bersihkan menggunakan kuas kecil. Jika tidak ada kuas kecil, gunakan kapas, namun gosok perlahan jangan sampai DFP kering ikut terkelupas.

J. PCB siap di-etching

Ket:
DRC – Design Rule Check untuk penggunaan DFP terbaik yang pernah dicoba adalah:
Clearance: >=0,3mm
Track Width: >= 0.3mm

DRC – Design Rule Check untuk penggunaan DFP yang disarankan adalah:
Clearance: >= 0,4 mm
Track Width: >= 0.4 mm

Hasil:

Jalur 0.3mm terbentuk jadi sekitar 0.4 – 0.5 mm, clearance 0.3mm terbentuk menjadi berkurang menjadi 0.2mm hingga 0.1mm
Jalu 0.4mm terbentuk menjadi 0.6mm, clearance 0.4mm berkurang menjadi 0.3mm.
INI ADALAH BATAS REKOMENDASI AGAR JALUR AMAN DARI SHORT ATAU PUTUS
Untuk jalur 0.2mm dengan clearance 0.2mm gagal terbentuk gap, menyambung semua. Dimungkinkan karena tiap jalur 0.2mm bleeding menjadi 0.3mm sehingga clearance mendekati 0 mm
Untuk pad komponen 0402 masih bisa terbentuk, yang seharusnya 0.6mm menjadi 0.7mm, sedangkan komponen 0201 clearance sudah hilang alias pad tergabung.