OBJECTIVES
Architecture has a long tradition of struggling with defining the concept of form verses function. In the recent decade or so, we have seen the up-rise of sustainable buildings focusing on maximizing efficiency of buildings through green technology such as green walls or roof etc. but yet retaining either the traditional architectural forms or the design development processes. Today, we are experiencing different sustainable approaches ranging from responsive parametric architecture to Building Information Modelling (BIM) softwares focusing on building productivity and performance. Currently, much emphasis had been placed on creating adaptive skin over the envelope of buildings that would react to climatic changes via sensors. These approaches disrupt the traditional way of designing as it takes into account of manoeuvrable parts and highly complex organic forms that were once considered near impossible in construction.
< DESIGN INTENT >
The development of the final project, based on adaptive surface/ facade,
wrapped around the idea of maneuvering modular components through the use of sensors. The direct application
for such system can be implemented on building facades where it shades or opens up like an umbrella, enhancing
the overall climatic efficiency according to the surrounding environment.
Below are links to references of influential projects and images of study facade models.
REFERENCES
Shape Shifting Architecture Flexible modular components |
|
Thermal Metal Surfaces Responsive bi-metal application |
|
Phototropia Electro-active polymer, bio-plastics & solar cells |
|
Al Bahar Towers Responsive modular facade |
< DESIGN STRATEGY >
Rhino file: 00_KeithTan_KineticFacadePrototype.zip
The Kinetic Facade Installation
The final project will emcompass a layer of skin over modular skeletal frame.
It will be produced as a small scale prototype, more like an installation, with suggestive materials.
The skin, which is essentially a sheet of PVC ( transparency) film,
will fold or unfold depending on the amount of light received by the phototransistor.
In the context of an actual building project, the PVC film acts like a canopy or foldable mechanism.
The modules can be stacked up to form a wall or potentially a design proposal for architectural facades.
Below is an illustration of the general principles behind the design concept.
< DESIGN DEVELOPMENT >
// hello.reflect.servo.44.2.c // // light reflection synchronous detection hello-world // 9600 baud FTDI interface // // Neil Gershenfeld // 10/25/12 // // (c) Massachusetts Institute of Technology 2012 // This work may be reproduced, modified, distributed, // performed, and displayed for any purpose. Copyright is // retained and must be preserved. The work is provided // as is; no warranty is provided, and users accept all // liability. // // // Modified by Keith Tan. FABnovation*** // Added code for servo outputs // 14/6/16 // #include#include #define output(directions,pin) (directions |= pin) // set port direction for output #define set(port,pin) (port |= pin) // set port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set #define bit_delay_time 102 // bit delay for 9600 with overhead #define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay #define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay #define char_delay() _delay_ms(10) // char delay #define position_delay() _delay_ms(1000) // PWM delay*** //Define T44 to Computer (FTDI) pin*** #define serial_port PORTA #define serial_direction DDRA #define serial_pin_out (1 << PA1) //Define PWM pins*** #define PWM_port PORTA #define PWM_direction DDRA #define PWM_pin_0 (1 << PA7) #define PWM_pin_1 (1 << PB0) #define nloop 100 // Sensor- number of loops to accumulate #define loop_count 30 // PWM- number of loops to accumulate*** void put_char(volatile unsigned char *port, unsigned char pin, char txchar) { // // send character in txchar on port pin // assumes line driver (inverts bits) // // start bit // clear(*port,pin); bit_delay(); // // unrolled loop to write data bits // if bit_test(txchar,0) set(*port,pin); else clear(*port,pin); bit_delay(); if bit_test(txchar,1) set(*port,pin); else clear(*port,pin); bit_delay(); if bit_test(txchar,2) set(*port,pin); else clear(*port,pin); bit_delay(); if bit_test(txchar,3) set(*port,pin); else clear(*port,pin); bit_delay(); if bit_test(txchar,4) set(*port,pin); else clear(*port,pin); bit_delay(); if bit_test(txchar,5) set(*port,pin); else clear(*port,pin); bit_delay(); if bit_test(txchar,6) set(*port,pin); else clear(*port,pin); bit_delay(); if bit_test(txchar,7) set(*port,pin); else clear(*port,pin); bit_delay(); // // stop bit // set(*port,pin); bit_delay(); // // char delay // bit_delay(); } int main(void) { // // main // //Sensor*** static char chr; //PWM*** static uint8_t i; static uint16_t on,off; // // // set clock divider to /1 // CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // // initialize output pins // set(serial_port, serial_pin_out); output(serial_direction, serial_pin_out); set(PWM_port, PWM_pin_0); output(PWM_direction, PWM_pin_0); set(PWM_port, PWM_pin_1); output(PWM_direction, PWM_pin_1); // // // // init A/D*** // ADCSRA = (1 << ADEN) // enable | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // prescaler /128 // // main loop // while (1) { // //Select A/D Channel 1*** ADMUX = (0 << REFS1) | (0 << REFS0) // Vcc ref | (0 << ADLAR) // right adjust | (0 << MUX5) | (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0); // ADC2 (Pin PA2)*** // // start conversion*** // ADCSRA |= (1 << ADSC); // // wait for completion // while (ADCSRA & (1 << ADSC)) ; // // send/read result 1 // chr = ADCL; put_char(&serial_port, serial_pin_out, chr); char_delay(); chr = ADCH; put_char(&serial_port, serial_pin_out, chr); char_delay(); // // save result // off += ADC; // // //Select A/D Channel 2*** ADMUX = (0 << REFS1) | (0 << REFS0) // Vcc ref | (0 << ADLAR) // right adjust | (0 << MUX5) | (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0); // ADC3 (Pin PA3)*** // // start conversion*** // ADCSRA |= (1 << ADSC); // // wait for completion // while (ADCSRA & (1 << ADSC)) ; // // send/read result 1 // chr = ADCL; put_char(&serial_port, serial_pin_out, chr); char_delay(); chr = ADCH; put_char(&serial_port, serial_pin_out, chr); char_delay(); // // save result // on += ADC; // //Steven's Method //code = ADCH*256+ADCL; //if (code>200) // code=200; //t = (10*code+1000); //set(PWM_port, PWM_pin_0); //delay_us(t); //clear(PWM_port,PWM_pin_0); //delay_us(20000-t); //set(PWM_port, PWM_pin_1); //delay_us(t); //clear(PWM_port,PWM_pin_1); //delay_us(20000-t); // // accumulate*** // on = 0; off = 0; for (i = 0; i < loop_count; ++i) { // // Servo on*** // clear(PWM_port,PWM_pin_0); clear(PWM_port,PWM_pin_1); _delay_us(19000); } // // Servo off*** // set(PWM_port,PWM_pin_0); set(PWM_port,PWM_pin_1); _delay_us(1000); } // // send framing // put_char(&serial_port, serial_pin_out, 1); char_delay(); put_char(&serial_port, serial_pin_out, 2); char_delay(); put_char(&serial_port, serial_pin_out, 3); char_delay(); put_char(&serial_port, serial_pin_out, 4); char_delay(); // // send result // put_char(&serial_port, serial_pin_out, (on & 255)); char_delay(); put_char(&serial_port, serial_pin_out, ((on >> 8) & 255)); char_delay(); put_char(&serial_port, serial_pin_out, (off & 255)); char_delay(); put_char(&serial_port, serial_pin_out, ((off >> 8) & 255)); char_delay(); }
/* Juan Pablo Gutierrez Salazar Attiny code for servo controlling with help from Daniel Pineda. based on https://github.com/Jan--Henrik/Attiny-PWM-generator/blob/master/Final%20code */ int analog1 = 3; //Analog Input int pwm1 = 7; //PWM Output int i = 0; void setup(){ pinMode(analog1,INPUT); pinMode(pwm1, OUTPUT); //pinmodes } void loop(){ int an1 = analogRead(analog1); // lecture number photoresistor int pwmServo1 = (int)((255.*an1)/900.); analogWrite(pwm1, pwmServo1); //set pwm i++; if (i == 50){ i = 0; } delay(10); }
#includeSoftwareSerial mySerial(0, 1); // RX, TX pins int ldr1=2;//Photoresistor 1 int pwm1=7;//Servo 1. Check out pighixxx diagram for acurate numbering int ldr2=3;//Photoresistor 2 int pwm2=10;//Servo 2. Check out pighixxx diagram for acurate numbering int Tmax = 20000;//servo range int code, t;//define t void setup() { // setup sensor 1 code here, to run once: mySerial.begin(9600); mySerial.println("Bit-banging - reading ADC Ch1"); //pinMode(ldr1, INPUT); pinMode(pwm1, OUTPUT); // setup sensor 2 code here, to run once: mySerial.begin(9600); mySerial.println("Bit-banging - reading ADC Ch2"); //pinMode(ldr2, INPUT); pinMode(pwm2, OUTPUT); } void loop() { // put your servo 1 code here, to run repeatedly: ///* code = analogRead(ldr1); mySerial.println(code); //code /= 5; // scale for servo input range t = (code + 1000); digitalWrite(pwm1, HIGH); delayMicroseconds(t); digitalWrite(pwm1, LOW); delayMicroseconds(Tmax - t); //delay(1000); // put your servo 2 code here, to run repeatedly: ///* code = analogRead(ldr2); mySerial.println(code); //code /= 5; // scale for servo input range t = (code + 1000); digitalWrite(pwm2, HIGH); delayMicroseconds(t); digitalWrite(pwm2, LOW); delayMicroseconds(Tmax - t); //delay(1000); }