Comment lire la valeur d'utilisation de la RAM ?

Bonjour,

Pour un projet, j'ai ut des soucis pour faire fonctionner un écran I2C 128x64px, le moniteur série et un télémètre laser TW10S-UART simultanément.
Apres recherche sur internet, il est apparut que sa pouvais venir de la saturation de la RAM de la carte Arduino. J'ai donc changer de carte pour mettre une MEGA a la place de la UNO que j'utilisait, et je n'ai plus de soucis.

Ce qui m'amène a la question, est t'il possible de déterminer, durant l'exécution du programme, l'utilisation de la RAM ?

Je veut faire un système embarquer qui récupère les donnée du télémètre laser et d'un accéléromètre, et j'aimerais bien pouvoir savoir quand la carte "rame".
En gros, l'idéale serait de faire un peut comme l'afficheur du niveaux de performance du gestionnaire des taches sur un PC.

Pour déterminer le temp de réponse, je pensais stocker la valeur de millis() dans un variable au début de la boucle loop() et la comparer avec celle obtenue a la fin de la boucle.
Sa vous semble bien ?

Merci d'avance de vos réponses.

Bonjour

Les questions en français sont mieux dans la catégorie francophone qu’hispanophone….

J’ai déplacé votre post pour cette fois.

S’il n’y a plus de mémoire la carte ne va pas ramer mais le programme va sans doute planter

Pour éviter les problèmes mémoire on évite de faire de l’allocation dynamique comme ça le plus gros de la mémoire est défini / visible à la compilation. Ça veut dire éviter les String, le passage par copie, les appels récursifs trop importants etc… et si on doit le faire on vérifie que le malloc a fonctionné. On n’utilise pas new sur une classe parce qu’on ne peut pas faire de try/catch (et puis de toutes façons vaut mieux éviter new)

Sinon oui, sur MEGA vous pouvez savoir où vous en êtes au niveau mémoire, cf des bibliothèques comme GitHub - mpflaga/Arduino-MemoryFree: basic functions and example to use show used RAM and use less of it. (il y en a d’autres similaires).

Sinon lisez You know you have a memory problem when... | Memories of an Arduino | Adafruit Learning System il y a pas mal d’infos.

Au fait puisque vous êtes passé sur mega, avez vous pensé à aussi utiliser un port série matériel au lieu de SoftwareSerial que vous utilisiez sans doute avant ?

Heu, non, j'avoue que je ne sais même pas de quoi vous parlez...
S'est la toute première fois que j'utilise un carte Arduino MEGA

En tout cas, merci beaucoup pour votre réponse !

Je viens d'installer la librairie et de la tester sur une carte UNO, sa marche super bien.

Utilisiez vous SoftwareSerial pour lire votre télémètre laser TW10S-UART?

Oui, en effet.
Voici mon code :

#include "SoftwareSerial.h"
#include <CRC16.h>

#define TX_laser 9 //la broche reliée au TX du laser
#define RX_laser 8 //la broche reliée au RX du laser
#define EN_laser 10

SoftwareSerial laser(TX_laser, RX_laser); //on initialise la communication série qui sera appelée laser
SoftwareSerial bt(11, 12); // broches TX, RX du modile bluetooth

CRC16 crc(CRC16_MODBUS_POLYNOME,
          CRC16_MODBUS_INITIAL,
          CRC16_MODBUS_XOR_OUT,
          CRC16_MODBUS_REV_IN,
          CRC16_MODBUS_REV_OUT);

uint8_t byte6_1, byte5_1, byte6_2, byte5_2, byte4_1, byte4_2, byte3_1, byte3_2;


uint8_t commandContinue[8] = {0x01, 0x03, 0x00, 0x01, 0x00, 0x02, 0x95, 0xCB};
uint8_t commandUnique[8] = {0x01, 0x03, 0x00, 0x0F, 0x00, 0x02, 0xF4, 0x08};
uint8_t marche[11] = {0x01, 0x10, 0x00, 0x03, 0x00, 0x01, 0x02, 0x00, 0x01, 0x67, 0xA3};
uint8_t data[9];
uint32_t distance;

int STEP = 5;
int DIR = 4;
int EN = 6;
int button = 11;
int interupt_A = 2;
int interupt_B = 3;

int sens = 1;
int posTour = 0;
int nbrPas = 200;

int ecartMes = 1;//pas 

long lastDist = 0;
int nbSame =0;
 
// constante temps
const int MEASURE_TIMEOUT = 1; // 1ms = ~30km à 3*10^8m/s
    

void setup(){
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
  pinMode(EN, OUTPUT);
  pinMode(button, INPUT_PULLUP);
  pinMode( interupt_A, INPUT_PULLUP);
  pinMode( interupt_B, INPUT_PULLUP);
  pinMode(EN_laser, OUTPUT);
  
  Serial.begin(9600);
  bt.begin(9600);
  laser.begin(9600);
  //digitalWrite(EN_laser, HIGH);
  //delay(200);
  //laser.write(marche, 11);
  //laser.write(commandContinue, 8);
  //digitalWrite(EN,LOW);
}

void loop(){
    //Serial.println(digitalRead(button));
    if(digitalRead(button)==LOW) {
      bt.println(" reset");
      Serial.println(" reset");
      digitalWrite(EN_laser,HIGH);
      delay(200);
      laser.write(marche,11);
      remise_a_0();
      
      //sens 1 
      digitalWrite(DIR,LOW);
      for(int i = 0; i<nbrPas; i+=ecartMes) {
        long measure = getDist();
        delay(200);
        //Serial.println(measure);
        while(!(measure >0 && measure < 40000) || measure==lastDist) {
          //delay(100);
          if(measure==lastDist) nbSame++;
          if(nbSame ==4) break;
          measure = getDist();
          delay(200);
        }
        lastDist= measure;
        nbSame=0;
        Serial.println(" "+String(i)+":"+String(measure));
        //delay(200);
        for(int n =0;n<ecartMes;n++) {
          digitalWrite(STEP, HIGH);
          delay(3);
          digitalWrite(STEP, LOW);
          delay(3);
        }
        delay(200);
        
      }
      //Sens 2
      digitalWrite(DIR,HIGH);
      for(int i = nbrPas; i>0; i-=ecartMes) {
        long measure = getDist();
        //Serial.println(measure);
        while(!(measure >0 && measure < 40000) || measure==lastDist) {
          delay(100);
          nbSame++;
          if(nbSame ==4) break;
          measure = getDist();
        }
        lastDist= measure;
        nbSame=0;
        Serial.println(" "+String(i)+":"+String(measure));
        delay(100);
          for(int n =0;n<ecartMes;n++) {
            digitalWrite(STEP, HIGH);
            delay(3);
            digitalWrite(STEP, LOW);
            delay(3);
          }
        //delay(50); 
      }
      digitalWrite(EN,HIGH);
      digitalWrite(EN_laser, LOW);
    }
    
}



long getDist() {
  crc.restart();
  laser.write(commandUnique, 8);

  if( laser.available() >0){
    laser.readBytes(data, 9);
  }

  for(int i = 0; i < sizeof(data); i++)
  {
    //Serial.print(data[i], HEX);
    //Serial.print("  ");
    crc.add(data[i]);
  }
  uint8_t CRC = crc.calc();
  //Serial.println(CRC, HEX);

  delay(200);
  byte3_1 = data[3] / 16;
  byte3_2 = data[3] - byte3_1 * 16;
  byte4_1 = data[4] / 16;
  byte4_2 = data[4] - byte4_1 * 16;
  byte5_1 = data[5] / 16;
  byte5_2 = data[5] - byte5_1 * 16;
  byte6_1 = data[6] / 16;
  byte6_2 = data[6] - byte6_1 * 16;
  uint8_t bytes[8] = {byte6_2,byte6_1,byte5_2,byte5_1,byte4_2,byte4_1,byte3_2,byte3_1}; //bit de poids faible en premier
  
  float dist = 0;
  for(int i =0; i< 8;i++) {
    //Serial.println(bytes[i]);
    dist+= bytes[i]*pow(16,i);
  }
  //return dist;

  if (CRC == 0) {
    //Serial.println(dist);
    return dist;
  } else return -1;

}

void remise_a_0(){
  digitalWrite(EN, LOW);
  if( digitalRead(interupt_A) == 0 ){
    Serial.println("reprise en sens inverse");
    digitalWrite(DIR, LOW);
    for( int i=0; i<50; i++){
      digitalWrite(STEP, HIGH);
      delay(2);
      digitalWrite(STEP, LOW);
      delay(2);
      if( digitalRead(interupt_B) == 0 ){
        i = 60;
      }
      
    }
  }
  while( digitalRead(interupt_A) == 1){
    digitalWrite(DIR, HIGH);
    digitalWrite(STEP, HIGH);
    delay(2);
    digitalWrite(STEP, LOW);
    delay(2);
  }
}

Le code est une modification de celuis là.

Remplacez ces 2 ports virtuels et la complexité de gestion des 2 (ils ne peuvent pas écouter en même temps) par Serial1 et Serial2 sur votre Mega. Ce sont des ports séries matériels (la gestion est effectuée par le hardware) et c’est beaucoup plus robuste.

OK, merci de votre réponse.
.
Je vais essayer ça.