###前提・実現したいこと
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です。
回答2件
あなたの回答
tips
プレビュー