Skip to content

Commit

Permalink
feature/ethernet: Enable support of the microROS over the ethernet in…
Browse files Browse the repository at this point in the history
…terface (micro-ROS#24)

* enet: added microros ethernet support inrastructurre

* network: enable support for microROS over ethernet in ESP32

Co-authored-by: Felipe Neves <[email protected]>
  • Loading branch information
uLipe and Felipe Neves authored Dec 16, 2020
1 parent 6731cc8 commit 97fc3fb
Show file tree
Hide file tree
Showing 7 changed files with 457 additions and 112 deletions.
4 changes: 3 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
idf_component_register(SRCS "")
idf_component_register(SRCS "network_interfaces/uros_ethernet_netif.c" "network_interfaces/uros_wlan_netif.c"
INCLUDE_DIRS "network_interfaces"
REQUIRES nvs_flash)

if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
set(submake "$(MAKE)")
Expand Down
159 changes: 159 additions & 0 deletions Kconfig.projbuild
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ config MICRO_ROS_AGENT_PORT
help
micro-ROS Agent port.

choice
prompt "micro-ROS network interface select"
config MICRO_ROS_ESP_NETIF_WLAN
bool "micro-ROS over network uses WLAN netif"
config MICRO_ROS_ESP_NETIF_ENET
bool "micro-ROS over network uses Ethernet netif"
endchoice

menu "UART Settings (for serial transport)"

config MICROROS_UART_TXD
Expand Down Expand Up @@ -50,6 +58,157 @@ config MICROROS_UART_CTS

endmenu

menu "Ethernet Configuration"
config MICRO_ROS_USE_SPI_ETHERNET
bool

choice MICRO_ROS_ETHERNET_TYPE
prompt "Ethernet Type"
default MICRO_ROS_USE_INTERNAL_ETHERNET if IDF_TARGET_ESP32
default MICRO_ROS_USE_W5500
help
Select which kind of Ethernet will be used in the example.

config MICRO_ROS_USE_INTERNAL_ETHERNET
depends on IDF_TARGET_ESP32
select ETH_USE_ESP32_EMAC
bool "Internal EMAC"
help
Select internal Ethernet MAC controller.

config MICRO_ROS_USE_DM9051
bool "DM9051 Module"
select MICRO_ROS_USE_SPI_ETHERNET
select ETH_USE_SPI_ETHERNET
select ETH_SPI_ETHERNET_DM9051
help
Select external SPI-Ethernet module (DM9051).

config MICRO_ROS_USE_W5500
bool "W5500 Module"
select MICRO_ROS_USE_SPI_ETHERNET
select ETH_USE_SPI_ETHERNET
select ETH_SPI_ETHERNET_W5500
help
Select external SPI-Ethernet module (W5500).
endchoice # MICRO_ROS_ETHERNET_TYPE

if MICRO_ROS_USE_INTERNAL_ETHERNET
choice MICRO_ROS_ETH_PHY_MODEL
prompt "Ethernet PHY Device"
default MICRO_ROS_ETH_PHY_IP101
help
Select the Ethernet PHY device to use in the example.

config MICRO_ROS_ETH_PHY_IP101
bool "IP101"
help
IP101 is a single port 10/100 MII/RMII/TP/Fiber Fast Ethernet Transceiver.
Goto http://www.icplus.com.tw/pp-IP101G.html for more information about it.

config MICRO_ROS_ETH_PHY_RTL8201
bool "RTL8201/SR8201"
help
RTL8201F/SR8201F is a single port 10/100Mb Ethernet Transceiver with auto MDIX.
Goto http://www.corechip-sz.com/productsview.asp?id=22 for more information about it.

config MICRO_ROS_ETH_PHY_LAN8720
bool "LAN8720"
help
LAN8720A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support.
Goto https://www.microchip.com/LAN8720A for more information about it.

config MICRO_ROS_ETH_PHY_DP83848
bool "DP83848"
help
DP83848 is a single port 10/100Mb/s Ethernet Physical Layer Transceiver.
Goto http://www.ti.com/product/DP83848J for more information about it.

config MICRO_ROS_ETH_PHY_KSZ8041
bool "KSZ8041"
help
The KSZ8041 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver.
Goto https://www.microchip.com/wwwproducts/en/KSZ8041 for more information about it.
endchoice # MICRO_ROS_ETH_PHY_MODEL

config MICRO_ROS_ETH_MDC_GPIO
int "SMI MDC GPIO number"
default 23
help
Set the GPIO number used by SMI MDC.

config MICRO_ROS_ETH_MDIO_GPIO
int "SMI MDIO GPIO number"
default 18
help
Set the GPIO number used by SMI MDIO.
endif # MICRO_ROS_USE_INTERNAL_ETHERNET

if MICRO_ROS_USE_SPI_ETHERNET
config MICRO_ROS_ETH_SPI_HOST
int "SPI Host Number"
range 0 2
default 1
help
Set the SPI host used to communicate with the SPI Ethernet Controller.

config MICRO_ROS_ETH_SPI_SCLK_GPIO
int "SPI SCLK GPIO number"
range 0 33
default 20
help
Set the GPIO number used by SPI SCLK.

config MICRO_ROS_ETH_SPI_MOSI_GPIO
int "SPI MOSI GPIO number"
range 0 33
default 19
help
Set the GPIO number used by SPI MOSI.

config MICRO_ROS_ETH_SPI_MISO_GPIO
int "SPI MISO GPIO number"
range 0 33
default 18
help
Set the GPIO number used by SPI MISO.

config MICRO_ROS_ETH_SPI_CS_GPIO
int "SPI CS GPIO number"
range 0 33
default 21
help
Set the GPIO number used by SPI CS.

config MICRO_ROS_ETH_SPI_CLOCK_MHZ
int "SPI clock speed (MHz)"
range 5 80
default 36
help
Set the clock speed (MHz) of SPI interface.

config MICRO_ROS_ETH_SPI_INT_GPIO
int "Interrupt GPIO number"
default 4
help
Set the GPIO number used by the SPI Ethernet module interrupt line.
endif # MICRO_ROS_USE_SPI_ETHERNET

config MICRO_ROS_ETH_PHY_RST_GPIO
int "PHY Reset GPIO number"
default 5
help
Set the GPIO number used to reset PHY chip.
Set to -1 to disable PHY chip hardware reset.

config MICRO_ROS_ETH_PHY_ADDR
int "PHY Address"
range 0 31
default 1
help
Set PHY address according your board schematic.
endmenu

menu "WiFi Configuration"

config ESP_WIFI_SSID
Expand Down
116 changes: 9 additions & 107 deletions examples/int32_publisher/main/main.c
Original file line number Diff line number Diff line change
@@ -1,125 +1,27 @@
#include <string.h>

#include "uxr/client/config.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include <driver/uart.h>
#include <driver/gpio.h>

#include <string.h>
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"

#include "lwip/err.h"
#include "lwip/sys.h"

void appMain(void *argument);

#define ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID
#define ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
#define ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY

static EventGroupHandle_t s_wifi_event_group;

#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1

static const char *TAG = "wifi station";
static int s_retry_num = 0;

static void event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
if (s_retry_num < ESP_MAXIMUM_RETRY) {
esp_wifi_connect();
s_retry_num++;
ESP_LOGI(TAG, "retry to connect to the AP");
} else {
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
}
ESP_LOGI(TAG,"connect to the AP fail");
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
}
}

void wifi_init_sta()
{
s_wifi_event_group = xEventGroupCreate();

ESP_ERROR_CHECK(esp_netif_init());

ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();

wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));

ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));

wifi_config_t wifi_config = {
.sta = {
.ssid = ESP_WIFI_SSID,
.password = ESP_WIFI_PASS
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );
ESP_ERROR_CHECK(esp_wifi_start() );

ESP_LOGI(TAG, "wifi_init_sta finished.");

/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
#include <driver/uart.h>
#include <driver/gpio.h>

/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
* happened. */
if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s", ESP_WIFI_SSID);
} else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s", ESP_WIFI_SSID);
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
#include <uros_network_interfaces.h>

ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler));
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler));
vEventGroupDelete(s_wifi_event_group);
}
extern void appMain(void *argument);

void app_main(void)
{
// Start networkign if required
#ifdef UCLIENT_PROFILE_UDP
//Initialize NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);

ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta();
// Start the networking if required
ESP_ERROR_CHECK(uros_network_interface_initialize());
#endif // UCLIENT_PROFILE_UDP

// start microROS task
//start microROS task
xTaskCreate(appMain, "uros_task", CONFIG_MICRO_ROS_APP_STACK, NULL, 5, NULL);
}
8 changes: 4 additions & 4 deletions examples/int32_publisher/main/rclc_int32_publisher.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ void appMain(void * arg)
rmw_init_options_t* rmw_options = rcl_init_options_get_rmw_init_options(&init_options);

// Static Agent IP and port can be used instead of autodisvery.
// RCCHECK(rmw_uros_options_set_udp_address(CONFIG_MICRO_ROS_AGENT_IP, CONFIG_MICRO_ROS_AGENT_PORT, rmw_options));
RCCHECK(rmw_uros_discover_agent(rmw_options));
RCCHECK(rmw_uros_options_set_udp_address(CONFIG_MICRO_ROS_AGENT_IP, CONFIG_MICRO_ROS_AGENT_PORT, rmw_options));
//RCCHECK(rmw_uros_discover_agent(rmw_options));

// create init_options
RCCHECK(rclc_support_init_with_options(&support, 0, NULL, &init_options, &allocator));
Expand Down Expand Up @@ -77,8 +77,8 @@ void appMain(void * arg)
}

// free resources
RCCHECK(rcl_publisher_fini(&publisher, &node))
RCCHECK(rcl_node_fini(&node))
RCCHECK(rcl_publisher_fini(&publisher, &node));
RCCHECK(rcl_node_fini(&node));

vTaskDelete(NULL);
}
Loading

0 comments on commit 97fc3fb

Please sign in to comment.