Noodle is a small device with the I/O of a machine but the thoughts and feelings of a human. You can program it to monitor your physical space and react to changes in the environment with words, images, sounds and decisions.
For example, you could program it to watch your front door, and anytime someone arrives, determine if they look friendly or scary, and either let them in or call for help.
This Instructable contains three main sections: setting up the Raspberry Pi, connecting all the electronics, and creating the enclosure. Depending on what tools and materials you have access to, and how closely you want to recreate Noodle, feel free to only follow the first one or two sections. Noodle’s “brain” will still function without a body, and without all the components, or even in a different body if you’re interested in creating a new enclosure!
List of materials
We had the opportunity of creating Noodle at the Autodesk Pier 9 workshop space, which has pretty much everything you could possibly need to develop something like Noodle. But because the development process lasted over the course of a month in multiple parts of the workshop, it’s difficult to document every single item that we used. Basically, you should be able to recreate Noodle with access to a decent makerspace workshop that has some spare hardware for working with computers, and tools for basic electronics hacking.
Here are some of the parts we used (most of them available from Adafruit):
We also used a monitor, mouse, keyboard, and the wireless connection at Pier 9. We had our laptops to work with most of the time. After setting everything up, you can unplug the keyboard, mouse, and screen from the Pi and manipulate it from your laptop. For some of the devices above, they also needed USB cables for power or connectivity. If you are planning on making the enclosure relatively small, be prepared to strip, break, and reconnect the USB cables. It might be good to have extra USB connectors if this is your first time.
For fabrication we used:
1. Sign up with Amazon Mechanical Turk as a requester:
Note that it takes ~24 hours for your account to get approved.
2. In addition to a requester account, you will need an Amazon Web Services account. Click the “Developer” tab, then click “Create AWS Account”.
3. Log into the panel http://aws.amazon.com/console/ and set up your access keys. In the upper right corner, click on your name, then “Security Credentials”
4. Choose “Access Keys”, then “Create New Access Key”. Download the file (this contains your Secret Access Key) and note the Access Key ID in the console. You will need both of these to login to noodle.
5. Choose “Services” in the upper left, and “S3” and make sure it’s activated.
1. Start it running:
2. Visit XX.XXX.XX:3000. The first time you will be prompted to login. Use your AWS login credentials.
3. Create a task.
4. Manage your tasks. You can see all the tasks you’ve created and cancel them from XX.XXX.XX.XX:3000/manage.
5. That’s it. Noodle is ready to play!
In 2005, Amazon launched Mechanical Turk, a crowdsourcing (“Artificial Artificial Intelligence”) platform that made it possible to integrate human intelligence directly into software. The service was mostly aimed at businesses in need of quick, cheap, almost-mindless labor. It created a system for easily carrying out bulk tasks that would be difficult for a computer but very easy for a human. However, the platform raises many questions about the ethics and social impact of such a network, and the distribution of power within it. "I make $1.45 a week and I love it"
Artists have engaged with MTurk and explored the questions surrounding it. In Sheep Market, Aaron Koblin paid people $0.02 to draw a sheep facing left, and in Ten Thousand Cents, paid people $0.01 each to draw 1/10000th of a $100 dollar bill. In Social Turkers, I streamed my dates to the internet and paid people to watch and send me suggestions of what to say or do via text. Jeff Crouse’s Laborers of Love the user is directed through a series of questions about their sexual preferences. Once submitted, anonymous workers interpret each of the responses, searching the internet for the image or video they feel best matches, and presenting it to the user. Guido Segni’s Crowd Workers of the World Unite is a collection of 300+ commissioned spontaneous self portraits of cloud workers raising their middle finger.
Testing and troubleshooting workflow
MTurk is not primarily designed for real-time response, and it requires a bit of iteration and experimentation to get good quality results quickly. This blog post has some strategies for optimizing for speed and price, including being clear and explicit with prompts and questions, setting a high enough baseline pay, maintaining a consistent volume of jobs, and closely monitoring workers and responses. However, one of the main takeaways is that factors like time of day or week have much more effect than changes in price or question. Further, random variations in the system not tied to any factor generally outweigh most other factors, so some unpredictability has to be lived with. Also check out this paper from MIT CSAIL on optimizing realtime crowdsourcing, and this write-up on the research behind VizWiz, an app that allows blind people to use the crowd to identify visuals with real-time response.
Hopefully, if you’re jumping into this tutorial you have an innate sense for tearing things apart without much intention of putting them back together. But just in case, we’ve provided some notes here.
To open up the speaker, wedge a screwdriver into the face plate and pop it off. Then remove the four screws attaching the inner face to the back, remove the face, and unscrew the volume and power board. To get all the components free, we cut through the plastic to the wire hole with a mix of wire cutters and pliers, and wiggled the wire free.
The Blue Snowflake is incredibly satisfying to take apart. Start by unscrewing the front metal grating, then removing the four screws keeping the mic attached to the mount. The plastic backing to the mic will pop off, and you can remove the pop/windscreen. You should be left with two PCBs attached to each other via header pins.
Powering the screen from usb power
The LCD screen needs power, which you can either supply with a bench power supply, or via USB with the boost converter. The boost converter we used is tunable, so we started by cutting a USB cable in half, stripping all the wires, and checking which two wires have +5V. Then we soldered those two cables to the boost converter, and connected the multimeter to the output of the converter. Then we tuned the converter until the multimeter displayed +12V, which is a good voltage for the LCD screen. Finally, we wired the power cables from the LCD screen to the boost converter and now the LCD screen is USB powered! You can use the Pi or your computer to power the screen.
Making everything mobile
Up to this point we’ve been running off USB and wall power, but if we arrange our power connections correctly and incorporate the battery, we can make Noodle mobile. We found that there were some issues with our USB hub powering enough of the devices in some configurations. Our final configuration was to have the battery powering the Raspberry Pi and the LCD. The Raspberry Pi had used one USB port for the Wi-fi card, and the other port for the USB hub. All the other powered devices (speaker, mic, and temporarily a keyboard and mouse) were plugged into the USB hub.
The enclosure was designed with Rhino, which is currently available for free on OS X while they are testing and developing the app.
Before designing an enclosure, we had to measure every component we were sticking inside. In theory, different devices are built using their local measurement system (metric everywhere except for the USA). In practice, we found that every device came to a fairly round metric value in millimeters, even the Blue Snowflake microphone.
There are mainly two kinds of measurements we had to make: side lengths, and mounting hole positions. To make all these measurements we used a standard digital vernier caliper. For side measurements, it’s helpful to get a basic bounding box of the area that the component occupies. This will keep your components from hitting each other once you place them inside the enclosure. For the mounting hole positions, it’s important to accurately measure the hole diameters or you might create something that’s too loose or tight for the component. Instead of adding or removing small amounts from your measurements to account for design features like tight and loose fit, use your first pass at measuring to create a set of measurements that are as accurate as possible. Later it’s possible to revise these measurements after printing material tests.
When measuring mounting holes, measure them all from the same reference location rather than relative to one another. This keeps your measurement errors from accumulating.
The hardest component to measure was the Blue Snowflake which had three mounting holes in a circle that seemed to be at non-grid positions. To measure these, we measured the distance between the center of the three holes and created a triangle with those side lengths. In the end, we didn’t mount the Blue Snowflake using those holes.
This Instructable isn’t the right place to go into a thorough Rhino tutorial, but a few tips might be helpful.
This enclosure was almost completely designed using boolean operations on NURBS surfaces. So the first step was to create a box that was the right overall dimensions (150mm), then boolean intersect it with a sphere that provided the most satisfying curves. To hollow out this shape, it's necessary to create an offset surface or to simply subtract a smaller version. Unfortunately, Rhino won't let you remove one volume from the inside of another volume, they need to intersect. Also, creating an offset surface can have poor topology compared to the surfaces you get from constructing it from scratch. It's essential that the outer layer of the enclosure has good topology for making good connections to all the posts on the inside, so after testing a few different approaches we went with manually constructing a second smaller version from another cube and sphere, and creating the negative space for the single hole out of a cylinder. After boolean unioning the inner portion with the cylinder, we could boolean subtract it from the larger portion and maintain good topology. Later we realized a cylinder would mean that any cap would just fall in, so we repeated this steps using a cone instead so the hole's walls would have a slight tilt.
For all the Rhino files used for creating Noodle, see the zip file attached to this step.
Once we had a basic design for Noodle's enclosure, we wanted to create an object that approximated the enclosure without using 1kg of expensive 3d printing material. To do this, we imported the enclosure into 123d Make, which sliced the model into chunks that could be laser cut and reassembled into a single 3d object. Once we had this cardboard prototype (held together with masking tape) we could just drop all the components inside and get a feeling for where they could fit best.
Four main things guided the placement of the components:
1. Overall weight distribution. The battery rests near the bottom of Noodle to help keep Noodle upright.
2. Support material: the 3d printer uses a significant amount of support material, and you have to remove the material after printing before the print is usable. Instead of designing solid platforms for supporting the battery, for example, we used posts that the support material could be removed around. This also reduced the weight of enclosure. Similarly, the battery holder has holes in it to allow the support material to be removed in large chunks.
3. Cabling: some cables inside Noodle are shorter than others and we needed to make sure everything would run the right distance. The relative placement of the Raspberry Pi to the camera module is the best example of this.
4. A playful aesthetic: we tried to give Noodle speakers for ears and other a microphone and camera for eyes. We considered using the screen as a mouth but found it to be difficult to integrate visually.
After experimenting with the basic enclosure shape, we modeled the mounting posts in a separate file. This gave us the advantage of being able to print out a sheet of mounting posts in about 30 minutes, and we could test all our post placements without needing to run a complete 30 hour print. After some small revisions to post diameters, we imported the posts into the enclosure file and did a final boolean union, followed by some filleting on sharp and structural edges, before exporting the geometry.
Even with significant testing, some problems with the enclosure remain.
1. The walls on the battery enclosure were too thin. We recommend 3mm as a minimum for working with Objet VeroWhite when doing light structural design like this enclosure. We tried to design snap-locks on the side of the battery container, but they broke off after sliding the battery in the first time. Likewise, some sharp corners on the battery holder broke off while transporting Noodle. In general: expect VeroWhite to deform more than you expect when it is thick, but to also be more brittle than you expect and break when it's thin. Our guess for a reasonable width was based on printing a palette of objects with varying widths, but it would have been helpful to bend each of these to its breaking point to get a feeling for the material's properties.
2. We didn't model the step up converter correctly, and only measured a couple tall components instead of the complete bounding box. This means that when we tried to put the USB hub and the step up converter inside the box, they bumped into each other and only one would fit.
3. All the posts fit pretty well, as we found from our post test, but some were slightly too loose. In the end, we used hot glue to keep some of the components stuck to the mount points. We also tested some snap mounts but found VeroWhite to be too brittle at this scale to smoothly deform. With more testing, it may be possible to create snap mounts for holes like the ones on the Raspberry Pi.
Cleaning support material from a 3d print as big as this can take about 45-60 minutes. We tried something unusual at the suggestion of a shop manager, and it seemed to work. First, we spent 15 minutes removing the largest chunks of support material by hand (using some soft wooden tools and our fingers in gloves). This got us through about half the support. Then we placed the enclosure in project bag (something like a 5 liter zipper storage bag) with room temperature water, and let it sit. One hour later, we removed the enclosure to find all the support flaking off (if you leave too little support on the model during this step, we've heard the water can cause the actual model material to weaken). After removing the largest flaking chunks, we put the model into a standard water cleaning station and spent another 30-45 minutes removing the remaining 25% or so of the support.
Noodle is only in its infancy, with the basic framework and enclosure in place there is a lot left to build!
We spent a lot of time exploring computer vision on the Raspberry Pi, but in the short timeline we couldn’t incorporate any libraries. One of the best resources we found was this page describing how to use picamera with OpenCV:
The current code handles these features:
Others we would like to add include:
How to extend / improve the code
You can fork the code here: https://github.com/lmccart/noodle, and submit pull requests to have your modifications and improvements merged in.