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

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

ただいまの
回答率

91.03%

  • C

    3062questions

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

  • pip

    137questions

    pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。

picマイコンと加速度センサをSPI通信で通信させる。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 372
退会済みユーザー

退会済みユーザー

以下のプログラムを MPLAB X IDE v4.05によって
PICマイコン[16f1828]20ピンと加速度センサ[MPU6050]を通信させるにはどのような
プログラムに変更すればよろしいですか?

↓のプログラムはPICマイコン[24FJ64GA004]の44ピン。
加速度センサ[ADXL345]を使用した場合のプログラムとなっています。

ご回答よろしくお願いいたします。

include "p24FJ64GA004.h"

include "spi.h"

include "pps.h"

// コンフィギュレーション ビットの設定
_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF &    BKBUG_ON
& COE_OFF & ICS_PGx1& FWDTEN_OFF ) 
_CONFIG2( IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD
& OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE)

// ADXL-345レジスタアドレス

define    BW_RATE        0x2C    //Data rate and power mode control

define POWER_CTL    0x2D    //Power Control Register

define    DATA_FORMAT    0x31    //Data format control

define DATAX0        0x32    //X-Axis Data 0

// SPI1通信で受信したデータバッファ
static char Adxl345_buf[10];

// 遅延関数     
void Delay(unsigned int CNT)
{
unsigned int i,j;
for(i=0; i<CNT; i++)
for(j=0; j<100; j++);
}

// SPI書き込み
void WriteRegister(char registerAddress, char value)
{
unsigned char dummy = 0;

// SPI開始時にLOW
_RC4        = 0;

// 書き込みアドレス指定
putsSPI1(1, &registerAddress);
Delay(5);
dummy = getcSPI1();

// 書き込み
putsSPI1(1, &value);
Delay(5);
dummy = getcSPI1();    

// SPI終了時にHIGH
_RC4        = 1;
}

// SPI読み込み
void ReadRegister(char registerAddress, int numBytes)
{
char dat[10];
unsigned int i = 0;
unsigned char dummy = 0x00;
char dummyDat;

// 複数バイト読み出し時のお作法
char address = 0x80 | registerAddress;
if(numBytes > 1)address = address | 0x40;

// SPI開始時にLOW
_RC4        = 0;

// 読み出し先アドレスの指定
putsSPI1(1, &address);
Delay(5);
dummyDat = getcSPI1();

Delay(5);

// 値の読み出し
for(i = 0; i < numBytes; i++)
{
putsSPI1(1, &dummy);
Delay(5);
dat[i] = getcSPI1();
Delay(5);
}

// SPI終了時にHIGH
_RC4        = 1;

for(i = 0; i < numBytes; i++)
{
Adxl345_buf[i] = dat[i];
}
}

int main(void)
{
// 全ポートディジタルに指定
AD1PCFG = 0xFFFF;

// LEDポート設定
_TRISB10    = 0;    // RB10 出力

// ポートの設定
PPSInput (PPS_SDI1    ,PPS_RP5);
PPSOutput(PPS_RP6    ,PPS_SDO1);
PPSOutput(PPS_RP21    ,PPS_SCK1OUT);
PPSOutput(PPS_RP20    ,PPS_SS1OUT);

// SPIの初期化
_TRISC4        = 0;    // RP20/RC4 出力
_RC4        = 1;    // CSを立てる

CloseSPI1();    // 念のため

OpenSPI1(
// config1
ENABLE_SCK_PIN &        // SPICLKを有効にする
ENABLE_SDO_PIN &        // SDOピンをモジュールで制御する
SPI_MODE8_ON &            // データ長を8bitとする
SPI_SMP_ON &            // データのエッジでサンプリングする
SPI_CKE_OFF &            // Idle->Acrive遷移時にデータを変える
SLAVE_ENABLE_OFF &        // SSをモジュールで制御しない
CLK_POL_ACTIVE_LOW &    // CLKをActive = Lowとする
MASTER_ENABLE_ON &        // Masterとして使う
SEC_PRESCAL_2_1 &
PRI_PRESCAL_1_1,

// config2
FRAME_ENABLE_OFF,

// config3
SPI_ENABLE &
SPI_IDLE_CON &
SPI_RX_OVFLOW_CLR
);

// 割り込み許可しない
ConfigIntSPI1(SPI_INT_DIS & SPI_INT_PRI_6);    

// ADXL-345初期化
// 加速度センサレジスタ設定
WriteRegister(DATA_FORMAT, 0x03);  // +-16g 10bit
WriteRegister(BW_RATE, 0x19);
WriteRegister(POWER_CTL, 0x08);  //Measurement mode

int Adxl345_x, Adxl345_y, Adxl345_z;
double Adxl345_xg, Adxl345_yg, Adxl345_zg;

// メインループ
while(1)
{
// 加速度受信
ReadRegister(DATAX0, 6);

// 加速度計算
Adxl345_x = ((int)Adxl345_buf[1]<<8)|(int)Adxl345_buf[0];
Adxl345_y = ((int)Adxl345_buf[3]<<8)|(int)Adxl345_buf[2];
Adxl345_z = ((int)Adxl345_buf[5]<<8)|(int)Adxl345_buf[4];

Adxl345_xg = Adxl345_x * 0.03125;
Adxl345_yg = Adxl345_y * 0.03125;
Adxl345_zg = Adxl345_z * 0.03125;

// Z方向に5g以上の加速度を検知したらLED点灯
if(Adxl345_zg >= 5.0)
{
LATBbits.LATB10 = 0;
}
}

CloseSPI1();

return 0;
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

MPU6000/MPU6050のマニュアル MPU-6000 and MPU-6050 Product Specification Revision 3.4 によると、MPU6050にはSPI通信の機能が無いようです。

SPI通信機能があるMPU6000を使う、I2C通信を使うなどを検討すべきかと思います。


質問に加速度センサ[ADXL345]をつかうコードが書かれていますが、ADXL345のような3軸の加速度センサーでよいのなら選択枝は増えると思います。(MPU-60X0のような3軸加速度、3軸回転加速度の6軸加速度センサーは多くありませんから)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • C

    3062questions

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

  • pip

    137questions

    pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。