前提
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を利用しています。
どなたか教えてください。よろしくお願いします。
あなたの回答
tips
プレビュー