Introduction: Auto-Turret With Pixy and Nerf Gun

About: The RobotGeek team is a 6-man operation that wants to make it even easier to use Arduino to make electronics and robots. Check out our instructables and for all of our awesome kits.

With the Auto-Turret Project, you can automatically track down and fire upon your enemies! This project utilizes a Pixy camera module, a RobotGeek pan/tilt base, a foam dart gun, and a Geekduino to coordinate the components. The Pixy can be 'taught' to recognize different colors, and when it 'sees' an object with the matched color, it will send data to the Geekduino. The Geekduino will then move the pan and tilt servos so that the object is in the center of the Pixy's field of view. If the object stays still for too long, the foam dart gun will engage, firing a dart at the object!

Step 1: Project Parts List

This project is an amalgam of several RobotGeek kits. Each part is necessary to complete the kit as it is made in this guide.

If you would like to build this project and you already have an Arduino/Geekduino board, you can use the Robot Geek Pan and Tilt Kit w/ Servos instead of the RobotGeek Desktop RoboTurret. You should pick up a Sensor Shield for easier, safer wiring.

Step 2: Getting Started

You should have followed through the getting started guides for each of the kits and ran the test code. If you haven't completed these, follow through the guide with the links below, and return here when you're finished for further instruction.

The Pixy Getting Started Guide will run you through getting the latest firmware, which is necessary to run the version of the Arduino code available in this guide.

Step 3: Assembly

You should have assembled the kits while following the getting started guides. If not, follow the Assembly instructions for each of the kits using the links here. Once you have completed these, return here for further instruction.

You are going to build the Pixy Mount shown in Option 1 in the Pixy Mount Assembly Overview, attaching it to the Servo Side Mount Bracket. Once you have assembled the Turret with Dart Gun, attach the Pixy Mount with Side Bracket to the Trigger Servo using 4 x M2*6 Bolts, with the camera oriented upside down. This places the camera as close to the barrel of the gun as possible while leaving enough clearance for access to the camera's USB and Ribbon Connectors.

Step 4: Wiring

We will be using the Pixy's Breakout Cable to wire this project.

Device Sensor Shield Port
Pixy Black Wire GND GND
Pixy Red Wire 5V (in or out) VCC 5V
Trigger Servo RobotGeek 180 Servo Digital Pin 3
Pan Servo RobotGeek 180 Servo Digital Pin 5
Tilt Servo RobotGeek 180 Servo Digital Pin 6
(Optional) Laser White -'S' Black -'G' Digital Pin 10
Pixy Yellow Wire SPI MOSI, UART TX, GPIO2 Digital Pin 11 (to Signal 'S' Pin)
Pixy Brown Wire SPI MISO, UART RX, GPIO0 Digital Pin 12 (to Signal 'S' Pin)
Pixy Orange Wire SPI SCK, DAC OUT, GPIO1 Digital Pin 13 (to Signal 'S' Pin)

Note that not all of the wires on the Pixy's breakout cable are used for this project, leaving you with a bit of a wire mess. Cable ties are useful for managing this.

When wiring with the Sensor Shield, be mindful of your jumpers. Note that the top jumper is set to VIN. This allows your board to send power directly from source to your servos.

You can also wire this without the sensor shield using a pan/tilt kit, foam dart gun kit, Pixy, breadboard, jumper cables, and pin headers.

Note that we've plugged VIN into the voltage rail on the breadboard. This is great for our servos. Do not under any circumstance plug any 5V devices into this rail. Doing so will cause potentially irreversible damage to your device.

Step 5: Arduino Turret With Dart Gun and Pixy Code

You can download the code sketch here:

Extract the code into your Arduino sketchbook folder. You can find roboTurret3_dartGun_Pixy.ino under:

File -> Sketchbook -> desktopRoboTurretV3 -> roboTurret3_dartGun_Pixy

Now load the sketch onto your Geekduino. If everything is hooked up correctly, the servos will move to home position (center).

Step 6: Running the Code

  1. Plug in your Turret using a 6V Power Supply. All of the servos should move to home position (center).
  2. Hold down the white button on the Pixy until the LED on the front turns red. Let go of the button and find an object of the color you would like the Turret to track, and hold it in front of the Pixy's camera. Press the white button once more to lock in that color.
  3. Your turret should now be tracking that color. It may try to fire soon after being trained.
  4. For safety, unplug your turret. Load your turret by pulling on the gun's plunger until it clicks into place, and placing a dart in the chamber. Don't look directly into the chamber.
  5. Plug your turret back in, and get ready to move! The turret is active, loaded, and ready to hunt down anything of the color you've trained it.

You can leave the Geekduino plugged into your computer's USB port for this process if you would like to see what is happening on the serial monitor. You can also plug in your Pixy via USB and watch it track your object using PixyMon.

Step 7: Going Further

So now you should have an Auto-Turret that tracks down a color. What can you do at this point? Plenty!

  • You can make a game! By outfitting a second Nerf gun with a shield of the color you would like to track, and a few FSRs, you can pit your reflexes against robotic accuracy!
  • With a few code changes and a potentiometer, you can set the time delay before the robot fires manually.
  • Can you make this work with a gun that has multiple rounds? There is a line of code that allows for the trigger to fire a set number of times before disengaging.
  • Maybe adding a buzzer and LEDs to indicate the turret's mode would be worthwhile?
  • If you want to get dangerous (and hold us harmless), this code will work with some minor modifications depending on your hardware, and you could use it to power an automatic paintball turret, for some extreme paintball matches.

Most of all, you should do something that you enjoy and have fun learning with Arduino programming!