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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

970閲覧

ラズパイを用いてサーボモーターと超音波センサを同時に動かしたい

gurolia

総合スコア0

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/12/11 14:50

編集2022/12/12 06:13

前提

ラズパイを用いて超音波センサとサーボモーターを同時に動かすプログラミングを作っているのですが上手く行きません。超音波センサのプログラミング(距離を検出したものをcsvファイルに書き表すもの)とサーボモーター(角度指定のデューティー比で角度を少しずつ変え、ちょっとずつ回すもの)の2つがありこれを組み合わせたいという内容です。プログラミング自体、友人に教わりながらでやってました。しかし事情があって自分で作らなければならなくなったのですが初心者すぎるというのもあり、皆様を頼ってしまう形になってしまいました。初歩的な質問なのかもしれませんが正解例を教えて下さるとありがたいです。よろしくお願い致します。

実現したいこと

・loop文の中でサーボモーターで回しながら超音波センサで距離を検出したい

発生している問題・エラーメッセージ

/home/robot/raphael-kit/python/ultra2.py:16: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. GPIO.setup(Servo_pin, GPIO.OUT) #GPIO18を出力モードに設定 /home/robot/raphael-kit/python/ultra2.py:25: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. GPIO.setup(TRIG, GPIO.OUT)

該当のソースコード

python

1#!/usr/bin/env python3 2 3import RPi.GPIO as GPIO 4import time 5import csv 6import sys 7 8TRIG = 16 9ECHO = 18 10p = [] 11#ポート番号の定義 12Servo_pin = 18 #変数"Servo_pin"に18を格納 13 14#GPIOの設定 15GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定 16GPIO.setup(Servo_pin, GPIO.OUT) #GPIO18を出力モードに設定 17 18#PWMの設定 19#サーボモータSG90の周波数は50[Hz] 20Servo = GPIO.PWM(Servo_pin, 50) #GPIO.PWM(ポート番号, 周波数[Hz]) 21 22Servo.start(0) 23 24def setup(): 25 GPIO.setmode(GPIO.BOARD) 26 GPIO.setup(TRIG, GPIO.OUT) 27 GPIO.setup(ECHO, GPIO.IN) 28 29def distance(): 30 GPIO.output(TRIG, 0) 31 time.sleep(0.000002) 32 33 GPIO.output(TRIG, 1) 34 time.sleep(0.00001) 35 GPIO.output(TRIG, 0) 36 37 38 while GPIO.input(ECHO) == 0: 39 a = 0 40 time1 = time.time() 41 while GPIO.input(ECHO) == 1: 42 a = 1 43 time2 = time.time() 44 45 during = time2 - time1 46 return during * 340 / 2 * 100 47 48def write(p): 49 with open('data2.csv','w') as f: 50 writer = csv.writer(f) 51 writer.writerow(p) 52 f.close() 53 54def loop(): 55 while True: 56 dis = distance() 57 p.append(float(dis)) 58 print ('Distance: %.2f' % dis) 59 time.sleep(0.3) 60 Servo.ChangeDutyCycle(2.5) 61 time.sleep(0.25) 62 Servo.ChangeDutyCycle(3.0) 63 time.sleep(0.25) 64 Servo.ChangeDutyCycle(3.5) 65 time.sleep(0.25) 66 Servo.ChangeDutyCycle(4.0) 67 time.sleep(0.25) 68 Servo.ChangeDutyCycle(4.5) 69 time.sleep(0.25) 70 Servo.ChangeDutyCycle(5.0) 71 time.sleep(0.25) 72 Servo.ChangeDutyCycle(5.5) 73 time.sleep(0.25) 74 Servo.ChangeDutyCycle(6.0) 75 time.sleep(0.25) 76 Servo.ChangeDutyCycle(6.5) 77 time.sleep(0.25) 78 Servo.ChangeDutyCycle(7.0) 79 time.sleep(0.25) 80 Servo.ChangeDutyCycle(7.5) 81 time.sleep(0.25) 82 Servo.ChangeDutyCycle(8.0) 83 time.sleep(0.25) 84 Servo.ChangeDutyCycle(8.5) 85 time.sleep(0.25) 86 Servo.ChangeDutyCycle(9.0) 87 time.sleep(0.25) 88 Servo.ChangeDutyCycle(9.5) 89 time.sleep(0.25) 90 Servo.ChangeDutyCycle(10.0) 91 time.sleep(0.25) 92 Servo.ChangeDutyCycle(10.5) 93 time.sleep(0.25) 94 Servo.ChangeDutyCycle(11.0) 95 time.sleep(0.25) 96 Servo.ChangeDutyCycle(11.5) 97 time.sleep(0.25) 98 Servo.ChangeDutyCycle(12) 99 time.sleep(0.5) 100 101def destroy(): 102 GPIO.cleanup() 103 104def replace(): 105 with open('data2.csv') as file: 106 data = file.readlines() 107 x = [] 108 for d in data: 109 x.append(d.replace(',','\n')) 110 return x 111 112if __name__ == "__main__": 113 setup() 114 try: 115 loop() 116 except KeyboardInterrupt: 117 write(p) 118 x = replace() 119 write(x) 120 destroy()

試したこと

エラーコードについて調べて、GPIO.cleanup()を入れてみたりしましたが、よく分かりませんでした。

補足情報(FW/ツールのバージョンなど)

こちらが繋げたい元の2つ(サーボモーターと超音波センサ)のプログラムです。
・超音波センサ
#!/usr/bin/env python3

import RPi.GPIO as GPIO
import time
import csv

TRIG = 16
ECHO = 18
p = []

def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

def distance():
GPIO.output(TRIG, 0)
time.sleep(0.000002)

GPIO.output(TRIG, 1) time.sleep(0.00001) GPIO.output(TRIG, 0) while GPIO.input(ECHO) == 0: a = 0 time1 = time.time() while GPIO.input(ECHO) == 1: a = 1 time2 = time.time() during = time2 - time1 return during * 340 / 2 * 100

def write(p):
with open('data2.csv','w') as f:
writer = csv.writer(f)
writer.writerow(p)
f.close()

def loop():
while True:
dis = distance()
p.append(float(dis))
print ('Distance: %.2f' % dis)
time.sleep(0.3)

def destroy():
GPIO.cleanup()

def replace():
with open('data2.csv') as file:
data = file.readlines()
x = []
for d in data:
x.append(d.replace(',','\n'))
return x

if name == "main":
setup()
try:
loop()
except KeyboardInterrupt:
write(p)
x = replace()
write(x)
destroy()

・サーボモーター
#必要なモジュールをインポート
import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
import time #時間制御用のモジュールをインポート
import sys #sysモジュールをインポート

#ポート番号の定義
Servo_pin = 18 #変数"Servo_pin"に18を格納

#GPIOの設定
GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Servo_pin, GPIO.OUT) #GPIO18を出力モードに設定

#PWMの設定
#サーボモータSG90の周波数は50[Hz]
Servo = GPIO.PWM(Servo_pin, 50) #GPIO.PWM(ポート番号, 周波数[Hz])

Servo.start(0) #Servo.start(デューティ比[0-100%])

#while文で無限ループ
#サーボモータの角度をデューティ比で制御
#Servo.ChangeDutyCycle(デューティ比[0-100%])
while True:
try:
Servo.ChangeDutyCycle(2.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(3.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(3.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(4.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(4.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(5.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(5.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(6.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(6.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(7.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(7.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(8.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(8.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(9.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(9.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(10.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(10.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(11.0)
time.sleep(0.25)
Servo.ChangeDutyCycle(11.5)
time.sleep(0.25)
Servo.ChangeDutyCycle(12)
time.sleep(0.5)
except KeyboardInterrupt:
Servo.stop()
GPIO.cleanup()
sys.exit()

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

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

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

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

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

gurolia

2022/12/11 14:52

補足の超音波センサの途中のところで変に途切れてしまってすみません。
episteme

2022/12/12 01:07

質問は編集(修正)できます
guest

回答1

0

google翻訳
RuntimeWarning: このチャンネルはすでに使用されています,
とおっしゃってます

ECHO = 18
Servo_pin = 18 #変数"Servo_pin"に18を格納

同じ番号ですよ

投稿2022/12/11 22:04

y_waiwai

総合スコア87774

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

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

gurolia

2022/12/12 03:26

コメントありがとうございます。この場合どちらかを消せばいいのでしょうか?
y_waiwai

2022/12/12 03:48

消したらアカンでしょう 正しいものに修正する、必要があります 回路図はどうなってますか?
gurolia

2022/12/12 04:02

なるほど、ありがとうございます。 回路図の添付の仕方がわからなかったので参考にしてるサイトのURLを貼ります。すみません。 こちらが超音波センサです。 https://docs.sunfounder.com/projects/raphael-kit/en/latest/python/2.2.8_ultrasonic_sensor_module_python.html こちらがサーボモーターです。 https://docs.sunfounder.com/projects/raphael-kit/en/latest/python/1.3.2_servo_python.html この接続を組み合わせるように繋いでいます。
y_waiwai

2022/12/12 04:43

それらを、ラズパイのどこに繋いでるのか、ってはなしになります 繋いでるピンの番号をそこに設定する必要があります。 双方同じピンに繋いでいては動かない、ってのはわかりますか
gurolia

2022/12/12 05:10

なるほど。はい、わかります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問