code.py
1 # SPDX-FileCopyrightText: 2020 FoamyGuy for Adafruit Industries 2 # 3 # SPDX-License-Identifier: MIT 4 5 """ 6 This example script shows the usage of servos, and LEDs 7 used simultaneously without interrupting each other. 8 """ 9 10 import time 11 import board 12 import digitalio 13 import neopixel 14 import pwmio 15 from adafruit_motor import servo 16 17 pixels = neopixel.NeoPixel(board.NEOPIXEL, 1) 18 pixels[0] = (0, 0, 0) 19 20 BLINK_LIST = [ 21 { 22 "ON": 0.25, 23 "OFF": 0.25, 24 "PREV_TIME": -1, 25 "PIN": board.D5, 26 }, 27 { 28 "ON": 0.5, 29 "OFF": 0.5, 30 "PREV_TIME": -1, 31 "PIN": board.D6, 32 }, 33 { 34 "ON": 1.0, 35 "OFF": 1.0, 36 "PREV_TIME": -1, 37 "PIN": board.D9, 38 }, 39 { 40 "ON": 2.0, 41 "OFF": 2.0, 42 "PREV_TIME": -1, 43 "PIN": board.D10, 44 } 45 ] 46 47 SERVO_LIST = [ 48 { 49 "MAX_ANGLE": 180, 50 "MIN_ANGLE": 0, 51 "PREV_TIME": -1, 52 "PIN": board.A1, 53 "DELAY_BETWEEN": 0.05, 54 "SERVO": None, 55 "MOVE_BY": 5 56 } 57 ] 58 59 for cur_servo in SERVO_LIST: 60 pwm = pwmio.PWMOut(cur_servo["PIN"], duty_cycle=2 ** 15, frequency=50) 61 # Create a servo object. 62 cur_servo["SERVO"] = servo.Servo(pwm) 63 64 65 for led in BLINK_LIST: 66 led["PIN"] = digitalio.DigitalInOut(led["PIN"]) 67 led["PIN"].direction = digitalio.Direction.OUTPUT 68 69 while True: 70 # Store the current time to refer to later. 71 now = time.monotonic() 72 73 for led in BLINK_LIST: 74 if led["PIN"].value is False: 75 if now >= led["PREV_TIME"] + led["OFF"]: 76 led["PREV_TIME"] = now 77 led["PIN"].value = True 78 if led["PIN"].value is True: 79 if now >= led["PREV_TIME"] + led["ON"]: 80 led["PREV_TIME"] = now 81 led["PIN"].value = False 82 83 for servo in SERVO_LIST: 84 if now >= servo["PREV_TIME"] + servo["DELAY_BETWEEN"]: 85 try: 86 servo["SERVO"].angle += servo["MOVE_BY"] 87 except ValueError as e: 88 89 if servo["MOVE_BY"] > 0: 90 servo["SERVO"].angle = servo["MAX_ANGLE"] 91 else: 92 servo["SERVO"].angle = servo["MIN_ANGLE"] 93 94 95 if servo["SERVO"].angle >= servo["MAX_ANGLE"] or \ 96 servo["SERVO"].angle <= servo["MIN_ANGLE"]: 97 98 servo["MOVE_BY"] = -servo["MOVE_BY"] 99 100 servo["PREV_TIME"] = now