esp32发布机器人电池电压到ros2(micro-ros+CoCube)

举报
zhangrelay 发表于 2022/08/05 00:38:09 2022/08/05
【摘要】 示例程序测试端口ad数值: #include "Arduino.h"#include <ESP32AnalogRead.h>ESP32AnalogRead adc;void setup(){ adc.attach(34); Serial.begin(115200);} void loop(){ delay(50); S...

示例程序测试端口ad数值:


  
  1. #include "Arduino.h"
  2. #include <ESP32AnalogRead.h>
  3. ESP32AnalogRead adc;
  4. void setup()
  5. {
  6. adc.attach(34);
  7. Serial.begin(115200);
  8. }
  9. void loop()
  10. {
  11. delay(50);
  12. Serial.println("Voltage = "+String(adc.readVoltage()));
  13. }

这只是一个简单测试ad口电压的程序,没有滤波,没有依据实际进行数值变换。

34是测量电压端口。

初始化,ad和串口波特率:


  
  1. void setup()
  2. {
  3. adc.attach(34);
  4. Serial.begin(115200);
  5. }

循环测电压并输出串口,时延50ms:


  
  1. void loop()
  2. {
  3. delay(50);
  4. Serial.println("Voltage = "+String(adc.readVoltage()));
  5. }

这是单片机简单测电压的程序。

需要补充滤波和标度变换。留作思考题。

效果如下图: 


micro-ros发布一个消息案例如下:


  
  1. #include <micro_ros_arduino.h>
  2. #include <stdio.h>
  3. #include <rcl/rcl.h>
  4. #include <rcl/error_handling.h>
  5. #include <rclc/rclc.h>
  6. #include <rclc/executor.h>
  7. #include <std_msgs/msg/int32.h>
  8. #if !defined(ESP32) && !defined(TARGET_PORTENTA_H7_M7) && !defined(ARDUINO_NANO_RP2040_CONNECT)
  9. #error This example is only avaible for Arduino Portenta, Arduino Nano RP2040 Connect and ESP32 Dev module
  10. #endif
  11. rcl_publisher_t publisher;
  12. std_msgs__msg__Int32 msg;
  13. rclc_support_t support;
  14. rcl_allocator_t allocator;
  15. rcl_node_t node;
  16. #define LED_PIN 13
  17. #define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){error_loop();}}
  18. #define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){}}
  19. void error_loop(){
  20. while(1){
  21. digitalWrite(LED_PIN, !digitalRead(LED_PIN));
  22. delay(100);
  23. }
  24. }
  25. void timer_callback(rcl_timer_t * timer, int64_t last_call_time)
  26. {
  27. RCLC_UNUSED(last_call_time);
  28. if (timer != NULL) {
  29. RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
  30. msg.data++;
  31. }
  32. }
  33. void setup() {
  34. set_microros_wifi_transports("***", "***", "***", 8888);
  35. pinMode(LED_PIN, OUTPUT);
  36. digitalWrite(LED_PIN, HIGH);
  37. delay(2000);
  38. allocator = rcl_get_default_allocator();
  39. //create init_options
  40. RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));
  41. // create node
  42. RCCHECK(rclc_node_init_default(&node, "micro_ros_arduino_wifi_node", "", &support));
  43. // create publisher
  44. RCCHECK(rclc_publisher_init_best_effort(
  45. &publisher,
  46. &node,
  47. ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
  48. "topic_name"));
  49. msg.data = 0;
  50. }
  51. void loop() {
  52. RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
  53. msg.data++;
  54. }

需要修改哪些代码?

ROS1/2中的数据类型如下:

ROS Message Types
Bool
Byte
ByteMultiArray
Char
ColorRGBA
Duration
Empty
Float32
Float32MultiArray
Float64
Float64MultiArray
Header
Int16
Int16MultiArray
Int32
Int32MultiArray
Int64
Int64MultiArray
Int8
Int8MultiArray
MultiArrayDimension
MultiArrayLayout
String
Time
UInt16
UInt16MultiArray
UInt32
UInt32MultiArray
UInt64
UInt64MultiArray
UInt8
UInt8MultiArray

battery电池,电压情况:

高>4.1v为插入usb口,低为电池供电。


需要启动agent:

参考程序如下: 


  
  1. #include <micro_ros_arduino.h>
  2. #include <stdio.h>
  3. #include <rcl/rcl.h>
  4. #include <rcl/error_handling.h>
  5. #include <rclc/rclc.h>
  6. #include <rclc/executor.h>
  7. #include <std_msgs/msg/float32.h>
  8. #if !defined(ESP32) && !defined(TARGET_PORTENTA_H7_M7) && !defined(ARDUINO_NANO_RP2040_CONNECT)
  9. #error This example is only avaible for Arduino Portenta, Arduino Nano RP2040 Connect and ESP32 Dev module
  10. #endif
  11. #define BAT_DET 34
  12. rcl_publisher_t publisher;
  13. std_msgs__msg__Float32 msg;
  14. rclc_support_t support;
  15. rcl_allocator_t allocator;
  16. rcl_node_t node;
  17. #define LED_PIN 13
  18. #define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){error_loop();}}
  19. #define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){}}
  20. void error_loop(){
  21. while(1){
  22. digitalWrite(LED_PIN, !digitalRead(LED_PIN));
  23. delay(100);
  24. }
  25. }
  26. void timer_callback(rcl_timer_t * timer, int64_t last_call_time)
  27. {
  28. RCLC_UNUSED(last_call_time);
  29. if (timer != NULL) {
  30. RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
  31. msg.data++;
  32. }
  33. }
  34. void setup() {
  35. set_microros_wifi_transports("***", "***", "***", 8888);
  36. pinMode(BAT_DET, INPUT);
  37. pinMode(LED_PIN, OUTPUT);
  38. digitalWrite(LED_PIN, HIGH);
  39. delay(2000);
  40. allocator = rcl_get_default_allocator();
  41. //create init_options
  42. RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));
  43. // create node
  44. RCCHECK(rclc_node_init_default(&node, "robot_battery_wifi_node", "", &support));
  45. // create publisher
  46. RCCHECK(rclc_publisher_init_best_effort(
  47. &publisher,
  48. &node,
  49. ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Float32),
  50. "robot_battery"));
  51. msg.data = 0.66;
  52. }
  53. void loop() {
  54. float battery = 4.21 * analogRead(BAT_DET) / 2435;
  55. RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
  56. msg.data=battery;
  57. delay(1000);
  58. }

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/126149144

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。