2012-05-16 57 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歐姆。