Датчики Arduino TFMini Lidar и динамик

У меня есть этот код для лидарных датчиков TFmini и динамика. Мне нужна помощь, чтобы понять, почему я использую этот расчет в своем коде и почему, если я его удалю, лидар не даст мне никаких измерений? (см. ниже, пожалуйста).

И мой код теперь работает только с одним датчиком (4,5). Я не знаю, почему эти три датчика не работают вместе. Заранее спасибо.

Я взял этот код из Интернета, мой опыт кодирования является базовым .

rx[i] = TFMiniOne.read();
if (rx[0] != 0x59) {
  i = 0;
} else if (i == 1 && rx[1] != 0x59) {
  i = 0;
} else if (i == 8) {
  for (j = 0; j < 8; j++) {
    checksum += rx[j];
  }
  if (rx[8] == (checksum % 256)) {
    *distance = rx[2] + rx[3] * 256;
    *strength = rx[4] + rx[5] * 256;
  }
  i = 0;
} else {
  i++;
} 

Вот полный код:

#include "Talkie.h"
#include "Vocab_US_Large.h"
#include <SoftwareSerial.h>
#include "TFMini.h"
TFMini tfminiOne;
TFMini tfminiTwo;
TFMini tfminiThree;

Talkie voice;
const int Speaker = 3;

//Declaring variables and constants

SoftwareSerial TFMiniOne (4,5);    //(RX, TX)
SoftwareSerial TFMiniTwo (6,7);
SoftwareSerial TFMiniThree (8,9);

void getTFminiData(int* distance, int* strength) {
  static char i = 0;
  char j = 0;
  int checksum = 0; 
  static int rx[9];
  if (TFMiniOne.available()) {  
    // Serial.println( "tfmini serial available" );
    rx[i] = TFMiniOne.read();
    if (rx[0] != 0x59) {
      i = 0;
    } else if (i == 1 && rx[1] != 0x59) {
      i = 0;
    } else if (i == 8) {
      for (j = 0; j < 8; j++) {
        checksum += rx[j];
      }
      if (rx[8] == (checksum % 256)) {
        *distance = rx[2] + rx[3] * 256;
        *strength = rx[4] + rx[5] * 256;
      }
      i = 0;
    } else {
      i++;
    } 
  }  
}


void setup() {
  pinMode(Speaker, OUTPUT);
 
  //Initializing 
  Serial.begin (115200);
  while(!Serial);                     //Wait for USB Serial Port to connect
  Serial.println("Initializing...");
  TFMiniOne.begin (TFMINI_BAUDRATE);       

  //Initializing TFMini Sensors
  tfminiOne.begin(&TFMiniOne);
  tfminiTwo.begin(&TFMiniTwo);    
}

void loop() { 
  int distance = 0;
  int strength = 0;

  getTFminiData(&distance, &strength);
  while (!distance) {
    getTFminiData(&distance, &strength);
    if (distance) {
      Serial.print(distance);
      Serial.print("cm\t");
      Serial.print("strength: ");
      Serial.println(strength);
    }
  }

  delay(100);

  if (distance > 30) {
    digitalWrite(Speaker,HIGH);
    voice.say(sp2_ALERT);
    voice.say(sp2_F);
  } else {
    digitalWrite(Speaker,LOW);
  }

  if (distance > 20) {
    digitalWrite(Speaker,HIGH);
    voice.say(sp2_ALERT);
    voice.say(sp2_L);
  } else {
    digitalWrite(Speaker,LOW);
  }

  if (distance < 15) {
    digitalWrite(Speaker,HIGH);
    voice.say(sp2_ALERT);
    voice.say(sp2_R);
  } else {
    digitalWrite(Speaker,LOW);
  }
  delay(300);

, 👍-1

Обсуждение

Уже спрашивал о переполнении стека: https://stackoverflow.com/questions/64886565/arduino-and-tfmini-lidar-sensors. Пожалуйста, не пересекайте столб; удалите любой из них., @ocrdu

Я не совсем понимаю, о чем вы спрашиваете. Вы, кажется, спрашиваете: "Если я удалю этот код, почему он не работает?" где ответ просто "потому что вы удалили код"?, @Majenko


2 ответа


0

Я не могу ответить на первую часть вашего вопроса, так как не понимаю, о чем вы спрашиваете. Однако:

Я не знаю, почему они втроем не работают вместе.

Это не работает по 2 причинам:

  1. Ваша процедура приема специально ссылается только на один последовательный порт TFmini, и
  2. Невозможно получать одновременно более чем с одного порта программного обеспечения.

Если вы хотите использовать несколько устройств, вам действительно следует выбрать микроконтроллер, у которого достаточно аппаратных средств для выполнения этой работы. UNO не является подходящей платой.

Попробуйте Mega2560 или одну из множества 32-разрядных плат ARM или MIPS.

,

0

Я не знаю, почему они втроем не работают вместе.

Я уже ответил на этот вопрос в своем ответе на ваш предыдущий вопрос.

почему я использую этот расчет в своем коде и почему, если я его удалю, лидар не даст мне никаких измерений?

Эта часть кода считывает данные из первого интерфейса SoftwareSerial. Если вы не читаете эти данные (удалив эту часть кода), вы не считываете никаких данных с TFmini, следовательно, у вас нет никаких измерений. Если вам нужны измерения с лидарного датчика, не удаляйте кодовую часть, которая фактически считывает измерения.

Кроме того, я объясню полную функцию здесь в комментариях к коду. Перед этим вы должны понять, что здесь означает ключевое слово static. Обычные переменные, которые объявляются внутри функции (они же локальные переменные), будут уничтожены, когда код достигнет конца функции. Переменные, помеченные ключевым словом static, будут продолжать существовать и сохранять свое значение также после завершения функции. Они действуют во многом как глобальные переменные, хотя их пространство имен является локальным для функции (таким образом, вы можете объявлять другие переменные с таким именем в других частях вашего кода).

void getTFminiData(int* distance, int* strength) {
  static char i = 0; // this counter variable denotes the position of the next to be received byte in the buffer rx.
  char j = 0; // temporary counter variable
  int checksum = 0; // will be used to calculate the checksum, so that it can be compared to the one send with the data
  static int rx[9]; // this is the receive buffer, where the received data will be put

  if (TFMiniOne.available()) { // When data is available on the serial interface, read one byte  
    // Serial.println( "tfmini serial available" );
    // read one byte into the current position in the buffer
    rx[i] = TFMiniOne.read();

    // A valid message starts with two bytes of the value 0x59, so we restart, if the current message doesn't have that. (checking the first two bytes with these two if statements)
    if (rx[0] != 0x59) {
      i = 0;
    } else if (i == 1 && rx[1] != 0x59) {
      i = 0;
    } else if (i == 8) { // if we received 9 bytes (positions 0 to 8 in the buffer), the message is complete --> process it

      // Calculating the checksum by adding all bytes together
      for (j = 0; j < 8; j++) {
        checksum += rx[j];
      }

      // Comparing the calculated checksum with the last byte, that was received, (which is the checksum)
      // as the checksum is only one byte, we calculate the modulo with 256, thus only leaving the number range 0-255.
      if (rx[8] == (checksum % 256)) {
        // The checksums are equal, so the data is valid and we can proceed
        // The values for distance and strength have two bytes. Thus we need to put these bytes together into one value.
        *distance = rx[2] + rx[3] * 256;
        *strength = rx[4] + rx[5] * 256;
      }

      // reset the counter, since we have a full message and can now receive the next message
      i = 0;
    } else {
      // increment the counter variable to the next position, if we are currently receiving the bytes of a valid message
      i++;
    } 
  }  
}

Я надеюсь, что это сделает код более понятным. Как уже было сказано в моем предыдущем ответе, не имеет особого смысла сначала использовать библиотеку TFmini (объявляя соответствующие объекты), а затем осуществлять связь самостоятельно. Я бы посоветовал вам поближе ознакомиться с библиотекой TFmini. Попробуйте примеры, которые, несомненно, прилагаются к библиотеке. Используйте функции библиотек для связи с датчиками. Это значительно облегчит вам задачу, так как библиотека будет осуществлять связь за вас.

,