3

我是 Beaglebone 的新手,并且一直在进行非常好的点击,直到弹出这个奇怪的问题。在发帖之前,我整个周末都在试图弄清楚。

我正在尝试使用 Angstrom 3.2.5+ 的 beaglebone 中的多个传感器读取模拟输入,但我遇到了一个我认为可能是硬件问题的问题。

使用这个Python 脚本Alexander Hiam 的 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 的光敏电阻的相同值

而且,可能相关,我无法使用 cat 读取任何 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) 连接到光电管的另一侧以及下拉电阻的一端

这是与我自己的电路匹配的图像: 在此处输入图像描述

所有 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
...
4

2 回答 2

5

好的,答案是有两个独立的问题,都是使用 PyBBIO 库引起的。继续阅读...

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

对我的问题的评论中的一个建议促使我在我原来的基于 PyBBIO 的脚本中添加延迟。这是没有传感器的情况:

# 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 的情况下使用脚本重复结果。我编写了一个新的 Python 文件,使用 Python模块测试和打印 BeagleBone 上每个模拟输入引脚的读数os。该文件用于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
...

光敏电阻和 TMP36 传感器

以下是我将光敏电阻数据线插回 AIN0 并将TMP36 温度传感器插入 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 的 mrBBIO 库,使用这个文件

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
于 2012-05-17T15:33:20.057 回答
0

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

于 2014-09-15T10:29:16.910 回答