1- import RPi .GPIO as GPIO
2- import numpy as np
1+ import board
2+ import pwmio
3+ import math
34import time
45
5- LEFT_ANTENNA_PIN = 13
6- RIGHT_ANTENNA_PIN = 12
6+ LEFT_ANTENNA_PIN = board . D13
7+ RIGHT_ANTENNA_PIN = board . D12
78LEFT_SIGN = 1
89RIGHT_SIGN = - 1
10+ MIN_UPDATE_INTERVAL = 1 / 50 # 20ms
911
1012
11- class Antennas :
12- def __init__ (self ):
13-
14- GPIO .setmode (GPIO .BCM )
15- GPIO .setup (LEFT_ANTENNA_PIN , GPIO .OUT )
16- GPIO .setup (RIGHT_ANTENNA_PIN , GPIO .OUT )
17-
18- self .pwm1 = GPIO .PWM (LEFT_ANTENNA_PIN , 50 )
19- self .pwm2 = GPIO .PWM (RIGHT_ANTENNA_PIN , 50 )
13+ def value_to_duty_cycle (v ):
14+ pulse_width_ms = 1.5 + (v * 0.5 ) # 1ms to 2ms
15+ duty_cycle = int ((pulse_width_ms / 20 ) * 65535 )
16+ return min (max (duty_cycle , 3277 ), 6553 )
2017
21- self .pwm1 .start (0 )
22- self .pwm2 .start (0 )
2318
24- def map_input_to_angle (self , value ):
25- return 90 + (value * 90 )
19+ class Antennas :
20+ def __init__ (self ):
21+ neutral_duty = value_to_duty_cycle (0 )
22+ self .pwm_left = pwmio .PWMOut (LEFT_ANTENNA_PIN , frequency = 50 , duty_cycle = neutral_duty )
23+ self .pwm_right = pwmio .PWMOut (RIGHT_ANTENNA_PIN , frequency = 50 , duty_cycle = neutral_duty )
2624
2725 def set_position_left (self , position ):
28- self .set_position (1 , position , LEFT_SIGN )
26+ self .set_position (self . pwm_left , position , LEFT_SIGN )
2927
3028 def set_position_right (self , position ):
31- self .set_position (2 , position , RIGHT_SIGN )
32-
33- def set_position (self , servo , value , sign = 1 ):
34- """
35- Moves the servo based on an input value in the range [-1, 1].
36- :param servo: 1 for the first servo, 2 for the second servo
37- :param value: A float between -1 and 1
38- """
29+ self .set_position (self .pwm_right , position , RIGHT_SIGN )
3930
31+ def set_position (self , pwm , value , sign = 1 ):
4032 # if value == 0:
4133 # return
4234 if - 1 <= value <= 1 :
43- angle = self .map_input_to_angle (value * sign )
44-
45- duty = 2 + (angle / 18 ) # Convert angle to duty cycle (1ms-2ms)
46- if servo == 1 :
47- self .pwm1 .ChangeDutyCycle (duty )
48- elif servo == 2 :
49- self .pwm2 .ChangeDutyCycle (duty )
50- else :
51- print ("Invalid servo number!" )
52- # time.sleep(0.01) # Allow time for movement
35+ duty_cycle = value_to_duty_cycle (value * sign ) # Convert value to duty cycle (1ms-2ms)
36+ pwm .duty_cycle = duty_cycle
5337 else :
5438 print ("Invalid input! Enter a value between -1 and 1." )
5539
5640 def stop (self ):
57- self .pwm1 .stop ()
58- self .pwm2 .stop ()
59- GPIO .cleanup ()
41+ time .sleep (MIN_UPDATE_INTERVAL )
42+ self .set_position_left (0 )
43+ self .set_position_right (0 )
44+ time .sleep (MIN_UPDATE_INTERVAL )
45+ self .pwm_left .deinit ()
46+ self .pwm_right .deinit ()
6047
6148
6249if __name__ == "__main__" :
6350 antennas = Antennas ()
6451
65- s = time .time ()
66- while True :
67- antennas .set_position_left (np .sin (2 * np .pi * 1 * time .time ()))
68- antennas .set_position_right (np .sin (2 * np .pi * 1 * time .time ()))
52+ try :
53+ start_time = time .monotonic ()
54+ current_time = start_time
6955
70- time .sleep (1 / 50 )
56+ while current_time - start_time < 5 :
57+ value = math .sin (2 * math .pi * 1 * current_time )
58+ antennas .set_position_left (value )
59+ antennas .set_position_right (value )
60+ time .sleep (MIN_UPDATE_INTERVAL )
61+ current_time = time .monotonic ()
7162
72- if time .time () - s > 5 :
73- break
74-
63+ finally :
64+ antennas .stop ()
0 commit comments