Ahogy azt már korábban hangoztattam, a Maple Mini egy ígéretes kis lapka, de szűkös 128kB tárterületével nem vagyok teljesen kibékülve... lássuk hát az STM32 F103 családjának következő tagját: a hangzatos nevű STM32F103RCT6-ot, ami már 256kB tárterülettel bír. (az adatlapja szerint, a valóságban egyébként - feltehetőleg gyártástechnológiai okokból - 512kB-al szállítják, mint nagyobb testvérét a RET6-ot - erről a lentebb írt stm32flash alkalmazás segítségével győződhetünk meg biztosan)
Az Aliexpressen 6,7 dollár körüli áron lehet megvásárolni STM32F103RCT6 Development Board néven.
A közösség "Generic Board" néven, néha "Blue Button" művésznéven hivatkozik a lapkára, mely egy 72Mhz-es, 48kB memóriával és 256kB tárhellyel bíró erőművet rejt, 51 GPIO tűvel.
A nagydarab sárga csatlakozó azok számára lehet érdekes, akik rendelkeznek JTAG programozóval, de akinek nincs (ahogy nekem sincs) azok is könnyen tölthetik fel programjukat a rövidebb (a kék gomb mellett levő) sárga tűsoron keresztül egy egyszerű CP2102 UART-USB illesztő segítségével. A miniUSB csatlakozó is használható lenne, de a korábbi MapleMini-től eltérően ezt a modellt "üresen" szállítják, vagyis bootloader sincs rajta, azt saját magunknak kell feltennünk előbb soros programozóval, majd ez után már használhatjuk direkt módon a miniUSB-t is feltöltésre az Arduino IDE-n keresztül.
Érkezésekor a 2 db 2x15-ös tűsor nincs beforrasztva, ránk bízzák, melyik irányban akarjuk ezt saját kezünkkel beforrasztani. Az alján levő foglalatba 3V-os CR1220 elem illeszthető, de e nélkül is működik az egység.
A miniUSB mellett a fenti képen balra fent található tüskék segítségével lehet programozni, a kék gomb megnyomása kapcsolja be az eszközt. A miniUSB-től jobbra levő két DIP kapcsoló segítségével lehet váltani az indítási módok közül.
A lábak megnevezése az alábbi:

Bár az egész MCU 3.3V-os jelszintekkel dolgozik, a lábak egy része toleráns az 5V bemenetekkel szemben, vagyis köthetünk rá ilyeneket, az alábbi táblázatban jelölve vannak, melyek ezek.
Láb megnevezés | GPIO láb sorszám (RC Core) | 5V toleráns bemenet | Analóg bemenet | PWM kimenet | Említésre érdemes alternatív funkció |
A0 | 0 | x | x | ||
A1 | 1 | x | x | ||
A2 | 2 | x | x | UART2 TX | |
A3 | 3 | x | x | UART2 RX | |
A4 | 4 | x | SPI1 NSS | ||
A5 | 5 | x | SPI1 SCK | ||
A6 | 6 | x | x | SPI1 MISO | |
A7 | 7 | x | x | SPI1 MOSI | |
A8 | 8 | x | x | ||
A9 | 9 | x | x | UART1 TX | |
A10 | 10 | x | x | UART1 RX | |
A11 | 11 | x | USB DM | ||
A12 | 12 | x | USB DP | ||
A13 | 13 | x | JTMS-SWDIO | ||
A14 | 14 | x | JTCK-SWCLK | ||
A15 | 15 | x | JTDI/SPI3 NSS | ||
B0 | 16 | x | x | ||
B1 | 17 | x | x | ||
B2 | 18 | x | BOOT1 | ||
B3 | 19 | x | JTDO/SPI3 SCK | ||
B4 | 20 | x | NJTRST/SPI3 MISO | ||
B5 | 21 | ||||
B6 | 22 | x | x | I2C1 SCL | |
B7 | 23 | x | x | I2C1 SDA | |
B8 | 24 | x | x | ||
B9 | 25 | x | x | ||
B10 | 26 | x | I2C2 SCL/UART3 TX | ||
B11 | 27 | x | I2C2 SDA/UART3 RX/Green LED | ||
B12 | 28 | x | SPI2 NSS | ||
B13 | 29 | x | SPI2 SCK | ||
B14 | 30 | x | SPI2 MISO | ||
B15 | 31 | x | SPI2 MOSI | ||
C0 | 32 | x | |||
C1 | 33 | x | |||
C2 | 34 | x | |||
C3 | 35 | x | |||
C4 | 36 | x | |||
C5 | 37 | x | |||
C6 | 38 | x | x | ||
C7 | 39 | x | x | ||
C8 | 40 | x | x | ||
C9 | 41 | x | |||
C10 | 42 | x | |||
C11 | 43 | x | |||
C12 | 44 | x | |||
C13 | 45 | TAMPER RTC | |||
C14 | 46 | OSC32 IN | |||
C15 | 47 | OSC32 OUT | |||
D0 | 48 | x | OSC_IN/CAN_RX | ||
D1 | 49 | x | OSC_OUT/CAN_TX | ||
D2 | 50 | x | |||
Láb megnevezés | GPIO láb sorszám (RC Core) | 5V toleráns bemenet | Analóg bemenet | PWM kimenet | Említésre érdemes alternatív funkció |
Amint látható több lába (16 db) is alkalmas analóg bemenetek fogadására, ez jóval több, mint az ESP8266-on található 1 db analóg A0. Így analóg I2C illesztőre STM32 projektnél nemigen lesz szükségünk. Ugyanígy kétlem, hogy ennyi rendelkezésre álló szabad láb mellett szükség lenne IO portbővítőre... (részletes összehasonlító táblázat az ArduinoEasy-ről szóló cikkben)
A rendelkezésre álló flash tárterület lehetővé teszi a (jelenlegi) komplett ArduinoEasy feltöltését, teljes MQTT támogatással. A LAN-on keresztüli eléréshez természetesen továbbra is szükség van egy W5500 LAN modulra!
A program lefordítása és feltöltése
A fordításhoz és feltöltéshez az Arduino IDE-re lesz szükség, egyúttal az STM32-höz szükséges könyvtárakat is fel kell telepítenünk. Több, egymástól eltérő Arduino hardvertámogató-réteg (Core) is létezik STM32-höz, de jelenleg ez az egyetlen, ami támogatja az RCT6/RET6 típusokat:
- az eredeti "régi", ami kiforrottabb, viszont nem nagyon frissül mostanában az a Roger Clark féle:
https://github.com/rogerclarkmelbourne/arduino_stm32
Előre bocsájtom, hogy nem használok Windowst, és bár az alábbiakhoz hasonlóan meg lehet oldani azon is, minden alábbi lépés Ubuntu Linux alatt tesztelve.
- Töltsük le innen az Arduino IDE-t a gépünkre, csomagoljuk ki:
https://www.arduino.cc/en/Main/Software - Indítsuk el az Arduino IDE-t
- Az Eszközök->Alaplap->Alaplap-kezelőben válasszuk ki és telepítsük az "Arduino SAM boards (Cortex-M3)" nevű alaplapot
- Töltsük le a https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip címről az STM32 alaplapot
- Tömörítsük ki a letöltött ZIP állományt a ~/Arduino/hardware/Arduino_STM32 mappába (hozzuk létre, ha nincs hardware mappa itt)
- Futtassuk root joggal vagy sudo-val az ebben található tools/linux64/install.sh parancsfájlt, ami beállítja az udev szabályokat (ha esetleg nem futtatható az állomány, akkor a chmod a+x install.sh segít ezen, sőt ha már itt vagyunk a tools/linux és a tools/linux64 mappában levő fájlok többségének érdemes futtatható jogot beállítani)
- Az Arduino IDE újraindítását követően már látni fogja ezt az új alaplapot is, az Eszközök->Alaplap alatt: (STM32 F103R series)
- A Variant almenüben kiválaszthatjuk a típust ezen belül, ami STM32F103RC ha 256kB flash-el szereltet kaptunk, ha viszont hozzám hasonlóan 512kB flash-el szerelttel rendelkezünk, akkor bátran válasszuk az STM32F103RE típust:
Miután sikerült az Arduino IDE-t és az STM32 Core fájlokat letöltenünk, lépjünk be egy szimpatikus könyvtárba, és töltsük le a patchelt ArduinoEasy forrását git-el:
git clone https://github.com/enesbcs/ArduinoEasy.git
vagy szimplán töltsük le ZIP-ként:
wget https://github.com/enesbcs/ArduinoEasy/archive/master.zip
és tömörítsük ki.
A parancs nyomán létrejött ArduinoEasy mappán belül található lib mappából a Base64-et másoljuk át kompletten a ~/Arduino/libraries/ alá, hogy az Arduino IDE megtalálja fordításkor, kivéve ha nem akarjuk használni a Domoticz HTTP protokoll jelszóval hitelesítő részét, mert akkor nemes egyszerűséggel inkább módosítsuk az "ArduinoEasy-Globals.h" állomány tartalmát, és az ott levő #define FEATURE_BASE64 után levő true feltételt írjuk át false -ra, és ekkor nem fogja keresni a Base64 könyvtárat. (de erről még lesz pár szó egy bekezdés múlva)
Az Arduino IDE-nek van egy - számomra - érdekes tulajdonsága, miszerint olyan nevű mappában kell lennie a (fő) .INO fájlnak, mint maga a fájlnév. Mi a teendő? Az ArduinoEasy-n belül található src mappa tartalmát átmásoljuk pl az ~/Arduino/projects alá, hogy kéznél legyen, és ilyen formában a ~/Arduino/projects/ArduinoEasy mappa alá kerül közvetlenül minden .ino állomány, az ArduinoEasy.ino is, amit most már meg tudunk nyitni az Arduino IDE-n belül, és elvileg nem fog sopánkodni...
(Nyilván mindenki rájött eddigre, aki nem tudta volna, hogy az INO kiterjesztésű fájlok tartalmazzák az Arduino számára lefordítható C forráskódot, mellette a .h fájlokban láthatóak pedig a definíciók)
FORDÍTÁS ÉS KÖZVETLEN ELŐKÉSZÜLETEI
Ha sikerült megnyitnunk a fentiek után az ArduinoEasy.ino -t, akkor keressük ki a fülek közül az Arduino-Globals.h-t:

A #define soroknak ugyebár két főbb fajtája van, az egyik esetben az a lényeg, hogy egy adott változó definiálva van-e vagy nincs, ebben az esetben úgy állíthatjuk a beállítást, hogy két darab per jelet írva elé kikommenteljük // ez esetben ez a feltétel megszűnik létezni, vagy töröljük a komment jeleket, és a fordító figyelembe veszi, hogy ezt a definíciót szeretnénk használni.
A másik fajtája, ami után van egy logikai/szám/szöveges érték, amit a fordító kiértékel fordítás soron, és attól függően illeszt be bizonyos kódrészeket.
Jelen esetben majdnem minden DEFINE értéke true lehet az első szekcióban, kivéve a FEATURE_SD-t, ha nem használunk SD kártyát, én pl nem használok. Az alatta következő #define USES_* sorok előtt sem kell kommentet hagynunk. (kivéve ha tényleg nincs és nem is lesz szükségünk soha az adott pluginra, vagy nem tudjuk a fordításához szükséges library-kat telepíteni)
Amint látható, minden funkcióval fordítva (Vázlat menü-> Ellenőriz/Fordít) a program (sketch) teljes mérete 187316 bájt, ha nem bántjuk az alapértelmezett TASKS_MAX beállítást, akkor ilyen mérethez már 16 (Ez az ESPEasy esetében 12!) eszközt enged majd felvenni, ami 12kByte helyet foglal a flash tárhely végén. Vagyis mint látható, a 256kB flashen kényelmesen elfér, a jelenleg rendelkezésre álló 512k pedig egyenesen sok.
FELTÖLTÉS
Beszéljünk akkor a konkrét feltöltésről. Ahogy már említettem, egyszer a bootloader feltöltését is meg kell ejtenünk, ami nagyon hasonlóan megy, mint a MapleMini-nél leírt módszer.
A megoldás egy külső soros-USB csatoló, például a már ESP8266-oknál sikerrel használt CP2102 is lehet, amit az alábbi módon kell a fejlesztői lapra kötni:

Mit is látunk?
Az RX-TX lábak keresztbekötésén túl a tápellátást kell bekötnünk, valamint a BOOT0-át HIGH, a BOOT1-et pedig LOW állapotba kell állítani a rendelkezésre álló DIP kapcsolók segítségével, ezzel jelezve, hogy most soros programfeltöltő módba léptünk.
CP2102 | RCT6 |
RXD | TX |
TXD | RX |
GND | GND |
3V3 | 3V3 |
Ha az STM32 Core-t a fentebb írt helyre csomagoltuk ki, akkor az alábbi mappában megtalálhatjuk az st32flash alkalmazást, aminek segítségével a soros feltöltés elvégezhető:
~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$
A fenti bekötés után a Linuxos PC USB-jére történő csatlakoztatását követően az alábbihoz hasonlót kell látnunk a dmesg | tail parancsra:
usbserial: USB Serial support registered for cp210x
cp210x 2-1.5:1.0: cp210x converter detected
usb 2-1.5: cp210x converter now attached to ttyUSB0
Ami azt jelenti, hogy a /dev/ttyUSB0 címen tudunk kommunikálni az eszközzel, az alábbi paranccsal lekérhetjük a Maple paramétereit:
./stm32flash /dev/ttyUSB0
Ha a bekötés helyes volt, a válasznak ilyesminek kell lennie:
stm32flash Arduino_STM32_0.9
http://github.com/rogerclarkmelbourne/arduino_stm32
Interface serial_posix: 57600 8E1
Version : 0x21
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0414 (High-density)
- RAM : 64KiB (512b reserved by bootloader)
- Flash : 512KiB (sector size: 2x2048)
- Option RAM : 16b
- System RAM : 2KiB
Ebből két fontos dolgot tudtunk meg: 1-helyesen végeztük el a bekötést, 2-az eszközön 512KiB flash tárhely áll rendelkezésre (Juhé!). Ha nem kaptunk választ, nyomozhatjuk az okát, ha igen, akkor folytassuk, töltsük le a bootloader2.0-át:
wget -c https://github.com/rogerclarkmelbourne/STM32duino-bootloader/blob/master/bootloader_only_binaries/generic_boot20_pc13.bin?raw=true -O generic_boot20_pc13.bin
Ha letöltöttük és meggyőződtünk róla, hogy nem egy HTML oldalt vagy hibaüzenetet sikerült letöltenünk, hanem egy 7160 bájt méretű bináris állományt, akkor azt az alábbi paranccsal tölthetjük fel:
./stm32flash /dev/ttyUSB0 -w generic_boot20_pc13.bin
És ezzel sikerült bootloader2.0-val ellátnunk RCT6 lapunkat. Ezt az eljárást pontosan egyszer kell elvégeznünk, a továbbiakban az alábbiak szerint USB kábelen direktben tudunk majd programkódot feltölteni! (a továbbiakban az USB-soros átalakítóra nincs szükség, leköthetjük és eltehetjük) NE felejtsük el a BOOT0 kapcsolót visszaállítani LOW állapotba, különben nem lesz felismerhető USB-n keresztül!
A dmesg | tail parancs ezt mutatja, ha sikerrel jártunk:
[ 6746.454682] usb 2-1.5: New USB device found, idVendor=1eaf, idProduct=0003
[ 6746.454686] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6746.454689] usb 2-1.5: Product: Maple 003
[ 6746.454691] usb 2-1.5: Manufacturer: LeafLabs
[ 6746.454693] usb 2-1.5: SerialNumber: LLM 003
Ez után Teljes flash tárhely mínusz 8KB helyet használhatunk USB csatlakozáson keresztül történő feltöltéssel DFU-UTIL vagy az Arduino IDE-vel, kiválasztjuk a megfelelő Bootloader version-t, majd a Port-nál a Maple Mini-t: (ne essünk kétségbe, ha az első feltöltéskor esetleg nem jelenne meg a port, próbáljuk meg kiválasztás nélkül először a feltöltést ilyenkor)

Majd a Feltöltés gombra kattintva (jobbra mutató nyíl) az Arduino IDE megkísérli a kiválasztott portra a lefordított binárist átküldeni:

Ilyenkor általában újrafordít mindent, és ha közben a lapka nem válaszolna sokáig, nyomjuk meg a rajta levő RESET gombot, ekkor elkezd villogni, és a fentihez hasonló üzenetek mellett az Arduino feltölti rá a kódot. Ha elsőre nem megy, ne legyünk restek újrapróbálni, nem mindig sikerül nekem sem elsőre, jól kell időzíteni a Reset gomb megnyomását..
A soros csatlakozásra ugyebár már nem lesz szükség, ezért azt már régen lekötöttük, hiszen ezentúl USB-n keresztül tudjuk frissíteni a programot, a W5500 LAN modult pedig az alábbi bekötés szerint tudjuk illeszteni:

RCT6 | W5500 |
3.3V | 3.3V |
GND | GND |
RST | RST |
A4 | SCS |
A5 | SCLK |
A6 | MISO |
A7 | MOSI |
Ha mindent jól csináltunk, akkor a fenti kódfeltöltés és a LAN csatlakozás bekötése után az eszközünket elérhetjük a DEFAULT_IP részben megadott, alapértelmezetten 192.168.0.50 IP címen egy böngészőből.
Ennyit az alapokról, konkrét használatára példa a későbbiekben kerül fel a blogra.
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.
Hypervisor 2019.07.29. 16:53:41
pontosan miért álltál át az STM32 alapra az ESP8266 helyett? Elolvastam mindkét cikket de nem igazán értettem meg milyen előnye lehet a sok plusz IO porton kívül.
eNeS 2019.07.29. 17:28:15
eNeS 2019.07.29. 17:33:47
hajasarcu 2020.10.21. 22:32:54
eNeS 2020.10.23. 10:39:01
#define MQTT_MAX_PACKET_SIZE 1000
alapból ez 128, kérdés, hogy valóban ez-e a hiba, amit ki tudsz próbálni, ha küldesz egy 110 meg egy 130 karakteres mqtt üzenetet tesztre. A másik megoldás, hogy egyszerűen elfogy a rendelkezésre álló memória. 16 taszknál ez már nagyon könnyen előfordulhat.
hajasarcu 2020.10.23. 23:24:21
"Battery" : 255,
"RSSI" : 12,
"description" : "",
"dtype" : "General",
"hwid" : "9",
"id" : "api_transport",
"idx" : 58,
"name" : "Zigbee - Zigbee2MQTT API Transport",
"nvalue" : 0,
"stype" : "Text",
"svalue1" : "{\"type\": \"response\", \"requestId\": 13, \"isError\": false, \"payload\": {\"commit\": \"0cd4607\", \"coordinator\": {\"meta\": {\"maintrel\": 2, \"majorrel\": 2, \"minorrel\": 7, \"product\": 2, \"revision\": 20200327, \"transportrev\": 2}, \"type\": \"zStack30x\"}, \"log_level\": \"info\", \"network\": {\"channel\": 11, \"extendedPanID\": \"0x00124b00060fe517\", \"panID\": 6754}, \"permit_join\": false, \"version\": \"1.14.4\"}}",
"unit" : 255
}
Egy taszk használatával is kiakad , akkor marad a hekkelés vagy egy frissebb easy ?
eNeS 2020.10.24. 08:55:04
eNeS 2020.10.24. 09:17:23
hajasarcu 2020.10.25. 11:06:17
eNeS 2020.10.25. 17:54:45
Kommentezéshez lépj be, vagy regisztrálj! ‐ Belépés Facebookkal