2017-01-29 10 views
0

Я пытаюсь прочитать последовательные данные с ультразвукового датчика расстояния. Единственный выход я получаю белый квадрат, как это:как читать данные датчиков из последовательного порта с использованием python и малины pi 2

output example

У меня есть Raspberry Pi 2, и ME007-ULS v1 ультразвуковой датчик от Ebay, я получил от этого руководства:

Когда триггерный штырь «2.Trigger» находится в спадающем фронте, а уровень низкого уровня сохраняется в диапазоне от 0,1 до 10 мс, что приведет к срабатыванию контроллера один раз, а затем вывести выходной вывод «3.TX/PWM» кадр 3.3V Последовательные данные уровня TTL

и выходной формат кадра датчика:

output frame

Это код, который я написал:

import RPi.GPIO as GPIO 
import time 
from serial import Serial 

#GPIO mode 
GPIO.setmode(GPIO.BCM) 
#assign GPIO pins 
GPIO_TRIGGER = 18 
#direction of GPIO-Pins (IN/OUT) 
GPIO.setup(GPIO_TRIGGER, GPIO.OUT) 

def uss_funct(): 
    ser = Serial('/dev/ttyAMA0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=3) 

    # set trigger HIGH, sensor is waiting for falling edge 
    GPIO.output(GPIO_TRIGGER, True) 
    # set trigger LOW after 10ms -> Falling Edge 
    time.sleep(0.01000) 
    GPIO.output(GPIO_TRIGGER, False)  
    # set trigger back HIGH after 2ms, as LOW is supposed to be between 0.1-10ms 
    time.sleep(0.00200) 
    GPIO.output(GPIO_TRIGGER, True) 

    #read from rx 
    test_output = ser.read() 
    ser.close() 

    #clean up GPIO pins 
    GPIO.cleanup() 

    print (test_output) 

if __name__ == '__main__': 
    uss_funct() 

Я думаю, что я получил право проводов, но только в корпус - это то, как я подключил датчик:

Ультразвуковой датчик имеет 5 контактов:

  1. 3.3-12V вход (подключен к выходу 3.3V)
  2. триггера (подключен к GPIO 18)
  3. TX Выход (подключен к GPIO 10)
  4. Цифровой выход (не подключен)
  5. GND (подключен к GND)

ответ

0

По умолчанию Serial.read() считывает только один байт. Вы должны прочитать 6:

# read from rx 
test_output = ser.read(size=6) 

Тогда, чтобы увидеть, что у вас есть попробовать:

print(repr(test_output)) 
+0

эй @stephen, спасибо за вашу помощь. Я знал, что Serial.read() читает только один байт. Для начала я просто хотел правильно прочитать одно, а затем попытаться получить все байты. Моя фактическая проблема заключалась в том, что я смог получить только этот пустой белый ящик, окруженный синей рамкой (см. Рисунок выше). 'test_output = ser.read (size = 6)' ничего не возвращал. Я думаю, что я нашел решение, сначала создав пустой список (посмотрим на мой ответ), однако он по-прежнему кажется не 100% прав. – tintin13

+0

@ tintin13, просто отредактировал мой ответ, чтобы показать, что у вас на самом деле есть. –

0

Я был в состоянии решить мою проблему и избавиться от белого квадрата путем создания пустого списка, а затем добавить любой выход ser.read() дает:

data_output = [] 

def uss_function(): 

(...) 

#read from rx 
data_output.append(ser.read(6)) 
ser.close() 

Это дает мне выход так: ['\x00\xff\x01V\x00\xcc'] это все-таки не совсем то, что я зирр osed, чтобы получить как чтение, но он приближается. Я предполагаю, что он имеет какое-то отношение к ошибочным показаниям последовательного порта, и я обновлю этот ответ, как только все придумаю. Я предполагаю, что это тема нового вопроса.

+0

Добавление его в список ничего не изменило, кроме способа, которым python показывает вам данные. См. Это сообщение: http://stackoverflow.com/questions/41763295/printing-list-elements-and-strings-in-python-have-different-results/41769712#41769712 –