LED can be controlled by remote TCP client. This code was tested with WIZwiki-W7500 platform board.

Dependencies:   WIZnetInterface mbed

Fork of TCP_LED_Control-WIZwiki-W7500 by Kiyong Lee

WIZwiki-W7500 TCP LED Control Example

Overview

The WIZwiki board series has an Ethernet interface with an RJ-45 connector, so you can quickly implement various network applications. This example controls the on-board LED by sending the specified command string to the board with Ethernet - TCP data.

Prerequisite

The following items are required to implement this example project.

  • Mandatory
  • Optional
    • Ethernet Hub or Router (supports DHCP IP allocation)

Information

If there is no Ethernet hub or router, you can connect PC and device directly with LAN cable.


Hardware Configuration

WIZwiki-W7500 Pinout

Pinout

On-board LED

The on-board LED (red) used to verify the transmission of TCP data is connected to the PC_08 pin and is declared as LED1 in the mbed library.

Network Configuration

/media/uploads/hkjung/tcp_loopback_system_config.jpg


Firmware

Command String

The following three command strings are implemented in this example project.

  • LED_ON
  • LED_OFF
  • LED_BLINK

Network Settings

MAC address

For Ethernet networking, each network device must have its own unique hardware address. that hardware address is called MAC address, and typically the MAC address is represented by six bytes hex separated by a colon. e.g., 00:08:DC:XX:XX:XX

The MAC address is defined in the code as follows.

main.cpp

#define MAC     "\x00\x08\xDC\x55\x51\x52"

IP address allocation method

Use Static IP address

The 'Static IP address' setting is the default value, and the device is configured with the network information defined in the code. It can be used when connecting the device directly to the PC or through an Ethernet hub. The IP address of the PC should be set to the same ip address range as the device.

The network information is defined in the code as follows.

main.cpp

#define IP      "192.168.0.20"   // IP address
#define SUBNET  "255.255.255.0"  // Subnet Mask
#define GATEWAY "192.168.0.1"    // Gateway address

The following is an example of the PC's network settings that can connect with the device's settings.

PC's network setting example
IP address192.168.0.21
Subnet Mask255.255.255.0
Gateway address192.168.0.1
Use DHCP

Routers that support DHCP automatically assign a leased range of IP addresses to each connected devices. If your PC is connected to a router, uncomment the following define and the device will be automatically assigned network information.

main.cpp

#define USE_DHCP

The network information assigned by the router can be checked through the debug messages output to the serial terminal.


Building and Running an Example

Steps

1. Import this project into your mbed compiler.

2. View the default program source code and modify what you need.

  • Network settings and so on.

3. Compile and Download the Program.

  • To compile the program, click the Compile button in the toolbar. This will compile all the program source code files within the program folder to create a binary program.
  • After a successful compile, you will get a "Success!" message in the compiler output and the download dialog will pop up. Save it to the location of the mbed Microcontroller drive, and then hit reset on the microcontroller to start it running!

4. Run the serial terminal program and check the messages.

/media/uploads/hkjung/serial_debug_wizwiki-w7500.png

  • Device's network settings and supported command strings.
  • Default UART baudrate: 115200bps

5. Run the TCP client terminal program and Connect to your device.

/media/uploads/hkjung/tcp_client_connect_wizwiki-w7500.png

6. Send command to your device and check status of LED and serial messages

/media/uploads/hkjung/tcp_client_wizwiki-w7500.png

/media/uploads/hkjung/serial_debug_cmd_wizwiki-w7500.png

Committer:
hkjung
Date:
Tue Apr 11 05:24:40 2017 +0000
Revision:
14:3ecd0c9dfa6b
Parent:
13:31f4ecf83cca
Child:
15:3e15e08ff603
Code modified / mbed and ethernet library updated

Who changed what in which revision?

UserRevisionLine numberNew contents of line
justinkim 8:f837e0d255e8 1 #include "mbed.h"
justinkim 8:f837e0d255e8 2 #include "EthernetInterface.h"
hjjeon 9:a63ff95c354b 3
hkjung 14:3ecd0c9dfa6b 4 #define MAC "\x00\x08\xDC\x55\x51\x52"
hkjung 14:3ecd0c9dfa6b 5 #define IP "192.168.0.20"
hkjung 14:3ecd0c9dfa6b 6 #define SUBNET "255.255.255.0"
hkjung 14:3ecd0c9dfa6b 7 #define GATEWAY "192.168.0.1"
hkjung 14:3ecd0c9dfa6b 8
hkjung 14:3ecd0c9dfa6b 9 #define ECHO_SERVER_PORT 5000
hkjung 14:3ecd0c9dfa6b 10
hkjung 14:3ecd0c9dfa6b 11 //#define USE_DHCP
hkjung 14:3ecd0c9dfa6b 12
hkjung 14:3ecd0c9dfa6b 13 #define FLAG_LED_ON 2
hkjung 14:3ecd0c9dfa6b 14 #define FLAG_LED_OFF 1
hkjung 14:3ecd0c9dfa6b 15 #define FLAG_INVALID_CMD 0
hkjung 14:3ecd0c9dfa6b 16
hkjung 14:3ecd0c9dfa6b 17 #define LED_ON 0
hkjung 14:3ecd0c9dfa6b 18 #define LED_OFF 1
hjjeon 9:a63ff95c354b 19
kzl108 12:aee11a1d7f14 20 DigitalOut myled(LED1);
kzl108 12:aee11a1d7f14 21
hkjung 14:3ecd0c9dfa6b 22 // LED control if received message matches pre-defined commands
hkjung 14:3ecd0c9dfa6b 23 char cmd_ledon[] = {'L', 'E', 'D', '_', 'O', 'N', '\0'};
hkjung 14:3ecd0c9dfa6b 24 char cmd_ledoff[] = {'L', 'E', 'D', '_', 'O', 'F', 'F', '\0'};
kzl108 12:aee11a1d7f14 25
hjjeon 11:0da8667a9201 26 int main (void)
justinkim 8:f837e0d255e8 27 {
hkjung 14:3ecd0c9dfa6b 28 myled = LED_OFF; // LED OFF in WIZwiki-W7500
hkjung 14:3ecd0c9dfa6b 29 int flag;
kzl108 12:aee11a1d7f14 30
hkjung 14:3ecd0c9dfa6b 31 printf("Wait a second...\r\n\r\n");
hkjung 14:3ecd0c9dfa6b 32
hjjeon 11:0da8667a9201 33 EthernetInterface eth;
hkjung 14:3ecd0c9dfa6b 34
hkjung 14:3ecd0c9dfa6b 35 #ifdef USE_DHCP
hkjung 14:3ecd0c9dfa6b 36 eth.init(MAC); // Use DHCP
hkjung 14:3ecd0c9dfa6b 37 #else
hkjung 14:3ecd0c9dfa6b 38 eth.init((uint8_t*)MAC, IP, SUBNET, GATEWAY); // Use Static IP address
hkjung 14:3ecd0c9dfa6b 39 #endif
hkjung 14:3ecd0c9dfa6b 40
justinkim 8:f837e0d255e8 41 eth.connect();
hkjung 14:3ecd0c9dfa6b 42
hkjung 14:3ecd0c9dfa6b 43 printf("Server IP Address is %s : %d\r\n", eth.getIPAddress(), ECHO_SERVER_PORT);
hkjung 14:3ecd0c9dfa6b 44
hkjung 14:3ecd0c9dfa6b 45 printf("Command #1: %s\r\n", cmd_ledon);
hkjung 14:3ecd0c9dfa6b 46 printf("Command #2: %s\r\n", cmd_ledoff);
hkjung 14:3ecd0c9dfa6b 47 printf("\r\n");
hjjeon 11:0da8667a9201 48
hjjeon 11:0da8667a9201 49 TCPSocketServer server;
hjjeon 11:0da8667a9201 50 server.bind(ECHO_SERVER_PORT);
hjjeon 11:0da8667a9201 51 server.listen();
hjjeon 11:0da8667a9201 52
hjjeon 11:0da8667a9201 53 while (true)
hjjeon 11:0da8667a9201 54 {
hjjeon 11:0da8667a9201 55 printf("Wait for new connection...\r\n");
hjjeon 11:0da8667a9201 56 TCPSocketConnection client;
hjjeon 11:0da8667a9201 57 server.accept(client);
hjjeon 11:0da8667a9201 58 client.set_blocking(false, 15000); // Timeout after (1.5)s
hjjeon 11:0da8667a9201 59
hjjeon 11:0da8667a9201 60 printf("Connection from: %s\r\n", client.get_address());
hkjung 14:3ecd0c9dfa6b 61 printf("\r\n");
hkjung 14:3ecd0c9dfa6b 62
hjjeon 11:0da8667a9201 63 char buffer[256];
hjjeon 11:0da8667a9201 64 while (true) {
hjjeon 11:0da8667a9201 65 int n = client.receive(buffer, sizeof(buffer));
hjjeon 11:0da8667a9201 66 if (n <= 0) break;
hjjeon 11:0da8667a9201 67
hkjung 14:3ecd0c9dfa6b 68 // Print received message to terminal
hjjeon 11:0da8667a9201 69 buffer[n] = '\0';
hkjung 14:3ecd0c9dfa6b 70 printf("Received message from Client :'%s'\r\n",buffer);
hkjung 14:3ecd0c9dfa6b 71
hkjung 14:3ecd0c9dfa6b 72 // Compares the received string to predefined commands
hkjung 14:3ecd0c9dfa6b 73 if(strncmp(buffer, cmd_ledon, sizeof(buffer)) == 0) {
hkjung 14:3ecd0c9dfa6b 74 flag = FLAG_LED_ON;
hkjung 14:3ecd0c9dfa6b 75 } else if(strncmp(buffer, cmd_ledoff, sizeof(buffer)) == 0) {
hkjung 14:3ecd0c9dfa6b 76 flag = FLAG_LED_OFF;
hkjung 14:3ecd0c9dfa6b 77 } else {
hkjung 14:3ecd0c9dfa6b 78 flag = FLAG_INVALID_CMD;
kzl108 12:aee11a1d7f14 79 }
hjjeon 11:0da8667a9201 80
hkjung 14:3ecd0c9dfa6b 81 // LED On/Off or Invalid command
hkjung 14:3ecd0c9dfa6b 82 switch(flag)
hkjung 14:3ecd0c9dfa6b 83 {
hkjung 14:3ecd0c9dfa6b 84 case FLAG_LED_ON:
hkjung 14:3ecd0c9dfa6b 85 myled = LED_ON; // LED ON in WIZwiki-W7500
hkjung 14:3ecd0c9dfa6b 86 printf("WIZwiki: LED is turned on!\r\n");
hkjung 14:3ecd0c9dfa6b 87 break;
hkjung 14:3ecd0c9dfa6b 88
hkjung 14:3ecd0c9dfa6b 89 case FLAG_LED_OFF:
hkjung 14:3ecd0c9dfa6b 90 myled = LED_OFF;
hkjung 14:3ecd0c9dfa6b 91 printf("WIZwiki: LED is turned off!\r\n");
hkjung 14:3ecd0c9dfa6b 92 break;
hkjung 14:3ecd0c9dfa6b 93
hkjung 14:3ecd0c9dfa6b 94 case FLAG_INVALID_CMD:
hkjung 14:3ecd0c9dfa6b 95 default:
hkjung 14:3ecd0c9dfa6b 96 printf("WIZwiki: Invalid command\r\n");
hkjung 14:3ecd0c9dfa6b 97 break;
hkjung 14:3ecd0c9dfa6b 98 }
hkjung 14:3ecd0c9dfa6b 99
hkjung 14:3ecd0c9dfa6b 100 // Reverse the message
hjjeon 11:0da8667a9201 101 char temp;
hjjeon 11:0da8667a9201 102 for(int f = 0, l = n-1; f<l; f++,l--){
hjjeon 11:0da8667a9201 103 temp = buffer[f];
hjjeon 11:0da8667a9201 104 buffer[f] = buffer[l];
hjjeon 11:0da8667a9201 105 buffer[l] = temp;
hkjung 14:3ecd0c9dfa6b 106 }
hjjeon 11:0da8667a9201 107
hkjung 14:3ecd0c9dfa6b 108 // Print reversed message to terminal
hkjung 14:3ecd0c9dfa6b 109 printf("Sending reversed message to Client: '%s'\r\n", buffer);
hkjung 14:3ecd0c9dfa6b 110 printf("\r\n");
hjjeon 11:0da8667a9201 111
hjjeon 11:0da8667a9201 112 // Echo received message back to client
hjjeon 11:0da8667a9201 113 client.send_all(buffer, n);
hjjeon 11:0da8667a9201 114 if (n <= 0) break;
hjjeon 11:0da8667a9201 115 }
hjjeon 11:0da8667a9201 116
hjjeon 11:0da8667a9201 117 client.close();
hkjung 14:3ecd0c9dfa6b 118 }
hkjung 14:3ecd0c9dfa6b 119 }