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

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

ただいまの
回答率

90.47%

  • Python

    8605questions

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

  • Linux

    3903questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • Python 2.7

    1311questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Raspberry Pi

    848questions

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

RaspberryPiにてPythonのプログラム上でジョイスティックの傾きを検知したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,544

JS_SONY1123

score 2

前提・実現したいこと

現在、PS3のコントローラーをBluetoothでつなぎラジコンにしてしまおうと考えています。
そこでこちらのプログラムを参考にしてGPIOを制御し動かそうと考えました。
(Rapiroにシリアル通信をするプログラム)

http://www.kiluck.co.jp/rapiro/rapiro_ps3.py

import sys
import serial
import os
import time
import datetime
file = open('/dev/input/js0','r')
data = []
com = serial.Serial('/dev/ttyAMA0', 57600, timeout = 10)
LLR = 20        #Left analog stick Left - Right
LUD = 120        #Left analog stick UP - DOWN 
RLR = 100        #Right analog stick Left - Right
RUD = 0            #Right analog stick UP - DOWN

mode = "wait"
before_time = 0
now_time = 0

while 1:
        for character in file.read(1):
            data += ['%02X' % ord(character)]
        if len(data) == 8:
            if data[6] == '01':
                mode = "button" 
                if data[4] == '01': #pressed button
                    if data[7] == '00': # SELECT
                        sys.stdout.write('You pressed the SELECT button\n')


                    elif data[7] == '01': #L3
                        sys.stdout.write('You pressed the L3 button\n')


                    elif data[7] == '02': #R3
                        sys.stdout.write('You pressed the R3 button\n')


                    elif data[7] == '03': #START
                        sys.stdout.write('You pressed the START button\n')


                    elif data[7] == '04': #UP    
                        sys.stdout.write('You pressed the UP button\n')
                        com.write("#M1")

                    elif data[7] == '05': #RIGHT
                        sys.stdout.write('You pressed the RIGHT button\n')
                        com.write("#M3")

                    elif data[7] == '06': #DOWN    
                        sys.stdout.write('You pressed the DOWN button\n')
                        com.write("#M2")

                    elif data[7] == '07': #LEFT    
                        sys.stdout.write('You pressed the LEFT button\n')
                        com.write("#M4")

                    elif data[7] == '08': #L2    
                        sys.stdout.write('You pressed the L2 button\n')
                        time.sleep(0.11)
                        com.write("#PS07A040T001")

                    elif data[7] == '09': #R2    
                        sys.stdout.write('You pressed the R2 button\n')
                        time.sleep(0.11)
                        com.write("#PS04A080T001")

                    elif data[7] == '0A': #L1    
                        sys.stdout.write('You pressed the L1 button\n')
                        time.sleep(0.11)
                        com.write("#PS07A080T001")

                    elif data[7] == '0B': #R1
                        sys.stdout.write('You pressed the R1 button\n')
                        time.sleep(0.11)
                        com.write("#PS04A040T001")

                    elif data[7] == '0C': #TRIANGLE    
                        sys.stdout.write('You pressed the TRIANGLE button\n')
                        com.write("#M5")

                    elif data[7] == '0D': #CIRCLE    
                        sys.stdout.write('You pressed the CIRCLE button\n')
                        com.write("#M6")

                    elif data[7] == '0E': #CROSS    
                        sys.stdout.write('You pressed the CROSS button\n')
                        com.write("#M7")

                    elif data[7] == '0F': #SQUARE    
                        sys.stdout.write('You pressed the SQUARE button\n')
                        com.write("#M8")


                elif data[4] == '00': #released button

                    if data[7] == '00': # SELECT
                        sys.stdout.write('You released the SELECT button\n')
                    elif data[7] == '01': #L3
                        sys.stdout.write('You released the L3 button\n')
                    elif data[7] == '02': #R3
                        sys.stdout.write('You released the R3 button\n')
                    elif data[7] == '03': #START
                        sys.stdout.write('You released the START button\n')
                    elif data[7] == '04': #UP    
                        com.write("#M0")
                        sys.stdout.write('You released the UP button\n')
                    elif data[7] == '05': #RIGHT
                        com.write("#M0")
                        sys.stdout.write('You released the RIGHT button\n')    
                    elif data[7] == '06': #DOWN
                        com.write("#M0")    
                        sys.stdout.write('You released the DOWN button\n')
                    elif data[7] == '07': #LEFT
                        com.write("#M0")    
                        sys.stdout.write('You released the LEFT button\n')
                    elif data[7] == '08': #L2
                        time.sleep(0.11)
                        com.write("#PS07A060T001")    
                        sys.stdout.write('You released the L2 button\n')
                    elif data[7] == '09': #R2    
                        time.sleep(0.11)
                        com.write("#PS04A060T001")
                        sys.stdout.write('You released the R2 button\n')
                    elif data[7] == '0A': #L1
                        time.sleep(0.11)
                        com.write("#PS07A060T001")    
                        sys.stdout.write('You released the L1 button\n')
                    elif data[7] == '0B': #R1
                        time.sleep(0.11)
                        com.write("#PS04A060T001")
                        sys.stdout.write('You released the R1 button\n')
                    elif data[7] == '0C': #TRIANGLE
                        com.write("#M0")    
                        sys.stdout.write('You released the TRIANGLE button\n')
                    elif data[7] == '0D': #CIRCLE
                        com.write("#M0")    
                        sys.stdout.write('You released the CIRCLE button\n')
                    elif data[7] == '0E': #CROSS
                        com.write("#M0")    
                        sys.stdout.write('You released the CROSS button\n')
                    elif data[7] == '0F': #SQUARE
                        com.write("#M0")    
                        sys.stdout.write('You released the SQUARE button\n')
            elif data[6] == '02':

                now = datetime.datetime.now()
                now_time = now.minute * 60000 + now.second * 1000 + now.microsecond/1000
                a_data = int(data[5],16)
                if a_data >= 0 and a_data < 128:
                    a_data = a_data + 128
                elif a_data >= 128 and a_data < 256:
                    a_data = a_data - 128


                if data[7] == '00':    #Left stick L-R        PS06
                    a_data = (int(a_data/2.13) - 120) * -1
                    a_data =int(( a_data - 60) * 1.66 + 20)
                    if a_data <= 20:
                        a_data = 20
                    LLR = a_data
                    joy = True
                    mode = "analog"

                elif data[7] == '01':    #Left stick U-D        PS05
                    a_data = int(a_data/2.13)
                    a_data = a_data * 2
                    if a_data >= 120:
                        a_data = 120
                    LUD = a_data
                    joy = True
                    mode = "analog"

                elif data[7] == '02':    #Right stick L-R    PS03
                    a_data = (int(a_data/2.13) - 120) * -1
                    a_data = int(a_data * 1.66)
                    if a_data >= 100:
                        a_data = 100
                    RLR = a_data
                    joy = True
                    mode = "analog"

                elif data[7] == '03':    #Right stick U-D    PS02
                    a_data = (int(a_data/2.13) - 120) * -1
                    a_data = (a_data - 60 ) * 2
                    if a_data <= 0:
                        a_data = 0
                    RUD = a_data
                    joy = True
                    mode = "analog"

                else:
                    joy = False
                dif = now_time - before_time
                if dif > 110 and joy == True:
                    com.write("#PS02A" + str(RUD).zfill(3) + "S03A" + str(RLR).zfill(3) + "S05A" + str(LUD).zfill(3) + "S06A" + str(LLR).zfill(3) + "T001\r\n")

                    com.write("ms : " + str(dif) + "\r\n")
                    now = datetime.datetime.now()
                    before_time = now.minute * 60000 + now.second * 1000 + now.microsecond/1000
            sys.stdout.flush()
            data = []            
    now = datetime.datetime.now()
    j_time = now.minute * 60000 + now.second * 1000 + now.microsecond/1000
    dif = j_time - before_time
    if dif > 200 and mode == "analog":
        com.write("#PS02A" + str(RUD).zfill(3) + "S03A" + str(RLR).zfill(3) + "S05A" + str(LUD).zfill(3) + "S06A" + str(LLR).zfill(3) + "T001\r\n")
        now = datetime.datetime.now()
        before_time = now.minute * 60000 + now.second * 1000 + now.microsecond/1000
sys.stdout.flush()
data = []

こちらを参考にして書いてみようと考えました。

発生している問題・エラーメッセージ

こちらからjs0の取得方法を真似して

import sys
import os
import time
import datetime
file = open('/dev/input/js0','r')
data = []
LLR = 20        #Left analog stick Left - Right
LUD = 120        #Left analog stick UP - DOWN 
RLR = 100        #Right analog stick Left - Right
RUD = 0            #Right analog stick UP - DOWN

mode = "wait"
before_time = 0
now_time = 0

while 1:
        for character in file.read(1):
            data += ['%02X' % ord(character)]
        if len(data) == 8:
            if data[6] == '01':
                mode = "button" 
                if data[4] == '01': #pressed button
                    elif data[7] == '0D': #CIRCLE    
                        print "Press Circle"


まではある程度理解できたのですが、
elif data[6] == '02':以降の処理が理解できません。
当方初心者につき稚拙な問題ではありますがよろしくお願いします。

試したこと

elif data[6] == '02':

                now = datetime.datetime.now()
                now_time = now.minute * 60000 + now.second * 1000 + now.microsecond/1000
                a_data = int(data[5],16)
                if a_data >= 0 and a_data < 128:
                    a_data = a_data + 128
                elif a_data >= 128 and a_data < 256:
                    a_data = a_data - 128


                if data[7] == '00':    #Left stick L-R        PS06
                    a_data = (int(a_data/2.13) - 120) * -1
                    a_data =int(( a_data - 60) * 1.66 + 20)
                    if a_data <= 20:
                        a_data = 20
                    LLR = a_data
                    joy = True
                    mode = "analog"
                      print a_data


を先ほどの最後に追加しa_dataの処理後の値を見ようとするも何度見なおしてもインデントエラーになります。

補足情報(言語/FW/ツール等のバージョンなど)

Python2.7 RaspberryPiB+ 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

参照したRapiroのソースでは、インデントはタブ(4個スペース分)になっていて、
elif data[6] == '02': の頭には3つのタブ、
now = datetime.datetime.now() の頭には4個のタブが入っていました。
pythonではインデントの位置が重要です。インデントはタブでもスペースでも構いませんが、どちらかに統一されていて、位置があっている必要があります。
インデントエラーが出ているということですので、まずはそこをチェックされてはいかがでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/21 20:42

    コピーアンドペーストするときにずれたようです。すみません。
    実機では問題ありませんでした。

    キャンセル

関連した質問

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

  • Python

    8605questions

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

  • Linux

    3903questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • Python 2.7

    1311questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Raspberry Pi

    848questions

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