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

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

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

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

Raspberry Pi

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

Python

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

Q&A

解決済

2回答

5433閲覧

Navio2を利用してドローンを動かしたい。

ocho0

総合スコア12

Linux

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

Raspberry Pi

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

Python

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

0グッド

1クリップ

投稿2017/01/09 06:59

編集2017/01/09 09:27

###前提・実現したいこと
Navio2を利用してドローンを動かしたいのですが、
どうしてもエラーが起きてしまいます。
設定ファイル等はgithubから拾ってきました。(←Navio2の販売元のHPより)
ゴールとしては、
ジャイロセンサーを利用して一定値以上の傾きが検出された時、モーターの出力を調整したいです。今回はモーターは2つで実験しています。
###発生している問題・エラーメッセージ

Traceback (most recent call last): File "test1.py", line 59, in <module> pwm.set_duty_cycle(SERVO_MAX) File "/home/pi/Navio2/Python/navio/pwm.py", line 23, in set_duty_cycle pwm_duty.write(str(period_ns)) IOError: [Errno 22] Invalid argument

###該当のソースコード
実行ファイルがこちらです。初心者なので汚いですがご了承ください。
元々公開されていたセンサーのプログラムとサーボのキャリブレーションのプログラムを一緒にして色々書き直してこうなった形です。

""" """ Provided to you by Emlid Ltd (c) 2014. twitter.com/emlidtech || www.emlid.com || info@emlid.com Example: Control the Servo machines connected to PCA9685 driver onboard of Navio shield for Raspberry Pi Connect servo to Navio's rc output and watch it work. Output 1 on board is connected to PCA9685 channel 3, output 2 to channel 4 and so on. To use full range of your servo correct SERVO_MIN and SERVO_MAX according to it's specification. Please note that this example uses Adafruit I2C and PCA9685 drivers. To run this example navigate to the directory containing it and run following commands: sudo python Servo.py """ from navio.adafruit_pwm_servo_driver import PWM import time import math import sys import navio.gpio import navio.util import navio.pwm import spidev import argparse from navio.mpu9250 import MPU9250 navio.util.check_apm() #drive Output Enable in PCA low pin = navio.gpio.Pin(1) pin.write(28) PCA9685_DEFAULT_ADDRESS = 0x77 frequency = 60 #NAVIO_RCOUTPUT_1 = 0 #NAVIO_RCOUTPUT_2 = 2 PWM_OUTPUT = 0 SERVO_MIN_ms = 1.250 # mS SERVO_MAX_ms = 1.750 # mS #convert mS to 0-4096 scale: SERVO_MIN = math.trunc((SERVO_MIN_ms * 4096.0) / (1000.0 / frequency) - 1) SERVO_MAX = math.trunc((SERVO_MAX_ms * 4096.0) / (1000.0 / frequency) - 1) SERVO_HALF = math.trunc(SERVO_MAX + SERVO_MIN )/2 SERVO_M_HALF = math.trunc((SERVO_HALF/2)-SERVO_MIN+SERVO_HALF) #pwm = PWM(0x77, debug=False) pwm = navio.pwm.PWM(PWM_OUTPUT) pwm.set_period(50) navio.util.check_apm() imu = MPU9250() #pwm.setPWM(NAVIO_RCOUTPUT_1, 10, SERVO_MAX) pwm.set_duty_cycle(SERVO_MAX) raw_input() time.sleep(2) #pwm.setPWM(NAVIO_RCOUTPUT_2, 10, SERVO_MAX) if imu.testConnection(): print "Connection established: True" else: sys.exit("Connection established: False") imu.initialize() time.sleep(1) while True: # imu.read_all() # imu.read_gyro() # imu.read_acc() # imu.read_temp() # imu.read_mag() # print "Accelerometer: ", imu.accelerometer_data # print "Gyroscope: ", imu.gyroscope_data # print "Temperature: ", imu.temperature # print "Magnetometer: ", imu.magnetometer_data # time.sleep(0.1) m9a, m9g, m9m = imu.getMotion9() # if m9a[0] < -5: # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_HALF) # pwm.setPWM(NAVIO_RCOUTPUT_2, 0, SERVO_M_HALF) # elif m9a[0] > 5: # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_M_HALF) # pwm.setPWM(NAVIO_RCOUTPUT_2, 0, SERVO_HALF) # else : # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_MAX) # pwm.setPWM(NAVIO_RCOUTPUT_2, 0, SERVO_MAX) print "Acc:", "{:+7.3f}".format(m9g[0]), "{:+7.3f}".format(m9g[1]), "{:+7.3f}".format(m9g[2]), print " Gyr:", "{:+8.3f}".format(m9a[0]), "{:+8.3f}".format(m9a[1]), "{:+8.3f}".format(m9a[2]), print " Mag:", "{:+7.3f}".format(m9m[0]), "{:+7.3f}".format(m9m[1]), "{:+7.3f}".format(m9m[2]) pwm.set_duty_cycle(SERVO_MIN) pwm.set_duty_cycle(SERVO_MIN) time.sleep(0.5) pwm.set_duty_cycle(SERVO_HALF) pwm.set_duty_cycle(SERVO_HALF) time.sleep(0.5) #if m9a[0] < -5: # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_HALF) # pwm.setPWM(NAVIO_RCOUTPUT_2, 0, SERVO_M_HALF) #elif m9a[0] > 5: # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_M_HALF) # pwm.setPWM(NAVIO_RCOUTPUT_2, 0, SERVO_HALF) #else : # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_MAX) # pwm.setPWM(NAVIO_RCOUTPUT_2, 0, SERVO_MAX) # Set frequency to 60 Hz # Sample Program #while(True): # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_MIN); # time.sleep(1); # pwm.setPWM(NAVIO_RCOUTPUT_1, 0, SERVO_MAX); # time.sleep(1); # # # # # # #

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
書式はpython,ラズパイのバージョンは2のmodel Bです。

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

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

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

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

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

ocho0

2017/01/09 07:36

はい!そこからダウンロードしました!
ocho0

2017/01/09 07:52

こちらもエラーが出てしまいます...Traceback (most recent call last): File "Servo.py", line 17, in <module> pwm = navio.pwm.PWM(PWM_OUTPUT) AttributeError: 'module' object has no attribute 'pwm'
can110

2017/01/09 08:08

公式の手順どおりに行ったのに動作しないのであれば購入先に問い合わせるかまたはフォーラムhttps://community.emlid.com/で探すほうが早いかもしれません。
ocho0

2017/01/09 09:22

無事サンプルプログラムは動いたのですが自分で編集したプログラムは動きません...エラーはIOError: [Errno 22] Invalid argumentとなっています。
ocho0

2017/01/09 09:23

すいません、一部抜けていました。エラー全体はTraceback (most recent call last): File "test1.py", line 59, in <module> pwm.set_duty_cycle(SERVO_MAX) File "/home/pi/Navio2/Python/navio/pwm.py", line 23, in set_duty_cycle pwm_duty.write(str(period_ns)) IOError: [Errno 22] Invalid argumentです。
guest

回答2

0

ベストアンサー

まず確認ですが、公式のNavio2/Python/Servo.pyは正常に動作するが、ご自身のコードではエラー発生するということでしょうか?
set_duty_cycle関数Navio2/Python/navio/pwm.pyの定義と動作を見る限り、問題はないように見受けられます。
ただし、Navio2の仕様として、引数に与えることができる値の範囲(最大~最小)に制限があるかもしれませんので
ドキュメントなりを参照ください。

また、一般的に動作テストを行う場合は、できるだけ単純で正しく動作する部分から始め、徐々にコードを足していくことで、問題の部分を絞り込むことができます。

投稿2017/01/10 08:40

can110

総合スコア38262

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

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

ocho0

2017/01/19 06:24

回答ありがとうございます!後でわかったのですがバージョンが古い物が混ざっていたりなど、プログラム以前の問題もあったので一旦1からやり直す結果となりました。動作のアドバイスもしていただいてありがとうございます。
guest

0

Invalid argument (引数が間違えている)エラーなのですから、

pwm.set_duty_cycle(SERVO_MAX)

のset_duty_cycleの引数が正しくないのです。

[RazDrone] ラズパイが空を飛ぶまで (0.準備編)
の記事に書かれたコードを見ると、set_duty_cycleは2つの引数が必要で、1つ目がPWM(Pulse Width Modulation)の信号を出力する先(ピン番号)、2つ目がduty cycleの値になっています。

Invalid argumentのようなコンパイルエラーが出た時には、まず関数(メソッド)の仕様を確認するのが早期解決のコツです。

投稿2017/01/10 03:18

coco_bauer

総合スコア6915

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

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

can110

2017/01/10 07:24

提示されたページのソースはC++のようですが質問者はpythonで記載しています。 また、IOError: [Errno 22] ~ であり、公式サンプル(Servo.py)でも SERVO_MIN = 1.250 #ms pwm.set_duty_cycle(SERVO_MIN) と記述されているので、関数呼出(引数の数、型)としては正しいようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問