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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1373閲覧

TypeError: run() missing 1 required positional argument:

Rivermouth

総合スコア19

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/02/09 01:52

マルチプロセスでステッピングモータを動かすプログラムを書いております。

ただ、タイトルにもある通りエラーが出てしまい、自分自身では解決できそうにないのでこちらで質問させていただきます。

どなたかお力をお貸し頂けないでしょうか?

エラー

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

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

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

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

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

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

guest

回答2

0

app.pyの次の2行が原因です。

Python

1 StepMotor = stepping_motor 2 (GPIO_PIN_TO_ORENGE,GPIO_PIN_TO_YELLOW,GPIO_PIN_TO_PINK,GPIO_PIN_TO_BLUE)

その箇所で改行を入れてはいけません(PythonはC言語のような自由形式ではありません)。

まずは、1行に結合して動くことを確認してください。

Python

1 StepMotor = stepping_motor(GPIO_PIN_TO_ORENGE,GPIO_PIN_TO_YELLOW,GPIO_PIN_TO_PINK,GPIO_PIN_TO_BLUE)

\を使えば、継続行を書くことができます。

Python

1 StepMotor = stepping_motor\ 2 (GPIO_PIN_TO_ORENGE,GPIO_PIN_TO_YELLOW,GPIO_PIN_TO_PINK,GPIO_PIN_TO_BLUE)

また、()の中では改行できるので、以下のようにも書けます。

Python

1 StepMotor = stepping_motor(GPIO_PIN_TO_ORENGE, 2 GPIO_PIN_TO_YELLOW, 3 GPIO_PIN_TO_PINK, 4 GPIO_PIN_TO_BLUE)

投稿2021/02/09 02:20

Daregada

総合スコア11990

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

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

0

ベストアンサー

python

1 StepMotor = stepping_motor 2 (GPIO_PIN_TO_ORENGE,GPIO_PIN_TO_YELLOW,GPIO_PIN_TO_PINK,GPIO_PIN_TO_BLUE)

ここで、改行してしまうと、2行目の引数は引数として扱われず、StepMotorには、stepping_motorクラス=C28BYJ48クラスそのものが入ります。

python

1 StepMotor.run(rotate_angle, total_take_photo_time, 1)

なので、ここではメソッドを直接呼んでいることになり引数が足りなくなります。

投稿2021/02/09 02:17

TakaiY

総合スコア13790

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問