Python + Arduino でGUIからロボットアームを制御してみた

#はじめに

ロボットアームキットを組立てて動かしてみました。
GUIを作って簡単に動かせるようにしました。

#構成
・ロボットアームキット
[DiyStudio 6自由度ロボットアームDIYキット](https://www.amazon.co.jp/DIY-MORE-DiyStudio-6%E8%87%AA%E7%94%B1%E5%BA%A6%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%82%A2%E3%83%BC%E3%83%A0DIY%E3%82%AD%E3%83%83%E3%83%88%E3%82%A2%E3%83%AB%E3%83%9F%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%AB%E3%83%AB%E3%82%A2%E3%83%BC%E3%83%A0%E3%82%B8%E3%83%A7%E3%83%BCArduinor-MG995%E3%82%B5%E3%83%BC%E3%83%9C%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%83%90%E3%83%AB%E3%82%AF%EF%BC%88%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%EF%BC%89%E3%81%AF%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E8%AA%AC%E6%98%8E%E6%9B%B8%E3%82%92%E9%80%81%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99/dp/B07M7TK6KR/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=diystudio+%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%82%A2%E3%83%BC%E3%83%A0&qid=1625444002&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExU0NYQ0pDT0Q0VDMmZW5jcnlwdGVkSWQ9QTA4ODMwNjAyQ09RT0dYR0Y4WEZOJmVuY3J5cHRlZEFkSWQ9QTJLUUZQUUhUMFpJTDUmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

・PCA9685
[HiLetgo PCA9685](https://www.amazon.co.jp/HiLetgo-PCA9685-16%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB-12-%E3%83%93%E3%83%83%E3%83%88-Arduino%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B01D1D0CX2/ref=sr_1_3_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=pca9685&qid=1625445056&sr=8-3-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzQktBOUxJTzcwRU1XJmVuY3J5cHRlZElkPUEwMTY4NzA0M0pKRTZFU0pCVFJWNyZlbmNyeXB0ZWRBZElkPUE5OEpOU1dBNlNHNU4md2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

・外部電源
[SUCCUL ACアダプター 5V 4A](https://www.amazon.co.jp/AC%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-%E5%A4%A7%E6%89%8B%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BCOEM%E7%A4%BE%E8%A3%BD%E5%93%81-%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%B9-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0%E5%BC%8F-%E5%87%BA%E5%8A%9B%E3%83%97%E3%83%A9%E3%82%B0%E5%A4%96%E5%BE%845-5mm/dp/B015RKFAA2/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3ME1R9ME2Q2WW&dchild=1&keywords=succul+ac%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC+5v+4a&qid=1625444599&sprefix=succul+ac%2Caps%2C307&sr=8-2)
[Kabenjee DC電源コネクタ ジャック コネクタ](https://www.amazon.co.jp/Kabenjee-5-5mmx2-1mm-DC%E3%82%AA%E3%82%B9%E9%9B%BB%E6%BA%90%E3%83%94%E3%82%B0%E3%83%86%E3%83%BC%E3%83%AB-%E3%83%A1%E3%82%B9%E9%9B%BB%E6%BA%90%E3%83%94%E3%82%B0%E3%83%86%E3%83%BC%E3%83%AB%E3%80%8150cm%E9%95%B7DC%E9%9B%BB%E6%BA%90%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%80%8120AWG-DC%E9%9B%BB%E6%BA%90%E6%8E%A5%E7%B6%9A%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%80%81LED%E3%83%86%E3%83%BC%E3%83%97%E7%94%A8DC%E3%83%97%E3%83%A9%E3%82%B0%E3%80%81CCTV%E3%82%AB%E3%83%A1%E3%83%A9%EF%BC%8810%E5%80%8B/dp/B077GV4NVY/ref=sr_1_3_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=kabenjee+dc%E9%9B%BB%E6%BA%90&qid=1625444745&sr=8-3-spons&psc=1&smid=A2A3RMJIVEH6TL&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFTUEtOQkpIRTZKQkcmZW5jcnlwdGVkSWQ9QTA2NTExNjUyNDdMU1NBWDZQMVE2JmVuY3J5cHRlZEFkSWQ9QThZM1pVQTQzUDgxNyZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)

・Arduino
[ELEGOO Arduino用UNO R3スターターキット](https://www.amazon.co.jp/ELEGOO-%E3%82%AD%E3%83%83%E3%83%88-%E3%83%AC%E3%83%99%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E4%BB%98-mega2560-Arduino%E7%94%A8/dp/B06XF2HZGT/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3LP5VZ52ZAADB&dchild=1&keywords=elegoo+arduino%E7%94%A8uno+r3%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88&qid=1625444899&sprefix=elegoo+ard%2Caps%2C635&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyTzNaN1QzN005TjY0JmVuY3J5cHRlZElkPUEwMDIzODI0M0ZaUk81RVc0WUZURyZlbmNyeXB0ZWRBZElkPUEzSEtVNlVVR1lBN0pJJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)
[ELEGOO 120pcs多色デュポンワイヤー](https://www.amazon.co.jp/ELEGOO-120pcs%E5%A4%9A%E8%89%B2%E3%83%87%E3%83%A5%E3%83%9D%E3%83%B3%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%80%81arduino%E7%94%A8%E3%83%AF%E3%82%A4%E3%83%A4%E2%80%94%E3%82%B2%E2%80%94%E3%82%B828AWG-%E3%82%AA%E3%82%B9-%E3%83%A1%E3%82%B9-%E3%82%AA%E3%82%B9-%E3%82%AA%E3%82%B9-%E2%80%93%E3%83%A1%E3%82%B9-%E3%83%96%E3%83%AC%E3%83%83%E3%83%89%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%91%E3%83%BC%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC/dp/B06Y48V9DL/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2FQ33VOMSAHHZ&dchild=1&keywords=elegoo+120pcs%E5%A4%9A%E8%89%B2%E3%83%87%E3%83%A5%E3%83%9D%E3%83%B3%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC&qid=1625444980&sprefix=elegoo+120%2Caps%2C444&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFGTTVHSVRIRE1TSE0mZW5jcnlwdGVkSWQ9QTAzMzk5MTQxMzVLNkFSMDJKRDBPJmVuY3J5cHRlZEFkSWQ9QTJYWTNEMUw4WFI3STcmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

#組立、配線
ロボットアームの組立ては同封の説明書を参考に組み立てます。
(組み立てる時はサーボモータの原点位置を把握して、動かしたときに干渉しないように注意します。)

サーボモータ、PCA9685、Arduinoの配線はこちらの方を参考にさせてもらいました。
[サーボモータドライバ（PCA9685)とArduinoを用いて複数(12個)のサーボモータ(mg996r)を動かす](https://qiita.com/yo1102ta/items/27bdc6c47bc4227e2506)

模式図
![グラフィックス1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1608590/7ea9aef4-bdd8-1c25-f643-7407a20955fe.png)

実機
![IMG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1608590/c7d0d910-d07a-a0f0-5827-469c25d1762d.jpeg)



#プログラム
・動作環境

```
Windows10 Home
Python 3.7.2
Arduino IDE 1.8.13
Arduino Uno R3
```

・Arduino
Arduinoに書き込むコードはこちらの方を参考にしました。
[Arduinoで複数のサーボを動かす（PCA9685）](https://touch-sp.hatenablog.com/entry/2021/05/20/233003)

```servomotor_ide.ino
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

#define MIN 150
#define MAX 600

Adafruit_PWMServoDriver PWM_SERVO = Adafruit_PWMServoDriver(0x40);

void setup() {
  Serial.begin(9600);
  PWM_SERVO.begin();
  PWM_SERVO.setPWMFreq(50);
}

void loop() {
  if(Serial.available()> 1){
    int SERVO_NUMBER;
    int SERVO_ANGLE;
    SERVO_NUMBER = Serial.read();
    if(SERVO_NUMBER > 199){
      SERVO_ANGLE = Serial.read();
      if(SERVO_NUMBER==200){SERVO_MOVE(0, SERVO_ANGLE);}
      if(SERVO_NUMBER==201){SERVO_MOVE(1, SERVO_ANGLE);}
      if(SERVO_NUMBER==202){SERVO_MOVE(2, SERVO_ANGLE);}
      if(SERVO_NUMBER==203){SERVO_MOVE(3, SERVO_ANGLE);}
      if(SERVO_NUMBER==204){SERVO_MOVE(4, SERVO_ANGLE);}
      if(SERVO_NUMBER==205){SERVO_MOVE(5, SERVO_ANGLE);}
    }
    delay(200);
  }
}

void SERVO_MOVE(int ch, int ang){
  ang = map(ang, 0, 180, MIN, MAX);
  PWM_SERVO.setPWM(ch, 0, ang);
}
```

・Python
GUIの作成にはtkinterを利用しました。
arduinoとはシリアル通信を利用します。pyserialをpipでインストールします。
[pipの使い方](https://gammasoft.jp/python/python-library-install/)

```
pyserial 3.5
```

pythonコード

```python:module_GUI_servo.py
import tkinter as tk
import serial, time
from functools import partial

# シリアル通信準備
print("Open Port")
ser =serial.Serial("COM3", 9600)
time.sleep(1.5)

# ウィンドウの作成
body = tk.Tk()
body.title("robot_control_GUI") 
body.geometry("700x550") 

#servo_0--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 上2ボタンの押したときの動作
x_position_servo_0 = 60
def botan_up_2(servo_num):
    if int(label_servo_0_angle["text"]) < 170:
        #ラベルの値を取得してint型に変換して、＋１０して返す
        label_servo_0_angle["text"] = int(label_servo_0_angle["text"]) + 10
    servo_move(servo_num,int(label_servo_0_angle["text"]))

# 上2ボタンの作成
bota_up_2 = tk.Button(text ='▲▲',width = 7,height = 3,command = partial(botan_up_2,0))
bota_up_2.place(x=x_position_servo_0,y=0)

# 上1ボタンの押したときの動作
def botan_up(servo_num):
    if int(label_servo_0_angle["text"]) < 179:
        #ラベルの値を取得してint型に変換して、＋１して返す
        label_servo_0_angle["text"] = int(label_servo_0_angle["text"]) + 1
    servo_move(servo_num,int(label_servo_0_angle["text"]))

# 上1ボタンの作成
bota_up = tk.Button(text ='▲',width = 7,height = 3,command = partial(botan_up,0))
bota_up.place(x=x_position_servo_0,y=60)

# 下1ボタンの押したときの動作
def botan_down(servo_num):
    if int(label_servo_0_angle["text"]) > 0:
        #ラベルの値を取得してint型に変換して、-１して返す
        label_servo_0_angle["text"] = int(label_servo_0_angle["text"]) - 1
    servo_move(servo_num,int(label_servo_0_angle["text"]))

# 下1ボタンの作成
bota_down = tk.Button(text ='▼',width = 7,height = 3,command = partial(botan_down,0))
bota_down.place(x=x_position_servo_0,y=120)

# 下2ボタンの押したときの動作
def botan_down_2(servo_num):
    if int(label_servo_0_angle["text"]) > 10:
        #ラベルの値を取得してint型に変換して、-１０して返す
        label_servo_0_angle["text"] = int(label_servo_0_angle["text"]) - 10
    servo_move(servo_num,int(label_servo_0_angle["text"]))
    
# 下2ボタンの作成
bota_down_2 = tk.Button(text ='▼▼',width = 7,height = 3,command = partial(botan_down_2,0))
bota_down_2.place(x=x_position_servo_0,y=180)

# 「servo_0」の角度の表示
label_servo_0_angle = tk.Label(text="90", borderwidth=2, relief="sunken")
label_servo_0_angle.place(x=x_position_servo_0, y=240, width=60, height=20)

# 「servo_0」ラベルの作成
label_servo_0 = tk.Label(text="servo_0") 
label_servo_0.place(x=x_position_servo_0,y=260)
#----------------------------------------------------------------------------------------------------------

#servo_1----------------------------------------------------------------------------------------------------------
# 上2ボタンの押したときの動作
x_position_servo_1 = 150
def botan_up_2(servo_num):
    if int(label_servo_1_angle["text"]) < 170:
        #ラベルの値を取得してint型に変換して、＋１０して返す
        label_servo_1_angle["text"] = int(label_servo_1_angle["text"]) + 10
    servo_move(servo_num,int(label_servo_1_angle["text"]))

# 上2ボタンの作成
bota_up_2 = tk.Button(text ='▲▲',width = 7,height = 3,command = partial(botan_up_2,1))
bota_up_2.place(x=x_position_servo_1,y=0)

# 上1ボタンの押したときの動作
def botan_up(servo_num):
    if int(label_servo_1_angle["text"]) < 179:
        #ラベルの値を取得してint型に変換して、＋１して返す
        label_servo_1_angle["text"] = int(label_servo_1_angle["text"]) + 1
    servo_move(servo_num,int(label_servo_1_angle["text"]))

# 上1ボタンの作成
bota_up = tk.Button(text ='▲',width = 7,height = 3,command = partial(botan_up,1))
bota_up.place(x=x_position_servo_1,y=60)

# 下1ボタンの押したときの動作
def botan_down(servo_num):
    if int(label_servo_1_angle["text"]) > 0:
        #ラベルの値を取得してint型に変換して、-１して返す
        label_servo_1_angle["text"] = int(label_servo_1_angle["text"]) - 1
    servo_move(servo_num,int(label_servo_1_angle["text"]))

# 下1ボタンの作成
bota_down = tk.Button(text ='▼',width = 7,height = 3,command = partial(botan_down,1))
bota_down.place(x=x_position_servo_1,y=120)

# 下2ボタンの押したときの動作
def botan_down_2(servo_num):
    if int(label_servo_1_angle["text"]) > 10:
        #ラベルの値を取得してint型に変換して、-１０して返す
        label_servo_1_angle["text"] = int(label_servo_1_angle["text"]) - 10
    servo_move(servo_num,int(label_servo_1_angle["text"]))
    
# 下2ボタンの作成
bota_down_2 = tk.Button(text ='▼▼',width = 7,height = 3,command = partial(botan_down_2,1))
bota_down_2.place(x=x_position_servo_1,y=180)

# 「servo_1」の角度の表示
label_servo_1_angle = tk.Label(text="90", borderwidth=2, relief="sunken")
label_servo_1_angle.place(x=x_position_servo_1, y=240, width=60, height=20)

# 「servo_1」ラベルの作成
label_servo_1 = tk.Label(text="servo_1") 
label_servo_1.place(x=x_position_servo_1,y=260)
#----------------------------------------------------------------------------------------------------------

#servo_2----------------------------------------------------------------------------------------------------------
# 上2ボタンの押したときの動作
x_position_servo_2 = 240
def botan_up_2(servo_num):
    if int(label_servo_2_angle["text"]) < 170:
        #ラベルの値を取得してint型に変換して、＋１０して返す
        label_servo_2_angle["text"] = int(label_servo_2_angle["text"]) + 10
    servo_move(servo_num,int(label_servo_2_angle["text"]))

# 上2ボタンの作成
bota_up_2 = tk.Button(text ='▲▲',width = 7,height = 3,command = partial(botan_up_2,2))
bota_up_2.place(x=x_position_servo_2,y=0)

# 上1ボタンの押したときの動作
def botan_up(servo_num):
    if int(label_servo_2_angle["text"]) < 179:
        #ラベルの値を取得してint型に変換して、＋１して返す
        label_servo_2_angle["text"] = int(label_servo_2_angle["text"]) + 1
    servo_move(servo_num,int(label_servo_2_angle["text"]))

# 上1ボタンの作成
bota_up = tk.Button(text ='▲',width = 7,height = 3,command = partial(botan_up,2))
bota_up.place(x=x_position_servo_2,y=60)

# 下1ボタンの押したときの動作
def botan_down(servo_num):
    if int(label_servo_2_angle["text"]) > 0:
        #ラベルの値を取得してint型に変換して、-１して返す
        label_servo_2_angle["text"] = int(label_servo_2_angle["text"]) - 1
    servo_move(servo_num,int(label_servo_2_angle["text"]))

# 下1ボタンの作成
bota_down = tk.Button(text ='▼',width = 7,height = 3,command = partial(botan_down,2))
bota_down.place(x=x_position_servo_2,y=120)

# 下2ボタンの押したときの動作
def botan_down_2(servo_num):
    if int(label_servo_2_angle["text"]) > 10:
        #ラベルの値を取得してint型に変換して、-１０して返す
        label_servo_2_angle["text"] = int(label_servo_2_angle["text"]) - 10
    servo_move(servo_num,int(label_servo_2_angle["text"]))
    
# 下2ボタンの作成
bota_down_2 = tk.Button(text ='▼▼',width = 7,height = 3,command = partial(botan_down_2,2))
bota_down_2.place(x=x_position_servo_2,y=180)

# 「servo_2」の角度の表示
label_servo_2_angle = tk.Label(text="90", borderwidth=2, relief="sunken")
label_servo_2_angle.place(x=x_position_servo_2, y=240, width=60, height=20)

# 「servo_2」ラベルの作成
label_servo_2 = tk.Label(text="servo_2") 
label_servo_2.place(x=x_position_servo_2,y=260)
#----------------------------------------------------------------------------------------------------------

#servo_3----------------------------------------------------------------------------------------------------------
# 上2ボタンの押したときの動作
x_position_servo_3 = 330
def botan_up_2(servo_num):
    if int(label_servo_3_angle["text"]) < 170:
        #ラベルの値を取得してint型に変換して、＋１０して返す
        label_servo_3_angle["text"] = int(label_servo_3_angle["text"]) + 10
    servo_move(servo_num,int(label_servo_3_angle["text"]))

# 上2ボタンの作成
bota_up_2 = tk.Button(text ='▲▲',width = 7,height = 3,command = partial(botan_up_2,3))
bota_up_2.place(x=x_position_servo_3,y=0)

# 上1ボタンの押したときの動作
def botan_up(servo_num):
    if int(label_servo_3_angle["text"]) < 179:
        #ラベルの値を取得してint型に変換して、＋１して返す
        label_servo_3_angle["text"] = int(label_servo_3_angle["text"]) + 1
    servo_move(servo_num,int(label_servo_3_angle["text"]))

# 上1ボタンの作成
bota_up = tk.Button(text ='▲',width = 7,height = 3,command = partial(botan_up,3))
bota_up.place(x=x_position_servo_3,y=60)

# 下1ボタンの押したときの動作
def botan_down(servo_num):
    if int(label_servo_3_angle["text"]) > 0:
        #ラベルの値を取得してint型に変換して、-１して返す
        label_servo_3_angle["text"] = int(label_servo_3_angle["text"]) - 1
    servo_move(servo_num,int(label_servo_3_angle["text"]))

# 下1ボタンの作成
bota_down = tk.Button(text ='▼',width = 7,height = 3,command = partial(botan_down,3))
bota_down.place(x=x_position_servo_3,y=120)

# 下2ボタンの押したときの動作
def botan_down_2(servo_num):
    if int(label_servo_3_angle["text"]) > 10:
        #ラベルの値を取得してint型に変換して、-１０して返す
        label_servo_3_angle["text"] = int(label_servo_3_angle["text"]) - 10
    servo_move(servo_num,int(label_servo_3_angle["text"]))
    
# 下2ボタンの作成
bota_down_2 = tk.Button(text ='▼▼',width = 7,height = 3,command = partial(botan_down_2,3))
bota_down_2.place(x=x_position_servo_3,y=180)

# 「servo_3」の角度の表示
label_servo_3_angle = tk.Label(text="90", borderwidth=2, relief="sunken")
label_servo_3_angle.place(x=x_position_servo_3, y=240, width=60, height=20)

# 「servo_3」ラベルの作成
label_servo_3 = tk.Label(text="servo_3") 
label_servo_3.place(x=x_position_servo_3,y=260)
#----------------------------------------------------------------------------------------------------------

#servo_4----------------------------------------------------------------------------------------------------------
# 上2ボタンの押したときの動作
x_position_servo_4 = 420
def botan_up_2(servo_num):
    if int(label_servo_4_angle["text"]) < 170:
        #ラベルの値を取得してint型に変換して、＋１０して返す
        label_servo_4_angle["text"] = int(label_servo_4_angle["text"]) + 10
    servo_move(servo_num,int(label_servo_4_angle["text"]))

# 上2ボタンの作成
bota_up_2 = tk.Button(text ='▲▲',width = 7,height = 3,command = partial(botan_up_2,4))
bota_up_2.place(x=x_position_servo_4,y=0)

# 上1ボタンの押したときの動作
def botan_up(servo_num):
    if int(label_servo_4_angle["text"]) < 179:
        #ラベルの値を取得してint型に変換して、＋１して返す
        label_servo_4_angle["text"] = int(label_servo_4_angle["text"]) + 1
    servo_move(servo_num,int(label_servo_4_angle["text"]))

# 上1ボタンの作成
bota_up = tk.Button(text ='▲',width = 7,height = 3,command = partial(botan_up,4))
bota_up.place(x=x_position_servo_4,y=60)

# 下1ボタンの押したときの動作
def botan_down(servo_num):
    if int(label_servo_4_angle["text"]) > 0:
        #ラベルの値を取得してint型に変換して、-１して返す
        label_servo_4_angle["text"] = int(label_servo_4_angle["text"]) - 1
    servo_move(servo_num,int(label_servo_4_angle["text"]))

# 下1ボタンの作成
bota_down = tk.Button(text ='▼',width = 7,height = 3,command = partial(botan_down,4))
bota_down.place(x=x_position_servo_4,y=120)

# 下2ボタンの押したときの動作
def botan_down_2(servo_num):
    if int(label_servo_4_angle["text"]) > 10:
        #ラベルの値を取得してint型に変換して、-１０して返す
        label_servo_4_angle["text"] = int(label_servo_4_angle["text"]) - 10
    servo_move(servo_num,int(label_servo_4_angle["text"]))
    
# 下2ボタンの作成
bota_down_2 = tk.Button(text ='▼▼',width = 7,height = 3,command = partial(botan_down_2,4))
bota_down_2.place(x=x_position_servo_4,y=180)

# 「servo_4」の角度の表示
label_servo_4_angle = tk.Label(text="90", borderwidth=2, relief="sunken")
label_servo_4_angle.place(x=x_position_servo_4, y=240, width=60, height=20)

# 「servo_4」ラベルの作成
label_servo_4 = tk.Label(text="servo_4") 
label_servo_4.place(x=x_position_servo_4,y=260)
#----------------------------------------------------------------------------------------------------------

#servo_5----------------------------------------------------------------------------------------------------------
# 上2ボタンの押したときの動作
x_position_servo_5 = 510
def botan_up_2(servo_num):
    if int(label_servo_5_angle["text"]) < 50:
        #ラベルの値を取得してint型に変換して、＋１０して返す
        label_servo_5_angle["text"] = int(label_servo_5_angle["text"]) + 10
    servo_move(servo_num,int(label_servo_5_angle["text"]))

# 上2ボタンの作成
bota_up_2 = tk.Button(text ='▲▲',width = 7,height = 3,command = partial(botan_up_2,5))
bota_up_2.place(x=x_position_servo_5,y=0)

# 上1ボタンの押したときの動作
def botan_up(servo_num):
    if int(label_servo_5_angle["text"]) < 59:
        #ラベルの値を取得してint型に変換して、＋１して返す
        label_servo_5_angle["text"] = int(label_servo_5_angle["text"]) + 1
    servo_move(servo_num,int(label_servo_5_angle["text"]))

# 上1ボタンの作成
bota_up = tk.Button(text ='▲',width = 7,height = 3,command = partial(botan_up,5))
bota_up.place(x=x_position_servo_5,y=60)

# 下1ボタンの押したときの動作
def botan_down(servo_num):
    if int(label_servo_5_angle["text"]) > 0:
        #ラベルの値を取得してint型に変換して、-１して返す
        label_servo_5_angle["text"] = int(label_servo_5_angle["text"]) - 1
    servo_move(servo_num,int(label_servo_5_angle["text"]))

# 下1ボタンの作成
bota_down = tk.Button(text ='▼',width = 7,height = 3,command = partial(botan_down,5))
bota_down.place(x=x_position_servo_5,y=120)

# 下2ボタンの押したときの動作
def botan_down_2(servo_num):
    if int(label_servo_5_angle["text"]) > 10:
        #ラベルの値を取得してint型に変換して、-１０して返す
        label_servo_5_angle["text"] = int(label_servo_5_angle["text"]) - 10
    servo_move(servo_num,int(label_servo_5_angle["text"]))
    
# 下2ボタンの作成
bota_down_2 = tk.Button(text ='▼▼',width = 7,height = 3,command = partial(botan_down_2,5))
bota_down_2.place(x=x_position_servo_5,y=180)

# 「servo_5」の角度の表示
label_servo_5_angle = tk.Label(text="0", borderwidth=2, relief="sunken")
label_servo_5_angle.place(x=x_position_servo_5, y=240, width=60, height=20)

# 「servo_5」ラベルの作成
label_servo_5 = tk.Label(text="servo_5") 
label_servo_5.place(x=x_position_servo_5,y=260)
#----------------------------------------------------------------------------------------------------------

def servo_move(servo_num,servo_angle):
    #servoは200からカウントすることとする
    #サーボ番号と角度がバッティングすることはない
    count_servo = 200 + servo_num
    servo_id = (count_servo).to_bytes(1, 'big')
    servo_angle = (servo_angle).to_bytes(1, 'big')
    ser.write(servo_id)
    ser.write(servo_angle)
    
#実行内容記述_終了-----------------------------------------------------
# イベントループ
body.mainloop()

print("Close Port")
ser.close()
```

GUI
ボタンをクリックするごとに動くようにしました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1608590/1550946f-fe7c-4f1e-a6d2-87512c853f23.png)

ボタンを押したときの移動量

|button |angle  |
|:------|------:|
| ▲▲    | +10   |
| ▲     | +1    |
| ▼     | -1    |
| ▼▼    | -10   |

各サーボの角度

| servo      | min   | max     | default  |
|:-----------|------:|:-------:|:--------:|
| servo_0    | 0     | 179     | 90       |
| servo_1    | 0     | 179     | 90       |
| servo_2    | 0     | 179     | 90       |
| servo_3    | 0     | 179     | 90       |
| servo_4    | 0     | 179     | 90       |
| servo_5    | 0     | 59      | 0        |

servo_5は60度ぐらいで閉じるようにしました。
![グラフィックス2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1608590/e84e96e6-3955-513d-4e22-8ab3d2a7c7b6.png)

#終わりに
GUIから動かしている記事が少なかったので、やってみました。
GUIで動かせると直感的に操作できるので、簡単に動かせるようになりました。

#参考
[arduino ide ポートの指定](https://qiita.com/fumimix/items/bf3d644d3fa3d4075c80)
[Arduinoライブラリのインストール](http://www.humblesoft.com/wiki/?Arduino%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
[arduino Adafruit_PWMServoDriver](https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library)