Skip to content

Repository files navigation

PikaPython

Cross platform ultra lightweight embedded Python engine

中文页 | Forum | Documents | Videos | BSP | Package Manager | RT-Thread package

1. Abstract

PikaPython is an ultra-lightweight Python engine with zero dependencies and zero-configuration, that can run with 4KB of RAM (such as STM32G030C8 and STM32F103C8).

PikaPython also known as PikaScript and PikaPy.

It's very easy to bind C function to python module with the help of Pika Pre-compiler.Only write the API of python in .pyi and the bindings are autoly generated by Pre-compiler.

The Pre-compiler is fully open-source, and the source code is in the tools folder.

image-20220520233540245

Get pikapython:

Use Online Project Generator

Generator url: http://pikascript.com

Note: You need the Community Edition license (Now Free) to build Keil projects, and the version of Keil should be newer than v5.36.

Use Pika package manager PikaPackage.exe

  1. Run the PikaPackage.exe directly, then the pikapython repo would be downloaded auto in the /tmp/pikascript folder of your current disc partition.

  2. Add requestment.txt to the same folder of PikaPackage.exe then run PikaPackage.exe. The run-time core, pre-compiler and moudles would be installed in the current folder.

  3. Released modules:packages.toml

Quick Start

You can use simulation project to quick start without hardware,or use the out-of-the-box develop board Pika-Pi—Zero.

image

The board based on STM32G030C8T6 MCU, only 64kB Flash, 8kB RAM can run pikapython with total peripheral device (GPIO、TIME、IIC、RGB、KEY、LCD、RGB). CH340 is deployed to support USB to serial with Type-C USB, support download python script py serial, there are 4 RGB on the board and support the LCD.

Related Projects

Document

https://pikadoc.readthedocs.io/en/latest/index.html

How to contribute

https://pikadoc.readthedocs.io/en/latest/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E%E7%A4%BE%E5%8C%BA%E8%B4%A1%E7%8C%AE.html

Folders

src - core code

bsp - mcu/board support

port - OS and package manager

test - unit test

document - developt document

examples - example scripts

package - packages and moudles

pikaCompiler - pre-compiler write by Rust, used to bind C function to python moudle.

pikaPackageManager - pacakge manager

2.Platform support

MCU support

MCUbspgpiotimeuartpwmadci2cdac
stm32g030c8
stm32g070cB
stm32f103c8
stm32f103rb
stm32f103ze
stm32f103rc
stm32f401cc
stm32f411ce
stm32f407ze
stm32f407zg
stm32h750vb
stm32f051r8
air32f103cb
ch582
ch32v103r8t6
cm32m101a
w806
apm32f030r8
apm32e103vb
bl-602
bl-706
Raspberry Pico
ESP32C3
TC264D
devc
visual-studio
EC600N
mm32f5277e9p
xr806(openharmony)

Board support

Boardbspgpiouartpwmadci2crgblcdarm-2d
Pika-Pi-Zero
Boardbsppika_lvgl
lvgl-vs-simu
swm320
Boardbsparm-2d
QEMU-arm2d
BoardbspLEDKEY
SmartLoong

OS support

OSportGPIOTIMEPWM
RT-Thread
vsf
OSportGoogle TestBenchmark
linux

3.Characteristic

(1)Run environment

Support run in mcu without OS or file system. Can run in everywhere with RAM ≥ 4kB and FLASH ≥ 64kB,such as stm32g030, stm32f103c8t6,esp8266.

(2)Develop enviroment

Support REPL by serial.

微信交流群

Support run and program python scripts by serial.

微信交流群

Support IDEs like Keil, IAR, RT-Thread studio and segger embedded studio to develop C moudle.

Support build tools like CMake, makeFile and Scons.

Zero dependencies, zero configuration, out-of-the-box, easy to integrated into privious C projcet.

Eazy to extern customized C moudles.

Support linux.

(3)Syntax

Support subaggregate of python 3 standard syntax.

Support class and method define, encapsulation-inheritance-polymorphism and moudles in .pyi of C module.

More Details About Syntax Support
SyntaxCompile-TimeRun-TimeShell
Module Define--
Module Import
Class Define
Class Inherit
Method Define
Method Override
Method Invoke
Argument Define
Argument Assignment
Object New
Object Free
Object Nest
Control flow

Operator

+-*/==><>=<=%**//!=&>><<andornotin+=-=*=/=

Control flow

SyntaxState
if
while
for in [list]
for in range(a, b)
for in [dict]
if elif else
for break/continue
while break/continue

Module

SyntaxPython ModuleC Module
import [module]
import [module] as-
from [module] import [class/function>]-
from [module] import [class/function>] as-
from [module] import *-PikaObj Module Only

List/Dict

SyntaxState
l = list()
l = [a, b, c]
d = dict()
d = {'a':x, 'b':y, 'c':z}

Exception

SyntaxState
try:
except:
except [Exception]:-
except [Exception] as [err]:-
except: ... else:-
raise:
raise [Exception]:-
finally:-

Slice

Syntaxstrbyteslist
test[i]
test[a : b]
test[a :]

Other keywords/Syntax

yieldiscomprehensions
--

(4)Develop standard.

Readability first, nearly never use macro function and global argument.

Complete unit testes based on google test.

4.Demo

The scripts in demos are in the examples folder.

Demo 01 GPIO

View Code
importPikaStdLibimportSTM32G0mem=PikaStdLib.MemChecker()
io1=STM32G0.GPIO()
time=STM32G0.Time()
io1.setPin('PA8')
io1.setMode('out')
io1.enable()
io1.low()
print('hello pikapython')
print('mem.max :')
mem.max()
print('mem.now :')
mem.now()
whileTrue:
io1.low()
time.sleep_ms(500)
io1.high()
time.sleep_ms(500)

Hnet-image (2)

Demo 02 USART

View Code
importPikaStdLibimportSTM32G0time=STM32G0.Time()
uart=STM32G0.UART()
uart.setId(1)
uart.setBaudRate(115200)
uart.enable()
whileTrue:
time.sleep_ms(500)
readBuff=uart.read(2)
print('read 2 char:')
print(readBuff)

Hnet-image (3)

Demo 03 ADC

View Code
importPikaStdLibimportSTM32G0time=STM32G0.Time()
adc1=STM32G0.ADC()
adc1.setPin('PA1')
adc1.enable()
whileTrue:
val=adc1.read()
print('adc1 value:')
print(val)
time.sleep_ms(500)

mmexport1631351523907

Demo 04 PWM output

View Code
importPikaStdLibimportSTM32G0time=STM32G0.Time()
pwm=STM32G0.PWM()
pwm.setPin('PA8')
pwm.setFrequency(2000)
pwm.setDuty(0.5)
pwm.enable()
whileTrue:
time.sleep_ms(500)
pwm.setDuty(0.5)
time.sleep_ms(500)
pwm.setDuty(0.001)

Demo 05 RGB

View Code
importSTM32G0importPikaPiZeroimportPikaStdLibrgb=PikaPiZero.RGB()
mem=PikaStdLib.MemChecker()
rgb.init()
rgb.enable()
print('hello 2')
print('mem used max:')
mem.max()
whileTrue:
print('flowing')
rgb.flow()

Demo 06 Snake(Need LCD)

View Code
fromPikaObjimport*importPikaStdLibimportPikaPiZeroimportSTM32G0# hardware initlcd=PikaPiZero.LCD()
lcd.init()
lcd.clear('white')
key=PikaPiZero.KEY()
key.init()
time=STM32G0.Time()
x_max=120y_max=150# snake inits=PikaPiZero.Point()
w=9h=9s.x=50s.y=10len=0whilelen<3:
b=si=0whilei<len:
b=b.nexti=i+1b.next=PikaPiZero.Point()
b.next.x=b.x-10b.next.y=b.yb.next.prev=blen=len+1# ring linkb.next=ss.prev=bi=0b=swhilei<len:
lcd.fill(b.x, b.y, w, h, 'blue')
b=b.nexti=i+1print('snake lengh')
print(len)
# fruit initf=PikaPiZero.Point()
f.x=30f.y=20lcd.fill(f.x, f.y, w, h, 'green')
# memory checkmem=PikaStdLib.MemChecker()
print('mem used max:')
mem.max()
# main loopd=0isUpdate=1isEat=0whileTrue:
ifisUpdate:
# isUpdate = 0# check eat fruitiff.x==s.xandf.y==s.y:
# have eat fruitisEat=1f.x=f.x+30iff.x>x_max:
f.x=f.x-x_maxf.y=f.y+30iff.y>y_max:
f.y=f.y-y_maxlcd.fill(f.x, f.y, w, h, 'green')
# move snake by the directionifd==0:
x_new=s.x+10y_new=s.yifx_new>x_max:
x_new=0elifd==1:
x_new=s.xy_new=s.y-10ify_new<0:
y_new=y_maxelifd==2:
x_new=s.xy_new=s.y+10ify_new>y_max:
y_new=0elifd==3:
x_new=s.x-10y_new=s.yifx_new<0:
x_new=x_maxifisEat:
isEat=0b_new=PikaPiZero.Point()
b_new.x=x_newb_new.y=y_newb_new.prev=s.prevb_new.next=ss.prev.next=b_news.prev=b_news=b_newlen=len+1print('snake lengh')
print(len)
print('mem used max:')
mem.max()
# drow the snake and fruit# clear last bodylcd.fill(s.prev.x, s.prev.y, w, h, 'white')
# new bodys.prev.x=x_news.prev.y=y_new# head is last bodys=s.prevlcd.fill(s.x, s.y, w, h, 'blue')
b=si=0# scan keykey_val=key.get()
ifkey_val==0:
d=0isUpdate=1elifkey_val==1:
d=1isUpdate=1elifkey_val==2:
d=2isUpdate=1elifkey_val==3:
d=3isUpdate=1

image

The maximum RAM usage of these demos is only 3.56K, which is 4.56K if the 1K stack is included, and the maximum Flash usage is 30.4K. Refer to the 20K RAM and 64K Flash of STM32F103C8T6, less than 25% RAM and less than 50% Flash are used.

About the custom extern module ?

In addition to device drivers, developing custom Python modules for MCU is very easy. The following two demos are extensions of the custom module, which developed python interfaces for the ARM-2D image driver library.

Boxes~

Hnet-image (7)

Rotating suns~

Hnet-image (6)

Star History

Star History Chart

About

ultra-lightweight Python engine runs with only 4KB RAM

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages