Force Sensors for Helmets
Mackenna Hill, Rachel Jones, Keaton Zonca, Justin Larson
Descriptions
Project:
Purpose:
The purpose of our project was to create a program that would read the inputs of force sensors placed on the helmets of athletes to record the force of the impacts theses athlete's heads are sustaining. This recorded data will be used to understand and prevent concussions in the future.
Procedure:
To start, we had to calibrate the two force sensors and to do this we had a range of different types of people from the class stand on these force sensors. Each of these people stood on a plank of wood that was balanced on an upright role of five dimes applied the most uniform and total force to the force sensor. While each person was standing on the force sensors we recorded the highest number that was consistently measured by the program. The students also stood on a force plate which measured their weight in newtons which we correlated to the force sensor outputs (range:0-1023)
Code:
This program records data (pressure in Newtons and time in milliseconds) from two force sensors. You can start the data collection by pressing a button placed on the board. This starts the data collection at as fast as the arduino can handle (there is a 5 millisecond delay to help in transferring the data). This data is both displayed in the Serial port and written to the open log where a text file is created. This program converts the digital output from the force sensors (a number from 0 to 1023) to Newtons
Arduino:
// notes
// do not hold the on/off button
// m units is the unit of measure of the output from the sensor to the computer with a range of 0 to 1023
#include <SoftwareSerial.h>
//import part of other code, have commas btwn data, figure out how often to record data and how long the sketch will run
SoftwareSerial mySerial = SoftwareSerial(2, 3);
int flexiForcePin = A0; //analog pin 0
int pressure; //pressure imput from sensor 1 in m units
long pressure2; // used to convert m to Neutons
long time; // time in miliseconds
int x=0; //used to start the data taking
int buttonPin = A3; // analog read for sensor 1
int ledpin=12; // pin that lights up when data is being taken
int val; // variable of button press
int flexiForcePiny = A1; //analog pin for sensor 2
int pressurey; // pressure input from sensor 2 in m units
long pressure2y; // used to convert m to Neutons
int buttonState; // variable for reading the pushbutton status
void setup() {
pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input:
pinMode(ledpin,OUTPUT); // initialize the led for output
Serial.begin(9600); // starts the serial port, used for viewing data while running on the computer
mySerial.begin(9600); // starts the port for writing to openlog
// Openlog RXI pin -> Ard 3, Openlog TXO -> Ard 2
}
void loop() {
val = digitalRead(buttonPin); // read input value and store it in val
if (val==0) { //if button is pressed then val = 0
if (x==0) { // if x = 0 then the led starts. at the begining x is set to 0
x=1; //changes x to 1 if you press the button and x was previously 0
delay(500); // delay that is only used in push button state, not used during data taking
digitalWrite(ledpin, HIGH); // turns led on, indicates data is being taken
}
else { // if x was previously 1, which means data was being taken, will now be set to 0 and data will stop
x=0; // x is set to 0
delay(500); // delay that is only used in push button state, not used during data taking
digitalWrite(ledpin, LOW); // turns led off, indicates data is not being taken
}
}
if (x==1){ //if x is 1 then data will be taken
time = millis(); //time will start and be read in miliseconds
delay(5); // leave a small delay in for seamless transfer of data
int flexiForceReading = analogRead(flexiForcePin); //read in the value of pressure from sensor 1 in units m
pressure = flexiForceReading; // set pressure value to "pressure" units still in m
int flexiForceReadingy = analogRead(flexiForcePiny); //read in the value of pressure from sensor 2 in units m
pressurey = flexiForceReadingy; // set pressure value to "pressure" units still in m
pressure2= (pressure*31) -30250; // changes pressure from sensor 1 from m units to neutons. the line is from the data calibration
pressure2y= (pressure*31) -30250; // changes pressure from sensor 2 from m units to neutons. the line is from the data calibration
mySerial.print(time); // writes time to openlog
mySerial.println("ms"); // records the unit of time
mySerial.print(pressure2); // writes pressure from sensor 1 in Neutons
mySerial.println("N"); // records the unit of pressure
mySerial.print(pressure2y); // writes pressure from sensor 2 in Neutons
mySerial.println("Ny"); // records the unit of pressure
Serial.print(time); // same as above but this displays the same values in the serial monitor on the computer
Serial.println("ms");
Serial.print(pressure2);
Serial.println("N");
Serial.print(pressure2y);
Serial.println("Ny");
}
}
Problems:
During the calibration of the force sensors we had a hard tim concentrating such a large force (400-1000N) on such a small sensor. We secured a small roll of dimes to the force sensor. Then we had people stand on a small wooden board on top of the roll of dimes. This provided us with fairly consistant data.
We originally wrote the program to constantly run but this left us with a lot of useless data. We then installed a button to start and stop the program and a light to indicate when the program is running.
While writing the program we had difficulty reading the button press since the program was running so quickly. We now have the program coded to have a half second delay only when the force sensors are not recording. Once the sensors are running, the program runs with almost no delay.
What we would like to add:
If we had more time and money we would construct a rig to simulate helmet collisions. From these tests we could figure out the way to best equip the sensors to get the most important and best data from the collision.
We would also like to add accelerometers in the helmets to help us get a better understanding of what goes on in a helmet to helmet collision. Also, force sensors that cover a larger area, or many more sensors, are needed. It was fairly difficult to stand on the sensors, let alone collide two helmets together on a spot the size of a dime.
Finally, a much smaller device to replace the arduino is needed for testing, especially in the field.