Hezhou Air105 Entwicklungsboard

Das Air105-Entwicklungsboard wurde auf der Grundlage der Air105-MCU (von Shanghai Hezhou Communication Technology Co., Ltd.) im Januar 2022 entwickelt, das in etwa dieselben Ausmaße wie ein Arduino Nano RP2040 Connect besitzt und laut Hersteller UART, GPIO, SPI, I2C, PWM, ADC und andere Schnittstellen unterstützen soll, die je nach Bedarf ausgewählt werden können.

Hezhou Air105-Board

Hardware/Aufbau

Hardware-Komponenten des Air105
Abb.: Hardware-Komponenten des Air105. Eine Besonderheit des Board ist der DIP-Schalter für die Wahl zwischen serieller Schnittstelle oder USB.

Es gibt einen zusätzlichen 21-Pin FPC-Anschluss für eine 0,3MP-Kamera mit GC032A-Sensor, die im Lieferumfang des Boards meistens schon enthalten ist. (Produkt-ID: WSM-032A-RD63F-C83E)

Kamera GC032A für Hezhou Air105-Board
Abb.: Kamera GC032A für das Air105-Board

Interne LEDs

Das Air105-Board besitzt drei LEDs onboard.

Anschlüsse für die internen LEDs des Air105
LED-Nr. GPIO Funktion Beschreibung
D3 PD14 GPIO62 active HIGH
D4 PD15 GPIO63 active HIGH
D5 PC3 GPIO35 active HIGH

Zentrale Spezifikationen des MCU Air105

Flash-Speicher 4 MB
RAM-Speicher 640 kB
Kernel Cortex-M4F (max. 204MHz Taktfrequenz)
UART 4(3)×
GPIO 56×
I²C
SPI 1× HighSpeed mit bis zu 96MHz und
3× LowSpeed mit bis zu 24MHz
ADC
DAC
RTC
PWM
Hardware timer 8(6)×
Kamera-Schnittstelle
Empfohlene Auflösung 320×240 Pixel
Programmierschnittstelle USB-C

Weitere Features laut Hersteller

Anschlüsse

Hinweis: Alle GPIOs werden standardmäßig nach dem RESET des Boards auf einem internen Pull-Up-Widerstand mit 51kΩ gezogen.

Farb-Legende

  Spannungsversorgung
  Ground
  GPIO
  I²C
  SPI
  Spezial-Pin
  ADC
  PWM
Anschlüsse des Air105 Entwicklungsboards (1/3)
Anschlüsse des Air105 Entwicklungsboards (2/3)
Anschlüsse des Air105 Entwicklungsboards (3/3)
Pin Name Typ Funktionen Pull-up/down Bemerkungen
1 PC4 I/O GPIO36/ADC5 UP/DOWN
2 PC5 I/O GPIO37/ADC6 UP/DOWN
3 GND GND Ground
4 VBUS P 5V-Spannungsversorgung
(mit USB verbunden)
5 PA10 I/O GPIO10 UP/DOWN
6 PC7 I/O GPIO39/PWM5 UP/DOWN
7 PE7 I/O GPIO71/I2C_SDA UP/DOWN
8 PE6 I/O GPIO70/I2C_SCL UP/DOWN
9 +3,3V P Ausgang: 3,3V Spannung
10 GND GND Ground
11 PE9 I/O GPIO73/U3_TX UP/DOWN
12 PC14 I/O GPIO46/HSPI_CSN UP/DOWN SPI (HighSpeed)
13 PE8 I/O GPIO72/U3_RX UP/DOWN
14 PC12 I/O GPIO44/HSPI_MISO UP/DOWN SPI (HighSpeed)
15 PC13 I/O GPIO29/HSPI_MOSI UP/DOWN SPI (HighSpeed)
16 PC15 I/O GPIO47/HSPI_CLK UP/DOWN SPI (HighSpeed)
17 +3,3V P Ausgang: 3,3V Spannung
18 GND GND Ground
19 PD12 I/O GPIO60/U2_RX/KeyBoard0 UP/DOWN
20 PD13 I/O GPIO61/U2_TX/KeyBoard1 UP/DOWN
21 PA7 I/O GPIO7/SPI1_CSN UP/DOWN
22 PA6 I/O GPIO6/SPI1_CLK UP/DOWN
23 VBUS P 5V-Spannungsversorgung
(mit USB verbunden)
24 PWB (nicht benutzt)
25 GND GND Ground
26 +3,3V P Ausgang: 3,3V Spannung
27 REST Chip reset
28 PE10 I/O GPIO74 UP/DOWN
29 PB4 I/O GPIO20/SPI2_MOSI UP/DOWN
30 PA0 I/O GPIO0/UART0_RX UP/DOWN (für Programmierung/Download)
31 PA1 I/O GPIO1/UART0_TX UP/DOWN (für Programmierung/Download)
32 GND GND Ground
33 PB3 I/O GPIO19/SPI2_CSN UP/DOWN
34 PB2 I/O GPIO18/SPI2_CLK UP/DOWN
35 PB5 I/O GPIO21/SPI2_MISO UP/DOWN
36 PC0 I/O GPIO32/U1_RX/ADC1 UP/DOWN
37 PC1 I/O GPIO33/U1_TX/ADC2/DAC UP/DOWN
38 GND GND Ground
39 PA9 I/O GPIO9/SPI1_MISO UP/DOWN
40 PA8 I/O GPIO8/SPI1_MOSI UP/DOWN
A PB0 I/O GPIO16/PWM0 UP/DOWN
B PA3 I/O GPIO3/PWM3 UP/DOWN
C PE11 I/O GPIO75 UP/DOWN
D PA2 I/O GPIO2/PWM2 UP/DOWN
E PC8 I/O GPIO40/PWM6 UP/DOWN
F PC6 I/O GPIO38/PWM4 UP/DOWN
G PB1 I/O GPIO17/PWM1 UP/DOWN
H PB13 I/O GPIO29/SPI0_CS UP/DOWN
I PC9 I/O GPIO41/PWM7 UP/DOWN
J PB12 I/O GPIO28/SPI0_CL UP/DOWN
K PB14 I/O GPIO30/SPI0_MO UP/DOWN
L PB15 I/O GPIO31/SPI0_MI UP/DOWN

Einrichtung und Programmierung

Das Board läuft mit dem LuatOS-SoC, einem real-time operating system (RTOS) mit einer Lua-Engine für IoT-Geräte, die recht niedrige Speicheranforderungen stellt (16kB RAM, 128kB Flash). Damit Programme/Lua-Scripte auf dem Board laufen können, muss zunächst das LuatOS über die serielle Schnittstelle (USB) geflasht werden:

Laden der Luatools

Zunächst wird die neueste Version von Luatools benötigt, die ca. 55MB Plattenplatz benötigt. Es wird vom Hersteller empfohlen, die Datei (hier: "Luatools_v2.exe") in einen separaten Ordner (hier: "./luatools") zu legen, bevor sie ausgeführt wird. Nun wird die Datei ausgeführt und es kommt gleich nach dem Start ein Hinweis auf Updates. Ich habe diese durchgeführt (kann einige Zeit dauern).

Luatools Update
Abb.: Luatools Update-Hinweis
Luatools Update
Abb.: Update der Luatools und des LuatOS Core

Nach dem Update sollte zunächste die Baudrate für die serielle Schnittstelle (zh: 通用串口波特率) auf 1500000 baud gesetzt werden (Air101/103 benutzen 921600 baud).

Luatools: Setzen der richtigen Baudrate
Abb.: Luatools: Setzen der richtigen Baudrate

Firmware flashen

Nun wird das Air105-Board per USB-C an den PC (Windows 10 wird empfohlen) angeschlossen. Nach kurzer Zeit sollte im Dropdown der Luatools der COM-Port des Boards erscheinen. Dann sollte die Option 通用串口打印 ausgewählt und der COM-Port selektiert werden:

Luatools: Auswahl des COM-Ports
Abb.: Luatools: Auswahl des COM-Ports

Nun lädt man sich die neueste Version der Firmware von offiziellen LuatOS-Repository herunter:
https://gitee.com/openLuat/LuatOS/releases (z.B. core_V0010.zip mit ca. 7MB). Hinweis: Bei dem vorherigen Update der Luatool sollte die neueste firmware ebenfalls mitgeladen werden, somit könnte man diesen Schritt auch einsparen.

Nun sucht man entweder im entpackten Paket der neueste Firmware oder im Ordner der Luatools nach einer Datei mit .soc-Endung. (hier: "LuatOS-SoC_V0010_AIR105" im Unterordner "resource\105_lua_lod\core_V0010")
In Luatools klickt man dann den Button "Download firmware" (zh: 下载固件).

Luatools: Download firmware
Abb.: Luatools: Download firmware

Nun wählt man die vorher gefundene .soc-Datei aus und klickt auf download (zh: 下载). Nun wird die Firmware auf das Board geladen (~30s).

Luatools: Firmware auswählen und flashen
Abb.: Firmware auswählen und flashen

(siehe auch die offizielle Anleitung in chinesisch: https://wiki.luatos.com/boardGuide/flash.html)

Programme/Scripte laden

Zur Demostration wird das folgende einfache HelloWorld-Script in Lua benutzt, welches in der Datei "main.lua" gespeichert wird.

-- LuaTools needs two pieces of information: PROJECT and VERSION
PROJECT = "helloworld"
VERSION = "1.0.0"

-- Require necessary library files (written in Lua).
-- Internal libraries not needed to require.
sys = require("sys")

log.info("main", "Hello, World!")

print(_VERSION)

sys.timerLoopStart(function()
	print("Hi, LuatOS")
end, 3000)


-- always ends with this:
sys.run()
-- Do not add any statement after sys.run()!

Nun öffnet man den Dialog "Manage & Debug" (zh: 项目管理测试):

Luatools: Script hochladen
Abb.: Luatools: Script hochladen

In der linken unteren Ecke des Dialog klick man auf "Create project" (zh: 创建项目) und gibt einen Projektnamen (hier "helloworld") ein. In der Liste auf der linken Seite sollte dieses Projekt nun erscheinen.
Nun wählt man als "Core-File" wieder die .soc-Datei aus und fügt das Lua-Script (main.lua) über den ersten Button hinzu:

Luatools: Script auswählen und hochladen
Abb.: Luatools: Script auswählen und hochladen

Nach dem Klicken auf den Button "Download only script" wird das Lua-Script auf das Board geladen und nach dem Schließen des Dialoges sollte in der seriellen Konsole folgende Ausgabe erscheinen:

Luatools: Ausgabe auf der seriellen Konsole
Abb.: Luatools: Ausgabe auf der seriellen Konsole

Demos

Interne LEDs ansteuern

Die drei internen LEDs in drei verschiedenen Farben sind an den Pins PD14, PD15 und PC3 erreichbar.
Basierend auf dem Demo-Script in "resource\105_lua_lod\core_V0010\demo\gpio\gpio" ist folgendes Blink-Script entstanden:

PROJECT = "rgbleds"
VERSION = "1.0.0"

_G.sys = require("sys")

-- enable watchdog to prevent programm from freezing
if wdt then
	-- Initialize watchdog set to 15s
	wdt.init(15000)
	-- Feed the watchdog every 10s
	sys.timerLoopStart(wdt.feed, 10000)
end

-- Assign GPIO pins for internal LEDs of different boards
function pinx()
	local rtos_bsp = rtos.bsp()
	rtos_bsp = rtos_bsp:lower()
	if rtos_bsp == "air101" then
		return pin.PB08, pin.PB09, pin.PB10
	elseif rtos_bsp == "air103" then
		return pin.PB26, pin.PB25, pin.PB24
	elseif rtos_bsp == "air105" then
		return pin.PD14, pin.PD15, pin.PC3
	else
		log.info("main", "Cannot define internal LED pins for unknown board.")
		return 0, 0, 0
	end
end

local P1,P2,P3 = pinx()

-- see API: https://wiki.luatos.com/api/gpio.html
local LEDA = gpio.setup(P1, 0, gpio.PULLUP)
local LEDB = gpio.setup(P2, 0, gpio.PULLUP)
local LEDC = gpio.setup(P3, 0, gpio.PULLUP)

sys.taskInit(function()
	local count = 0
	while 1 do
		sys.wait(100)
		LEDA(count % 3 == 0 and 1 or 0)
		LEDB(count % 3 == 1 and 1 or 0)
		LEDC(count % 3 == 2 and 1 or 0)
		count = count + 1
	end
end)

sys.run()

Nach den Hochladen des Script sollte folgendes Ergebnis sichtbar sein:

Video: Demo der drei internen LEDs des Air105-Boards (330 kB).

LED-Blink

Verwendete Bauteile

Als zweites Demo-Script wird der klassische Blink-Sketch programmiert, wie man ihn aus der Arduino-Umgebung kennt. Hier werden zunächst die drei internen LEDs deaktiviert und dann eine externe 5mm-LED am Pin PD13 angeschlossen.

PROJECT = "blink"
VERSION = "1.0.0"

_G.sys = require("sys")

-- turn off the internal LEDs
gpio.setup(pin.PD14, 0)
gpio.setup(pin.PD15, 0)
gpio.setup(pin.PC3, 0)

local PIN_LED = pin.PD13
gpio.setup(PIN_LED, 0)

sys.taskInit(function()
	local i = 0
	while 1 do
		sys.wait(500)

		if i % 2 == 0 then
			gpio.set(PIN_LED, gpio.LOW)
		else
			gpio.set(PIN_LED, gpio.HIGH)
		end

		i = i + 1
	end
end)

sys.run()
Video: Demo des Blink-Scripts auf dem Air105-Board (700 kB).

Weitere Demos folgen...

zurück