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

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

ただいまの
回答率

87.37%

プログラムの修正を行いたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 511

score 5

プログラムを実行すると下記のようなエラーがでてしまいます,修正するにはどのようにしたらよろしいのでしょうか.
Traceback (most recent call last):
File "/home/pi/Desktop/0901.py", line 362, in <module>
sys.stdout.write("Timer running: %i seconds\r" % (runtime + (motor.start() - start)))
TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'

     import smbus
import RPi.GPIO as GPIO
from time import sleep
import math
import atexit
import sys
import datetime
import time
import touchphat
@touchphat.on_touch("Enter")
def start_stop():
    global start
    global stopped
    global runtime
    if stopped:
        start = motor.start()
        stopped = False
    else:
        stopped = True
        runtime += (time.time() - start)

@touchphat.on_touch("Back")
def reset():
    global runtime
    runtime = 0

blanks = " " * 25 + "\r"

class motorDrive:
    in1 = 8
    in2 = 11
    en = 24
    temp1 = 1
    lastState = 'LOW'
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(in1, GPIO.OUT)
    GPIO.setup(in2, GPIO.OUT)
    GPIO.setup(en, GPIO.OUT)
    GPIO.output(in1, GPIO.LOW)
    GPIO.output(in2, GPIO.LOW)
    p = GPIO.PWM(en, 1000)
    p.start(55)

    directionState = 'forward'
    # #print("\n")
    # #print("The default speed & direction of motor is LOW & Forward.....")
    # #print("r-run s-stop f-forward b-backward l-low m-medium h-high e-exit")
    # #print("\n")

    def start(self):

        GPIO.output(self.in1, GPIO.HIGH)
        GPIO.output(self.in2, GPIO.LOW)
        self.directionState = 'forward'
        #print("MOTOR STARTING")

    def setPower(self, power):
        if self.lastState == power:
            return
        if power == 'LOW':
            self.p.ChangeDutyCycle(30)
        elif power == 'MEDIUM':
            self.p.ChangeDutyCycle(50)
        elif power == 'HIGH':
            self.p.ChangeDutyCycle(90)

        #print("PWR CHANGED ", self.lastState, " TO ", power)
        self.lastState = power

    def setDirection(self, direction):
        if self.directionState == direction:
            return
        if direction == "forward":
            GPIO.output(self.in1, GPIO.HIGH)
            GPIO.output(self.in2, GPIO.LOW)
            self.setPower('LOW')
        else:
            GPIO.output(self.in1, GPIO.LOW)
            GPIO.output(self.in2, GPIO.LOW)
        #print("DIRECTION CHANGED ", self.directionState, " TO ", direction)
        self.directionState = direction

    def stop(self):
        GPIO.output(self.in1,GPIO.LOW)
        GPIO.output(self.in2,GPIO.LOW)
        #print("MOTOR stopING")


    def clean(self):
        self.stop()
        GPIO.cleanup()
        #print('GPIO cleanup')


try:
        while True:
            if stopped and runtime > 0:
              sys.stdout.write(blanks)
              sys.stdout.write("motorstart: %i seconds\r" % runtime)
              sys.stdout.flush()        

            elif stopped:
              sys.stdout.write(blanks)
              sys.stdout.write("Touch enter to start!\r")
              sys.stdout.flush()

            else:
              sys.stdout.write(blanks)
              sys.stdout.write("Timer running: %i seconds\r" % (runtime + (motor.start() - start)))
              sys.stdout.flush()

            accel_data = mpu.get_accel_data()

            y_angle = util.get_y_rotation(accel_data['x'], accel_data['y'], accel_data['z'])

            if y_angle < normalMin:
                motor.setDirection("stop")
            else:
                motor.setDirection("forward")

            if y_angle >= mediumMin and highMin < y_angle:
                motor.setPower("HIGH")
            elif y_angle >= highMin: 
                motor.setPower("MEDIUM")
            time.sleep(5)
finally:
    sys.stdout.close()
    motor.clean()
    time.sleep(0.5)     

atexit.register(exitHandler)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'
NoneType同士の引き算はできませんよとのことですから、motor.start() と startの中身が設計通り入ってるか確認されたほうが良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/16 15:49

    @touchphat.on_touch("Enter")
    def start_stop():
    global start
    global stopped
    global runtime
    if stopped:
    start = motor.start()
    stopped = False
    else:
    stopped = True
    runtime += (motor.start() - start)

    @touchphat.on_touch("Back")
    def reset():
    global runtime
    runtime = 0

    blanks = " " * 25 + "\r"
    これが定義の部分なのですが motor.start()の部分をstartに変更すればよろしいのでしょうか。

    キャンセル

  • 2020/10/16 15:57

    コードは質問に追加したほうがよいですよ。
    あと、定義の部分など、一部分を小出しで出されると解決できないこともあるので、原因箇所が特定できない場合は、出来る限り全てのコードを提示していただいたほうが、早く解決できると思います。

    キャンセル

  • 2020/10/16 15:57

    エラー文から推測しているだけですので、motor.start()と startがどうあるべきかというのは私にはわかりません。

    motor.start()と startにはどういう値が入っているべきなのか再考して、0901.py", line 362のところで設計通りに入っているのかを確認されれば良いと思います。

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る