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.
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)
Das Air105-Board besitzt drei LEDs onboard.
LED-Nr. | GPIO | Funktion | Beschreibung |
---|---|---|---|
D3 | PD14 | GPIO62 | active HIGH |
D4 | PD15 | GPIO63 | active HIGH |
D5 | PC3 | GPIO35 | active HIGH |
Flash-Speicher | 4 MB |
---|---|
RAM-Speicher | 640 kB |
Kernel | Cortex-M4F (max. 204MHz Taktfrequenz) |
UART | 4(3)× |
GPIO | 56× |
I²C | 1× |
SPI |
1× HighSpeed mit bis zu 96MHz und 3× LowSpeed mit bis zu 24MHz |
ADC | 5× |
DAC | 1× |
RTC | 1× |
PWM | 5× |
Hardware timer | 8(6)× |
Kamera-Schnittstelle | 1× |
Empfohlene Auflösung | 320×240 Pixel |
Programmierschnittstelle | USB-C |
Hinweis: Alle GPIOs werden standardmäßig nach dem RESET des Boards auf einem internen Pull-Up-Widerstand mit 51kΩ gezogen.
Spannungsversorgung | |
Ground | |
GPIO | |
I²C | |
SPI | |
Spezial-Pin | |
ADC | |
PWM |
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 |
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:
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).
Nach dem Update sollte zunächste die Baudrate für die serielle Schnittstelle (zh: 通用串口波特率) auf 1500000 baud gesetzt werden (Air101/103 benutzen 921600 baud).
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:
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: 下载固件).
Nun wählt man die vorher gefundene .soc-Datei aus und klickt auf download (zh: 下载). Nun wird die Firmware auf das Board geladen (~30s).
(siehe auch die offizielle Anleitung in chinesisch: https://wiki.luatos.com/boardGuide/flash.html)
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: 项目管理测试):
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:
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:
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:
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()
Weitere Demos folgen...
zurück