マルチプロセスでステッピングモータを動かすプログラムを書いております。
ただ、タイトルにもある通りエラーが出てしまい、自分自身では解決できそうにないのでこちらで質問させていただきます。
どなたかお力をお貸し頂けないでしょうか?
エラー
TypeError: run() missing 1 required positional argument: 'direction'
*エラーの意味は分かります。
問題はdirectionへ値は渡っていると思うのですが、渡っていないことになっていることです。
ソースコード
app.py
Python
1from flask import Flask, render_template, request 2from gpiozero_stepping import C28BYJ48 as stepping_motor 3from json_status import MotorStatus as motorstatus 4from multiprocessing import Process 5import os 6 7app = Flask(__name__) 8mt = motorstatus(os.getcwd()) 9GPIO_PIN_TO_ORENGE = 14 10GPIO_PIN_TO_YELLOW = 15 11GPIO_PIN_TO_PINK = 18 12GPIO_PIN_TO_BLUE = 23 13 14def move_stepping_motor(rotate_angle, total_take_photo_time): 15 StepMotor = stepping_motor 16 (GPIO_PIN_TO_ORENGE,GPIO_PIN_TO_YELLOW,GPIO_PIN_TO_PINK,GPIO_PIN_TO_BLUE) 17 print(rotate_angle) 18 print(total_take_photo_time) 19 StepMotor.run(rotate_angle, total_take_photo_time, 1) 20 21@app.route('/', methods=["GET"]) 22def index(): 23 return render_template('index.html', motor_moving_status = mt.getStatus()) 24 25@app.route('/start_take_photo', methods=['POST']) 26def start_take_photo(): 27 angle = int(request.form.get('angle')) 28 time = int(request.form.get('time')) 29 process_move_stepping_motor = Process(target=move_stepping_motor, args=(angle, time)) 30 process_move_stepping_motor.start() 31 return render_template('index.html', motor_moving_status = mt.getStatus()) 32 33 34@app.route('/checkstatus', methods=['POST']) 35def checkStatus(): 36 return render_template('index.html', motor_moving_status = mt.getStatus()) 37 38 39if __name__ == '__main__': 40 app.run(debug=False, host="0.0.0.0", port=5000) 41
gpiosero_stepping
Python
1# -*- coding: utf-8 -*- 2from time import sleep 3 4from gpiozero import OutputDevice as stepper 5from json_status import MotorStatus 6import os 7 8class C28BYJ48: 9 10 def __init__(self, IN1, IN2, IN3, IN4): 11 self.IN1 = stepper(IN1) 12 self.IN2 = stepper(IN2) 13 self.IN3 = stepper(IN3) 14 self.IN4 = stepper(IN4) 15 #Setting GPIO 16 self.stepPins = [self.IN1, self.IN2, self.IN3, self.IN4] 17 self.sequenceNumber = 0 18 self.stepCount = 8 19 20 def seq(self): 21 return [[1,0,0,1], [1,0,0,0],[1,1,0,0],[0,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,1,1],[0,0,0,1]] 22 23 def SetRoll(self, angle, wait): 24 #入力値が0以下の場合 25 if angle <= 0 : return 0,0 26 #回転ステップ数の計算 27 #カメラ台座ギア比2:1のため、角度入力値を二倍にします 28 steps = (angle * 2) * 4096 / 360 29 #回転インターバル時間の計算 30 #入力値分単位を秒単位へ変換 31 interval = float(wait * 60.0 / steps) 32 return steps, interval 33 34 #シーケンスのピンをセットする 35 def SetPinVoltage(self, NSeq): 36 self.sequenceNumber = NSeq 37 for pin in range(0,4): 38 xPin = self.stepPins[pin] 39 seq = self.seq() 40 if seq[self.sequenceNumber][pin]!=0: 41 xPin.on() 42 else: 43 xPin.off() 44 45 def run(self, angle, wait, direction): 46 print('RUN IN') 47 #回転設定 48 # Set to 1 for clockwise 49 # Set to -1 for anti-clockwise 50 mt = MotorStatus(os.getcwd()) 51 mt.setStatus(1, angle, wait) 52 self.direction = direction 53 steps, interval = self.SetRoll(angle, wait) 54 for i in range(0, int(steps)): 55 self.SetPinVoltage(self.sequenceNumber) 56 self.sequenceNumber += self.direction 57 if self.sequenceNumber >= self.stepCount: 58 self.sequenceNumber = 0 59 if self.sequenceNumber < 0: 60 self.sequenceNumber = self.stepCount + self.direction 61 sleep(interval) 62 mt.setStatus(0, angle, wait) 63 64if __name__ == '__main__': 65 StepMotor = C28BYJ48(14,15,18,23) 66 #時計周り 180度回転/撮影時間1分 67 StepMotor.run(180, 1, 1) 68 69 #反時計周り 180度回転/撮影時間1分 70 StepMotor.run(180, 1, -1) 71 72
index.html
HTML
1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>カメラ操作画面</title> 6 </head> 7 <body> 8 <header> 9 <h1>カメラコントロール</h1> 10 </header> 11 <hr> 12 <form action="/start_take_photo" method="POST"> 13 <p>角度を選択してください。<br> 14 <input type="radio" name="angle" value="30" checked>30° 15 <input type="radio" name="angle" value="45">45° 16 <input type="radio" name="angle" value="60">60° 17 <input type="radio" name="angle" value="75">75° 18 <input type="radio" name="angle" value="90">90° 19 <input type="radio" name="angle" value="105">105° 20 <input type="radio" name="angle" value="120">120° 21 <input type="radio" name="angle" value="135">135° 22 <input type="radio" name="angle" value="150">150° 23 <input type="radio" name="angle" value="165">165° 24 <input type="radio" name="angle" value="180">180° 25 </p> 26 <br> 27 <p>時間を選択してください。<br> 28 <input type="radio" name="time" value="1" checked>1分 29 <input type="radio" name="time" value="30">30分 30 <input type="radio" name="time" value="60">60分 31 <input type="radio" name="time" value="90">90分 32 <input type="radio" name="time" value="120">120分 33 </p> 34 <br> 35 <button type="submit" name="button">撮影開始</button> 36 </form> 37 <hr> 38 <form action="/checkstatus" method="POST"> 39 <button type="submit" name="checkstatus">状態確認</button> 40 {% if motor_moving_status.status == 1 %} 41 <p>インターバル撮影動作中(回転角度({{motor_moving_status.angle}})°/撮影時間({{motor_moving_status.time}}分))</p> 42 {% else %} 43 <p>インターバル撮影待機中</p> 44 {% endif %} 45 </form> 46 <footer> 47 <p>ラズパイ勉強会</p> 48 </footer> 49 </body> 50</html> 51
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。