Quadcopterで遊んでたら、そういや、MPU-6050のモジュールって昔買ったよね、と思い出した。
例によって、Arduinoで動作確認したきり放置してある。
「某海外通販で購入したArduino UNO R3 互換機で遊ぶ -その07 MPU-6050ボード-」
InvenSense社のMPU6050を搭載した、三軸加速度センサ・三軸ジャイロセンサモジュールだ。
何でこう、動いただけで安心しちゃうのかは不明だ。
もちろん自分で1から作るわけじゃないので、PICで動かしている例を探す。
ここを参考にさせていただくことにした。
元の環境は、PIC12F1840、MPLAB IDE v8.90、Hitech C と書かれている。
ここでは、PIC16F1827、MPLAB X IDE v2.35、XC8 v1.34 を用いた。
HC04というBluetoothモジュールを使っているらしいが、ここではFT232RLモジュールでPC上のTeraTermと通信する。
そもそもは、ボールの中に組み込んでBluetoothで通信して、ボールの落下とか衝突とかのデータを取る目的のようだ。
それはそれで面白そうだが、HC04とやらを持ち合わせていないので、FT232RLで我慢する。
下の写真が実行中の様子。
ブレッドボード上のPIC16F1827、FT232RLモジュール、PICkit3、MPC6050モジュールが写っている。
PIC16F1827用のプロジェクトを作成して、もらってきたコードをぶっこむ。
とにかくコンパイルしてエラーを出して、エラーの出た部分を眺めて順に直していくという手順だ。
なので、些細なエラーの場合はその場限りの対処で、何をどうやったか覚えていない部分もある。
覚えている部分だけ書く。
まず、使うPICが違っててピン数も使うピンも変わるのだが、これは以下のように割り当てる。
初期設定ではいろいろバッティングしてしまうが、Alternate Pin Functionという恐ろしく便利な機能がある。
とりあえず、I2C用のSDAとSCLはそのまま初期設定のピンを使うことにして、それらと重複するRX、TXを別のピンへ移動させることにした。
結果的に、センサー・モジュールとは7ピンのSDA、10ピンのSCLで通信し、FT232RLモジュールとは8ピンのRX、11ピンのTXで通信することになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
GCrash.c #include <xc.h> // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = ON // PLL Enable (4x PLL enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) main(void){ //APFCON = 0b10000100;//Set Rx/Tx to pin 2&3 APFCON0bits.RXDTSEL = 1;//RX/DT function is on RB2 APFCON1bits.TXCKSEL = 1;//TX/CK function is on RB5 |
Configuration Bitsも含めて、main.cで上のように変更する。
APFCONはPIC16F1827では0と1に分かれているので、APFCON0とAPFCON1は存在するがAPFCONは存在しない。
コンパイルすると元のソースのAPFCONの部分でエラーが出て、変更点を見つけやすい。
次は、コンパイルではエラーにならずに若干探すのが厄介だが、I2C用のピンがオリジナルと異なるので以下のように変更しなければならない。
1 2 3 4 5 6 |
i2cMaster.c void i2c_Init(void){ //TRISA1 = 1;//set SCL and SDA pins as inputs TRISB1 = 1; //TRISA2 = 1; TRISB4 = 1; |
何か、もっと細々とあった気がするが、主な変更点はこんなところだ。
書き込んで、FT232RLのモジュールとPCをつないで、TeraTermを立ち上げてからリセットすると、コマンドを受け付けてくれる状態になるので、とりあえず、データを垂れ流しにさせているところが以下の動画だ。
わざと机を揺らして値を変化させているので、冒頭ちょっと見難いかも。
Arduinoでは3Dの飛行機を表示させて遊んだが、PICで動かせるようになったので、数cm角の基板に組み込めることになり、使用範囲は格段に広がる。
さて何をつくろうかな。