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

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

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

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

0回答

947閲覧

I2Cを使ったArduinoのプログラムをPICのプログラムに書き換えたい。

tea_shark

総合スコア1

C

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2022/04/10 08:51

前提

PICでジャイロセンサを使おうとしています。そこでArduinoのジャイロセンサのプログラムをPICのプログラムに書き換えようとしています。

該当のソースコード

Arduinoのプログラム

arduino

1#include<Wire.h> 2// BMX055 加速度センサのI2Cアドレス 3#define Addr_Accl 0x19 // (JP1,JP2,JP3 = Openの時) 4 5// センサーの値を保存するグローバル変数 6float xAccl = 0.00; 7float yAccl = 0.00; 8float zAccl = 0.00; 9 10void setup() 11{ 12 // Wire(Arduino-I2C)の初期化 13 Wire.begin(); 14 // デバッグ用シリアル通信は9600bps 15 Serial.begin(9600); 16 //BMX055 初期化 17 BMX055_Init(); 18 delay(300); 19} 20 21void loop() 22{ 23 Serial.println("--------------------------------------"); 24 25 //BMX055 加速度の読み取り 26 BMX055_Accl(); 27 Serial.print("Accl= "); 28 Serial.print(xAccl); 29 Serial.print(","); 30 Serial.print(yAccl); 31 Serial.print(","); 32 Serial.print(zAccl); 33 Serial.println(""); 34 delay(1000); 35} 36 37//=====================================================================================// 38void BMX055_Init() 39{ 40 //------------------------------------------------------------// 41 Wire.beginTransmission(Addr_Accl); 42 Wire.write(0x0F); // Select PMU_Range register 43 Wire.write(0x03); // Range = +/- 2g 44 Wire.endTransmission(); 45 delay(100); 46 //------------------------------------------------------------// 47 Wire.beginTransmission(Addr_Accl); 48 Wire.write(0x10); // Select PMU_BW register 49 Wire.write(0x08); // Bandwidth = 7.81 Hz 50 Wire.endTransmission(); 51 delay(100); 52 //------------------------------------------------------------// 53 Wire.beginTransmission(Addr_Accl); 54 Wire.write(0x11); // Select PMU_LPW register 55 Wire.write(0x00); // Normal mode, Sleep duration = 0.5ms 56 Wire.endTransmission(); 57 delay(100); 58}

試したこと

PICのプログラム

C

1#include "mcc_generated_files/mcc.h" 2#include "mcc_generated_files/examples/i2c_master_example.c" 3 4// BMX055 加速度センサのI2Cアドレス 5#define Addr_Accl 0x19 // (JP1,JP2,JP3 = Openの時) 6 7// センサーの値を保存するグローバル変数 8float xAccl = 0.00; 9float yAccl = 0.00; 10float zAccl = 0.00; 11 12void BMX055_Init(void); 13void BMX055_Accl(void); 14 15void main(void) 16{ 17 // initialize the device 18 SYSTEM_Initialize(); 19 20 // Enable the Global Interrupts 21 INTERRUPT_GlobalInterruptEnable(); 22 23 // Enable the Peripheral Interrupts 24 INTERRUPT_PeripheralInterruptEnable(); 25 26 // Wire(Arduino-I2C)の初期化 27 I2C_Initialize(); 28 //BMX055 初期化 29 BMX055_Init(); 30 __delay_ms(300); 31 32 while (1) 33 { 34 //BMX055 加速度の読み取り 35 BMX055_Accl(); 36 printf("Accl= "); 37 printf(xAccl); 38 printf(","); 39 printf(yAccl); 40 printf(","); 41 printf(zAccl); 42 printf("\n"); 43 } 44} 45 46void BMX055_Init() 47{ 48 //------------------------------------------------------------// 49 I2C_Open(Addr_Accl); 50 I2C_WriteNBytes(Addr_Accl,0x0F,1); // Select PMU_Range register 51 I2C_WriteNBytes(Addr_Accl,0x03,1); // Range = +/- 2g 52 I2C_Close(); 53 __delay_ms(100); 54 //------------------------------------------------------------// 55 I2C_Open(Addr_Accl); 56 I2C_WriteNBytes(Addr_Accl,0x10,1); // Select PMU_BW register 57 I2C_WriteNBytes(Addr_Accl,0x08,1); // Bandwidth = 7.81 Hz 58 I2C_Close(); 59 __delay_ms(100); 60 //------------------------------------------------------------// 61 I2C_Open(Addr_Accl); 62 I2C_WriteNBytes(Addr_Accl,0x11,1); // Select PMU_LPW register 63 I2C_WriteNBytes(Addr_Accl,0x00,1); // Normal mode, Sleep duration = 0.5ms 64 I2C_Close(); 65 __delay_ms(100); 66} 67 68void BMX055_Accl() 69{ 70 unsigned int data[6]; 71 for (int i = 0; i < 6; i++) 72 { 73 I2C_Open(Addr_Accl); 74 I2C_WriteNBytes((Addr_Accl,2 + i,1));// Select data register 75 I2C_Close(); 76 Wire.requestFrom(Addr_Accl, 1);// Request 1 byte of data 77 // Read 6 bytes of data 78 // xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb 79 if (Wire.available() == 1) 80 data[i] = SSP1BUF; 81 } 82 // Convert the data to 12-bits 83 xAccl = ((data[1] * 256) + (data[0] & 0xF0)) / 16; 84 if (xAccl > 2047) xAccl -= 4096; 85 yAccl = ((data[3] * 256) + (data[2] & 0xF0)) / 16; 86 if (yAccl > 2047) yAccl -= 4096; 87 zAccl = ((data[5] * 256) + (data[4] & 0xF0)) / 16; 88 if (zAccl > 2047) zAccl -= 4096; 89 xAccl = xAccl * 0.0098; // range = +/-2g 90 yAccl = yAccl * 0.0098; // range = +/-2g 91 zAccl = zAccl * 0.0098; // range = +/-2g 92}

Arduinoのプログラムをわかる範囲で書き換えました。変更点は下記の通りです。

  • Wire.beginTransmission(Addr_Accl); を I2C_Open(Addr_Accl); に変更
  • Serial.print(); を printf(); に変更
  • Wire.write(); を I2C_WriteNBytes(); に変更
  • Wire.endTransmission(); を I2C_Close(); に変更
  • data[i] = Wire.read(); を data[i] = SSP1BUF; に変更
  • delay(); を __delay_ms(); に変更

上記の変更はあっていますでしょうか?
また、

arduino

1Wire.requestFrom();

arduino

1Wire.available()

この2つのArduinoのコードをPICでのコードに書き換えるときに、
どのように変えればいいか分かりませんでした。

補足情報

MCCを利用しています。

どなたか教えてください。よろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問