Pat it, poke it, or let it glow softly on your desk. Moody Mush responds with changing moods expressed through light, sound, and motion. It’s an interactive mushroom robot designed to be beginner‑friendly while still aiming for an expressive and cute feel.
Moody Mush uses nine touch sensors and an IR remote as input. For output, it features two servo motors, an 8×8 LED matrix, and an MP3 player. Most MCU dev boards require additional modules or soldering to achieve all of these functions, but MakerPort already includes to drive them. This makes the electronics side of the project much simpler, with no need to choose modules and no soldering required.
All 3D models are designed to print without supports, and the assembly requires no screws except for the ones that come with the servo motors. Some pieces take a while to print, but the overall build is straightforward.
For those who want to go further, Step 10 includes a code overview so you can add new modes or customize how your Moody Mush behaves.
HOW IT WORKSMoody Mush has three modes, and you can switch between them using the IR remote controller.After turning on the power, press the ON/OFF button to activate Mode 1.Press the MODE button to cycle through the modes (Mode 1 → Mode 2 → Mode 3). Below is a description of the IR remote and what each button does.
Mode1: IR remote control mode
Moody Mush is fully controlled by the IR remote. It starts with an orange‑yellow cap color, and you can change the color or move the cap freely. In this mode, Moody Mush behaves like a cute, movable lamp.
Mode2: Semi-interactive mode
Moody Mush starts with a blue cap color. You can still change the cap color with the remote, but the motion changes based on the touch sensors. A short touch is interpreted as a poke, and Moody Mush reacts with surprise. A long touch is interpreted as a pat or hug, and it snuggles toward the touched direction. These reactions are fixed in this mode.
Mode3: Full interactive mode
In this mode, Moody Mush has its own mood. The mood starts at a neutral (green cap color) and shifts based on your touches and the passage of time. Moody Mush likes pats and hugs, which make it more positive. Pokes, on the other hand, make it negative. Over time, Its mood gradually returns to neutral.
The mood is expressed through the cap color, shifting along the rainbow hue scale:
- Neutral → green
- Positive → toward red
- Negative → toward purple
Its reactions also change based on its current mood. When Moody Mush is in a negative mood, it may get angry when poked, refuse pats or hugs, and tends to tilt. When it is in a positive mood, it may become delighted when patted, and sometimes even dance. The chart below shows how Moody Mush’s mood affects its cap color and reactions.
Moody Mush’s cap is driven by two servo motors, each connected to a simple linkage mechanism. This allows the cap to tilt smoothly forward, backward, and sideways. I often see this type of mechanism used in robot neck designs.
All parts were designed in Autodesk Fusion. Before modeling, the link lengths (joint positions) were calculated using the MotionGen, which lets you check the range of motion very quickly.
This project teaches you how to combine 3D printing, touch sensing, LEDs, sound, and servo-based motion control to create an expressive robot using MakerPort and MicroBlocks.
WHAT YOU'LL NEED- MakerPort and USB cable (contained in the MakerPort Basic kit)
- microSD card for MP3 files (contained in the MakerPort Basic kit)
- 8×8 RGB LED matrix & connecting cable (contained in the MakerPort Basic kit)
- 12-socket easy-connect cable for touch sensors (contained in the MakerPort Basic kit)
- 9 × touchpoints & backs (contained in the MakerPort Basic kit)
- 12V 2A Power supply adapter with switch
- 44-key IR remote controller
- 2 × SG90 Micro servo motors (Miuzei)
You can download the STL files from the CAD section on this site, or from this link. You can print all parts with standard FDM settings and without supports. For the stem (1) and cap (2), I personally added a raft because they take a long time to print and have a narrow contact area, and I didn’t want to risk the print failing.
Here are the main 3D printing settings:
- Material: PLA
- Nozzle Size: 0.4 mm
- Supports: None
- Layer Height: 0.2 mm (default)
- Infill Density: 15–20% (default)
- Raft/Brim: Depends on bed adhesion.
While these parts are printing, you can continue with Step 2–3.
STEP 2: CREATING & UPLOADING SOUNDSI created five Moody Mush voice sounds (snuggling, joy, flinching, poked, angry) using the jsfxr. You can download these sounds here, or you can use your own original ones. If you create your own, the folder name must be "30", and the mp3 file names must start with 001, 002, … as shown below.
30├── 001_snuggling.mp3├── 002_joy.mp3├── 003_flinching.mp3├── 004_poked.mp3└── 005_angry.mp3
To upload the folder, move the switch on the right side of the MakerPort to the "file" position and connect it to your PC with a USB cable. When the switch is in the "file" position, the MakerPort works as a USB flash drive. Simply copy the folder into the MakerPort. If your MakerPort already has a folder named "30", please rename the old one (e.g., "30_not_used") or remove it before adding the new folder.
STEP 3: SETTING THE IR REMOTE CONTROLLERI used an IR remote controller I found at home. I’m not sure whether all 44‑key remotes use the same IR codes, so if your controller outputs different codes, you’ll need to modify the program accordingly.
How to check your IRcodes
MakerPort includes many sample programs in the ''MicroBlocks Programs" folder. The check your controller's IR codes:
1. Set the switch on the right side of the MakerPort to "file"
2. Open the "Remote Control Codes Display.ubp" program inside the "Remote Control" folder under the "MicroBlocks Programs" directory from MicroBlocks.
3. Set the switch on the MakerPort to the "code" position.
4. Run the program.
5. Press a button on your remote, and the corresponding IR code will appear in MicroBlocks.
Below are the IR codes from my controller. Check whether your controller matches these values.
How to modify the program
If your IR codes don’t match, follow the steps below:
1. Download "MoodyMush.udp" from the Code section on this site, or directly from this link and open it.
2. Modify corresponding values in the three variables "IR_code_LED", "IR_code_motion" and "IR_code_mode" in the "when started" blocks so they match the codes from your controller.
3. Save the program.
To attach the servo horns in the correct position, follow the steps below, which include centering the servo motors at 0 degrees before installation.
1. Connect two servo motors to the Servo1/2 ports of the MakerPort.
2. Open "MoodyMush.udp" (or the modified program from Step 3).
3. Confirm that "ini_deg1" and "ini_deg2" in the "when started" block are set to 0. These variables define the initial position (0 degrees) of two servo motors.
4. Set the MakerPort to the "code" position and connect it. The program will be uploaded automatically.
5. Run the program. The two motors will move to 0-degree position.
6. Insert the single‑arm horns into the two input links (7, 8), then attach each assembly to its servo motor as shown in the picture and secure them with screws.
1. Insert the H-post (6) into the motor base (4) until it clicks.
2. Place two servo motors into the motor base (4) and secure them with screws.
3. The remaining parts can be assembled in any order. Follow the picture to complete the drive mechanism.
At the initial position, the cap base should be parallel to the base. However, due to mechanical play in the drive mechanism, it may be slightly tilted. In this step, you will adjust the initial position as follows:
1. Connect the two servo motors to the Servo1/2 ports of the MakerPort. Make sure the left motor is Servo1 (upper connector) and the right motor is Servo2 (bottom connector). The motor numbers are printed on the motor base as well.
2. Run the "MoodyMush.udp".
3. If the cap base is tilted, adjust it so that it becomes parallel to the base by modifying the values of "ini_deg1" and "ini_deg2" in the "when started" block. In my case, ini_deg1 = 8 and ini_deg2 = –8 worked well.
The cap has nine touch sensors. In this step, you will attach all nine sensors.
1. The cap has nine holes for the touchpoints. These holes are non-through to allow support-free printing. You can pierce them from outside using the touchpoints themselves, or use a tool such as a hand drill. After inserting each touchpoint, secure it from the inside using a securing back.
Before attaching, cut off the small "nub" on each securing back so it fits properly.
2. Connect the 12-socket easy-connect cable to the nine touchpoints through the cable-holding structure inside the cap. Make sure the pin numbers match the positions of the touchpoints as shown in the picture.
This is the final assembly step.
1. Place the drive mechanism inside the stem and rotate it clockwise until it clicks. Make sure the orientation is correct: the back side of the drive mechanism is the side with printed "back" text, and the front side of the stem is the side with the hands and feet.
2. Route the center cable of the LED panel through the cable-holding structure inside the cap.
3. Insert the cap into the cap base of the drive mechanism while holding the LED panel. Push until it clicks. Make sure the LED panel is properly hooked by the cap base.
4. Route the LED panel cable and touch sensors cable through the back side of the drive mechanism, and route the servo motor cables through the front side. Then connect all cables to the MakerPort as shown in the picture.
5. Place the MakerPort onto the base. The side with the reset button is the front, and the side with the power connector is the back.
6. Arrange the cables so they do not interfere with the servo motors or the cap movement. Using twist ties, cable ties or rubber bands is a good idea.
7. Insert the base into the stem, aligning the triangle marks, and rotate it clockwise until it clicks.
Connect the power cable from the back side and check if your Moody Mush works properly.
If you want to modify the program, you can connect the USB cable from the back without disassembling anything.
💡Tip: If the servo motor makes a buzzing noise after it stops, it may be overloaded. Check the following:
- The cap is fully inserted.
- The input links are not touching any cables.
- The cables are not tied too tightly.
In this step, I’ll briefly explain how the program works. This is not necessarily the best practice implementation for Moody Mush, but if you’re interested in modifying the program or understanding its internal logic, this overview may help.
For mode 3, the key variables are "mood", four probabilities (greatjoy_probality, dance_probality, anger_probability, and refusal_probability), and "tilt". The "mood" value ranges from -100 to 100. the four probabilities and the tilt change based on the current mood.
The program consists of nine blocks. One of MicroBlocks' features is its parallel task execution, so each block handles a single function to avoid congestion. By separating them, they are executed in parallel.
Below is a summary of how each block works:
1."when started" block
Runs immediately after power-on. Initializes the MakerPort and variables, then calls five forever loops ("when monitoring_sensors", "when controlling_motion", "when showing_LEDs", "when playing_sound", and "when update_mood"). These loops are separated to run in parallel.
2. "when IR code received?" block
Handles actions based on IR codes received from the controller.
3."when pin touch event" block:
Detects when a touch sensor is touched.
4."when pin release" block
Detects when a touch sensor is released and determines whether the touch was short. Short touches decrement the mood value.
5. "when monitoring_sensors" block
Checks whether a touch is being held long enough to count as a long touch. Long touches increment the mood value.
6. "when controlling_motion" block
Controls the servo motors depending on touch sensors states, the four probability values and the tilt value.
7. "when showing_LEDs" block
Controls the LED matrix based on long thouch states. A "wait 35 milliseconds" block is inserted to regulate NeoPixel update frequency.
8. "when playing_sound" blocks
Controls the MP3 player depending on the state in the "when controlling_motion".
9 "when update_mood" block
Updates the "mood", the four probabilities and the "tilt" values every 3000 msec. The "mood" value gradually returns to zero (neutral), and the probabilities and "tilt" values are recalculated based on the updated mood.






_t9PF3orMPd.png?auto=compress%2Cformat&w=40&h=40&fit=fillmax&bg=fff&dpr=2)





Comments