KOI can be used alongside any MCU capable of serial communication by sending a serial command, this section contains all the command available for the KOI.
The examples provided are in micropython for the Micro:bit, please adapt for the MCU of your preference.
Get Firmware Version
Command: K0
Function: Gets the firmware version of KOI
Returns: K0 (Firmware Version)
from microbit import *
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
uart.write('K0\r\n')
sleep(100)
ret_list = []
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll(ret_list[1])
Taking and Showing Photos
Command: K1 (name.jpg)
Function: Saves the picture with file name.
Command: K2 (name.jpg)
Function: Shows the picture with filename
from microbit import *
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
while True:
if button_a.is_pressed():
uart.write('K2 pic.jpg\r\n')
if button_b.is_pressed():
uart.write('K1 pic.jpg\r\n')
KOI Button Status
Command: K3
Function: Returns the button status of the 2 buttons
Returns: K3 (Button A Status) (Button B Status)
from microbit import *
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
ret_list = []
while True:
uart.write('K3\r\n')
sleep(1000)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll('A:')
display.scroll(ret_list[1])
display.scroll('B:')
display.scroll(ret_list[2])
Display String
Command: K4 x y delay string
Function: Displays sting at (x,y) with a duration determined by delay
while True: if button_a.is_pressed() and button_b.is_pressed(): uart.write(’K6 2\r\n’) if button_a.is_pressed(): uart.write(’K6 0\r\n’) if button_b.is_pressed(): uart.write(’K6 1\r\n’)
Circle Tracking
Command: K10 threshold
Function: Tracks the circle on screen, adjust threshold to the sensitivity, the default is 4000.
Returns: K10 (Center X) (Center Y) (Radius)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
while True:
if button_a.is_pressed():
uart.write('K10 3000\r\n')
sleep(1000)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll('X:')
display.scroll(ret_list[1])
display.scroll('Y:')
display.scroll(ret_list[2])
display.scroll('R:')
display.scroll(ret_list[3])
Rectangle Tracking
Command: K11 threshold
Function: Tracks the rectangle on screen, adjust threshold to the sensitivity, the default is 4000.
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
while True:
if button_a.is_pressed():
uart.write('K11 6000\r\n')
sleep(1000)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll('X:')
display.scroll(ret_list[1])
display.scroll('Y:')
display.scroll(ret_list[2])
display.scroll('W:')
display.scroll(ret_list[3])
display.scroll('H:')
display.scroll(ret_list[4])
Linear Regression
Command: K16 color
Function: Calibrates to the color of the line, color refers to color name, the color name is just for reference.
Command: K12 color
Function: Tracks the line using linear regression and the given color name.
Returns: K12 (X1) (Y1) (X2) (Y2)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
flag=False
while True:
if button_a.is_pressed():
uart.write('K16 test\r\n')
sleep(2000)
flag=True
if flag:
uart.write('K12 test\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll('X1:')
display.scroll(ret_list[1])
display.scroll('Y1:')
display.scroll(ret_list[2])
display.scroll('X2:')
display.scroll(ret_list[3])
display.scroll('Y2:')
display.scroll(ret_list[4])
sleep(2000)
Color Blob Tracking
Command: K16 color
Function: Calibrates to the color of the blob, color refers to color name, the color name is just for reference.
Command: K15 color
Function: Tracks the color blob with the given color name.
Returns: K5 (X) (Y) (W) (H)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
flag=False
while True:
if button_a.is_pressed():
uart.write('K16 test\r\n')
sleep(2000)
flag=True
if flag:
uart.write('K15 test\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll('X:')
display.scroll(ret_list[1])
display.scroll('Y:')
display.scroll(ret_list[2])
display.scroll('W:')
display.scroll(ret_list[3])
display.scroll('H:')
display.scroll(ret_list[4])
sleep(2000)
Read QR Code and Barcode
Command: K20
Function: Reads a QR Code
Returns: K20 (Content)
Command: K22
Function: Reads a Barcode
Returns: K22 (Content)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
sleep(1000)
while True:
if button_a.is_pressed():
uart.write('K20\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K22\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll(ret_list[1])
ret_list=[]
Face Detection
Command: K30
Function: Loads the face model for face detection.
Command: K31
Function: Face Detection for once
Returns: K0 (ID) (X) (Y)
Command: K32
Function: Gets the number of detected faces
Returns: K32 (faces)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K30\r\n')
sleep(1000)
while True:
if button_a.is_pressed():
uart.write('K31\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll('X')
display.scroll(ret_list[2])
display.scroll('Y')
display.scroll(ret_list[3])
ret_list=[]
Image Classifier
Command: K40
Function: Initiates the Image Classifier
Command: K41 className
Function: Adds a class with className as tag
Command: K42
Function: Image Classify
Returns: K42 (className)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K40\r\n')
sleep(1000)
while True:
if button_a.is_pressed() and button_b.is_pressed():
uart.write('K42\r\n')
sleep(500)
if button_a.is_pressed():
uart.write('K41 rock\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K41 paper\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll(ret_list[1])
ret_list=[]
Command: K43 name.json
Function: Saves the model to the SD Card, file extension can be json or bin.
from microbit import *
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K40\r\n')
sleep(1000)
while True:
if button_a.is_pressed() and button_b.is_pressed():
uart.write('K43 test.json\r\n')
sleep(500)
if button_a.is_pressed():
uart.write('K41 rock\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K41 paper\r\n')
sleep(500)
Command: K44 name.json
Function: Loads the model from the SD card.
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K40\r\n')
sleep(1000)
while True:
if button_a.is_pressed() and button_b.is_pressed():
uart.write('K44 test.json\r\n')
sleep(500)
if button_a.is_pressed():
uart.write('K42\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll(ret_list[1])
ret_list=[]
WiFi and IoT
Command: K50 SSID password
Function: Connects to a WiFi network with the given SSID and password.(Only 2.4GHz network is supported)
Command: K54
Command: Displays the IP Address on the screen
from microbit import *
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K50 SSID password\r\n')
sleep(1000)
while True:
if button_a.is_pressed():
uart.write('K54\r\n')
sleep(500)
Command: K51 mqttHost clientID port [username] [password]
Function: Connects to a MQTT Broker.
Username and password are only needed if the broker requires authentication.
Command: K52 topic
Function: Subscribes a MQTT topic
Command: K53 topic message
Function: Publishes a message to a MQTT topic
Command: K55 topic
Function: Reads data from a MQTT topic
Returns: K55 (message)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K50 SSID password\r\n')
sleep(500)
uart.write('K51 mqttHost clientID port [username] [password]\r\n')
sleep(500)
uart.write('K52 topic\r\n')
sleep(500)
while True:
if button_a.is_pressed():
uart.write('K53 topic message\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K55 topic\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll(ret_list[1])
ret_list=[]
Recording and Playback
Command: K61 sound.wav
Function: Records a sound clip and saves to SD card
Command: K62 sound.wav
Function: Playbacks a sound clip from SD card.
from microbit import *
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
while True:
if button_a.is_pressed():
uart.write('K61 hello.wav\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K62 hello.wav\r\n')
sleep(500)
Voice Recognition
Command: K63
Function: Calibrates the noise level
Command: K64 id
Function: Adds a command with id as tag.
Command: K65
Function: Recognizes a command.
Returns: K65 (id)
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K63\r\n')
sleep(1000)
while True:
if button_a.is_pressed() and button_b.is_pressed():
uart.write('K65\r\n')
sleep(500)
if button_a.is_pressed():
uart.write('K64 hi\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K64 bye\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll(ret_list[1])
ret_list=[]
Command: K66 sound.json
Function: Saves the model to the SD Card.
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K63\r\n')
sleep(1000)
while True:
if button_a.is_pressed() and button_b.is_pressed():
uart.write('K66 greeting.json\r\n')
sleep(500)
if button_a.is_pressed():
uart.write('K64 hi\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K64 bye\r\n')
sleep(500)
Command: K67 sound.json
Function: Loads a model from SD Card.
from microbit import *
ret_list=[]
uart.init(baudrate=115200, tx=pin1, rx=pin2)
uart.write('\n\n')
uart.write('K63\r\n')
sleep(1000)
while True:
if button_a.is_pressed():
uart.write('K65\r\n')
sleep(500)
if button_b.is_pressed():
uart.write('K67 greeting.json\r\n')
sleep(500)
if uart.any():
ret = str(uart.readline(), 'UTF-8')
ret = ret.strip()
ret_list = ret.split(' ')
if len(ret_list)>1:
display.scroll(ret_list[1])
ret_list=[]
Face Recognition
Command: K75
Function: Runs face recognition. (Internet Connection Required)