ラズパイでPCA9685

Python

●2019.08.17
お盆休み中夏休みの宿題を(笑)と雲台を購入してモーターももう一つ購入。XY軸を動かしてラズパイカメラをやってみることに。まずは基礎実験。雲台は使えたけれど、改造というか加工をしないと使える物にはならない。お金を捨てるつもりで購入した方がいい。まあ自分ではなかなか作れないレベルだから加工も仕方ない。所詮はおいらが使うものだし・・・。


何だか新たに購入したモータがしゃっくりを起こす。PCA9685にI2Cで初期化コマンドを送る段階でもしゃっくる・・・。なんだか一気にモチベーションが下がる。新たに購入したモータがNGかと思ったのでラズパイのPWMで以前の動作を行わせてみたら問題なく動作。こうなると考えられるのは以下か。出るポジションが大体同じような場所であるからストレージオシロでPWMの波形を確認すれば現象は確認できると思われる。I2Cアナライザで連続でコマンド解析を行うことも有用だろう。ただしストレージは我が家にはない。田舎の物置の100Mストレージは埃まみれだから使えるか・・・。そうそうX軸のモータはしゃくらないからちょっと原因を確定には無理があるかな。
このところプログラマーで食ってるからハードは遠くなりにけり。基板のでき悪いか。クロックの信号源が怪しいような。価格が価格だからね。もう1台いいやつ購入して様子みようかと思う。まあラズパイで2軸制御できるから今回の所要には使わなくてもと思うけど。カメラ付けて動作させるとリアルタイムに画像を追ってくれるか。つまりマルチスレッド的な動作はと思いあぐねたりする。具体的なインプリメントはまだ先。
・電源
・I2C通信
・この基板のクロックの精度

●2019.08.11
結局はお世話になるだろうということで定番らしいPCA9685を購入。結構Amazonに多くある。その中で今回購入のポイントは手持ちのACアダプタ出力コネクタを挿せば実験電源が得られるコネクタが欲しかったから。見事手持ちのものを電源として使えるように。結構うれしい。チャイナのもので結構おまけが充実しているものある。このおまけだけは意外と入手できない。ところでこの基板のICってLEDの制御にも使える。こちらが本当の使用方法なのか。暇があったら挑戦してみたい。
[GPG] PCA9685 16Channel 12bit PWM サーボドライバー
Arduino等の電子工作用 (Droidfun型)
価格: ¥868


●使用条件
ラズパイは3B+・Python3.5・I2Cインターフェースで使用する。

ラズパイからの接続は基板のシルクを見れば分かる。VCCはラズパイの3.3V。+5Vはまずはラズパイから供給。参考にして実働したのがここ。多謝。

一応ラズパイの電源を落として配線する。この辺は一応リスクを知ってる弱電屋なので最初は守る。配線が終了したらラズパイのI2C機能有効設定して以下のコマンドでi2cアドレス0x40が出ていることを確認。0x70も表示されるが、皆さんの例に習って0x40で今回は行う。
以下のコマンドは確かapt-getでインスト必要だった気がする。
$i2cdetect -y 1

pythonで動作させるにはAdafruitのライブラリとサンプルを使うのが定番のようだ。
WEB上に解説がいくつもある。あちらこちらといくつかやってみる。毎度うまく行かないこと多し・・・。
動かないとなればもはやな世界だ。他力本願なこの世界。目標は6足のロボット歩行だからここでトラブっているというのも辛い。以下はどのWEBにもある導入手順となっている。
$ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
$ cd Adafruit_Python_PCA9685
$ sudo python3 setup.py install

pythonは3.5を使用しているので上記python3でsetup。pythonで行う例が多いがエラーで設定できなかった。まあ3.5でやりたいし動作したからいいかな。
以下のソース内のchannel = 0 は16チャンネルの1番目のピン。channel = 1 だと2番めのピンで制御できる。そのまま順番に16番ピンは15を指定する。
※ソースコード中のモータの設定値600だとモータがビビる。モータの問題のような・・・。設定値588ならビビらず開き具合は180度は問題ないようだ。電源を外部からモータに供給したが変わらなかった。供給電源の容量不足ではないようだ。それにしてもラズパイの稲妻マークは気に入らないな。3B+でなく3Bなら稲妻出ないから3B+の不具合だ。絶対そうだ。電源3Aでも稲妻マークだから。

#!/usr/bin/python3
# coding: utf-8

from __future__ import division
import time
import Adafruit_PCA9685

# Uncomment to enable debug output.
#import logging
#logging.basicConfig(level=logging.DEBUG)

pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)
TM=0.5
count=0

if __name__ == '__main__':
try:
    while True:
        channel = 0
        pwm.set_pwm(channel, 0, 150)
        time.sleep(TM)
        pwm.set_pwm(channel, 0, 375)
        time.sleep(TM)
        pwm.set_pwm(channel, 0, 600)
        time.sleep(TM)
        pwm.set_pwm(channel, 0, 375)
        time.sleep(TM)
       count = count + 1
       print('count--',count)

except KeyboardInterrupt:
pass

pwm.set_pwm(0, 0, 375)
time.sleep(1)
print("END.\n")
No tags for this post.
タイトルとURLをコピーしました