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

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

ただいまの
回答率

91.02%

  • Python 3.x

    4086questions

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

indentエラーの解決法

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 125

osatouw

score 2

下記のプログラムにて、'def write'以降のif文からindentエラーが発生し実行できません。プログラムはこちらのサイトからコピペしたものです。
エラー内容は把握してますが始めたばかりで無知な部分が多いのでどこを直すといいか教えていただけるとうれしいです。よろしくお願いします。

import webiopi

webiopi.setDebug()

GPIO = webiopi.GPIO

class DCMotor:
    _pin1 = 0
    _pin2 = 0

    def __init__(self, pin1, pin2):
        self._pin1 = pin1
        self._pin2 = pin2
        GPIO.setFunction( self._pin1, GPIO.PWM )
        GPIO.setFunction( self._pin2, GPIO.PWM )

    def __del__(self):
        self.write(0.0) # stop

    def write(self, ratio):
         if 1.0 < ratio:    # saturation
            ratio = 1.0
        if -1.0 > ratio:    # saturation
            ratio = -1.0
        if 0.01 > ratio and -0.01 < ratio:    # stop
            GPIO.pwmWrite(self._pin1, 0.0)
            GPIO.pwmWrite(self._pin2, 0.0)
        elif 0 < ratio:    # Normal rotation
            GPIO.pwmWrite(self._pin1, ratio)
            GPIO.pwmWrite(self._pin2, 0.0)
        else:    # Reverse rotation
            GPIO.pwmWrite(self._pin1, 0.0)
            GPIO.pwmWrite(self._pin2, -ratio)

g_motorL = DCMotor( 5, 6 )        # Left motor
g_motorR = DCMotor( 13, 19 )    # Right motor

g_strMode = "0"        # Drive mode. GUI default mode = "0"(stop)
g_fRatio = int("5") * 0.05    # PWM Ratio. GUI default level = "5"

@webiopi.macro
def ChangeDriveMode( strMode ):
    webiopi.debug("ChangeDriveMode( %s )" % (strMode))
    global g_strMode
    g_strMode = strMode
    iMode = int(strMode)
    if 0 == iMode:
        webiopi.debug("Mode : Stop")
        g_motorL.write(0.0)
        g_motorR.write(0.0)
    elif 1 == iMode:
        webiopi.debug("Mode : Forward")
        g_motorL.write(g_fRatio)
        g_motorR.write(g_fRatio)
    elif 2 == iMode:
        webiopi.debug("Mode : Backward")
        g_motorL.write(-g_fRatio)
        g_motorR.write(-g_fRatio)
    elif 3 == iMode:
        webiopi.debug("Mode : CW")
        g_motorL.write( g_fRatio)
        g_motorR.write(-g_fRatio)
    elif 4 == iMode:
        webiopi.debug("Mode : CCW")
        g_motorL.write(-g_fRatio)
        g_motorR.write( g_fRatio)

@webiopi.macro
def ChangeVoltageLevel( strLevel ):
    webiopi.debug("ChangeVoltageLevel( %s )" % (strLevel))
    global g_fRatio
    g_fRatio = int(strLevel) * 0.05
    # ratio = level * 0.05 : level=10 -> ratio=0.5 -> InputVoltage=2.5[V](When VM=5[V]).
    webiopi.debug("Ratio : %f" % (g_fRatio))
    ChangeDriveMode( g_strMode )
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Udomomo

    2018/01/26 14:29

    def errorというのはどこにありますか?

    キャンセル

  • osatouw

    2018/01/26 14:31

    失礼しました。編集致しました。

    キャンセル

回答 4

checkベストアンサー

+1

    def write(self, ratio):
         if 1.0 < ratio:    # saturation
            ratio = 1.0

ここの if の行の先頭が全角スペースです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/26 14:43

    もしよければ修正したコードを貼っていただいてもよろしいでしょうか。度々申し訳ありません。

    キャンセル

  • 2018/01/26 14:45

    https://gist.githubusercontent.com/mattn/be592116035aa5f633cfeadea1c8b8ea/raw/14f0e530fbb0b84191db8b7dc9f8178440d64361/gistfile1.py

    これで良いでしょうか。全角空白を直しただけです。

    キャンセル

  • 2018/01/26 14:47

    ありがとうございました。エラーが消えました。

    キャンセル

+1

二つのif文の頭がずれてませんか?

    def write(self, ratio):
         if 1.0 < ratio:    # saturation
            ratio = 1.0
        if -1.0 > ratio:    # saturation
            ratio = -1.0

その他気になったこと

  • 排他的な条件について
    writeメソッドにいくつかif文がありますが、条件が排他的なときはelifを適宜用いてください。
    読みやすくなるだけでなく、比較回数が減って実行速度が向上します。

  • 複合的な条件について
    Pythonの比較式は非常に柔軟で、『ナントカ以上ナントカ未満』などを簡潔に書けます。
    具体的には 0.01 > ratio and -0.01 < ratio ⇒ -0.01 < ratio < 0.01

  • ヨーダ記法について
    条件式について、必ず左側に定数を置くスタイルをヨーダ記法といいます。
    これは == を = と誤るのを防ぐテクニックなのですが、Pythonでは不要です。
    Pythonの代入は式でなく文であり、その誤りがエラーとなるからです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

def write(self, ratio):の次の行にあるifが、後の行のifよりもずれているうえ、全角スペースが混ざっているようです。
この部分のインデントを、半角スペースのみにして後の行と揃えてみてください。

コーディング用のエディタを使うと、こういったエラーをあらかじめチェックできたりもします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

全角空白が入っています。

    def write(self, ratio):if 1.0 < ratio:    # saturation
            ratio = 1.0

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    raspberrypiのGPIO制御について

    raspberrypiのGPIOを用いて2つのDCモーターの制御を行うためのコードをpythonかcで書きたいです。 ソースコードは落ちてるんですが、pwmoutput.Chang

  • 解決済

    AttributeError: 'Cifar10Reader' object has no attr...

    AttributeError: 'Cifar10Reader' object has no attribute 'bytestream'  のエラー が出ました。 reader.

  • 解決済

    wxPythonにおいて、USBカメラの画像表示をしたい

    前提・実現したいこと ここ一週間くらい、teratailの皆様の力を借りながら、python上で動く動画や画像を表示できるGUIを作っています。画像は何とか表示でき、画像とパネル

  • 解決済

    Pythonのループ操作

    Python超初心者です。 以下のような計算を行いたいときにはどのようなコードを書けばいいでしょうか? ある原子の座標があったとして、それらのステップ毎の計算を一気に行いたいで

  • 解決済

    センサーで感知すると天気予報を喋るプログラムの作り方

    前提・実現したいこと Raspberry piにセンサーを接続させて、天気予報を喋らせるというプログラムを実行したいのですがエラーがでて実行できませんでした。  センサーを接続させ

  • 解決済

    self.rect.xなどに値が代入されない

    壁のあたり判定をつけたいのですがflgだけ確認でき、値が代入されません。 解決方法、こうしたほうがいい点ありましたらお願いします import pygame from pyga

  • 解決済

    【pyqy5】画像の表示方法を工夫したい

    python3を使っています。pyqt5で下のようなウィジットを作りたいです 黄色いボタンを押すと前後の画像が真ん中に来るようにしたいです。しかし、どうすればいいのかよく分か

  • 解決済

    【python3】pyqtでボタンを押した時に音が出るコードを書きたい

    pyqt5でボタンを押した時に音が出るようにしたい python3.5を使っています。pyqt5でボタンを押すと音が出るようなコードを書きたいです。 発生している問題・エラーメ

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

  • Python 3.x

    4086questions

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