Tutorial Koneksi RFID RC522 dengan Arduino Uno dan MEGA 2560

Posted by IWAN MUTTAQIN Rabu, 17 September 2014 0 komentar
RFID atau Radio Frequency Identification, adalah suatu metode yang mana bisa digunakan untuk menyimpan atau menerima data secara jarak jauh dengan menggunakan suatu piranti yang bernama RFID tag atau transponder. Suatu RFID tag adalah sebuah benda kecil, misalnya berupa stiker adesif, dan dapat ditempelkan pada suatu barang atau produk. RFID tag berisi antena yang memungkinkan mereka untuk menerima dan merespon terhadap suatu query yang dipancarkan oleh suatu RFID transceiver.


Koneksinya:


Arduino Uno:

Uno   RC522
3.3V   VCC
GND    GND
5      RST

12     MISO
11     MOSI
13     SCK
10     NSS

Arduino MEGA 2560 :

Mega   RC522
3.3V   VCC
GND    GND
RESET  RST

50     MISO
51     MOSI
52     SCK
53     NSS / SDA

MOSI (Master In Slave Out):  Garis Master untuk mengirimkan data ke perangkat.
MISO(Master Out Slave In):  Garis Slave(Perangkat) untuk mengirim data ke master.
SCK (Serial Clock) :  Menyinkronkan transmisi data yang dihasilkan oleh master dan  khusus untuk setiap perangkat.
NSS/SDA (Slave Select) :  Pin pada setiap perangkat master dapat digunakan  untuk mengaktifkan dan menonaktifkan perangkat tertentu.




Source Codenya:

 //sensor berkomunikasi menggunakan SPI (Serial Peripheral Interface)
#include

#define    uchar    unsigned char
#define    uint    unsigned int

// Panjang maksimum dari array
#define MAX_LEN 16

/////////////////////////////////////////////////////////////////////
//set pinnya
/////////////////////////////////////////////////////////////////////
// Arduino Mega - pin = 53
// Arduino Uno  - pin = 10
const int chipSelectPin = 53;
const int NRSTPD = 5;

//MF522命令字
#define PCD_IDLE              0x00               // Membatalkan perintah saat ini
#define PCD_AUTHENT           0x0E               // Authentication Key
#define PCD_RECEIVE           0x08               // Menerima Data
#define PCD_TRANSMIT          0x04               // Mengirim data
#define PCD_TRANSCEIVE        0x0C               // Mengirim dan menerima data
#define PCD_RESETPHASE        0x0F               // Atur ulang
#define PCD_CALCCRC           0x03               // Menghitung CRC

// Prosedure perintah Kartu
#define PICC_REQIDL           0x26               // Ketika tidak menemukan Sinyal ke hibernasi
#define PICC_REQALL           0x52               // Aarea sinyal dengan semua kartu
#define PICC_ANTICOLL         0x93               // Antisipasi Tabrakan Data
#define PICC_SElECTTAG        0x93               // Memilih kartu
#define PICC_AUTHENT1A        0x60               // Sebuah verifikasi kunci A
#define PICC_AUTHENT1B        0x61               // Verifikasi kunci B
#define PICC_READ             0x30               // Baca Block
#define PICC_WRITE            0xA0               // Menulis Block
#define PICC_DECREMENT        0xC0               // Memasukan pengurangan
#define PICC_INCREMENT        0xC1               // Mengisi kembali
#define PICC_RESTORE          0xC2               // Mentransfer blok data ke buffer
#define PICC_TRANSFER         0xB0               // Disimpan dalam Buffer data
#define PICC_HALT             0x50              


// Kode kesalahan dikembalikan ketika MF522 melakukan komunikasi kembali.
#define MI_OK                 0
#define MI_NOTAGERR           1
#define MI_ERR                2


// ------------------ MFRC522 melakukan registrasi ---------------
//Page 0:Command and Status
#define     Reserved00            0x00   
#define     CommandReg            0x01   
#define     CommIEnReg            0x02   
#define     DivlEnReg             0x03   
#define     CommIrqReg            0x04   
#define     DivIrqReg             0x05
#define     ErrorReg              0x06   
#define     Status1Reg            0x07   
#define     Status2Reg            0x08   
#define     FIFODataReg           0x09
#define     FIFOLevelReg          0x0A
#define     WaterLevelReg         0x0B
#define     ControlReg            0x0C
#define     BitFramingReg         0x0D
#define     CollReg               0x0E
#define     Reserved01            0x0F
//Page 1:Command    
#define     Reserved10            0x10
#define     ModeReg               0x11
#define     TxModeReg             0x12
#define     RxModeReg             0x13
#define     TxControlReg          0x14
#define     TxAutoReg             0x15
#define     TxSelReg              0x16
#define     RxSelReg              0x17
#define     RxThresholdReg        0x18
#define     DemodReg              0x19
#define     Reserved11            0x1A
#define     Reserved12            0x1B
#define     MifareReg             0x1C
#define     Reserved13            0x1D
#define     Reserved14            0x1E
#define     SerialSpeedReg        0x1F
//Page 2:CFG   
#define     Reserved20            0x20 
#define     CRCResultRegM         0x21
#define     CRCResultRegL         0x22
#define     Reserved21            0x23
#define     ModWidthReg           0x24
#define     Reserved22            0x25
#define     RFCfgReg              0x26
#define     GsNReg                0x27
#define     CWGsPReg              0x28
#define     ModGsPReg             0x29
#define     TModeReg              0x2A
#define     TPrescalerReg         0x2B
#define     TReloadRegH           0x2C
#define     TReloadRegL           0x2D
#define     TCounterValueRegH     0x2E
#define     TCounterValueRegL     0x2F
//Page 3:TestRegister    
#define     Reserved30            0x30
#define     TestSel1Reg           0x31
#define     TestSel2Reg           0x32
#define     TestPinEnReg          0x33
#define     TestPinValueReg       0x34
#define     TestBusReg            0x35
#define     AutoTestReg           0x36
#define     VersionReg            0x37
#define     AnalogTestReg         0x38
#define     TestDAC1Reg           0x39 
#define     TestDAC2Reg           0x3A  
#define     TestADCReg            0x3B  
#define     Reserved31            0x3C  
#define     Reserved32            0x3D  
#define     Reserved33            0x3E  
#define     Reserved34              0x3F
//-----------------------------------------------

// Card 4 byte nomor seri, kelima byte checksum byte
uchar serNum[5];

uchar  writeData[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100};  // Inisialisasi 100 dolar
uchar  moneyConsume = 18 ;  // Menghabiskan 18 yuan
uchar  moneyAdd = 10 ;  // Isi Ulang 10 yuan
// Sebuah sektor password, 16 sektor, masing-masing sandi 6 Byte
 uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                            };
 uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
                                 //you can set another ket , such as  " 0x19, 0x84, 0x07, 0x15, 0x76, 0x14 "
                                 //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
                                 // but when loop, please set the  sectorKeyA, the same key, so that RFID module can read the card
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14},
                               };

void setup() {               
   Serial.begin(9600);        // RFID reader SOUT pin connected to Serial RX pin at 2400bps
 // start SPI library:
  SPI.begin();
 
  pinMode(chipSelectPin,OUTPUT);             // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin
    digitalWrite(chipSelectPin, LOW);          // Activate the RFID reader
  pinMode(NRSTPD,OUTPUT);               // Set digital pin 10 , Not Reset and Power-down
    digitalWrite(NRSTPD, HIGH);

  MFRC522_Init(); 
}

void loop()
{
      uchar i,tmp;
    uchar status;
        uchar str[MAX_LEN];
        uchar RC_size;
        uchar blockAddr;    // Pilih alamat blok operasi 0-63
        String mynum = "";


        // Cari kartu, kembali jenis kartu   
        status = MFRC522_Request(PICC_REQIDL, str);   
        if (status == MI_OK)
        {
            Serial.println("Card detected");
            Serial.print(str[0],BIN);
            Serial.print(" , ");
            Serial.print(str[1],BIN);
            Serial.println(" ");
        }

        // Anti-tabrakan, mengembalikan kartu nomor seri 4 byte
        status = MFRC522_Anticoll(str);
        memcpy(serNum, str, 5);
        if (status == MI_OK)
        {

                        Serial.println("Karu terdeteksi  : ");
            Serial.print(serNum[0]);
            Serial.print(" , ");
            Serial.print(serNum[1],BIN);
            Serial.print(" , ");
            Serial.print(serNum[2],BIN);
            Serial.print(" , ");
            Serial.print(serNum[3],BIN);
            Serial.print(" , ");
            Serial.print(serNum[4],BIN);
            Serial.println(" ");
                       
                        // Should really check all pairs, but for now we'll just use the first
                    
                        if(serNum[0] == 181)  { //Sesuaikan dengan Kartu yang terdeteksi
                          Serial.println("Kartu Satu  Terdeteksi Sebagai Iwan Cilibur ");
                        } else if(serNum[0] == 105) {
                          Serial.println("Kartu Dua Terdeteksi Sebagai Orang Ganteng");
                        }
                        delay(1000);
        }
                //Serial.println(" ");
        MFRC522_Halt();            // Kartu perintah ke Sleep                     
         
}

/*
  * Nama Fungsi: Write_MFRC5200
  * Keterangan: MFRC522 register untuk menulis byte data
  * Masukan: - mendaftarkan alamat addr; val - nilai yang akan ditulis
  * Kembali Nilai: Tidak ada
  */

void Write_MFRC522(uchar addr, uchar val)
{
    digitalWrite(chipSelectPin, LOW);

    // Format Alamat:0XXXXXX0
    SPI.transfer((addr<<1 amp="" br="" nbsp="" x7e="">    SPI.transfer(val);
   
    digitalWrite(chipSelectPin, HIGH);
}


/*
  * Nama Fungsi: Read_MFRC522
  * Keterangan: Membaca satu byte data dari MFRC522  kemudian mendaftarkan
  * Masukan Parameter: addr - mendaftarkan alamat
  * Mengembalikan nilai: Mengembalikan byte data dibaca
  */

uchar Read_MFRC522(uchar addr)
{
    uchar val;

    digitalWrite(chipSelectPin, LOW);

    //地址格式:1XXXXXX0
    SPI.transfer(((addr<<1 0x80="" amp="" br="" nbsp="" x7e="">    val =SPI.transfer(0x00);
   
    digitalWrite(chipSelectPin, HIGH);
   
    return val;   
}

/*
  * Nama Fungsi: SetBitMask
  * Keterangan: Set RC522 mendaftar bit
  * Parameter input: reg - mendaftarkan alamat; mask - set nilai
  * Kembali Nilai: Tidak ada
  */

void SetBitMask(uchar reg, uchar mask) 
{
    uchar tmp;
    tmp = Read_MFRC522(reg);
    Write_MFRC522(reg, tmp | mask);  // set bit mask
}


/*
  * Nama Fungsi: ClearBitMask
  * Keterangan: Clear bit RC522 mendaftar
  * Parameter input: reg - mendaftarkan alamat; mask - nilai bit yang jelas
  * Kembali Nilai: Tidak ada
  */

void ClearBitMask(uchar reg, uchar mask) 
{
    uchar tmp;
    tmp = Read_MFRC522(reg);
    Write_MFRC522(reg, tmp & (~mask));  // clear bit mask
}


/*
 * Nama Fungsi: AntennaOn
 * Keterangan: Sinyal akan terbuka /mendeteksi  kartu setiap kali memulai  tap setidaknya 1ms Interval .
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
*/

void AntennaOn(void)
{
    uchar temp;

    temp = Read_MFRC522(TxControlReg);
    if (!(temp & 0x03))
    {
        SetBitMask(TxControlReg, 0x03);
    }
}


/*
  * Nama Fungsi: AntennaOff
  * Keterangan: Sinyal akan tertutup /tidak mendeksi   kartu setiap kali memulai  tap setidaknya 1ms Interval .
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
*/

void AntennaOff(void)
{
    ClearBitMask(TxControlReg, 0x03);
}


/*
 * Nama Fungsi: ResetMFRC522
 * Keterangan: Ganti RC522
 * Masukan: Tidak ada
 * Kembali Nilai: Tidak ada
 */

void MFRC522_Reset(void)
{
    Write_MFRC522(CommandReg, PCD_RESETPHASE);
}


/*
 * Nama Fungsi: InitMFRC522
  * Keterangan: Initialize RC522
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
 */

void MFRC522_Init(void)
{
    digitalWrite(NRSTPD,HIGH);

    MFRC522_Reset();
        
    //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
    Write_MFRC522(TModeReg, 0x8D);        //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
    Write_MFRC522(TPrescalerReg, 0x3E);    //TModeReg[3..0] + TPrescalerReg
    Write_MFRC522(TReloadRegL, 30);          
    Write_MFRC522(TReloadRegH, 0);
   
    Write_MFRC522(TxAutoReg, 0x40);        //100%ASK
    Write_MFRC522(ModeReg, 0x3D);        //CRC初始值0x6363    ???

    //ClearBitMask(Status2Reg, 0x08);        //MFCrypto1On=0
    //Write_MFRC522(RxSelReg, 0x86);        //RxWait = RxSelReg[5..0]
    //Write_MFRC522(RFCfgReg, 0x7F);           //RxGain = 48dB

    AntennaOn();        //打开天线
}


/*
  * Nama Fungsi: MFRC522_Request
  * Description: Mencari kartu, membaca nomor jenis kartu
  * Parameter input: reqMode - menemukan kartu dengan cara TagType - Card Kembali Type
 *                 0x4400 = Mifare_UltraLight
 *                0x0400 = Mifare_One(S50)
 *                0x0200 = Mifare_One(S70)
 *                0x0800 = Mifare_Pro(X)
 *                0x4403 = Mifare_DESFire
 * Mengembalikan nilai: kembali sukses MI_OK
 */
uchar MFRC522_Request(uchar reqMode, uchar *TagType)
{
    uchar status; 
    uint backBits;            // Bit data yang diterima

    Write_MFRC522(BitFramingReg, 0x07);        //TxLastBists = BitFramingReg[2..0]    ???
   
    TagType[0] = reqMode;
    status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

    if ((status != MI_OK) || (backBits != 0x10))
    {   
        status = MI_ERR;
    }
  
    return status;
}


/*
  * Nama Fungsi: MFRC522_ToCard
  * Keterangan: RC522 dan kartu ISO14443 komunikasi
  * Parameter input: Perintah - perintah kata MF522,
  * SendData - data yang dikirim ke kartu melalui RC522,
  * SendLen - panjang data yang dikirim
  * Fxtrader Backdata - menerima data kartu kembali,
  * BackLen - kembali panjang data bit
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
{
    uchar status = MI_ERR;
    uchar irqEn = 0x00;
    uchar waitIRq = 0x00;
    uchar lastBits;
    uchar n;
    uint i;

    switch (command)
    {
        case PCD_AUTHENT:        // Saat Kartu didekatkan
        {
            irqEn = 0x12;
            waitIRq = 0x10;
            break;
        }
        case PCD_TRANSCEIVE:    // Mengirimkan data FIFO
        {
            irqEn = 0x77;
            waitIRq = 0x30;
            break;
        }
        default:
            break;
    }
  
    Write_MFRC522(CommIEnReg, irqEn|0x80);    // Permintaan interupsi
    ClearBitMask(CommIrqReg, 0x80);        // Hapus semua interrupt request bit
    SetBitMask(FIFOLevelReg, 0x80);        // FlushBuffer = 1, FIFO inisialisasi 
    Write_MFRC522(CommandReg, PCD_IDLE);    // NO tindakan; membatalkan perintah sesaat    ???

// Menulis data ke FIFO
    for (i=0; i    {  
        Write_MFRC522(FIFODataReg, sendData[i]);   
    }

    //执行命令
    Write_MFRC522(CommandReg, command);
    if (command == PCD_TRANSCEIVE)
    {   
        SetBitMask(BitFramingReg, 0x80);        //StartSend=1,transmission of data starts 
    }  
   
    // Menunggu untuk menerima data untuk diproses
    i = 2000;    //i  sesuai dengan penyesuaian frekuensi delay, kartu operasi M1 maksimum menunggu waktu 25ms???
    do
    {
        //CommIrqReg[7..0]
        //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
        n = Read_MFRC522(CommIrqReg);
        i--;
    }
    while ((i!=0) && !(n&0x01) && !(n&waitIRq));

    ClearBitMask(BitFramingReg, 0x80);            //StartSend=0
   
    if (i != 0)
    {   
        if(!(Read_MFRC522(ErrorReg) & 0x1B))    //BufferOvfl Collerr CRCErr ProtecolErr
        {
            status = MI_OK;
            if (n & irqEn & 0x01)
            {  
                status = MI_NOTAGERR;            //??  
            }

            if (command == PCD_TRANSCEIVE)
            {
                   n = Read_MFRC522(FIFOLevelReg);
                  lastBits = Read_MFRC522(ControlReg) & 0x07;
                if (lastBits)
                {  
                    *backLen = (n-1)*8 + lastBits;  
                }
                else
                {  
                    *backLen = n*8;  
                }

                if (n == 0)
                {  
                    n = 1;   
                }
                if (n > MAX_LEN)
                {  
                    n = MAX_LEN;  
                }
               
                // Membaca FIFO data yang diterima
                for (i=0; i                {  
                    backData[i] = Read_MFRC522(FIFODataReg);   
                }
            }
        }
        else
        {  
            status = MI_ERR; 
        }
       
    }
   
    //SetBitMask(ControlReg,0x80);           //timer stops
    //Write_MFRC522(CommandReg, PCD_IDLE);

    return status;
}


/*
  * Nama Fungsi: MFRC522_Anticoll
  * Keterangan: deteksi Anti-tabrakan, untuk membaca nomor seri kartu /cek kartu
  * Parameter input: serNum - kembali  4 byte kartu nomor seri, kelima byte checksum byte
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Anticoll(uchar *serNum)
{
    uchar status;
    uchar i;
    uchar serNumCheck=0;
    uint unLen;
   

    //ClearBitMask(Status2Reg, 0x08);        //TempSensclear
    //ClearBitMask(CollReg,0x80);            //ValuesAfterColl
    Write_MFRC522(BitFramingReg, 0x00);        //TxLastBists = BitFramingReg[2..0]

    serNum[0] = PICC_ANTICOLL;
    serNum[1] = 0x20;
    status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);

    if (status == MI_OK)
    {
        // Periksa kartu nomor seri
        for (i=0; i<4 br="" i="">        {  
             serNumCheck ^= serNum[i];
        }
        if (serNumCheck != serNum[i])
        {  
            status = MI_ERR;   
        }
    }

    //SetBitMask(CollReg, 0x80);        //ValuesAfterColl=1

    return status;
}


/*
  * Nama Fungsi: CalulateCRC
  * Keterangan: CRC dihitung dengan MF522
  * Parameter input: pIn data - untuk membaca data CRC, len - panjang data, pOutData - hasil perhitungan CRC
  * Kembali Nilai: Tidak ada
  */

void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
{
    uchar i, n;

    ClearBitMask(DivIrqReg, 0x04);            //CRCIrq = 0
    SetBitMask(FIFOLevelReg, 0x80);            //清FIFO指针
    //Write_MFRC522(CommandReg, PCD_IDLE);

    // Menulis data ke FIFO       
    for (i=0; i    {  
        Write_MFRC522(FIFODataReg, *(pIndata+i));  
    }
    Write_MFRC522(CommandReg, PCD_CALCCRC);

    // Tunggu perhitungan CRC selesai
    i = 0xFF;
    do
    {
        n = Read_MFRC522(DivIrqReg);
        i--;
    }
    while ((i!=0) && !(n&0x04));            //CRCIrq = 1

    //读取CRC计算结果
    pOutData[0] = Read_MFRC522(CRCResultRegL);
    pOutData[1] = Read_MFRC522(CRCResultRegM);
}


/*
  * Nama Fungsi: MFRC522_SelectTag
  * Keterangan: Kartu yang dipilih, baca kapasitas memory card
  * Masukan parameter: serNum - kartu masuk nomor seri
  * Mengembalikan nilai:  sukses kapasitas kartu
  */
uchar MFRC522_SelectTag(uchar *serNum)
{
    uchar i;
    uchar status;
    uchar size;
    uint recvBits;
    uchar buffer[9];

    //ClearBitMask(Status2Reg, 0x08);            //MFCrypto1On=0

    buffer[0] = PICC_SElECTTAG;
    buffer[1] = 0x70;
    for (i=0; i<5 br="" i="">    {
        buffer[i+2] = *(serNum+i);
    }
    CalulateCRC(buffer, 7, &buffer[7]);        //??
    status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
   
    if ((status == MI_OK) && (recvBits == 0x18))
    {  
        size = buffer[0];
    }
    else
    {  
        size = 0;   
    }

    return size;
}


/*
  * Nama Fungsi: MFRC522_Auth
  * Keterangan: Ulangi password kartu
  * Parameter input: authMode - modus otentikasi password
                  0x60 = A verifikasi kunci
                  0x61 = verifikasi kunci B
              BlockAddr - blok alamat
              Sandi Sektor - Sectorkey
              serNum - kartu nomor seri, 4 byte
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
{
    uchar status;
    uint recvBits;
    uchar i;
    uchar buff[12];

    // Verifikasi instruksi blok alamat + sektor + password + kartu nomor seri
    buff[0] = authMode;
    buff[1] = BlockAddr;
    for (i=0; i<6 br="" i="">    {   
        buff[i+2] = *(Sectorkey+i);  
    }
    for (i=0; i<4 br="" i="">    {   
        buff[i+8] = *(serNum+i);  
    }
    status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);

    if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
    {  
        status = MI_ERR;  
    }
   
    return status;
}

/*
  * Nama Fungsi: MFRC522_Read
  * Keterangan: Membaca data blok
  * Parameter input: blockAddr - blok alamat; recvData - blok data dibacakan
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
{
    uchar status;
    uint unLen;

    recvData[0] = PICC_READ;
    recvData[1] = blockAddr;
    CalulateCRC(recvData,2, &recvData[2]);
    status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);

    if ((status != MI_OK) || (unLen != 0x90))
    {
        status = MI_ERR;
    }
   
    return status;
}


/*
  * Nama Fungsi: MFRC522_Write
  * Keterangan: Menulis data blok
  * Parameter input: blockAddr - blok alamat; WriteData - untuk blok data 16-byte yang ditulis
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
{
    uchar status;
    uint recvBits;
    uchar i;
    uchar buff[18];
   
    buff[0] = PICC_WRITE;
    buff[1] = blockAddr;
    CalulateCRC(buff, 2, &buff[2]);
    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);

    if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
    {  
        status = MI_ERR;  
    }
       
    if (status == MI_OK)
    {
        for (i=0; i<16 16byte="" br="" data="" fifo="" i="" ke="" menulis="" nbsp="">        {   
            buff[i] = *(writeData+i);  
        }
        CalulateCRC(buff, 16, &buff[16]);
        status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
       
        if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
        {  
            status = MI_ERR;  
        }
    }
   
    return status;
}


/*
  * Nama Fungsi: MFRC522_Halt
  * Keterangan: Kartu Command ke hibernasi
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
  */
void MFRC522_Halt(void)
{
    uchar status;
    uint unLen;
    uchar buff[4];

    buff[0] = PICC_HALT;
    buff[1] = 0;
    CalulateCRC(buff, 2, &buff[2]);

    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
}

Baca Selengkapnya ....

Menyalakan LED Arduino dengan VB.NET

Posted by IWAN MUTTAQIN Kamis, 06 Februari 2014 4 komentar
Selamat Malam sahabat Cilibur Inspirasi, Kali ini Cilibur Inspirasi Ingin berbagi Tutorial Tentang  Menyalakan LED  Arduino dengan VB.NET,

Oke langsung ke TKP aja ya :D

Apa saja yang kita butuh kan untuk memulai tutorial ini??
1. pastinya board Arduino Mega 2506 (yang tipe lain juga bisa kok )
2. pastinya laptop/PC yang terinstal Visual Basik.Net 2012 (VB.Net 2012) bisa juga versilain yang penting masih masuk dalam keluarga VB.Net
3. 1 buah LED
4. Kabel Data untuk arduino to PC
5. Breadboard (Kalau ada, kalau tidak ada juga gak masalah)

oke saya rasa cukup itu aja yang kita butuhkan ^_^. eh.. gak pakau supply atau batrai ya? kali ini kita menggunakan supply dari laptop atau PC saja ^_^

cara perakitan :
1. Buka Visual studio 2012, Klik New Project... , klik Windows Form Application, Beri nama "Arduino Serial" kemudian klik Ok
2. kemudian buat lah form seperti gambar dibawah ini
apa saja yang ada di form diatas??
1. Button LED On, LED Off, Connect, Disconnect, Exit  buttop connect dan dis connect di timpa dengan ukuran ang sama
Bagaimana cara membuat tombol??
- klik di Data Source pilih Button kemudian drag and drop ke form 1
button1 = ganti text pada Propertis menjadi LED On
button2 = ganti text pada Propertis menjadi LED Off
button3 = ganti text pada Propertis menjadi Connect
button4 = ganti text pada Propertis menjadi Disconnected
button5 = ganti text pada Propertis menjadi LED On exit
2. StatusStrip, untuk tulisan Connect dan disconnect di bagian kiri bawah
bagaimana cara buat StatusStrip?? sama sajadengan membuat button cuma pilih saja StatusStrip
 kemudian dimasukan ke form 1. setelah itu pada bagian StatusStrip klik add pada form kemudian pilih status label dan ganti name pada properti status label menjadi status1
3. SerialPort, ini di gunakan untuk membuat koneksi antara arduino dan PC
cara untuk memasukan serialport juga sama dengan memasukan push button
kemudian pada propertis ganti namanya menjadi sp1
oke kemudian susun semua seperti di gambar

jika sudah selesai klik View pilih code atau tekan F7
kemudian ketikan kode berikut

Imports System.IO
Imports System.IO.Ports
Imports System.Threading


Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If sp1.IsOpen() Then sp1.Close()
        sp1.Close()
        status1.Text = "Disconnected"
        status1.ForeColor = Color.Red
        Button5.Text = "&Exit"
        Button3.Visible = True
        Button4.Visible = False
        Button1.Enabled = False
        Button2.Enabled = False
      
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        sp1.Close()
        sp1.PortName = "com6" 'sesuaikan dengan port arduino anda
        sp1.Open()
        status1.Text = "Connected"
        status1.ForeColor = Color.Green
        Button5.Text = "&Exit And Disconnect"
        Button3.Visible = False
        Button4.Visible = True
        Button1.Enabled = True
        Button2.Enabled = True
       
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        sp1.Write("0")
        sp1.Close()
        status1.Text = "Disconnected"
        status1.ForeColor = Color.Red
        Button5.Text = "&Exit"
        Button3.Visible = True
        Button4.Visible = False
        Button1.Enabled = False
        Button2.Enabled = False
       
    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        If sp1.IsOpen Then
            sp1.Write("0")
            sp1.Close()
            End
        End If
        End
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If sp1.IsOpen Then
            sp1.Write("1")
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If sp1.IsOpen Then
            sp1.Write("0")
        End If
    End Sub

End Class



oke sudah selesai kode diatas??
jika sudah di save dulu saja ya ^_^

selanjutnya bagaimana interface pada arduinonya??

1. hubungkan LED kaki positifnya pada pin nomor 8 pada arduino dan kaki minusnya di pin GND
2. hubungkan Arduino Ke PC menggunakan kabel data

begitu aja untuk arduinonya hehehe

kemudian buka software arduinonya
selanjutnya ketikan kodeberikut pada arduino

char a;
int led=8;
void setup()
{
pinMode(led,OUTPUT);
Serial.begin(9600);
}

void loop()
{
  if(Serial.available()!=0)

  a=Serial.read();
  if(a=='1'){digitalWrite(led,HIGH);}
  if(a=='0'){digitalWrite(led,LOW);}
}
}


kemudian upload pada Arduinonya

jika sudah selesai di upload buka kembali VB 2012 yang tadi di gunakan membuat tampilan VB diatas kemudian klik start pada deretan menu diatasnya
kemudian coba klik pada tombol LED On  untuk menyalakan LED dan klik pada tombol LED Off  untuk mematikan LED

Oke selesai tutorialnya ^_^
semoga bisa di mengerti ya, jika ada yang tidak di menggerti silahkan komen di bawah ya ^_^

Bagi yang mau download program jadinya silahkan klik tombol download di bawah ini

http://adf.ly/YqLOj
Sumber: http://www.rizrobot.com/2013/11/tutorial-arduino-komunikasi-serial.html

Baca Selengkapnya ....

QR Code Cilibur Inspirasi

QR Code Cilibur Inspirasi
Iwan Cilibur support Terbitkan Puisimu - Modify by Cilibur Inspirasi | Copyright of CILIBUR INSPIRASI.

Logo Cilibur inspirasi

Klik cek this out !
Ganti Ukurannya agar sesuai dengan Blog sahabat (width:150px; height:150px)

Mengenai Saya

Foto saya
Nama saya Iwan Muttaqin. Saya terjun di dunia Blogging sejak 20 Mei 2010 sampai sekarang. Maksud dan tujuan

Google+ Badge

Followers