Benewake(北醒) TFmini-S\TFmini Plus\TF-Luna\TF02-Pro 串口版本雷达在Arduino Nano上的例程

本文介绍了北醒单点系列雷达在Arduino上的一些例子,并使用Nano板连接TFmini-S测试
例程下载:
链接: https://pan.baidu.com/s/1_Xb-k6ygCmWTFEEwkDEwXw
提取码: 6yw6 在这里插入图片描述
在这里插入图片描述

TFLidar_Arduino_HardwareSerial_Polling

接线定义

TFminiArduino
5V(红)5V
GND(黑)GND
TX(绿)D0(RX)

使用硬件串口、采用轮询方式
注:使用硬件串口时,烧录程序过程中雷达绿色线不要插入Nano板D0

代码

typedef struct {
  int distance;
  int strength;
  int temp;
  boolean receiveComplete;
} TF;
TF Lidar = {0, 0, 0, false};

void getLidarData(TF* lidar) 
{
  static char i = 0;
  char j = 0;
  int checksum = 0;
  static int rx[9];
  if (Serial.available()) 
  {
    rx[i] = Serial.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)) 
      {
          lidar->distance = rx[2] + rx[3] * 256;
          lidar->strength = rx[4] + rx[5] * 256;
          lidar->temp = (rx[6] + rx[7] * 256) / 8 - 256;
          lidar->receiveComplete = true;
      }
      i = 0;
    } 
    else 
    {
      i++;
    }
  }
}/*首先将雷达输出的9位数据按顺序存放入‘rx[]’数组中,随后计算输出的距离、信号强度、温度*/

void setup() {
  Serial.begin(115200);
}

void loop() 
{
  getLidarData(&Lidar);
  if (Lidar.receiveComplete) 
  {
    Lidar.receiveComplete = false;
    Serial.print("Distance: ");
    Serial.print(Lidar.distance);
    Serial.print("cm\t");
    Serial.print("Strength: ");
    Serial.print(Lidar.strength);
    Serial.print("\t");
    Serial.print("Temp: ");
    Serial.println(Lidar.temp);
  }
}

输出

点击“工具-串口监视器”即可观察输出结果
在这里插入图片描述

在这里插入图片描述

TFLidar_Arduino_HardwareSerial_Interrupt

接线定义

TFminiArduino
5V(红)5V
GND(黑)GND
TX(绿)D0(RX)

使用硬件串口、采用中断方式
注:使用硬件串口时,烧录程序过程中雷达绿色线不要插入Nano板D0

代码

typedef struct {
  int distance;
  int strength;
  int temp;
  boolean receiveComplete;
} TF;
TF Lidar = {0, 0, 0, false};

void getLidarData(TF* lidar) {
  static char i = 0;
  char j = 0;
  int checksum = 0;
  static int rx[9];
  if (Serial.available()) {
    rx[i] = Serial.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)) {
        lidar->distance = rx[2] + rx[3] * 256;
        lidar->strength = rx[4] + rx[5] * 256;
        lidar->temp = (rx[6] + rx[7] * 256) / 8 - 256;
        lidar->receiveComplete = true;
      }
      i = 0;
    } else {
      i++;
    }
  }
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  if (Lidar.receiveComplete) {
    Lidar.receiveComplete = false;
    Serial.print("Distance: ");
    Serial.print(Lidar.distance);
    Serial.print("cm\t");
    Serial.print("Strength: ");
    Serial.print(Lidar.strength);
    Serial.print("\t");
    Serial.print("Temp: ");
    Serial.println(Lidar.temp);
  }
}

void serialEvent() {
  getLidarData(&Lidar);
}

输出

在这里插入图片描述

TFLidar_Arduino_SoftwareSerial

接线定义

TFminiArduino
5V(红)5V
GND(黑)GND
TX(绿)D2(RX)

使用软件件串口、采用轮询方式

代码

#include <SoftwareSerial.h>  //header file of software serial port

SoftwareSerial Serial1(2, 3); //define software serial port name as Serial1 and define pin2 as RX and pin3 as TX

typedef struct {
  int distance;
  int strength;
  int temp;
  boolean receiveComplete;
} TF;
TF Lidar = {0, 0, 0, false};

void setup() {
  Serial.begin(115200);	//set bit rate of serial port connecting Arduino with computer
  Serial1.begin(115200);	//set bit rate of serial port connecting LiDAR with Arduino
}

void loop() {
  getLidarData(&Lidar);
  if (Lidar.receiveComplete) {
    Lidar.receiveComplete = false;
    Serial.print("Distance: ");
    Serial.print(Lidar.distance);
    Serial.print("cm\t");
    Serial.print("Strength: ");
    Serial.print(Lidar.strength);
    Serial.print("\t");
    Serial.print("Temp: ");
    Serial.println(Lidar.temp);
  }
}

void getLidarData(TF* lidar) {
  static char i = 0;
  char j = 0;
  int checksum = 0;
  static int rx[9];
  if (Serial1.available()) {
    rx[i] = Serial1.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)) {
        lidar->distance = rx[2] + rx[3] * 256;
        lidar->strength = rx[4] + rx[5] * 256;
        lidar->temp = (rx[6] + rx[7] * 256) / 8 - 256;
        lidar->receiveComplete = true;
      }
      i = 0;
    } else {
      i++;
    }
  }
}

输出

在这里插入图片描述

TFLidar_Arduino_SoftwareSerial_Multiple

接线定义

TFminiArduino
5V(红)5V
GND(黑)GND
LIDAR1 TX(绿)D2(RX)
LIDAR2TX(绿)D3(RX)

使用软件件串口、采用轮询方式

代码

#include <SoftwareSerial.h>

//SoftwareSerial port(TX, RX);
SoftwareSerial portOne(2, 2);
SoftwareSerial portTwo(3, 3);

typedef struct {
  int distance;
  int strength;
  int temp;
  boolean receiveComplete;
} TF;
TF Lidar1 = {0, 0, 0, false};
TF Lidar2 = {0, 0, 0, false};


void getLidarData(SoftwareSerial* port, TF* Lidar) {
  static char i = 0;
  char j = 0;
  int checksum = 0;
  static int rx[9];

  port->listen();
  if (port->available()) {
    rx[i] = port->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)) {
        Lidar->distance = rx[2] + rx[3] * 256;
        Lidar->strength = rx[4] + rx[5] * 256;
        Lidar->temp = (rx[6] + rx[7] * 256) / 8 - 256;
        Lidar->receiveComplete = true;
      }
      i = 0;
    } else {
      i++;
    }
  }
}

void setup() {
  Serial.begin(115200);
  portOne.begin(115200);
  portTwo.begin(115200);
}

void loop() {
  while (!Lidar1.receiveComplete) {
    getLidarData(&portOne, &Lidar1);
    if (Lidar1.receiveComplete) {
      Serial.print("Lidar1 Mesure: ");
      Serial.print("Distance: ");
      Serial.print(Lidar1.distance);
      Serial.print("cm\t");
      Serial.print("Strength: ");
      Serial.print(Lidar1.strength);
      Serial.print("\t");
      Serial.print("Temp: ");
      Serial.println(Lidar1.temp);
    }
  }
  Lidar1.receiveComplete = false;

  while (!Lidar2.receiveComplete) {
    getLidarData(&portTwo, &Lidar2);
    if (Lidar2.receiveComplete) {
      Serial.print("Lidar2 Mesure: ");
      Serial.print("Distance: ");
      Serial.print(Lidar2.distance);
      Serial.print("cm\t");
      Serial.print("Strength: ");
      Serial.print(Lidar2.strength);
      Serial.print("\t");
      Serial.print("Temp: ");
      Serial.println(Lidar2.temp);
    }
  }
  Lidar2.receiveComplete = false;
}

输出

在这里插入图片描述

TFLidar_Arduino_SoftwareSerial_Multiple_Frequency

接线定义

TFminiArduino
5V(红)5V
GND(黑)GND
LIDAR1 TX(绿)D2(RX)
LIDAR2TX(绿)D3(RX)

使用软件件串口、采用轮询方式、添加频率显示

代码

#include <SoftwareSerial.h>
typedef struct {
  int distance;
  int strength;
  int temp;
  boolean receiveComplete;
} TF;
TF Lidar1 = {0, 0, 0, false};
TF Lidar2 = {0, 0, 0, false};

//SoftwareSerial port(RX, TX);
SoftwareSerial portOne(2, 2);
SoftwareSerial portTwo(3, 3);

void getLidarData(SoftwareSerial* port, TF* lidar) {
  port->listen();
  while (lidar->receiveComplete == false)
  {
    static char i = 0;
    char j = 0;
    int checksum = 0;
    static int rx[9];
    if (port->available()) {
      rx[i] = port->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)) {
          lidar->distance = rx[2] + rx[3] * 256;
          lidar->strength = rx[4] + rx[5] * 256;
          lidar->temp = (rx[6] + rx[7] * 256) / 8 - 256;
          lidar->receiveComplete = true;
        }
        i = 0;
      } else {
        i++;
      }
    }
  }
}

void setup() {
  Serial.begin(115200);
  portOne.begin(115200);
  portTwo.begin(115200);
}

void loop() {
  static unsigned long lastTime = millis();
  static unsigned int count = 0;
  static unsigned int frequency = 0;

  getLidarData(&portOne, &Lidar1);
  getLidarData(&portTwo, &Lidar2);

  if (Lidar1.receiveComplete == true && Lidar2.receiveComplete == true) {
    ++count;

    if (millis() - lastTime > 999) {
      lastTime = millis();
      frequency = count;
      count = 0;
    }

    Serial.print("Lidar1 Mesure: ");
    Serial.print("Distance: ");
    Serial.print(Lidar1.distance);
    Serial.print("cm\t");
    Serial.print("Strength: ");
    Serial.print(Lidar1.strength);
    Serial.print("\t");
    Serial.print("Temp: ");
    Serial.print(Lidar1.temp);
    Serial.print("\t");

    Serial.print("Lidar2 Mesure: ");
    Serial.print("Distance: ");
    Serial.print(Lidar2.distance);
    Serial.print("cm\t");
    Serial.print("Strength: ");
    Serial.print(Lidar2.strength);
    Serial.print("\t");
    Serial.print("Temp: ");
    Serial.print(Lidar2.temp);
    Serial.print("\t");

    Serial.print(frequency);  //40~70Hz, It maybe higher if we don't print other thing.
    Serial.println("Hz");

    Lidar1.receiveComplete = false;
    Lidar2.receiveComplete = false;
  }

}

输出

在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino-TF卡是一种结合Arduino开发板和TF卡的扩展模块。TF卡,也称为MicroSD卡,是一种用于存储数据的小型存储卡,通常用于移动设备和嵌入式系统。Arduino-TF卡模块允许我们将TF卡与Arduino开发板连接在一起,从而可以利用Arduino的功能读写TF卡上的数据。 使用Arduino-TF卡模块,我们可以通过编程实现以下功能: 1. 读写文件:可以将文件从计算机中复制到TF卡中,以便将数据从计算机传输到嵌入式系统中。 2. 传感器数据记录:通过将传感器与Arduino连接并将数据存储在TF卡中,可以实现数据记录和分析。例如,可以记录温度传感器的数据,并在需要时将其读出。 3. 多媒体播放:通过将音乐、图像或视频文件存储在TF卡中,并将TF卡与Arduino-TF卡模块连接,可以通过Arduino实现简单的多媒体播放功能。 4. 日志记录:可以将系统运行时的日志信息存储在TF卡中,以便在需要时进行故障排查和分析。 在使用Arduino-TF卡模块时,我们需要连接TF卡模块和Arduino开发板,并在Arduino编程环境中编写相应的代码。通过使用相关的库函数,我们可以方便地实现对TF卡的读写操作。需要注意的是,在操作TF卡时,我们应该遵循正确的读写流程,并进行适当的错误处理,以保证数据的完整性和可靠性。 总之,Arduino-TF卡模块为我们提供了一种方便的方式来扩展Arduino开发板的存储能力,使得我们能够将数据存储在TF卡中,实现更多有趣和实用的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值