代码之家  ›  专栏  ›  技术社区  ›  bet997

通过Raspberry Pi 3B上的串行端口访问传感器

  •  1
  • bet997  · 技术社区  · 6 年前

    我有以下问题,在经历了长时间的沮丧之后,我无法让它正常工作,谁能帮我解决这个问题?

    我有几个 SRF02 Ranging sensors 我想通过I2C在我的覆盆子Pi 3B Jessie上使用它。

    我按照教程将第一个传感器改为地址0xF2(从Raspberry看到0x79),一切都很顺利。但问题是,地址0x78到0x7B是为10位I2C地址预留的,所以我必须使用另一个地址。 但由于我无法再通过I2C访问它,因为我更改了地址,所以我决定通过串行端口访问它。

    我试着按照 tutorial 但它不起作用。下面是代码以及我在研究后为完成它所做的工作:

    • 我检查了传感器的地址。通电时,它会发出一个长闪烁和9个短闪烁,因此在串行模式下,其地址应为0x09。

    • 我更新了我的覆盆子。

    • 我将传感器RX引脚连接到Rasp TX和viceversa+传感器的5V电压到锉刀的+3V电压(这是问题吗?)。传感器接地和模式引脚接地。

    • 在raspi配置中,我将串行控制台更改为禁用,将串行硬件端口更改为启用。

    这是我的/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代码(通过发送range命令,传感器应该闪烁一次,但没有,我也没有得到任何结果):

    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
    

    有人有主意了吗?如果有任何提示,我都会非常感激。

    1 回复  |  直到 6 年前
        1
  •  0
  •   bet997    6 年前

    好了,伙计们,我解决了!我在这里找到了解决方案: https://www.raspberrypi.org/forums/viewtopic.php?t=63419

    连接如下:

    Pi 5V至设备5V 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”>/开发/ttyAMA0

    要将设备从地址5更改回地址0,请使用

    echo-ne“\x05\xA0\x05\xAA\x05\xA5\x05\x00”>/开发/ttyAMA0

    所有详细信息都在您链接的文档中。