Arduino GIGA with Display Shield roadtest - exploring possibilities of GUI creation

View table of contents ...  

RoadTest: Seeking a Tech Enthusiast to Evaluate the Arduino GIGA Display Bundle

Author: JWx

Creation date:

Evaluation Type: Development Boards & Tools

Did you receive all parts the manufacturer stated would be included in the package?: True

What other parts do you consider comparable to this product?: STM32 Discovery kits including LCD displays (for example STM32H747I-DISCO) - when not counting Arduino IDE integration

What were the biggest problems encountered?: scarce external memory usage examples for third party libraries

Detailed Review:

Introduction: Arduino today vs. yesterday

Long gone are days where Arduino was manufacturing only simple boards housing low-power 8-bit Atmel MCUs, but for many people Arduino is still Arduino Uno with user interface like below: several lines of text and a few buttons - very sensible for a processor with a few kilobytes of RAM, incapable of holding a buffer even for small graphical display, but limiting for some more advanced user-cases.

1602 LCD shield

Another flagship product of them is Arduino IDE, where (by simply selecting different board) one can rebuild a code from, for example, 8-bit AVR clocked at several MHz to 32-bit dual core ARM.

This hardware abstraction works so great that Arduino have managed to extend 8-bit AVR based Arduino Uno family by Arduino Uno R4, using entirely different architecture (Arm Cortex M4) and achieved very good compatibility with both existing libraries and hardware modules (more information about it can be found - for example - in my roadtest of Arduino Uno R4 Minima). 

So - considering that modern Arduino boards are much more powerful than several years ago and can be connected to high resolution displays - would it be possible to create modern, touch-based GUI using Arduino IDE and not spending months learning new frameworks? Or would hardware abstraction - limiting ways of interacting with silicon to some predefined common interface - make it impossible? Given the possibility to roadtest an Arduino GIGA R1 with Display Shield bundle I have decided to find out...

Unboxing and hardware description

Unboxing

The hardware has arrived in Arduino branded cardboard box with two retail (with pretty graphical design outside) product boxes - one for Arduino and one for the shield - inside, but no additional filling.

{gallery}Unboxing

Outer box

Outer box

Outer box opening

Outer box contents

Inner boxes

Inner boxes

Arduino module was provided with plastic base and an antenna, but without any kind of ESD protecting bag, while LCD shield was protected by cardboard filling preventing the module from moving inside the box

{gallery}Unboxing - modules

Arduino board and accessories

Arduino board and accessories

LCD module packaging

LCD module packaging

LCD module in box

LCD module

All the components

All the components

Those two modules can be connected together, but in somewhat unusual way.

Giga with shield

When connecting, one should give caution that LCD shield connects from the BOTTOM of the GIGA board, which is handy because it leaves open access to the board's connectors but can be counterintuitive - boards are connected through via's in PCB, with connector on the opposite side. The same scheme is used with camera connector: camera module is installed on front side of Display shield, but it's connector is on the bottom side...

To prevent mistakes, removable indicators are installed over Display Shield connectors, but in my opinion they could be more attention-capturing (maybe with bright color or maybe an exclamation mark on the top).

Mistake prevention indicators

Hardware description

Ardunio Giga R1

Arduino Giga R1 belongs to the same product line as Arduino Mega 2560 and Arduino Due - with form factor being an upgrade to the Arduino Uno, with more pins but the same easy way of prototyping by connecting either a shield or a set of DuPont cables.

Hardware configuration includes:

  • dual core STM32H747XIH6 MCU, with 2MB of FLASH, 1MB RAM, one Cortex-M7 core clocked at 480MHz and one Cortex-M4 core clocked at 240MHz
  • Murata 1DX Wi-Fi/Bluetooth Module with external antenna connector
  • External 8MB SDRAM
  • External 16MB FLASH
  • Secure Element ATECC608A-MAHDA-T Module

Considering MCU type and the on-board hardware, Arduino Giga R1 is very similar to Arduino Portenta H7 - to the level that it even shares some builtin examples. The same can be said about support - some issues can be addressed using solutions prepared for Portenta board.

Arduino GIGA Display Shield

Display shield is a dedicated extension to Arduino GIGA R1 including 

  • 800x480, 16.7 million color 3.97" LCD display with capacitive touch sensor and edge backlight,
  • 6-axis IMU (accelerometer and gyroscope),
  • RGB LED,
  • digital microphone

Initial tests

Environment preparation

As Arduino Giga R1 board support packages are present in both 1.8 and 2.x versions of Arduino IDE, my first test (remembering issues with UNO R4 on an unsupported system) was trying to connect it to Arduino IDE 1.8 running on MS Windows 7.  

So far, so good - support package is present and can be installed without error:

WIN7_IDE1.8_support_package

but after connecting the board, serial port cannot be detected and OS complains about being unable to find a driver to a "Giga" device

WIN7_no_port

Much better results were achieved using Arduino IDE 2.3 and modern OS (MS Windows 11) - board was detected and two support packages were found: Arduino Mbed OS Giga Boards and Arduino Zephyr Boards (BETA)

{gallery}Arduino IDE2 board detect

Board detection

Board detected

Different packages

Two support packages

Default package install

Default package installation

Existence of two support packages can be explained by the fact that (according to the official website) Mbed OS would reach End Of Life in July 2026, staying open source but without maintenance nor support from the manufacturer (ARM), so an alternative solution is probably being prepared.

Mbed OS EOL

As Zephyr package is currently in Beta with limited library support, rest of the testing was conducted using Mbed package.

Two core blink

Arduino GIGA is based on two-core MCU: primary processor is Arm M7 and secondary is Arm M4. M7 core is always-active and M4 needs to be activated before use.

Arduino IDE allows for use of both cores for user code, abstracting them as two separate boards.

Internal FLASH memory can be divided between those two cores or a secondary core can be booted from the external SDRAM (after copying firmware there).

After deciding FLASH memory sharing strategy between cores:

Flash sharing between cores

 different sketches can be flashed to both of them:

Core selector

There is a possibility to identify the core on which the code is running, so dual-core blink demo blinking different color LED with core-specific frequency can be achieved using code as simple as below (which needs be flashed two times: once for each core):

#include <RPC.h>

unsigned int delay_time;
uint16_t led_pin;

void setup() {
  RPC.begin();
  if (RPC.cpu_id() == CM7_CPUID) {
    //set RED LED and 1 Hz blink frequency
    delay_time = 500;
    led_pin = LEDR;
  } else {
    //set blue LED and 0.5 Hz blink frequency 
    delay_time = 1000;
    led_pin = LEDB;
  }
}

void loop() {
  digitalWrite(led_pin, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(delay_time);            // wait for a second
  digitalWrite(led_pin, LOW);   // turn the LED off by making the voltage LOW
  delay(delay_time);            // wait for a second
}
 

Inter-core communication can be established using Remote Procedure Call (RPC) library, so even more complicated setups can be prepared, for example: one low latency process running on one core communicating with computation-intensive task running on the second core.

External RAM

Arduino GIGA R1 is equipped - like Portenta H7 - with 8MB of external RAM. It can be used for booting an M4 MCU core,  as additional area for dynamic memory allocation or as a static buffer for calculations or a farmebuffer.

It needs initialization before use and allocation/deallocation is using dedicated methods, but after that it can be accessed using standard pointers, so changes to the existing code can be limited.

Example code is as below:

#include "SDRAM.h:
/* leave first 2MB for static allocation */
SDRAM.begin(SDRAM_START_ADDRESS + 2 * 1024 * 1024);
unsigned char* = (unsigned char*)SDRAM.malloc(1024 * 1024);

Graphics manipulation

My goal in this roadtest was to try to use standard graphic libraries with support for different MCU families, which could be used in different projects when learned - even Arduino hardware is using MCUs from different vendors, so limiting oneself to, for example, dedicated ST software would be a problem when the next board would be using Renesas MCU. After review of libraries provided with Arduino IDE, two software stacks were selected for a test:

  • LVGL
  • Segger emWin

Both of them can be used with different MCU families of different vendors, LVGL being open-source and (commercial) emWin being provided by hardware providers free of charge when used with their silicon. 

Initial tests LVGL & emwin

Arduino GIGA libraries include sample sketches for Segger emWin and LVGL graphical libraries

LVGL demo 

Segger emWin demo

As can be seen, both libraries deliver widgets of similar aesthetics, with maybe emWin components being more polished.

As of usage potential, LVGL is a MIT licensed software, widely used and ported to different processor families.

In other way, Segger emWin is a proprietary product with wide hardware support, version of which was bought by ST and made available for use with their MCUs - and Arduino port based on this version can be downloaded using Arduino IDE. The library consists of precompiled binary (in this case shipped for Cortex-m7 architecture only), header files  and some configuration code. Being proprietary product, there is some small probability of licensing conflict with the rest of the code - but even in extreme cases it can be resolved by separating code to different cores of Arduino Giga  (one running the GUI and another running code with conflicting licensing).

Initial failures and diagnostics

Both demos compiled and ran correctly, but when more complicated widget (on-screen keyboard) was tried, both frameworks generated firmware fault conditions (black screen and red LED blinking in sequence: four slow blinks followed by four fast blinks), requiring double-reset recovery before next flashing.

After some research it turned out to be memory-related issue:

800x480 LCD requires between 375kB (for 8bpp color) and 1.5MB (for 32bpp) for full-screen buffer, doubling this value when double-buffering (technique involving using two buffers and making modifications in inactive one, then switching - which greatly reduces number of display artifacts). Considering that GIGA MCU has 1MB of  internal RAM, it is easy to encounter out of memory condition.

Fortunately, Arduino GIGA comes equipped with 8MB of external SDRAM, which - according to the documentation - can be used as a framebuffer, but it is not something out-of-the-box and needs additional configuration. 

For emWin library no working solution was found - when disabling double-buffering, static keyboard image was drawn before crash, and attempts to reallocate video memory to SDRAM have failed (producing either nothing or excessive graphical artifacts), but keyboard itself looks impressive:

emwin - keyboard 

For LVGL it turned out to be simple configuration issue - library is installed unconfigured and lv_conf.h needs to be created, including (for example) following lines:

#define LV_MEM_SIZE (2 * 1024 * 1024U) 
#define LV_MEM_ADR SDRAM_START_ADDRESS 

and trimming SDRAM size in main code to exclude part dedicated for video memory

SDRAM.begin(SDRAM_START_ADDRESS + 2 * 1024 * 1024);

resulting in an operational keyboard

on-screen keyboard screenshot

working like this

which paved way to explore more examples from official LVGL documentation, producing widgets like compass below (unfortunately Arduino Giga Display Shield builtin Inertial Measurement Unit doesn't include magnetometer, preventing us from having working compass out of the box):

Search for GUI design tool

At this stage another question arises - could there be a better way of prototyping a GUI than laboriously specifying placement of each widget in the code? Maybe some WYSIWYG (What You See Is What You Get) application allowing for graphical placement of widgets on the screen?

Segger has such a software - it is called AppWizard and is even probably possible to use free of charge with Arduino GIGA as it is STM32 MCU based. Unfortunately, to use it, emWin library runtime problems should be addressed first - but it looks very nice (demo project below)

Segger App wizard demo GUI screen

NXP has similar software for LVGL - it is called GUI Guider, but is licensed to use free of charge only with NXP products, so only a screenshot from the manufacturer's page can be presented:

NXP GUI Guider web page screenshot

another possibility is LVGL Editor from LVGL PRO package that has free license for "personal use, open-source projects and education" but it is XML editor, not WYSIWYG we are looking for

LVGL Editor screenshot 

Another one is LVGL Architect - an online tool, according to the forum posts, still under development. It allows for drag-and-drop GUI creation, but results are somewhat mixed. Below is a project of clock setting screen

LVGL Architect project

using project file as below:

clock_set.lvga.zip

that can be exported as a Arduino .ino project, but with initial results not very encouraging

initial results

it seems that a clock widget (not present in the LVGL but built as an use-case of scale widget with two indicators in one of the examples) is only placed as an placeholder label and the rollers of the desired size are too small to be displayed correctly. Additionally, most of the operation logic have to be added by hand.

Correcting size of rollers allowed for correct selection of time to be set:

bigger rollers

an integrating it with a clock from clock example code resulted in GUI like below:

Which proves that there is currently possibility to quickly create usable GUI, even without help of web designer.

3D support 

Next interesting feature of the module is 3D support which is provided by TinyGL library, with one of examples looking like below:

Summary

Arduino GIGA R1 with Display Shield is an interesting option for creating modern, touch based graphical interfaces, using Arduino IDE and standard libraries. There is currently somewhat limited documentation for using external RAM as an display memory but most of third-party code works and there are even available free graphical design tools for quick prototyping. 

The kit itself could make use of somewhat more packaging/filler material and the method of connecting modules could be better indicated on boards themselves (some people use manuals only in last resort) but it is overall very nice addition to the Arduino family, allowing for creation of more user-friendly appliances and toys.

Anonymous