class Controls: def __init__(self): self.motor = PWM(0) self.servo = PWM(1) self.motor.export() self.servo.export() self.motor.period = 20000000 self.servo.period = 20000000 self.motor.enable = True self.servo.enable = True self.neutral() def move(self, speed): """ 0 <= speed <= 1 where 0 is stopped 1 is full speed """ speed = interpolate_01(STOP_DUTY, FASTEST_DUTY, speed) self.motor.duty_cycle = int(speed) def turn(self, angle): """ -1 <= angle <= +1 where -1 is left 0 is center +1 is right """ # -angle because LEFT_DUTY > RIGHT_DUTY but want -1 to mean LEFT angle = interpolate_pm1(LEFT_DUTY, RIGHT_DUTY, -angle) self.servo.duty_cycle = int(angle) def neutral(self): self.move(STOP) self.turn(CENTER) def test(self): self.neutral() self.turn(LEFT) time.sleep(.5) self.turn(RIGHT) time.sleep(.5) self.turn(CENTER) time.sleep(.5) self.move(.15) time.sleep(1) self.move(STOP)
def tracer_grille(grille, agrandissement, angle, origine): n = 4000 calibre = 0.1 pwm_X = PWM(0) pwm_Y = PWM( 1) # il n'existe que 2 canaux pour implementer les PWMs (0 et 1) pwm_X.export() pwm_Y.export() pwm_X.period = 100000 # les unites sont en nanosecondes, ainsi dans cet exemple la periode vaut 100000*1ns = 100 us pwm_Y.period = 100000 GPIO.setmode( GPIO.BOARD) # On lit les pattes dans l'ordre classique en électronique GPIO.setup(35, GPIO.OUT) # La broche 35 est configurée en sortie ##La fréquence max du lever/baisser de stylo et 4Hz. Donc 250ms. ### Ecriture de la grille for i in range(0, len(grille)): for j in range(0, len(grille[0])): if (grille[i][j] != 0): seq_chiffre = choix(grille[i][j], i, j, agrandissement, angle) x = seq_chiffre[0] y = seq_chiffre[1] haut = seq_chiffre[2] for k in range(0, len(x)): x[k] += origine[0] * calibre y[k] += origine[1] * calibre stylo_haut() for k in range(0, len(x)): if (k != 0): lever_stylo(haut[k], haut[k - 1]) pwm_X.duty_cycle = int(x[k] * pwm_X.period / 3.3) pwm_Y.duty_cycle = int(y[k] * pwm_Y.period / 3.3) pwm_X.enable = True pwm_Y.enable = True stylo_haut() #Lorsque l'on a termine avec la table tracante pwm_X.enable = False # On desactive la PWM pwm_Y.enable = False pwm_X.unexport() pwm_Y.unexport() GPIO.cleanup( ) # A la fin du programme on remet à 0 les broches du Rasberry PI return (0)
def calibrage(): GPIO.setmode( GPIO.BOARD) # On lit les pattes dans l'ordre classique en électronique GPIO.setup(35, GPIO.OUT) # La broche 35 est configurée en sortie pwm_X = PWM(0) pwm_Y = PWM( 1) # il n'existe que 2 canaux pour implementer les PWMs (0 et 1) pwm_X.export() pwm_Y.export() pwm_X.period = 100000 # les unites sont en nanosecondes, ainsi dans cet exemple la periode vaut 100000*1ns = 100 us pwm_Y.period = 100000 GPIO.output(35, GPIO.HIGH) for i in range(0, int(pwm_Y.period / 5)): pwm_Y.duty_cycle = 5 * i pwm_Y.enable = True for i in range(0, int(pwm_X.period / 5)): pwm_X.duty_cycle = 5 * i pwm_X.enable = True for i in range(0, int(pwm_Y.period / 5)): pwm_Y.duty_cycle = pwm_Y.period - 5 * i pwm_Y.enable = True for i in range(0, int(pwm_X.period / 5)): pwm_X.duty_cycle = pwm_X.period - 5 * i pwm_X.enable = True pwm_X.enable = False pwm_Y.enable = False stylo_haut() time.sleep(1) pwm_X.duty_cycle = int(pwm_X.period / 2) pwm_X.enable = True time.sleep(1) camera = picamera.PiCamera() camera.capture('calibrage.jpg') time.sleep(1) pwm_X.enable = False pwm_X.unexport() pwm_Y.unexport() GPIO.cleanup() return 1
class Motion: _enabledPin = 6 def __init__(self): self._speed = 0 self._direction = 0 self._enabled = False self._enabledOutput = DigitalOutputDevice(self._enabledPin) self._speedPwm = PWM(0) # pin 12 self._directionPwm = PWM(1) # pin 13 self._speedPwm.export() self._directionPwm.export() time.sleep(1) # wait till pwms are exported self._speedPwm.period = 20_000_000 self._directionPwm.period = 20_000_000 def enable(self): self._updatePwm() self._speedPwm.enable = True self._directionPwm.enable = True self._enabledOutput.value = 1 def disable(self): self._enabledOutput.value = 0 self._speedPwm.enable = False self._directionPwm.enable = False def set_values(self, speed=None, direction=None): self._speed = speed if speed is not None else self._speed self._direction = direction if direction is not None else self._direction self._updatePwm() def _updatePwm(self): self._speedPwm.duty_cycle = _translate_duty_cycle( self._speed, speed_offset, speed_scale) self._directionPwm.duty_cycle = _translate_duty_cycle( self._direction, direction_offset, direction_scale)
class Servo: duty_min = 900000 duty_max = 2790000 duty_range = [] pwm = [] def __init__(self): self.duty_scale = (self.duty_max - self.duty_min) / 100 self.pwm = PWM(0) self.pwm.export() self.pwm.inversed = False self.pwm.period = 20000000 self.pwm.duty_cycle = 2000000 self.pwm.enable = True def set_value(self, value): value = numpy.clip(value, 0, 100) scaled = int(value * self.duty_scale) + self.duty_min self.pwm.duty_cycle = scaled def disable(self): self.pwm.enable = False
from pwm import PWM pwm0 = PWM(0) pwm1 = PWM(1) pwm0.export() pwm1.export() pwm0.period = 20000000 pwm1.period = 20000000 pwm0.duty_cycle = 1000000 pwm0.enable = False pwm1.duty_cycle = 1465000 pwm1.enable = False