6

Angstrom (3.8 カーネル) を実行する Beaglebone Black を使用して、9600-N-8-1 の半二重 RS-485 ネットワーク上のデバイスと通信しようとしています。

これに似た RS-485 ブレークアウト ボードを使用しようとしています: https://www.sparkfun.com/products/10124、チップが MAX3485 http://www.maximintegrated.com/datasheet/indexであることを除いて.mvp/id/1079 . ピンと端子台があらかじめ組み立てられたボードを購入しました。私の友人がオシロスコープでテストしたところ、RS-485 ボードは動作することがわかりました。ボードには、BBB に接続する 5 つのピンがあります。3-5V (電源)、RX-I、TX-O、RTS、および GND。

UART4_RTSnおよびUART4_CTSnピンが使用できるように、BBB での HDMI サポートを無効にしました。

    mkdir /mnt/boot
    mount /dev/mmcblk0p1 /mnt/boot
    nano /mnt/boot/uEnv.txt
    #change contents of uEnv.txt to the following:
    optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN 

次に、RTS/CTS 制御で UART-4 を有効にするオーバーレイを見つけました。

            /*
     * Modified version of /lib/firmware/BB-UART4-00A0.dtbo to add RTS so we can reset Arduinos
     */
    /dts-v1/;
    /plugin/;

    / {
      compatible = "ti,beaglebone", "ti,beaglebone-black";
      part-number = "BB-UART4-RTS";
      version = "00A0";
      exclusive-use = "P9.13", "P9.11", "P9.15", "P8.33", "P8.35", "uart4";

      fragment@0 {
        target = <0xdeadbeef>;

        __overlay__ {


          pinmux_bb_uart4_pins {
            pinctrl-single,pins = <
              0x070 0x26   /* P9_11 = UART4_RXD = GPIO0_30,    MODE6 */
              0x074 0x06   /* P9_13 = UART4_TXD = GPIO0_31,    MODE6 */
              /* need to enable both RTS and CTS, if we only turn on RTS then driver gets confused */
              0x0D0 0x26   /* P8_35 = UART4_CTSN = lcd_data12, MODE6 */
              0x0D4 0x06   /* P8_33 = UART4_RTSN = lcd_data13, MODE6 */
              /* 0x040 0x0F   /* P9_15 = GPIO1_16 = GPIO48,       MODE7  failed attempt to put DTR on gpio */
            >;
            linux,phandle = <0x1>;
            phandle = <0x1>;
          };
        };
      };

      fragment@1 {
        target = <0xdeadbeef>;

        __overlay__ {
          status = "okay";
          pinctrl-names = "default";
          pinctrl-0 = <0x1>;
        };
      };

      __symbols__ {
        bb_uart4_pins = "/fragment@0/__overlay__/pinmux_bb_uart4_pins";
      };

      __fixups__ {
        am33xx_pinmux = "/fragment@0:target:0";
        uart5 = "/fragment@1:target:0"; /* Not a mistake: UART4 is named uart5 */
      };

      __local_fixups__ {
        fixup = "/fragment@1/__overlay__:pinctrl-0:0";
      };
    };

オーバーレイをコンパイルして有効にしました:

    cd /lib/firmware
    dtc -O dtb -o BB-UART4-RTS-00A0.dtbo -b 0 -@ BB-UART4-RTS-00A0.dts 
    echo BB-UART4-RTS:00A0  > /sys/devices/bone_capemgr.*/slots

このように485ボードをBBに接続しました

    3-5V to P9_05 (VDD_5V)
    RX-I to P9_13 (UART4_TXD) 
    TX-O to P9_11 (UART4_RXD)
    RTS  to P8_33 (UART4_RTSn)
    GND  to P9_01 (DGND)

Pythonでは、次のようにシリアルポートを使用しようとしています:

    import serial
    ser = serial.Serial('/dev/ttyO4', baudrate=9600, rtscts=True)
    ser.write(list_of_byte_dat)

USB から RS-485 へのコンバーターを使用して通信/dev/ttyUSB0を設定rtscts=Falseすると、双方向で問題なく動作するため、プログラムが動作することはわかっています。しかし、RS-485 ボードを使用して通信を正しく行うことができません。

RS-485 ボードには 2 つの問題があり、どちらも RTS に対応しています。

  1. ボード上の RTS は、私が期待する方法とは逆に動作します。rs485 ボードの RTS ピンに電圧をかけると、ボード上の RTS LED がオフになり、ボードが送信されなくなります。RTS ピンから電圧を取り除くと、RTS LED がオンになり、ボードが送信されます。BBB の UART_RTSn ピンの極性を反転するにはどうすればよいですか?

    Temporary solution: I've made a small bone script program that uses UART4_RTSn pin as input. It turns on a different GPIO when the UART4_RTSn pin is off and turns off that same GPIO pin when the UART4_RTSn pin is on. Then hooked up the RTS pin on the rs485 board to the GPIO pin instead of the UART4_RTSn pin.

    /dev/ttyO4これは不十分な解決策のようですが、コマンド ラインから にエコーするときに、RS485 ボードの RTS が正しいタイミングでオンになります。

    UART4_RTSnハードウェア構成を調整するか、pyserial の構成を変更して、ピンの極性を変更するにはどうすればよいですか?

    これにより、2番目の問題が発生します

  2. 問題1で述べたようにUART4_RTSn、次のように値をttyポートにエコーすると、ピンは自動的に(ただし逆方向に)機能します。

    echo -en '\x02\xFD\xCD......' > /dev/ttyO4
    

    これによりUART4_RTSn、データの送信中に LED が点滅します。上記のボーンスクリプトを使用せずにセットアップすると、通常どおりオンになり、送信中に点滅します。私のbonescriptハックを使用すると、通常はオフになり、送信中に点滅します(これが私が望んでいることです)。ただし、これはコマンド ラインから echo を使用する場合にのみ機能します。Python を使用してシリアル ポートをセットアップすると、UART4_RTSnピンが非アクティブになります。送信中は点滅しません。Pythonでステートメントを作成するとすぐに:

    ser = serial.Serial('/dev/ttyO4', baudrate=9600, rtscts=True)
    

    UART4_RTSnピンはシャットオフし、オフのままです。を使用して情報を送信する場合は点滅しませんser.write(stuff)。その結果、rs485 ボードは送信に対応していません。UART4_RTSnピンをpyserialで自動的に動作させるにはどうすればよいですか? 設定rtscts=Falseしてみましたがダメでした。

    ピン値を使用ser.setRTS(True)またはser.setRTS(False)手動で切り替えることができるので、正しいピンを使用していて、それが認識されていることがわかります。しかし、UART4_RTSn ピンを直接切り替えたくありません。シリアルポートがデータを送信しているときに自動的に動作するようにしたいのですが、Pythonではそうではありません。

どんな助けでも大歓迎です。

4

3 に答える 3

0
  1. pnp トランジスタ/ p チャネル MOSFET/ 論理ゲートを使用できます - 7404 のようなインバーターは使用できません

  2. 書き込み操作の後に書き込みバッファをフラッシュする必要があるかもしれません ser.write(....) ser.flush()

于 2014-01-16T22:42:21.930 に答える