6. Testing and Refinement Phase

Problems Upon Deployment of Final:

1. Tri-Axis Sensor
Problem: Exhibits erratical accelerations on all axis.

Hypothesis: The motor is emitting electromagnetic waves that are interfering with the sensor's operation.


    Steps Taken:
    1. Created housing for the tri-axis using aluminum sheets
      1. FAILED
    2. Shielded the wires using aluminum sheets
      1. FAILED
    3. Enclosed the motor cavity with alluminum plating
      1. FAILED
    4. Moved the tri-axis further from the motor
      1. FAILED
    5. Shielded the wires using wire insulation stripped from a USB cord
      1. FAILED
    6. Used copper plates to shield tri-axis
      1. FAILED
    7. Placed magnetic needle next to motor when in operation, and had no signs of noise emitting from the motor.
      1. PASS
 
New Hypothesis: Miniscule vibrations are traveling through the helicopter frame during operation, causing the severe interference with the sensor's operation.
 
    Steps Taken:
    1. Isolated resonance vibration by mitigating the problem using vibration foam around the tri-axis sensor, as well as dense acrylic to absorb excess vibrations (see photos). This subsequently solved the issue.
      1. PASS
 
Mounting Vibration Isolation Unit: This unit had to be independent from the fram of the helicopter. Any direct contact to the helicopter chasis could potentially nullify all desired effects.
 
    Steps Taken:
    1. Attempted to mount isolation unit using rubber bands to suspend the unit in air
      1. FAIL
    2. Attatched rods to the landing gear to increase height clearence
      1. FAIL
    3. Inverted the tri-axis within the isolation unit
      1. FAIL
    4. Rotated the tri-axis within the isolation unit
      1. FAIL
    5. Attatched two more vibration pads to the isolation unit to make chassi mounting possible
      1. PASS
 
 


2. Compass
Problem: Too unreliable for use, fluctuates by up to 180 degrees.

Hypothesis: The motor is giving off noise throwing the compass off course.

Solution: Still a work in progress, however, we have ruled out radiation from the motor as being a problem, instead the probable cause is the nature of the sensor, not meant to be used for this purpose.

3. Motor
Problem: The motor sometimes fails to initate start up sequence and releases "whining" sound.

Hypothesis: Motor is reaching end of life.

Solution: Ordered new motor.

4. LED Base Station
During testing and refinement stage, we decided to mount blue LEDs and have them sweep through code in order to simulate a helipad.
Our original design utilized two regular Arduino's, however, our final design boasts one Arduino Mega. Because of this, we had to change the code substantially to accommodate the whole thing on one Mega. Also, Jake Neighbors worked to make a new code without delays to enable the base station to perform other tasks without wasting processor time to delays.
You can see Eric Harmatz's original sweeping LED code below:

//helipad led code
//eric harmatz, media arts engineering
//revised 12/14/2009

//digital 0 and 1 reserved for RX/TX

int ledPin1 = 22;
int ledPin2 = 23;
int ledPin3 = 24;
int ledPin4 = 25;
int ledPin5 = 26;
int ledPin6 = 27;
int ledPin7 = 28;
int ledPin8 = 29;
int ledPin9 = 30;
int ledPin10 =31;
int ledPin11 =32;
int ledPin12 =33;
int ledPin13 =34;
int ledPin14 =35;
int ledPin15 =36;
int ledPin16 =37;

void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  pinMode(ledPin9, OUTPUT);
  pinMode(ledPin10, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin14, OUTPUT);
  pinMode(ledPin15, OUTPUT);
  pinMode(ledPin16, OUTPUT);
 
}

void loop()
{
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin10,HIGH);
  digitalWrite(ledPin15, LOW);
  digitalWrite(ledPin12, LOW);
  delay(75);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin9, HIGH);
  digitalWrite(ledPin16, LOW);
  digitalWrite(ledPin11, LOW);
  delay(75);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin10,LOW);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin8, HIGH);
  delay(75);
  digitalWrite(ledPin2,LOW);
  digitalWrite(ledPin9,LOW);
  digitalWrite(ledPin4,HIGH);
  digitalWrite(ledPin7,HIGH);
  delay(75);
  digitalWrite(ledPin3,LOW);
  digitalWrite(ledPin8,LOW);
  digitalWrite(ledPin5,HIGH);
  digitalWrite(ledPin6,HIGH);
  delay(75);
  digitalWrite(ledPin4,LOW);
  digitalWrite(ledPin7,LOW);
  digitalWrite(ledPin6,HIGH);
  digitalWrite(ledPin5,HIGH);
  delay(75);
  digitalWrite(ledPin5,LOW);
  digitalWrite(ledPin6,LOW);
  digitalWrite(ledPin7,HIGH);
  digitalWrite(ledPin4,HIGH);
  delay(75);
  digitalWrite(ledPin6,LOW);
  digitalWrite(ledPin5,LOW);
  digitalWrite(ledPin8,HIGH);
  digitalWrite(ledPin3,HIGH);
  delay(75);
  digitalWrite(ledPin7,LOW);
  digitalWrite(ledPin4,LOW);
  digitalWrite(ledPin9,HIGH);
  digitalWrite(ledPin2,HIGH);
  delay(75);
  digitalWrite(ledPin8,LOW);
  digitalWrite(ledPin3,LOW);
  digitalWrite(ledPin10,HIGH);
  digitalWrite(ledPin1, HIGH);
  delay(75);
  digitalWrite(ledPin9,LOW);
  digitalWrite(ledPin2,LOW);
  digitalWrite(ledPin11,HIGH);
  digitalWrite(ledPin16,HIGH);
  delay(75);
  digitalWrite(ledPin10,LOW);
  digitalWrite(ledPin1,LOW);
  digitalWrite(ledPin12,HIGH);
  digitalWrite(ledPin15,HIGH);
  delay(75);
  digitalWrite(ledPin11,LOW);
  digitalWrite(ledPin16,LOW);
  digitalWrite(ledPin13,HIGH);
  digitalWrite(ledPin14,HIGH);
  delay(75);
  digitalWrite(ledPin12,LOW);
  digitalWrite(ledPin15,LOW);
  digitalWrite(ledPin14,HIGH);
  digitalWrite(ledPin13,HIGH);
  delay(75);
  digitalWrite(ledPin13,LOW);
  digitalWrite(ledPin14,LOW);
  digitalWrite(ledPin15,HIGH);
  digitalWrite(ledPin12,HIGH);
  delay(75);
  digitalWrite(ledPin14,LOW);
  digitalWrite(ledPin13,LOW);
  digitalWrite(ledPin16,HIGH);
  digitalWrite(ledPin11,HIGH);
  delay(75);
}

 

Eric and Jake finalized the code for the helipad that utilizes the "Modulus" function in order the change the sweeping motion of the helipad to form different designs.
The new code is below:

#define L1 22
#define L2 23
#define L3 24
#define L4 25
#define L5 26
#define L6 27
#define L7 28
#define L8 29

#define L9 30
#define L10 31
#define L11 32
#define L12 33
#define L13 34
#define L14 35
#define L15 36
#define L16 37

#define MOD TIME*8 //overall time for one loop
#define TIME 75 //delay in milliseconds for sweep

byte last=B00000000;

void setup()
{
  Serial.begin(9600);
  Serial.println("OK");
  for (int i=22;i<=37;i++)
  {
    pinMode(i,OUTPUT);
    //digitalWrite(i,HIGH);
  }
}

void loop()
{
  //digitalWrite(L16,HIGH);
 
  //set(B11111111);
  long _time;
  _time=millis()%(MOD*30);
  if(_time < MOD*10)
  {
         if (in(TIME*0,TIME*1,MOD)) { set(B11000000);setb(B11000000); }
    else if (in(TIME*1,TIME*2,MOD)) { set(B01100000);setb(B01100000); }
    else if (in(TIME*2,TIME*3,MOD)) { set(B00110000);setb(B00110000); }
    else if (in(TIME*3,TIME*4,MOD)) { set(B00011000);setb(B00011000); }
    else if (in(TIME*4,TIME*5,MOD)) { set(B00001100);setb(B00001100); }
    else if (in(TIME*5,TIME*6,MOD)) { set(B00000110);setb(B00000110); }
    else if (in(TIME*6,TIME*7,MOD)) { set(B00000011);setb(B00000011); }
    else if (in(TIME*7,TIME*8,MOD)) { set(B10000001);setb(B10000001); }
  }
  else if(_time > MOD*10 && _time < MOD*20)
  {
         if (in(TIME*0,TIME*1,MOD)) { set(B10000001);setb(B10000001); }
    else if (in(TIME*1,TIME*2,MOD)) { set(B00000011);setb(B00000011); }
    else if (in(TIME*2,TIME*3,MOD)) { set(B00000110);setb(B00000110); }
    else if (in(TIME*3,TIME*4,MOD)) { set(B00001100);setb(B00001100); }
    else if (in(TIME*4,TIME*5,MOD)) { set(B00011000);setb(B00011000); }
    else if (in(TIME*5,TIME*6,MOD)) { set(B00110000);setb(B00110000); }
    else if (in(TIME*6,TIME*7,MOD)) { set(B01100000);setb(B01100000); }
    else if (in(TIME*7,TIME*8,MOD)) { set(B11000000);setb(B11000000); }
  }
  else if(_time > MOD*20)
  {
         if (in(TIME*0,TIME*1,MOD)) { set(B11111111);setb(B11111111); }
    else if (in(TIME*1,TIME*2,MOD)) { set(B11110000);setb(B11110000); }
    else if (in(TIME*2,TIME*3,MOD)) { set(B0111100);setb(B0111100); }
    else if (in(TIME*3,TIME*4,MOD)) { set(B0011110);setb(B0011110); }
    else if (in(TIME*4,TIME*5,MOD)) { set(B0001111);setb(B00001111); }
    else if (in(TIME*5,TIME*6,MOD)) { set(B10000111);setb(B10000111); }
    else if (in(TIME*6,TIME*7,MOD)) { set(B11000011);setb(B11000011); }
    else if (in(TIME*7,TIME*8,MOD)) { set(B11100001);setb(B11100001); }
  }
}

void set(byte val)
{
  digitalWrite(L1,(val&128)/128);
  digitalWrite(L2,(val&64)/64);
  digitalWrite(L3,(val&32)/32);
  digitalWrite(L4,(val&16)/16);
  digitalWrite(L5,(val&8)/8);
  digitalWrite(L6,(val&4)/4);
  digitalWrite(L7,(val&2)/2);
  digitalWrite(L8,val&1);
  if (last!=val)
  {
    Serial.print((int)val);
    last=val;
  }
}

void setb(byte val)
{
  digitalWrite(L9,(val&128)/128);
  digitalWrite(L10,(val&64)/64);
  digitalWrite(L11,(val&32)/32);
  digitalWrite(L12,(val&16)/16);
  digitalWrite(L13,(val&8)/8);
  digitalWrite(L14,(val&4)/4);
  digitalWrite(L15,(val&2)/2);
  digitalWrite(L16,val&1);
  /*if (last!=val)
  {
    Serial.print((int)val);
    last=val;
  }*/
}

boolean in(int beg, int end, int mod)
{
  int time;
  time=millis()%mod;
  //Serial.print(time);
  if (begtime)
  {return true;}
  return false;
}

Comments