读取BeagleBone上的模拟输入,避免“分段错误”错误

时间:2012-05-16 02:34:50

标签: python beagleboard angstrom-linux

我是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端口。这是shell插入 no 传感器的结果。

-----
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
...

2 个答案:

答案 0 :(得分:5)

好的,答案是有两个不同的问题,这两个问题都是由使用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上的TMP36

# 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
...

这使我得出结论,PyBBIO库存在导致此问题的问题。这也引起了第二个问题,虽然我不知道如何......

问题2:分段错误错误

我遇到Segmentation fault错误的问题是由PyBBIO库中的某些内容引起的。例如,如果我重新启动BeagleBoard并运行:

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

我使用os模块获取与Python脚本的上述输出匹配的值。

但是,如果我运行任何访问AIN引脚的PyBBIO脚本(其示例在上面),然后再次运行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

答案 1 :(得分:0)

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