Machine Building Project Page¶
Slide¶
Video¶
Group Assignment Overview¶
This is the group assignment of the week.
- design a machine that includes mechanism+actuation+automation+application
- build the mechanical parts and operate it manually
- document the group project and your individual contribution
- actuate and automate your machine
- document the group project and your individual contribution
1. Machine to Make: RYOAN-JI XY 2025¶
In our group project, we decided to create the machine “RYOAN-JI XY 2025,” based on a CoreXY module, which uses an LLM to generate a desktop karesansui and haiku inspired by input images.
Below is our group project’s initial proposal.
If you check the Slide and Video at the top of the page, you’ll see that we were able to bring most of it to life!
Title of the work: “Memory Landscapes”

Concept
- When the audience inputs their past memories or emotions, the XYZ arm creates patterns resembling terrains or ripples on the surface of sand or powder. Over time, new memories from other audience members reconstruct the patterns, overwriting and erasing the previous ones—bringing to life the poetic message that “memories shift like landscapes.” This generative installation allows people to experience this ephemeral transition.
Expression Structure
Visual
- The XYZ arm draws patterns on white sand (or powder) spread across the base of a frame.
- Unique pattern generation intertwines randomness and structure, modulated by memory parameters.
- Lighting from above vividly highlights the shadows and contours, unveiling a beautiful landscape.
Sound (Optional)
- Slow ambient sounds (wind, water, voices) play during the drawing process.
Interactivity
- Audience members input “memories,” “keywords,” or “images” via smartphones or devices.
- The arm interprets these inputs to create expressions like “ripples,” “vortices,” “terraces,” and “valleys.”
- The completed landscapes are preserved for a certain period before being overwritten with new memories.
2. Core Module: CoreXY¶
CoreXY demonstrates the foundation created after extensive consideration of manufacturing tool expansions in Cartesian coordinates. Two stepper motors move synchronously, allowing the carriage to travel from one XY coordinate to another.


2-1. Purchasable Components¶
CoreXY module alone consists of many parts. Some of them are purchased in the local hardware shops or the e-commerce platforms. Others should be designed according to our requirements and made locally. The following tables are the list of the parts we prepared for assembling the CoreXY module alone.
(1) Flame
SN | Item | Details | Qty | Remarks |
---|---|---|---|---|
1 | 2020Aluminum Extrusion(Y) | ex.400mm | 2P | |
2 | 2020Aluminum Extrusion(X) | ex.300mm | 2P | 3mm Acrylic spacer will be added |
3 | 2020Aluminum Extrusion(X) | ex.300mm | 1P | |
4 | Delta Socket | 4P | ||
5 | Socket Head Screws | M5x8mm | 8P | |
6 | T-Slot | M5 | 8P | |
7 | Non-stretch fishing line |
(2) Y-axis Pulley *2 units required for both sides.
SN | Item | Details | Qty | Remarks |
---|---|---|---|---|
8 | Socket Head Screws | M5x30mm | 1P | Inner wheels |
9 | V-slot Wheel | 1P | Inner wheels | |
10 | Spring Washer | M5 | 1P | Inner wheels |
11 | Washer | M5 | 1P | Inner wheels |
12 | Nut | M5 | 1P | Inner wheels |
13 | Socket Head Screws | M5x30mm | 1P | Outer wheels |
14 | V-Slot Wheel | 1P | Outer wheels | |
15 | Spring Washer | M5 | 1P | Outer wheels |
16 | Acrylic Spacer | 5mm | 1P | Outer wheels |
17 | Washer | M5 | 1P | Outer wheels |
18 | Nut | M5 | 1P | Outer wheels |
19 | Socket Head Screws | M5x8mm | 2P | |
20 | T-Slot | M5 | 2P |
(3) Y-axis Carriage *2 units required for both sides.
SN | Item | Details | Qty | Remarks |
---|---|---|---|---|
21 | Socket Head Screws | M5x40mm | 1P | Inner wheels |
22 | V-Slot Wheel | 1P | Inner wheels | |
23 | Spring Washer | M5 | 1P | Inner wheels |
24 | V-Slot Wheel | 1P | Inner wheels | |
25 | Spring Washer | M5 | 1P | Inner wheels |
26 | Nut | M5 | 1P | Inner wheels |
27 | Socket Head Screws | M5x30mm | 1P | Outer wheels |
28 | V-Slot Wheel | 1P | Outer wheels | |
29 | Nut | M5 | 1P | Outer wheels |
30 | Socket Head Screws | M5x8mm | 2P | |
31 | T-Slot | M5 | 2P |
(4) Y-axis Motor *2 units required for both sides.
SN | Item | Details | Qty | Remarks |
---|---|---|---|---|
32 | Stepper Motor | NEMA17 17HS4401 1.5A 42x42x38mm | 1P | Motor |
33 | Socket Head Screws | M3x8mm | 4P | Motor |
34 | Socket Head Screws | M5x30mm | 1P | Pulley |
35 | Bearing | D16xd5xH5 | 2P | Pulley |
36 | Spring Washer | M5 | 1P | Pulley |
37 | Washer | M5 | 1P | Pulley |
38 | Spring Washer | M5 | 1P | Pulley |
39 | Nut | M5 | 1P | Pulley |
40 | Socket Head Screws | M5x8mm | 2P | |
41 | T-Slot | M5 | 2P |
(5) X-axis Carriage
SN | Item | Details | Qty | Remarks |
---|---|---|---|---|
42 | Socket Head Screws | M5x30mm | 4P | |
43 | V-Slot Wheel | 4P | ||
44 | Nut | M5 | 1P | |
45 | Socket Head Screws | M3x15mm | 2P | Non-stretch fishing line holder |
46 | Washer | M3 | 2P | ditto. |
47 | Nut | M3 | 2P | ditto. |
(6) Limit Switch *2 units required for both X and Y axes.
SN | Item | Details | Qty | Remarks |
---|---|---|---|---|
48 | Limit Switch | 1P | ||
49 | Screw | M2x12mm | 2P | |
50 | Nut | M2 | 2P | |
51 | Socket Head Screws | M5x8mm | 1P | |
52 | T-Slot | M5 | 1P |
2-2. Local-Made Components¶
We also designed some components and processed them using 3D printing or laser cutting. Hayashi-san mainly took charge of the design and development. Thank you, Hayashi-san!
3D-printed parts




laser-cut parts


3. LLM(Gemini) prompts¶
Ito-san, who conceptualized the machine “RYOAN-JI XY 2025,” which uses an LLM to create a desktop karesansui and haiku inspired by input images, also crafted the LLM (Gemini) prompts. Ito-san was in charge of overall project management, bringing fascinating concepts and wonderful prompts to life. Thank you, Ito-san!
3-1. Karesansui prompt¶
// Set API key (in actual use, retrieve it safely from environment variables, etc.)
const API_KEY = "YOUR_API_KEY";
const MODEL = "gemini-1.5-pro-latest"; // Model suitable for creative purposes
// Request configuration
async function generateKaresansuiSVG(imageData) {
// API endpoint
const endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${API_KEY}`;
// Build request body
const requestBody = {
contents: [
{
parts: [
{
text: "Generate SVG code representing karesansui sand patterns based on this image."
},
{
inlineData: {
mimeType: "image/jpeg", // Change according to image type
data: imageData // Base64 encoded image data
}
}
]
}
],
// System instruction
systemInstruction: {
parts: [
{
text: `#ROLE
You are an expert at abstracting the impression of images and converting them into geometric patterns resembling mental landscapes, and you are proficient in generating SVG code.
# TASK
Abstract the provided image, convert it into geometric patterns resembling a mental landscape, and generate SVG code.
# TECHNICAL REQUIREMENTS
1. **Simplification:** Extract and simplify the key features and contours from the image while maintaining its essential character.
2. **Continuity:** Create continuous, unbroken lines that could be drawn by a mechanical rake or robotic arm in a single motion where possible.
3. **Only geometric shapes:** Only geometric shapes (e.g., circles, triangles, straight lines).
4. **Traditional Aesthetics:** Incorporate traditional karesansui design elements:
- Parallel ripple patterns (波紋, hamon) to represent water
- Straight lines to create clarity and structure
- Gentle curves to represent natural flow
- Asymmetrical balance (非対称の調和)
- Do not include text
5. **Technical Specifications:**
- Optimized for a vertical size of 226 mm × 240 mm
- Use a clear coordinate system with viewBox="0 0 226 240"
- Maintain proper scaling and proportions
- Ensure all lines have appropriate stroke width (typically 0.5-1.0px)
- Use only stroke paths (no fills)
# OUTPUT FORMAT
You must output ONLY the raw SVG code with no additional text, explanations, comments, markdown formatting, or code block markers(```svg ```).
The SVG code must:
- Start with the opening `< svg > ` tag including xmlns attribute and viewBox specification
- End with the closing `</svg> ` tag
- Be properly formatted and valid
- Be immediately renderable in a web browser or vector editing software without any modifications
# IMPORTANT
Do not include any explanatory text, introductions, or conclusions.
Do not wrap the SVG code in backticks or markdown code blocks.
Return only the SVG code itself, nothing else.
Example of expected output format:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 210 297" width="210mm" height="297mm">
<path d="M10,10 C20,20 30,10 40,10" stroke="black" stroke-width="0.5" fill="none"/>
<!-- Additional paths as needed -->
</svg>`
}
]
},
// Generation settings
generationConfig: {
temperature: 0.85, // Higher temperature setting for creative responses
topP: 0.9,
topK: 45,
maxOutputTokens: 2048, // Allow longer output for SVG generation
stopSequences: []
},
// Safety settings
safetySettings: [
{
category: "HARM_CATEGORY_HATE_SPEECH",
threshold: "BLOCK_ONLY_HIGH"
},
{
category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
threshold: "BLOCK_ONLY_HIGH"
},
{
category: "HARM_CATEGORY_DANGEROUS_CONTENT",
threshold: "BLOCK_ONLY_HIGH"
},
{
category: "HARM_CATEGORY_HARASSMENT",
threshold: "BLOCK_ONLY_HIGH"
}
]
};
try {
// Execute API request
const response = await fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(requestBody)
});
const data = await response.json();
// Process response
if (data.candidates && data.candidates.length > 0) {
const svgContent = data.candidates[0].content.parts[0].text;
return svgContent;
} else {
throw new Error("Response from API is not valid: " + JSON.stringify(data));
}
} catch (error) {
console.error("Error occurred during request to Gemini API:", error);
throw error;
}
}
3-2. Haiku prompt¶
// Set API key (in actual use, retrieve it safely from environment variables, etc.)
const API_KEY = "YOUR_API_KEY";
const MODEL = "gemini-1.5-pro-latest";
// Request configuration
async function generateHaikuFromImage() {
// API endpoint
const endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${API_KEY}`;
// Base64 encoded image data
const imageData = "";
// Build request body
const requestBody = {
contents: [
{
parts: [
{
text: "Please create a haiku based on this Zen garden (karesansui) image."
},
{
inlineData: {
mimeType: "image/jpeg",
data: imageData
}
}
]
}
],
systemInstruction: {
parts: [
{
text: `# Role
You are a master haiku poet with deep knowledge of Japanese aesthetics and Zen philosophy.
# Task
1. Carefully observe the provided image of a Zen rock garden (karesansui).
2. Create a Japanese haiku that captures the essence, visual elements, and atmosphere of the garden.
3. Translate the haiku into English following the translation guidelines below.
# Japanese Haiku Requirements
- Follow the traditional 5-7-5 syllable structure (5-7-5音).
- Include an appropriate seasonal reference (kigo/季語).
- Reflect visual elements of the rock garden (line patterns, sand textures, overall composition).
- Embody Zen spirit and Japanese aesthetics (wabi-sabi/わび・さび, yugen/幽玄).
# English Translation Guidelines
1. **Syllable Structure:**
- No need to maintain the strict 5-7-5 syllable pattern in English.
- Recommended options:
* 3-5-3 syllables (11 total)
* 2-3-2 syllables (7 total)
* Free form but maintain a three-line structure
2. **Seasonal References:**
- Preserve the seasonal word (kigo) in a culturally appropriate way.
- Example: "名月" → "harvest moon" rather than literal "famous moon"
3. **Cutting Words:**
- Transform Japanese cutting words ("や"/"かな", etc.) into appropriate English punctuation (commas, dashes, exclamation marks) or line breaks.
4. **Translation Priorities:**
- Meaning: Clearly convey the original intent
- Conciseness: Avoid unnecessary words
- Imagery: Use vivid, evocative language
- Rhythm: Maintain natural flow in English
5. **Core Principle:**
- Translation is a cultural and poetic bridge, not word-for-word conversion.
- The spirit and beauty of the haiku should resonate with English readers as poetry.
# Output Format
You must strictly adhere to the following format and provide nothing else:
俳句: [JAPANESE HAIKU WITH 5-7-5 STRUCTURE]
英訳: [ENGLISH TRANSLATION FOLLOWING GUIDELINES]
Do not include any additional explanations, comments, or text outside this exact structure. Do not number the entries or add any formatting beyond what is specified.
# Examples
The following are examples of the required format:
俳句: 古池や 蛙飛び込む 水の音
英訳: An old silent pond... A frog jumps into the pond, splash! Silence again.
俳句: 桃の花 散りゆく様は 桜かな
英訳: The peach blossoms As they scatter Look like cherry blossoms.
俳句: 月一輪 星無数空 緑なり
英訳: Around the lone moon countless stars the sky now green.`
}
]
},
generationConfig: {
temperature: 0.85,
topP: 0.9,
topK: 45,
maxOutputTokens: 256,
stopSequences: []
},
safetySettings: [
{
category: "HARM_CATEGORY_HATE_SPEECH",
threshold: "BLOCK_ONLY_HIGH"
},
{
category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
threshold: "BLOCK_ONLY_HIGH"
},
{
category: "HARM_CATEGORY_DANGEROUS_CONTENT",
threshold: "BLOCK_ONLY_HIGH"
},
{
category: "HARM_CATEGORY_HARASSMENT",
threshold: "BLOCK_ONLY_HIGH"
}
]
};
try {
// Execute API request
const response = await fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(requestBody)
});
const data = await response.json();
// Process response
if (data.candidates && data.candidates.length > 0) {
const generatedContent = data.candidates[0].content.parts[0].text;
return generatedContent;
} else {
throw new Error("Response from API is not valid: " + JSON.stringify(data));
}
} catch (error) {
console.error("Error occurred during request to Gemini API:", error);
throw error;
}
}
4. Program¶
https://github.com/tokuyama-y/mml
5. Website¶
https://machinical-memory-landscapes.cloud