Skip to main content
deleted 112 characters in body
Source Link
dda
  • 1.6k
  • 1
  • 12
  • 18

I've startstarted to prototype something using an Arduino Mega and YùnYún Shield.

ItIt's simple. It reads an ADC at 50Hz and sends datasdata to a server through a socket. But because of that combination, I need to use the Bridge to send data through the socket. It's very slow.

Should I changed the Arduino Mega for the Leonardo or the Due to get better performance? Should I change the Arduino Mega for a Leonardo or a Due to get better performance?

Here is my code, maybe I dodid something wrong!.

#include <Bridge.h> 
#include <Process.h>
#include <Time.h>
#include <TimeLib.h>
#include <stdlib.h>

boolean interruptFlag = 0;
 
int HD = A0;
int HG = A1;
int CD = A2;
int CG = A3;
int ECG = A5;
 
String analogSignals = "";
static char outstr[15];
int count = 0;
float x = 0.0;

void setup() {
  // Bridge startup.
  Bridge.begin();  
 
  // Initialize Bridge values.
  Bridge.put("data", "");  
 
  noInterrupts(); // Stop interrupts.
 
  TCCR1A = 0; // Set entire TCCR1A register to 0.
  TCCR1B = 0; // Same for TCCR1B.
  TCNT1  = 0; // Initialize counter value to 0.
 
  // Set compare match register for 50Hz increments.
  OCR1A = 39999; // = 16000000 / (8 * 50) - 1 (must be <65536)
 
  // Turn on CTC mode.
  TCCR1B |= (1 << WGM12);
  // Set CS12, CS11 and CS10 bits for 64 prescaler.
  TCCR1B |= (0 << CS12) | (1 << CS11) | (1 << CS10);
  // Enable timer compare interrupt.
  TIMSK1 |= (1 << OCIE1A);
 
  interrupts(); // Allow interrupts.
 
  // Launch Python script.
  /*Process p;
  p.begin("python");
  p.addParameter("/root/test/send.py");
  p.run();*/
}

ISR(TIMER1_COMPA_vect){    {
  if (!interruptFlag){  {
    interruptFlag = 1;    
  }  
}

void loop() {    
  if (interruptFlag) {
    writeAnalogSignals();
    interruptFlag = 0;     
  }  
}

void writeAnalogSignals() {  
  String HDReading = convertToVoltage(analogRead(HD)); 
  String HGReading = convertToVoltage(analogRead(HG)); 
  String CDReading = convertToVoltage(analogRead(CD)); 
  String CGReading = convertToVoltage(analogRead(CG)); 
  String ECGReading = convertToVoltage(analogRead(ECG));
 
  if (analogSignals.length() == 0) {
    analogSignals =  String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;  
  } else {
    analogSignals += "|" + String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;
  }
 
  x += 0.02;
 
  count += 1; 
 
  if (count >= 50) {
    Bridge.put("data", analogSignals);
    analogSignals = "";
    count = 0;    
  }  
}
 
// Convert the analog reading to voltage.
String convertToVoltage(int analogSignal) {
  dtostrf(analogSignal * (5.0 / 1023),8, 6, outstr);
 
  return outstr;
}
import socket
import sys
import getopt
import time

def main(argv):
    try:
        sys.path.insert(0, '/usr/lib/python2.7/bridge/') 
        from bridgeclient import BridgeClient as bridgeclient
        
        # Create a UDP socket.
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_address = ('192.168.1.100', 9050)
            
        bridge = bridgeclient()                              
        previous = ""

        # Send data
        while 1:   
            data = bridge.get("data")   
            
            if data != previous:                        
                sent = sock.sendto(data, server_address)
                previous = data
            
            time.sleep(0.5)
    
    finally:
        sock.close()

I've start to prototype something using an Arduino Mega and Yùn Shield.

It simple. It reads an ADC at 50Hz and sends datas to a server through socket. But because that combination, I need to use the Bridge to send data through socket. It's very slow.

Should I changed the Arduino Mega for the Leonardo or the Due to get better performance?

Here is my code, maybe I do something wrong!

#include <Bridge.h> 
#include <Process.h>
#include <Time.h>
#include <TimeLib.h>
#include <stdlib.h>

boolean interruptFlag = 0;
 
int HD = A0;
int HG = A1;
int CD = A2;
int CG = A3;
int ECG = A5;
 
String analogSignals = "";
static char outstr[15];
int count = 0;
float x = 0.0;

void setup() {
  // Bridge startup.
  Bridge.begin();  
 
  // Initialize Bridge values.
  Bridge.put("data", "");  
 
  noInterrupts(); // Stop interrupts.
 
  TCCR1A = 0; // Set entire TCCR1A register to 0.
  TCCR1B = 0; // Same for TCCR1B.
  TCNT1  = 0; // Initialize counter value to 0.
 
  // Set compare match register for 50Hz increments.
  OCR1A = 39999; // = 16000000 / (8 * 50) - 1 (must be <65536)
 
  // Turn on CTC mode.
  TCCR1B |= (1 << WGM12);
  // Set CS12, CS11 and CS10 bits for 64 prescaler.
  TCCR1B |= (0 << CS12) | (1 << CS11) | (1 << CS10);
  // Enable timer compare interrupt.
  TIMSK1 |= (1 << OCIE1A);
 
  interrupts(); // Allow interrupts.
 
  // Launch Python script.
  /*Process p;
  p.begin("python");
  p.addParameter("/root/test/send.py");
  p.run();*/
}

ISR(TIMER1_COMPA_vect){    
  if (!interruptFlag){  
    interruptFlag = 1;    
  }  
}

void loop() {    
  if (interruptFlag){
    writeAnalogSignals();
    interruptFlag = 0;     
  }  
}

void writeAnalogSignals() {  
  String HDReading = convertToVoltage(analogRead(HD)); 
  String HGReading = convertToVoltage(analogRead(HG)); 
  String CDReading = convertToVoltage(analogRead(CD)); 
  String CGReading = convertToVoltage(analogRead(CG)); 
  String ECGReading = convertToVoltage(analogRead(ECG));
 
  if (analogSignals.length() == 0) {
    analogSignals =  String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;  
  } else {
    analogSignals += "|" + String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;
  }
 
  x += 0.02;
 
  count += 1; 
 
  if (count >= 50) {
    Bridge.put("data", analogSignals);
    analogSignals = "";
    count = 0;    
  }  
}
 
// Convert the analog reading to voltage.
String convertToVoltage(int analogSignal) {
  dtostrf(analogSignal * (5.0 / 1023),8, 6, outstr);
 
  return outstr;
}
import socket
import sys
import getopt
import time

def main(argv):
    try:
        sys.path.insert(0, '/usr/lib/python2.7/bridge/') 
        from bridgeclient import BridgeClient as bridgeclient
        
        # Create a UDP socket.
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_address = ('192.168.1.100', 9050)
            
        bridge = bridgeclient()                              
        previous = ""

        # Send data
        while 1:   
            data = bridge.get("data")   
            
            if data != previous:                        
                sent = sock.sendto(data, server_address)
                previous = data
            
            time.sleep(0.5)
    
    finally:
        sock.close()

I've started to prototype something using an Arduino Mega and Yún Shield.

It's simple. It reads an ADC at 50Hz and sends data to a server through a socket. But because of that combination, I need to use Bridge to send data through the socket. It's very slow.

Should I change the Arduino Mega for a Leonardo or a Due to get better performance?

Here is my code, maybe I did something wrong.

#include <Bridge.h> 
#include <Process.h>
#include <Time.h>
#include <TimeLib.h>
#include <stdlib.h>

boolean interruptFlag = 0;
int HD = A0;
int HG = A1;
int CD = A2;
int CG = A3;
int ECG = A5;
String analogSignals = "";
static char outstr[15];
int count = 0;
float x = 0.0;

void setup() {
  // Bridge startup.
  Bridge.begin();  
  // Initialize Bridge values.
  Bridge.put("data", "");  
  noInterrupts(); // Stop interrupts.
  TCCR1A = 0; // Set entire TCCR1A register to 0.
  TCCR1B = 0; // Same for TCCR1B.
  TCNT1  = 0; // Initialize counter value to 0.
  // Set compare match register for 50Hz increments.
  OCR1A = 39999; // = 16000000 / (8 * 50) - 1 (must be <65536)
  // Turn on CTC mode.
  TCCR1B |= (1 << WGM12);
  // Set CS12, CS11 and CS10 bits for 64 prescaler.
  TCCR1B |= (0 << CS12) | (1 << CS11) | (1 << CS10);
  // Enable timer compare interrupt.
  TIMSK1 |= (1 << OCIE1A);
  interrupts(); // Allow interrupts.
  // Launch Python script.
  /*Process p;
  p.begin("python");
  p.addParameter("/root/test/send.py");
  p.run();*/
}

ISR(TIMER1_COMPA_vect) {
  if (!interruptFlag) {
    interruptFlag = 1;    
  }  
}

void loop() {
  if (interruptFlag) {
    writeAnalogSignals();
    interruptFlag = 0;
  }
}

void writeAnalogSignals() {
  String HDReading = convertToVoltage(analogRead(HD));
  String HGReading = convertToVoltage(analogRead(HG));
  String CDReading = convertToVoltage(analogRead(CD));
  String CGReading = convertToVoltage(analogRead(CG));
  String ECGReading = convertToVoltage(analogRead(ECG));
  if (analogSignals.length() == 0) {
    analogSignals =  String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;
  } else {
    analogSignals += "|" + String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;
  }
  x += 0.02;
  count += 1; 
  if (count >= 50) {
    Bridge.put("data", analogSignals);
    analogSignals = "";
    count = 0;
  }
}
// Convert the analog reading to voltage.
String convertToVoltage(int analogSignal) {
  dtostrf(analogSignal * (5.0 / 1023),8, 6, outstr);
  return outstr;
}
import socket
import sys
import getopt
import time

def main(argv):
    try:
        sys.path.insert(0, '/usr/lib/python2.7/bridge/')
        from bridgeclient import BridgeClient as bridgeclient
        # Create a UDP socket.
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_address = ('192.168.1.100', 9050)
        bridge = bridgeclient()                              
        previous = ""

        # Send data
        while 1:   
            data = bridge.get("data")   
            if data != previous:                        
                sent = sock.sendto(data, server_address)
                previous = data
            time.sleep(0.5)
    
    finally:
        sock.close()
Source Link

Which Arduino is the most suitable for my project?

I've start to prototype something using an Arduino Mega and Yùn Shield.

It simple. It reads an ADC at 50Hz and sends datas to a server through socket. But because that combination, I need to use the Bridge to send data through socket. It's very slow.

Should I changed the Arduino Mega for the Leonardo or the Due to get better performance?

Here is my code, maybe I do something wrong!

Arduino code:

#include <Bridge.h> 
#include <Process.h>
#include <Time.h>
#include <TimeLib.h>
#include <stdlib.h>

boolean interruptFlag = 0;

int HD = A0;
int HG = A1;
int CD = A2;
int CG = A3;
int ECG = A5;

String analogSignals = "";
static char outstr[15];
int count = 0;
float x = 0.0;

void setup() {
  // Bridge startup.
  Bridge.begin();  

  // Initialize Bridge values.
  Bridge.put("data", "");  

  noInterrupts(); // Stop interrupts.

  TCCR1A = 0; // Set entire TCCR1A register to 0.
  TCCR1B = 0; // Same for TCCR1B.
  TCNT1  = 0; // Initialize counter value to 0.

  // Set compare match register for 50Hz increments.
  OCR1A = 39999; // = 16000000 / (8 * 50) - 1 (must be <65536)

  // Turn on CTC mode.
  TCCR1B |= (1 << WGM12);
  // Set CS12, CS11 and CS10 bits for 64 prescaler.
  TCCR1B |= (0 << CS12) | (1 << CS11) | (1 << CS10);
  // Enable timer compare interrupt.
  TIMSK1 |= (1 << OCIE1A);

  interrupts(); // Allow interrupts.

  // Launch Python script.
  /*Process p;
  p.begin("python");
  p.addParameter("/root/test/send.py");
  p.run();*/
}

ISR(TIMER1_COMPA_vect){    
  if (!interruptFlag){  
    interruptFlag = 1;    
  }  
}

void loop() {    
  if (interruptFlag){
    writeAnalogSignals();
    interruptFlag = 0;     
  }  
}

void writeAnalogSignals() {  
  String HDReading = convertToVoltage(analogRead(HD)); 
  String HGReading = convertToVoltage(analogRead(HG)); 
  String CDReading = convertToVoltage(analogRead(CD)); 
  String CGReading = convertToVoltage(analogRead(CG)); 
  String ECGReading = convertToVoltage(analogRead(ECG));

  if (analogSignals.length() == 0) {
    analogSignals =  String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;  
  } else {
    analogSignals += "|" + String(x, 2) + ";" + HDReading + ";" + HGReading + ";" + CDReading + ";" + CGReading + ";0.0;0.0;" + ECGReading;
  }

  x += 0.02;

  count += 1; 

  if (count >= 50) {
    Bridge.put("data", analogSignals);
    analogSignals = "";
    count = 0;    
  }  
}

// Convert the analog reading to voltage.
String convertToVoltage(int analogSignal) {
  dtostrf(analogSignal * (5.0 / 1023),8, 6, outstr);

  return outstr;
}

Python code:

import socket
import sys
import getopt
import time

def main(argv):
    try:
        sys.path.insert(0, '/usr/lib/python2.7/bridge/') 
        from bridgeclient import BridgeClient as bridgeclient
        
        # Create a UDP socket.
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_address = ('192.168.1.100', 9050)
            
        bridge = bridgeclient()                              
        previous = ""

        # Send data
        while 1:   
            data = bridge.get("data")   
            
            if data != previous:                        
                sent = sock.sendto(data, server_address)
                previous = data
            
            time.sleep(0.5)
    
    finally:
        sock.close()