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 找到
测试
- 新窗口打开
$ roscore
- 新窗口打开,/dev/ttyUSB0为Arduino设备端口号
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
- 新窗口打开
$ 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之间切换
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号