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 に対応しています。
ボード上の 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番目の問題が発生します
問題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ではそうではありません。
どんな助けでも大歓迎です。