Simple Sound Triggers with Arduino

This tutorial will allow you to play short samples (less than four seconds) from an Arduino with no extra hardware. It is based off the work of MIT group “high-low tech” and uses all free software. It will futher explain how to trigger the sound using sensors. It is generously translated into Chinese by Chris Zhang at Shanghai hackerspace Xin Che Jian:

https://medium.com/p/5065ee3de7c8

The necessary software is available for MacOS, Linux, and Windows. Arduino IDE and Audacity will need to be installed. The original tutorial provides two more pieces of code:

An Arduino library for audio playback.

A Java program for converting the audio file. Windows. Mac. Linux.

You can either open an existing file with Audacity, or record a new one, which is what Chris did to create our ghost sound. Freesound.org is a great website to download other people’s recordings. Try it out! Use the record, stop, and play icons at the top left of the program.


When deciding what sound to use, we have to consider the very small memory of Arduino — 32kB for our program + our audio. Audacity has a “resample” ability so our sound takes up less memory. In the bottom left corner, change the project rate from 44000 to 8000. Then in the Tracks menu, select Resample, and hit OK.


When powering a speaker directly from the Arduino, it won’t be very loud. In Audacity, if your sound waves aren’t very tall (low volume, low amplitude), it’s useful to use the Normalize effect. This boosts your levels as high as possible without clipping (overpowering the speaker resulting in distorted sound). Select Effect →Normalize and set the amplitude to zero before hitting OK.

Next, click and drag a portion of your sound wave (less than 4 seconds in length) and select File →Export Selected.


In the Export menu, you’ll have the option to change the file format. This is typically the difference between mp3, wav, and flac, etc. but we’re using a more uncommon file type, so in that menu choose “Other uncompressed files” and click options. Choose WAV (microsoft) as your header , and Unsigned 8 bit PCM as the Encoding.

This results in a very small .wav file that we can finally convert to store on the Arduino. The conversion program is written in Processing so for now it requires Java. Run “EncodeAudio”, which simply asks you to select that wav file you just exported. The results are stored on your clipboard, waiting to be pasted. We’re ready to open Arduino and save the file to memory.

Open the Arduino IDE and add the PCM library downloaded above. Open File →Examples →PCM →playback. It should look like this:

https://gist.github.com/jazzyjackson/08a0f968f616e589ea8b

That long list of integers is the example sound, we can replace it with the list of integers that resulted from Encode Audio. Triple-click on any of the numbers to highlight the entire line (thousands of numbers long) and use ctrl-v or cmd-v to paste our own sound.

Upload this code and the sound will play on a speaker connected to pin 11 and GND. You can either use a tiny speaker like in the doorbell tutorial, or if you have speakers with a headphone jack, wire it up like so:


GND gets attached to the tip, pin 11 can be attached to either (or both!) of the remaining silver bands. Be sure to start with the volume on your speakers turned way down, this will play full blast! Also probably don’t do this to your nice stereo cause I’m not sure if it’s safe, I just know it works.

With the current code, the sound will play once when the Arduino turns on: you can hit the ‘reset’ button on the circuitboard to play it again.

The simplest trigger possible is touching two wires together to connect GND to a sensor pin. In our loop we constantly check if our sensor pin is ‘LOW’ and if it is, we start the sound. So cut the ‘startplayback’ function from inside the setup and paste it inside a conditional statement in the loop, using digitalRead() to check if it’s connected to ground. To make sure it doesn’t go off when no one is at the door, we use the internal pull up resistor using pinMode(). This is our final code for using a simple switch to trigger a single sound.

https://gist.github.com/jazzyjackson/28fa0aaac29a8b1ba432

Notice that I changed the name of the array from ‘sample’ to ‘ghost’ — be sure to change the name in the startPlayback function as well — it’s used twice.

You’re not limited to this, of course! You can have as many different sounds as will fit on memory (so 4 seconds total) but trigger them at different times. Copy-paste that ‘constant unsigned char sample[] PROGMEM’ code and give different names to different lists of numbers. You can also use an external pullup resistor of 1 megaohm (the built-in one is only 10k) to make it touch sensitive instead of having to touch two wires together. Connect the megaohm resistor between the sensor pin (A0) and 5V. Delete the pinMode function from the setup.

The following code uses booleans to play a different sound each time the sensor is touched. This one includes our ghost sounds, so you can upload this and try it yourself. Megaohm resistor between A0 and 5V, speaker on pin 11 and GND.

https://gist.github.com/jazzyjackson/f0dac125813235e8bfa5

Have fun!

The doorbell has a boring sound. We can fix it.

ATmega328 + JQ6500 MP3 tutorial


Fellow Xin Che Jian member LuFeng came in with a good project and a stack of microchips: Microduino modules that can be programmed to play music off a memory card and a wireless doorbell that made a boring old doorbell sound. He’s new to arduino and the tutorials for these modules are fairly vague, so I thought this would be a good opportunity to write up a tutorial on using an Atmega328 and a JQ6500 to trigger sounds with a really simple program.

From left to right: UART serial programmer, ATMEGA328P, JQ6500 MP3 module, microSD module, and 2 channel amplifier

Here’s the tools we had, a really neat set of stackable modules called Microduino programmable with the standard Arduino IDE (though you might not know that by reading their website — for this ATmega328 at 5V and 16Mhz clock, you can tell the IDE that it’s an UNO, no extra hardware files are requried.)

While I used these modules to get this project to work, if you get these parts in a different format (maybe an Arduino UNO and a JQ6500 on a breakout board) the following instructions should be relevant to you, too.


So we’ll deal with two stacks separately first: the audio module with the usb port stacked on top of the memory card module and the ATmega328 stacked on the UART.

When you plug in the audio + memory card stack, two drives will show up on your PC: one is the internal storage on the MP3 decoder, you probably don’t want to touch that one. But the drive that shows up called “SD” is where we can drop our MP3s. Microduino’s wiki has some information on the necessary naming scheme: Our file will be called “001.mp3” and be placed in a folder simply named “01”


Audacity makes it easy to grab a short clip of our chosen sound: a nice piano arpeggio from a longer song. If you’ve never used Audacity, no problem, you can visit their website for a Mac or Windows executable, or if you’re on debian (ubuntu / kubuntu / mint etc) you can just open a shell and type “sudo apt-get install audacity” and it will magically be installed on your OS. File → Open your song, click and drag across its sound wave to select a portion of it, and hit play to listen to your selection. Once you’ve selected the few seconds you want to play, you can hit File → Export Selected Audio and choose your file type as MP3, save it with the filename ‘001.mp3’

With your mp3 moved to the ‘01’ directory of the SD card, we can unplug that module and start programming our ATmega328. The microduino wiki was really vague on how to write code to control the MP3 module, but thankfully it gives the model number of the IC it uses: JQ6500. So I searched for a “JQ6500 arduino library” and found something really well documented here. So download that library and add it to the arduino IDE in the usual way (Sketch →Import Library →Add Library… or unzipping into your sketchbook, whatever works for you.) Check out the example sketches, “Full Demo” and “HelloWorld”, but here’s my code to simply play the first file on bootup. (01/001.mp3)

https://gist.github.com/jazzyjackson/de8f905636a6a3a05fb5

The only part that may be different based on your hardware is line 5, the object declaration that defines what Arduino pins will communicate via software serial to the JQ6500 chip. Looking close on the underside of this particular breakout board, the default TX and RX serial pins (the ones not in parentheses) are labeled next to D2 and D3, which in Arduino IDE language corresponds simply to 2 and 3.


So I declared my object as mp3(2,3) but if you’re using a different breakout board for the JQ6500 you will have to determine which 2 pins are wired to JQ6500’s RX and TX and use those pin numbers in your “JQ6500_Serial mp3(tx, rx)” declaration. By the way, ‘mp3’ is a user definable name, it can be called whatever you want.

Once you’ve got that figured out, you can load the code to the little stack of UART + ATmega. Unplug it once it uploads, and join the two stacks together, and add the amplifier module on that, so you have a whole tower of modules. Oh, important thing to know at this point: if you try to power the stack via the audio module’s USB, it won’t work, it will try to boot into file transfer mode, so power it with the UART module or otherwise.


If everything has gone right so far, you can plug a little speaker (the aluminum 3W style pictured at the top is perfect and easy to get a hold of) into the amplifier and give it power you’ll hear your sample. Did it work for you? I hope so.

To get the sound to play only when our original doorbell rings, we have to add a conditional to our program: instead of just mp3.play() in the setup, we use an if statement in our loop so that the ATMega328 is constantly checking for an input, it’ll look something like this:

void loop(){
if(AnalogRead(A0) > 400){
mp3.play();
}
}

Our input will be the two wires that use to be the doorbell’s speaker. For this, I cut off the original speaker and soldered new wires into its place. One of these wires should just be grounded, and the other wire can be stuck into A0 for measuring.

To make a sound, the speaker is pushed and pulled by changes in voltage. ATmegas have a 10-bit analog-to-digital converter that is super useful for measuring changes in voltage. Instead of measuring if something is turned on or off (like a button, which is strictly on or off, digital, 1 or 0) the A0-A7 pins let you measure subtler changes like a speaker buzzing around in between high and low voltage (between 1 and 0 😉

The readAnalog function performs this measurement for us, and if you want to experiment with this you should try the File → Examples → Basics → AnalogReadSerial program, which lets you open the serial monitor and see what voltage the ATmega328 is measuring. When you have what-use-to-be-a-speaker wired to GND and A0, and watching your serial monitor when you ring the doorbell, you’ll see a number jump around and settle back to 0 once the doorbell stops ringing. So in the code snippet, our mp3 will be triggered whenever the voltage jumps above 0V. (the 400 is a number we pick. In arduino-land, zero volts reads as 0, and 5 volts reads as 1023. That’s just because the hardware on the chip has 10bit precision, which is to say, it can distinguish between 2¹⁰ different voltages. 2 to the tenth power equals 1024, and if you have 1024 numbers and want to start at 0, you get the range 0–1023. So any voltage it measures is returned as some number between 0 and 1023.)

However, this simple way of waiting for change in voltage is susceptible to a electronic hobbyist’s worse nightmare: noise. Even if things are wired correctly (but especially if they’re wired loosely) little spikes in charge from humans handling things or other more mysterious sources can cause a spike in measurement, thereby triggering our doorbell when no one is at the door.

A slightly more reliable way to wait for changes in voltage, then, is to use a handy feature of ATmegas called an ‘internal pullup resistor.’ This phrase didn’t make sense to me for a long time so I’ll elaborate a little: if there’s a signal that may naturally fluctuate and you want to prevent it from fluctuating, you can wire a resistor in between that signal and a power source (thereby “pulling the signal high”, making it a “pull up resistor”) or wire a resistor in between the signal and a ground source (thereby “pulling the signal down to ground” making it a “pull down resistor”). If I didn’t explain it well enough, search for more articles about it, it’s a super useful thing to understand.

ATmegas have one of these resistors built in inside the chip and it can be programmed to be connected to a power source or not (this is the magic of programmable computers…they are machines that re-wire themselves). It can keep the analogRead measurement pinned to 1023 until some other active component, like our speaker signal, interferes and pulls the voltage low (remember how the speaker gets voltage pushed and pulled? That’s why this can work by measuring from 0V or from 5V, we just want to wait for a change in voltage, doesn’t matter what direction.) So to set that internal pullup resistor and wait for a change away from 5V, our code will look like this:

https://gist.github.com/jazzyjackson/8996d6519b7cd0cbf965

Oh, and the pinMode(6, OUTPUT) and digitalWrite(6, LOW) is kind of silly, I’m giving myself an extra place on my tiny MicroDuino modules to ground the speaker. Arduino UNOs have 3 different places to GND things, but if you ever need more, you can set a pin low and it will work just the same as a GND pin. Just don’t ground something that uses lots of power, because this forces current to go through the chip.

But that’s the final program, and the final necessary wiring: old speaker pins plugged into GND and A0, JQ6500 connected to pins 2 and 3, and I’m using the 5V pin to power the doorbell. It use to be powered by 220V mains, but that part exploded for reasons I don’t need to go into detail about here. Did you ever see Wayne’s World? Fireworks. Suffice to say, this almost become a blog about how to build a replacement full wave rectifier out of diodes until it occurred to me that the parts that I want to use can be powered off 5V.

Now when the doorbell makes a sound, it triggers the arduino to command the JQ6500 to play its mp3 and we hear a nice piano arpeggio instead of a boring old simulation of a doorbell.

Shanghai Maker Carnival: A Poem of Optimism and Pessimism

All my cameras’ batteries died, so I drew a picture instead.

Really great 1930s era stadium built from stone filled with exhibitors’ tents surrounded by high-rises from every decade. Old tenements and new glass skyscrapers.

A booth where people assembled a kitted ukulele.

Mothers looking proud as their young sons soldered electronic kits.

Women my age exhibiting their hand dyed indigo fabrics and basket weaving skills, holding workshops to teach traditional crafts. People being just as enthusiastic to try basket weaving as LED blinking.

Superb LEGO sculptures.

A girl who was super stoked that I paid 20 yuan (~3USD) for their orange juice. (I was super confused, they were a coffee / juice bar, so all their bottled products said coffee/juice, and I was trying to ask if this coffee has juice in it, or does this juice have coffee in it)

Neat products. Super simple robot kits. A sweet dirt cheap LIDAR module for autonomous vehicles. Nixie tube clocks: a whole niche market fueled by soviet vacuum tubes.

Little kids operating tiny machining tools. A lathe just a foot long, a table saw that was 4 inches square. I can’t find the company that was representing there, but I found the product on alibaba. Parents were letting their kids cut and lathe and grind stuff with no safety gear and I was actually super concerned but nobody else was. Sam told a parent, ‘OK hope no one cuts their finger off’ and the dad just laughed. I’m like, ya’ll gotta tie your hair back what are you doing.

Lots of DIY laser cutters. Even little 2W lasers can blind you instantly why didn’t you build an enclosure you really should be wearing eye protection it’s not hard.

A long line of people waiting to step inside a giant safety net to pilot a quadcopter for a few minutes. A couple of quadcopters flying around outside this cage, videoing the event.

A young boy pointing up excitedly a the surveilling quadcopter in amazement. It occurs to me that if quadcopters eventually become omnipresent annoyances he might look back on the first time he saw one here.

Entrepreneurs getting to introduce hundreds of people to what their product can do. CNC machines, autonomous robots, and cute windmills all made from makerblock, pretty cool.

Entrepreneurs unable to attract a crowd to their demonstration of their variation on circuit lessons, puzzle games, or construction blocks. How they must have felt to have invested so much time to make a product and have everyone walk by to the crowded table neighboring theirs.

There’s a lot of people encouraged to make 10,000 of something to see if it will sell. So many ideas that only increase the demand for resource extraction for plastics, computer chips, and electricity.

But the air feels clean (pollution here, at least, is carried away by the breeze) and kids are building toy wind farms out of LEGOs.

Xin Che Jian in Shanghai

“New World Shopping Center”

Shanghai has always had a place in my imagination, from some mixture of movies and cartoons. “I think maybe because of Jackie Chan?” “Jackie Chan?! Jackie Chan is from Hong Kong!” “Yeah but some of his movies are in Shanghai probably, right?” So yeah I don’t know why, but I’ve always wanted to come here, and since the hacker-tour-group was moving onto Beijing the day after I arrived, I decided to stick it out with some new friends at Xin Che Jian.

It is an extremely active and welcoming community at Xin Che Jian: within hours of ■■■■■ getting in touch via IRC, we were let into the space and shown around. A couple hours after that, ■■■■■ got a commission to work on the space’s security features (name redacted due to maybe-his-visa-doesn’t-allow-commissions). So the members there are always looking for ways to improve the space and come up with new workshops: I hear they do workshops every weekend bringing in dozens of kids or adults— workshops every week is AMAZING for an ad-hoc organized community group.





They are tucked in a co-working space among design studios and probably tech-consulting firms (Wild guess, maybe I’ll ask next time I’m there). The kind of office where all the walls are made of glass and people seem to do business without a scrap of paper. There’s a nice hydroponics setup with a fat tilapia fish named Henry. There’s water-jugs converted to RGB LED lanterns hanging from the ceiling. Actually now that I look up at the ceiling I see all kinds of things hanging up: an RC helicopter, a model fighter plane, a bag of large sheets of styrofoam, and the wooden frame of an ultimaker 3D printer (lol). It reminds me of Makerspace Urbana, really, just big tables to spread out, and lots of boxes of old projects residing on shelves. Also you have to walk through a backalley to get in and you’re not sure if you’re in the right place until you see gears and LED strips.


Shanghai is an incredible place to have a hackerspace. Head east on Beijing road to the electronics markets: outdoor stalls in addition to a multi-story mall dedicated to selling electronics components. You can point to the one you want, haggle a price, head back to your hackerspace to see if it works, and come back and buy 1,000 of them if you want. My friend and I recalled all the times a project was slowed down to wait 2 weeks for a part (always faced with the dilemma, get it in 2 days, or get it cheap, I had the realization yesterday that all those parts I buy off eBay are available at the Chinese price, but I can get it today. Cause I’m in China. Mind blown.)










Linear rails, articulated arms, and motor couples, oh my!

Learning with Social-Emotional Robots


Orpheum Children’s Science Museum in Champaign-Urbana has a great resource upstairs: a closet packed full of LEGO mindstorms parts. Dozens of motors and sensors, a classroom set of Mindstorms CPUs and laptops to program them, and bins & bins full of parts.

When I started volunteering as an assistant, I was really pleased with the diversity of activities Greg Fabry stuffed into the robotics camp sessions: gum drop toothpick engineering challenges, blindfold-your-friends and ‘programming’ their movement through an obstacle course, and a good old egg drop. There was certainly a lot of learning going on, from social+teamwork to mechanics intuition (building strong things out of weak materials is a wonderful foundation for engineering).

However, I always thought it was a shame the kids didn’t get more hands on time with the expensive robotics tools that were unique to that space. The class met twice a month for less than 2 hours per session, so the actual hands-on experience with robotics was very modest. So, the next year when I was asked to lead the class, I decided I would try my own off-the-cuff teaching with as much robot building and programming as possible.

The usual LEGO bot. Photo credit: nxtprograms.com

Over the course of 2 or 3 sessions with the classic curriculum of building a simple rover and programming it to navigate obstacles, I made a few observations of how a classroom of mixed skill-sets interacts with these robots.

The kids that have experience reading LEGO build instructions (which involves lots of counting, unless you’ve already mastered estimating the lengths at a glance) get ahead while newbies make mistakes that necessitate taking the robot apart (very discouraging for a newbie). So you’ve already got a split classroom where some kids maybe get the feeling that they’re not in the right place.

And it’s the same story with programming: with 2–4 kids per laptop, it’s hard to get around the fact that the kid who’s done it before is going to take the mouse from a newbie struggling to solve the introductory problems, unless you specifically tell them not too, in which case maybe they feel frustrated and slowed down. You can get past that OK by setting the expectation at the beginning of class that people who know how to do something should instruct their less experienced teammate by pointing at the screen, not taking away the mouse, but I still never really liked the dichotomy, and it just got worse as the programming challenges quickly progressed from pre-programmed route to line-following robot. The previous curriculum had each 2 hour session introducing a more difficult programming challenge, but that quickly gets too difficult for kids who have never looked at a program before.

With all of that in mind, I set out to come up with a project that all the kids could start with a fresh slate — a build with programming challenges that none of them had encountered yet. That’s where the robot face pictured above comes in.

I decided being able to turn a motor on to make a mouth open and close + being able to twist some eyebrows up and down would allow for a lot of fun with really basic programs. I take a cue from Rachel Hellenga’s teaching style in thinking that it’s much better for everyone to use the basics in a lot of different ways instead of moving onto very specific uses of more-difficult-to-absorb knowledge.

The best part about building the robot face (A Lego CAD model to help you build your own is here RobotFaceV2.lxf, the software to view it is available from Lego here) is that it allows modular construction where groups can decide how to delegate the parts: advanced kids can pick the challenge of assembling the more complex linkages of the mouth and beginners can have fun picking out different parts to make eyeballs (they certainly don’t have to look like the example robot — so they get to be a little creative here.) If I remember right, some components were even challenging for the adult helpers, and having adults and kids work together on a problem that’s difficult for both of them is my favorite 😉

So our first lesson was simply getting things moving, turning motors on, changing the speed of the motor, learning that you can go 1 revolution at one speed, and the next revolution at another speed, and build patterns of these motor blocks to create patterns in the robot’s movement. Without much prompting there was much puppeting and kids coming up with things to say to accompany the robots miming (typical “I AM A ROBOT” stuff, but still lots of fun.) Also it’s lots of fun to make the robot’s eyebrows wiggle.

Before I had an idea of what the next activity would be, programmer-extraordinaire Caden had set up a couple of buttons to control the robot’s movements live and used his remote control face to tell a knock knock joke. After that it was pretty obvious what we could spend a few weeks on. The next session, each group was prompted to keep their laptops closed, no programming yet! One by one, tell your best knock knock joke to your group. Then decide amongst yourselves who’s got the funniest knock knock joke and in a few minutes we’ll ask each group to tell their joke to the class.

This was my favorite robotics class ever because it got started with everyone laughing at each others jokes. Kids get some ‘public speaking’ practice with each other and have to make a decision as a group, which is a good thing to get practice with, too.

Once each group settled on a joke, they were instructed to program their robots to tell the joke as puppets. They were encouraged to try different strategies, whatever it took to get their robots to talk to one another. This facilitated the different skill levels by allowing different solutions to the same problem. Some students got to try out simply lining up ‘move’ blocks with different speeds, some students got to try using timers and events, some students knew how to use conditionals to add those remote-control buttons, but everyone got to try what they knew how to do and share the result with their teammembers: because even the simplest program solved the problem of making the robot talk, there was no sense of being left behind or being slowed down. Students got to see how other teams were working and asked what their programs did (and getting one student to explain their program out loud to another is really great to see.)

When it came to testing the programs, reciting knock knock jokes along to your miming robot face was a lot more fun to fail than having your line-following robot fail to follow a line. For some reason, when trying to line up the pace of your speech with the pace of the robot’s mouth movements, it’s really funny for the robot to stop moving in the middle of a word, or to keep moving after you’re done talking — I guess because the robot flubbed a joke? Something about it had the kids laughing and I had never been in a programming class where debugging what went wrong was that funny.

Trying out lots of different ways to do the same thing also meant everyone was ready to have a crack at presenting their project at the end of the day — it was pretty much impossible to fall behind, you could just tell your joke using whatever program you had working. Getting a camera and a clapperboard (“Action! *CLAP*”) is always fun for kids, and we recorded a few takes of each groups knock knock joke.



The second iteration of the robot face involves a motor for each eyebrow and a piston mechanism that results in different eyebrow movements depending on which direction the motor is turned (the force of the motor will push or pull on the end of the eyebrow and change what direction it’s pointed.)

I finished designing this face pretty much the day before I wanted to use it, so unfortunately instead of creating build instructions I just built 4 copies. But that meant that the session after knock knock jokes could jump right into giving the robots emotions.

Before programming the robot to express emotions, we had to learn what different emotions looked like. So the activity went like this:

  • Sit everyone at a long table so each person has someone sitting directly across from them. It doesn’t matter if the kids are paired with adults or other kids.
  • Give everyone on one side of the table paper and markers.
  • Instruct everyone on the opposite side of the table to pick an emotion and express it on their face.
  • Instruct the drawing side to draw the expression with the fewest lines possible: just get the shape of the eyebrows and mouth first.
  • Ask the drawing side to guess what emotion the face-maker is trying to express. Just happy, sad, surprised, angry, that kind of thing.
  • Have everyone check their answers with the person across from them and then switch sides.

Don’t make a big deal out of it if someone can’t pick a face to make or can’t make a guess. The important thing for the kids is to spend some time focusing on an expression and practice identifying what it means. This is intuitive to some people, but lots of people have to learn what emotions facial expressions correspond to. At the end of the activity, students will have compiled a list of drawings and corresponding emotions.

The programming activity now becomes moving each eyebrow motor into position to match a drawing. This can also be a lesson in how 60 degrees compares to 180 degrees and so on, because the eyebrows only need to be moved a few degrees to change expression.

This expressive robot face now allows for a storytelling activity: think about what emotions you can get your robot to express, and write a story for the robot to tell (from his/her own perspective, i.e., come up with an identity and backstory for your robot) that would incorporate an emotion. Extra points if the robot’s emotion changes in the story and has its eyebrows move accordingly.

This allowed some of the students who were timid about building mechanisms or writing programs to express their creativity: the quietest kids had some really surprising stories for their robots to tell, and it was really exciting to see each kid decide what role they wanted to take in the project: changing the robot physically (some kids spent their time building props out of LEGO to go with their story — or adding red lights to the face to be laser cannons on their bad guy robot), writing code to control the face, or writing a script and drawing backdrops for the story.

It was a pretty long process to write and produce a story told by robots, so we didn’t get to the point of recording finished projects, but I have high hopes for this format of robotics education in the future.

The Artistic Side of Shenzhen


Imagine my surprise when I learned of a 2-week international jazz festival happening in this city, with artists from Italy, Russia, China, all over, and just my luck it was only the second day! I ended up only catching this one show, “Second Approach”, before leaving the city — a Russian trio of piano, upright bass, and singer. It was exciting to be in this kind of music venue all of a sudden, full of young Chinese jazz fans shouting for an encore.




This whole neighborhood, OCT, really surprised me after staying in the middle of the overcrowded concrete center of Shenzhen. “Overseas-born Chinese Town” is basically a reverse Chinatown, a place where people from all over the world have settled in China but brought international culture back with them. So there are patisseries and cafes and art galleries nestled among some of the most creatively-repurposed warehouses I’ve seen — giant wooden structures that let you slide down from the 2nd to the sidewalk framed by impressive and modern murals. I was pleasantly reminded of Arcosanti — a city whose architecture encourages you to climb onto roofs.





With graphic design firms and art galleries sharing renovated warehouses with shops of creative, handmade one-off goods, it reminded me of the parts of the American rust-belt whose economies are reinvigorated by the ‘creative industry’ — software, design, and technology firms, where money is made with ideas and services instead of physical goods. Many of these new businesses occupy the old warehouses of Pittsburgh, Cincinnati, Chicago and so on, and is often referred to as a post-industrial economy.

Well in OCT, these renovated warehouses are neighboring factories and shipping warehouses where business couldn’t be better. A large part of everything the world consumes is manufactured here. Foxconn is just up the road. With that, OCT struck me as a strange post-industrial utopia surrounded by the ultra-industrial reality of the world’s factories. (I expressed this while walking with some new friends, so I had to explain the notion of being “post industrial” to some people who lived in the most industrious city I’ve ever seen).





Oh my god that astronaut is fixing his flying saucer I love this place.

Hedgehog Programmer

Feb 25, 2015


This week, we all made a FabISP. Knowing we could make any shape we wanted on the Roland Modela, I didn’t think much of making a rectangle circuit board. I brought the ‘traces’ png into Inkscape, traced bitmap, and modified some of the traces to have more curves, and to fit the silhouette of a hedgehog. Just by switching what parts of my image were visible or transparent, I could make my traces file and my cut-out file for the Modela.


Burlap-Resin Composite Boat


Searching youtube for how-tos on composites, there’s lots of videos on boat-making. So I decided, what the heck, why not get started with my boat making career. I made a really rough boat-like shape in Blender and applied a subsurface division modifier to smooth it down. The only foam I had on hand was 3/4″ thick, so I scaled the model and split it into 3 layers, set them side by side in Blender, and import the whole thing into MeshCAM.

MeshCAM generatered the gcode for our 1′ by 3′ CNC machine using a 1/4″ ballnose. Milling through insulation foam with a 1/4″ bit was a real treat — I cranked the speed up to the max and watched it cut like butter. After freeing the individual slices from the foam, I just hot glued them together.

I stacked 4 layers of SuperSap soaked burlap over the foam boat form, wrapped it up in release plastic, layered felt on top of that, and stuck the whole thing in a vacuum bag. We tried using our shopvac and then our smoke sucker, which sucked the bag tight against the form, but didn’t put any pressure on it. So, I ended up setting it in the sink under a trashbag filled with water, which visibly put a lot of pressure on the form.

After unpacking the form, and ripping out the foam (it did not go without a fight), I optimistically set it in the sink full of water, where it promptly sank. It’s totally permeable to water. Gabe’s frisbee floated a lot better. I’ll probably coat it with another layer of resin and let it cure without putting pressure on it. I figure the resin would be more solid with a two part mold, filled with resin (not squeezing the resin out of the burlap). Next time!



Update, a couple of weeks later: after pouring super-sap resin over the hole-ridden burlap boat with multiple applications and slowly spinning the boat upside down, rightside up, to keep the resin moving for about a half hour and cured in the air, the boat is sea-worthy! Unfortunately, the excess resin did slowly seep down to edge of the composite and pooled there, leaving me with heavy chunks of resin that’s just weighing the boat down. I can’t think of a good way to remove this except for a hacksaw.

I’ve also figured out that I’m not a great boat designer. The shape of my hull gives very little displacement, and the boat sits pretty low in the water without any weight (except for the aforementioned excess resin). I’ll look forward to designing a boat worth sticking a motor or sail into later on in life. In the meantime, here’s my burlap boat floating in Lake FabLab (our perpetually flooded parking lot).

Original Blender file with subdivision surface.

STL Export, scaled up to millimeter units.

Being Treated to Shenzhen


Shenzhen has been a pretty wacky experience. As soon as we got out of the subway station, we were literally greeted by a dance troupe. At first it seemed like maybe they were just street performers or just practicing for some cheerleading competition, who knows, big city, right? Except it was a pretty empty part of town and we were the only audience. And after they finished dancing they took a picture with us and walked away. It was super bizarre and disorienting and at the same time effective at welcoming us to the everything-will-happen attitude of Shenzhen.

The luxury tour bus provided by Tsinghua university was a big step up from taking the subway everywhere in Hong Kong, although it was always a little unnerving having little information on what the plan was, where we were going, how long we were going to be on the bus, that was always a mystery.

Basically, a cheerful woman meets us at the subway station and says she has a bus for us outside, and we gladly duck into the air conditioning. She welcomes us to China and introduces us to her co-workers (tho at this point we don’t know anything about her company) and one of her coworkers sings a song a capella over the bus’s PA. OK. We spend an hour driving on the highway through the city and the scale of this place become apparent. Unlike every other city I’ve been in where you drive out of the city center and the building get shorter, it seems that pretty much any residence here is required to be 40 stories high. Just endless high rises, with new ones being constructed right beside them. The only way you know you’re ‘downtown’ is when the high rises are covered in animated LED displays.

So we make it to Harbor School after weaving our way through a construction site with big signs for ‘special economic zone’ and I’ve written a separate blog about it cause it was awesome:

https://medium.com/p/e3bae07d8be7


And afterwards we had dinner at a great hot pot place, all paid for by our hosts (again, still unclear at this point on why they were treating us so well and who they were. Like I’m sure it was mentioned but I don’t know the name of any of the companies so it didn’t stick.) The next day it became more clear who are hosts were as we toured their factories that are owned by a company that has a partnership with the university. I’ll blog more about the factories separately, but after a few factory tours we ended up at this place:





It’s the showroom for this company 3Nod, and it took a while to figure out what the company did. The 3D room sized screen intro video communicated that they were all about creating a better future (implication: for wealthy people who live in spaceships). But the showroom was full of bluetooth speakers and headphones. Their vision of a smart home was just projector walls (a la Fahrenheit 451, surrounded by TVs…) I liked the style of the furniture, though one of my compatriots pointed out that they’d be pretty useless in practice, unless you can do all of your work via touchscreen.

Also the lights kinda clicked on and off without warning, the screens seemed to react to your gestures but didn’t do a great job (cause it’s Kinect based and it’s unreliable and everyone moved on from arm-wavey-HCI decades ago) so it seemed like their vision of the future was full of glitches and really needless technology stacks. There’s four projectors for that one wall. That’s like 2kW to have a bamboo forest by your couch. It would literally take less energy to just grow bamboo in your living room.

I really liked the couch tho.

Anyway we briefly met with Richard up in his office full of cigars and brandy. Very hollywood personality and attire. He kind of just pitched his company and his personal story to us without any context of why he’d invited a bunch of hackers/makers for a tour. He wanted to meet with Mitch and suggested the rest of us continue a tour of the building and hang out in his office on the top floor where he entertains. So there we were, a dozen idealists walking around gawking at this guy that makes his millions selling headphones with Wil.i.am. Alex took on entertaining us with piano and Jona performed a Chinese tea ceremony.

I noted that even surrounded by ostentatious wealth, sitting on plush couches, people still turn to their smartphones when they’re bored. Nothing all that exciting about it.

Ah, but no one is checking their phones in this last photo — we caught a ride to ShenzhenDIY. Well, the bus got us to the neighborhood but didn’t want to go onto the skinnier streets, so it was a nice walk. First past bustling markets with flashing LED and neon signage, electric bikes and mopeds weaving through people crossing the street, then through a dark alley with unfinished pavement such that a flashlight was necessary not to trip. Up a few flights of stairs in an old concrete building that I later learned housed a clothing factory and a Japanese sword factory (wait what?) we made it to the first real hackerspace of China, a tight community of people excited to meet visitors and share projects and passions. A DIY car chassis sat behind a comfy couch. Guitars and mixing boards sat against the wall. People passed around the microchips they were excited to write programs for. We went in a circle introducing ourselves and an expat member of the space announced in surprise that he is also from San Antonio, and he has never been in a room with so many Texans in China (two people in our tour group in the same room, pretty easy record to beat!)


A couple of friends and I went back the next day thanks to Yuheng opening the space for us to take advantage of the wifi and air conditioning. Here’s his github. He told us he’s writing a programming language with formal syntax to prove logical theorems (it won’t but the first, but it’s still an awesome project to write your own language). He was also interested in the design of spoken languages and introduce me to Toki Pona, an invented language of 120 words. He told us this was the first time he had a conversation with people speaking English which really surprised us and we asked how he learned, he said just talking along with American TV and movies. He also played a pretty mean Nirvana cover with one of the hackerspace’s guitars. Very inspiring dude.

Oh and this is the hackerspace that opened a second space at Harbor School, so they’re reaching out to the wider community and just being awesome.

Maker Education in Shenzhen


Our tour bus made its way through a construction site, backing up and doing 3 point turns (pretty good bus driver) running into dead ends trying to get across to this brand new school, “Harbor School”, finished a month ago. I didn’t realize it at first but I guess our visit was a sort of inauguration for the school’s makerspace. We met the headmaster, who was really passionate about the idea of project based learning, enough to successfully argue for the funds for this really beautiful space, stocked with Raspberry Pi for all the computers, LEGO-look-alike robot kits, soldering irons and LittleBits.





The school as a whole was really impressive, like I was jealous I didn’t get to go there. They had their own dinosaur skeleton and in the common spaces by the stairwells there were TVs playing “Planet Earth” and also the biggest laser cutter I’ve seen in my life.




There were a couple of American guys that worked there that we chatted with. If I remember right, one of them was there because he had done a lot of maker education and was hired by the school, and the other guy had been hired by the government to determine a way to get maker education to fit in with the curriculum.

This is a really interesting problem in China as well as the USA: we’ve got these really rigorous point by point learning goals that at a certain age you’re supposed to have a particular skill. When you require that people meet goals, you introduce the problem of evaluating whether or not the goals are met, resulting in the tremendous problems created by standardized tests, teaching to the test, etc. But now we’ve got thousands of teachers (American and apparently Chinese, too) who see the engagement and creativity that comes out of project-based learning / maker education. If you want to see a wider adaptation of this style of learning, however, you still have to be able to evaluate it in a way that proves the standards are being met (until such a time that standards can be done away with ;).

So that’s what this guy’s job was (if you’re reading this, email me!): coming up with a way to evaluate students who have learned in a classroom that wasn’t teaching to the test: but building stuff, being creative, following their own passions. How do you prove to a bureaucracy that they’re learning better than someone who studied what would be on the test? Cool job, I hope to keep up with his progress.

I’ve got high hopes for the kids growing up here. They’re going to be building all kinds of cool stuff. Maybe futuristic trains, telescopes, rocket ships and submarines like the poster on their wall 🙂