Attention: Safety Recall of Vernier Go Direct Charge Station. Click to learn more.

Controlling a Mousetrap with a Photogate

In 1984, Dave Vernier wrote the book How to Build a Better Mousetrap and 13 other Apple II Projects. The title project of this book was a somewhat whimsical mousetrap that used a photogate placed in a box to detect a mouse and then used a stepper motor to lower the door on the box to catch the mouse. Even though the stepper motor was fairly slow at lowering the door, the trap worked well to catch quite a few mice (or perhaps to catch one mouse many times).

This sketch is for the Arduino version. The stepper motor is attached to the DCU. A pulley on the stepper motor has string wrapped around it. This string goes over a pulley and holding up a vertical sliding door. 

How to Build a Better Mousetrap and 13 other Apple II Projects - by David Vernier
  VernierMousetrap (v 2017.07)

  A Vernier Photogate should also be connnected to the second BTD 1 connector.
  The sketch monitors this photogate and Controls a stepper motor (unipolar or
  bipolar) via a Vernier Digital Control Unit (DCU) connected to the BTD 2

  This sketch will continuously check the photogate and start the stepper
  motor rotating when the photogate is blocked. External power must be supplied
  to the DCU to drive the stepper motor.

  This version uses the VernierLib library

  See for more information.

#include "VernierLib.h"
VernierLib Vernier;
int photogateStatus = HIGH;
int stepDelay = 30; //step time in ms
int stepCount = 55; //number of stepCount to take
int stepDirection = 0; //stepDirection 0 =CW
int photogate = 2; //This is the input for a photogate on the BTD 1 connector
int LEDpin = 13; /// line for LED to turn on when photogate is blocked

void setup()
  Serial.begin(9600); // set up Serial library at 9600 bps
}// end of setup

void loop ()
  Serial.println(" starting loop, waiting for mouse... ");
  photogateStatus = digitalRead(photogate);//low when blocked
  if (photogateStatus == LOW)
    digitalWrite(LEDpin, HIGH);// turn on LED
    Serial.println("  Blocked ");
    Vernier.DCUstep(stepCount,stepDirection, stepDelay);// use stepper motor to lower door
    Vernier.DCU(0);//Turn off all lines
    delay (10000); //wait 10 seconds, note that the Arduino/shield LED will stay on
    digitalWrite(LEDpin, LOW);// turn off Arduino/shield LED  when ready to trap again
    Vernier.DCU(0);//Turn off all lines
    digitalWrite(LEDpin, LOW);// turn off LED
} ;// end of loop