6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-03

#はじめに
ラズパイに接続したサーボをネットワーク経由でコントロールする実験をします。
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でプログラムを実行する必要があります。

server
pi@raspberrypi:~ $ sudo python server.py

##クライアント側
普通に起動します(sudoは不要です)。引数にラズパイのIPアドレスを指定します。

client
ikeda@PC:~ $ python server.py 192.168,1,116

run.png

##操作
クライアント側にてx,y>と聞いてきます。

client
ikeda@PC:~ $ x,y>

xに水平角度、yに垂直角度を指令します。x=180度y=90度とするには180,90と入力、エンターで送信します。

client
ikeda@PC:~ $ x,y>180,90[ENTER}

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

##動作
動作中の写真
DSD_2009.png

DSD_2010.png

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

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

2018/02/03 Ikeda

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?