专栏首页机器人课程与技术ESP8266和ROS收发消息读取模拟量控制LED亮度

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

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


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

源代码如下:

#if (ARDUINO >= 100)
 #include <Arduino.h>
#else
 #include <WProgram.h>
#endif
#include <ESP8266WiFi.h>
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int16.h>
#include <std_msgs/Float64.h>
#include <Servo.h>
#include <rosserial_arduino/Adc.h>

//
// 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<length; 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<std_msgs::String> sub("message", &chatterCallback);
ros::NodeHandle_<WiFiHardware> 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。

  1. message提取数值作为PWM波送到13脚控制LED亮度(占空比);
  2. adc采集模拟量绘制曲线;
  3. 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

rosrun rosserial_python serial_node.py tcp

主题列表:

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ROS2编程基础课程--msg/srv

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    zhangrelay
  • ESP8266和ROS调试一些问题汇总

    rosrun rosserial_arduino serial_node.py _port:=/dev/ttyUSB0

    zhangrelay
  • ROS_Kinetic_16 ubuntu中安装使用Matlab和ROS

    参考网址:http://cn.mathworks.com/hardware-support/robot-operating-system.html?reques...

    zhangrelay
  • P1440 求m区间内的最小值

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。 输...

    attack
  • 蓝桥杯 基础练习 数列特征

    输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。

    Debug客栈
  • 深度学习对话系统实战篇 -- 简单 chatbot 代码实现

    本文的代码都可以到我的 github 中下载:https://github.com/lc222/seq2seq_chatbot 前面几篇文章我们已经介绍了 s...

    AI研习社
  • 【蝴蝶效应】运维小故事一则

    蝴蝶效应: 是美国气象学家爱德华·洛伦兹(Edward N.Lorenz)1963年提出的一个效应:一只南美洲亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可...

    运维部落
  • 使用git做patch,查找patch

    2. 当从服务器clone下来了最新的代码,然后想知道中间的某一部分的代码的patch,

    用户3765803
  • 最大公约数

    /* 功能:最大公约数 日期:2013-4-19 */ #include <stdio.h> #include <stdlib.h> #includ...

    汐楓
  • Hadoop YARN学习之Hadoop框架演进历史简述

    Hadoop YARN学习之Hadoop框架演进历史简述(1) 1. Hadoop在其发展的过程中经历了多个阶段: 阶段0:Ad Hoc集群时代 标志着H...

    王小雷

扫码关注云+社区

领取腾讯云代金券