110 lines
2.9 KiB
Python
110 lines
2.9 KiB
Python
# SPDX-FileCopyrightText: 2018 Limor Fried for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import time
|
|
from digitalio import DigitalInOut, Direction, Pull
|
|
import adafruit_lis3dh
|
|
from busio import I2C
|
|
from adafruit_seesaw.seesaw import Seesaw
|
|
from adafruit_seesaw.pwmout import PWMOut
|
|
from adafruit_motor import servo
|
|
import neopixel
|
|
import board
|
|
|
|
# create accelerometer
|
|
i2c1 = I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)
|
|
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c1, address=0x19)
|
|
lis3dh.range = adafruit_lis3dh.RANGE_8_G
|
|
|
|
# Create seesaw object
|
|
i2c = I2C(board.SCL, board.SDA)
|
|
seesaw = Seesaw(i2c)
|
|
|
|
# Create servo object
|
|
pwm = PWMOut(seesaw, 17) # Servo 1 is on s.s. pin 17
|
|
pwm.frequency = 50 # Servos like 50 Hz signals
|
|
my_servo = servo.Servo(pwm) # Create my_servo with pwm signal
|
|
|
|
# LED for debugging
|
|
led = DigitalInOut(board.D13)
|
|
led.direction = Direction.OUTPUT
|
|
|
|
# two buttons!
|
|
button_a = DigitalInOut(board.BUTTON_A)
|
|
button_a.direction = Direction.INPUT
|
|
button_a.pull = Pull.DOWN
|
|
button_b = DigitalInOut(board.BUTTON_B)
|
|
button_b.direction = Direction.INPUT
|
|
button_b.pull = Pull.DOWN
|
|
|
|
# NeoPixels!
|
|
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=1)
|
|
pixels.fill((0,0,0))
|
|
|
|
#################### log file for logging mode!
|
|
logfile = "/log.csv"
|
|
# check that we could append if wanted to
|
|
try:
|
|
fp = None
|
|
fp = open(logfile, "a")
|
|
print("File system writable!")
|
|
# pylint: disable=bare-except
|
|
except:
|
|
print("Not logging, trapeeze mode!")
|
|
|
|
# If we log, have some helper variables
|
|
logging = False
|
|
logpoints = 0
|
|
outstr = ""
|
|
|
|
# When its time to release the trapeze
|
|
release = False
|
|
|
|
while True:
|
|
if button_a.value: # A pressed
|
|
while button_a.value: # wait for release
|
|
pass
|
|
if fp: # start or stop logging
|
|
logging = not logging
|
|
print("Logging: ", logging)
|
|
time.sleep(0.25)
|
|
else:
|
|
my_servo.angle = 180 # open
|
|
|
|
if button_b.value: # B pressed
|
|
while button_b.value: # wait for release
|
|
pass
|
|
my_servo.angle = 0 # close
|
|
|
|
x, y, z = lis3dh.acceleration
|
|
|
|
# To keep from corrupting the filesys, take 25 readings at once
|
|
if logging and fp:
|
|
outstr += "%0.2F, %0.2F, %0.2F\n" % (x, y, z)
|
|
logpoints += 1
|
|
|
|
if logpoints > 25:
|
|
led.value = True
|
|
#print("Writing: "+outstr)
|
|
fp.write(outstr+"\n")
|
|
fp.flush()
|
|
led.value = False
|
|
logpoints = 0
|
|
else:
|
|
# display some neopixel output!
|
|
if z > 20:
|
|
# MAXIMUM EFFORT!
|
|
pixels.fill((0, 255, 0))
|
|
if release:
|
|
my_servo.angle = 180
|
|
|
|
elif z < 3 and y > 0: # means at the outer edge
|
|
release = True
|
|
# flash red when we peak
|
|
pixels.fill((255, 0, 0))
|
|
|
|
else:
|
|
pixels.fill((0,0,int(abs(z)*2)))
|
|
|
|
time.sleep(0.05)
|