Lynn’s Puppy Toy Reacts to Your Call

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.

Here’s the final Instructable post :

https://www.instructables.com/Puppy-Toy-That-Reacts-to-Your-Call

A video shows how it works.

Social Media Messaging Samples:

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

Lynn’s therapy toy dog progress

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.

Google doc:

https://docs.google.com/document/d/114kMzZCTpjZoU6NhlzyOiMGPHB5-gWQsLyxokE4Dccw/edit?usp=sharing

Lynn’s Final Ideas

Idea 1: Refine the lamp from Sinclair’s class

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.

↓Talking Bass tutorial:

https://www.instructables.com/Animate-a-Billy-Bass-Mouth-With-Any-Audio-Source

↑The dog I’m going to tear down

Idea 3: Interactive Pet Memorial Urn Light

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.)

Lynn’s Halloween  Shitty Idea

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);  
    }
  }

Light Result!

Lynn’s Shitty Idea Costume

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!

Material:

Half ball ornament

Black face mask

XL trash bag

RGB Led lights, gemma m0 board, button, resistors

black leggings

3D printing parts: poop shaped shell (transparent petg), bulb holder (silver pla)

Light animation: raise up, rainbow sequence, blink, disappear from the top

(Switch animation by press button)

Todo:

find model +printing

Sew sleeves to trash bag

Drill holes to ball ornament, hot glue bottom part

Circuit diagram

Soldering

Arduino coding

Lynn’s NeoPixel Circuit & Halloween Costume Ideas

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.)

Lynn’s Jackalope Plush Light

Here comes the Jackalope!

Material list:

-Flax fur fabric 10mm black

-1.5” ribbon(for eyes and bow)

-white paint marker (to draw pattern on black fabric)

-wood board

-flax fabric (to cover the board)

-3D printed parts

-hot glue (to glue the horns)

-blue tape (to wrap up the model and get patterns)

Process images:

3D model

(horns 3D file) https://www.cgtrader.com/3d-models/character/fantasy-character/horns-60-part-imm-and-vdm-brush

3D prints for pattern

Use blue tape to wrap it and cut open

patterns

Trace pattern onto fabric

Solder LED lights and sewing fabric

Sew lights behind the eyes so that they won’t move

Glue the horn platform underneath the fabric, then glue horns outside (too excited to take a photo)

Add board to make the bunny looks like a taxidermy

Done! (I really like this evil light effect although the photos are not focused)

Lynn’s Jackalope Plush Light Proposal (and process from my last job)

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:

Wemo Maker F7C043 Tear Down

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.

And here is the knolling outcome!!

The material is listed below:

PARTMATERIAL
casingplastic (PC or ABS, not sure)
cover plateplastic (PC or ABS, not sure)
PCB boardfiberglass
LED lightsgallium arsenide
relay contactscopper
switchesABS
screwssteel
light conductorABS
UFL connectorbrass, stainless steel, PTFE
cablesilver-plated copper, PVC
Manufacturer and part numberDATASHEET
A: ACON micro USB C connector(unknown)
B: PIC16F1824 low voltage ICSP™ method Microchiphttps://www.alldatasheet.com/datasheet-pdf/pdf/348744/MICROCHIP/PIC16F1824.html
C: Relay contacts & Sensor contacts(unknown)
D: HongFa HF3FA: subminiature high-power relayhttps://source.hongfa.com//pdf/web/viewer.html?file=/Uploads/Product/PDF/HF3FA_HF3FA-T_en.pdf?timestamp=1725733481
E: 49A9 Resistor(unknown)
Manufacturer and part numberDATASHEET
F: Winbond 25Q128FVSGhttps://www.alldatasheet.com/datasheet-pdf/pdf/506517/WINBOND/25Q128FVSG.html
G: Ralink RT5350F SoChttps://www.datasheets.com/part-details/rt5350f-mediatek-73807877
H: 2R2 Resistor(unknown)

To be continued:) Or maybe not;)