Liveable Interactive Music Player

Introduction

My final project for Physical Computing eventually ended up to be an MP3 player that encourages you to take care of your houseplant. This evolved from a previous idea of making a plant that is more like a pet than a plant. I changed my mind after getting some good feedback from my class when I presented my idea. One of their suggestions was to focus on the emotional aspect of how the plant makes you feel. They also advised that care of the plant needs to be an important aspect of the project.

This is how it works: Press the moisture test button. If the soil is dry, the plant will cry; otherwise, it will laugh. If the soil isn’t dry, you can use the MP3 player. You can advance forward and back through an array of music files. You can also pause the music.

Test Button
Test Button


Not only do you care for your plant, it seems like your plant cares for you, too. Although the interface for this project ended up being dainty and pretty, I do admit that 90% of my time on this project seemed to really be spent on code and trying to get things to work. I’ve written about this project in previous posts, so I won’t recap what I’ve discussed in those. But, they’re here if you are interested in reading through them and understanding more about how the project was generated.

Process Description

Because I wanted to embed the interactive mechanics inside the plant, I spent about 1 week on the wave shield and, while I did get it to work, in the end still couldn’t get it to work so well. Some of the issues I had with it were that I didn’t understand the documentation clearly, the code is in some C-language, and my SD card wasn’t formatted correctly. Eventually, I did get it to work, but by that time Minim was looking pretty good. So, sound was now going to be handled by Processing. I also tested out different motion detection sensors to see what types of results I could get that would fit my needs best. Some of the issues I had were that the sensors were too bulky to elegantly embed inside the plant or the serial data I got from the Arduino was too sensitive.

Meanwhile, I was also thinking about my ICM final and how I wanted to create something separate from my Phys Comp final. Originally, I wanted to make a radio that streamed internet radio stations. However, when I discussed this idea with more knowledgeable people and looked it up online, I got the impression that it would be very difficult to implement. So, I left that idea behind and went to my next idea, which was simply an MP3 player. Wanting to make something more interactive and pretty, I started looking up options for Processing and Minim, and what type of visual display I could make. I looked around for an “audio visualizer” on OpenProcessing.org and found this sketch to work with. After that, I spent a little bit of time everyday trying to figure out how the code worked and augmenting it bit by bit to create something new.

By now, it became obvious that I should just put the two projects together. Deciding to use Minim for my Physical Computing project was a huge relief. Not only was it easier to use and had documentation I could understand, it was also easier to get help since Minim is something that other people at ITP have actually worked with on a somewhat frequent basis. (It’s also in the book).

Plus, I could research more about Minim while I was away at a conference in London for a few days. When I got back the States, I went back to the prototype I’d set up before I left using FSRs as triggers for the playback buttons. The FSRs I switched out for exposed wires, because I really didn’t need the analog input values the FSRs provided. (Plus, I seem to have a tendency to destroy my FSRs.) What I really needed were simple HIGH and LOW values from a digital switch which I made out of small sheets of copper.

To test the soil for its resistance to electrical current, I made what could easily be called the simplest switch ever. Add 2 nails + 5V + ground to wet soil. Test for current. Actually, I learned how to do this from reading the internet, the blog of another student,and talking to yet another knowledgeable person.

As I understand, this switch works when the resistance of the soil changes enough to allow a current to flow more freely. At first, I tried this out with just a bowl of water, but I think maybe it shorted out (?) – you really need a plant or at least the soil to get this to work properly. I also added an LED for my own visual feedback.

So, now I had the buttons and the plant. Eventually, I also had a pretty nifty audio visualizer (which at the time of this writing, I may still try to improve upon). So, finally, I just had to assemble the pieces.

Pretty much I just found whatever I had lying around. I found a picture frame in the junk shelf and used that for the frame. I also had some pieces of cork lying around for a bulletin board I never put on my wall, and I used that to cover the frame and to be a backing for the buttons. The whole construction phase literally took just 1 day. Most of my issues with this project were with the code. Luckily there are more knowledgeable people around who can offer help with the code. It also made it a lot easier to test the switches when the wires were not stuck in a plant.

Now that I’m done with the simplest of functionality, to improve it here are a few things I could do:

  • Make a sturdier interface – use something other than cork
  • Label the buttons
  • Provide more feedback when a button is pressed, such as an LED
  • Make the hardware smaller – so that it could fit into other plants or could be portable
  • Make the hardware wireless – so it can work with your iTunes playlist or another array of music files; e.g., it would just give the go ahead that the plant is well watered and you can now play music
  • Use a larger array of sound files, such as from your computer’s music library or a specific playlist you’ve selected. The issue with this improvement is that Minim doesn’t seem to like audio files that are not .wav or .mp3

Flickr Photos!

Play and Next buttons - more photos on Flickr!
Back and Next buttons - more photos on Flickr!

Using Arduino and Processing together

Today I got up early and fooled around in Processing…for hours. I was playing with the Minim sound library, which I’d planned to use for my Intro to Computing Media project, an mp3 player. After sitting around for so long, I could how I was getting both noticeably older in age, but also wiser about Minim. Why sit around and program something completely different when I could put the two together? Well, my fear with combing my two projects, ICM and PhysComp, was that I’d skimp out on one or the other and not fully challenge myself. However, due to the MEX conference – to be blogged about soon! – my schedule is shorter than I’d like. Something’s gotta give. Sadly, it’ll have to be a little bit here and there on my projects.

Anyway, today, I worked on combining my Arduino code and my Processing code using serial output to play a song. Before discussing this, a little recap:

Create the code to turn on/off LEDs set at a threshold. Using the map() function and an if/else statement, I can now reliably turn off and on an LED as though it were a switch.
Here’s the code for the mapping and if/else statement part:

phoVal1 = analogRead(phoPin1);
  //map the photocell values and turn on the light
  phoVal1 = map(phoVal1, 0, 255, 255, 0);
  if (phoVal1>=0) {
    digitalWrite(pholed1,HIGH);
  }
  else{
    digitalWrite(pholed1,LOW);
  }

Here’s the code for the FSR:

FSRValue = analogRead(analogFSR); // read the left FSR value
  analogWrite(motorpin, FSRValue/4);

The next step was to combine this code with the Minim library in Processing. But first, write code in Processing! Here is where several hours with Minim came in handy. I was able to hobble together enough code to be able to play and pause a song. I haven’t yet created any arrays, for a media list, but that’s next, as well as the ability to move through the array. After that I sent the output in serial DEC to Processing. I just added this little bit of code:

if (xpos > 100){
 song.play();

After that, I was able to use the serial output from the FSR and Photocell to trigger the song.play(); function. I suppose, I could find a audio visualization program to tweak, so that I can make a pretty picture show when a song plays, assuming I play a song.

Next I’ll need to refine all the code, and plan out more of how I want the sensors to interact with the plants. And, I need to get some plants.

UPDATE: Code is not working as expected. Processing is just playing a song when the sketch is run. I need to figure this out some more.

ICM Week 8: Midterm! My fortune telling, Magic 8 Ball calculator

Fortune Calculator


Last week we discussed ideas for our midterm and I presented something I’d been thinking about since Week 4. My idea was to create a calculator that doesn’t work…or works more like a Magic 8 Ball than a calculator. It actually does add and subtract but what you get are strings, not numbers.

When I started working on it, I was going crazy trying to figure out how to create a class for every property that a button would have – rollover detection, button press detection, the value of each button, and how to store the value of each button so that you could actually do a calculation. Then, it was suggested that I use a library to create the buttons. (Duh.) I chose ControlP5. Admittedly, using the library was a revelation and it helped me progress my work forward by at least a week. I think I would have lost it if I had to create an entire button class in a week, and figure out how to make the rest of the calculator work.

So after all that, I again got help adding the buttons and creating the first of 2 switch statements to determine button press. The second, I made on my own. But, eventually I was able to do a lot of work alone, creating the array of strings, calling the functions to print the strings, creating outlines for the buttons, and adding the ability to subtract. I also added buttons to the calculator that have nothing to do with math at all. Like a ‘Q’ button, an ‘&’ button, and a ‘?’ button. I may create put in other mathematical operators, ‘*’ and ‘/’ so that it seems more like a true calculator…we’ll see.

I am disappointed that the ControlP5 library doesn’t have much in the way of customization of the buttons. The text is really tiny and I’d prefer to make it look more calculator-like. Eventually, maybe I will end up creating a button class and then be able to modify the look a little bit better. For now, I’m happy that I have a calculator that (mostly) works.

If you use it, remember that it can only add or subtract two numbers. If you do a compound calculation, like ‘N + Y – R & S’, you’ll get results from the last operator used, in this example ‘&’. It also works best if you ‘Clear’ your results after each calculation.

Fortune telling, Magic 8 Ball Calculator

ICM Week 5: Objects and Data Input

ICM Week5

So, this week’s reading and assignment were pretty difficult. Dealing with text and data is not easy, and Chapter 18 in the Learning Processing book was really difficult to understand. I’ll probably read it again. Instead of really coming up with anything original, I turned in a very slightly modified version of one of the exercises from the book, which I got help from another student (Nik), yet again.

Anyway, here’s my sketch. It’s OK. The bubbles are floating off to the side, unless you put your mouse over them and then they fall to the bottom of the sketch to be redrawn somewhere above the top of the sketch.

Floating and dropping bubbles

ICM Week 3: Functions, ‘For Loops’, and ‘If’ statements

This week it got serious. We were using a bunch of Processing methods – if statements, loops and functions – which at the time was a big deal to me, since in practice I still didn’t really understand how to put it all together.

But, I found some residents to help me out and explain how things worked. They also introduced the ‘Switch’ statement, a more efficient ‘if’ statement, which later came in handy for my midterm project. So, while the finished product looks the same as last week, when you check out the code you’ll see that the two sketches are very different.

ICM Week 2

Color bars, Week 3: Switch, Ifs and For Loops

(Written Oct 29, 2009)

ICM: Week 2 – Using variables and interactivity in Processing

This week, I used the same concept from last week but I used variables to reduce the amount of code I was drawing. I also added an interactive element. Now, when you use your mouse to move left to right across the screen, the background changes from 255 (white) to 0 (black). The alpha level of each bar is still set manually, and choosing how much to decrease the level was somewhat mathematical but the level doesn’t decrease evenly. (This became a problem the next week when I used objects to create the sketch.) I like how it looks like there’s so much more to drawing the bars than just a change of alpha level.

ICM Week 2

Color bars, Week 2