# # hello.MinIMU9v5.py # # Pololu MinIMU-9 v5 hello-world # hello.MinIMU9v5.py serial_port # # Neil Gershenfeld 11/2/21 # # This work may be reproduced, modified, distributed, # performed, and displayed for any purpose, but must # acknowledge this project. Copyright is retained and # must be preserved. The work is provided as is; no # warranty is provided, and users accept all liability. # from tkinter import * import serial window = 500 # window size accel_scale = 5000 # accelerometer scale gyro_scale = 10000 # gyro scale mag_scale = 32768 # magnetometer scale eps = 0.05 # filter fraction ax = ay = az = 0 gx = gy = gz = 0 mx = my = mz = 0 def update(var): global eps line = ser.readline().rstrip() return (1-eps)*var+eps*int(line) def idle(parent,canvas): global ax,ay,az,gx,gy,gz,mx,my,mz # # find start # ser.flush(); while (True): line = ser.readline().rstrip() if (line == b'start'): break # # read data # ax = update(ax) ay = update(ay) az = update(az) gx = update(gx) gy = update(gy) gz = update(gz) mx = update(mx) my = update(my) mz = update(mz) # # plot # canvas.itemconfigure("tax",text="ax: %d"%ax) x = int(.3*window + (.9-.3)*window*(.5+0.5*ax/accel_scale)) canvas.coords('rax1',.3*window,.05*window,x,.2*window) canvas.coords('rax2',x,.05*window,.9*window,.2*window) canvas.itemconfigure("tay",text="ay: %d"%ay) x = int(.3*window + (.9-.3)*window*(.5+0.5*ay/accel_scale)) canvas.coords('ray1',.3*window,.25*window,x,.4*window) canvas.coords('ray2',x,.25*window,.9*window,.4*window) canvas.itemconfigure("taz",text="az: %d"%az) x = int(.3*window + (.9-.3)*window*(.5+0.5*az/accel_scale)) canvas.coords('raz1',.3*window,.45*window,x,.6*window) canvas.coords('raz2',x,.45*window,.9*window,.6*window) canvas.itemconfigure("tgx",text="rx: %d"%gx) x = int(.3*window + (.9-.3)*window*(.5+0.5*gx/gyro_scale)) canvas.coords('rgx1',.3*window,.65*window,x,.8*window) canvas.coords('rgx2',x,.65*window,.9*window,.8*window) canvas.itemconfigure("tgy",text="ry: %d"%gy) x = int(.3*window + (.9-.3)*window*(.5+0.5*gy/gyro_scale)) canvas.coords('rgy1',.3*window,.85*window,x,1*window) canvas.coords('rgy2',x,.85*window,.9*window,1*window) canvas.itemconfigure("tgz",text="rz: %d"%gz) x = int(.3*window + (.9-.3)*window*(.5+0.5*gz/gyro_scale)) canvas.coords('rgz1',.3*window,1.05*window,x,1.2*window) canvas.coords('rgz2',x,1.05*window,.9*window,1.2*window) canvas.itemconfigure("tmx",text="mx: %d"%mx) x = int(.3*window + (.9-.3)*window*(.5+0.5*mx/mag_scale)) canvas.coords('rmx1',.3*window,1.25*window,x,1.4*window) canvas.coords('rmx2',x,1.25*window,.9*window,1.4*window) canvas.itemconfigure("tmy",text="my: %d"%my) x = int(.3*window + (.9-.3)*window*(.5+0.5*my/mag_scale)) canvas.coords('rmy1',.3*window,1.45*window,x,1.6*window) canvas.coords('rmy2',x,1.45*window,.9*window,1.6*window) canvas.itemconfigure("tmz",text="mz: %d"%mz) x = int(.3*window + (.9-.3)*window*(.5+0.5*mz/mag_scale)) canvas.coords('rmz1',.3*window,1.65*window,x,1.8*window) canvas.coords('rmz2',x,1.65*window,.9*window,1.8*window) # # update # canvas.update() parent.after_idle(idle,parent,canvas) # # check command line arguments # if (len(sys.argv) != 2): print("command line: hello.MinIMU9v5.py serial_port") sys.exit() port = sys.argv[1] # # open serial port # ser = serial.Serial(port,115200) ser.setDTR() # # set up GUI # root = Tk() root.title('hello.MinIMU9v5.py (q to exit)') root.bind('q','exit') canvas = Canvas(root, width=window, height=1.85*window, background='white') font_size = 22 # canvas.create_text(.025*window,.125*window,text="1",font=("Helvetica", font_size),tags="tax",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,.05*window,.4*window,.2*window, tags='rax1', fill='#b00000') canvas.create_rectangle(.4*window,.05*window,.9*window,.2*window, tags='rax2', fill='#0000b0') # canvas.create_text(.025*window,.325*window,text="1",font=("Helvetica", font_size),tags="tay",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,.25*window,.4*window,.4*window, tags='ray1', fill='#b00000') canvas.create_rectangle(.4*window,.25*window,.9*window,.4*window, tags='ray2', fill='#0000b0') # canvas.create_text(.025*window,.525*window,text="1",font=("Helvetica", font_size),tags="taz",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,.45*window,.4*window,.6*window, tags='raz1', fill='#b00000') canvas.create_rectangle(.4*window,.45*window,.9*window,.6*window, tags='raz2', fill='#0000b0') # canvas.create_text(.025*window,.725*window,text="1",font=("Helvetica", font_size),tags="tgx",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,.65*window,.4*window,.8*window, tags='rgx1', fill='#b00000') canvas.create_rectangle(.4*window,.65*window,.9*window,.8*window, tags='rgx2', fill='#0000b0') # canvas.create_text(.025*window,.925*window,text="1",font=("Helvetica", font_size),tags="tgy",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,.85*window,.4*window,1*window, tags='rgy1', fill='#b00000') canvas.create_rectangle(.4*window,.85*window,.9*window,1*window, tags='rgy2', fill='#0000b0') # canvas.create_text(.025*window,1.125*window,text="1",font=("Helvetica", font_size),tags="tgz",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,1.05*window,.4*window,1.2*window, tags='rgz1', fill='#b00000') canvas.create_rectangle(.4*window,1.05*window,.9*window,1.2*window, tags='rgz2', fill='#0000b0') # canvas.create_text(.025*window,1.325*window,text="1",font=("Helvetica", font_size),tags="tmx",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,1.25*window,.4*window,1.4*window, tags='rmx1', fill='#b00000') canvas.create_rectangle(.4*window,1.25*window,.9*window,1.4*window, tags='rmx2', fill='#0000b0') # canvas.create_text(.025*window,1.525*window,text="1",font=("Helvetica", font_size),tags="tmy",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,1.45*window,.4*window,1.6*window, tags='rmy1', fill='#b00000') canvas.create_rectangle(.4*window,1.45*window,.9*window,1.6*window, tags='rmy2', fill='#0000b0') # canvas.create_text(.025*window,1.725*window,text="1",font=("Helvetica", font_size),tags="tmz",fill="#0000b0",anchor=SW) canvas.create_rectangle(.3*window,1.65*window,.4*window,1.8*window, tags='rmz1', fill='#b00000') canvas.create_rectangle(.4*window,1.65*window,.9*window,1.8*window, tags='rmz2', fill='#0000b0') # canvas.pack() # # start idle loop # root.after(100,idle,root,canvas) root.mainloop()