DobotMagicianをpythonで動かす

こちらのライブラリを使用して,PythonからDobot Magicianを動作させたいと思います.

https://github.com/luismesas/pydobot

### 環境

```
$ lscpu
Architecture: x86_64

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
```

### install

以下コマンドでpipからインストールします.

```
pip3 install pydobot
```

自分の環境では以下のバージョンがインストールされました.

```
$ pip3 show pydobot

Name: pydobot
Version: 1.3.2
Summary: Python library for Dobot Magician
Home-page: https://github.com/luismesas/pydobot
Author: Luis Mesas
Author-email: luismesas@gmail.com
License: UNKNOWN
Location: /home/hoshina/.local/lib/python3.8/site-packages
Requires: pyserial
Required-by: 
```

### 実行

まずdobotに電源を入れPCとUSBで接続し,`dmesg`コマンドでデバイス名を確認します.確認すると`cp210x converter`が`ttyUSB0`に割り当てられたと最終行に書いてあります.Linuxでは,デバイスは`/dev/`ディレクトリ内に割り当てられるので(参考:https://qiita.com/nys9302/items/a8ddeedd3cd9d0deb332)
`/dev/ttyUSB0`がDobotMagicianの割り当てられたファイル名となります.ちなみにPCから見るとDobotMagicianは`Product: CP2102 USB to UART Bridge Controller`という内容から`CP2102 USB to UART Bridge Controller`という製品名として認識されていることが分かります.そして,基板上にUSB-UART変換コントロールCP2102チップ(参考:秋月電子 CP2102使用 USBシリアル変換モジュール https://akizukidenshi.com/catalog/g/gK-14993/ )が搭載されておりPCとのインターフェイスの役割をしているということが分かります.

```
$ dmesg
[43589.052023] usb 1-2: new full-speed USB device number 9 using xhci_hcd
[43589.232192] usb 1-2: New USB device found, idVendor=10c4, idProduct=ea60, bcdDevice= 1.00
[43589.232207] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[43589.232213] usb 1-2: Product: CP2102 USB to UART Bridge Controller
[43589.232219] usb 1-2: Manufacturer: Silicon Labs
[43589.232223] usb 1-2: SerialNumber: 0001
[43589.241480] cp210x 1-2:1.0: cp210x converter detected
[43589.242146] usb 1-2: cp210x converter now attached to ttyUSB0
```

pydobotのサンプルをもとに作成した以下のプログラムを実行します.port名にはDobotMagicianのCP2102が割り当てられたファイル名を記載します.

```python:basic_example.py
from serial.tools import list_ports

import pydobot

available_ports = list_ports.comports()
print(f'available ports: {[x.device for x in available_ports]}')
port = available_ports[0].device

device = pydobot.Dobot(port=port, verbose=True)

(x, y, z, r, j1, j2, j3, j4) = device.pose()
print(f'x:{x} y:{y} z:{z} j1:{j1} j2:{j2} j3:{j3} j4:{j4}')

device.move_to(x + 20, y, z, r, wait=False)
device.move_to(x, y, z, r, wait=True)  # we wait until this movement is done before continuing

device.close()
```

まずデバイスの読み書きを許可します.(参考:chmodコマンド https://atmarkit.itmedia.co.jp/ait/articles/1605/23/news020.html)

```
sudo chmod 666
```

そして実行します.

```bash:実行
python3 basic_example.py
```

実行するとDobotMagicianが現在位置からx方向に20mm移動し,もとの位置に戻るという動作を2回繰り返します.

# suction cup（ポンプ) の on/off

配線はポンプのシール記載の通り,ポンプGP1をMagician背面のGP1に,ポンプのSW1にGP1を接続

3秒ポンプを起動,し停止

```
from serial.tools import list_ports
import time

import pydobot

available_ports = list_ports.comports()
print(f'available ports: {[x.device for x in available_ports]}')
port = available_ports[0].device

device = pydobot.Dobot(port=port, verbose=True)

device.suck(True)

time.sleep(3)

device.suck(False)
```

# エラー対処

## 通信がうまく行かない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/499a1c7a-3dce-ea6c-9ae6-e2c29b9effb0.png)

- usb device '/dev/ttyUSB*'が認識されていて以下のエラーが出た場合リセットボタンを押す

- リセットや再起動をしても治らない。DobotStudioに接続もできない場合。以下の記事を参考にFirmwareを書き直す。

https://t.co/qp1VNiBD2S

- あとDobotMagicianのファームウェアバージョンが最新(現時点ではv3.7.0)でないとうまく動作しない。v1.0.0では通信部分が不安定に。