本帖最后由 liuyu-419812 于 2015-10-26 19:51 编辑
在这里,将会使用Arduino的ADC和ROS的rqt_plot做一个低性能的示波器。我们会设置一个发布者,它会通过使用rosserial将来自Arduinod的6个ADC引脚的每一个模拟值发送到ROS。这将是一个相对差的示波器(很低的采样频率和分辨率),但是对于快速实现一个示波器是完美的。 参考:http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20Oscilloscope
这个教程的代码可以在Arduino下的File>Examples>ros_lib>ADC找到。这个代码使用了一个自定义消息类型:ADC.msg。这个消息对Arduino上的每一个模拟输入引脚设置了一个uint16域。 - uint16 adc0
- uint16 adc1
- uint16 adc2
- uint16 adc3
- uint16 adc4
- uint16 adc5
复制代码 这个消息是rosserial_arduino包的一部分,并已经添加到ros_lib库。 这个教程的代码是相当简单的,代码注册一个ADC msg发布者,初始化节点句柄,然后试图发布尽可能多的ADC消息。代码如下: - <font face="宋体"><font face="宋体">/*
- * 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();
- }</font></font>
复制代码 下面,编译下载。接着开始看看示波器的效果。
打开一个终端,运行: - <font face="宋体"><font face="宋体">roscore</font></font>
复制代码 接着,打开一个新的终端,运行rosserial客户端应用程序,确保使用正确的串口:- source ~/<ws>/install/setup.bash
- rosrun rosserial_python serial_node.py /dev/ttyACM0
复制代码 其中,<ws>为安装rosserial的工作空间。打开一个新的终端,就可以显示波形了。 - <font face="宋体"><font face="宋体">source ~/<ws>/install/setup.bash
- rqt_plot adc/adc0</font></font>
复制代码
现在,你应该看到在rqt_plot上显示的adc0的原始模拟值,这些值从0到1024,是因为Arduino具有一个10位的ADC。为了获得实际的电压值,可以将adc_val/1024*Arduino供电电压。连接ADC0到Arduino上的地,和3.3V引脚。下图所示的输出,为当ADC0的输入在3.3V和gnd之间通过按键切换,其中,在过渡过程中有震荡产生,检测的不明显。可以看出性能确实很差。
当ADC没有任何连接的时候,它是一个浮动的模拟输入,它的值将随机震荡。
|