#はじめに
ラズパイに接続したサーボをネットワーク経由でコントロールする実験をします。
クライアントサーバモデルを使用し、ラズパイをサーバ、PCをクライアントとします。PC側からラズパイに接続し、x,y=10,15というようなテキストコマンドを送信すると、サーバが角度として認識し、サーボをコントロールするようにします。
ラズパイでサーボをコントロールする方法はこちらに記述しています。
Raspberry Pi OpenCVで顔検出しサーボでトラッキング
この実験はPCでOpenCVを処理し、その結果でサーボを制御するための予備実験です。
#プログラム
##サーバ側
受信したテキスト文(xx,yyのフォーマット)を変数x,yに入力し、サーボコントロール用pmw信号として出力します。"q"を受信するとコネクションを開放し、次の接続を待ちます。
import Adafruit_PCA9685
import socket
from time import sleep
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)
s = socket.socket()
port = 5000
s.bind(('', port))
while True:
print('listening')
s.listen(5)
c, addr = s.accept()
print('receiving')
while True:
try:
data = c.recv(1024)
if data == "q":
break;
print(data)
x,y = map(int, data.split(","))
pwm.set_pwm(0,0, 400+x)
pwm.set_pwm(1,0, 400+y)
except:
break
sleep(1)
c.close()
s.close()
##クライアント側
xx,yyのフォーマットにてキーボードを入力、エンターで送信します。また、"q"で終了します。
import socket
from contextlib import closing
import sys
s = socket.socket()
host = sys.argv[1]
port = 5000
s.connect((host, port))
while True:
print "connected"
data = raw_input("x,y>")
s.send(data)
if data == "q":
s.close()
break
#動作
ラズパイはPCからSSHで接続して実行しています。PC側はBash on Ubuntu on Windowsです。
##サーバの起動
サーバ側はGPIOにアクセスする必要があるため、sudoでプログラムを実行する必要があります。
pi@raspberrypi:~ $ sudo python server.py
##クライアント側
普通に起動します(sudoは不要です)。引数にラズパイのIPアドレスを指定します。
ikeda@PC:~ $ python server.py 192.168,1,116
##操作
クライアント側にてx,y>と聞いてきます。
ikeda@PC:~ $ x,y>
xに水平角度、yに垂直角度を指令します。x=180度y=90度とするには180,90と入力、エンターで送信します。
ikeda@PC:~ $ x,y>180,90[ENTER}
サーバ側では受信したコマンドを表示し、サーボをコントロールします。
##映像
Youtubeにアップしましたので、興味のあるかたはどうぞ。
#Special thanks!
ソケット通信について、@msrksさまの記事を参考にさせていただきました。
PythonでSocket通信
ありがとうございました。
2018/02/03 Ikeda