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

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

ただいまの
回答率

90.34%

  • Python

    9159questions

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

  • Linux

    4030questions

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

  • Raspberry Pi

    892questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,803

ocho0

score 4

前提・実現したいこと

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です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • can110

    2017/01/09 17:08

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

    キャンセル

  • ocho0

    2017/01/09 18:22

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

    キャンセル

  • ocho0

    2017/01/09 18: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です。

    キャンセル

回答 2

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/19 15:24

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

    キャンセル

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 16:24

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

    キャンセル

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

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

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

  • Python

    9159questions

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

  • Linux

    4030questions

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

  • Raspberry Pi

    892questions

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