Sinovoipova Banana Pi serija je dobila još jednog interesantog člana. U rukama nam je mikrokontrolerska razvojna ploča sa najnovijim ESP32-S3 Espressif SoC-u baziranom na dva 240MHz Xtensa LX7 jezgra. Pločica nosi naziv BPI-Leaf-S3 i u formatu je Espressif-ovog ESP32-S3-DevKitC-1 pa sa njim deli i raspored pinova, te je time i zamena za tu pločicu u već započetim projektima. Na pločici je MCU sa 512 kB RAM-a i 2 MB pseudo-static RAM-a (PSRAM), a na to je dodato i 8MB eksternog S NOR FLASH-a.
ESP32-S3 SoC ima integrisani 2.4 GHz, 802.11 b/g/n Wi-Fi i Bluetooth 5 (LE Coded PHY – dugog dometa i brzinama prenosa do 2 Mbps). Od 45 programabilnih GPIO-a (SPI, I2S, I2C, PWM, RMT, ADC, UART, SD/MMC host, TWAITM) na pločici je izvučeno 36.
Tu su standardni RST i BOOT tasteri, kao i 1 Neopixel RGB LED na portu 48. Ono što izdvaja ovu pločicu je ugrađeni USB Type-C konektro, konektor za 3,7V litijumsku bateriju (punjenje do 500mA) i četvoropinski (GND, 3V3, SDA, SCL) I2C konektor za povezivanje sa eksternim hardverom.
Kao i svi Espressif ESP32 SoC može se programirati kroz Espressif-ov ESP-IDE baziran na Eclipse platformi i u tom slučaju imaćete potpunu kontrolu nad svakim delom sistema. Za razvoj zahtevnih i specifičnih aplikacija, ovo bi bio pravi izbor.
Ako dolazite iz STEAM okruženja i blisko vam je da radite u Adafruit CircuitPython-u, na pločici fabrički je postavljena verzija interpretera za CircuitPython.
Ono što će mejkersku zajednicu učiniti sretnom, je podrška za Arduino IDE ukoliko vam je C prirodniji jezik. A ako ste bliži Python-u onda će značiti impementirana podrška za MikroPython uz koga je preporuka rad u Thonny IDE-u, a ovu verziju interepretera možete preuzeti sa BPi gitHub-a.
Za potrebe upoznavanja i osnovnog rada sa ovim sistemom, uradili smo jedan jednostavan demo pisan u MikroPython-u. Na GPIO izlaze 1,2,3,4,5,6,7 i 8 povezali smo direktno po jedan segment osmosegmentnog LED displeja koji ima mogućnost prikaza cifara i tačke. Jednostavnim unosom stringa koji može sadržati cifre ili crticu moguće je sekvencijalni ispisivati cifre na displeju. Kod je elegantan i namenjen je pre svega pokaznoj/edukativnoj svrsi.
Krajni zaključak je da je BPi-Leaf-S3 veoma moćan i pouzdan sistem, sa veoma pristupačnom cenom, odlično podržan mnoštvom IDE opcija, baziran na sada već standardnoj ESP32 arhitekturi – što mu obezbeđuje i veliku bazu već urađenih primera.
from machine import Pin, PWM import time import sys #Pin list for digits pinList = [[1,2,3,4,6,7],[4,6],[1,3,4,5,7],[1,4,5,6,7],[2,4,5,6],[1,2,5,6,7],[1,2,3,5,6,7],[1,4,6],[1,2,3,4,5,6,7],[1,2,4,5,6,7]] ############# #Driver code# ############# #Pin setup for i in range (1,9): globals()[f"PWM_LED{i}"] = PWM(Pin(i)) #Global dictionary used for dynamic global variable generation globals()[f"PWM_LED{i}"].freq(1000) globals()[f"PWM_LED{i}"].duty(0) #Clear routine def clearDisplay(): for i in range (1,9): globals()[f"PWM_LED{i}"].duty(0) #Digit display - use when dimming effects or custom timings required def displayDigit(n, dot, dutyCycle): if n in range (0,10) and dot in range (0,2): #Check if arguments in range to prevent variable naming errors clearDisplay() #Clear display in case something was displayed before for i in pinList[n]: globals()[f"PWM_LED{i}"].duty(dutyCycle) if dot == 1: #Dot as argument PWM_LED8.duty(dutyCycle) elif str(n) == '-': #Stringify n for data integrity clearDisplay() PWM_LED5.duty(dutyCycle) else: #If not, safely handle error raise Exception("displayDigit error (could be caused by arguments out of bounds or program termination).") #Number display as a wrapper for displayDigit command def displayNumber(n, dot, dutyCycle, ms, pre_ms=50): #Optional pre_ms argument for predelay settings, automatically set to 50 try: #Try if int; exception catches for logic if string numList = [int(x) for x in str(n)] #Turns an integer into a list of its digits, e.g. 429 -> [4,2,9] except ValueError: #If argument is string, do whatever it needs to make above command accept this input numList = [] for x in n: try: numList.append(int(x)) except ValueError: numList.append(x) for i in numList: #Iterate through list and pass i as argument into the displayDigit command try: #No argument check in wrapper command as subcommand performs these, try method required to pass exception along clearDisplay() time.sleep_ms(pre_ms) displayDigit(i, dot, dutyCycle) time.sleep_ms(ms) except: raise Exception("displayNumber error (could be caused by arguments out of bounds or program termination).") ########### #Main code# ########### while True: displayNumber("17-12-1973",0,1023,750)