Kinetic Facade Prototype (Academics)

Greetings to the community! I'm currently immersed in my architecture research thesis, focusing on kinetic facades. I've successfully implemented Arduino code and sensors for flap movement using a single servo motor. However, I'm facing a challenge with the mechanical design to achieve the desired flap movement.

I've included a video link below that demonstrates the motion I'm aiming for. If anyone could offer insights or guidance on how to transfer the servo motor's rotation to achieve this specific flap movement, I would be immensely grateful for your expertise. Also what type of motion it is called!

If you observe closely around the 0:20 mark, there's a motor visible, possibly a brushless motor based on my reading of the description. Although I suspect it's custom-made, I aim to replicate this motion using a servo motor with a 180-degree rotation capability. I've provided the link to the servo motor below. My goal is to create a small-scale prototype.

Thank you in advance for any assistance you can provide. Your insights will undoubtedly contribute to the success of my project. Happy coding and designing!

Another Video with the same motion but different geometry -

Good. Posting the code would make us know more. Please read the sectioion "Coode problems" in this topic: How to get the best out of this forum - Using Arduino / IDE 1.x - Arduino Forum

About mechanical movements torque is often a key parameter. Making the mechanical load balanced makes less torque needed from the servo.
Posting links to datasheets for motor and power supply will make replies more precise.

Thank you so much for the reply! I have done coding using Firefly plugin in Rhino Grasshopper. It can't be said coding as Grasshopper is visual programming language based software which means I can drag and drop components on canvas and run it accordingly. I will post rhino grasshopper file very soon.

If you want a sculpture that will last, servos are not a good choice. They are intended for occasional use in toys, have many moving parts and will break down within weeks to months if used to generate the continuous motion shown in the videos.

Steppers have only one moving part and will last for years. To convert rotary motion to linear motion, threaded rods with traveling nuts or other mechanisms, like cranks and rods, are used (search phrase "rotary to linear motion").

There are small linear actuators that are more reliable and have the same electrical/control interface as an RC servo. They do tend to be much more expensive though, which is not surprising.

/*
Firefly Code Generator by Andy Payne
Copyright 2011 All Rights Reserved
Code Generated on 01/05/2024 09:58:52
Special thanks to Panagiotis Michalatos.
For more information visit: www.fireflyexperiments.com
*/

#include "FFCasts.h"
#include <Servo.h>

//******************* Begin Function Definitions *******************

//Remap Number Function: Remap a value into a new numeric domain.
double Remap_Numbers(double x, Interval _in, Interval _out) {
return (x - _in.t0) * (_out.t1 - _out.t0) / (_in.t1 - _in.t0) + _out.t0;
}

//Multiplication Function: Multiply two numbers.
inline double Multiplication(double _v1, double _v2){
return _v1 * _v2;
}

//Constrain Function: Constrains a number to a specific numeric range.
double Constrain(double _v1, Interval _in){
double _min, _max, result;
if (_in.t0 < _in.t1){
_min = _in.t0;
_max = _in.t1;
}else{
_min = _in.t1;
_max = _in.t0;
}
if (_v1 < _min){
result = _min;
}else if (_v1 > _max){
result = _max;
}else{
result = _v1;
}return result;
}

double smoothlist_0[1];
int smoothindex_0 = 0;
double smoothtotal_0 = 0.0;

//Smoothing Function: Smooth (or average) an incoming value based on (N) number of samples.
double Smoothing_Moving_Average(double _v1, int _n, double *_list, int _index, double _total){
_total -= _list[_index];
_total += _v1;
_list[
_index] = _v1;
(
_index)++;
if (
_index >= _n) *_index = 0;
return *_total/(double)_n;
}

//******************** End Function Definitions ********************

Servo servo-1;

void setup() {
int smi;
for(smi = 0; smi < 1; ++smi) {
smoothlist_0[smi] = 0.0;
}
servo-1.attach(-1);
}

void loop() {
digitalWrite(-1, Multiplication(Remap_Numbers(Analog_Pin_0,Interval(500,1000),Interval(0,1)),0));
digitalWrite(-1, Multiplication(Remap_Numbers(Analog_Pin_0,Interval(500,1000),Interval(1,0)),0));
servo-1.write(Smoothing_Moving_Average(Remap_Numbers(Constrain(Analog_Pin_0,Interval(500,1000)),Interval(500,1000),Interval(75,100)),1, smoothlist_0, &smoothindex_0, &smoothtotal_0));
}

I dont know if the code is correct or not, I copied it from the code generator component from firefly.


This is how it looks in grasshopper

Please format code before posting.
Sorry but that grasshopper picture is not useful.

Servos will be fine for prototype, moving the flaps should not require a great deal of force.

The description under the video says "The wall moves thanks to 139 brushless motors and custom-designed mechanisms and motion controllers hidden into the frame. " Each motor controls 1 or 2 flaps, which are arranged in a square or hex pattern. In the hex arrangement, at the edges there will be only one flap per motor.

For a practical design, which presumably would want to optimize for cost, I guess you want motors that are long lasting but also cost effective. I can imagine in some applications the wall might be moved infrequently, like a window shutter, and in others moved constantly, or even synched in time to music if the surfaces were mirrored. So deciding on the expected duty cycle is crucial here.

Another factor might be noise, a 100 or so motors grinding gears might be distracting.

From an aesthetic point of view, I would also want to hide the motors in framework.

There are multiple issues with the code, although without knowing the design intent, nor how the code generator works, it hard to say how to fix them. It seems weird to me to be programming a microcontroller from a 3D CAD package, but maybe I am just old-fashioned.

Servo servo-1;

That is not even a valid name, so I guess that is a bug in the code generator. Or perhaps it is a name you have defined, in which case I suggest "servo1" or "servo_1".

servo-1.attach(-1);

-1 is not a valid pin, you need to specify the pin the servo is attached to.

digitalWrite(-1, Multiplication(Remap_Numbers(Analog_Pin_0,Interval(500,1000),Interval(0,1)),0));

Three problems here:

  1. -1 is not a valid pin, you need to specify a valid pin number
  2. Analog_Pin_0 is just the pin number, to read an analog value it should be analogRead(pin).
  3. Multiplication() is called with second parameter of 0, so the output will always be zero.

I can't guess why digitalWrite() is being called here, I assume there is a reason.

With no text in the boxes??

There is a behind the scenes video here:

The description describes stepper motors, they do appear to be geared steppers. At 0:19 there is a glimpse of a microcontroller, but this may be unrelated and just a prop for video purposes.

SInce this is for academic purposes, have you tried contacting the company and asking if they would share the construction details?

Definitely. I have a life test of a Futaba servo running on my desk (I'm curious) and it's loud enough with just one servo moving back and forth. I just started and at 100 cycles it's already annoying me enough that I might stop it.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.