查看: 3596|回复: 0

[经验] 【FirePrime】通过arduino学习ROS系列5示波器快速实现

[复制链接]
  • TA的每日心情
    奋斗
    2018-11-15 08:49
  • 签到天数: 1031 天

    连续签到: 2 天

    [LV.10]以坛为家III

    发表于 2015-10-26 19:32:33 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 liuyu-419812 于 2015-10-26 19:51 编辑

          在这里,将会使用ArduinoADCROSrqt_plot做一个低性能的示波器。我们会设置一个发布者,它会通过使用rosserial将来自Arduinod6ADC引脚的每一个模拟值发送到ROS。这将是一个相对差的示波器(很低的采样频率和分辨率),但是对于快速实现一个示波器是完美的。
          参考:http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20Oscilloscope
          这个教程的代码可以在Arduino下的File>Examples>ros_lib>ADC找到。这个代码使用了一个自定义消息类型:ADC.msg。这个消息对Arduino上的每一个模拟输入引脚设置了一个uint16域。
    1. uint16 adc0
    2. uint16 adc1
    3. uint16 adc2
    4. uint16 adc3
    5. uint16 adc4
    6. uint16 adc5
    复制代码
           这个消息是rosserial_arduino包的一部分,并已经添加到ros_lib库。
        这个教程的代码是相当简单的,代码注册一个ADC msg发布者,初始化节点句柄,然后试图发布尽可能多的ADC消息。代码如下:
    1. <font face="宋体"><font face="宋体">/*
    2. * rosserial ADC Example
    3. *
    4. * This is a poor man's Oscilloscope. It does not have the sampling
    5. * rate or accuracy of a commerical scope, but it is great to get
    6. * an analog value into ROS in a pinch.
    7. */
    8. #include <WProgram.h>
    9. #include <ros.h>
    10. #include <rosserial_arduino/Adc.h>
    11. ros::NodeHandle nh;
    12. rosserial_arduino::Adc adc_msg;
    13. ros::Publisher p("adc", &adc_msg);
    14. void setup()
    15. {
    16. pinMode(13, OUTPUT);
    17. nh.initNode();
    18. nh.advertise(p);
    19. }
    20. //We average the analog reading to eliminate some of the noise
    21. int averageAnalog(int pin)
    22. {
    23. int v=0;
    24. for(int i=0; i<4; i++)
    25. v+= analogRead(pin);
    26. return v/4;
    27. }
    28. long adc_timer;
    29. void loop()
    30. {
    31. adc_msg.adc0 = averageAnalog(0);
    32. adc_msg.adc1 = averageAnalog(1);
    33. adc_msg.adc2 = averageAnalog(2);
    34. adc_msg.adc3 = averageAnalog(3);
    35. adc_msg.adc4 = averageAnalog(4);
    36. adc_msg.adc5 = averageAnalog(5);
    37. p.publish(&adc_msg);
    38. nh.spinOnce();
    39. }</font></font>
    复制代码
        下面,编译下载。接着开始看看示波器的效果。
        打开一个终端,运行:
    1. <font face="宋体"><font face="宋体">roscore</font></font>
    复制代码
        接着,打开一个新的终端,运行rosserial客户端应用程序,确保使用正确的串口:
    1. source ~/<ws>/install/setup.bash
    2. rosrun rosserial_python serial_node.py /dev/ttyACM0
    复制代码
    其中,<ws>为安装rosserial的工作空间。打开一个新的终端,就可以显示波形了。
    1. <font face="宋体"><font face="宋体">source ~/<ws>/install/setup.bash
    2. rqt_plot adc/adc0</font></font>
    复制代码
    P51026-175001.jpg
    P51026-175216.jpg
    现在,你应该看到在rqt_plot上显示的adc0的原始模拟值,这些值从01024,是因为Arduino具有一个10位的ADC。为了获得实际的电压值,可以将adc_val/1024*Arduino供电电压。连接ADC0Arduino上的地,3.3V引脚。下图所示的输出,为当ADC0的输入在3.3Vgnd之间通过按键切换,其中,在过渡过程中有震荡产生,检测的不明显。可以看出性能确实很差。
    P51026-175104.jpg
    ADC没有任何连接的时候,它是一个浮动的模拟输入,它的值将随机震荡。
    P51026-175159.jpg



    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-14 23:03 , Processed in 0.123173 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.