2012-05-16 4 views
3

Я новичок в Beaglebone и двигался с довольно хорошим щелчком, пока эта странная проблема не выскочила. Я провел все выходные, пытаясь понять это, прежде чем отправлять здесь.Чтение аналогового входа в BeagleBone, предотвращение ошибки «segmentation fault»

Я пытаюсь прочитать аналоговый вход с использованием нескольких датчиков от beaglebone с Angstrom 3.2.5+, и у меня есть проблема, которая, я думаю, может быть проблемой аппаратного обеспечения.

Используя этот Python script и Alexander 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 с a)

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

Любые идеи? Я действительно застрял. Заранее спасибо.

PS: Подробнее ...

Моя схема состоит из 10k резистор и фоторезистора. Мои контактные соединения:

  • Заголовок Р9 Вывод 32 (VDD_ADC (1.8V)) к одному концу фотоэлемента
  • Заголовок Р9 Контакт 34 (GNDA_ADC) к другому концу резистора
  • Заголовок Р9 Pin 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 

UPDATE 1

Я отредактировал файл analog_test_simple.py показать все порты ADC на BeagleBone. Это результат оболочки с подключенными датчиками 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 
... 
+0

Вы получите лучшие ответы от [electronics.SE] (http://electronics.stackexchange.com/) –

+1

Есть ли необходимая функция для инициализации/настройки АЦП - рассказать, сколько каналов использовать и какие диапазоны? Вы также можете попробовать короткий (0,1 с?) Спать между чтениями, чтобы дать ADC время swithc на новый вход и установить –

ответ

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

И только, чтобы подтвердить, что датчики читают, не затрагивая другие булавки, вот TMP36 на 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 
... 

Это приводит меня к выводу, что существует проблема с библиотекой PyBBIO что вызывает это. Это также вызывает вторую проблему, хотя я понятия не имею, как ...

ПРОБЛЕМА 2: Сегментация ошибка ошибка

У меня проблема была с ошибкой Segmentation fault из-за чего-то в библиотеке PyBBIO. Например, если перезапустить BeagleBoard и запустить:

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

Я получаю значения, которые соответствуют выше выход из сценария Python с использованием os модуля.

Но если я бегу любой сценарий PyBBIO который обращается AIN булавки (примеры которых выше), а затем запустить cat снова я получаю ошибку:

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

Если перезапустить платы (отключить и plug- в силе), я могу использовать 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

Это было бы здорово, если бы у вас была ссылка на версию или git-версию PyBBIO, чтобы другие могли смотреть- что изменилось с тех пор. Кроме того, я не слишком уверен, что понимаю, что именно проблема с PyBBIO, как вы сказали: «... есть проблема с библиотекой PyBBIO, которая вызывает это». В принципе, я просто пытаюсь выяснить, полезен ли PyBBIO для меня, но вы представили все эти целые числа, которые не имеют для меня никакого смысла прямо сейчас. – errordeveloper

+0

Отличный пост, хотя, следовательно, я все еще поддерживаю вас :) – errordeveloper

0

Ваш выпадающий резистор между AIN0 и AGND не должен превышать 1K Ом. Входной ток АЦП очень ограничен (2 мкА). Чтобы убедиться, что ваша цепь делителя напряжения не влияет на входную цепь АЦП, вы должны обеспечить достаточный ток через резистор делителя напряжения, поэтому снижая его значение. Рекомендуется не более 1 кОм.