Keita_Nakamoriです。
前回はサーボモータSG92Rをラズパイに直結して動かしてみました。
今回はサーボモータを16個同時に動かすことができるサーボドライバPCA9685を使って、SG90とSG92Rを同時に動かしてみようと思います。
動画
基本スペック
- I2C周波数範囲:24-1526Hz
- 動作電圧:2.3-5.5V
- 入出力の許容電圧:5.5V
- 最大62個のPCA9685が接続できます¥。よって992個のサーボモータを同時に動かせます。
余談:I2Cはアイ スクウエア シーと呼ぶそうです。
ピン
左端のピン
は、上から
- GND:ラズパイGIPIOのグランドに接続する
- DE:??? どこにも繋げない
- SCL:シリアル通信のクロック ラズパイGIPIOのSCL1に繋ぐ
- SDA:シリアル通信のデータ ラズパイGPIOのSDA1に繋ぐ
- VCC:プラス電圧 ラズパイGPIOの+5Vに繋ぐ
- V+:??? どこにも繋げない
下端のピン
はサーボモータを接続します、左から0~15番が振られてあり合計16個のサーボモータと接続できます。
上から、
- PWM:サーボモータのPWM=オレンジ
- V+:サーボモータの赤
- GND:サーボモータの茶
上端のコネクタ
は、電源供給です。
- 左はV+:ラズパイの5Vに繋ぎます
- 右はGND:ラズパイのGNDに繋ぎます
- 今回はラズパイのGPIOに繋ぎましたが、16個サーボモータを繋げるときは、別途電源を取らなくてはならないと思います。
制御の話
- PCA9685はPWMで動きます。
- パルス幅によってサーボモータの回転角が0~180degが決定されます。
- 例えば 0.5ms幅のとき0deg、1.5ms幅のとき90deg、2.5ms幅のとき180degになったりします。(周波数で変更できます。周波数が高いほうが高速で制御できます。)
- アナログサーボの周波数範囲は30~60Hzのものがほとんどです。
- 例えば、周波数f=60Hzのとき周期はT=1/f=17ms です。(早い方がいいので60Hzで考えましょう。)
- 周期Tの分解能は12bitなので、周期Tを2^12=4096分割できます。1分割分を1ステップと呼ぶことにしましょう。
- 周期17msを4096分割できるので、1ステップあたり0.004150390625ms になります。
- パルス幅を0.5msにしたければ、ステップは0.5/(17/4096)=120.47058823529412ステップになります。
- サーボモータ角度をodegにしたいときは0.5msですから、120ステップをONして、残りの(4096-120)をOFFにすれば良いのです。
サーボ回転角度[deg] | ONの時間 [ms] | ステップ数 |
0 | 0.5 | 120 |
60 | 1.0 | 240 |
90 | 1.5 | 361 |
120 | 2.0 | 481 |
180 | 2.5 | 602 |
- サーボ回転角度を0degから180degにするためには、(602-120)=482ステップになります。
- 1degあたりのステップ数は 482ステップ/180deg = 2.7 (step/deg)
- なので任意のサーボ回転角度θでステップ数Nsを表現すると、Ns=120+2.7θ ということになります。
モジュール Adafruit_PCA9685
pip3 install Adafruit_PCA9685 したところ拒否されました。
pipのバージョンを上げて再チャレンジします。
pip3 install –upgrade pip3 と書いたところ pip3でなくてpipで書けみたいなことを言われました。
pip install –upgrade pip と書いたところ許可がないといっております。
なので、スーパーDOしてみます。
sudo pip install –upgrade pip これでOKでした
Successfully uninstalled pip-19.0.3
Successfully installed pip-19.1.1
そして再度チャレンジ
pip3 install Adafruit_PCA9685 [Errno 13] 許可がありません
なるほど読めました。やはり須藤ですね。
sudo pip3 install Adafruit_PCA9685
Successfully installed Adafruit-GPIO-1.0.3 Adafruit-PCA9685-1.0.1 adafruit-pureio-0.2.3
これでやっとAdafruit_PCA9685モジュールがインストールできました。
pip freezeすると
Adafruit-GPIO==1.0.3
Adafruit-PCA9685==1.0.1
Adafruit-PureIO==0.2.3
が入っていました。注意点として、importするときはAdafruitの後ろにはハイフンではなくアンダースコアになります。
スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import Adafruit_PCA9685 import time # pwm制御のためのインスタンスを作成する pwm = Adafruit_PCA9685.PCA9685() # 周波数は60Hzにする pwm.set_pwm_freq(60) # サーボコントロール cnt =1 while True: print("revolution : ",cnt) # サーボNO.0 pwm.set_pwm(0, 0, 120) time.sleep(0.3) pwm.set_pwm(0, 0, 602) time.sleep(0.3) # サーボNO.1 pwm.set_pwm(1, 0, 240) time.sleep(0.05) pwm.set_pwm(1, 0, 481) time.sleep(0.05) pwm.set_pwm(1, 0, 240) time.sleep(0.05) pwm.set_pwm(1, 0, 481) time.sleep(0.05) cnt += 1 |
余談
ラズパイの操作はWindowsマシンからrealVNC Viewerでリモートしているのですが、ラズパイ側のidleに書いたスクリプトをcnt+c しても Windows側にcnt+v できません。
コツがありまして、ラズパイ側のText Editorに一旦貼り付けた後に、それをcnt+cしてから、Windows側にcnt+v すると、しっかりと貼り付けられます。
どうぞお試しあれ。