UnitV maixpy I2C slave Core2 v1.1 I2C bus error
-
After diving deep within the mess that is the micropython port for the k210 device, core to the currently available UnitV module, it seems like it's impossible to make use of the kpu and nn model inference while communicating (as a slave) with another m5stack controller (in our case, specifically, the Core2 v1.1).
What should be the firmware to flash onto the unitv to properly use UIFlow version 1's face detection count blocks?
We weren't able to make that work with the stock firmwares we found. The maixpy uPy port i2c module is documented only for a very specific and quite simple use case with regards to the slave mode, while it seems that trying to set up the device to take a snapshot, infer through the nn model and transmit the face count to the core2 through i2c never works, and always results in aOSError: I2C bus error (110)
(which we don't seem to be able to find any info on what's the specific error message meaning, though we suspect it could probably be a timeout error).We also thought of trying to set up the k210 camera device as an i2c master and the core2 as a slave only on the specific port used, but the core2, specifically with UIFlow 1, does not have a way of behaving like a slave.
These are the programs used on the devices, k210 and core2 (generated by blocky) respectively.
import KPU as kpu import sensor from machine import I2C from time import sleep # Init sensor and NN model sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.run(1) task = kpu.load(0x300000) anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025) kpu.init_yolo2(task, 0.5, 0.3, 5, anchor) result = 0 pause = False # I2C slave def on_receive(data): pass def on_transmit(): global result return result def on_event(event): global pause if event == 2: pause = False return pause = True i2c = I2C(I2C.I2C0, mode=I2C.MODE_SLAVE, scl=34, sda=35, addr=0x23, on_receive=on_receive, on_transmit=on_transmit, on_event=on_event) while True: if not pause: # Detect people faces img = sensor.snapshot() result = kpu.run_yolo2(task, img) result = result[0].objnum() if result else 0
from m5stack import * from m5stack_ui import * from uiflow import * import i2c_bus import time screen = M5Screen() screen.clean_screen() screen.set_screen_bg_color(0xFFFFFF) i2c0 = i2c_bus.easyI2C(i2c_bus.PORTA, 0x00, freq=100000) print(i2c0.scan()) i2c0.addr=(0x23) print(i2c0.available()) while True: wait_ms(198) print(i2c0.read_data(1, i2c_bus.UINT8BE)) wait_ms(2)
https://www.reddit.com/r/M5Stack/comments/1c4hm73/i2c_problems_with_unitv_ov7740_sku_u078c/