Please let me preface this by saying i am a noob when it comes to coding so please be gentle.
I was recently given a Maixy dan dock (K210 RISC-V AI SoC) as a gift and have been looking at the face tracking pan/tilt demo that I loaded on there. I was wondering if I would be able to interface an arduino with it to control an added back and forward motion with a track platform I have. Im VERY new to Micropython (literally weeks old) and would like some guidance towards an answer, I'm looking to learn several things, they are:
1. could I modify the original code to add a Z axis to control the forward and backwards motion, it already takes the X and Y axis for the pan/tilt function.
2. Should I look at writing separate code for the arduino and not bother with taking the info from the Maixy board, so it would use an ultrasonic sensor on the pan/tilt module to track the person (this sounds like it would erroneous and plagued with issues) and keep within a certain range.
3. Can the Maixy be interfaced with the arduino to parse the information to drive the motors so distance and centralisation is decided by the Maixy but driven by the arduino. (this is my favourite solution)
I would like learning experiences more than solutions... if that makes sense. I'm looking to be able to say "i did this" rather than "i copied and pasted this"
If anyone knows where i could look to find the answers to these issues i would be grateful, it will be going into an instructible to show that new coders can get to a decent level of competencies if they ask the right questions and study. I think I may need to learn about I2C, but not sure if this would be the right direction.
Below is the pan/tilt face tracking code:
Code: Select all
import machine from fpioa_manager import * global fm class PT: def __init__(self,P_x = -0.07,P_y = -0.05,x_init_ang = 90,y_init_ang = 9 global fm if x_init_ang > 160 or x_init_ang<30: print("x_init_ang value error") return None if y_init_ang > 160 or y_init_ang<30: print("y_init_ang value error") return None if P_x > 0 : print("x axis P_value(P_x) must <0") return None if P_y > 0 : print("y axis P_value(P_y) must <0") return None self.Px = P_x self.Py = P_y self.x_angle = x_init_ang self.y_angle = y_init_ang self.print_en = pr_en self.limite_value = limited_val self.cam=machine.ov2640(); self.lcd=machine.st7789(); self.demo=machine.demo_face_detect(); self.demo.init(); self.cam.init(); self.lcd.init(); fm.registered(34,fm.fpioa.TIMER1_TOGGLE1); fm.registered(35,fm.fpioa.TIMER1_TOGGLE2); self.y_axis=machine.pwm(machine.pwm.TIMER1,machine.pwm.CHANEEL0, self.x_axis=machine.pwm(machine.pwm.TIMER1,machine.pwm.CHANEEL1, self.x_axis.duty(7.5) self.y_axis.duty(7.5) def set_P(self,P_x = 0,P_y = 0): if P_y >= 0 : print("y axis P_value(P_y) must <0") return False if P_x >= 0 : print("x axis P_value(P_x) must <0") return False self.Px = P_x self.Py = P_y def run(self): ex = 0.0 ey = 0.0 ux_angle = 0.0 uy_angle = 0.0 x = 0.0 y = 0.0 x1 = 0 x2 = 0 y1 = 0 y2 = 0 image = bytearray(320*240*2); while(1): self.cam.get_image(image); data = self.demo.process_image(image); self.lcd.draw_picture_default(image); x1=data; x2=data; y1=data; y2=data; if x1 > 320 or x2 > 320 or y1 > 240 or y2 > 240 : continue x =(x2 - x1)/2+x1; y =(y2 - y1)/2+y1; ex = (160 - x); ey = (120 - y); ux_angle = ex * self.Px if abs(ex) < 5 : ux_angle = 0 if ux_angle >= 15 : ux_angle = 15 if ux_angle <= -15 : ux_angle = -15 uy_angle = ey * self.Py if abs(ey) < 5 : ux_angle = 0 if uy_angle >= self.limite_value : uy_angle = self.limit if uy_angle <= -self.limite_value : uy_angle = -self.lim self.x_angle = ux_angle + self.x_angle self.y_angle = uy_angle + self.y_angle if self.x_angle * 0.055 >= 9.8 : self.x_angle = 180 ux_angle = 0 if self.x_angle * 0.055 <= 0.5 : self.x_angle = 0 ux_angle = 0 x_angle_duty = (self.x_angle) * 0.055 y_angle_duty = (self.y_angle) * 0.055 if self.print_en == 1 : print("x = ",x) print("y = ",y) print("ux_angle = ",ux_angle) print("uy_angle = ",uy_angle) print("x_angle = ",self.x_angle) print("y_angle = ",self.y_angle) self.x_axis.duty(2.5+x_angle_duty) self.y_axis.duty(2.5+y_angle_duty)