print("Starting dual_spin script.")
import math, time
import board
import pwmio
from digitalio import DigitalInOut, Direction, Pull
#--------------------------------------------------------------------------------
# Class to represent a single dual H-bridge driver.

class DRV8833():
    def __init__(self, AIN1=board.GP18, AIN2=board.GP19, BIN2=board.GP20, BIN1=board.GP21, CIN1=board.GP6, CIN2=board.GP11, pwm_rate=20000):
        # right paddle
        self.ain1 = pwmio.PWMOut(AIN1, duty_cycle=0, frequency=pwm_rate)
        self.ain2 = pwmio.PWMOut(AIN2, duty_cycle=0, frequency=pwm_rate)

        # middle gear
        self.bin1 = pwmio.PWMOut(BIN1, duty_cycle=0, frequency=pwm_rate)
        self.bin2 = pwmio.PWMOut(BIN2, duty_cycle=0, frequency=pwm_rate)

         # left paddle
        self.cin1 = pwmio.PWMOut(CIN1, duty_cycle=0, frequency=pwm_rate)
        self.cin2 = pwmio.PWMOut(CIN2, duty_cycle=0, frequency=pwm_rate)

    def write(self, channel, rate):
        """Set the speed and direction on a single motor channel.

        :param channel:  0 for motor A, 1 for motor B
        :param rate: modulation value between -1.0 and 1.0, full reverse to full forward."""

        # convert the rate into a 16-bit fixed point integer
        pwm = min(max(int(2**16 * abs(rate)), 0), 65535)

        if channel == 0:
            if rate < 0:
                self.ain1.duty_cycle = pwm
                self.ain2.duty_cycle = 0
            else:
                self.ain1.duty_cycle = 0
                self.ain2.duty_cycle = pwm
        elif channel == 1:
            if rate < 0:
                self.bin1.duty_cycle = pwm
                self.bin2.duty_cycle = 0
            else:
                self.bin1.duty_cycle = 0
                self.bin2.duty_cycle = pwm
        else:
            if rate < 0:
                self.cin1.duty_cycle = pwm
                self.cin2.duty_cycle = 0
            else:
                self.cin1.duty_cycle = 0
                self.cin2.duty_cycle = pwm

#--------------------------------------------------------------------------------
# Create an object to represent a dual motor driver.
print("Creating driver object.")
driver = DRV8833()

led = DigitalInOut(board.LED)  # GP25
led.direction = Direction.OUTPUT

# for LEFT sensor:
left_sensor_switch = DigitalInOut(board.GP15) # left sensor
left_sensor_switch.direction = Direction.INPUT
left_sensor_last_value = False


# for RIGHT sensor:
right_sensor_switch = DigitalInOut(board.GP14) # left sensor
right_sensor_switch.direction = Direction.INPUT
right_sensor_last_value = False

ball_sensor_1  = DigitalInOut(board.GP13)
ball_sensor_1.direction = Direction.INPUT
ball_sensor_1_last_value = True

ball_sensor_2  = DigitalInOut(board.GP12)
ball_sensor_2.direction = Direction.INPUT
ball_sensor_2_last_value = True
#--------------------------------------------------------------------------------

def move_gear():
    # channel == 1
    driver.write(1, 1)
    time.sleep(1.0)

    driver.write(1, 0.0)
    time.sleep(1.0)

    driver.write(1, -1)
    time.sleep(1.0)

    driver.write(1, 0.0)
    time.sleep(1.0)

print("Starting main script.")

right_paddle=1  #right paddle direction
left_paddle=1 #left paddle direction
middle = 1 #middle gear direction
speed = 0.70
counter  = 0
balls_detected  = 0;
while True:
    balls_detected  = 0;
    driver.write(1, middle*speed) #spin gear
    driver.write(0, right_paddle*speed) #spin right paddle
    driver.write(2, left_paddle*speed) #spin left paddle
    if right_sensor_switch.value is True:
        if right_sensor_last_value is False:
            right_sensor_last_value = True


    else:
        if right_sensor_last_value is True:
            right_sensor_last_value = False
            right_paddle=  right_paddle *  -1 #switch direction of right paddle

    if left_sensor_switch.value is True:
        if left_sensor_last_value is False:
            left_sensor_last_value = True



    else:
        if left_sensor_last_value is True:
            left_sensor_last_value = False
            left_paddle=  left_paddle *  -1 #switch direction of  left paddle
    counter = counter +  1
    if counter is 5000:
        counter = 0
        middle = middle * -1 #switch direction of gear
    if ball_sensor_1.value is  False:
        balls_detected = balls_detected + 1
    if ball_sensor_2.value is  False:
        balls_detected = balls_detected + 1
    if balls_detected is 0:
        speed = 0.75
    if balls_detected is 1:
        speed = 0.85
    if balls_detected is 2:
        speed = 1

Karen Abruzzo, Emilie Zhou

Description

Our intent was to create a game where users can drop marbles from the top of the tile and earn a different number of points based on where the marble lands on the bottom of the tile. There are seven different dips of varying sizes where marbles can fall into. The dip in the middle is the largest and the sizes of the dips are smaller the farther they are from the center. Other components, such as a spinning gear and rotating paddles, will affect the way the marble falls as well. The toothed gear is constantly spinning but changes directions every few seconds. The two paddles rotate left and right and have sensors that detect when a marble has landed on it which then causes the paddles to change the direction that they’re rotating in. There are also two other sensors above the end dips that cause the paddles to rotate faster if a marble lands in either of those dips. The final outcome is a game where users have to time when they drop the marbles in order to try and get marbles in all the holes on the bottom while accounting for the other various moving components that the marbles will come into contact with.