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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Raspberry Pi

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

Socket通信をPCとラズパイ間にLANケーブルを接続してやりたい

nyahaha
nyahaha

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Raspberry Pi

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

3回答

0評価

0クリップ

782閲覧

投稿2021/12/09 16:04

前提・実現したいこと

Windows10(以降PC)で DUALSHOCK 4 の入力をpygameを使って読み取り、socket通信にてLANケーブルを介して Raspberry Pi 4 Model B(以降ラズパイ) へ DUALSHOCK 4 のデータを送信、そのデータをもとにGPIOへ出力するというのが今回したいことです。

発生している問題

socket通信のUDPにてつい数日前まで通信できていたのですが、これまで作業していた部屋とは違う場所へ行ったところ、ラズパイ側で受信が出来ずに「recv()」関数でプログラムが止まってしまいます。
「recv()」関数でプログラムが止まっていたことはどうやって確認したかと言うと、「print("1")」を「recv()」の直前に書いた場合には表示出来ており、「recv()」の直後に書いた場合では表示されなかったため、「recv()」関数でプログラムが止まっていたと判断しました。
これまでの作業部屋には無線ルーターがあり、無線ネットワークがギリギリ届かない程度離れたら「recv()」関数でプログラムが止まってしまったので、LANケーブルではなく無線ルーターを介してこれまでsocket通信をしていたのではないかと現状では疑っております。
ラズパイ側が受信できない状態でプログラムが止まっているだけなので、エラーメッセージ等はありません。

PC側(socket通信的にクライアント)のソースコード

python3

import pygame from pygame.locals import * import socket import time host = "192.168.10.21" port = 55555 sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) def Constrain( val, min_val, max_val ): if val > max_val: return max_val elif val < min_val: return min_val else: return val def Map( val, in_min, in_max, out_min, out_max ): temp = ( val - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min return ( Constrain( temp, out_min, out_max ) ) def main(): # [LX, LY, RX, RY, L2, R2] stick = [ 0, 0, 0, 0, 0, 0 ] # スティックは(-255 ~ 255), L2とR2は(0 ~ 255) button = 0 # 2進数化してボタン情報を1つの変数にまとめる pygame.joystick.init() try: j = pygame.joystick.Joystick( 0 ) j.init() print( "ジョイスティックの名前:", j.get_name(), end=" " ) print( "ボタンの数:", j.get_numbuttons(), end=" " ) print( "スティックの数:", j.get_numaxes() ) except pygame.error: print( "ジョイスティックが接続されていません" ) pygame.init() while True: for e in pygame.event.get(): if e.type == QUIT: return if( e.type == KEYDOWN and e.key == K_ESCAPE ): return stick[0] = int( Map( j.get_axis(0), -1.0, 1.0, 0, 127 ) ) stick[1] = int( Map( j.get_axis(1), 1.0, -1.0, 0, 127 ) ) stick[2] = int( Map( j.get_axis(2), -1.0, 1.0, 0, 127 ) ) button = 0 button |= j.get_button(0) for i in range(1, 4): button <<= 1 button |= j.get_button(i) for i in range(9, 15): button <<= 1 button |= j.get_button(i) print( button, end=" " ) print( stick[0], end=" " ) print( stick[1], end=" " ) print( stick[2], end=" " ) message = "%d,%d,%d,%d" % ( button, stick[0], stick[1], stick[2] ) sock.sendto( message.encode( 'utf-8' ), ( host, port ) ) time.sleep(0.05) if __name__ == '__main__': main()

ラズパイ側(socket通信的にサーバー)のソースコード

python3

# -*- coding: utf-8 -*- import socket import time host = "192.168.10.21" port = 55555 sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) sock.bind( ( host, port ) ) import pigpio FREQ = 10000 dout_pin = [ 24, 25, 8, 7, 13, 5, 6, 11, 9, 10 ] dire_pin = [ 4, 17, 14, 15 ] pwm_pin = [ 27, 22, 2, 3 ] pi = pigpio.pi() for i in range(0, 10): pi.set_mode( dout_pin[i], pigpio.OUTPUT ) for i in range(0, 4): pi.set_mode( dire_pin[i], pigpio.OUTPUT ) pi.set_mode( pwm_pin[i], pigpio.OUTPUT ) pi.set_PWM_frequency( pwm_pin[i], FREQ ) class Static: data = False return_val = False def Constrain( val, min_val, max_val ): if val > max_val: return max_val elif val < min_val: return min_val else: return val def Map( val, in_min, in_max, out_min, out_max ): temp = ( val - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min return ( Constrain( temp, out_min, out_max ) ) def PushButton(button): if( button == 0 and Static.data == False ): Static.data = False Static.return_val = False elif( button != 0 and Static.data == False ): Static.data = True Static.return_val = True elif( button != 0 and Static.data == True ): Static.data = True Static.return_val = False elif( button == 0 or Static.data == True ): Static.data = False Static.return_val = False return Static.return_val while True: try: rcv = sock.recv( 31 )          # ここでプログラムが止まる! rcvmsg = rcv.decode( 'utf-8' ) ps4_data = rcvmsg.split( "," ) # ボタンのデータに再変換 cross = ( int(ps4_data[0]) >> 9 ) & 1 circle = ( int(ps4_data[0]) >> 8 ) & 1 square = ( int(ps4_data[0]) >> 7 ) & 1 triangle = ( int(ps4_data[0]) >> 6 ) & 1 L1 = ( int(ps4_data[0]) >> 5 ) & 1 R1 = ( int(ps4_data[0]) >> 4 ) & 1 up = ( int(ps4_data[0]) >> 3 ) & 1 down = ( int(ps4_data[0]) >> 2 ) & 1 left = ( int(ps4_data[0]) >> 1 ) & 1 right = int(ps4_data[0]) & 1 delta_dire = False if ( up > 0 or right > 0 ): delta_dire = True else: delta_dire = False _right = False _left = False if ( right > 0 ): _right = True if ( left > 0 ): _left = True _up = False _down = False if ( up > 0 ): _up = True if ( down > 0 ): _down = True pi.write( dout_pin[0], triangle ) pi.write( dout_pin[1], cross ) pi.write( dout_pin[2], R1 ) pi.write( dout_pin[3], _up ) pi.write( dout_pin[4], _down ) pi.write( dout_pin[5], circle ) pi.write( dout_pin[6], square ) pi.write( dout_pin[7], _right ) pi.write( dout_pin[8], _left ) pi.write( dout_pin[9], delta_dire ) jacobian = [ [ 1, -1, 1 ], [ 1, 1, 1 ], [ -1, 1, 1 ], [ -1, -1, 1 ] ] robot_vel = [ 0, 0, 0 ] for i in range( 0, 3 ): robot_vel[i] = int( Map( int(ps4_data[i+1]), 0, 127, -255, 255 ) ) dead_zone = 0.15 for i in range( 0, 3 ): if abs( robot_vel[i] ) < 255 * dead_zone: robot_vel[i] = 0 wheel_vel = [ 0, 0, 0, 0 ] for i in range( 0, 4 ): wheel_vel[i] += jacobian[i][0] * robot_vel[0] wheel_vel[i] += jacobian[i][1] * robot_vel[1] wheel_vel[i] += jacobian[i][2] * robot_vel[2] max_vel = 0 for i in range( 0, 4 ): if ( abs( wheel_vel[i] ) > max_vel ): max_vel = abs( wheel_vel[i] ) if max_vel > 255: for i in range( 0, 4 ): wheel_vel[i] *= 255 / max_vel Constrain( wheel_vel[i], -255, 255 ) dead_zone = 0.05 for i in range( 0, 4 ): if abs( wheel_vel[i] ) < 255 * dead_zone: wheel_vel[i] = 0 for i in range( 0, 4 ): if wheel_vel[i] > 255 * 0.01: pi.write( dire_pin[i], 0 ) pi.set_PWM_dutycycle( pwm_pin[i], abs( wheel_vel[i] * 0.5 ) ) elif wheel_vel[i] < -255 * 0.01: pi.write( dire_pin[i], 1 ) pi.set_PWM_dutycycle( pwm_pin[i], abs( wheel_vel[i] * 0.5 ) ) else: pi.write( dire_pin[i], 0 ) pi.set_PWM_dutycycle( pwm_pin[i], 0 ) print( left, end=" " ) print( down, end=" " ) print( up, end=" " ) print( right, end=" " ) print( L1, end=" " ) print( R1, end=" " ) print( square, end=" " ) print( cross, end=" " ) print( triangle, end=" " ) print( circle, end=" " ) print() time.sleep(0.01) # Delay 1 ms except KeyboardInterrupt: sock.close() for i in range(0, 14): pi.set_mode( dout_pin[i], pigpio.INPUT ) for i in range(0, 4): pi.set_mode( pwm_pin[i], pigpio.INPUT ) pi.stop() break

「sock.recv( 31 )」でプログラムが止まっていると目星はつけていますが、そこ以外にもsocket通信に悪影響が出ている箇所がある可能性も否定できないので、長いかもしれませんが使用しているソースコードを全て提示させていただきました。

試したこと

ラズパイの「Wireless & Wired NetWork Setting」とPCの「インターネット プロトコル バージョン 4(TCP/IPv4)のプロパティ」にて、イーサネットのIPアドレス(192.168.10.21)を固定しましたが、上手くいきませんでした。偶発的な問題ではないことを確認するため、数回作業場所と作業場所外を往復し、両ソースコードを実行してみましたが、再現性高く作業場所ではsocket通信でき、作業場所外では全くsocket通信できませんでした。作業場所のルーターを介して出来ていたのだと考えると、他の無線ネットワークを介してやれば(根本的な解決にはならないが)通信できるのでは? と思って、私物のポケットWi-FiをPCへ接続し、コマンドプロンプトの「ipconfig」でIPアドレスを取得し、ラズパイの「Wireless & Wired NetWork Setting」とPCの「インターネット プロトコル バージョン 4(TCP/IPv4)のプロパティ」にてIPアドレス固定したのち、両ソースコードを実行しましたが、変わらず「recv()」関数でプログラムが止まってしまいます。

補足情報

LANケーブルはもちろんクロスではなくストレートを使用しています。
普段の作業場所にて通信をし、正常にsocket通信できる際は、ラズパイ側で「ifconfig」をするとIPアドレスは「192.168.10.21」、PC側で「ipconfig」をすると「169.254.36.224」と表示されます。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Raspberry Pi

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。