前提
ラズパイを用いて超音波センサとサーボモーターを同時に動かすプログラミングを作っているのですが上手く行きません。超音波センサのプログラミング(距離を検出したものを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()