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

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

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

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

Python

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

Q&A

2回答

581閲覧

pythonプログラムの間違いを直してほしい

Tatsuyal

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2018/09/14 15:27

編集2018/09/15 03:49

スマホをwebiopiにアクセスしてスマホの角度を検出し、その値をもとにサーボを動かすシステムを製作中です。その際以下のスクリプトを実行してみたところエラーが発生しました。エラーによると45行目のxAngle-passが定義されてないということらしいのですが、このような場合プログラムをどう変えればよいのでしょうか?初心者なため二進も三進もいかない状況ですが、よろしくお願いします!

scriptpy

1import webiopi 2import time, os, sys, re, datetime 3 4webiopi.setDebug() 5GPIO = webiopi.GPIO 6PIN = {'R': {'1': 6, '2': 5, 'P': 12}, 'L': {'1': 13, '2': 19, 'P': 18}, 'servo': {'x': 38, 'y': 40}} 7for key, value in PIN.items() : 8 for key2, value2 in value.items() : 9 GPIO.setFunction(value2, GPIO.PWM) 10 if key2 == 'P' : 11 GPIO.pwmWrite(value2, 1.0) 12past, now = {'x': 0, 'y': 0}, {'x': 0, 'y': 0} 13 14def ServoAngle(pin, angle): 15 up = int(1500 + (angle * 350) / 45) 16 down = 20000 - up 17 GPIO.pulseMicro(pin, up, down) 18 19def MotorDrive(in1, in2, state) : 20 GPIO.pwmWrite(in1, state[0]*1.0) 21 GPIO.pwmWrite(in2, state[1]*1.0) 22 23@webiopi.macro 24def changeDriveMode(mode) : 25 webiopi.debug("ChangeDriveMode : %s" % (mode)) 26 if mode == 'Stop' : 27 MotorDrive(PIN['L']['1'], PIN['L']['2'], [0, 0]) 28 MotorDrive(PIN['R']['1'], PIN['R']['2'], [0, 0]) 29 elif mode == 'Forward' : 30 MotorDrive(PIN['L']['1'], PIN['L']['2'], [1, 0]) 31 MotorDrive(PIN['R']['1'], PIN['R']['2'], [1, 0]) 32 elif mode == 'Backward' : 33 MotorDrive(PIN['L']['1'], PIN['L']['2'], [0, 1]) 34 MotorDrive(PIN['R']['1'], PIN['R']['2'], [0, 1]) 35 elif mode == 'CW' : 36 MotorDrive(PIN['L']['1'], PIN['L']['2'], [1, 0]) 37 MotorDrive(PIN['R']['1'], PIN['R']['2'], [0, 1]) 38 elif mode == 'CWW' : 39 MotorDrive(PIN['L']['1'], PIN['L']['2'], [0, 1]) 40 MotorDrive(PIN['R']['1'], PIN['R']['2'], [1, 0]) 41 42@webiopi.macro 43def moveServo(xAngle, yAngle): 44 webiopi.debug("moveServoAngle : %s, %s" % (xAngle, yAngle)) 45 now['x'] = (xAngle-past['x'])%360 46 now['y'] = (xAngle-past['y'])%180 47 past = {'x': xAngle, 'y': yAngle} 48 ServoAngle(PIN['servo']['x'], now['x']) 49 ServoAngle(PIN['servo']['y'], now['y']) 50 51@webiopi.macro 52def resetServo() : 53 webiopi.debug("Servo Reset...")

indexhtml

1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <meta http-equiv="Content-Style-Type" content="text/css"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> 7 <title>課題研究</title> 8 <script type="text/javascript" src="/webiopi.js"></script> 9 <script type="text/javascript"> 10 function getParam(name, url) { 11 if (!url) url = window.location.href; 12 name = name.replace(/[[]]/g, "\$&"); 13 var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), 14 results = regex.exec(url); 15 if (!results) return null; 16 if (!results[2]) return ''; 17 return decodeURIComponent(results[2].replace(/+/g, " ")); 18 } 19 20 window.addEventListener("deviceorientation", (dat) => { 21 var xAngle = parseInt(dat.alpha); // x軸(0°~360°) => 0°: 北, 90°: 西, 180°: 南, 270°: 東 22 var yAngle = parseInt(dat.beta); // y軸(-180°~180°)=> 0°: 水平, 90°: 垂直, °-180: 逆水平, -90°: 逆垂直 23 getAngle(xAngle, yAngle); 24 }); 25 26 webiopi().ready( function(){ 27 drive('stop'); 28 }); 29 30 function getDriveMode(mode){ 31 webiopi().callMacro("changeDriveMode", mode); 32 } 33 34 function getAngle(xAngle, yAngle) { 35 webiopi().callMacro("moveServo", [xAngle, yAngle]); 36 } 37 38 function resetServo() { 39 webiopi().callMacro("resetServo"); 40 } 41 </script> 42 </head> 43 <body> 44 <script type="text/javascript"> 45 var params = [getParam('event'), getParam('direction')]; 46 if(params[0] == 'stick') 47 getDriveMode(params[1]); 48 else if(params[0] == 'reset') 49 resetServo(); 50 </script> 51 </body> 52</html>

errormessage

1 File "/home/pi/WebIOPi-0.7.1/myProject/script.py", line 45, in moveServo 2 now['x'] = (xAngle['x'])%360 3TypeError: string indices must be integers

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

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

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

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

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

hayataka2049

2018/09/14 15:31 編集

エラーメッセージをちゃんと全文示してください
hayataka2049

2018/09/14 15:29

参考にしてるサイト等はありますか?
Tatsuyal

2018/09/15 01:53

情報不足で申し訳ないです…エラー文は以下のようになります。友人に書いてもらったため参考サイトはありません File "/home/pi/WebIOPi-0.7.1/myProject/script.py", line 45, in moveServo now['x'] = (xAngle['x'])%360 TypeError: string indices must be integers
guest

回答2

0

友人に書いてもらったため

本人に聞いたほうがよいのではと思いますが。

45行目のxAngle-passが定義されてない

動作環境がないので、コードを見ただけですが。
変数:pastに再代入をしているのが、原因ではないでしょうか。

以下のような変更でどうでしょう。

Python

1@webiopi.macro 2def moveServo(xAngle, yAngle): 3 global past # モジュール変数に対して、再代入を行っているためglobalに 4 webiopi.debug("moveServoAngle : %s, %s" % (xAngle, yAngle)) 5 now['x'] = (xAngle - past['x'])%360 # 6 now['y'] = (yAngle - past['y'])%180 # xAngle→yAngleに 7 past = {'x': xAngle, 'y': yAngle} 8 ServoAngle(PIN['servo']['x'], now['x']) 9 ServoAngle(PIN['servo']['y'], now['y'])

参考:Python のローカルとグローバル変数のルールは何ですか?

あと質問文に実行エラーメッセージ(traceback)を編集記載して頂くと回答が付きやすいのではないかと。


TypeError: unsupported operand type(s) for -: 'str' and 'int'

■グーグル翻訳
TypeError: - : 'str'と 'int'のサポートされないオペランドタイプ
テキストシーケンス型(str)と数値型(int)と変数の型が違うもの対して、-演算(サポートされていない演算(オペランド))を行っているのが原因です。
参考:組み込み型

関数:moveServoのxAngle - past['x'] #この箇所で変数:xAngleがstr型変数として扱われています。

変数:xAngleがどうしてテキストシーケンス型(str)として扱われたかの原因究明は質問者さんにして頂きたいのですが
JavaScript側のfunction getAngle(xAngle, yAngle)のメソッド内にxAngleyAngleをラベルなどに値を出力するよう変更しデバック確認してくださいな。
参考:DeviceOrientation Event Viewer

もしも値が正常に渡っていてstrからintへの型変換を行うだけでしたら以下コードで

Python

1 webiopi.debug("moveServoAngle : %s, %s" % (xAngle, yAngle)) 2 # 以下2行を追加 3 xAngle = int(xAngle) 4 yAngle = int(yAngle) 5 now['x'] = (xAngle - past['x'])%360

サーボモータを40番ピン、gnd、電源に接続してwebiopiにアクセス

実環境がないので、私から手伝える事はこれ以上ないです。
友達に聞いてみるか、質問文を最新のコードに編集後、エラーなどが発生しているならその旨を追記して、
他の人の回答を待ってみてくださいな。あと他の方へのお礼の言葉は忘れないでくださいね。

投稿2018/09/15 03:03

編集2018/09/15 06:48
umyu

総合スコア5846

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

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

Tatsuyal

2018/09/15 03:56 編集

回答とアドバイスありがとうございます!プログラムに教えてもらったように修正を加え、再度起動してみたところ以下のようなエラー文が出てきました… File "/home/pi/WebIOPi-0.7.1/myProject/script.py", line 45, in moveServo now['x'] = (xAngle - past['x'])%360 # TypeError: unsupported operand type(s) for -: 'str' and 'int' これはどういうことなのでしょうか?
Tatsuyal

2018/09/15 06:22

コードを打ち込んでみたところうまくいきました! 本当にありがとうございます‼
Tatsuyal

2018/09/15 06:35

たびたび申し訳ありません…サーボモータを40番ピン、gnd、電源に接続してwebiopiにアクセスし起動してみたところ動きませんでした… なにが原因なのでしょうか…
guest

0

45, 46行目について、
xAngle-past -> xAngle にしてみたら、いかがでしょうか。

python

1 # now['x'] = (xAngle-past['x'])%360 2 # now['y'] = (xAngle-past['y'])%180 3 now['x'] = (xAngle['x'])%360 4 now['y'] = (xAngle['y'])%180

投稿2018/09/14 21:59

kakimochi

総合スコア110

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

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

Tatsuyal

2018/09/15 01:52

回答ありがとうございます!変更してsudo webiopi -d -c /etc/webiopi/configで起動し、スマホでアクセスしたところ File "/home/pi/WebIOPi-0.7.1/myProject/script.py", line 45, in moveServo now['x'] = (xAngle['x'])%360 TypeError: string indices must be integers となりました…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問