9.0 TOTAL SCORE

banana pi leaf s3

Razvojni sistemi
Kvalitet izrade 9
Implementirana tehnologija 9
Ease-of-use 9
Odnos cena/performanse 9
PROS
  • Izvrsna kroskompatibilnost
  • I2C konektor
  • Baterijski konektor
CONS
  • Nema značajnih
Bottomline

Odličan razvojni sistem baziran na ESP32S3 SiC namenjen razvoju IoT aplikacija.

 

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.

BPI-Leaf-S3 pinout

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)

Aleksandar Dakić
Follow me