Датчик доступа через последовательный порт на Raspberry Pi 3B

У меня следующая проблема, и после долгих часов разочарования я не могу заставить ее работать. Может ли кто-нибудь помочь новичку?

У меня есть несколько датчиков дальности SRF02, которые я хотел использовать через I2C на моем Raspberry Pi 3B Jessie.

Я последовал инструкциям и изменил первый датчик на адрес 0xF2 (0x79 видно из Raspberry), и все прошло отлично. Но проблема в том, что адреса от 0x78 до 0x7B зарезервированы для 10-битной адресации I2C, поэтому я должен использовать другой. Но поскольку я больше не могу получить к нему доступ через I2C, так как я изменил адрес, я решил сделать это через последовательный порт.

Я попытался изменить его, как описано в руководстве, но это не так. Работа. Вот код и то, что я сделал после исследования, чтобы его выполнить:

  • Я проверил адрес Датчика. При включении он отправляет одну длинную и 9 коротких вспышек, поэтому его адрес должен быть 0x09 в последовательном режиме.

  • Я обновил и обновил свою Raspberry.

  • Я подключил контакт RX датчика к Rasp TX и наоборот. + 5В датчика к + 3В рашпиля (это проблема?). Заземление датчиков и вывод режима на землю.

  • В raspi-config я изменил последовательную консоль на отключенную, а последовательные аппаратные порты - на включенные.

Вот мой /boot/cmdline.txt:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

Я добавил в свой /boot/config.txt следующее:

enable_uart=1
dtoverlay=pi3-disable-bt
core_freq=250

Мой код на Python (отправляя команды диапазона, датчик должен мигать один раз, но это не так, также я не получаю никакого результата):

import serial
import time

ser = serial.Serial(port='/dev/serial0', baudrate = 9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_TWO, timeout=1, write_timeout=5)

USED_ADDRESS = '0x09'
TARGET_ADDRESS = '0x03'

# GET DISTANCE IN CM

ser.write(USED_ADDRESS)
ser.write('0x51')

time.sleep(0.07)

ser.write(USED_ADDRESS)
ser.write('0x5E')

results = ser.read(2)

if(results != None and len(results) > 0):
        print 'RESULTS:'
        for result in results:
                print result
else:
        print 'NO RESULT'

#CHANGING ADDRESS

#First command

ser.write(USED_ADDRESS)
ser.write('0xA0')

#Second command

ser.write(USED_ADDRESS)
ser.write('0xAA')

#Third command

ser.write(USED_ADDRESS)
ser.write('0xA5')

#Target Address

ser.write(USED_ADDRESS)
ser.write(TARGET_ADDRESS)

print "DONE"

Результат dmesg | grep tty:

[    0.000000] Kernel command line: 8250.nr_uarts=1 bcm2708_fb.fbwidth=640 bcm2708_fb.fbheight=480 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3dc00000 vc_mem.mem_size=0x3f000000  dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
[    0.000312] console [tty1] enabled
[    0.748748] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 87, base_baud = 0) is a PL011 rev2

Результат ls -l / dev / serial *:

lrwxrwxrwx 1 root root 7 Feb 16 15:06 /dev/serial0 -> ttyAMA0
lrwxrwxrwx 1 root root 5 Feb 16 15:06 /dev/serial1 -> ttyS0

У кого-нибудь есть идея? Буду супер-пупер благодарен за любой намек.


person bet997    schedule 16.02.2018    source источник
comment
Возможно, попробуйте использовать /dev/ttyS0 и / или /dev/ttyAMA0 напрямую.   -  person stevieb    schedule 17.02.2018
comment
Да уже пробовал, тоже не работает: /   -  person bet997    schedule 17.02.2018
comment
Pleeaasee, разве никто не знает, что я мог сделать не так? Я здесь немного отчаялся ':)   -  person bet997    schedule 22.02.2018


Ответы (1)


Хорошо, ребята, я решил это! Я нашел решение здесь: https://www.raspberrypi.org/forums/viewtopic.php?t=63419

Подключения следующие:

Pi 5 В к устройству 5 В Pi земля к заземлению устройства Pi земля к режиму устройства Pi TX к устройству RX

Затем настройте последовательный канал Pi на 9600.

stty -F / dev / ttyAMA0 9600

Затем используйте echo для отправки команд на устройство.

Первый байт - это адрес устройства (0-15). Второй байт - это команда.

Чтобы изменить устройство с адреса 0 на адрес 5, используйте

echo -ne "\ x00 \ xA0 \ x00 \ xAA \ x00 \ xA5 \ x00 \ x05"> / dev / ttyAMA0

Чтобы изменить устройство с адреса 5 обратно на адрес 0, используйте

echo -ne "\ x05 \ xA0 \ x05 \ xAA \ x05 \ xA5 \ x05 \ x00"> / dev / ttyAMA0

Все подробности находятся в связанных с вами документах.

person bet997    schedule 23.02.2018