RaspberryPi
PCA9685

Raspberry Piに接続したサーボをリモート(クライアントサーバモデル)で制御する

はじめに

ラズパイに接続したサーボをネットワーク経由でコントロールする実験をします。
System.png

クライアントサーバモデルを使用し、ラズパイをサーバ、PCをクライアントとします。PC側からラズパイに接続し、x,y=10,15というようなテキストコマンドを送信すると、サーバが角度として認識し、サーボをコントロールするようにします。
ラズパイでサーボをコントロールする方法はこちらに記述しています。
Raspberry Pi OpenCVで顔検出しサーボでトラッキング

この実験はPCでOpenCVを処理し、その結果でサーボを制御するための予備実験です。

プログラム

サーバ側

受信したテキスト文(xx,yyのフォーマット)を変数x,yに入力し、サーボコントロール用pmw信号として出力します。"q"を受信するとコネクションを開放し、次の接続を待ちます。

server.py
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"で終了します。

client.py
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でプログラムを実行する必要があります。
bash:server
pi@raspberrypi:~ $ sudo python server.py

クライアント側

普通に起動します(sudoは不要です)。引数にラズパイのIPアドレスを指定します。
bash:client
ikeda@PC:~ $ python server.py 192.168,1,116

run.png

操作

クライアント側にてx,y>と聞いてきます。
bash:client
ikeda@PC:~ $ x,y>

xに水平角度、yに垂直角度を指令します。x=180度y=90度とするには180,90と入力、エンターで送信します。
bash:client
ikeda@PC:~ $ x,y>180,90[ENTER}

サーバ側では受信したコマンドを表示し、サーボをコントロールします。

動作

動作中の写真
DSD_2009.png

DSD_2010.png

映像

Youtubeにアップしましたので、興味のあるかたはどうぞ。

Special thanks!

ソケット通信について、@msrksさまの記事を参考にさせていただきました。
PythonでSocket通信
ありがとうございました。

2018/02/03 Ikeda