Repository: AkariGroup/akari_software (language: python)

Issue:
Use kwonly arguments in set_allout
Merge #8 first

`set_allout` で positional arguments を使うと仕様変更に脆くなるので、この関数では keyword only arguments にしたいです。

@kazyam53 @takuya-ikeda-tri 


Discussion / hints:

Fix patch:
diff --git a/poetry.lock b/poetry.lock
index fbdef7f4..9253c913 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,7 +1,7 @@
 [[package]]
-name = "akari-controller"
+name = "akari-client"
 version = "0.2.2"
-description = "Akari controller by dynamixel_sdk. python package"
+description = ""
 category = "main"
 optional = false
 python-versions = "*"
@@ -12,12 +12,12 @@ dynamixel_sdk = "*"
 
 [package.source]
 type = "directory"
-url = "sdk/akari_controller"
+url = "sdk/akari_client"
 
 [[package]]
 name = "akari-proto"
 version = "0.1.0"
-description = ""
+description = "Python package of akari protobuf definitions and utility functions"
 category = "main"
 optional = false
 python-versions = "*"
@@ -498,10 +498,10 @@ python-versions = "*"
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.8"
-content-hash = "aafe778fc4e588f13f373a35b4b44ae27be2522e2ba775b7beebfc2e5a537529"
+content-hash = "cf250987eec38560a0965422403a6f8236e781a89b30d5e31b047f54ec1cd9b5"
 
 [metadata.files]
-akari-controller = []
+akari-client = []
 akari-proto = []
 appdirs = []
 atomicwrites = []
diff --git a/pyproject.toml b/pyproject.toml
index f65f2a90..b9581eee 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,7 +9,7 @@ python = "^3.8"
 numpy = "^1.22.3"
 dynamixel-sdk = "^3.7.31"
 depthai = "^2.15.2"
-akari-controller = {path = "sdk/akari_controller", develop = true}
+akari-client = {path = "sdk/akari_client", develop = true}
 akari-proto = {path = "sdk/akari_proto", develop = true}
 pysen = {extras = ["lint"], version = "^0.10.1"}
 opencv-python = "^4.5.5"
diff --git a/pysen.toml b/pysen.toml
index 38f70d79..5dd34522 100644
--- a/pysen.toml
+++ b/pysen.toml
@@ -15,8 +15,8 @@ py_version = "py38"
     "samples/depthai_sample/face_detection",
     "samples/depthai_sample/object_recognition",
     "samples/m5serial_sample/",
-    "sdk/akari_controller/akari_controller",
-    "sdk/akari_controller/tests/",
+    "sdk/akari_client/akari_client",
+    "sdk/akari_client/tests/",
     "sdk/depthai_uvc",
     "tools/python",
   ]
diff --git a/samples/akari_sample/script/1a_motor_control.py b/samples/akari_sample/script/1a_motor_control.py
index 79cde5c0..66adb6f3 100644
--- a/samples/akari_sample/script/1a_motor_control.py
+++ b/samples/akari_sample/script/1a_motor_control.py
@@ -9,15 +9,17 @@
 
 import time
 
-# モータ制御の際はakari_controllerのライブラリをインポートする
-from akari_controller.akari_controller import AkariController
+# モータ制御の際はakari_clientのライブラリをインポートする
+from akari_client import AkariClient
 
-# AkariControllerのインスタンスを作成する。
-controller = AkariController()
+# AkariClientのインスタンスを作成する。
+akari = AkariClient()
+# 関節制御用のインスタンスを取得する。
+joints = akari.joints
 
 # STEP1.各軸の名前を取得し、表示する。
 print("STEP1. Get joint names")
-print(controller.get_joint_names())
+print(joints.get_joint_names())
 print("")
 time.sleep(3)
 
@@ -25,68 +27,68 @@
 # "joint_names"に["pan,"tilt"]を入れると両軸同時にコマンド実行できる。
 # "values"にTrueを指定するとサーボON。今回は2軸にコマンドを送るので、1つ目が"pan"、2つ目が"tilt"をTrueにすることになる。
 print("STEP2. Servo torque ON")
-controller.enable_all_servo()
+joints.enable_all_servo()
 print("")
 
 time.sleep(3)
 
 # STEP3.初期位置に移動する。"pan","tilt"それぞれの位置を0にしている。
 print("STEP3. Move to initial position")
-controller.move_joint_positions(pan=0, tilt=0)
+joints.move_joint_positions(pan=0, tilt=0)
 print("")
 time.sleep(3)
 
 # STEP4.現在の軸の位置を表示。コマンドラインに表示される。１つめが"pan"、２つめが"tilt"の値。
 print("STEP4. Get current joint position [rad]")
-print(controller.get_joint_positions())
+print(joints.get_joint_positions())
 print("")
 time.sleep(3)
 
 # STEP5.panのモータだけ速度を3rad/sに変更する。"joint_names"に["pan"],"values"に3を指定。
 print("STEP5. Set pan joint velocity at 3 rad/s")
-controller.set_joint_velocities(pan=3)
+joints.set_joint_velocities(pan=3)
 print("")
 time.sleep(3)
 
 # STEP6.panのモータ位置だけを0.5[rad]に移動。"joint_names"に["pan"],"values"に0.5を指定。
 print("STEP6. Move pan joint position to 0.5 rad")
-controller.move_joint_positions(pan=0.5)
+joints.move_joint_positions(pan=0.5)
 print("")
 time.sleep(3)
 
 # STEP7.tiltのモータだけ速度を6rad/sに変更する。"joint_names"に["tilt"],"values"に6を指定。
 print("STEP7. Set tilt joint velocity at 6 rad/s")
-controller.set_joint_velocities(tilt=6)
+joints.set_joint_velocities(tilt=6)
 print("")
 time.sleep(3)
 
 # STEP8.tiltのモータ位置だけを0.7[rad]に移動。"joint_names"に["tilt"],"values"に-0.7を指定。
 print("STEP8. Move tilt joint position to 0.7 rad")
-controller.move_joint_positions(tilt=0.7)
+joints.move_joint_positions(tilt=0.7)
 print("")
 time.sleep(3)
 
 # STEP9.tiltのモータだけ加速度を1rad/sに変更する。"joint_names"に["tilt"],"values"に1を指定。
 print("STEP9. Set tilt joint accerelation at 1 rad/s")
-controller.set_joint_accelerations(tilt=1)
+joints.set_joint_accelerations(tilt=1)
 print("")
 time.sleep(3)
 
 # STEP10.tiltのモータ位置だけを-0.4[rad]に移動。"joint_names"に["tilt"],"values"に0.4を指定。
 print("STEP10. Move tilt joint position to -0.4 rad")
-controller.move_joint_positions(tilt=-0.4)
+joints.move_joint_positions(tilt=-0.4)
 print("")
 time.sleep(3)
 
 # STEP11.両方のモータ速度を10rad/sに変更。"joint_names"に["pan","tilt"],"values"に[10,10]を指定。
 print("STEP11. Set both joints velocity at 10 rad/s")
-controller.set_joint_velocities(pan=10, tilt=10)
+joints.set_joint_velocities(pan=10, tilt=10)
 print("")
 time.sleep(3)
 
 # STEP12.両方のモータ加速度を10rad/sに変更する。"joint_names"に["pan","tilt"],"values"に[10,10]を指定。
 print("STEP12. Set both joints accerelation at 10 rad/s")
-controller.set_joint_accelerations(pan=10, tilt=10)
+joints.set_joint_accelerations(pan=10, tilt=10)
 print("")
 time.sleep(3)
 
@@ -94,22 +96,22 @@
 # "joint_names"にはget_joint_names()を使うことで、取得した軸名をそのまま使うことができる。(["pan","tilt"]と入れるのと同じ。)
 # "values"には[-0.7,0.3]を指定することで、両軸同時にコマンド実行可能。
 print("STEP13. Move pan joint position to -0.7 rad and tilt joint position to 0.3 rad")
-controller.move_joint_positions(pan=-0.7, tilt=0.3)
+joints.move_joint_positions(pan=-0.7, tilt=0.3)
 print("")
 time.sleep(3)
 
 # STEP14.現在の軸の位置を表示。コマンドラインに表示される。１つめが"pan"、２つめが"tilt"の値。
 # [-0.7, 0.3]とほぼ一致していれば成功
 print("STEP14. Get current joint position [rad]")
-print(controller.get_joint_positions())
+print(joints.get_joint_positions())
 print("")
 time.sleep(3)
 
 # STEP15.初期位置に戻る。
 print("STEP15. Return to initial position")
-controller.move_joint_positions(pan=0, tilt=0)
+joints.move_joint_positions(pan=0, tilt=0)
 print("")
 time.sleep(3)
 
 print("Finish!")
-controller.close()
+akari.close()
diff --git a/samples/akari_sample/script/2a_button.py b/samples/akari_sample/script/2a_button.py
index 73012093..6e88025e 100644
--- a/samples/akari_sample/script/2a_button.py
+++ b/samples/akari_sample/script/2a_button.py
@@ -9,7 +9,7 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
@@ -17,31 +17,32 @@ def main() -> None:
     メイン関数
     """
 
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    # コマンドラインに'Press button!'と表示
-    print("Press button!")
-
-    # アプリが終了されるまで、データ取得を実行し続ける。
-    while True:
-        # M5からデータを取得
-        data = m5.get()
-        # ボタンAが押されているとdata['button_a']がTrue。コマンドラインに'Button A pressed!'と表示される。
-        if data["button_a"]:
-            print("Button A pressed!")
-        # ボタンBが押されているとdata['button_b']がTrue。コマンドラインに'Button B pressed!'と表示される。
-        if data["button_b"]:
-            print("Button B pressed!")
-        # ボタンCが押されているとdata['button_c']がTrue。コマンドラインに'Button C pressed!'と表示される。
-        if data["button_c"]:
-            print("Button C pressed!")
-        # 0.1秒停止
-        time.sleep(0.1)
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
+        # 2秒停止
+        time.sleep(2)
+
+        # コマンドラインに'Press button!'と表示
+        print("Press button!")
+
+        # アプリが終了されるまで、データ取得を実行し続ける。
+        while True:
+            # M5からデータを取得
+            data = m5.get()
+            # ボタンAが押されているとdata['button_a']がTrue。コマンドラインに'Button A pressed!'と表示される。
+            if data["button_a"]:
+                print("Button A pressed!")
+            # ボタンBが押されているとdata['button_b']がTrue。コマンドラインに'Button B pressed!'と表示される。
+            if data["button_b"]:
+                print("Button B pressed!")
+            # ボタンCが押されているとdata['button_c']がTrue。コマンドラインに'Button C pressed!'と表示される。
+            if data["button_c"]:
+                print("Button C pressed!")
+            # 0.1秒停止
+            time.sleep(0.1)
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/2b_gpio_input.py b/samples/akari_sample/script/2b_gpio_input.py
index b012ceb2..352ae666 100644
--- a/samples/akari_sample/script/2b_gpio_input.py
+++ b/samples/akari_sample/script/2b_gpio_input.py
@@ -9,35 +9,36 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    # アプリが終了されるまで、データ取得を実行し続ける。
-    while True:
-        # M5からデータを取得
-        data = m5.get()
-        # din0はdata['din0'], din1はdata['din1'], ain0はdata['ain0']に結果が得られるので、それらをコマンドラインに表示。
-        print(
-            "din0: "
-            + str(int(data["din0"]))
-            + " din1: "
-            + str(int(data["din1"]))
-            + " ain0: "
-            + str(data["ain0"])
-        )
-        # 1秒停止
-        time.sleep(1)
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
+        # 2秒停止
+        time.sleep(2)
+
+        # アプリが終了されるまで、データ取得を実行し続ける。
+        while True:
+            # M5からデータを取得
+            data = m5.get()
+            # din0はdata['din0'], din1はdata['din1'], ain0はdata['ain0']に結果が得られるので、それらをコマンドラインに表示。
+            print(
+                "din0: "
+                + str(int(data["din0"]))
+                + " din1: "
+                + str(int(data["din1"]))
+                + " ain0: "
+                + str(data["ain0"])
+            )
+            # 1秒停止
+            time.sleep(1)
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/2c_gpio_output.py b/samples/akari_sample/script/2c_gpio_output.py
index 20cad544..26f0a657 100644
--- a/samples/akari_sample/script/2c_gpio_output.py
+++ b/samples/akari_sample/script/2c_gpio_output.py
@@ -9,32 +9,33 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    # アプリが終了されるまで、データ取得を実行し続ける。
-    while True:
-        # M5からデータを取得
-        data = m5.get()
-        # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']
-        # に結果が得られるので、それらをコマンドラインに表示。
-        print(
-            "dout0: "
-            + str(int(data["dout0"]))
-            + " dout1: "
-            + str(int(data["dout1"]))
-            + " pwmout0: "
-            + str(data["pwmout0"])
-        )
-        # 1秒停止
-        time.sleep(1)
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        # アプリが終了されるまで、データ取得を実行し続ける。
+        while True:
+            # M5からデータを取得
+            data = m5.get()
+            # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']
+            # に結果が得られるので、それらをコマンドラインに表示。
+            print(
+                "dout0: "
+                + str(int(data["dout0"]))
+                + " dout1: "
+                + str(int(data["dout1"]))
+                + " pwmout0: "
+                + str(data["pwmout0"])
+            )
+            # 1秒停止
+            time.sleep(1)
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/2d_env_info.py b/samples/akari_sample/script/2d_env_info.py
index 8da2f3da..8056fa9a 100644
--- a/samples/akari_sample/script/2d_env_info.py
+++ b/samples/akari_sample/script/2d_env_info.py
@@ -9,36 +9,37 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    # アプリが終了されるまで、データ取得を実行し続ける。
-    while True:
-        # M5からデータを取得
-        data = m5.get()
-        # 気圧の値はdata['pressure'][Pa]、気温の値はdata['temperature'][deg]、明るさの値はdata['brightness'](0-4096)に格納されている。
-        # コマンドラインに取得した各値を表示する。
-        print(
-            "pressure: "
-            + str(data["pressure"])
-            + "[Pa] temperature: "
-            + str(data["temperature"])
-            + "[deg] brightness: "
-            + str(data["brightness"])
-        )
-        # 1秒停止
-        time.sleep(1)
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
+        # 2秒停止
+        time.sleep(2)
+
+        # アプリが終了されるまで、データ取得を実行し続ける。
+        while True:
+            # M5からデータを取得
+            data = m5.get()
+            # 気圧の値はdata['pressure'][Pa]、気温の値はdata['temperature'][deg]、明るさの値はdata['brightness'](0-4096)に格納されている。
+            # コマンドラインに取得した各値を表示する。
+            print(
+                "pressure: "
+                + str(data["pressure"])
+                + "[Pa] temperature: "
+                + str(data["temperature"])
+                + "[deg] brightness: "
+                + str(data["brightness"])
+            )
+            # 1秒停止
+            time.sleep(1)
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/3a_gpio_control.py b/samples/akari_sample/script/3a_gpio_control.py
index 99803465..8208a681 100644
--- a/samples/akari_sample/script/3a_gpio_control.py
+++ b/samples/akari_sample/script/3a_gpio_control.py
@@ -10,152 +10,153 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    # アプリが終了されるまでループする。
-    while True:
-        # STEP1. dout0の出力をHiにする。
-        print("STEP1. Set dout0 to Hi")
-        # pin_idが0ならdout0
-        pin_id = 0
-        # valがFalseならLo,TrueならHi
-        val = True
-        # set_doutを実行
-        m5.set_dout(pin_id, val)
-        print(f"-> Set to {val}")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP2. dout1の出力をHiにする。
-        print("STEP2. Set dout1 to Hi")
-        # pin_idが1ならdout1
-        pin_id = 1
-        # valがFalseならLo,TrueならHi
-        val = True
-        # set_doutを実行
-        m5.set_dout(pin_id, val)
-        print(f"-> Set to {val}")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP3. pwmout0の出力をHiにする。
-        print("STEP3. Set pwmout0 to 255")
-        # pin_idが0ならpwmout0
-        pin_id = 0
-        # valがFalseならLo,TrueならHi
-        pwmval = 255
-        # set_pwmoutを実行
-        m5.set_pwmout(pin_id, pwmval)
-        print(f"-> Set to {pwmval}")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP4. 出力ピンの現在値を表示(2cのサンプルと同様)
-        print("STEP4. Display current output pin value")
-        # M5からデータを取得
-        data = m5.get()
-        # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']に
-        # 結果が得られるので、それらをコマンドラインに表示。
-        print(
-            "dout0: "
-            + str(int(data["dout0"]))
-            + " dout1: "
-            + str(int(data["dout1"]))
-            + " pwmout0: "
-            + str(data["pwmout0"])
-        )
-        # 1秒停止
-        time.sleep(1)
-        print()
-
-        # STEP5. すべての出力をリセットにする。
-        print("STEP5. Reset all output")
-        # reset_alloutを実行
-        m5.reset_allout()
-        print("-> Reset")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP6. 出力ピンの現在値を表示(2cのサンプルと同様)
-        print("STEP6. Display current output pin value")
-        # M5からデータを取得
-        data = m5.get()
-        # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']に
-        # 結果が得られるので、それらをコマンドラインに表示。
-        print(
-            "dout0: "
-            + str(int(data["dout0"]))
-            + " dout1: "
-            + str(int(data["dout1"]))
-            + " pwmout0: "
-            + str(data["pwmout0"])
-        )
-        # 1秒停止
-        time.sleep(1)
-        print()
-
-        # STEP7. set_alloutで全出力を同時に変更する。dout0:Hi dout1:Hi pwmout0:200
-        print("STEP7. Set allout. dout0:Hi dout1:Hi pwmout0:200")
-        # dout0_valがFalseならdout0がLo,TrueならHi
-        dout0_val = True
-        # dout1_valがFalseならdout1がLo,TrueならHi
-        dout1_val = True
-        # pwmout0_valでpwmout0の出力値を設定
-        pwmout0_val = 200
-        # set_alloutを実行
-        m5.set_allout(dout0=dout0_val, dout1=dout1_val, pwmout0=pwmout0_val)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP8. 出力ピンの現在値を表示(2cのサンプルと同様)
-        print("STEP8. Display current output pin value")
-        # M5からデータを取得
-        data = m5.get()
-        # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']に
-        # 結果が得られるので、それらをコマンドラインに表示。
-        print(
-            "dout0: "
-            + str(int(data["dout0"]))
-            + " dout1: "
-            + str(int(data["dout1"]))
-            + " pwmout0: "
-            + str(data["pwmout0"])
-        )
-        # 1秒停止
-        time.sleep(1)
-        print()
-
-        # STEP9. すべての出力を再度リセットにする。
-        print("STEP9. Reset all output")
-        # reset_alloutを実行
-        m5.reset_allout()
-        print("-> Reset")
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
         # 2秒停止
         time.sleep(2)
-        print()
 
-        print("Finish!")
-        print()
-        # 5秒停止
-        time.sleep(5)
+        # アプリが終了されるまでループする。
+        while True:
+            # STEP1. dout0の出力をHiにする。
+            print("STEP1. Set dout0 to Hi")
+            # pin_idが0ならdout0
+            pin_id = 0
+            # valがFalseならLo,TrueならHi
+            val = True
+            # set_doutを実行
+            m5.set_dout(pin_id, val)
+            print(f"-> Set to {val}")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP2. dout1の出力をHiにする。
+            print("STEP2. Set dout1 to Hi")
+            # pin_idが1ならdout1
+            pin_id = 1
+            # valがFalseならLo,TrueならHi
+            val = True
+            # set_doutを実行
+            m5.set_dout(pin_id, val)
+            print(f"-> Set to {val}")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP3. pwmout0の出力をHiにする。
+            print("STEP3. Set pwmout0 to 255")
+            # pin_idが0ならpwmout0
+            pin_id = 0
+            # valがFalseならLo,TrueならHi
+            pwmval = 255
+            # set_pwmoutを実行
+            m5.set_pwmout(pin_id, pwmval)
+            print(f"-> Set to {pwmval}")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP4. 出力ピンの現在値を表示(2cのサンプルと同様)
+            print("STEP4. Display current output pin value")
+            # M5からデータを取得
+            data = m5.get()
+            # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']に
+            # 結果が得られるので、それらをコマンドラインに表示。
+            print(
+                "dout0: "
+                + str(int(data["dout0"]))
+                + " dout1: "
+                + str(int(data["dout1"]))
+                + " pwmout0: "
+                + str(data["pwmout0"])
+            )
+            # 1秒停止
+            time.sleep(1)
+            print()
+
+            # STEP5. すべての出力をリセットにする。
+            print("STEP5. Reset all output")
+            # reset_alloutを実行
+            m5.reset_allout()
+            print("-> Reset")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP6. 出力ピンの現在値を表示(2cのサンプルと同様)
+            print("STEP6. Display current output pin value")
+            # M5からデータを取得
+            data = m5.get()
+            # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']に
+            # 結果が得られるので、それらをコマンドラインに表示。
+            print(
+                "dout0: "
+                + str(int(data["dout0"]))
+                + " dout1: "
+                + str(int(data["dout1"]))
+                + " pwmout0: "
+                + str(data["pwmout0"])
+            )
+            # 1秒停止
+            time.sleep(1)
+            print()
+
+            # STEP7. set_alloutで全出力を同時に変更する。dout0:Hi dout1:Hi pwmout0:200
+            print("STEP7. Set allout. dout0:Hi dout1:Hi pwmout0:200")
+            # dout0_valがFalseならdout0がLo,TrueならHi
+            dout0_val = True
+            # dout1_valがFalseならdout1がLo,TrueならHi
+            dout1_val = True
+            # pwmout0_valでpwmout0の出力値を設定
+            pwmout0_val = 200
+            # set_alloutを実行
+            m5.set_allout(dout0=dout0_val, dout1=dout1_val, pwmout0=pwmout0_val)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP8. 出力ピンの現在値を表示(2cのサンプルと同様)
+            print("STEP8. Display current output pin value")
+            # M5からデータを取得
+            data = m5.get()
+            # dout0はdata['dout0'], dout1はdata['dout1'], pwmout0はdata['pwmout0']に
+            # 結果が得られるので、それらをコマンドラインに表示。
+            print(
+                "dout0: "
+                + str(int(data["dout0"]))
+                + " dout1: "
+                + str(int(data["dout1"]))
+                + " pwmout0: "
+                + str(data["pwmout0"])
+            )
+            # 1秒停止
+            time.sleep(1)
+            print()
+
+            # STEP9. すべての出力を再度リセットにする。
+            print("STEP9. Reset all output")
+            # reset_alloutを実行
+            m5.reset_allout()
+            print("-> Reset")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            print("Finish!")
+            print()
+            # 5秒停止
+            time.sleep(5)
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/4a_display_color.py b/samples/akari_sample/script/4a_display_color.py
index 845d47c9..28487d43 100644
--- a/samples/akari_sample/script/4a_display_color.py
+++ b/samples/akari_sample/script/4a_display_color.py
@@ -11,104 +11,105 @@
 import time
 import random
 
-from akari_controller.m5serial_server_py import M5SerialServer
-from akari_controller.color import Colors, Color
+from akari_client import AkariClient
+from akari_client.color import Colors, Color
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    color: Color
-    # アプリが終了されるまでループする。
-    while True:
-        # STEP1. ディスプレイの背景色を白にする
-        print("STEP1. Set display color to white")
-        # colorで'white'を指定
-        color = Colors.WHITE
-        # set_display_colorを実行
-        m5.set_display_color(color)
-        # 結果を出力
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP2. ディスプレイの背景色を赤にする
-        print("STEP2. Set display color to red")
-        # colorで'red'を指定
-        color = Colors.RED
-        # set_display_colorを実行
-        m5.set_display_color(color)
-        # 結果を出力
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP3. ディスプレイの背景色を青にする
-        print("STEP3. Set display color to blue")
-        # colorで'blue'を指定
-        color = Colors.BLUE
-        # set_display_colorを実行
-        m5.set_display_color(color)
-        # 結果を出力
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP4. ディスプレイの背景色を紫にする
-        print("STEP4. Set display color to magenta")
-        # colorで'magenta'を指定
-        color = Colors.MAGENTA
-        # set_display_colorを実行
-        m5.set_display_color(color)
-        # 結果を出力
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP5. ディスプレイの背景色をランダム色にする
-        print("STEP5. Set display color to a random color")
-        # colorを生成
-        color = Color(
-            red=random.randint(0, 255),
-            green=random.randint(0, 255),
-            blue=random.randint(0, 255),
-        )
-        # set_display_colorを実行
-        m5.set_display_color(color)
-        # 結果を出力
-        print(f"-> Set (Color: {color})")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP6. ディスプレイの背景色を黒にする
-        print("STEP6. Set display color to black")
-        # colorで'black'を指定
-        color = Colors.BLACK
-        # set_display_colorを実行
-        m5.set_display_color(color)
-        # 結果を出力
-        print("-> Set")
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
         # 2秒停止
         time.sleep(2)
-        print()
 
-        print("Finish!")
-        print()
-        # 5秒停止
-        time.sleep(5)
+        color: Color
+        # アプリが終了されるまでループする。
+        while True:
+            # STEP1. ディスプレイの背景色を白にする
+            print("STEP1. Set display color to white")
+            # colorで'white'を指定
+            color = Colors.WHITE
+            # set_display_colorを実行
+            m5.set_display_color(color)
+            # 結果を出力
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP2. ディスプレイの背景色を赤にする
+            print("STEP2. Set display color to red")
+            # colorで'red'を指定
+            color = Colors.RED
+            # set_display_colorを実行
+            m5.set_display_color(color)
+            # 結果を出力
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP3. ディスプレイの背景色を青にする
+            print("STEP3. Set display color to blue")
+            # colorで'blue'を指定
+            color = Colors.BLUE
+            # set_display_colorを実行
+            m5.set_display_color(color)
+            # 結果を出力
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP4. ディスプレイの背景色を紫にする
+            print("STEP4. Set display color to magenta")
+            # colorで'magenta'を指定
+            color = Colors.MAGENTA
+            # set_display_colorを実行
+            m5.set_display_color(color)
+            # 結果を出力
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP5. ディスプレイの背景色をランダム色にする
+            print("STEP5. Set display color to a random color")
+            # colorを生成
+            color = Color(
+                red=random.randint(0, 255),
+                green=random.randint(0, 255),
+                blue=random.randint(0, 255),
+            )
+            # set_display_colorを実行
+            m5.set_display_color(color)
+            # 結果を出力
+            print(f"-> Set (Color: {color})")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP6. ディスプレイの背景色を黒にする
+            print("STEP6. Set display color to black")
+            # colorで'black'を指定
+            color = Colors.BLACK
+            # set_display_colorを実行
+            m5.set_display_color(color)
+            # 結果を出力
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            print("Finish!")
+            print()
+            # 5秒停止
+            time.sleep(5)
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/4b_display_text.py b/samples/akari_sample/script/4b_display_text.py
index 5bf54e80..43ea0ae7 100644
--- a/samples/akari_sample/script/4b_display_text.py
+++ b/samples/akari_sample/script/4b_display_text.py
@@ -9,219 +9,220 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
-from akari_controller.color import Colors
+from akari_client import AkariClient
+from akari_client.color import Colors
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    # アプリが終了されるまでループする。
-    while True:
-        # STEP1. '1.AKARI'を左上表示
-        print("STEP1. display 1.AKARI at top left")
-        # textは'1.AKARI'
-        text = "1.AKARI"
-        # pos_xは0-320で座標指定。0が左
-        pos_x = 0
-        # pos_yは0-240で座標指定。0が上
-        pos_y = 0
-        # 文字サイズは3
-        size = 3
-        # 文字色は黒
-        text_color = Colors.BLACK
-        # 背景色は白
-        back_color = Colors.WHITE
-        # 背景全体をリセット
-        refresh = True
-        # set_display_textを実行
-        m5.set_display_text(
-            text, pos_x, pos_y, size, text_color, back_color, refresh
-        )
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP2. '2.あかり'を中央に表示
-        print("STEP2. display 2.あかり at middle center")
-        text = "2.あかり"
-        # pos_xは-999で左右中央
-        pos_x = -999
-        # pos_yは-999で上下中央
-        pos_y = -999
-        # 文字サイズは3
-        size = 3
-        # 文字色は赤
-        text_color = Colors.RED
-        # 背景色は白
-        back_color = Colors.WHITE
-        # 背景全体をリセット
-        refresh = True
-        # set_display_textを実行
-        m5.set_display_text(
-            text, pos_x, pos_y, size, text_color, back_color, refresh
-        )
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP3. '3.灯り'を右下揃えに表示
-        print("STEP3. display 3.灯り at bottom right")
-        # textは'3.灯り'
-        text = "3.灯り"
-        # pos_xは999で右揃え
-        pos_x = 999
-        # pos_yは999で下揃え
-        pos_y = 999
-        # 文字サイズは4
-        size = 4
-        # 文字色は白
-        text_color = Colors.WHITE
-        # 背景色は緑
-        back_color = Colors.GREEN
-        # 背景全体をリセット
-        refresh = True
-        # set_display_textを実行
-        m5.set_display_text(
-            text, pos_x, pos_y, size, text_color, back_color, refresh
-        )
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP4. '4.アカリ'を(50,40)に表示
-        print("STEP4. display 4.アカリ at (50,40)")
-        # textは'4.アカリ'
-        text = "4.アカリ"
-        # pos_xは60
-        pos_x = 50
-        # pos_yは40
-        pos_y = 40
-        # 文字サイズは2
-        size = 2
-        # 文字色は青
-        text_color = Colors.BLUE
-        # 背景色は黄
-        back_color = Colors.YELLOW
-        # 背景全体をリセット
-        refresh = True
-        # set_display_textを実行
-        m5.set_display_text(
-            text, pos_x, pos_y, size, text_color, back_color, refresh
-        )
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP5. '5.アカリ'を(50,100)に背景リフレッシュなしで重ねて表示
-        print("STEP5. display 5.アカリ at (50,100) without background refresh")
-        # textは'5.アカリ'
-        text = "5.アカリ"
-        # pos_xは50
-        pos_x = 50
-        # pos_yは40
-        pos_y = 100
-        # 文字サイズは3
-        size = 3
-        # 文字色は黒
-        text_color = Colors.BLACK
-        # 背景色は紫
-        back_color = Colors.MAGENTA
-        # refreshをFalseにすることで前の背景表示を消さずに追記できる。
-        refresh = False
-        # set_display_textを実行
-        m5.set_display_text(
-            text, pos_x, pos_y, size, text_color, back_color, refresh
-        )
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP.6 フォントを軽量内蔵フォントに変更する。
-        print("STEP6. Change font")
-        # dataをFalseにすることで、フォントを内蔵フォントに変更可能
-        data = False
-        m5.use_japanese_font(data)
-        print("-> Set")
-        print()
-
-        # STEP7. 変更したフォントで'7.アカリ'を(50,170)にリフレッシュなしで重ねて表示
-        print("STEP7. display 7.アカリ at (50,170) with new font")
-        # textは'7.アカリ'
-        text = "7.アカリ"
-        # pos_xは50
-        pos_x = 50
-        # pos_yは170
-        pos_y = 170
-        # 文字サイズは4
-        size = 4
-        # 文字色はピンク
-        text_color = Colors.PINK
-        # 背景色は灰
-        back_color = Colors.DARKGREY
-        # refreshをFalseにすることで前の表示を消さずに追記できる。
-        refresh = False
-        # set_display_textを実行
-        m5.set_display_text(
-            text, pos_x, pos_y, size, text_color, back_color, refresh
-        )
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP.8 フォントをデフォルトフォントに変更する。
-        print("STEP8. Change font to default")
-        # dataをTrueにすることで、フォントをデフォルトフォントに変更可能
-        data = True
-        m5.use_japanese_font(data)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP9. '9.灯'を中央に表示
-        print("STEP9. display 9.灯 at middle center")
-        # textは'9.灯'
-        text = "9.灯"
-        # pos_xは-999で左右中央
-        pos_x = -999
-        # pos_yは-999で上下中央
-        pos_y = -999
-        # 文字サイズは6
-        size = 6
-        # 文字色は白
-        text_color = Colors.WHITE
-        # 背景色は黒
-        back_color = Colors.BLACK
-        # 背景全体をリセット
-        refresh = True
-        # set_display_textを実行
-        m5.set_display_text(
-            text, pos_x, pos_y, size, text_color, back_color, refresh
-        )
-        print("-> Set")
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
         # 2秒停止
         time.sleep(2)
-        print()
 
-        print("Finish!")
-        print()
-        # 5秒停止
-        time.sleep(5)
+        # アプリが終了されるまでループする。
+        while True:
+            # STEP1. '1.AKARI'を左上表示
+            print("STEP1. display 1.AKARI at top left")
+            # textは'1.AKARI'
+            text = "1.AKARI"
+            # pos_xは0-320で座標指定。0が左
+            pos_x = 0
+            # pos_yは0-240で座標指定。0が上
+            pos_y = 0
+            # 文字サイズは3
+            size = 3
+            # 文字色は黒
+            text_color = Colors.BLACK
+            # 背景色は白
+            back_color = Colors.WHITE
+            # 背景全体をリセット
+            refresh = True
+            # set_display_textを実行
+            m5.set_display_text(
+                text, pos_x, pos_y, size, text_color, back_color, refresh
+            )
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP2. '2.あかり'を中央に表示
+            print("STEP2. display 2.あかり at middle center")
+            text = "2.あかり"
+            # pos_xは-999で左右中央
+            pos_x = -999
+            # pos_yは-999で上下中央
+            pos_y = -999
+            # 文字サイズは3
+            size = 3
+            # 文字色は赤
+            text_color = Colors.RED
+            # 背景色は白
+            back_color = Colors.WHITE
+            # 背景全体をリセット
+            refresh = True
+            # set_display_textを実行
+            m5.set_display_text(
+                text, pos_x, pos_y, size, text_color, back_color, refresh
+            )
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP3. '3.灯り'を右下揃えに表示
+            print("STEP3. display 3.灯り at bottom right")
+            # textは'3.灯り'
+            text = "3.灯り"
+            # pos_xは999で右揃え
+            pos_x = 999
+            # pos_yは999で下揃え
+            pos_y = 999
+            # 文字サイズは4
+            size = 4
+            # 文字色は白
+            text_color = Colors.WHITE
+            # 背景色は緑
+            back_color = Colors.GREEN
+            # 背景全体をリセット
+            refresh = True
+            # set_display_textを実行
+            m5.set_display_text(
+                text, pos_x, pos_y, size, text_color, back_color, refresh
+            )
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP4. '4.アカリ'を(50,40)に表示
+            print("STEP4. display 4.アカリ at (50,40)")
+            # textは'4.アカリ'
+            text = "4.アカリ"
+            # pos_xは60
+            pos_x = 50
+            # pos_yは40
+            pos_y = 40
+            # 文字サイズは2
+            size = 2
+            # 文字色は青
+            text_color = Colors.BLUE
+            # 背景色は黄
+            back_color = Colors.YELLOW
+            # 背景全体をリセット
+            refresh = True
+            # set_display_textを実行
+            m5.set_display_text(
+                text, pos_x, pos_y, size, text_color, back_color, refresh
+            )
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP5. '5.アカリ'を(50,100)に背景リフレッシュなしで重ねて表示
+            print("STEP5. display 5.アカリ at (50,100) without background refresh")
+            # textは'5.アカリ'
+            text = "5.アカリ"
+            # pos_xは50
+            pos_x = 50
+            # pos_yは40
+            pos_y = 100
+            # 文字サイズは3
+            size = 3
+            # 文字色は黒
+            text_color = Colors.BLACK
+            # 背景色は紫
+            back_color = Colors.MAGENTA
+            # refreshをFalseにすることで前の背景表示を消さずに追記できる。
+            refresh = False
+            # set_display_textを実行
+            m5.set_display_text(
+                text, pos_x, pos_y, size, text_color, back_color, refresh
+            )
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP.6 フォントを軽量内蔵フォントに変更する。
+            print("STEP6. Change font")
+            # dataをFalseにすることで、フォントを内蔵フォントに変更可能
+            data = False
+            m5.use_japanese_font(data)
+            print("-> Set")
+            print()
+
+            # STEP7. 変更したフォントで'7.アカリ'を(50,170)にリフレッシュなしで重ねて表示
+            print("STEP7. display 7.アカリ at (50,170) with new font")
+            # textは'7.アカリ'
+            text = "7.アカリ"
+            # pos_xは50
+            pos_x = 50
+            # pos_yは170
+            pos_y = 170
+            # 文字サイズは4
+            size = 4
+            # 文字色はピンク
+            text_color = Colors.PINK
+            # 背景色は灰
+            back_color = Colors.DARKGREY
+            # refreshをFalseにすることで前の表示を消さずに追記できる。
+            refresh = False
+            # set_display_textを実行
+            m5.set_display_text(
+                text, pos_x, pos_y, size, text_color, back_color, refresh
+            )
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP.8 フォントをデフォルトフォントに変更する。
+            print("STEP8. Change font to default")
+            # dataをTrueにすることで、フォントをデフォルトフォントに変更可能
+            data = True
+            m5.use_japanese_font(data)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP9. '9.灯'を中央に表示
+            print("STEP9. display 9.灯 at middle center")
+            # textは'9.灯'
+            text = "9.灯"
+            # pos_xは-999で左右中央
+            pos_x = -999
+            # pos_yは-999で上下中央
+            pos_y = -999
+            # 文字サイズは6
+            size = 6
+            # 文字色は白
+            text_color = Colors.WHITE
+            # 背景色は黒
+            back_color = Colors.BLACK
+            # 背景全体をリセット
+            refresh = True
+            # set_display_textを実行
+            m5.set_display_text(
+                text, pos_x, pos_y, size, text_color, back_color, refresh
+            )
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            print("Finish!")
+            print()
+            # 5秒停止
+            time.sleep(5)
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/4c_display_image.py b/samples/akari_sample/script/4c_display_image.py
index 170c0e27..a650ef74 100644
--- a/samples/akari_sample/script/4c_display_image.py
+++ b/samples/akari_sample/script/4c_display_image.py
@@ -9,162 +9,163 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    # アプリが終了されるまでループする。
-    while True:
-        # STEP1. M5のSDカード内の画像'/logo320_ex.jpg'を表示
-        print("STEP1. display /logo320_ex.jpg in SD")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320_ex.jpg"
-        # pos_xは0-320で座標指定。0が左
-        pos_x = 0
-        # pos_yは0-240で座標指定。0が上
-        pos_y = 0
-        # scaleでサイズ指定。マイナス値を入れると画面サイズに合わせて自動調整される。
-        scale = -1.0
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP2. M5のSDカード内の画像'/logo320.jpg'を2倍、中央揃えで表示
-        print("STEP2. display /logo320.jpg in SD at x2 size at middle center")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320.jpg"
-        # pos_xは0-320で座標指定。-999が中央
-        pos_x = -999
-        # pos_yは0-240で座標指定。-999が中央
-        pos_y = -999
-        # scaleでサイズ指定。
-        scale = 2.0
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP3. M5のSDカード内の画像'/logo320.jpg'を0.3倍、右下揃えで表示
-        print("STEP3. display /logo320.jpg in SD at x0.3 at bottom right")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320.jpg"
-        # pos_xは0-320で座標指定。999が右揃え
-        pos_x = 999
-        # pos_yは0-240で座標指定。999が下揃え
-        pos_y = 999
-        # scaleでサイズ指定。
-        scale = 0.3
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP4. M5のSDカード内の画像'/logo320.jpg'を0.7倍、左中央揃えで表示
-        print("STEP4. display /logo320.jpg in SD at x0.7 at middle left")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320.jpg"
-        # pos_xは0-320で座標指定。
-        pos_x = 0
-        # pos_yは0-240で座標指定。-999が中央揃え。
-        pos_y = -999
-        # scaleでサイズ指定。
-        scale = 0.7
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP5. M5のSDカード内の画像'/logo320.jpg'を0.4倍、右上揃えで表示
-        print("STEP5. display /logo320.jpg in SD at x0.4 at top right")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320.jpg"
-        # pos_xは0-320で座標指定。999が右揃え
-        pos_x = 999
-        # pos_yは0-240で座標指定。
-        pos_y = 0
-        # scaleでサイズ指定。
-        scale = 0.4
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP6. M5のSDカード内の画像'/logo320.jpg'を0.2倍、左下揃えで表示
-        print("STEP6. display /logo320.jpg in SD at x0.2 at bottom left")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320.jpg"
-        # pos_xは0-320で座標指定。
-        pos_x = 0
-        # pos_yは0-240で座標指定。999が下揃え
-        pos_y = 999
-        # scaleでサイズ指定。
-        scale = 0.2
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP7. M5のSDカード内の画像'/logo320.jpg'を0.3倍で(50,20)に表示
-        print("STEP7. display /logo320.jpg in SD at x0.3 size at (50,20)")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320.jpg"
-        # pos_xは0-320で座標指定。
-        pos_x = 50
-        # pos_yは0-240で座標指定。
-        pos_y = 20
-        # scaleでサイズ指定。
-        scale = 0.3
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
-        # 2秒停止
-        time.sleep(2)
-        print()
-
-        # STEP8. M5のSDカード内の画像'/logo320.jpg'を表示
-        print("STEP8. display /logo320.jpg in SD")
-        # filepathでM5のSDカード内の画像パスを指定
-        filepath = "/logo320.jpg"
-        # pos_xは0-320で座標指定。0が左
-        pos_x = 0
-        # pos_yは0-240で座標指定。0が上
-        pos_y = 0
-        # scaleでサイズ指定。マイナス値で画面に合わせて自動調整。
-        scale = -1.0
-        # set_display_imageを実行
-        m5.set_display_image(filepath, pos_x, pos_y, scale)
-        print("-> Set")
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
         # 2秒停止
         time.sleep(2)
-        print()
 
-        print("Finish!")
-        # 5秒停止
-        time.sleep(5)
-        print()
+        # アプリが終了されるまでループする。
+        while True:
+            # STEP1. M5のSDカード内の画像'/logo320_ex.jpg'を表示
+            print("STEP1. display /logo320_ex.jpg in SD")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320_ex.jpg"
+            # pos_xは0-320で座標指定。0が左
+            pos_x = 0
+            # pos_yは0-240で座標指定。0が上
+            pos_y = 0
+            # scaleでサイズ指定。マイナス値を入れると画面サイズに合わせて自動調整される。
+            scale = -1.0
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP2. M5のSDカード内の画像'/logo320.jpg'を2倍、中央揃えで表示
+            print("STEP2. display /logo320.jpg in SD at x2 size at middle center")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320.jpg"
+            # pos_xは0-320で座標指定。-999が中央
+            pos_x = -999
+            # pos_yは0-240で座標指定。-999が中央
+            pos_y = -999
+            # scaleでサイズ指定。
+            scale = 2.0
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP3. M5のSDカード内の画像'/logo320.jpg'を0.3倍、右下揃えで表示
+            print("STEP3. display /logo320.jpg in SD at x0.3 at bottom right")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320.jpg"
+            # pos_xは0-320で座標指定。999が右揃え
+            pos_x = 999
+            # pos_yは0-240で座標指定。999が下揃え
+            pos_y = 999
+            # scaleでサイズ指定。
+            scale = 0.3
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP4. M5のSDカード内の画像'/logo320.jpg'を0.7倍、左中央揃えで表示
+            print("STEP4. display /logo320.jpg in SD at x0.7 at middle left")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320.jpg"
+            # pos_xは0-320で座標指定。
+            pos_x = 0
+            # pos_yは0-240で座標指定。-999が中央揃え。
+            pos_y = -999
+            # scaleでサイズ指定。
+            scale = 0.7
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP5. M5のSDカード内の画像'/logo320.jpg'を0.4倍、右上揃えで表示
+            print("STEP5. display /logo320.jpg in SD at x0.4 at top right")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320.jpg"
+            # pos_xは0-320で座標指定。999が右揃え
+            pos_x = 999
+            # pos_yは0-240で座標指定。
+            pos_y = 0
+            # scaleでサイズ指定。
+            scale = 0.4
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP6. M5のSDカード内の画像'/logo320.jpg'を0.2倍、左下揃えで表示
+            print("STEP6. display /logo320.jpg in SD at x0.2 at bottom left")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320.jpg"
+            # pos_xは0-320で座標指定。
+            pos_x = 0
+            # pos_yは0-240で座標指定。999が下揃え
+            pos_y = 999
+            # scaleでサイズ指定。
+            scale = 0.2
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP7. M5のSDカード内の画像'/logo320.jpg'を0.3倍で(50,20)に表示
+            print("STEP7. display /logo320.jpg in SD at x0.3 size at (50,20)")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320.jpg"
+            # pos_xは0-320で座標指定。
+            pos_x = 50
+            # pos_yは0-240で座標指定。
+            pos_y = 20
+            # scaleでサイズ指定。
+            scale = 0.3
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            # STEP8. M5のSDカード内の画像'/logo320.jpg'を表示
+            print("STEP8. display /logo320.jpg in SD")
+            # filepathでM5のSDカード内の画像パスを指定
+            filepath = "/logo320.jpg"
+            # pos_xは0-320で座標指定。0が左
+            pos_x = 0
+            # pos_yは0-240で座標指定。0が上
+            pos_y = 0
+            # scaleでサイズ指定。マイナス値で画面に合わせて自動調整。
+            scale = -1.0
+            # set_display_imageを実行
+            m5.set_display_image(filepath, pos_x, pos_y, scale)
+            print("-> Set")
+            # 2秒停止
+            time.sleep(2)
+            print()
+
+            print("Finish!")
+            # 5秒停止
+            time.sleep(5)
+            print()
 
 
 if __name__ == "__main__":
diff --git a/samples/akari_sample/script/5a_reset_m5.py b/samples/akari_sample/script/5a_reset_m5.py
index ed5a983d..b18e5319 100644
--- a/samples/akari_sample/script/5a_reset_m5.py
+++ b/samples/akari_sample/script/5a_reset_m5.py
@@ -10,29 +10,30 @@
 
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
     """
     メイン関数
     """
-    # m5と通信するクラスを呼び出す
-    m5 = M5SerialServer()
-
-    print("Start!")
-    # 2秒停止
-    time.sleep(2)
-
-    # アプリが終了されるまでループする。
-    while True:
-        print("Reset M5")
-        # reset_m5を実行
-        m5.reset_m5()
-        # 結果を出力
-        print("-> Reset")
-        # 5秒停止
-        time.sleep(5)
+    with AkariClient() as akari:
+        # m5と通信するクラスを呼び出す
+        m5 = akari.m5stack
+
+        print("Start!")
+        # 2秒停止
+        time.sleep(2)
+
+        # アプリが終了されるまでループする。
+        while True:
+            print("Reset M5")
+            # reset_m5を実行
+            m5.reset_m5()
+            # 結果を出力
+            print("-> Reset")
+            # 5秒停止
+            time.sleep(5)
 
 
 if __name__ == "__main__":
diff --git a/samples/m5serial_sample/run.py b/samples/m5serial_sample/run.py
index c317a7cf..563f11f0 100644
--- a/samples/m5serial_sample/run.py
+++ b/samples/m5serial_sample/run.py
@@ -11,21 +11,21 @@
 import locale
 import time
 
-from akari_controller.m5serial_server_py import M5SerialServer
-from akari_controller.color import Colors
+from akari_client import AkariClient
+from akari_client.m5stack_client import M5StackSerialClient
+from akari_client.color import Colors
 
 CLOCK_MODE = 1
 SENSOR_MODE = 2
 IO_MODE = 3
 duration = 0.01
 INPUT_INTERVAL = 1  # ボタン再入力受付時間[s]
-m5 = M5SerialServer()
 
 
 class M5serialSample(object):
-    def __init__(self) -> None:
-        # global m5
-        # m5 = M5SerialServer()
+    def __init__(self, m5: M5StackSerialClient) -> None:
+        self.m5 = m5
+
         self.is_initializing = False
         self.button_a_input_time = datetime.datetime.now()
         self.button_b_input_time = datetime.datetime.now()
@@ -36,10 +36,10 @@ def __init__(self) -> None:
     def init_clock_disp(self) -> None:
         global duration
         duration = 0.5
-        m5.set_display_color(Colors.BLACK)
+        self.m5.set_display_color(Colors.BLACK)
         locale.setlocale(locale.LC_TIME, "ja_JP.UTF-8")
         dt_now = datetime.datetime.now()
-        m5.set_display_text(
+        self.m5.set_display_text(
             dt_now.strftime("%Y/%m/%d %a"),
             -999,
             0,
@@ -53,7 +53,7 @@ def init_clock_disp(self) -> None:
     def update_clock_disp(self) -> None:
         if self.disp_mode == CLOCK_MODE:
             dt_now = datetime.datetime.now()
-            m5.set_display_text(
+            self.m5.set_display_text(
                 dt_now.strftime("%H:%M:%S "),
                 -999,
                 -999,
@@ -63,12 +63,12 @@ def update_clock_disp(self) -> None:
             )
 
     def init_sensor_disp(self) -> None:
-        m5.set_display_color(Colors.LIGHTGREY)
+        self.m5.set_display_color(Colors.LIGHTGREY)
         self.is_initializing = False
 
     def update_sensor_disp(self) -> None:
         if self.disp_mode == SENSOR_MODE:
-            m5.set_display_text(
+            self.m5.set_display_text(
                 "明るさ: " + str(self.brightness).rjust(4, " ") + " \n",
                 0,
                 20,
@@ -76,7 +76,7 @@ def update_sensor_disp(self) -> None:
                 text_color=Colors.ORANGE,
             )
         if self.disp_mode == SENSOR_MODE:
-            m5.set_display_text(
+            self.m5.set_display_text(
                 "気圧: " + str(round(self.pressure / 100, 2)).rjust(7, " ") + " hPa  \n",
                 0,
                 100,
@@ -84,7 +84,7 @@ def update_sensor_disp(self) -> None:
                 text_color=Colors.PINK,
             )
         if self.disp_mode == SENSOR_MODE:
-            m5.set_display_text(
+            self.m5.set_display_text(
                 "気温: " + str(round(self.temperature, 2)).rjust(7, " ") + " C \n",
                 0,
                 180,
@@ -93,13 +93,13 @@ def update_sensor_disp(self) -> None:
             )
 
     def init_io_disp(self) -> None:
-        m5.set_display_color(Colors.WHITE)
+        self.m5.set_display_color(Colors.WHITE)
         self.is_initializing = False
 
     def update_io_disp(self) -> None:
         if self.disp_mode == IO_MODE:
             if self.din0:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "din0: " + str(int(self.din0)) + " \n",
                     0,
                     0,
@@ -108,7 +108,7 @@ def update_io_disp(self) -> None:
                     back_color=Colors.RED,
                 )
             else:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "din0: " + str(int(self.din0)) + "    \n",
                     0,
                     0,
@@ -117,7 +117,7 @@ def update_io_disp(self) -> None:
                 )
         if self.disp_mode == IO_MODE:
             if self.din1:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "din1: " + str(int(self.din1)) + " \n",
                     0,
                     40,
@@ -126,7 +126,7 @@ def update_io_disp(self) -> None:
                     back_color=Colors.RED,
                 )
             else:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "din1: " + str(int(self.din1)) + "    \n",
                     0,
                     40,
@@ -135,7 +135,7 @@ def update_io_disp(self) -> None:
                 )
         if self.disp_mode == IO_MODE:
             if self.ain0 > 0:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "ain0: " + str(int(self.ain0)).rjust(3, " ") + " \n",
                     0,
                     80,
@@ -144,7 +144,7 @@ def update_io_disp(self) -> None:
                     back_color=Colors.GREEN,
                 )
             else:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "ain0: " + str(int(self.ain0)).rjust(3, " ") + "    \n",
                     0,
                     80,
@@ -153,7 +153,7 @@ def update_io_disp(self) -> None:
                 )
         if self.disp_mode == IO_MODE:
             if self.dout0:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "dout0: " + str(int(self.dout0)) + " \n",
                     0,
                     120,
@@ -162,7 +162,7 @@ def update_io_disp(self) -> None:
                     back_color=Colors.RED,
                 )
             else:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "dout0: " + str(int(self.dout0)) + "    \n",
                     0,
                     120,
@@ -171,7 +171,7 @@ def update_io_disp(self) -> None:
                 )
         if self.disp_mode == IO_MODE:
             if self.dout1:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "dout1: " + str(int(self.dout1)) + " \n",
                     0,
                     160,
@@ -180,7 +180,7 @@ def update_io_disp(self) -> None:
                     back_color=Colors.RED,
                 )
             else:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "dout1: " + str(int(self.dout1)) + "    \n",
                     0,
                     160,
@@ -189,7 +189,7 @@ def update_io_disp(self) -> None:
                 )
         if self.disp_mode == IO_MODE:
             if self.pwmout0 > 0:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "pwmout0: " + str(int(self.pwmout0)).rjust(3, " ") + " \n",
                     0,
                     200,
@@ -198,7 +198,7 @@ def update_io_disp(self) -> None:
                     back_color=Colors.BLUE,
                 )
             else:
-                m5.set_display_text(
+                self.m5.set_display_text(
                     "pwmout0: " + str(int(self.pwmout0)).rjust(3, " ") + "    \n",
                     0,
                     200,
@@ -207,7 +207,7 @@ def update_io_disp(self) -> None:
                 )
 
     def display_update(self) -> None:
-        data = m5.get()
+        data = self.m5.get()
         self.din0 = data["din0"]
         self.din1 = data["din1"]
         self.ain0 = data["ain0"]
@@ -261,10 +261,11 @@ def display_update(self) -> None:
 
 
 def main() -> None:
-    m5_serial_sample = M5serialSample()
-    while True:
-        m5_serial_sample.display_update()
-        time.sleep(0.01)
+    with AkariClient() as akari:
+        m5_serial_sample = M5serialSample(akari.m5stack)
+        while True:
+            m5_serial_sample.display_update()
+            time.sleep(0.01)
 
 
 if __name__ == "__main__":
diff --git a/sdk/akari_client/README.md b/sdk/akari_client/README.md
new file mode 100644
index 00000000..a68b4ec2
--- /dev/null
+++ b/sdk/akari_client/README.md
@@ -0,0 +1,7 @@
+Akariをdynamixelで動かすためのパッケージ
+
+## インストール
+
+```
+sudo python setup.py install
+```
diff --git a/sdk/akari_client/akari_client/__init__.py b/sdk/akari_client/akari_client/__init__.py
new file mode 100644
index 00000000..c5df3971
--- /dev/null
+++ b/sdk/akari_client/akari_client/__init__.py
@@ -0,0 +1,2 @@
+from .akari_client import AkariClient  # NOQA
+from .color import Color, Colors  # NOQA
diff --git a/sdk/akari_client/akari_client/akari_client.py b/sdk/akari_client/akari_client/akari_client.py
new file mode 100644
index 00000000..732759e2
--- /dev/null
+++ b/sdk/akari_client/akari_client/akari_client.py
@@ -0,0 +1,32 @@
+from __future__ import annotations
+
+import contextlib
+from typing import Any
+
+from .joint_manager import JointManager
+from .m5stack_client import M5StackSerialClient
+
+
+class AkariClient:
+    def __init__(self) -> None:
+        self._stack = contextlib.ExitStack()
+
+        self._joints = self._stack.enter_context(JointManager())
+        self._m5stack = self._stack.enter_context(M5StackSerialClient())
+
+    def __enter__(self) -> AkariClient:
+        return self
+
+    def __exit__(self, exc_type: Any, exc: Any, tb: Any) -> None:
+        self.close()
+
+    def close(self) -> None:
+        self._stack.close()
+
+    @property
+    def joints(self) -> JointManager:
+        return self._joints
+
+    @property
+    def m5stack(self) -> M5StackSerialClient:
+        return self._m5stack
diff --git a/sdk/akari_controller/akari_controller/color.py b/sdk/akari_client/akari_client/color.py
similarity index 100%
rename from sdk/akari_controller/akari_controller/color.py
rename to sdk/akari_client/akari_client/color.py
diff --git a/sdk/akari_controller/akari_controller/dynamixel_communicator.py b/sdk/akari_client/akari_client/dynamixel_communicator.py
similarity index 100%
rename from sdk/akari_controller/akari_controller/dynamixel_communicator.py
rename to sdk/akari_client/akari_client/dynamixel_communicator.py
diff --git a/sdk/akari_controller/akari_controller/dynamixel_controller.py b/sdk/akari_client/akari_client/dynamixel_controller.py
similarity index 100%
rename from sdk/akari_controller/akari_controller/dynamixel_controller.py
rename to sdk/akari_client/akari_client/dynamixel_controller.py
diff --git a/sdk/akari_controller/akari_controller/joint_controller.py b/sdk/akari_client/akari_client/joint_controller.py
similarity index 100%
rename from sdk/akari_controller/akari_controller/joint_controller.py
rename to sdk/akari_client/akari_client/joint_controller.py
diff --git a/sdk/akari_controller/akari_controller/akari_controller.py b/sdk/akari_client/akari_client/joint_manager.py
similarity index 98%
rename from sdk/akari_controller/akari_controller/akari_controller.py
rename to sdk/akari_client/akari_client/joint_manager.py
index a4c1db93..448c4483 100644
--- a/sdk/akari_controller/akari_controller/akari_controller.py
+++ b/sdk/akari_client/akari_client/joint_manager.py
@@ -32,7 +32,7 @@ class AkariJoint(str, enum.Enum):
 ]
 
 
-class AkariController:
+class JointManager:
     def __init__(self, communicator: Optional[DynamixelCommunicator] = None) -> None:
         """Akariの関節制御コントローラ"""
 
@@ -51,7 +51,7 @@ def __init__(self, communicator: Optional[DynamixelCommunicator] = None) -> None
                 self._communicator,
             )
 
-    def __enter__(self) -> AkariController:
+    def __enter__(self) -> JointManager:
         return self
 
     def __exit__(self, exc_type: Any, exc: Any, tb: Any) -> None:
diff --git a/sdk/akari_controller/akari_controller/m5serial_communicator.py b/sdk/akari_client/akari_client/m5serial_communicator.py
similarity index 100%
rename from sdk/akari_controller/akari_controller/m5serial_communicator.py
rename to sdk/akari_client/akari_client/m5serial_communicator.py
diff --git a/sdk/akari_controller/akari_controller/m5serial_server_py.py b/sdk/akari_client/akari_client/m5stack_client.py
similarity index 97%
rename from sdk/akari_controller/akari_controller/m5serial_server_py.py
rename to sdk/akari_client/akari_client/m5stack_client.py
index f1490cbd..135a7d61 100644
--- a/sdk/akari_controller/akari_controller/m5serial_server_py.py
+++ b/sdk/akari_client/akari_client/m5stack_client.py
@@ -9,12 +9,6 @@
 from .color import Color
 from .m5serial_communicator import M5ComDict, M5SerialCommunicator
 
-"""
-m5serial_server_py
-Created on 2020/05/08
-@author: Kazuya Yamamoto
-"""
-
 
 class CommandId(enum.IntEnum):
     RESETALLOUT = 0
@@ -42,7 +36,7 @@ def serialize(self) -> Dict[str, Any]:
         return {"do0": int(self.dout0), "do1": int(self.dout1), "po0": self.pwmout0}
 
 
-class M5SerialServer:
+class M5StackSerialClient:
     def __init__(self, communicator: Optional[M5SerialCommunicator] = None) -> None:
         self._stack = contextlib.ExitStack()
         if communicator is None:
@@ -56,7 +50,7 @@ def __init__(self, communicator: Optional[M5SerialCommunicator] = None) -> None:
         self._communicator.start()
         time.sleep(0.1)
 
-    def __enter__(self) -> M5SerialServer:
+    def __enter__(self) -> M5StackSerialClient:
         return self
 
     def __exit__(self, exc_type: Any, exc: Any, tb: Any) -> None:
diff --git a/sdk/akari_controller/akari_controller/py.typed b/sdk/akari_client/akari_client/py.typed
similarity index 100%
rename from sdk/akari_controller/akari_controller/py.typed
rename to sdk/akari_client/akari_client/py.typed
diff --git a/sdk/akari_controller/setup.py b/sdk/akari_client/setup.py
similarity index 64%
rename from sdk/akari_controller/setup.py
rename to sdk/akari_client/setup.py
index d4383909..3018b541 100644
--- a/sdk/akari_controller/setup.py
+++ b/sdk/akari_client/setup.py
@@ -1,13 +1,13 @@
 from setuptools import find_packages, setup
 
 setup(
-    name="akari_controller",
+    name="akari-client",
     version="0.2.2",
     packages=find_packages(exclude=["tests"]),
-    description="Akari controller by dynamixel_sdk. python package",
+    description="Akari Python package",
     long_description=open("README.md").read(),
     author="akari",
     author_email="akari.tmc@gmail.com",
     install_requires=["dynamixel_sdk"],
-    package_data={"akari_controller": ["py.typed"]},
+    package_data={"akari_client": ["py.typed"]},
 )
diff --git a/sdk/akari_controller/README.md b/sdk/akari_controller/README.md
deleted file mode 100644
index de2ca3a7..00000000
--- a/sdk/akari_controller/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-Akariをdynamixelで動かすためのパッケージ
-
-## インストール
-
-```
-sudo python setup.py install
-```
-
-## 機能
-
-### `class AkariController`
-
-akari専用のコントローラ。
-
-pan関節とtilt関節が存在し、初期化時に可動範囲制限が設定される。
-
-関節角度や速度の指定、および関節角度の取得などが可能。
-
-### `class DynamixelController`
-
-dynamixelのコントローラ。
-
-基本的なパケット通信を行う。
diff --git a/tools/python/baudrate_set.py b/tools/python/baudrate_set.py
index 9c76b601..caa88642 100755
--- a/tools/python/baudrate_set.py
+++ b/tools/python/baudrate_set.py
@@ -1,11 +1,11 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from akari_controller.dynamixel_communicator import (
+from akari_client.dynamixel_communicator import (
     DynamixelCommunicator,
     get_baudrate_control_value,
 )
-from akari_controller.dynamixel_controller import DynamixelControlTable
+from akari_client.dynamixel_controller import DynamixelControlTable
 
 # Note: you can choose 57600 or 1000000 as a baud rate value for now.
 CURRENT_BAUDRATE = 57600
diff --git a/tools/python/m5_init.py b/tools/python/m5_init.py
index 1ed86350..66f3c2c0 100644
--- a/tools/python/m5_init.py
+++ b/tools/python/m5_init.py
@@ -7,11 +7,12 @@
 @author: Kazuya Yamamoto
 """
 
-from akari_controller.m5serial_server_py import M5SerialServer
+from akari_client import AkariClient
 
 
 def main() -> None:
-    M5SerialServer()
+    with AkariClient() as akari:
+        akari.m5stack.get()
 
 
 if __name__ == "__main__":
diff --git a/tools/python/servo_off.py b/tools/python/servo_off.py
index 21b0ce34..4f5882c4 100755
--- a/tools/python/servo_off.py
+++ b/tools/python/servo_off.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from akari_controller.akari_controller import AkariController
+from akari_client import AkariClient
 
-with AkariController() as controller:
-    controller.disable_all_servo()
+with AkariClient() as akari:
+    akari.joints.disable_all_servo()
diff --git a/tools/python/servo_start.py b/tools/python/servo_start.py
index 1d33888d..0acc2d74 100644
--- a/tools/python/servo_start.py
+++ b/tools/python/servo_start.py
@@ -1,10 +1,10 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from akari_controller.akari_controller import AkariController
+from akari_client import AkariClient
 
-with AkariController() as controller:
-    controller.enable_all_servo()
-    controller.set_joint_velocities(pan=8, tilt=8)
-    controller.set_joint_accelerations(pan=8, tilt=8)
-    controller.move_joint_positions(pan=0, tilt=0)
+with AkariClient() as akari:
+    akari.joints.enable_all_servo()
+    akari.joints.set_joint_velocities(pan=8, tilt=8)
+    akari.joints.set_joint_accelerations(pan=8, tilt=8)
+    akari.joints.move_joint_positions(pan=0, tilt=0)


Test patch:
diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml
index 39fe2efc..6855482c 100644
--- a/.github/workflows/python-test.yml
+++ b/.github/workflows/python-test.yml
@@ -31,4 +31,4 @@ jobs:
         poetry run pysen run lint
     - name: Run pytest
       run: |
-        poetry run pytest -v sdk/akari_controller/tests
+        poetry run pytest -v sdk/akari_client/tests
diff --git a/sdk/akari_controller/akari_controller/__init__.py b/sdk/akari_client/tests/akari_controller_tests/__init__.py
similarity index 100%
rename from sdk/akari_controller/akari_controller/__init__.py
rename to sdk/akari_client/tests/akari_controller_tests/__init__.py
diff --git a/sdk/akari_controller/tests/akari_controller_tests/mocks.py b/sdk/akari_client/tests/akari_controller_tests/mocks.py
similarity index 100%
rename from sdk/akari_controller/tests/akari_controller_tests/mocks.py
rename to sdk/akari_client/tests/akari_controller_tests/mocks.py
diff --git a/sdk/akari_controller/tests/akari_controller_tests/test_color.py b/sdk/akari_client/tests/akari_controller_tests/test_color.py
similarity index 96%
rename from sdk/akari_controller/tests/akari_controller_tests/test_color.py
rename to sdk/akari_client/tests/akari_controller_tests/test_color.py
index 7777d761..0ff2339e 100644
--- a/sdk/akari_controller/tests/akari_controller_tests/test_color.py
+++ b/sdk/akari_client/tests/akari_controller_tests/test_color.py
@@ -1,4 +1,4 @@
-from akari_controller.color import Color, Colors
+from akari_client.color import Color, Colors
 
 
 def test_color() -> None:
diff --git a/sdk/akari_controller/tests/akari_controller_tests/test_dynamixel_controller.py b/sdk/akari_client/tests/akari_controller_tests/test_dynamixel_controller.py
similarity index 97%
rename from sdk/akari_controller/tests/akari_controller_tests/test_dynamixel_controller.py
rename to sdk/akari_client/tests/akari_controller_tests/test_dynamixel_controller.py
index 494d6100..376c49ec 100644
--- a/sdk/akari_controller/tests/akari_controller_tests/test_dynamixel_controller.py
+++ b/sdk/akari_client/tests/akari_controller_tests/test_dynamixel_controller.py
@@ -2,8 +2,8 @@
 from typing import cast
 
 import pytest
-from akari_controller.dynamixel_communicator import DynamixelCommunicator
-from akari_controller.dynamixel_controller import (
+from akari_client.dynamixel_communicator import DynamixelCommunicator
+from akari_client.dynamixel_controller import (
     DynamixelControlItem,
     DynamixelController,
     DynamixelControllerConfig,
diff --git a/sdk/akari_controller/tests/akari_controller_tests/test_m5serial_server_py.py b/sdk/akari_client/tests/akari_controller_tests/test_m5serial_server_py.py
similarity index 78%
rename from sdk/akari_controller/tests/akari_controller_tests/test_m5serial_server_py.py
rename to sdk/akari_client/tests/akari_controller_tests/test_m5serial_server_py.py
index 38513747..e7775a70 100644
--- a/sdk/akari_controller/tests/akari_controller_tests/test_m5serial_server_py.py
+++ b/sdk/akari_client/tests/akari_controller_tests/test_m5serial_server_py.py
@@ -1,8 +1,8 @@
 from typing import cast
 
 import pytest
-from akari_controller.m5serial_communicator import M5SerialCommunicator
-from akari_controller.m5serial_server_py import M5SerialServer, _PinOut
+from akari_client.m5serial_communicator import M5SerialCommunicator
+from akari_client.m5stack_client import M5StackSerialClient, _PinOut
 
 from .mocks import MockM5Communicator
 
@@ -24,7 +24,7 @@ def test__pin_out() -> None:
 
 
 def test_set_dout(mock_communicator: M5SerialCommunicator) -> None:
-    client = M5SerialServer(mock_communicator)
+    client = M5StackSerialClient(mock_communicator)
 
     client.set_dout(0, True)
     client.set_dout(1, True)
@@ -34,7 +34,7 @@ def test_set_dout(mock_communicator: M5SerialCommunicator) -> None:
 
 
 def test_set_pwmout(mock_communicator: M5SerialCommunicator) -> None:
-    client = M5SerialServer(mock_communicator)
+    client = M5StackSerialClient(mock_communicator)
 
     client.set_pwmout(0, 255)
 
diff --git a/sdk/akari_controller/tests/akari_controller_tests/__init__.py b/sdk/akari_controller/tests/akari_controller_tests/__init__.py
deleted file mode 100644
index e69de29b..00000000