Video

Flying airplane in classroom
Top view of project

Creation

Our initial project idea was to create a paper airplane launcher. The project would be both a fun toy and an outlet for self expression, as kids would be encouraged to make and decorate their own paper airplanes.

We used this tutorial as inspiration for our design, but decorated it to look cuter (with walls to hide the wiring), took out the runway to prevent friction between the airplane and wood, and added a tilt so the plane could shoot higher.

Our main challenge was trying to incorporate computation in a meaningful way. Since the main idea of a paper airplane launcher did not require computation to have the core experience, all our ideas for computation either felt tacked-on or altered the core experience. For example, we considered adding a goal or target that would react when the airplane crossed the threshold, but we thought that would change the core fun of the launcher from seeing a flying airplane to competing or achieving a goal, which could be less fun for some kids.

In the end, our computational element was to make it so a song would play when the airplane was launched. This element still feels tacked on, but adds to the experience without changing the core fun.

Demo

Overall, the kids at the Children’s School reacted positively to the project.
The general experience of a kid was:
1) Be confused at the project
2) Watch either of us demonstrate project
3) Light up when they see the airplane
4) Be instructed on how to use the airplane
5) Try and fail a few times to use the launcher correctly, but eventually get it

There was variation in how quickly kids picked up on how to use the launcher. Some kids were patient enough to let us teach them how to use it, some insisted on trying it themselves first. Some picked up on how to use the launcher immediately, while others spent their whole time in the room needing at least a little help. The learning curve of the launcher was larger than we expected, since many of the younger kids had trouble following instructions or retaining the instructions at their next turn if given by us (but were better at following instructions if they were given by a teacher). One thing that surprised us was that one of the kids figured out a simpler way to launch the airplane than our way. Our strategy involved placing the airplane on the wooden support and using a flat hand to push it between the wheels. Instead of doing this, the kid placed the airplane at an angle above the wheels, slowing lowering the plane and opening his fingers when it came close to the wheels. Since his way simpler to understand, it became easier to instruct the following kids on how to use the launcher after we took the new idea.

Many kids found the launcher fun, but they found it fun in different ways. We were happy to see that even when kids couldn’t launch their airplane as far as other kids, they didn’t seem to mind and were just thrilled they made an airplane fly. Some kids did get competitive and set goals for themselves, like to get their airplane over a shelf or onto a rug on the other side of the room. There was a time where a group of three kids launched airplanes at one of their friends to try and get it on certain colors of his shirt. This reflects one of the strengths of the airplane launcher: it’s a toy with many ways to play with it, and individual kids and groups found how to make it fun in their own way.

The project inadvertently caused collaborative play. As more groups started coming in the room, they would see other kids play with the launcher, and we would have the previous group of kids demonstrate how to use it.

We noticed that the kids didn’t seem to notice or care about the sound. We also ended up not introducing the element of making their own planes, because it takes away from the focus of our project. Our focus was to make something that allows kids to play and have fun with. Since the kids were too young to fully engage in the process of folding airplanes, and it will be boring and hard for them, which doesn’t match our goal.

Code

// Modified from Garth Zeglin's WheelDrive Code, 16-223 Website

// Define motors' pin numbers
#define MOT_A1_PIN 5     // motor1 at 5,6
#define MOT_A2_PIN 6
#define MOT_B1_PIN 10    //motor2 at 9,10
#define MOT_B2_PIN 9

const int switchPin = A2;     //switch at pin A2
int switchState = 0;
boolean wheelTurn = false;

const int sensorPin = A0;    //sensor at pin A0
int sensorValue = 0;
const int speakerPin = 11;    //speaker at pin 3

const float note_table[] = { 440.0, 523.25, 659.26, 523.25, 659.26, 523.25/2, 440.0, 659.26, 659.26*2, 523.25};

int nextnote = 0;

void setup(void)
{
  Serial.begin(9600);

  pinMode(switchPin, INPUT);

 
  // Initialize the stepper driver control pins to output drive mode.
  pinMode(MOT_A1_PIN, OUTPUT);
  pinMode(MOT_A2_PIN, OUTPUT);
  pinMode(MOT_B1_PIN, OUTPUT);
  pinMode(MOT_B2_PIN, OUTPUT);

  // Start with drivers off, motors coasting.
  digitalWrite(MOT_A1_PIN, LOW);
  digitalWrite(MOT_A2_PIN, LOW);
  digitalWrite(MOT_B1_PIN, LOW);
  digitalWrite(MOT_B2_PIN, LOW);
}

// ================================================================================
/// Set the current on a motor channel using PWM and directional logic.
/// Changing the current will affect the motor speed, but please note this is
/// not a calibrated speed control.  This function will configure the pin output
/// state and return.
///
/// \param pwm    PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN  pin number xIN1 for the given channel
/// \param IN2_PIN  pin number xIN2 for the given channel

void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
  if (pwm < 0) {  // reverse speeds
    analogWrite(IN1_PIN, -pwm);
    digitalWrite(IN2_PIN, LOW);

  } else { // stop or forward
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN2_PIN, pwm);
  }
}

void set_motor_currents(int pwm_A, int pwm_B)
{
  set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
  set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);
}

// ================================================================================
/// Run one iteration of the main event loop.  The Arduino system will call this
/// function over and over forever.
void loop(void)
{
  checkSwitch();
  //checkPlaySound();
}

void checkSwitch(void)
{
switchState = analogRead(switchPin);

  if (switchState != 0 )// wheelTurn == false)
  {
    Serial.println(wheelTurn);
    while (switchState != 0) { 
      switchState = analogRead(switchPin);
      checkPlaySound();
      set_motor_currents(220, 220); //start turning at full speed
      //wheelTurn = true;
      }
    
    }
  else if (switchState == 0)// and wheelTurn == true)
  {
    set_motor_currents(0,0); //stop
    //wheelTurn = false;
    Serial.println(wheelTurn);
    while (switchState != 0) { //do nothing until switch is released
      switchState = analogRead(switchPin);
      }
  }
}

void checkPlaySound(void)
{
  sensorValue = analogRead(sensorPin);
  Serial.println(sensorValue);
  if (sensorValue < 200)
  {
    for (int i = 0; i < 10; i++)
    {
      tone(speakerPin, note_table[i]);
      delay(200);
    }
    noTone(speakerPin);
  }
}
/****************************************************************/

Files

Here is the link to our drive with all the files. Apologies for not directly uploading, WordPress did not allow .zip or .sldprt files.