Pages: [1]   Go Down
Author Topic: Using Arduino mega for massive high speed data acquisition from a sensor mat  (Read 1231 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

Hope you do very well.

I am doing research on human-induced vibrationand I am currently trying to design a sensor mat which has 2000 sensors to capture dynamic load of people when they are walking on that mat.

each sensor needs to be read with 200 Hz speed. As 3200 analog input is not possible! we decided to scan the sensors with high speed (like video cameras) to read the sensor outputs with lesser analog input channels.

here is the plan: 4 mat each contains 800 sensors. A matrix of sensors with 16 columns and 50 rows. we want to use Arduino mega 2560 to get the data and transfer it to a PC. I have written the below code to scan the sensors but Arduino seems very slow..

how the program works:
At each time increment, one digital output (50 digital pin) releases the power to its corresponding row of sensors (16 sensors) each of which connected to an analog input. so we use 50 digital output and 16 analog input to scan sensors.

My question: Is there any way to increase the speed?
we need to read 800 sensors * 200 Hz * each outtput is 4 digits * each digit 2 bytes = 10.24 Mbits/second

If Arduino is not capable of doing that, Do you have any suggestions which hardware I can use?

Much regards,
Erfan   

/* TEST 06
 
 This program scans the matrix of sensors to get data.
 
 Assumptions:
   - A matrix of sensors consist of 800 sensors arranged in the form of 16 columns (Analog inputs) and 50 rows (Digital outputs)
   - 50 Digital output to supply +5 volts power for each row of sensors
   - 16 Analog inouts to read the output of sensors
   - At each time increment, one digital output releases the power to its corresponding row of sensors (16 sensors) each of which connected to an analog input.
     So at each time increment each analog input read a number.
   - Sensor numbering: S(Row - digital output)(column - analog input) : S2006 means the sensor which is connected to digital pin 20 and analog pin 06.
   - "i" index represents rows and "j" index represents columns 
 
 Connect one end of FSR to power (+5V in this case), the other end to Analog 0.
 Then connect one end of a 10K resistor from Analog 0 to ground
 
 */

//Define Pins 
int digitalPin [50]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
                     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
                     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49};
int analogPin [16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

//Define Variables
unsigned int analogFSRReading [50][16];      // The analog reading from the FSR resistor divider
unsigned long startTime = 0;                 // Records the starting Time of each complete scan loop
unsigned long endTime = 0;                   // Records the finishing Time of each complete scan loop
unsigned long elapsedTime = 0;               // Records the duration of each complete scan loop
int counter;                                 // Loop Counter
int i;                                       // Loop counter - rows - digital outputs
int j;                                       // Loop counter - columns - analog inputs


void setup(void) {
 
  Serial.begin(115200);   // We'll send debugging information via the Serial monitor - I have changed the corresponding com port speed from device manager
                          // to match this speed.
                         
   for (int counter=0; counter <= 49; counter++){       
      pinMode(digitalPin [counter], OUTPUT);      // sets the digital pin as output     
    }
                           
}


void loop(void) {

  startTime = micros(); // Records the time when loop starts
 
  for (int i=0; i <= 49; i++){         // scans rows one by one
    digitalWrite(digitalPin , HIGH);   // Sets the digital pin voltage to 5V
   
    for (int j=0; j <= 15; j++){       // scans columns one by one
     
      // Displaying sensor ID
      //Serial.print("Sensor (");
      //Serial.print(i);
      //Serial.print(",");
      //Serial.print(j);
      //Serial.println(")");
     
      // Analog Reading from FSR - ranges between 0 to 1023
      analogFSRReading [j] = analogRead(analogPin [j]);    // read the input pin 
      //Serial.print("Analog reading = ");
      Serial.println(analogFSRReading [j]);   
      //Serial.println("--------------------");
     
    } 
   
    digitalWrite(digitalPin , LOW);   // Sets the digital pin voltage to 0
 
  }
 
  // Printing time duration
  endTime = micros(); // Records the time when loop finishes
  elapsedTime = endTime - startTime;
  Serial.print("Single loop (reading 800 sensors and feeding outputs to serial port) duration in micro-seconds: ");
  Serial.println(elapsedTime, DEC);
  Serial.println("--------------------");
  delay(10000); // just to see the speed and elapsed time
}

Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 553
Posts: 46284
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

int digitalPin [50]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  Serial.begin(115200);
Not a good combination.

Quote
each outtput is 4 digits
In binary, it's only half that size.
Logged

UK
Offline Offline
Shannon Member
****
Karma: 184
Posts: 11196
-
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Can you put some numbers on this?

How long is it taking to power up a batch of 16 sensors, get an analogue reading from each sensor and power them down again?

My gut reaction is that you might need more than four Arduinos to achieve your sampling rate, but you need to know the actual performance to know for sure.
Logged

I only provide help via the forum - please do not contact me for private consultancy.

Canada
Offline Offline
Newbie
*
Karma: 1
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

All your loops are generally slow. So are Arduino's builtin DigitalWrite. You may want to consider direct port manipulation.
I achieved 10 times faster read speeds using that.
http://www.arduino.cc/en/Reference/PortManipulation
http://www.arduino.cc/playground/Learning/PortManipulation

DDRA = B11111111; DDR= Data Direction, Port A, 1 = Output
You'd have to do it for the 6-8 ports on the arduino (still much less than the 50 you are doing now)

Setting the pins high
PORTA = B11111111; 1=High, 0=low

Also, I'm guessing that doing port manipulation on the analog read will also increase speed, however I'm not sure how it's done.

Edit: Pin Map. Thought it might be usefull  smiley
http://arduino.cc/en/Hacking/PinMapping2560
« Last Edit: February 09, 2012, 11:59:06 am by mcleung » Logged

Pages: [1]   Go Up
Jump to: