Difference between revisions of "Msc1G2:Student4"
From ex25
Line 82: | Line 82: | ||
</html> | </html> | ||
<i>First approach to geometry</i> | <i>First approach to geometry</i> | ||
− | < | + | |
+ | == '''Arduino code''' == | ||
+ | |||
+ | <nowiki> | ||
+ | struct Sensor; | ||
+ | |||
+ | Sensor nextState(Sensor);</nowiki> | ||
+ | |||
+ | <nowiki> | ||
+ | // Arduino code for Swarmscape prototype 2015-01-26 | ||
+ | // Setup: FSR pressure sensors + array outputs linked to electronic valves | ||
+ | |||
+ | #include "sensor.h" | ||
+ | #include <TimerOne.h> | ||
+ | |||
+ | // Setting constants | ||
+ | int ledPin = 13; | ||
+ | int SENSOR_THRESHOLD = 40; | ||
+ | int SENSOR_TIMEOUT = 50; | ||
+ | int DEFLATE_TIMEOUT = 70; | ||
+ | int PRESSUREMAP_LOW = 0; | ||
+ | int PRESSUREMAP_HIGH = 750; | ||
+ | int MEASURE_TRESHOLD = 7; | ||
+ | |||
+ | // Building the structure | ||
+ | enum sensorState { | ||
+ | set1, | ||
+ | set2, | ||
+ | idle, | ||
+ | activated, | ||
+ | measure, | ||
+ | released, | ||
+ | timed_out, | ||
+ | deflate | ||
+ | }; | ||
+ | |||
+ | struct Sensor { | ||
+ | sensorState state; | ||
+ | int pin; | ||
+ | int time; | ||
+ | int pressure; | ||
+ | int out_pin; | ||
+ | int defl_pin1; | ||
+ | int defl_pin2; | ||
+ | }; | ||
+ | |||
+ | Sensor sensor1 = {set1, A0, 0, 80, 12, 11, 14}; | ||
+ | Sensor sensor2 = {set1, A1, 0, 80, 9, 7, 18}; | ||
+ | Sensor sensor3 = {set1, A2, 0, 80, 5, 3, 22}; | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | pinMode(sensor1.pin, INPUT); | ||
+ | pinMode(sensor2.pin, INPUT); | ||
+ | pinMode(sensor3.pin, INPUT); | ||
+ | |||
+ | pinMode(sensor1.out_pin, OUTPUT); | ||
+ | pinMode(sensor2.out_pin, OUTPUT); | ||
+ | pinMode(sensor3.out_pin, OUTPUT); | ||
+ | |||
+ | pinMode(ledPin, OUTPUT); | ||
+ | |||
+ | pinMode(sensor1.defl_pin1, OUTPUT); | ||
+ | pinMode(sensor1.defl_pin2, OUTPUT); | ||
+ | pinMode(sensor2.defl_pin1, OUTPUT); | ||
+ | pinMode(sensor2.defl_pin2, OUTPUT); | ||
+ | pinMode(sensor3.defl_pin1, OUTPUT); | ||
+ | pinMode(sensor3.defl_pin2, OUTPUT); | ||
+ | |||
+ | Timer1.initialize(50000); // initialize timer1, and set a 1/2 second period | ||
+ | |||
+ | Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt | ||
+ | |||
+ | Serial.println("Start: "); | ||
+ | Serial.print("sensor1: "); | ||
+ | Serial.print(sensor1.state); Serial.print(' '); | ||
+ | Serial.print(sensor1.pin); Serial.print(' '); | ||
+ | Serial.print(sensor1.time); Serial.print(' '); | ||
+ | Serial.println(sensor1.out_pin); | ||
+ | Serial.print("sensor2: "); | ||
+ | Serial.print(sensor2.state); Serial.print(' '); | ||
+ | Serial.print(sensor2.pin); Serial.print(' '); | ||
+ | Serial.print(sensor2.time); Serial.print(' '); | ||
+ | Serial.println(sensor2.out_pin); | ||
+ | Serial.print("sensor3: "); | ||
+ | Serial.print(sensor3.state); Serial.print(' '); | ||
+ | Serial.print(sensor3.pin); | ||
+ | } | ||
+ | |||
+ | |||
+ | void callback() { | ||
+ | sensor1 = nextState(sensor1); | ||
+ | sensor2 = nextState(sensor2); | ||
+ | sensor3 = nextState(sensor3); | ||
+ | |||
+ | Serial.print("State 1: "); | ||
+ | Serial.print(sensor1.state);Serial.print(";"); | ||
+ | Serial.print(sensor1.time); | ||
+ | |||
+ | Serial.print("State 2: "); | ||
+ | Serial.print(sensor2.state);Serial.print(";"); | ||
+ | Serial.print(sensor2.time); | ||
+ | |||
+ | Serial.print("State 3: "); | ||
+ | Serial.print(sensor3.state);Serial.print(";"); | ||
+ | Serial.print(sensor3.time); | ||
+ | Serial.print("\n"); | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | // your program here... | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | Sensor nextState(Sensor sensor) { | ||
+ | Sensor nextState = {sensor.state, sensor.pin, sensor.time, sensor.pressure, sensor.out_pin, | ||
+ | sensor.defl_pin1, sensor.defl_pin2}; | ||
+ | boolean pressed = analogRead(sensor.pin) > SENSOR_THRESHOLD; | ||
+ | |||
+ | switch (sensor.state) { | ||
+ | // Setup state | ||
+ | case set1: | ||
+ | digitalWrite(sensor.out_pin, 1); | ||
+ | nextState.state = set2; | ||
+ | nextState.state = idle; | ||
+ | break; | ||
+ | |||
+ | case set2: | ||
+ | nextState.time ++; | ||
+ | if (sensor.time > 50) { | ||
+ | digitalWrite(sensor.defl_pin1, 0); | ||
+ | digitalWrite(sensor.defl_pin2, 0); | ||
+ | nextState.time = 0; | ||
+ | nextState.state = idle; | ||
+ | } | ||
+ | else { | ||
+ | nextState.state = set2; | ||
+ | } | ||
+ | break; | ||
+ | // Idle state | ||
+ | case idle: | ||
+ | nextState.time = 0; | ||
+ | if (pressed) { | ||
+ | nextState.state = measure; | ||
+ | } else { | ||
+ | nextState.state = idle; | ||
+ | } | ||
+ | break; | ||
+ | // Measurementstate | ||
+ | case measure: | ||
+ | nextState.time++; | ||
+ | if(sensor.time > MEASURE_TRESHOLD); | ||
+ | digitalWrite(sensor.out_pin, 0); | ||
+ | sensor.pressure = analogRead(sensor.pin); | ||
+ | nextState.time = 0; | ||
+ | nextState.state = activated; | ||
+ | } | ||
+ | else { | ||
+ | nextState.state = measure; | ||
+ | } | ||
+ | break; | ||
+ | // Activated state | ||
+ | case activated: | ||
+ | if (pressed) { | ||
+ | nextState.time ++; | ||
+ | } else { | ||
+ | nextState.state = timed_out; | ||
+ | } | ||
+ | |||
+ | if (sensor.time > SENSOR_TIMEOUT) { | ||
+ | nextState.state = timed_out; | ||
+ | } | ||
+ | |||
+ | break; | ||
+ | // Released state (stays up) | ||
+ | case released: | ||
+ | digitalWrite(sensor.out_pin, 1); | ||
+ | nextState.time++; | ||
+ | if(sensor.time > map(sensor.pressure, 0, 1024, PRESSUREMAP_LOW, PRESSUREMAP_HIGH)) { | ||
+ | digitalWrite(ledPin, 0); | ||
+ | nextState.time = 0; | ||
+ | nextState.state = deflate; | ||
+ | } | ||
+ | else { | ||
+ | digitalWrite(ledPin, 1); | ||
+ | nextState.state = released; | ||
+ | } | ||
+ | break; | ||
+ | // Time-out state | ||
+ | case timed_out: | ||
+ | digitalWrite(sensor.out_pin, 1); | ||
+ | if (pressed) { | ||
+ | nextState.state = timed_out; | ||
+ | } else { | ||
+ | nextState.state = released; | ||
+ | } | ||
+ | break; | ||
+ | // Deflate state | ||
+ | case deflate: | ||
+ | nextState.time++; | ||
+ | digitalWrite(sensor.defl_pin1, 0); | ||
+ | digitalWrite(sensor.defl_pin2, 0); | ||
+ | if (sensor.time > DEFLATE_TIMEOUT) { | ||
+ | digitalWrite(sensor.defl_pin1, 1); | ||
+ | digitalWrite(sensor.defl_pin2, 1); | ||
+ | nextState.state = idle; | ||
+ | } | ||
+ | else { | ||
+ | nextState.state = deflate; | ||
+ | } | ||
+ | break; | ||
+ | default: | ||
+ | break; | ||
+ | } | ||
+ | return nextState; | ||
+ | }</nowiki> |
Revision as of 12:16, 26 January 2016
Pneumatics
1st silicone prototype for pneumatic actuators
2nd silicone prototype for pneumatic actuators
pneumatic idea
arduino + electromagnetic valves + airpumps
Simulation
Shape
Structure
Possible modul arrangement on curve created by the system
First attempt to calculate the folding of the arms (iterartion with a feedback loop)
Dynamic reaction to random attractor points (kangaroo physics)
Modul arrangement + attractor points
First approach to geometry
Arduino code
struct Sensor; Sensor nextState(Sensor);
// Arduino code for Swarmscape prototype 2015-01-26 // Setup: FSR pressure sensors + array outputs linked to electronic valves #include "sensor.h" #include <TimerOne.h> // Setting constants int ledPin = 13; int SENSOR_THRESHOLD = 40; int SENSOR_TIMEOUT = 50; int DEFLATE_TIMEOUT = 70; int PRESSUREMAP_LOW = 0; int PRESSUREMAP_HIGH = 750; int MEASURE_TRESHOLD = 7; // Building the structure enum sensorState { set1, set2, idle, activated, measure, released, timed_out, deflate }; struct Sensor { sensorState state; int pin; int time; int pressure; int out_pin; int defl_pin1; int defl_pin2; }; Sensor sensor1 = {set1, A0, 0, 80, 12, 11, 14}; Sensor sensor2 = {set1, A1, 0, 80, 9, 7, 18}; Sensor sensor3 = {set1, A2, 0, 80, 5, 3, 22}; void setup() { Serial.begin(9600); pinMode(sensor1.pin, INPUT); pinMode(sensor2.pin, INPUT); pinMode(sensor3.pin, INPUT); pinMode(sensor1.out_pin, OUTPUT); pinMode(sensor2.out_pin, OUTPUT); pinMode(sensor3.out_pin, OUTPUT); pinMode(ledPin, OUTPUT); pinMode(sensor1.defl_pin1, OUTPUT); pinMode(sensor1.defl_pin2, OUTPUT); pinMode(sensor2.defl_pin1, OUTPUT); pinMode(sensor2.defl_pin2, OUTPUT); pinMode(sensor3.defl_pin1, OUTPUT); pinMode(sensor3.defl_pin2, OUTPUT); Timer1.initialize(50000); // initialize timer1, and set a 1/2 second period Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt Serial.println("Start: "); Serial.print("sensor1: "); Serial.print(sensor1.state); Serial.print(' '); Serial.print(sensor1.pin); Serial.print(' '); Serial.print(sensor1.time); Serial.print(' '); Serial.println(sensor1.out_pin); Serial.print("sensor2: "); Serial.print(sensor2.state); Serial.print(' '); Serial.print(sensor2.pin); Serial.print(' '); Serial.print(sensor2.time); Serial.print(' '); Serial.println(sensor2.out_pin); Serial.print("sensor3: "); Serial.print(sensor3.state); Serial.print(' '); Serial.print(sensor3.pin); } void callback() { sensor1 = nextState(sensor1); sensor2 = nextState(sensor2); sensor3 = nextState(sensor3); Serial.print("State 1: "); Serial.print(sensor1.state);Serial.print(";"); Serial.print(sensor1.time); Serial.print("State 2: "); Serial.print(sensor2.state);Serial.print(";"); Serial.print(sensor2.time); Serial.print("State 3: "); Serial.print(sensor3.state);Serial.print(";"); Serial.print(sensor3.time); Serial.print("\n"); } void loop() { // your program here... } Sensor nextState(Sensor sensor) { Sensor nextState = {sensor.state, sensor.pin, sensor.time, sensor.pressure, sensor.out_pin, sensor.defl_pin1, sensor.defl_pin2}; boolean pressed = analogRead(sensor.pin) > SENSOR_THRESHOLD; switch (sensor.state) { // Setup state case set1: digitalWrite(sensor.out_pin, 1); nextState.state = set2; nextState.state = idle; break; case set2: nextState.time ++; if (sensor.time > 50) { digitalWrite(sensor.defl_pin1, 0); digitalWrite(sensor.defl_pin2, 0); nextState.time = 0; nextState.state = idle; } else { nextState.state = set2; } break; // Idle state case idle: nextState.time = 0; if (pressed) { nextState.state = measure; } else { nextState.state = idle; } break; // Measurementstate case measure: nextState.time++; if(sensor.time > MEASURE_TRESHOLD); digitalWrite(sensor.out_pin, 0); sensor.pressure = analogRead(sensor.pin); nextState.time = 0; nextState.state = activated; } else { nextState.state = measure; } break; // Activated state case activated: if (pressed) { nextState.time ++; } else { nextState.state = timed_out; } if (sensor.time > SENSOR_TIMEOUT) { nextState.state = timed_out; } break; // Released state (stays up) case released: digitalWrite(sensor.out_pin, 1); nextState.time++; if(sensor.time > map(sensor.pressure, 0, 1024, PRESSUREMAP_LOW, PRESSUREMAP_HIGH)) { digitalWrite(ledPin, 0); nextState.time = 0; nextState.state = deflate; } else { digitalWrite(ledPin, 1); nextState.state = released; } break; // Time-out state case timed_out: digitalWrite(sensor.out_pin, 1); if (pressed) { nextState.state = timed_out; } else { nextState.state = released; } break; // Deflate state case deflate: nextState.time++; digitalWrite(sensor.defl_pin1, 0); digitalWrite(sensor.defl_pin2, 0); if (sensor.time > DEFLATE_TIMEOUT) { digitalWrite(sensor.defl_pin1, 1); digitalWrite(sensor.defl_pin2, 1); nextState.state = idle; } else { nextState.state = deflate; } break; default: break; } return nextState; }