ROS与Arduino-Arduino示波器

Arduino示波器

说明

  • 这个教程展示通过Arduino的ADC(模拟到数字转换器)和rqt_plot制作简单的示波器
  • 建立一个发布,读取Arduino的6个ADC插脚的值通过rosserial传递到ROS
  • 这个示波器比较简陋,只有非常低的采样频率和分辨率

自定义消息

uint16 adc0
uint16 adc1
uint16 adc2
uint16 adc3
uint16 adc4
uint16 adc5
  • 代码使用自定义的消息类型,保存名为ADC.msg
  • 分别定义Arduino的6个对应模拟插脚,数据类型为uint16

代码

/*
 * rosserial ADC Example
 *
 * This is a poor man's Oscilloscope.  It does not have the sampling
 * rate or accuracy of a commerical scope, but it is great to get
 * an analog value into ROS in a pinch.
 */

#include <WProgram.h>
#include <ros.h>
#include <rosserial_arduino/Adc.h>

ros::NodeHandle nh;

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


void setup()
{
  pinMode(13, OUTPUT);
  nh.initNode();

  nh.advertise(p);
}

//We average the analog reading to eliminate some of the noise
int averageAnalog(int pin){
 int v=0;
      for(int i=0; i<4; i++) v+= analogRead(pin);
      return v/4;
}

long adc_timer;

void loop()
{

    adc_msg.adc0 = averageAnalog(0);
    adc_msg.adc1 = averageAnalog(1);
    adc_msg.adc2 = averageAnalog(2);
    adc_msg.adc3 = averageAnalog(3);
    adc_msg.adc4 = averageAnalog(4);
    adc_msg.adc5 = averageAnalog(5);

    p.publish(&adc_msg);

  nh.spinOnce();
}
  • 代码可以在Arduino IDE 的 File>Examples>ros_lib>ADC 找到

测试

  1. 新窗口打开
$ roscore
  1. 新窗口打开,/dev/ttyUSB0为Arduino设备端口号
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
  1. 新窗口打开
$ rqt_plot adc/adc0
  • 在rqt_plot上应该看到adc0插脚模拟值
  • 读数从0-1024,因为Arduino有10-bit的ADC.
  • 获取即时电压:adc_val / 1024 * Arduino voltage
  • 尝试连接ADC0到Arduino的GND,5V, and 3.3V并观察值的变化
  • 但没有连接ADC,将是随机浮动的数值

效果图

请输入图片描述

  • ADC0输入在5V和gnd之间切换

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros arduino