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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1725閲覧

pic16f1828と加速度センサMPU6050をI2Cでつなぐ

haruo8219

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/01/19 01:27

pic16f1828とMPU6050(GY-521)をi2c通信で通信させ、
加速度センサで読み取った値に応じて、picのPWM信号で適切なDuty比を選択するというプログラムを作っています。
MPLAB X IDE v4.05で作成しています。
作成したのはしたのですが、どうやらi2c通信がされていないようです。
MPLABの方でエラーはでていません。
間違いを教えていただければと思います。

[picのPWM信号で適切なDuty比を選択する]という部分は無視してもらって構いません。


// main program #include <stdio.h> #include <stdlib.h> #include <xc.h> #include "i2cMaster.h" #include "MPU6050.h" // CONFIG1 #pragma config FOSC = INTOSC #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config CLKOUTEN = OFF #pragma config IESO = OFF #pragma config FCMEN = OFF // CONFIG2 #pragma config WRT = OFF #pragma config PLLEN = OFF #pragma config STVREN = OFF #pragma config BORV = LO #pragma config LVP = OFF // クロック周波数指定 #define _XTAL_FREQ 1000000 int main(int argc, char** argv) { // PICマイコン設定 OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定 ANSELA = 0b00000000; // すべてのピンをデジタルモードに設定 TRISA = 0b00001000; // すべてのピンを出力モードに設定(ただしRA3ピンは常に入力モード) // 変数宣言 unsigned short timer; // 時間計測 unsigned short duty; // PWMのデューティーサイクル // PWM機能のピン割り当て設定 APFCON1bits.CCP2SEL = 1; // CCP2CONbits.CCP2M = 0b1100; // CCP2CONbits.P2M = 0b00; // // 周期(1ms)とデューティーサイクル(0.5ms)の設定 T2CONbits.T2CKPS = 0b00; // PR2 = 249; // CCPR2L = 500/4; // CCP2CONbits.DC2B = 500; // PWM制御スタート T2CONbits.TMR2ON = 1; // デューテー比は1%から99%の制御にする while(1) { // 1% -> 99%の制御 for(duty=10; duty<=990; duty++) { CCPR2L = duty / 4; // 上位8ビット CCP2CONbits.DC2B = duty; // 下位2ビット __delay_ms(1); } // 99% -> 1%の制御 for(duty=10; duty>=990; duty--) { CCPR2L = duty / 4; // 上位8ビット CCP2CONbits.DC2B = duty; // 下位2ビット __delay_ms(1); } } return (EXIT_SUCCESS) }
//i2cMaster.h Headr file program #define I2C_READ 0x01 #define I2C_WRITE 0x00 void i2c_Init(void); void i2c_Wait(void); void i2c_Start(void); void i2c_Restart(void); void i2c_Stop(void); void i2c_Write(unsigned char data); void i2c_Address(unsigned char address, unsigned char mode); unsigned char i2c_Read(unsigned char ack); // Main Function void LDByteWriteI2C(unsigned char i2cSlaveAddress, unsigned char LowAdd, unsigned char data); void LDByteReadI2C(unsigned char i2cSlaveAddress, unsigned char Address, unsigned char *Data, unsigned char Length); #ifndef XC_HEADER_TEMPLATE_H #define XC_HEADER_TEMPLATE_H #include <xc.h> // include processor files - each processor file is guarded. #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif
// MPU6050.h Headr file program #define MPU6050_ADDRESS 0x68 // Address with end write bit #define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD #define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD #define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD #define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN #define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN #define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN #define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS #define MPU6050_RA_XA_OFFS_L_TC 0x07 #define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS #define MPU6050_RA_YA_OFFS_L_TC 0x09 #define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS #define MPU6050_RA_ZA_OFFS_L_TC 0x0B #define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR #define MPU6050_RA_XG_OFFS_USRL 0x14 #define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR #define MPU6050_RA_YG_OFFS_USRL 0x16 #define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR #define MPU6050_RA_ZG_OFFS_USRL 0x18 #define MPU6050_RA_SMPLRT_DIV 0x19 #define MPU6050_RA_CONFIG 0x1A #define MPU6050_RA_GYRO_CONFIG 0x1B #define MPU6050_RA_ACCEL_CONFIG 0x1C #define MPU6050_RA_FF_THR 0x1D #define MPU6050_RA_FF_DUR 0x1E #define MPU6050_RA_MOT_THR 0x1F #define MPU6050_RA_MOT_DUR 0x20 #define MPU6050_RA_ZRMOT_THR 0x21 #define MPU6050_RA_ZRMOT_DUR 0x22 #define MPU6050_RA_FIFO_EN 0x23 #define MPU6050_RA_I2C_MST_CTRL 0x24 #define MPU6050_RA_I2C_SLV0_ADDR 0x25 #define MPU6050_RA_I2C_SLV0_REG 0x26 #define MPU6050_RA_I2C_SLV0_CTRL 0x27 #define MPU6050_RA_I2C_SLV1_ADDR 0x28 #define MPU6050_RA_I2C_SLV1_REG 0x29 #define MPU6050_RA_I2C_SLV1_CTRL 0x2A #define MPU6050_RA_I2C_SLV2_ADDR 0x2B #define MPU6050_RA_I2C_SLV2_REG 0x2C #define MPU6050_RA_I2C_SLV2_CTRL 0x2D #define MPU6050_RA_I2C_SLV3_ADDR 0x2E #define MPU6050_RA_I2C_SLV3_REG 0x2F #define MPU6050_RA_I2C_SLV3_CTRL 0x30 #define MPU6050_RA_I2C_SLV4_ADDR 0x31 #define MPU6050_RA_I2C_SLV4_REG 0x32 #define MPU6050_RA_I2C_SLV4_DO 0x33 #define MPU6050_RA_I2C_SLV4_CTRL 0x34 #define MPU6050_RA_I2C_SLV4_DI 0x35 #define MPU6050_RA_I2C_MST_STATUS 0x36 #define MPU6050_RA_INT_PIN_CFG 0x37 #define MPU6050_RA_INT_ENABLE 0x38 #define MPU6050_RA_DMP_INT_STATUS 0x39 #define MPU6050_RA_INT_STATUS 0x3A #define MPU6050_RA_ACCEL_XOUT_H 0x3B #define MPU6050_RA_ACCEL_XOUT_L 0x3C #define MPU6050_RA_ACCEL_YOUT_H 0x3D #define MPU6050_RA_ACCEL_YOUT_L 0x3E #define MPU6050_RA_ACCEL_ZOUT_H 0x3F #define MPU6050_RA_ACCEL_ZOUT_L 0x40 #define MPU6050_RA_TEMP_OUT_H 0x41 #define MPU6050_RA_TEMP_OUT_L 0x42 #define MPU6050_RA_GYRO_XOUT_H 0x43 #define MPU6050_RA_GYRO_XOUT_L 0x44 #define MPU6050_RA_GYRO_YOUT_H 0x45 #define MPU6050_RA_GYRO_YOUT_L 0x46 #define MPU6050_RA_GYRO_ZOUT_H 0x47 #define MPU6050_RA_GYRO_ZOUT_L 0x48 #define MPU6050_RA_EXT_SENS_DATA_00 0x49 #define MPU6050_RA_EXT_SENS_DATA_01 0x4A #define MPU6050_RA_EXT_SENS_DATA_02 0x4B #define MPU6050_RA_EXT_SENS_DATA_03 0x4C #define MPU6050_RA_EXT_SENS_DATA_04 0x4D #define MPU6050_RA_EXT_SENS_DATA_05 0x4E #define MPU6050_RA_EXT_SENS_DATA_06 0x4F #define MPU6050_RA_EXT_SENS_DATA_07 0x50 #define MPU6050_RA_EXT_SENS_DATA_08 0x51 #define MPU6050_RA_EXT_SENS_DATA_09 0x52 #define MPU6050_RA_EXT_SENS_DATA_10 0x53 #define MPU6050_RA_EXT_SENS_DATA_11 0x54 #define MPU6050_RA_EXT_SENS_DATA_12 0x55 #define MPU6050_RA_EXT_SENS_DATA_13 0x56 #define MPU6050_RA_EXT_SENS_DATA_14 0x57 #define MPU6050_RA_EXT_SENS_DATA_15 0x58 #define MPU6050_RA_EXT_SENS_DATA_16 0x59 #define MPU6050_RA_EXT_SENS_DATA_17 0x5A #define MPU6050_RA_EXT_SENS_DATA_18 0x5B #define MPU6050_RA_EXT_SENS_DATA_19 0x5C #define MPU6050_RA_EXT_SENS_DATA_20 0x5D #define MPU6050_RA_EXT_SENS_DATA_21 0x5E #define MPU6050_RA_EXT_SENS_DATA_22 0x5F #define MPU6050_RA_EXT_SENS_DATA_23 0x60 #define MPU6050_RA_MOT_DETECT_STATUS 0x61 #define MPU6050_RA_I2C_SLV0_DO 0x63 #define MPU6050_RA_I2C_SLV1_DO 0x64 #define MPU6050_RA_I2C_SLV2_DO 0x65 #define MPU6050_RA_I2C_SLV3_DO 0x66 #define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67 #define MPU6050_RA_SIGNAL_PATH_RESET 0x68 #define MPU6050_RA_MOT_DETECT_CTRL 0x69 #define MPU6050_RA_USER_CTRL 0x6A #define MPU6050_RA_PWR_MGMT_1 0x6B #define MPU6050_RA_PWR_MGMT_2 0x6C #define MPU6050_RA_BANK_SEL 0x6D #define MPU6050_RA_MEM_START_ADDR 0x6E #define MPU6050_RA_MEM_R_W 0x6F #define MPU6050_RA_DMP_CFG_1 0x70 #define MPU6050_RA_DMP_CFG_2 0x71 #define MPU6050_RA_FIFO_COUNTH 0x72 #define MPU6050_RA_FIFO_COUNTL 0x73 #define MPU6050_RA_FIFO_R_W 0x74 #define MPU6050_RA_WHO_AM_I 0x75 int MPU6050_Test_I2C(void); void Setup_MPU6050(void); void Get_Accel_Values(void); unsigned char GotInt_MPU6050(void); typedef struct { short Gx,Gy,Gz; unsigned short Timer; unsigned long SumSquare; }GForceStruct; extern GForceStruct CurrentData; extern GForceStruct PeakData; #ifndef XC_HEADER_TEMPLATE_H #define XC_HEADER_TEMPLATE_H #include <xc.h> // include processor files - each processor file is guarded. #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ // TODO If C++ is being used, regular C code needs function names to have C // linkage so the functions can be used by the c code. #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* XC_HEADER_TEMPLATE_H */

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

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

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

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

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

ozwk

2018/01/19 01:46

main()のどこでI2C通信をしているつもりなんですか?
haruo8219

2018/01/19 01:49

ヘッダに入っているだけではだめなのですか?
ozwk

2018/01/19 02:25 編集

stdio.hをインクルードしたらあなたの意思を汲んで勝手にprintfしてくれますか?
haruo8219

2018/01/19 02:40

ということは、メインのプログラムのどこにI2Cについてのプログラムを入れればよいのですか?
guest

回答1

0

ベストアンサー

GitHubに PICとMPU6050をI2Cでつないで加速度のデータを取得する例があります。
Pic to MPU6050 accelerometer via bluetooth interface

コードを作成・修正する参考になると思います。

投稿2018/01/19 02:25

coco_bauer

総合スコア6915

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

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

haruo8219

2018/01/19 02:32

ありがとうございます。 そのページの参考プログラムを参考に作成しています。 根本的に知識がないのでpicによるPWM制御のプログラムに どうつなげればいいのかがわかりません。 もし。coco_bauerさんが作成するとなれば、そのページのどのプログラムを どのようにつなげますか? 初心者で全く分からず、無理なお願いとは承知の上でご回答よろしくお願いいたします。
coco_bauer

2018/01/24 03:27

何がしたいのか判らないので具体的な事は申し上げようがありませんが、感じたのは次のような事です。1)加速度センサーからの数値を使って、速度(加速度の積分:xyzの3方向とpitch,yaw,rollの3軸)、位置(速度の積分:xyzの3方向とpitch,yaw,rollの3軸)を常時把握する部分が見当たらない。2)制御する目標が判らないし、そこに至るためにPID制御をしようとしている部分が見当たらない。3)PID制御に必要な値をPWMで制御するのであるが、PWMの端子にどのような機器が接続されていて、それへの出力が加速度、速度、位置にどのように影響するのかが明らかでない。例えば車の方向を変えるには、タイヤの方向を変える方式(乗用車等)と左右のタイヤの回転速度に差をつける方式(ブルドーザーや戦車等)があるが、それぞれの制御プログラムは相当異なったものになる。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問