質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

3回答

3111閲覧

AX-12Aシリアル通信(受信)について

pythonlove

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2018/12/09 05:55

問題

AX-12AをRaspberryPi 3 ModelBから制御したいと思っています。
http://www.oppedijk.com/robotics/control-dynamixel-with-raspberrypi を参考に、74LS241とつないでモータを動かすことはできたのですが、モータ側から返ってくる受信データを読み込むことができません。(タイムアウト)

該当のソースコード

python3

1import serial 2import MyMotor 3import RPi.GPIO as GPIO 4import sys 5 6GPIO.setmode(GPIO.BCM) 7GPIO.setup(18,GPIO.OUT) 8GPIO.output(18,GPIO.HIGH) 9 10port=serial.Serial("/dev/ttyS0",baudrate=1000000,timeout=3) 11 12serial = MyMotor.GetTemperature(4) 13if not serial: 14 print('serial Error') 15 GPIO.cleanup() 16 sys.exit() 17print('serial:' + serial) 18port.write(bytearray.fromhex(serial)) 19read = port.read() 20if not read: 21 print('Not Read') 22else: 23 print('len:' + format(len(read),'d')) 24 for r in read: 25 print(format(r,'x').zfill(2),end=' ') 26 print() 27 28GPIO.cleanup()

exe

1pi@raspberrypi:~/ax12a $ python3 read_test1.py 2serial:ff ff 04 04 02 2b 01 c9 3Not Read 4pi@raspberrypi:~/ax12a $

試したこと

ROBOTIS e-MANUAL(http://support.robotis.com/jp/)によるとHalfDuplexのため通信方向を制御するDirectionPortが必要らしいですが、制御方法のサンプルがなく、よく分かりませんでした。ご教授のほどよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

debian9.4
python3.5.3
pyserial3.2.1
パケット通信参考:http://www.besttechnology.co.jp/modules/knowledge/?BTX030B%20Dynamixel%20AX-12A

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

通信方向の切り替えの信号がポイントですね
コードを見る限り、方向制御は行われていないように思われます。
そりゃ受信方向に切り替えないと受信はできませんぜ

ラズパイのシリアルデバイスの詳細は調べてませんが、
こういう方向制御は、送信終了の割り込みを実装して、送信開始前に送信方向に、送信終了割り込みで受信方向に切り替えるようにします
ラズパイのCPUのデータシートをよく読んでみましょう

投稿2018/12/09 13:05

編集2018/12/09 13:12
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

自己解決方法

ozwkさん、y_waiwaiさんご回答いただきありがとうございました。

74LS241の仕様書を読み直すと、GPIO18はCH1、CH2のenableとして使用されていてCH1とCH2の排他制御となっているようです。
つまり、GPIO18がHIGHの場合送信状態、GPIO18がLOWの場合受信状態とすることが可能です。(ozwkさんの追記分で正解のようです。)
さらに、https://github.com/thiagohersan/memememe/blob/master/Python/ax12/ax12.pyを参考にTXの遅延時間、RPIのスイッチの遅延時間を設定するとうまく受信することができました。
同様の問題でお困りの方は参考までに。

python3

1import serial 2import MyMotor 3import RPi.GPIO as GPIO 4import sys 5import time 6 7TX_DELAY_TIME = 0.00001 8RPI_SWITCH_DELAY_TIME = 0.0001 9 10GPIO.setmode(GPIO.BCM) 11GPIO.setup(18,GPIO.OUT) 12GPIO.output(18,GPIO.HIGH) 13 14port=serial.Serial("/dev/ttyS0",baudrate=1000000,timeout=3) 15 16serial = MyMotor.GetTemperature(4) 17if not serial: 18 print('serial Error') 19 GPIO.cleanup() 20 sys.exit() 21print('serial:' + serial) 22port.write(bytearray.fromhex(serial)) 23time.sleep(TX_DELAY_TIME) 24 25GPIO.output(18,GPIO.LOW) 26time.sleep(RPI_SWITCH_DELAY_TIME) 27 28read = port.read(10) 29print('read:' + read.hex()) 30 31GPIO.cleanup() 32

exe

1pi@raspberrypi:~/ax12a $ python3 read_test3.py 2serial:ff ff 04 04 02 2b 01 c9 3read:ffff04030018e0 4pi@raspberrypi:~/ax12a $

投稿2018/12/17 01:28

編集2018/12/17 01:30
pythonlove

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/12/17 01:37

まあ、遅延時間を適当に設定してやることでうまくいくんでしょうけど、あくまでそれはたまたまうまくいっている、という程度のもんだと思っておきましょう ボーレートや送信メッセージ長、ラズパイやセンサの処理状況によってはどうなるかわからないってことですねー
guest

0

readできるまでread繰り返すようにしてください


gpio18で方向コントロールしてるんですね

投稿2018/12/09 13:01

編集2018/12/09 13:16
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問