2012-05-16 56 views
3

我是Beaglebone的新手,并且一直保持良好的点击状态,直到出现这个奇怪的问题。我在这里张贴之前花了整个周末的时间试图找出答案。在BeagleBone上读取模拟输入,避免出现“分段错误”错误

我正在尝试使用来自Angstrom 3.2.5+的Beaglebone的多个传感器来读取模拟输入,并且我有一个问题,我认为这可能是硬件问题。

使用该Python scriptAlexander Hiam's PyBBIO我已经能够测试光敏电阻成功(该值到多和少的附带光响应):

# Import PyBBIO library: 
from bbio import * 

# Create a setup function: 
def setup(): pass # Nothing to do here 

# Create a main function: 
def loop(): 

    print "-----" 

    print "AIN0 [P9.39] - " + str(analogRead(A0)) 
    print "AIN1 [P9.40] - " + str(analogRead(A1)) 
    print "AIN2 [P9.37] - " + str(analogRead(A2)) 
    print "AIN3 [P9.38] - " + str(analogRead(A3)) 
    print "AIN4 [P9.35] - " + str(analogRead(A4)) 
    print "AIN5 [P9.36] - " + str(analogRead(A5)) 
    print "AIN6 [P9.33] - " + str(analogRead(A6)) 
    print "AIN7 [P9.39] - " + str(analogRead(A7)) 

    delay(500) 

# Start the loop: 
run(setup, loop) 

但是,任何其他的模拟式(AINX(2- 7))我用上面的脚本阅读总是显示我插入的光敏电阻相同的值 - AIN1

而且,可能有关,我无法阅读任何使用猫的AINx(1-7)一个错误

cat /sys/bus/platform/devices/tsc/ain1 
Segmentation fault 

有何想法?我很困难。提前致谢。

PS:更多信息...

我的电路由一个10K的电阻和光敏电阻的。我的销连接是:

  • 头P9引脚32(VDD_ADC(1.8V))以光电管的一端
  • 头P9引脚34(GNDA_ADC)到电阻
  • 头P9销的另一端39(AIN0)至光电池的另一侧与下拉电阻

这里的一端沿是相匹配您自己的电路的图像: enter image description here

从所有AINX(1-7)的结果的,然后一些...

# cat /sys/bus/platform/devices/tsc/ain0 
cat: /sys/bus/platform/devices/tsc/ain0: No such file or directory 
# cat /sys/bus/platform/devices/tsc/ain1 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain2 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain3 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain4 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain5 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain6 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain7 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain8 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain9 
cat: /sys/bus/platform/devices/tsc/ain9: No such file or directory 

更新1

我编辑了analog_test_simple.py文件上显示的BeagleBone所有ADC端口。这是来自外壳的结果,没有传感器插入。

----- 
AIN0 [P9.39] - 3948 
AIN1 [P9.40] - 4016 
AIN2 [P9.37] - 4002 
AIN3 [P9.38] - 3934 
AIN4 [P9.35] - 4001 
AIN5 [P9.36] - 3935 
AIN6 [P9.33] - 3968 
AIN7 [P9.39] - 4005 
----- 
AIN0 [P9.39] - 3946 
AIN1 [P9.40] - 4005 
AIN2 [P9.37] - 3945 
AIN3 [P9.38] - 3957 
AIN4 [P9.35] - 4018 
AIN5 [P9.36] - 3945 
AIN6 [P9.33] - 3967 
AIN7 [P9.39] - 3955 
... 

如果我堵塞传感器回我得到值的变化,但同样,他们都是一样的:

----- 
AIN0 [P9.39] - 2836 
AIN1 [P9.40] - 2836 
AIN2 [P9.37] - 2837 
AIN3 [P9.38] - 2831 
AIN4 [P9.35] - 2840 
AIN5 [P9.36] - 2837 
AIN6 [P9.33] - 2837 
AIN7 [P9.39] - 2837 
----- 
AIN0 [P9.39] - 2834 
AIN1 [P9.40] - 2834 
AIN2 [P9.37] - 2829 
AIN3 [P9.38] - 2825 
AIN4 [P9.35] - 2826 
AIN5 [P9.36] - 2817 
AIN6 [P9.33] - 2815 
AIN7 [P9.39] - 2815 
... 
+0

您将从[electronics.SE](http://electronics.stackexchange.com/)获得更好的答案 –

+1

是否有任何必要的函数来初始化/设置ADC - 告诉它需要使用多少个通道以及哪些范围? YOu也可以在读取之间尝试短暂(0.1s?)的睡眠时间,以便将ADC时间交换到新的输入并解决 –

回答

5

OK,得到的答复是,有两个独立的问题,这两者都是由使用PyBBIO库引起的。阅读...

问题1:不一致/不正确传感器数值

有人建议在我的问题的意见促使我add a delay to my original PyBBIO-based script。这是无传感器:

# python PyBBIO/examples/analog_test_simple.py 
----- 
AIN0 [P9.39] - 3955 
AIN1 [P9.40] - 4015 
AIN2 [P9.37] - 4012 
AIN3 [P9.38] - 3950 
AIN4 [P9.33] - 3998 
AIN5 [P9.36] - 4007 
AIN6 [P9.35] - 3984 
----- 
AIN0 [P9.39] - 4007 
AIN1 [P9.40] - 3953 
AIN2 [P9.37] - 4005 
AIN3 [P9.38] - 3941 
AIN4 [P9.33] - 3956 
AIN5 [P9.36] - 3934 
AIN6 [P9.35] - 3946 
... 

这里是之后我插入式传感器的结果:

# python PyBBIO/examples/analog_test_simple.py 
----- 
AIN0 [P9.39] - 2888 
AIN1 [P9.40] - 2894 
AIN2 [P9.37] - 2899 
AIN3 [P9.38] - 2907 
AIN4 [P9.33] - 2914 
AIN5 [P9.36] - 2912 
AIN6 [P9.35] - 2914 
----- 
AIN0 [P9.39] - 2912 
AIN1 [P9.40] - 2905 
AIN2 [P9.37] - 2901 
AIN3 [P9.38] - 2891 
AIN4 [P9.33] - 2896 
AIN5 [P9.36] - 2890 
AIN6 [P9.35] - 2896 
... 

你可以看到,堵塞,传感器仍然影响着所有的值,而不管的延迟。

想到这一点后,我决定尝试重复使用脚本的结果,而不使用PyBBIO。我写了a new Python file to test and print the reading from each analog-in pin on the BeagleBone using the Python os module。该文件使用os.system('cat ...')来打印这些值,并在每个值之间包含一个较短的延迟。下面是代码:

import os,time 
i = 1 

while(True): 
    os.system("cat /sys/bus/platform/devices/tsc/ain" + str(i)) 
    print " - AIN" + str(i-1) 
    if i==7: 
     i=1 
     time.sleep(.5) 
     print "------" 
    else: 
     i+=1  
    time.sleep(.1) 

以下是没有任何部件的结果插入的进入BeagleBone:

# python analog-test-all-pins.py 
------ 
3943 - AIN0 
3819 - AIN1 
3955 - AIN2 
2018 - AIN3 
2093 - AIN4 
3583 - AIN5 
3658 - AIN6 
------ 
3947 - AIN0 
3746 - AIN1 
3959 - AIN2 
2034 - AIN3 
2123 - AIN4 
3547 - AIN5 
3644 - AIN6 
... 

这里是上面的光敏电路的结果插入的成AIN0:

# python analog-test-all-pins.py 
------ 
2915 - AIN0 
3347 - AIN1 
3556 - AIN2 
1478 - AIN3 
1602 - AIN4 
2393 - AIN5 
2402 - AIN6 
------ 
2913 - AIN0 
3337 - AIN1 
3560 - AIN2 
1487 - AIN3 
1606 - AIN4 
2350 - AIN5 
2489 - AIN6 

这里是与光敏电阻电路,数据结果引发堵塞,到AIN2:

# python analog-test-all-pins.py 
------ 
3939 - AIN0 
3792 - AIN1 
2881 - AIN2 
1986 - AIN3 
2089 - AIN4 
3462 - AIN5 
3543 - AIN6 
------ 
3923 - AIN0 
3791 - AIN1 
2866 - AIN2 
1960 - AIN3 
2055 - AIN4 
3528 - AIN5 
3615 - AIN6 
... 

AIN3:

# python analog-test-all-pins.py 
------ 
3951 - AIN0 
3764 - AIN1 
3933 - AIN2 
2899 - AIN3 
2134 - AIN4 
3606 - AIN5 
3737 - AIN6 
------ 
3960 - AIN0 
3823 - AIN1 
3957 - AIN2 
2910 - AIN3 
2118 - AIN4 
3635 - AIN5 
3645 - AIN6 
... 

photoresistor and TMP36 sensor

这里是如果我插上光敏电阻数据导致回AIN0及插头的TMP36 temperature sensor到AIN3结果。

# python analog-test-all-pins.py 
------ 
2866 - AIN0 
3340 - AIN1 
3540 - AIN2 
885 - AIN3 
1591 - AIN4 
2348 - AIN5 
2389 - AIN6 
------ 
2872 - AIN0 
3339 - AIN1 
3551 - AIN2 
884 - AIN3 
1560 - AIN4 
2383 - AIN5 
2434 - AIN6 
... 

而只是为了确认正在读取传感器,而不会影响其他引脚,这里是AIN5

# python analog-test-all-pins.py 
------ 
2897 - AIN0 
3338 - AIN1 
3557 - AIN2 
1464 - AIN3 
1578 - AIN4 
888 - AIN5 
2459 - AIN6 
------ 
2901 - AIN0 
3344 - AIN1 
3561 - AIN2 
1460 - AIN3 
1579 - AIN4 
889 - AIN5 
2395 - AIN6 
... 

的TMP36这使我得出这样的结论与PyBBIO库中的问题这是造成这一点。这也是导致第二个问题,虽然我不知道

问题2如何...:分段错误

我曾与Segmentation fault错误的问题是由于PyBBIO库的东西。例如,如果我重新启动的BeagleBoard和运行:

# cat /sys/bus/platform/devices/tsc/ain1 
3953 
# cat /sys/bus/platform/devices/tsc/ain2 
3818 

我得到匹配来自使用os模块的Python脚本上面的输出,其值。

但是,如果我运行任何PyBBIO脚本访问AIN引脚(其例子是上文),然后再次运行cat我得到的错误:如果我重启板(拔出和插件

# cat /sys/bus/platform/devices/tsc/ain1 
Segmentation fault 
# cat /sys/bus/platform/devices/tsc/ain2 
Segmentation fault 

在功率),我可以再次使用cat

# cat /sys/bus/platform/devices/tsc/ain1 
2890 
# cat /sys/bus/platform/devices/tsc/ain2 
3366 

我使用Matt Richardson's mrBBIO library代替也试过,用this file

from mrbbio import * 

def setup(): 
    #pinMode("P9.36", INPUT) 
    pass 

def loop(): 

    print "-----" 

    for key, value in analogPinDef.items(): 
     # There is currently an error in mrBBIO, as the analogPinDef dict points to: 
     # ain[0-6] in /sys/devices/platform/tsc/ while it should point at: ain[1-7] 
     if key=="P9.39": 
      print analogRead(key) + " - " + value 
      delay(100) 

    delay(1000) 

run (setup,loop) 

得到这个:

# python mrbbio/analog-test-all-pins.py 
----- 
2005 - ain4 
3636 - ain6 
3812 - ain2 
2114 - ain5 
3872 - ain3 
3950 - ain1 
----- 
2002 - ain4 
3530 - ain6 
3787 - ain2 
2059 - ain5 
3895 - ain3 
3952 - ain1 
... 
Cleaning up. Unexporting the following pins: 

而且我发现它不惹我的能力得到与cat结果 - 可能是因为它出口的针底。

# cat /sys/bus/platform/devices/tsc/ain1 
3960 
# cat /sys/bus/platform/devices/tsc/ain2 
3830 
+0

如果您参考了PyBBIO的版本或git修订版,那么它会很棒,从那以后发生了什么变化。另外,我不太清楚我是否理解PyBBIO的问题,正如你所说的:“...... PyBBIO库有一个问题导致了这个问题”。基本上我只是想弄清楚PyBBIO对我来说是否有用,但是你已经提出了所有这些对我来说毫无意义的整数。 – errordeveloper

+0

不错,虽然,所以我仍然upvote你:) – errordeveloper

0

您的AIN0和AGND之间的下拉电阻不应超过1K欧姆。 ADC输入电流非常有限(2 uA)。为确保分压器电路不影响ADC输入电路,应通过分压器电阻提供足够的电流,从而降低其值。建议最多1K欧姆。