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

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

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

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

Raspberry Pi

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

Q&A

解決済

1回答

2829閲覧

RuntimeErrorについて教えてください。

noooooooob

総合スコア16

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2020/08/03 11:40

###環境
python 3.7
Raspberry Pi 3

###状況
加速度センサから出力した角度(ピッチ角)を用いて、サーボモータを動かしたいです。
しかし、作成したプログラムを実行しても「RuntimeError」が出てしまいます。
pinをGPIO.cleanup()しても変わりませんでした。何が問題なのでしょうか?

作成したコード(Img_Processing.py)

python

1#写真(Cキーで写真、Qキーで終了) 2import cv2 3import os 4import smbus 5import math 6from time import sleep 7 8DEV_ADDR = 0x68 9 10ACCEL_XOUT = 0x3b 11ACCEL_YOUT = 0x3d 12ACCEL_ZOUT = 0x3f 13TEMP_OUT = 0x41 14GYRO_XOUT = 0x43 15GYRO_YOUT = 0x45 16GYRO_ZOUT = 0x47 17 18PWR_MGMT_1 = 0x6b 19PWR_MGMT_2 = 0x6c 20 21bus = smbus.SMBus(1) 22bus.write_byte_data(DEV_ADDR, PWR_MGMT_1, 0) 23 24 25def read_word(adr): 26 high = bus.read_byte_data(DEV_ADDR, adr) 27 low = bus.read_byte_data(DEV_ADDR, adr+1) 28 val = (high << 8) + low 29 return val 30 31# Sensor data read 32def read_word_sensor(adr): 33 val = read_word(adr) 34 if (val >= 0x8000): # minus 35 return -((65535 - val) + 1) 36 else: # plus 37 return val 38 39 40def get_temp(): 41 temp = read_word_sensor(TEMP_OUT) 42 x = temp / 340 + 36.53 # data sheet(register map)記載の計算式. 43 return x 44 45 46def getGyro(): 47 x = read_word_sensor(GYRO_XOUT)/ 131.0 48 y = read_word_sensor(GYRO_YOUT)/ 131.0 49 z = read_word_sensor(GYRO_ZOUT)/ 131.0 50 return [x, y, z] 51 52 53def getAccel(): 54 x = read_word_sensor(ACCEL_XOUT)/ 16384.0 55 y= read_word_sensor(ACCEL_YOUT)/ 16384.0 56 z= read_word_sensor(ACCEL_ZOUT)/ 16384.0 57 return [x, y, z] 58 59 60 61 62def GyroSensor(): 63 ax, ay, az = getAccel() 64 gx, gy, gz = getGyro() 65 66 #print ('{0:4.3f}, {0:4.3f}, {0:4.3f}, {0:4.3f}, {0:4.3f}, {0:4.3f},' .format(gx, gy, gz, ax, ay, az)) 67 68 global Pitch, Roll 69 70 Roll = math.atan(ay/az) * 57.324 #57.324 = 360/2π であり、rad から ° に変換 71 Pitch = math.atan(-ax / math.sqrt( ay* ay+ az*az ) ) * 57.324 72 73 #pitch = math.atan(-ax / (ay*math.sin(roll) + az*math.cos(roll))) 74 75 #print('{0:4.3f}, {0:4.3f},' .format(pitch, roll)) 76 77def save_frame_camera_key(device_num, dir_path, basename, ext='jpg', delay=1, window_name='frame'): 78 cap = cv2.VideoCapture(device_num) 79 80 if not cap.isOpened(): 81 return 82 83 os.makedirs(dir_path, exist_ok=True) 84 base_path = os.path.join(dir_path, basename) 85 86 n = 0 87 while True: 88 ret, frame = cap.read() 89 cv2.imshow(window_name, frame) 90 91 #Pitch角を持ってくる 92 GyroSensor() 93 94 pitch = int(round(Pitch)) 95 96 #サーボモータ 97 Servo_pin = 22 98 GPIO.setmode(GPIO.BCM) 99 GPIO.setup(Servo_pin, GPIO.OUT) 100 Servo = GPIO.PWM(Servo_pin, 50) 101 Servo.start(0) 102 103 def servo_angle(angle): 104 duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180 #角度からデューティ比を求める 105 Servo.ChangeDutyCycle(duty) #デューティ比を変更 106 107 servo_angle(pitch) 108 109 key = cv2.waitKey(delay) & 0xFF 110 if key == ord('c'): 111 cv2.imwrite('{}_{}.{}'.format(base_path, n, ext), frame) 112 n += 1 113 elif key == ord('q'): 114 break 115 116 cv2.destroyWindow(window_name) 117 118 119save_frame_camera_key(0, 'data/temp', 'camera_capture')

エラーメッセージ

python

1Traceback (most recent call last): 2 File "Img_Processing.py", line 118,in <module> 3 save frame_camera_key(0, 'data/temp', 'camera_capture') 4 File "Img_Processing.py", line 98,in save frame_camera_key 5 Servo = GPIO.PWM(Servo_pin, 50) 6RuntimeError: A PWM object already exists for this GPIO channel

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

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

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

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

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

guest

回答1

0

自己解決

while内に以下のコードが入っているため、エラーが起こるようです。

Servo_pin = 22 GPIO.setmode(GPIO.BCM) GPIO.setup(Servo_pin, GPIO.OUT) Servo = GPIO.PWM(Servo_pin, 50)

これらをwhile内から出すことでエラーが解決すると思います。
まだ試していないので、分かりませんが、、、

投稿2020/08/03 16:16

noooooooob

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問