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