rosserial_arduino学习笔记13《Arduino与示波器》

本教程中,我们将使用Arduino的ADC(模数转换器)和rqt_plot制作一个穷人的示波器。

我们将建立一个发布者,它将使用rosserial将每个Arduino的6个ADC引脚的模拟值发布到ROS。这将是一个相对较差的示波器(非常低的采样频率和分辨率),但它将非常适合许多快速和dirty的设置。

您可以在Arduino IDE的File> Examples> ros_lib> ADC中找到本教程的代码

如果您还没有这样做,请确保复制osserial stack并将其添加到ROS_PACKAGE_PATH中。

1. 自定义消息

此代码使用自定义消息类型ADC.msg。该消息对于标准Arduino上的每个模拟输入引脚都有uint16 field。

uint16 adc0
uint16 adc1
uint16 adc2
uint16 adc3
uint16 adc4
uint16 adc5

此消息是rosserial_arduino包的一部分,已添加到您的ros_lib库中。

2. 程序

本教程的代码非常简单。程序注册了一个Adc msg发布者,初始化节点句柄,然后尝试发布尽可能多的Adc消息。

/*
 * 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> //据说是Arduino的头文件,其实不用添加也行。
#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();
}

3 运行示波器

roscore
rqt_plot adc/adc0

现在,您应该看到rqt_plot中显示的adc0上的原始模拟值。报告的读数将从0到1024,因为Arduino有一个10位ADC。

为了获得实际电压:adc_val / 1024 * Arduino 的供电电压。尝试将ADC0连接到arduino上的地,5V和3.3V并观察该值。

另请注意,当您没有连接到ADC的任何内容时,它是浮动模拟输入,其值将随机振荡。

例如,查看下面的输出,其中ADC0输入在5V和gnd之间切换。在过渡期间有剧烈的振荡。

RXPlot.jpg

4 补充下各个文件的路径

这些我觉得很重要的路径。

猜你喜欢

转载自blog.csdn.net/qq_27806947/article/details/83628372
今日推荐