Mengontrol Rabbit uP dengan Rantonesia Padlock

thumb-RabinesiaChip

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 :

  1. Aplikasi Rantonesia Padlock yang dapat diunduh di : http://www.rantonic.com/page/9/Rantonesia
  2. Rabbit Core Module 6700 (RCM6700) 1 pc.
  3. RCM67xx Interface Board 1 pc.
  4. LED 3 pcs.
  5. Resistor bernilai 270 ohm 3 pcs.
  6. Router yang telah terkoneksi dengan internet.
  7. Kabel ethernet (UTP CAT5).

Kabel USB untuk download program Dynamic C, debug dan sumber Power supply 5VDC.

Rabinesia Cloud

Langkah-langkah yang harus dikerjakan adalah :

1.  Pasang RCM6700 pada RCM67xx Interface Board anda dan lakukan wiring dengan rangkaian berikut ini :

Rabinesia Wiring

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.

Rantonesia Keypad

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.

Api Setup

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…!


Artikel di atas dapat dilihat pula di www.geeknesia.com

Leave a Reply

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