Anaconda WiFi Shield for Arduino

From LinkSprite Playgound
Revision as of 10:12, 29 November 2012 by Jingfeng (talk | contribs) (Programming)
Jump to: navigation, search

Introduction

This is LinkSprite Anaconda WiFi Shield for Arduino (everything you see on the picture is included except the Arduino board).

This WiFi Shield has built-in TCP/IP stack and all the WiFi related code. Arduino just needs to configure the WiFi parameters using AT command through the UART, or, user can simply treat the WiFi as a transparent serial port after some offline configuration.


Model: LS_ANA_WIFI

Anaconda wifi shield for arduino.jpg

Features

Application Ideas

Cautions

Schematic

Schematics

Specification

Pin definition and Rating

Mechanic Dimensions

Usage

Hardware Installation

To do the offline configuration, jumping TX to MTX, RX to MRX, removing ATMGEA328, and configure the module through the Arduino USB port using the configuring GUI utility [1]. During power cycle, the parameters are saved.

Programming

The sample code is shown in the following.

Here we are going to explain the setting.

The password is set in the structure named IPNetParaBuffer:


<syntaxhighlight lang="c"> struct NetParaBuffer IPNetParaBuffer[8]={ {0x06,0x01,0x01}, //Link layer Protocol UDP {0x07,0x02,0x0b,0xb8}, //port number 3000: 0x0b 0xb8; 6000 0x17,0x70 {0x08,0x04,0xc0,0xa8,0x02,0xa6}, //device ip 192.168.2.166

 {0x09,0x04,0xc0,0xa8,0x02,0xa5},      //server ip 192.168.2.165  

{0x0b,0x01,0x01}, //net mask 255.255.255.0 {0x0c,0x04,0xc0,0xa8,0x02,0x1}, //gateway 192.168.2.1 {0x04,0x01,0x01}, //encrypt mode: {0x05,0x36,0x0d,0x00, //key

0x6c,0x69,0x6e,0x6b,0x73,0x70,0x72,0x69,0x74,0x65,0x30,0x30,0x31, //        
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,     
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30},

}; </syntaxhighlight>

Encryption mode: 0x04 protocol byte. It’s fixed. Don’t change. 0x01 is the length, and followed by the mode byte. 0x01 means WEP. 0x00 means open. Key: 0x05 protocol byte. 0x36 is the total length of payload. 0x0dis the length of each key.

WEP128BIT needs all 13 bytes. It’s needed to fill all of them. If key is characters, for example, “linksprite001”, then we just need to fill with the ASCII of “0x6c,0x69,0x6e,0x6b,0x73,0x70,0x72,0x69,0x74,0x65,0x30,0x30,0x31”, and fill the rest with 0.


Important Note:

When connect TX to MRX and RX to MTX, i.e., Wifi module is talking to MCU, both the module and the USB are trying to taking to atmega. Please unplug your shield when uploading hex. Otherwise, you will get program timeout issue.


Anaconda 1.png



<syntaxhighlight lang="c">

unsigned char const __crc8_tbl[256]= {

 0x00,0x91,0xe3,0x72,0x07,0x96,0xe4,0x75,0x0e,0x9f,0xed,0x7c,0x09,0x98,0xea,0x7b,
 0x1c,0x8d,0xff,0x6e,0x1b,0x8a,0xf8,0x69,0x12,0x83,0xf1,0x60,0x15,0x84,0xf6,0x67,
 0x38,0xa9,0xdb,0x4a,0x3f,0xae,0xdc,0x4d,0x36,0xa7,0xd5,0x44,0x31,0xa0,0xd2,0x43,
 0x24,0xb5,0xc7,0x56,0x23,0xb2,0xc0,0x51,0x2a,0xbb,0xc9,0x58,0x2d,0xbc,0xce,0x5f,
 0x70,0xe1,0x93,0x02,0x77,0xe6,0x94,0x05,0x7e,0xef,0x9d,0x0c,0x79,0xe8,0x9a,0x0b,
 0x6c,0xfd,0x8f,0x1e,0x6b,0xfa,0x88,0x19,0x62,0xf3,0x81,0x10,0x65,0xf4,0x86,0x17,
 0x48,0xd9,0xab,0x3a,0x4f,0xde,0xac,0x3d,0x46,0xd7,0xa5,0x34,0x41,0xd0,0xa2,0x33,
 0x54,0xc5,0xb7,0x26,0x53,0xc2,0xb0,0x21,0x5a,0xcb,0xb9,0x28,0x5d,0xcc,0xbe,0x2f,
 0xe0,0x71,0x03,0x92,0xe7,0x76,0x04,0x95,0xee,0x7f,0x0d,0x9c,0xe9,0x78,0x0a,0x9b,
 0xfc,0x6d,0x1f,0x8e,0xfb,0x6a,0x18,0x89,0xf2,0x63,0x11,0x80,0xf5,0x64,0x16,0x87,
 0xd8,0x49,0x3b,0xaa,0xdf,0x4e,0x3c,0xad,0xd6,0x47,0x35,0xa4,0xd1,0x40,0x32,0xa3,
 0xc4,0x55,0x27,0xb6,0xc3,0x52,0x20,0xb1,0xca,0x5b,0x29,0xb8,0xcd,0x5c,0x2e,0xbf,
 0x90,0x01,0x73,0xe2,0x97,0x06,0x74,0xe5,0x9e,0x0f,0x7d,0xec,0x99,0x08,0x7a,0xeb,
 0x8c,0x1d,0x6f,0xfe,0x8b,0x1a,0x68,0xf9,0x82,0x13,0x61,0xf0,0x85,0x14,0x66,0xf7,
 0xa8,0x39,0x4b,0xda,0xaf,0x3e,0x4c,0xdd,0xa6,0x37,0x45,0xd4,0xa1,0x30,0x42,0xd3,
 0xb4,0x25,0x57,0xc6,0xb3,0x22,0x50,0xc1,0xba,0x2b,0x59,0xc8,0xbd,0x2c,0x5e,0xcf};

//LinkSprite WiFi Shield Sample Code //Send strings to the TCP/IP server

unsigned char const Send_String[30]={ 0x4c,0x69,0x6e,0x6b,0x73,0x70,0x72,0x69,0x74,0x65, 0x2d,0x77,0x69,0x66,0x69,0x2d,0x73,0x68,0x69,0x65, 0x6c,0x64,0x2d,0x74,0x65,0x73,0x74,0x21,0x21,0x21 };

  1. define WIFI_WAIT_SYN 0x00
  2. define WIFI_WAIT_CTL 0x01
  3. define WIFI_LENGTH1 0x02
  4. define WIFI_LENGTH2 0x03
  5. define WIFI_CHCK 0x04
  6. define WIFI_RECEDATA 0x05
  7. define WIFI_WAITPADDING 0x06

// WIFI flow control character

  1. define WIFI_SYN 0XAA

// parameter id type

  1. define WIFI_BSSID 0X01
  2. define WIFI_CHANEL 0X02
  3. define WIFI_SSID 0x03
  4. define WIFI_ENCRYPTTYPE 0X04
  5. define WIFI_ENKEY 0X05
  6. define WIFI_DATATYPE 0x06
  7. define WIFI_TCPPORT 0x07
  8. define WIFI_TCPIP 0X08
  9. define WIFI_TCPSERVERIP 0x09
  10. define WIFI_TCPSERVERMAC 0x0a
  11. define WIFI_TCPMASET 0X0b
  12. define WIFI_TCPGATEWAY 0X0C

// data type

  1. define CTL_DATA 0X00
  2. define NOA_DATA 0X10
  3. define ACK_DATA 0X20

// format of control data

  1. define COMAND_DATA 0x00 //arduino to wifi
  2. define MESSAGE_DATA 0X40 //wifi to arduino

// wifi control commands

  1. define SCANNETWORK_DATA 0x00
  2. define LINKNETWORK_DATA 0X01
  3. define CLOSENETWORK_DATA 0x02
  4. define SETNETPARA_DATA 0X03
  5. define QUERYNETPARA_DATA 0X04
  6. define RESTWIFI_DATA 0X05
  7. define TCPLINK_DATA 0x06
  8. define TCPSENDFAILED_DATA 0x07

typedef struct NetParaBuffer {

  unsigned char M_id;
  unsigned char cLength;
  unsigned char cInfo[64];

}NetParaBuffer; extern const struct NetParaBuffer sysNetParaBuffer[4]={ {0xa2,0x01,0x03}, //baud rate 115200 {0xa7,0x01,0x00}, //connection mode: 00 manual {0xa9,0x01,0x01}, //transparent trasmission : 01 yes {0xaa,0x01,0x00} //TCP listen :00 close }; // WiFI Module Configuration // according to the setting of access point // user the TCP/IP tool to set up a UDP server, port 3000 extern const struct NetParaBuffer IPNetParaBuffer[8]={ {0x06,0x01,0x01}, //Link Layer Protocol: UDP {0x07,0x02,0x0b,0xb8}, //port number 3000 0x0b 0xb8 Port number: 6000 (0x17,0x70) 3000: 0x0b 0xb8 {0x08,0x04,0xc0,0xa8,0x02,0xa6}, //wifi ip 192.168.2.166 {0x09,0x04,0xc0,0xa8,0x02,0xa5}, //server ip 192.168.2.165 {0x0b,0x01,0x01}, //net mask 255.255.255.0 {0x0c,0x04,0xc0,0xa8,0x02,0x1}, //gateway 192.168.2.1 {0x04,0x01,0x01}, //encryption mode:00 open 01 wep {0x05,0x36,0x0d,0x00, //key 0x6c,0x69,0x6e,0x6b,0x73,0x70,0x72,0x69,0x74,0x65,0x30,0x30,0x31, //13 bytes the first group ASCII of "linksprite001" 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, //13 bytes, 0 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,//13 bytes, 0 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30},//13 bytes, 0 }; const struct NetParaBuffer IDNetParaBuffer[3]={ {0x01,0x06,0xe0,0x05,0xc5,0xbe,0x78,0x66}, //BSSID e0-05-c5-be-78-66 {0x02,0x01,0x05}, //channel 5 {0x03,0x21,0x74,0x65,0x73,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //Ssid 0x21 is regular, the later part is ascii of Ssid 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, };

unsigned char gcSN=0x00; // unsigned char Send_datas[100]; ///////////////////////////////////////////

unsigned char GetCrc8(unsigned char *ptr,unsigned char len) {

 unsigned char  crc8,cdata;
 crc8=0;
 while(len--!=0)
 {
   cdata = *ptr++;
   crc8=__crc8_tbl[crc8^cdata];
 }
 return crc8;

}

//wifi send datas void SendDataToWifi(unsigned char cCtl,unsigned char cCommand,unsigned char *cCommandPara,unsigned int iLength) {

 unsigned char cBuf[100]; 
 cBuf[0]=WIFI_SYN;    // Synchronous Field 
 cBuf[1]=cCtl|gcSN;   // Control Field 
 gcSN++;              // frame number,number is form 0 to 15  
 if(gcSN>=0x10)
 {
   gcSN = 0;
 }
 cBuf[2]=(iLength+1)>>8;
 cBuf[3]=(iLength+1)&0x00ff;
 cBuf[4]=GetCrc8(&cBuf[1],3);
 cBuf[5]=cCommand;
 memcpy(&cBuf[6],cCommandPara,iLength);
 memset(&cBuf[6+iLength],0x00,6);
 Serial.write(cBuf, iLength+12);

} //////////////////////////////////////////////////////////////////////////////////////////// void WIFIReset(void) {

 unsigned char cBuf[2];
 cBuf[0]= 0;
 SendDataToWifi(CTL_DATA,RESTWIFI_DATA,cBuf,1);

} //////////////////////////////////////////////////////////////////////////////////////////////// //wifi net params set void WIFISetIPNetPara(unsigned char cPb, // wifi net params group number

                   const struct NetParaBuffer *cNetParaBuffer,//  wifi net params table 

unsigned char cParaNum) // params numbers {

   unsigned char cBuf[100];

unsigned char i; unsigned char cLength; cBuf[0]= cPb; cLength = 0; for(i=0;i<cParaNum;i++) { cBuf[1+cLength]= cNetParaBuffer[i].M_id; cBuf[2+cLength]= cNetParaBuffer[i].cLength; memcpy(&cBuf[3+cLength],cNetParaBuffer[i].cInfo,cBuf[2+cLength]); cLength = cLength+cBuf[2+cLength]+2; }

 SendDataToWifi(CTL_DATA,SETNETPARA_DATA,cBuf,1+cLength);

} //wifi set system params void WIFISetSysNetPara(const struct NetParaBuffer *cNetParaBuffer,// wifi net params table unsigned char cParaNum) // params numbers { unsigned char cBuf[100]; unsigned char i; unsigned char cLength;

cLength = 0; for(i=0;i<cParaNum;i++) { cBuf[cLength]= cNetParaBuffer[i].M_id; cBuf[1+cLength]= cNetParaBuffer[i].cLength; memcpy(&cBuf[2+cLength],cNetParaBuffer[i].cInfo,cBuf[1+cLength]); cLength = cLength+cBuf[1+cLength]+2; } SendDataToWifi(CTL_DATA,SETNETPARA_DATA,cBuf,cLength); }

/*********************************************************************************************************

    • function name WIFIJoinAp()
    • function Join the AP
    • cIdx:wifi net params group,default is the first group
  • /

void WIFIJoinAp(unsigned char cIdx) {

  unsigned char cBuf[1];
  cBuf[0]= cIdx;
  SendDataToWifi(CTL_DATA,LINKNETWORK_DATA,cBuf,1);

} /////////////////////////////////////////////////////////////////// ////////////////////////////////////////////

void setup() {

 int i;
 // open the serial port at 115200 bps:
 Serial.begin(115200);
 pinMode(11, OUTPUT);     
   digitalWrite(11, LOW);   // set the LED on
   delay(1000);
   delay(1000);
 digitalWrite(11, HIGH);   // set the LED on
 //gcReceComm1OK=0;
 WIFIReset();
 //RecivDataFromWifi();
 //ProcessWIFIData();
 delay(1000);
 delay(1000);
 
 //gcReceComm1OK=0;
 WIFISetSysNetPara(sysNetParaBuffer,4);		
 // RecivDataFromWifi();
 //ProcessWIFIData();
 delay(1000);
 delay(1000);
 
// gcReceComm1OK=0;
 WIFISetIPNetPara(0xb1,IPNetParaBuffer,8);
// RecivDataFromWifi();
 //ProcessWIFIData();
 delay(1000);
 delay(1000);
 
 //gcReceComm1OK=0;
 WIFISetIPNetPara(0xb1,IDNetParaBuffer,3);
 //RecivDataFromWifi();
 //ProcessWIFIData();
 delay(1000);
 delay(1000);
 
 //gcReceComm1OK=0; 
 WIFIJoinAp(0x01);
 //RecivDataFromWifi();
 //ProcessWIFIData();
 digitalWrite(11, LOW);   // set the LED on
 delay(1000);
 delay(1000); 
 for(i=0;i<30;i++)
   Send_datas[i]=Send_String[i];
 delay(1000);
 

}

void loop() {

 digitalWrite(11, HIGH);   // set the LED on
 delay(1000);
 SendDataToWifi(NOA_DATA,Send_datas[0],&Send_datas[1],29);
 digitalWrite(11, LOW);   // set the LED on
 delay(1000);

}

</syntaxhighlight>

FAQ

Please list your question here:

Support

If you have questions or other better design ideas, you can go to our forum to discuss or creat a ticket for your issue at linksprite support.

Resources

How to buy

Here to buy Anaconda Wifi Shield for Arduino[LS_ANA_WIFI] on LinkSprite Cart

See Also

Other related products and resources.

Licensing

This documentation is licensed under the Creative Commons Attribution-ShareAlike License 3.0 Source code and libraries are licensed under GPL/LGPL, see source code files for details.