Difference between revisions of "Msc1G2:Student4"

From ex25
Jump to: navigation, search
Line 82: Line 82:
 
</html>
 
</html>
 
<i>First approach to geometry</i>
 
<i>First approach to geometry</i>
<br>
+
 
 +
== '''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

Group2 151215 2ndprototype.jpg 1st silicone prototype for pneumatic actuators

Group2 151215 3rdprototype.jpg 2nd silicone prototype for pneumatic actuators

pneumatic idea

Group2 151209 arduinomega-setup-pumps+valves.png arduino + electromagnetic valves + airpumps

Simulation

Shape

Group2 151203 origami folding.jpg Origami folding

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;
}