質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

392閲覧

GPIOのPythonコードで4軸個々に手動SWで動かす件について

COCCOP

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/01/10 09:48

編集2018/01/11 09:21

ラズベリーパイのGPIOによるPythonの事で下記コードです

py3

1import RPi.GPIO as GPIO 2from time import sleep 3 4# ポート番号やサーボモーターの情報を指定 5SV_PORT = 2 6 7SW1_PORT = 20 8SW2_PORT = 21 9 10SV_FREQ = 50 # 20ms(50Hz) 11SV_DUTY_OFFSET = 0.025 12SV_DUTY_RES = (2.4 - 0.5) / 20 / 180 13 14# GPIOの設定 15GPIO.setmode(GPIO.BCM) 16GPIO.setup(SV_PORT , GPIO.OUT) # サーボモーターの設定 17GPIO.setup([SW1_PORT , SW2_PORT], 18GPIO.IN, 19pull_up_down=GPIO.PUD_DOWN) # ボタンの設定 20 21# PWMを利用する準備 22servo = GPIO.PWM(SV_PORT, SV_FREQ) 23servo.start(0) 24sleep(0.3) 25 26# サーボの角度を計算し変更する関数 27def set_angle(angle): 28if angle < -90: angle = -90 29if angle > 90: angle = 90 30degree = (angle + 90) 31duty = (SV_DUTY_OFFSET + SV_DUTY_RES * degree) * 100 32print("angle=",angle,"duty=", int(duty)) 33servo.ChangeFrequency(SV_FREQ) 34servo.ChangeDutyCycle(duty) 35 36# ボタンに応じてサーボの角度を変える 37angle = 0 38set_angle(angle) 39while True: 40try: 41# ボタンの状態を監視 42if GPIO.input(SW1_PORT) == GPIO.HIGH: 43angle -= 10 44set_angle(angle) 45if GPIO.input(SW2_PORT) == GPIO.HIGH: 46angle += 10 47set_angle(angle) 48sleep(0.1) 49except KeyboardInterrupt: 50break 51 52GPIO.cleanup()

今現在1軸のみでスイッチ1またはスイッチ2を押すとサーボが動く現状で4軸ある場合のコードの書き方をおしえてください。
現状4軸あるので個々に全て手動スイッチを用いて動かしたいのが目的です。わかるかたいればよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/10 11:14

Pythonはインデントで構造が決まるので、teratailへはコード用の入力をした方が良いと思います。shit+@で`が入力できるのですが、```Python(改行)```の形でコード用に表示できます。
COCCOP

2018/01/10 14:56

たまにはコードかいていただけますか?かいてくれないと先に進みません
can110

2018/01/11 09:38

コード中のインデントが消えているようです(最低限構文エラーの出ないコードを提示ください)
COCCOP

2018/01/11 09:40

同時に4個サーボを動かしたいわけではないです。ロボットなので動かすときは1軸だけで動けばいいので
can110

2018/01/11 09:45

この欄は「質問への追記・修正、ベストアンサー選択の依頼」のためにあります。補足情報などがある場合は、分かりやすいように質問本文を修正ください。
COCCOP

2018/01/11 23:57

低評価つける前にコードかけよ。できねーやつが評価するな!!
guest

回答1

0

検証できるだけの道具が手元にありませんので、参考になる情報を書きます。

■RPiだけの制御の場合
まず、stackoverflowにあるように、RPiだけでは1つしか(バージョンの違うRPiでも2つまでしか)PWMを制御できません。

ですので、もし4つを制御したいのであれば、

今現在1軸のみでスイッチ1またはスイッチ2を押すとサーボが動く

ここまでできているそうですので、(無駄にお金がかかるので芸がないですが)複数個のRPiを並べれば対応できそうです。

■RPi+αの場合
[RPi1つで10個のサーボモータを制御した猛者のブログ](http://arkouji.cocolog-nifty.com/blog/2014/05/raspberr
y-pi10-.html)がありましたので、こちらが参考になると思います。

原理は、I2Cを使ってPCA9685という16chのコントローラーを制御して、その制御先がサーボモータというもののようです。なので制御できる最大数は16個でしょうか。しかし、この場合、コードの全面的書き替えが必要になると思います。公式GITのコードを参考にスイッチ部分を加えるのが良いと思います。

初めに書いた通り手元に検証できる道具がありませんので、動く保証あるコードは書けません。

質問のコードが書けるのであれば、この基盤さえあればすぐ4つ制御できると思います。

投稿2018/01/10 22:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

COCCOP

2018/01/11 09:39

同時に4個サーボを動かしたいわけではないです。ロボットなので動かすときは1軸だけで動けばいいので
退会済みユーザー

退会済みユーザー

2018/01/11 10:56 編集

らじゃ、ちょっと考えます。 --- あまり良いやり方ではない(CPU負荷でズレたり、ピッチがオリジナルのPWMほど細かくない)ようですが、wiringpiを使うと「ソフトウエアPWM」でコントロールできるそうです。参考まで。
COCCOP

2018/01/11 11:53

らずぱいもパイソンじゃなくてラダー使えればこんなに苦労しないんですけどね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問