python esp8266 控制led_ESP8266和ROS收发消息读取模拟量控制LED亮度

该博客介绍了如何使用ESP8266通过ROS进行通信,控制LED亮度。通过建立TCP连接,ESP8266订阅ROS的message话题,将接收到的数值转换为PWM信号来调节LED的亮度。同时,ESP8266还发布adc话题,分享模拟量数据。读者可以了解到如何配置和运行相应的ROS节点,以及使用rostopic和rosbag进行数据交互和记录。
摘要由CSDN通过智能技术生成

如果需要ESP8266和ROS通信先阅读如下博客:

这里测试环境melodic和noetic都可行。

源代码如下:

#if (ARDUINO >= 100)

#include

#else

#include

#endif

#include

#include

#include

#include

#include

#include

#include

//

// WiFi Definitions //

//

const char* ssid = "HUAWEI_WiFi";

const char* password = "cslgcslg";

IPAddress server(192, 168, 3, 153); // ip of your ROS server

IPAddress ip_address;

int status = WL_IDLE_STATUS;

WiFiClient client;

class WiFiHardware {

public:

WiFiHardware() {};

void init() {

// do your initialization here. this probably includes TCP server/client setup

client.connect(server, 11411);

}

// read a byte from the serial port. -1 = failure

int read() {

// implement this method so that it reads a byte from the TCP connection and returns it

// you may return -1 is there is an error; for example if the TCP connection is not open

return client.read(); //will return -1 when it will works

}

// write data to the connection to ROS

void write(uint8_t* data, int length) {

// implement this so that it takes the arguments and writes or prints them to the TCP connection

for(int i=0; i

client.write(data[i]);

}

// returns milliseconds since start of program

unsigned long time() {

return millis(); // easy; did this one for you

}

};

Servo s;

int i;

void chatterCallback(const std_msgs::String& msg) {

i = atoi(msg.data);

s.write(i);

}

std_msgs::String str_msg;

rosserial_arduino::Adc adc_msg;

ros::Publisher chatter("chatter", &str_msg);

ros::Publisher p("adc", &adc_msg);

ros::Subscriber<:string> sub("message", &chatterCallback);

ros::NodeHandle_ nh;

char hello[20] = "ESP8266 wifi alive!";

void setupWiFi()

{

WiFi.begin(ssid, password);

Serial.print("\nConnecting to "); Serial.println(ssid);

uint8_t i = 0;

while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);

if(i == 21){

Serial.print("Could not connect to"); Serial.println(ssid);

while(1) delay(500);

}

Serial.print("Ready! Use ");

Serial.print(WiFi.localIP());

Serial.println(" to access client");

}

int averageAnalog(int pin){

int v=0;

for(int i=0; i<2; i++) v+= analogRead(pin);

return v/2;

}

void setup() {

Serial.begin(115200);

setupWiFi();

delay(2000);

s.attach(13); // PWM pin

nh.initNode();

nh.advertise(chatter);

nh.subscribe(sub);

nh.advertise(p);

}

void loop() {

str_msg.data = hello;

chatter.publish( &str_msg );

adc_msg.adc0 = averageAnalog( 0 );

p.publish( &adc_msg );

nh.spinOnce();

delay( 10 );

}

简单解释一下,发布节点chatter,adc,订阅节点message。

message提取数值作为PWM波送到13脚控制LED亮度(占空比);

adc采集模拟量绘制曲线;

chatter只用作发布消息,告知主机连接成功。

使用如下命令启动wemos D1和ROS:

roscore

rosrun rosserial_python serial_node.py tcp

rostopic pub /message std_msgs/String "data: '10'"

rostopic echo /adc

rostopic echo /chatter

过程如下:

roscore

2bc992ca74975d6cd823b7844daddfd5.png

rosrun rosserial_python serial_node.py tcp

7993638ec2c7057d85635b6b79355725.png

主题列表:

f01466d1cdd258e079a9cee8d3af391c.png

rostopic pub /message std_msgs/String "data: '10'"

c4615f1d4b59506fa7e5828db0abfddb.png

79b46a6b5d219526486536e77db9b5b9.png

25c6cdd8381571386850f8b8de7943e3.png

使用rqt_graph查看所有节点状态:

7ab0e378388857eb3301b6c2dfe98d8c.png

使用rosbag记录ADC数据并使用plot查看曲线:

dc66e6fe39e9de0fb161197abe1f80e0.png

fd0950e5837b240dba26b5ad03b1b1e1.png

关闭所有节点,只留下roscore,使用rosbag play查看记录数据:

d5ea8429232186cc67051459d7b0cd0d.png

0368468844921aaddb44d1ab160b07cc.png

所有Arduino,stm32等单片机都可以借助ROS实现物联网硬件功能。

-Fin-

Python 中使用 ROS 发布 Twist 和 Odometry 消息类型的步骤如下: 1. 导入必要的 ROS Python 库和消息类型: ```python import rospy from geometry_msgs.msg import Twist from nav_msgs.msg import Odometry ``` 2. 初始化 ROS 节点: ```python rospy.init_node('my_node') ``` 3. 创建 Twist 和 Odometry 的 Publisher: ```python twist_pub = rospy.Publisher('cmd_vel', Twist, queue_size=10) odom_pub = rospy.Publisher('odom', Odometry, queue_size=10) ``` 4. 构造 Twist 和 Odometry 消息: ```python twist_msg = Twist() twist_msg.linear.x = 0.1 twist_msg.angular.z = 0.5 odom_msg = Odometry() odom_msg.pose.pose.position.x = 1.0 odom_msg.pose.pose.position.y = 2.0 odom_msg.pose.pose.position.z = 0.0 odom_msg.pose.pose.orientation.x = 0.0 odom_msg.pose.pose.orientation.y = 0.0 odom_msg.pose.pose.orientation.z = 0.0 odom_msg.pose.pose.orientation.w = 1.0 ``` 5. 发布消息: ```python twist_pub.publish(twist_msg) odom_pub.publish(odom_msg) ``` 完整的代码示例: ```python import rospy from geometry_msgs.msg import Twist from nav_msgs.msg import Odometry rospy.init_node('my_node') twist_pub = rospy.Publisher('cmd_vel', Twist, queue_size=10) odom_pub = rospy.Publisher('odom', Odometry, queue_size=10) twist_msg = Twist() twist_msg.linear.x = 0.1 twist_msg.angular.z = 0.5 odom_msg = Odometry() odom_msg.pose.pose.position.x = 1.0 odom_msg.pose.pose.position.y = 2.0 odom_msg.pose.pose.position.z = 0.0 odom_msg.pose.pose.orientation.x = 0.0 odom_msg.pose.pose.orientation.y = 0.0 odom_msg.pose.pose.orientation.z = 0.0 odom_msg.pose.pose.orientation.w = 1.0 twist_pub.publish(twist_msg) odom_pub.publish(odom_msg) rospy.spin() ``` 这里 `rospy.spin()` 是防止程序退出的语句,它会一直等待 ROS 节点的关闭信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值