Creating an interactive plush puppy is an exciting project. Imagine a cuddly companion that’s more than just a soft toy – one that can actually respond to your voice and move toward you!
This project will guide you through designing a unique interactive pet that combines simple mechanical engineering with innovative technology. By integrating Arduino boards, motors, and microphone amplifiers, we’ll transform an ordinary plush toy into a charming, responsive friend that brings a touch of magic to your home.
Caption: 🐾✨ Meet the smartest dog toy ever! This interactive plush responds to your call, just like a real pet. 🐶💡 Plus, it’s DIY! Build it yourself and customize it! 📹 Watch the video to see how it works, and tap the link in the comment for step-by-step instructions. #InteractiveToy #DIYToy #TechForFun #ArduinoProjects #ArduinoDiy
For the final, I decided to continue with the therapy toy dog concept. This dog will be able to talk back to its owner and give therapy suggestions embedded with ChatGPT or Siri. It will also respond with simple body movements for emotional support. The function is similar to a Bluetooth headphone, connecting to the phone and playing AI-generated responses that feel like natural dialogue.
Progress:
Now the dog is torn down. Looks just like a pelt for taxidermy…
The mannikin and gears inside:
I realized that there’s only one motor, and all moving parts(head, tail, and legs) are connected, which means the dog can only do one type of movement. What I can do is code the motor to move at different speeds to make it “react” with different moods. And There’s not enough space in its body, so I will probably put the boards into the battery holder. Thankfully it has a large skull for me to put a speaker into it.
Material list:
Walking Dog Interactive Electronic Plush Toy
Arduino Nano ESP32
Soundboard: Adafruit Audio FX Mini Sound Board-WAV/OGG Trigger-2MB Flash
Amplifier: Electret Microphone Amplifier – MAX9814 with Auto Gain Control
Audio Speaker: 40mm Diameter 4Ohm 5Watt (or 28mm 8 ohm 0.5W, if there’s not enough space)
Motor: already included in the toy
Video storyline:
1, A pet owner calls the toy dog’s name, and it comes to life, walking towards them with a wagging tail and cheerfully responding with barks or saying, “I’m here!”
2, The owner sits down and begins sharing their recent stresses. The dog gives him some comforting words and helpful coping skills.
3, The owner pets the toy dog, and it responds with body movements
4, The scene ends with the owner smiling, feeling comforted and supported, as the dog happily stays by their side.
My first idea is to build on the lamp I previously made in Sinclair’s class. The plan is to 3D model and enhance the hand-crafted parts, making them more functional and refined. I’ll add a lighting function that can be customized for different moods.
Idea 2: Therapy pet toy
Inspired by the talking bass, I’m creating an interactive pet plush toy that responds to sound. I’ll create mannikin and patterns for the appearance (maybe using AI modeling to do that from a photo of someone’s dog), tear down a walking dog toy to reuse the gears, integrate a Bluetooth receiver and speaker into it. It will allow the toy pet to chat with its owner as if it can do therapy, and companion the owners with body movements.
For pet owners who want to keep a meaningful connection with a beloved pet, this interactive night light offers a unique way to honor their memory. The plush toy contains a small box inside to hold pet ashes with herbs to preserve it, and can light up as a bedside companion. When you call your pet’s name, a warm-colored breathing light will glow, creating a sense of presence and companionship. (maybe add a speaker to it so that it can play a recording of the pet’s vocal sounds.)
As a designer, I spend a lot of time coming up with ideas. And let’s be honest—sometimes they’re just shitty and trashy. So for Halloween, I’m literally wrapped in a trash bag, and on my head is a lightbulb, symbolizing those ‘aha’ moments… except this one’s got a glowing poop inside.
Material list:
Clear Ball Ornaments, 160mm/6.3inch
3D printed poop shaped shell (12x12x12cm, transparent PETG)
3D printed bulb holder (12x12x12cm, black PLA, spray painted in copper color)
XL trash bag (realized it’s still too small)
black leggings
Adafruit NeoPixel Digital RGB LED Strip
Gemma M0 board
button
Idea Sketches:
3D modeling:
Circuit Diagram:
Arduino code:
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define BUTTON_PIN 2
#define PIXEL_PIN 1
#define PIXEL_COUNT 78
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
boolean oldState = HIGH;
int mode = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin();
strip.show();
}
void colorWipe(uint32_t color, int wait) {
for(int i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, color);
strip.show();
delay(wait);
}
}
//mode3: offset orange blink
void orangeblink(int wait) {
for (int offset = 0; offset < 3; offset++) { // offset each 3 pixels
strip.clear(); // clear all pixels
for (int i = offset; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i, strip.Color(255, 165, 0)); // orange
}
strip.show(); //
delay(wait); //
}
}
// Mode 4: Theater chase effect
void theaterChase(uint32_t color, int wait) {
for (int a=0; a<10; a++) { // Repeat the chase effect
for (int b=0; b<3; b++) { // 3 pixels lit per cycle
strip.clear(); // Clear the pixels
for (int c=0; c < strip.numPixels(); c+=3) {
strip.setPixelColor(c+b, color); // Set every third pixel to the given color
}
strip.show(); // Update the strip
delay(wait); // Wait before the next step
}
}
}
// mode5: rainbow
void rainbow(int wait) {
for (long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
for (int i = 0; i < strip.numPixels(); i++) {
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show();
delay(wait);
}
}
void loop() {
boolean newState = digitalRead(BUTTON_PIN);
// Check if state changed from high to low (button press).
if((newState == LOW) && (oldState == HIGH)) {
// Short delay to debounce button.
delay(20);
// Check if button is still low after debounce.
newState = digitalRead(BUTTON_PIN);
if(newState == LOW) { // Yes, still low
if(++mode > 10) mode = 0; // Advance to next mode, wrap around after #8
switch(mode) { // Start the new animation...
case 0:
colorWipe(strip.Color( 0, 0, 0), 50); // Black/off
break;
case 1:
orangeTheaterChase();
break;
case 2:
fade(20);
break;
case 3:
theaterChase(strip.Color(255, 0, 0), 50); // red
break;
case 4:
theaterChase(strip.Color(255, 255, 0), 50); // yellow
break;
case 5:
theaterChase(strip.Color(0, 255, 0), 50); // green
break;
case 6:
theaterChase(strip.Color(0, 0, 255), 50); // blue
break;
case 7:
theaterChase(strip.Color(128, 0, 128), 50); // purple
break;
case 8:
rainbow(10);
break;
}
}
}
oldState = newState;
}
//mode2: poop up, poop down
void orangeTheaterChase() {
for (int repeat = 0; repeat < 2; repeat++) { // Repeat the effect twice
// Gradually light up from the first to the last pixel
for (int a = 0; a < strip.numPixels(); a++) {
strip.clear();
for (int b = 0; b <= a; b++) {
strip.setPixelColor(b, strip.Color(255, 60, 0)); // Set color to orange
}
strip.show();
delay(50); // Delay between each pixel lighting up
}
// Gradually turn off from the last to the first pixel
for (int a = strip.numPixels() - 1; a >= 0; a--) {
strip.clear();
for (int b = 0; b <= a; b++) {
strip.setPixelColor(b, strip.Color(255, 60, 0)); // Keep color orange
}
strip.show();
delay(50); // Delay between each pixel turning off
}
}
}
// //mode3: fade 3 times with dif leds
void fade(int wait) {
// int fadeTimes = 3;
// for (int t = 0; t < fadeTimes; t++) {
// light up
for (int brightness = 0; brightness <= 255; brightness += 5) {
strip.clear();
for (int i = 0; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i, strip.Color((brightness * 255) / 255, (brightness * 80) / 255, 0));
}
strip.show();
delay(wait);
}
// turn down
for (int brightness = 255; brightness >= 0; brightness -= 5) {
strip.clear();
for (int i = 0; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i, strip.Color((brightness * 255) / 255, (brightness * 80) / 255, 0));
}
strip.show();
delay(wait);
}
for (int brightness = 0; brightness <= 255; brightness += 5) {
strip.clear();
for (int i = 1; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i, strip.Color((brightness * 255) / 255, (brightness * 80) / 255, 0));
}
strip.show();
delay(wait);
}
// turn down
for (int brightness = 255; brightness >= 0; brightness -= 5) {
strip.clear();
for (int i = 1; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i, strip.Color((brightness * 255) / 255, (brightness * 80) / 255, 0));
}
strip.show();
delay(wait);
}
for (int brightness = 0; brightness <= 255; brightness += 5) {
strip.clear();
for (int i = 2; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i, strip.Color((brightness * 255) / 255, (brightness * 80) / 255, 0));
}
strip.show();
delay(wait);
}
// turn down
for (int brightness = 255; brightness >= 0; brightness -= 5) {
strip.clear();
for (int i = 2; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i, strip.Color((brightness * 255) / 255, (brightness * 80) / 255, 0));
}
strip.show();
delay(wait);
}
}
As a designer, I spend a lot of time coming up with ideas. And let’s be honest—sometimes they’re just shitty and trashy. So for Halloween, I decided to poke fun at myself with a costume I’m calling ‘Shitty Ideas.’ I’m literally wrapped in a trash bag, because, let’s face it, that’s where a lot of ideas end up. And on my head is a lightbulb, symbolizing those ‘aha’ moments… except this one’s got a glowing poop inside. It’s my way of saying that not every idea we came up with is brilliant—some are complete garbage. But hey, we designers can always make even the shittiest ideas look professional and fancy!
Here is the NeoPixel Circuit I made. (Thanks to Qianyue for trouble shotting my codes!)
Halloween Ideas
1.Trash Ideas
For this costume, I’m planning to dress up as a trash bag with a light bulb head. The intention behind this look is that sometimes I come up with trash ideas, but they look fancy.
The bulb part will be made with a transparent plastic ball, and the bottom will be a fabric-made hood, designed to represent the lamp base and conceal the electronic components. The filament will be shaped into a poop using soft neon light strips.
For the body, I’m thinking about using a large trash bag (heavy duty for sure). If it looks too simple, I might gonna use a pre-made trash bin costume and add lights to it.
2. Adobe head
I plan to create a cube-shaped headpiece for this outfit, with different Adobe software logos on each side. The materials will include laser cut acrylic boards or paper boards. The letter portions will be transparent, while the surrounding areas will be opaque.
3. Jackalope furry head
A large version of my jackalope plushy toy. There will be light strips around the eyes.
(Among these three ideas, I prefer to work on the first two because I already have some experience with crafting, but I’m not good at Arduino. I would like to spend more time on exploring circuits and coding.)
Simple pictures of the mushroom prototype in class:
For this time I’m going to create a devil Jackalope for Halloween Decoration. Its eyes or horns can emit a spooky red glow at night. Or there should be a glowing stigma on it’s body.
List of material:
faux fur(10mm, black), polyester fill, 3D printed parts, glass eyes, LED lights, Resistors, batteries
Since the faux fur fabric will be thick, I’m thinking of using a transparent material for the eyes and horns. As for the stigma, I’m thinking of cutting the fabric open to create a wound-like shape, then stitching it loosely so light can show through.
I’m also thinking of creating a frame or pedestal to mount the battery case outside its body, so that the batteries can be changed easily.
Circuit diagram:
And here is some process and tips of creating pattern from my last job:
There’re typically 3 ways to create pattern for a toy:
1. Draw by hand. (Simple but requires experience for precise 3D shape)
2. Create a sculpture reference and wrap it, then cut the wrap into separate pieces and try to flatten it. (due to the fabric’s elasticity, patterns may need further adjustment after the stuffing test)
3. Use fabric simulation in 3D software. (fast, but experience with software is required. And also need adjustment.)
Here are some photos of an abandoned project I was working on in a toy company:
Wrapping process:
1, create a sculpture and wrap it with tape (choose a tape with low stickiness and less likely to deform)
2, Cut the tape separately based on where you want to put the seams and mark each piece with the name and fur direction. Then, try to flatten them. Release cuts are made to help with flattening.
3, Test outcome
Fabric Simulation Process
1, Create a 3D model, then use Knife tool to unwrap the UV map as your pattern (I was using Blender)
2, run fabric stimulation to see the result
3, Test in real life
Comparison of wrapping patterns and 3D patterns:
YouTube tutorial for those who are interested in making sewing patterns in Blender:
For this exciting assignment, I’m tearing down the Wemo Maker. It looks like a WIFI Extender but it’s actually a device for smart home integration. It allows DIY enthusiasts to remotely control low-voltage devices through an app, such as blinds, sprinklers, powered gates, etc.
Here is a list of tools I used and the process:
1, Wire cutter (failed):
The casing of this device consists of a box and a cover plate with no screws on it. So, I first tried using a wire cutter to cut open the casing, but the plastic had become brittle, and I could only cut off the edges.
2, Drill:
Then I tried using a power drill to make holes onto the casing so that I would have a place to pry it open. After succeeding, I found that the cover plate was glued into a precise slot in the casing, making the device appear seamless and preventing people from opening it.
3, Utility knife:
The PCB board and some wires were fixed inside the box with hot glue, and I used a utility knife to separate them. (I was surprised that they use hot glue. Such a convenient way, isn’t it?)
4, Hex screwdriver:
Next, I removed the screws that were securing the PCB board to the casing.
5, Hands:
I pulled some wires connected to the board by hand. This step was easy.
6, Wire cutter again:
Since some electronic components were soldered onto the board, wire cutters were perfect for cutting off their pins.