Pada kali ini kita akan mengontrol Rabbit Microprocessor dengan RPadlock.
Rantonesia Padlock (RPadLock) tidak lebih dari sebuah aplikasi android remote control sederhana. Perbedaannya RPadLock dapat mengontrol device (thing) asalkan device tersebut terhubung dengan Geeknesia. Dengan kata lain RPadLock merupakan aplikasi android yang universal dan dedicated untuk Geeknesia.
Pada kali ini kita akan mengontrol Rabbit Microprocessor dengan RPadlock.
Untuk dapat mengontrol Rabbit uP anda yang harus dipersiapkan adalah hal-hal berikut :
Kabel USB untuk download program Dynamic C, debug dan sumber Power supply 5VDC.
Langkah-langkah yang harus dikerjakan adalah :
1. Pasang RCM6700 pada RCM67xx Interface Board anda dan lakukan wiring dengan rangkaian berikut ini :
2. Buka Dynamic C IDE dan copy-kan program berikut :
#class auto #use "RCM67xx.lib" #use "sflash.lib" #define TCPCONFIG 6 //TCPCONFIG for runtime setting #define MY_NAMESERVER "192.168.0.1" #define REMOTE_IP "api.geeknesia.com" #memmap xmem #use "dcrtcp.lib" #define PORT 80 //http port #define LED 0 #define R1 2 #define R2 4 #define R3 7 char flash_buf[1056]; tcp_Socket sockslot[7]; char outbuf[512],append[16]; //============================================================================== main() { //////////////////////////////////////////////////////////////////////////////// auto char buffer[255]; auto int status; auto longword remoteip[7]; auto char ip_user[15],msk[15],gtw[15]; unsigned int sockslotflag[7]={0, 0, 0, 0, 0, 0, 0}; char strdb[4]; int intdb,decimal; int digit[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; char ascii_buffer[17]; char fbyte, inchar; int i, j, k, pagenum, value, start, end, fc=0; char linebuf[80], *p, *buf, ch; char left,right,lShadow=0x00,rShadow=0x00,detect,dShadow=0; int leftflag=0,rightflag=0,ldflag=0,rdflag=0,digflag=0; char lproving=0x80,rproving=0x08; char cdig='0'; //Watchdog timer disabled #asm ld a,0x51 ioi ld (WDTTR),a ld a,0x54 ioi ld (WDTTR),a #endasm brdInit(); sfspi_init(); if (sf_init()) { printf("Flash init failed\n"); exit(-1); } else { printf("Flash init OK\n"); printf("# of blocks: %d\n", sf_blocks); printf("size of block: %d\n\n", sf_blocksize); } sf_pageToRAM(0); //Loading IP Address yang disimpan di serial flash page 0 offset address 00-0F. sf_readRAM(flash_buf, 0, 16); strcpy(ip_user,flash_buf); i=0; while(flash_buf[i]!='*') { ip_user[i]=flash_buf[i]; i++; } sf_pageToRAM(1); //Loading Netmask yang disimpan di serial flash page 1 offset address 00-0F. sf_readRAM(flash_buf, 0, 16); strcpy(msk,flash_buf); i=0; while(flash_buf[i]!='*') { msk[i]=flash_buf[i]; i++; } sf_pageToRAM(2); sf_readRAM(flash_buf, 0, 16); //Loading Gateway yang disimpan di serial flash page 2 offset address 00-0F strcpy(gtw,flash_buf); i=0; while(flash_buf[i]!='*') { gtw[i]=flash_buf[i]; i++; } strcpy(gtw,"192.168.0.1*"); printf("\nMy IP Address is : %s", ip_user); printf("\nMy Netmask is : %s", msk); printf("\nMy Gateway is : %s\n", gtw); //Port B assignment BitWrPortI(PBDDR, &PBDDRShadow, 1, 2); //Assigned Pin B.2 as Output (R1) BitWrPortI(PBDR, &PBDRShadow, 1, 2); //PB.2 init BitWrPortI(PBDDR, &PBDDRShadow, 1, 3); //Assigned Pin B.3 as Output (R2) BitWrPortI(PBDR, &PBDRShadow, 1, 3); //PB.3 init BitWrPortI(PBDDR, &PBDDRShadow, 1, 7); //Assigned Pin B.7 as Output (R3) BitWrPortI(PBDR, &PBDRShadow, 1, 7); //PB.7 init //Assigned Port D as Output BitWrPortI(PDDDR, &PDDDRShadow, 1, LED); //Assigned Pin D.0 as Output (LED) BitWrPortI(PDDR, &PDDRShadow, 1, LED); //Set PD0 = OFF sock_init(); ifconfig(IF_ETH0, IFS_DOWN, //IFS_DHCP,0, IFS_IPADDR, aton(ip_user),// setup ip address IFS_NETMASK,aton(msk), // setup netmask IFS_ROUTER_SET, aton(gtw),// default router IFS_UP, IFS_END); while(1) { //TCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCPIPTCP //PASSIVECONNECTION(SERVER)PASSIVECONNECTION(SERVER)PASSIVECONNECTION(SERVER)PAS //------------------------------------------------------------------------------ costate { if (sockslotflag[0]==0) { waitfor(DelaySec(1)); tcp_tick(NULL); remoteip[0]=resolve(REMOTE_IP); tcp_open(&sockslot[0],0,remoteip[0],PORT,NULL); printf("Connecting to %s\n",REMOTE_IP); while(!sock_established(&sockslot[0]) && sock_bytesready(&sockslot[0])==-1) { tcp_tick(NULL); fc++; if (fc>=32750) { fc=0; printf("Connection cannot be established....\n"); abort; } yield; } sockslotflag[0]=1; //socket slot 0 is occupied printf("Socket Slot 0 is Connected...\n"); sock_mode(&sockslot[0],TCP_MODE_ASCII); while(tcp_tick(&sockslot[0])) yield; //------------------------------------------------------------------------------ status=sock_alive(&sockslot[0]); if (status==0) { printf("User menutup koneksi socket slot 0... \n"); waitfor(DelaySec(4)); printf("Koneksi socket slot 0 tertutup... \n"); sockslotflag[0]=0; //socket slot 0 is released } else { printf("Koneksi socket 0 tidak tertutup, koneksi hardware terputus...\n"); } //----------------------------------------------------------------------------- } } //000000000000000000000000000000000000000000000000000000000000000000000000000000 costate { if (sockslotflag[0]==1) { sock_flushnext(&sockslot[0]); strcpy(outbuf,"GET http://api.geeknesia.com/api/attribute/RN?api_key=Geeknesia_API_key_Anda\n\r\0"); sock_awrite(&sockslot[0],outbuf,strlen(outbuf)); sock_flushnext(&sockslot[0]); strcpy(outbuf," HTTP/1.1\n\r\0"); sock_awrite(&sockslot[0],outbuf,strlen(outbuf)); sock_flushnext(&sockslot[0]); strcpy(outbuf,"Host: api.geeknesia.com\n\r\0"); sock_awrite(&sockslot[0],outbuf,strlen(outbuf)); sock_flushnext(&sockslot[0]); strcpy(outbuf,"X-Auth-Token: My Token\n\r\0"); sock_awrite(&sockslot[0],outbuf,strlen(outbuf)); sock_flushnext(&sockslot[0]); strcpy(outbuf,"Connection: close\n\r\0"); sock_awrite(&sockslot[0],outbuf,strlen(outbuf)); waitfor(DelayMs(500)); } } //////////////////////////////////////////////////////////////////////////////// costate { if ((sock_bytesready(&sockslot[0])>=0) && (sockslotflag[0]==1)) { BitWrPortI(PDDR, &PDDRShadow, 0, LED); sock_gets(&sockslot[0],buffer,sizeof(buffer)); printf("%s\n",buffer); //clear data storage for (i=0; i<=9; i++) digit[i]=0; for (k=0; k<=3; k++) strdb[k]='\0'; j=29; k=0; while (buffer[j]!='}') { strdb[k]=buffer[j]; k++; j++; } intdb = atoi(strdb); printf("Hasil konversi : %i \n",intdb); intdb = intdb & 0xFF; intdb^=0xFF; WrPortI(PBDR,&PBDRShadow,intdb); BitWrPortI(PDDR, &PDDRShadow, 1, LED); } } //------------------------------------------------------------------------------ //EOFWHILE(1)EOFWHILE(1)EOFWHILE(1)EOFWHILE(1)EOFWHILE(1)EOFWHILE(1)EOFWHILE(1) } //////////////////////////////////////////////////////////////////////////////// }
File program Dynamic C dapat di unduh di : http://www.rantonic.com/image-upload/rabinesia.c
Perhatikan bahwa attribute name harus tetap RN. Pada contoh sketch di atas data yang telah diubah ke integer langsung dikeluarkan pada port B dengan perintah penulisan byte, namun karena yang diberi LED hanya 3 buah maka yang terlihat terkontrol hanya 3 bit yakni bit 2, 4 dan 7 saja. Namun sebenarnya seluruh port B dapat dikontrol.
3. Compile dan Download program di atas ke hardware Rabbit anda.
4. Install aplikasi Rantonesia Padlock (RPadlock) pada smartphone anda.
DISCLAIMER
Baca disclaimer Rantonesia Padlock pada artikel Rantonesia PadLock | (Android Apps) Universal IoT based Remote Control
5. Buka aplikasi RPadlock isi Geeknesia api key anda sesuai dengan api key yang anda peroleh dari Geeknesia (pada saat pertama di-install aplikasi akan otomatis meminta anda untuk mengisi Geeknesia API key. Untuk selanjutnya anda harus meng-klik tombol SET pada keypad RPadlock. Anda dapat memperbaharui atau mengubah Geeknesia API key anda kapan saja). Tekan tombol SAVE maka aplikasi akan kembali ke keypad utama.
6. Coba nyalakan LED pada arduino anda dengan menekan tombol 2, 4, dan 7 pada keypad RPadlock.
7. Tadaaaa...! .....dunia dalam genggaman anda....LED akan menyala dan keypad akan berubah menjadi warna kuning.
8. Untuk mematikan LED tekan kembali tombol 2, 4, dan 7 pada keypad RPadlock maka LED akan mati dan keypad akan berubah kembali menjadi warna merah.
Video : https://www.youtube.com/watch?v=tkqfh8sx_CY
Happy Coding...!
Eigen Hexbyte (www.rantonic.com)