PantryBot
PantryBot is by far the largest and most complex project to which I have contributed. The robot was developed over the course of two semesters with a budget of $4000. PantryBot was partially sponsored by Jim Osborn of the CMU Quality of Life Technology Center. The wooden gantry stands at 9 feet tall and is 10 feet wide, with the elevator suspended from two rails.
My contributions to the project were primarily electrical, although I was also involved in the construction of the gantry. The robot is powered by an Apevia 500W computer power supply unit, which provided 3.3V, 5V, and 12V power rails. The elevator is controlled by an Arduino Mega, which moves the module in space by sending PWM signals to VHN5019 motor drivers. It uses an encoder for horizontal position and a roller switch combined with a set of precisely calibrated "bumps" on one of the elevator's vertical posts for height. All limit switches are debounced using Schmitt trigger RC filters. The Arduino Mega also monitors the safety systems, which include capacitive plate sensors in the outer frame and infrared sensors on the bottom facing either side. To reduce computation, I opted to feed the infrared outputs through RC low-pass filters to reduce noise and then into LM339 comparators. These comparators had a reference voltage corresponding to a distance of one foot. All the comparator outputs were then combined in a wired OR configuration. The entire system reduces six noisy analog signals to just one digital signal. All communication is serial; the Arduino Mega is connected via USB to the main processor and to the module's Arduino Uno via two shielded wires.
The module is controlled by an Arduino Uno fixed to a custom shield in order to conserve space. All functions of the module minus the vision LEDs are controlled by this Arduino, including moving the arms and fingers, changing the width of the arms, and lighting the colored LEDs in the module's side panels. The arm motor produces a lot of noise, so MOSFET circuits were introduced to cut power to the finger-driving servos when not in use. Due to the lower power requirement, I opted for the less expensive L298 motor driver to run the arm motor. This had the added advantage of returning a 5V supply to the control board, allowing the module's 5V components to draw current from the higher-capacity 12V rail. The arm width is controlled by a pair of Mercury stepper motors driven by A2988 stepper motor drivers. Like the module, all limit switches are debounced using Schmitt trigger RC filters.
My other major contribution to the system was the GUI and underlying data structure. Together with several of my teammates, we designed and wrote Python code for a custom data structure built around linked lists and dictionaries. The Pantry was a dictionary that contained Shelves, which acted as a linked list of Groceries. Each Grocery object was also a dictionary of that particular item's properties, including name, size, location, and neighbors. I personally created the GUI, which includes a scrollable visual inventory of the pantry's contents, using Python's TkInter GUI libraries.
You can download a copy of our final report here.