8000 Merge pull request #9955 from hierophect/esp-microros · cezer-io/circuitpython@e1a6d0b · GitHub
[go: up one dir, main page]

Skip to content

Commit e1a6d0b

Browse files
authored
Merge pull request adafruit#9955 from hierophect/esp-microros
MicroROS on Espressif
2 parents dae4962 + 71463fa commit e1a6d0b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1673
-9
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*.o
1010
*.a
1111
!atmel-samd/asf/**/*.a
12+
!ports/espressif/microros-lib/**/*.a
1213
*.elf
1314
*.bin
1415
!*.toml.bin

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,3 +412,6 @@
412412
[submodule "ports/analog/msdk"]
413413
path = ports/analog/msdk
414414
url = https://github.com/analogdevicesinc/msdk.git
415+
[submodule "ports/espressif/microros-lib"]
416+
path = ports/espressif/microros-lib
417+
url = https://github.com/hierophect/microros-lib.git

locale/circuitpython.pot

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,10 @@ msgstr ""
848848
msgid "Coordinate arrays types have different sizes"
849849
msgstr ""
850850

851+
#: ports/espressif/common-hal/rclcpy/Publisher.c
852+
msgid "Could not publish to ROS topic"
853+
msgstr ""
854+
851855
#: shared-bindings/_bleio/Adapter.c
852856
msgid "Could not set address"
853857
msgstr ""
@@ -860,6 +864,11 @@ msgstr ""
860864
msgid "Couldn't allocate decoder"
861865
msgstr ""
862866

867+
#: ports/espressif/common-hal/rclcpy/__init__.c
868+
#, c-format
869+
msgid "Critical ROS failure during soft reboot, reset required: %d"
870+
msgstr ""
871+
863872
#: ports/stm/common-hal/analogio/AnalogOut.c
864873
msgid "DAC Channel Init Error"
865874
msgstr ""
@@ -1287,6 +1296,10 @@ msgstr ""
12871296
msgid "Invalid MAC address"
12881297
msgstr ""
12891298

1299+
#: ports/espressif/common-hal/rclcpy/__init__.c
1300+
msgid "Invalid ROS domain ID"
1301+
msgstr ""
1302+
12901303
#: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c
12911304
msgid "Invalid argument"
12921305
msgstr ""
@@ -1841,6 +1854,10 @@ msgstr ""
18411854
msgid "Program too long"
18421855
msgstr ""
18431856

1857+
#: shared-bindings/rclcpy/Publisher.c
1858+
msgid "Publishers can only be created from a parent node"
1859+
msgstr ""
1860+
18441861
#: shared-bindings/digitalio/DigitalInOut.c
18451862
msgid "Pull not used when direction is output."
18461863
msgstr ""
@@ -1861,6 +1878,26 @@ msgstr ""
18611878
msgid "RNG Init Error"
18621879
msgstr ""
18631880

1881+
#: ports/espressif/common-hal/rclcpy/__init__.c
1882+
msgid "ROS failed to initialize. Is agent connected?"
1883+
msgstr ""
1884+
1885+
#: ports/espressif/common-hal/rclcpy/__init__.c
1886+
msgid "ROS internal setup failure"
1887+
msgstr ""
1888+
1889+
#: ports/espressif/common-hal/rclcpy/__init__.c
1890+
msgid "ROS memory allocator failure"
1891+
msgstr ""
1892+
1893+
#: ports/espressif/common-hal/rclcpy/Node.c
1894+
msgid "ROS node failed to initialize"
1895+
msgstr ""
1896+
1897+
#: ports/espressif/common-hal/rclcpy/Publisher.c
1898+
msgid "ROS topic failed to initialize"
1899+
msgstr ""
1900+
18641901
#: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c
18651902
#: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
18661903
msgid "RS485"

ports/espressif/Makefile

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,55 @@ CFLAGS += -isystem esp-camera/driver/include
440440
CFLAGS += -isystem esp-camera/conversions/include
441441
endif
442442

443+
ifneq ($(CIRCUITPY_RCLCPY),0)
444+
CFLAGS += -isystem microros-lib/include
445+
CFLAGS += -isystem microros-lib/include/rcl
446+
CFLAGS += -isystem microros-lib/include/statistics_msgs
447+
CFLAGS += -isystem microros-lib/include/composition_interfaces
448+
CFLAGS += -isystem microros-lib/include/example_interfaces
449+
CFLAGS += -isystem microros-lib/include/rmw_microxrcedds_c
450+
CFLAGS += -isystem microros-lib/include/test_msgs
451+
CFLAGS += -isystem microros-lib/include/std_msgs
452+
CFLAGS += -isystem microros-lib/include/rcutils
453+
CFLAGS += -isystem microros-lib/include/lifecycle_msgs
454+
CFLAGS += -isystem microros-lib/include/rosidl_typesupport_interface
455+
CFLAGS += -isystem microros-lib/include/service_msgs
456+
CFLAGS += -isystem microros-lib/include/visualization_msgs
457+
CFLAGS += -isystem microros-lib/include/rosidl_dynamic_typesupport
458+
CFLAGS += -isystem microros-lib/include/stereo_msgs
459+
CFLAGS += -isystem microros-lib/include/ucdr
460+
CFLAGS += -isystem microros-lib/include/rosidl_typesupport_c
461+
CFLAGS += -isystem microros-lib/include/std_srvs
462+
CFLAGS += -isystem microros-lib/include/rcl_lifecycle
463+
CFLAGS += -isystem microros-lib/include/action_msgs
464+
CFLAGS += -isystem microros-lib/include/micro_ros_utilities
465+
CFLAGS += -isystem microros-lib/include/rcl_action
466+
CFLAGS += -isystem microros-lib/include/rcl_logging_interface
467+
CFLAGS += -isystem microros-lib/include/type_description_interfaces
468+
CFLAGS += -isystem microros-lib/include/nav_msgs
469+
CFLAGS += -isystem microros-lib/include/actionlib_msgs
470+
CFLAGS += -isystem microros-lib/include/rmw
471+
CFLAGS += -isystem microros-lib/include/rclc_parameter
472+
CFLAGS += -isystem microros-lib/include/geometry_msgs
473+
CFLAGS += -isystem microros-lib/include/sensor_msgs
474+
CFLAGS += -isystem microros-lib/include/trajectory_msgs
475+
CFLAGS += -isystem microros-lib/include/shape_msgs
476+
CFLAGS += -isystem microros-lib/include/rosidl_runtime_c
477+
CFLAGS += -isystem microros-lib/include/rclc
478+
CFLAGS += -isystem microros-lib/include/rosgraph_msgs
479+
CFLAGS += -isystem microros-lib/include/rclc_lifecycle
480+
CFLAGS += -isystem microros-lib/include/rcl_interfaces
481+
CFLAGS += -isystem microros-lib/include/diagnostic_msgs
482+
CFLAGS += -isystem microros-lib/include/micro_ros_msgs
483+
CFLAGS += -isystem microros-lib/include/rosidl_typesupport_introspection_c
484+
CFLAGS += -isystem microros-lib/include/uxr
485+
CFLAGS += -isystem microros-lib/include/unique_identifier_msgs
486+
CFLAGS += -isystem microros-lib/include/rosidl_typesupport_microxrcedds_c
487+
CFLAGS += -isystem microros-lib/include/builtin_interfaces
488+
CFLAGS += -isystem microros-lib/include/tracetools
489+
CFLAGS += -isystem microros-lib/include/rmw_microros
490+
endif
491+
443492
ifneq ($(CIRCUITPY_ESPIDF),0)
444493
SRC_ESPIDF := \
445494
$(wildcard common-hal/espidf/*.c) \
@@ -685,6 +734,18 @@ ESP_IDF_COMPONENTS_EXPANDED += $(BUILD)/esp-idf/esp-idf/esp-camera/libesp-camera
685734
#$(error $(ESP_IDF_COMPONENTS_EXPANDED))
686735
endif
687736

737+
ifneq ($(CIRCUITPY_RCLCPY),0)
738+
ifeq ($(IDF_TARGET),esp32)
739+
BINARY_BLOBS += microros-lib/esp32/libmicroros.a
740+
else ifeq ($(IDF_TARGET),esp32s2)
741+
BINARY_BLOBS+= microros-lib/esp32s2/libmicroros.a
742+
else ifeq ($(IDF_TARGET),esp32s3)
743+
BINARY_BLOBS += microros-lib/esp32s3/libmicroros.a
744+
else
745+
$(error Unsupported Espressif target for Micro-ROS: $(IDF_TARGET).)
746+
endif
747+
endif
748+
688749
ifneq ($(VALID_BOARD),)
689750
# From esp-idf/components/bootloader/Kconfig.projbuild
690751
# BOOTLOADER_OFFSET is determined by chip type, based on the ROM bootloader, and is not changeable.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "supervisor/board.h"
8+
9+
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#pragma once
8+
9+
// Micropython setup
10+
#define MICROPY_HW_BOARD_NAME "ESP32-S3-DevKitC-1-N8R2 (ROS version)"
11+
#define MICROPY_HW_MCU_NAME "ESP32S3"
12+
13+
#define MICROPY_HW_NEOPIXEL (&pin_GPIO48)
14+
15+
#define DEFAULT_UART_BUS_RX (&pin_GPIO44)
16+
#define DEFAULT_UART_BUS_TX (&pin_GPIO43)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
USB_VID = 0x303A
2+
USB_PID = 0x7003
3+
USB_PRODUCT = "ESP32-S3-DevKitC-1-N8R2 CPY/ROS"
4+
USB_MANUFACTURER = "Espressif"
5+
6+
IDF_TARGET = esp32s3
7+
8+
CIRCUITPY_ESP_FLASH_SIZE = 8MB
9+
CIRCUITPY_ESP_FLASH_MODE = qio
10+
CIRCUITPY_ESP_FLASH_FREQ = 80m
11+
12+
CIRCUITPY_ESP_PSRAM_SIZE = 2MB
13+
CIRCUITPY_ESP_PSRAM_MODE = qio
14+
CIRCUITPY_ESP_PSRAM_FREQ = 80m
15+
16+
CIRCUITPY_RCLCPY = 1
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "shared-bindings/board/__init__.h"
8+
9+
static const mp_rom_map_elem_t board_module_globals_table[] = {
10+
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
11+
12+
{ MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) },
13+
{ MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) },
14+
{ MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) },
15+
{ MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) },
16+
{ MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) },
17+
{ MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) },
18+
{ MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) },
19+
{ MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) },
20+
{ MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) },
21+
{ MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) },
22+
{ MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) },
23+
{ MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11) },
24+
{ MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) },
25+
{ MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13) },
26+
{ MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) },
27+
{ MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) },
28+
{ MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16) },
29+
{ MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) },
30+
{ MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) },
31+
{ MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) },
32+
{ MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) },
33+
{ MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) },
34+
{ MP_ROM_QSTR(MP_QSTR_IO35), MP_ROM_PTR(&pin_GPIO35) },
35+
{ MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) },
36+
{ MP_ROM_QSTR(MP_QSTR_IO37), MP_ROM_PTR(&pin_GPIO37) },
37+
{ MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38) },
38+
{ MP_ROM_QSTR(MP_QSTR_IO39), MP_ROM_PTR(&pin_GPIO39) },
39+
{ MP_ROM_QSTR(MP_QSTR_IO40), MP_ROM_PTR(&pin_GPIO40) },
40+
{ MP_ROM_QSTR(MP_QSTR_IO41), MP_ROM_PTR(&pin_GPIO41) },
41+
{ MP_ROM_QSTR(MP_QSTR_IO42), MP_ROM_PTR(&pin_GPIO42) },
42+
{ MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43) },
43+
{ MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44) },
44+
{ MP_ROM_QSTR(MP_QSTR_IO45), MP_ROM_PTR(&pin_GPIO45) },
45+
{ MP_ROM_QSTR(MP_QSTR_IO46), MP_ROM_PTR(&pin_GPIO46) },
46+
{ MP_ROM_QSTR(MP_QSTR_IO47), MP_ROM_PTR(&pin_GPIO47) },
47+
{ MP_ROM_QSTR(MP_QSTR_IO48), MP_ROM_PTR(&pin_GPIO48) },
48+
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO48) },
49+
50+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) },
51+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) },
52+
53+
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
54+
};
55+
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#
2+
# Espressif IoT Development Framework Configuration
3+
#
4+
#
5+
# Component config
6+
#
7+
#
8+
# LWIP
9+
#
10+
# end of LWIP
11+
12+
# end of Component config
13+
14+
# end of Espressif IoT Development Framework Configuration
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "mpconfigboard.h"
8+
#include "supervisor/board.h"
9+
#include "supervisor/shared/serial.h"
10+
#include "shared-bindings/busio/SPI.h"
11+
#include "shared-bindings/fourwire/FourWire.h"
12+
#include "shared-bindings/microcontroller/Pin.h"
13+
#include "shared-module/displayio/__init__.h"
14+
#include "shared-module/displayio/mipi_constants.h"
15+
#include "shared-bindings/board/__init__.h"
16+
#include "py/runtime.h"
17+
#include "py/ringbuf.h"
18+
#include "shared/runtime/interrupt_char.h"
19+
20+
21+
#define DELAY 0x80
22+
23+
uint8_t display_init_sequence[] = {
24+
// SWRESET and Delay 140ms
25+
0x01, 0 | DELAY, 140,
26+
// SLPOUT and Delay 10ms
27+
0x11, 0 | DELAY, 10,
28+
// COLMOD 65k colors and 16 bit 5-6-5
29+
0x3A, 1, 0x55,
30+
// INVON Iiversion on
31+
0x21, 0,
32+
// NORON normal operation (full update)
33+
0x13, 0,
34+
// MADCTL columns RTL, page/column reverse order
35+
0x36, 1, 0x60,
36+
// RAMCTRL color word little endian
37+
0xB0, 2, 0x00, 0xF8,
38+
// DIPON display on
39+
0x29, 0,
40+
};
41+
42+
43+
// Overrides the weakly linked function from supervisor/shared/board.c
44+
void board_init(void) {
45+
busio_spi_obj_t *spi = common_hal_board_create_spi(0);
46+
fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus;
47+
bus->base.type = &fourwire_fourwire_type;
48+
49+
// see here for inspiration: https://github.com/m5stack/M5GFX/blob/33d7d3135e816a86a008fae8ab3757938cee95d2/src/M5GFX.cpp#L1350
50+
common_hal_fourwire_fourwire_construct(
51+
bus,
52+
spi,
53+
&pin_GPIO34, // DC
54+
&pin_GPIO37, // CS
55+
&pin_GPIO33, // RST
56+
40000000, // baudrate
57+
0, // polarity
58+
0 // phase
59+
);
60+
busdisplay_busdisplay_obj_t *display = &allocate_display()->display;
61+
display->base.type = & F41A ;busdisplay_busdisplay_type;
62+
63+
common_hal_busdisplay_busdisplay_construct(
64+
display,
65+
bus,
66+
240, // width (after rotation)
67+
135, // height (after rotation)
68+
40, // column start
69+
53, // row start
70+
0, // rotation
71+
16, // color depth
72+
false, // grayscale
73+
false, // pixels in a byte share a row. Only valid for depths < 8
74+
1, // bytes per cell. Only valid for depths < 8
75+
false, // reverse_pixels_in_byte. Only valid for depths < 8
76+
false, // reverse_pixels_in_word
77+
MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command
78+
MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command
79+
MIPI_COMMAND_WRITE_MEMORY_START, // write memory command
80+
display_init_sequence,
81+
sizeof(display_init_sequence),
82+
&pin_GPIO38, // backlight pin
83+
NO_BRIGHTNESS_COMMAND,
84+
1.0f, // brightness
85+
false, // single_byte_bounds
86+
false, // data_as_commands
87+
true, // auto_refresh
88+
60, // native_frames_per_second
89+
true, // backlight_on_high
90+
false, // SH1107_addressing
91+
350 // backlight pwm frequency
92+
);
93+
}
94+
95+
// TODO: Should we turn off the display when asleep, in board_deinit() ?

0 commit comments

Comments
 (0)
0