I tried using a robotic car "Tiny:bit Pro" that extends micro:bit provided by Yahboom.
The packing list includes: packing box, instruction manual, car extension board(with motor and mounting bracket), tires, infrared remote controller, rechargeable battery, tracking map, TF card+card reader.
! ! !Note: If you purchase with Microbit board, your package will include Micro:bit board. If you purchase not include Micro:bit, you need prepare BBC Micro:bit by yourself.
Tiny:bit Pro have two option: Standard Kit / Expansion Kit
Assembly1.Remove the M3*6mm screws on the K210 module. And install the M3*6mm screw fixing bracket to the K210 module.
2. Install universal wheel
3. Install Trie
4. Install K210 module on Tinybit car
5. Insert Microbit board
Completion Something cute and fuuny! Do you like this "guy"?
SpecificationFront: Ultrasonic, sound sensor, high-brightness searchlight, infrared remote control receiver, programmable colorful RGB lights, alligator clip interface, PH2.0-4PIN serial port interface.
Back: Tracking sensor, buzzer, motor socket, serial port switch.
Addition of Tiny:bit Pro block for MakeCodeSince it is a robot car that extended Micro:bit, it can block coding with MakeCode.
How to add Tiny:bit Pro block
- Please access below and click "New Project"https://makecode.microbit.org/
- Click the setting icon -> Extension
- Basic function for Tiny:bit Pro library
- https://github.com/YahboomTechnology/Tiny-bitLib
https://github.com/YahboomTechnology/Yahboom_IR
- https://github.com/YahboomTechnology/Yahboom_IR
- AI vision function for Tiny:bit Pro library
- https://github.com/YahboomTechnology/K210-Module.git
- Tiny:bit's block is added.
Various basic sample codes for Tinybit Pro are uploaded below.
RGB-light-exchange-lighting: https://makecode.microbit.org/_EL3LmqJTwKKT
Car-move-control-speed: https://makecode.microbit.org/_9oJaEzErWisY
Ultrasonic-avoid-with-light-sound: https://makecode.microbit.org/_P7WYcMXvUTqt
Voice control light: https://makecode.microbit.org/_KDDPHmJcaRut
Spinning top: https://makecode.microbit.org/_Wv0dPq5K8bFV
Various AI vidsion sample codes for Tinybit Pro are uploaded below.
Color recognition-Microbit car code: https://makecode.microbit.org/_1p84eJ9VxUkK
Color recognition-K210 module code:
- import sensor, image, time, lcdfrom modules import ybserialimport timeserial = ybserial()lcd.init()sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.skip_frames(time = 100)sensor.set_auto_gain(False)sensor.set_auto_whitebal(False)clock = time.clock()print("Hold the object you want to track in front of the camera in the box.")print("MAKE SURE THE COLOR OF THE OBJECT YOU WANT TO TRACK IS FULLY ENCLOSED BY THE BOX!")# Capture the color thresholds for whatever was in the center of the image.# 50x50 center of QVGA.r = [(320//2)-(50//2), (240//2)-(50//2), 50, 50]for I in range(50):img = sensor.snapshot()img.draw_rectangle(r)lcd.display(img)print("Learning thresholds...")threshold = [50, 50, 0, 0, 0, 0] # Middle L, A, B values.for I in range(50):img = sensor.snapshot()hist = img.get_histogram(roi=r)lo = hist.get_percentile(0.01) # Get the CDF of the histogram at the 1% range (ADJUST AS NECESSARY)!hi = hist.get_percentile(0.99) # Get the CDF of the histogram at the 99% range (ADJUST AS NECESSARY)!# Average in percentile values.threshold[0] = (threshold[0] + lo.l_value()) // 2threshold[1] = (threshold[1] + hi.l_value()) // 2threshold[2] = (threshold[2] + lo.a_value()) // 2threshold[3] = (threshold[3] + hi.a_value()) // 2threshold[4] = (threshold[4] + lo.b_value()) // 2threshold[5] = (threshold[5] + hi.b_value()) // 2for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())img.draw_rectangle(r, color=(0, 255, 0))lcd.display(img)print("Thresholds learned...")print("Start Color Recognition...")while(True):clock.tick()img = sensor.snapshot()for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())x = str(blob.x())y = str(blob.y())w = str(blob.w())h = str(blob.h())print(threshold)if len(x)<3 :i_flag = 3-len(x)x = "0"*i_flag + xif len(y)<3 :i_flag = 3-len(y)y = "0"*i_flag + yif len(w)<3 :i_flag = 3-len(w)w = "0"*i_flag + wif len(h)<3 :i_flag = 3-len(h)h = "0"*i_flag + hsend_data ="$"+"01"+ x+', '+ y+', '+ w+', '+ h+', '+"#"#print(send_data)for I in range(1, 5):serial.send(send_data)time.sleep_ms(5)lcd.display(img)#print(clock.fps())
import sensor, image, time, lcdfrom modules import ybserialimport timeserial = ybserial()lcd.init()sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.skip_frames(time = 100)sensor.set_auto_gain(False)sensor.set_auto_whitebal(False)clock = time.clock()print("Hold the object you want to track in front of the camera in the box.")print("MAKE SURE THE COLOR OF THE OBJECT YOU WANT TO TRACK IS FULLY ENCLOSED BY THE BOX!")# Capture the color thresholds for whatever was in the center of the image.# 50x50 center of QVGA.r = [(320//2)-(50//2), (240//2)-(50//2), 50, 50]for I in range(50):img = sensor.snapshot()img.draw_rectangle(r)lcd.display(img)print("Learning thresholds...")threshold = [50, 50, 0, 0, 0, 0] # Middle L, A, B values.for I in range(50):img = sensor.snapshot()hist = img.get_histogram(roi=r)lo = hist.get_percentile(0.01) # Get the CDF of the histogram at the 1% range (ADJUST AS NECESSARY)!hi = hist.get_percentile(0.99) # Get the CDF of the histogram at the 99% range (ADJUST AS NECESSARY)!# Average in percentile values.threshold[0] = (threshold[0] + lo.l_value()) // 2threshold[1] = (threshold[1] + hi.l_value()) // 2threshold[2] = (threshold[2] + lo.a_value()) // 2threshold[3] = (threshold[3] + hi.a_value()) // 2threshold[4] = (threshold[4] + lo.b_value()) // 2threshold[5] = (threshold[5] + hi.b_value()) // 2for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())img.draw_rectangle(r, color=(0, 255, 0))lcd.display(img)print("Thresholds learned...")print("Start Color Recognition...")while(True):clock.tick()img = sensor.snapshot()for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())x = str(blob.x())y = str(blob.y())w = str(blob.w())h = str(blob.h())print(threshold)if len(x)<3 :i_flag = 3-len(x)x = "0"*i_flag + xif len(y)<3 :i_flag = 3-len(y)y = "0"*i_flag + yif len(w)<3 :i_flag = 3-len(w)w = "0"*i_flag + wif len(h)<3 :i_flag = 3-len(h)h = "0"*i_flag + hsend_data ="$"+"01"+ x+', '+ y+', '+ w+', '+ h+', '+"#"#print(send_data)for I in range(1, 5):serial.send(send_data)time.sleep_ms(5)lcd.display(img)#print(clock.fps())
Handwritten_digital_control-Microbit car code: https://makecode.microbit.org/_7e82r50rpfzC
Handwritten_digital_control-K210 module code:
import sensor, image, time, lcdfrom maix import KPUimport gcfrom modules import ybserialimport timeserial = ybserial()lcd.init()sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_windowing((224, 224))sensor.skip_frames(time = 100)clock = time.clock()kpu = KPU()kpu.load_kmodel("/sd/KPU/mnist/uint8_mnist_cnn_model.kmodel")msg_ =""while True:gc.collect()img = sensor.snapshot()img_mnist1=img.to_grayscale(1)img_mnist2=img_mnist1.resize(112, 112)img_mnist2.invert()img_mnist2.strech_char(1)img_mnist2.pix_to_ai()out = kpu.run_with_output(img_mnist2, getlist=True)max_mnist = max(out)index_mnist = out.index(max_mnist)msg_ = str(index_mnist)send_data ="$"+"11"+ msg_ +', '+"#"time.sleep_ms(5)serial.send(send_data)score = KPU.sigmoid(max_mnist)if index_mnist == 1:if score > 0.999:display_str = "num: %d" % index_mnistprint(display_str, score)img.draw_string(4, 3, display_str, color=(0, 0, 0), scale=2)elif index_mnist == 5:if score > 0.999:display_str = "num: %d" % index_mnistprint(display_str, score)img.draw_string(4, 3, display_str, color=(0, 0, 0), scale=2)else:display_str = "num: %d" % index_mnistprint(display_str, score)img.draw_string(4, 3, display_str, color=(0, 0, 0), scale=2)lcd.display(img)kpu.deinit()
import sensor, image, time, lcdfrom maix import KPUimport gcfrom modules import ybserialimport timeserial = ybserial()lcd.init()sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_windowing((224, 224))sensor.skip_frames(time = 100)clock = time.clock()kpu = KPU()kpu.load_kmodel("/sd/KPU/mnist/uint8_mnist_cnn_model.kmodel")msg_ =""while True:gc.collect()img = sensor.snapshot()img_mnist1=img.to_grayscale(1)img_mnist2=img_mnist1.resize(112, 112)img_mnist2.invert()img_mnist2.strech_char(1)img_mnist2.pix_to_ai()out = kpu.run_with_output(img_mnist2, getlist=True)max_mnist = max(out)index_mnist = out.index(max_mnist)msg_ = str(index_mnist)send_data ="$"+"11"+ msg_ +', '+"#"time.sleep_ms(5)serial.send(send_data)score = KPU.sigmoid(max_mnist)if index_mnist == 1:if score > 0.999:display_str = "num: %d" % index_mnistprint(display_str, score)img.draw_string(4, 3, display_str, color=(0, 0, 0), scale=2)elif index_mnist == 5:if score > 0.999:display_str = "num: %d" % index_mnistprint(display_str, score)img.draw_string(4, 3, display_str, color=(0, 0, 0), scale=2)else:display_str = "num: %d" % index_mnistprint(display_str, score)img.draw_string(4, 3, display_str, color=(0, 0, 0), scale=2)lcd.display(img)kpu.deinit()
Case effect show







Comments