Go Down

Topic: Using Arduino mega for massive high speed data acquisition from a sensor mat (Read 4605 times) previous topic - next topic



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,

/* TEST 06
This program scans the matrix of sensors to get data.

   - 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 (");
      // 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]);   
    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);
  delay(10000); // just to see the speed and elapsed time


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

each outtput is 4 digits

In binary, it's only half that size.
The art of getting good answers lies in asking good questions.


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.


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.

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  :)

Go Up