Difference between revisions of "Msc1G2:Student4"

From ex25
Jump to: navigation, search
(Arduino code)
Line 86: Line 86:
  
 
  <nowiki>
 
  <nowiki>
 +
//sensor.h defenition (used instead of void)
 
struct Sensor;
 
struct Sensor;
  

Revision as of 12:17, 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

//sensor.h defenition (used instead of void)
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;
}