Gaby Chan, Lisa Liu
Introduction:
We first came up with the inspiration for this project from a picture of a children’s art table with many spaces to put materials away. We thought, “what if this table was smart enough to tell kids to put their things away after playtime is over?”
Our “Clean-Up!” Table, which lives in homes and indoor play areas, activates with a simple button press once it is ‘clean-up time’. A cheerful song starts playing, and children are encouraged to move materials either to the 2 cups on the side (which light up when things are put in) or off the surface of the table. Once there are no more materials on the surface of the table, a sound bite is played which signifies the end of ‘clean-up time’.
Product Specifications:
Materials Used:
- IKEA LATT Children’s table
- 16oz Clear Plastic Bubble Tumblers x 2
- USB 2.0 charging cable
- USB A/B - USB 2.0 charging cable
- Apple iPhone charging sconce
- Jumper cables
- Telephone wire
- 1M x 2 and 10K resistors
- ¼ inch thick birch plywood
- MicroUSB chip
- 3M Command Strips
- Electrical Tape
- Ziploc One-Press Seal Small Square Plastic Container
- Varathane Clear Gloss Oil-Based Interior Polyurethane
- Wood Glue
- 1-ply cardboard
- Hot glue gun
- 220 grit sandpaper
Processing:
- Arduino Elegoo UNO R3
- White Arcade Button
- Piezo Sensor Disc x 2
- Load Cell x 4, with Amplifier chip
Outputs:
- Adafruit “Music Maker” MP3 Shield with amplifiers
- USB-powered portable speakers
- LED 32-count neopixel rings x 2
How The Sensors Work:
To begin, the parent plugs in the table into an electrical wall outlet and allows the children to play. Once playtime is over, either the parent or the child would push the Clean Up button to switch on ‘Clean-Up Time’ and the cheerful “Clean-Up Song” would play and the cups become active.
During ‘clean-up time’, the piezo sensor discs in the bottom of the cup receptacles become active to vibrations caused by objects hitting the bottom of the cups. Each time a vibration is detected, the LED neopixel rings light up once all around.
Meanwhile, we detect and monitor the weight of objects on the table by way of load cells mounted below the table surface, which are amplified by a chip under the table. When this weight reaches 0.0, ‘clean-up time’ ends.
How We Did It:
We hacked an existing IKEA children’s table with a conveniently sunken-in surface, onto which we attached our load cells propped up with a little cardboard and hot glue. Atop the existing frame and load cells, we placed a piece of birch plywood to serve as the new top surface of the table.
We cut the wood into 2 parts in order to divide the table: the smaller side would house the 2 cup receptacles and the button, and the larger side would be the play surface for the kids that would be measured by the load cells once ‘clean-up time’ was active. On the sides of the table, we attached portable speakers with Command Strips to play the music clearly.
For the smaller side of the table we drilled 3-inch diameter circles through the wood to house the cups, each of which have piezo discs taped to the bottoms. We also drilled small holes to the side to allow the wires for the LED neopixel rings to flow to underneath the table. To house the button, we drilled 1⅛-inch diameter hole through the wood.
Alongside the Arduino unit and the breadboard, the wires for all of the sensors converge into a plastic Ziploc container hot-glued to the bottom of the table. From there, the power cable flows.
Resources:
- https://learn.adafruit.com/adafruit-music-maker-shield-vs1053-mp3-wav-wave-ogg-vorbis-player/overview
- https://www.circuito.io/app?components=9442,11021,689245
- https://learn.adafruit.com/adafruit-neopixel-uberguide/basic-connections
- https://www.instructables.com/id/Arduino-Bathroom-Scale-With-50-Kg-Load-Cells-and-H/
- https://www.sparkfun.com/tutorials/330
- https://learn.sparkfun.com/tutorials/piezo-vibration-sensor-hookup-guide/all
- https://turbofuture.com/computers/Color-Coded-Wire-inside-the-USB
Download our CODE here:
/** the following elements are being used in these pins:
- mp3 shield - 13/12/11/7/6/4/3
- load cell - 5/2
- piezo discs - a0/a1
- button - 8
- led rings - 10/9 **/
// 1. Mp3shield
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#define CLK 13 // SPI Clock, shared with SD card
#define MISO 12 // Input data, from VS1053/SD card
#define MOSI 11 // Output data, to VS1053/SD card
// Connect CLK, MISO and MOSI to hardware SPI pins.
// See http://arduino.cc/en/Reference/SPI "Connections"
// These are the pins used for the breakout example
#define BREAKOUT_RESET 9 // VS1053 reset pin (output)
#define BREAKOUT_CS 10 // VS1053 chip select pin (output)
#define BREAKOUT_DCS 8 // VS1053 Data/command select pin (output)
// These are the pins used for the music maker shield
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
// These are common pins between breakout and shield
#define CARDCS 4 // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer =
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
//2. loadcell
//#include "HX711.h"
//#define calibration_factor -10830.00 //This value is obtained using the SparkFun_HX711_Calibration sketch
//#define DOUT 5
//#define WGT 2
//HX711 scale;
//float reading = 0.0;
//3. piezodisc
#define DRUM1 0 //piezo disc 1 - a0
//#define DRUM1 1 // piezo disc 2 - a1
byte val = 0; // Initializing the variable for the voltage value
bool cup1 = false;
bool cup2 = false;
//4. button
const int buttonPin = 8; // the number of the pushbutton pin
int buttonState = 0;
//5. ledring light
#include <Adafruit_NeoPixel.h>
#define PIN 10
#define NUMPIXELS 32
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 30
//variables
bool cleanuptime = false;
void setup() { // put your setup code here, to run once:
//button
pinMode(buttonPin, INPUT);
//music
Serial.begin(9600);
Serial.println("Adafruit VS1053 Simple Test");
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
}
// Set volume for left, right channels. lower numbers == louder volume!
musicPlayer.setVolume(50,50);
if (! musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT));
pixels.begin();
}
void loop() { // put your main code here, to run repeatedly:
buttonState = digitalRead(buttonPin);
//val = analogRead(DRUM1);
//Serial.print(reading);
//button
if ((buttonState == HIGH) && (cleanuptime == false)) {
cleanuptime = true;
}
if (cleanuptime == true) {
Serial.println(F("button on"));
if (! musicPlayer.startPlayingFile("cleanup.mp3")) {
Serial.println("Could not open file track001.mp3");
while (1);
}
Serial.println("Started playing");
while (musicPlayer.playingMusic) {
// file is now playing in the 'background' so now's a good time
// to do something else like handling LEDs or buttons :)
val = analogRead(DRUM1);
Serial.println(val, DEC);
if (val >= 5){
cup1 = true;
}
if (cup1 == true){
pixels.clear();
for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
pixels.setPixelColor(i, pixels.Color(100, 150, 80));
pixels.show();
delay(DELAYVAL);
}
cup1 = false;
}
if (cup1 == false){
val = 0;
pixels.setPixelColor(0,0);
}
delay(100);
}
}
}
No comments:
Post a Comment