# ECHO/SERVO test -2024.1.17- import RPi.GPIO as GPIO import time import sys import tkinter as tk import Adafruit_PCA9685 # I/O (GPIO pin) TRIGER = 23 ECHO = 24 # GPIO initialize GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(TRIGER, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) # PCA9685 initialize pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(60) # distance variable cm = 0 # servo adjastment adj = -5 # slider change & servo rotate def sbarX(sclX): angle = int(sclX) labelX.config(text='角度 = %d' % angle) pulse = int(angle * 125 / 45) + 400 + adj # print(pulse) pwm.set_pwm(2, 0, pulse) # distance erace def erace(): labelD = tk.Label(root, text='距離(cm) = ' + ' ') labelD.place(x=140, y=120) # distance measurement def read_distance(): GPIO.output(TRIGER, GPIO.HIGH) time.sleep(0.00001) #wait time(10μS) GPIO.output(TRIGER, GPIO.LOW) while GPIO.input(ECHO) == GPIO.LOW: sig_off = time.time() while GPIO.input(ECHO) == GPIO.HIGH: sig_on = time.time() duration = (sig_on - sig_off) distance = duration * 34000 / 2 if distance >= 2.0 and distance <= 400.0: erace() labelD = tk.Label(root, text='距離(cm) = ' + '{:.2f}'.format(distance)) labelD.place(x=140, y=120) else: erace() labelD = tk.Label(root, text='距離(cm) = ' + '測定不能') labelD.place(x=140, y=120) root.after(1000, read_distance) # servo position reset def servo_reset(): valX.set(0) erace() sbarX(0) read_distance() # main root = tk.Tk() root.geometry('400x200+100+50') root.title('超音波距離測定') valX = tk.IntVar() angle = 0 valX.set(angle) labelX = tk.Label(root, text='角度 = %d' % valX.get()) labelX.place(x=165, y=70) labelD = tk.Label(root, text='距離(cm) = %d' % cm) labelD.place(x=140, y=120) resetBtn = tk.Button(root, text='RESET') resetBtn.place(x=280, y=42) resetBtn.configure(command=servo_reset) # servo position initialize (center=400) count:150-650 sbarX(angle) sldX = tk.Scale(root, label=' 水平方向回転', orient='h', from_=-45, to=45, showvalue=False, variable=valX, command=sbarX) sldX.place(x=150, y=30) read_distance() root.mainloop()