PICでAndroid Open Accessoryをつくる:04-1

#ファームウェア作成
Android Open Accessoryとして動作させるためのファームウェアを準備し、作成した回路の動作確認を行います。

##ダウンロードファイル
- [Microchipアプリケーション用ライブラリ v2016-11-07](http://www.microchip.com/ja/mplab/microchip-libraries-for-applications)（2016/12/30現在）<br/>
[最新MLA]タブ内にリンクがあります

##インストール
Microchipアプリケーション用ライブラリをインストールします。
インストール中にコンポーネントを選択する画面が表示されますが、「Smartphone Demo Projects」が必須となります。（その他は任意です）
![04_01.png](https://qiita-image-store.s3.amazonaws.com/0/153698/3cce75e8-cac2-af1a-33f8-72c175989e82.png)

##プロジェクトの設定
- PICKit3をPCと接続します
- MPLAB X IDEを起動します
- メニューバーの「File」-「Open Project」を実行します
- Microchipアプリケーション用ライブラリインストールフォルダ内の「mla\v2016_11_07\apps\smartphone\android\aoa_basic_io\firmware\MPLAB.X」を開きます。<br/>（デフォルトでは「c:\microchip\mla\v2016_11_07\apps\smartphone\android\aoa_basic_io\firmware\MPLAB.X」となります）
- プロジェクト「Basic Android Accessory Demo」がデフォルトプロジェクトになっていない場合（プロジェクト名がボールドになっていない）、プロジェクト「Basic Android Accessory Demo」を右クリックしてコンテキストメニューを開き、Set as Main Projectを実行します
- プロジェクト「Basic Android Accessory Demo」を右クリックしてコンテキストメニューを開き、Propertiesを実行します
- Project Propertiesダイアログが開かれますので、以下の作業を順に行います
    - Categoriesから「Conf:PIC24FJ64GB004」を選択
    - Deviceから「PIC24FJ64GB002」を選択（デフォルトで表示されているPIC24FJ64GB004のひとつ上です）
    - Hardware ToolからPICKit3のシリアルを選択
    - 「Apply」をクリック<br/>![04_02.png](https://qiita-image-store.s3.amazonaws.com/0/153698/53b3555e-172e-b9e1-24de-5cd4c74139b3.png)
    - Categoriesの「Conf:PIC24FJ64GB004」の下層の「ICD 3」が「PICkit 3」に変わるので選択します![04_03.png](https://qiita-image-store.s3.amazonaws.com/0/153698/de8ee6e6-4d76-1bd9-e563-3cef9866cb9e.png)
    - Option categoriesから「Power」を選択し、「Power target circuit from PICkit3」にチェックをつけ、「OK」をクリックします![04_04.png](https://qiita-image-store.s3.amazonaws.com/0/153698/aca5803f-e761-534e-6cbf-fddf7d5d8675.png)
- リボンバーにあるドロップダウンリストから「PIC24FJ64GB004_PIM」を選択します<br/>![04_05.png](https://qiita-image-store.s3.amazonaws.com/0/153698/5139d6f5-c58f-45c0-1241-7df0280f9656.png)

##ファームウェアの構築
現状ではPIC24FJ64GB004用のソースとなっているため、今回使用する環境に合わせてソースを修正していきます。
本来は各ボタン、各LEDをそれぞれのピンに割り当てますが、今回はボタン（IR入力）、LEDともに１つずつしか使用しないため、ボタン、LEDをそれぞれ1つのピンにまとめて割り当てています。

- Source Files - app - main.c 抜粋

```c:main.c
int main(void)
{
    // 追記
    CLKDIV = 0x0000;     // System Clock Freq. = 32MHz

    SYSTEM_Initialize(SYSTEM_STATE_DEFAULT);

    APP_AndroidBasicIOInitialize();

    USBHostInit(0);

    while(1)
    {
        //Keep the USB stack running
        USBHostTasks();
        AndroidTasks();

        APP_AndroidBasicIOTasks();
    }
}
```

- Source Files - app - system_config - exp16 - pic24fj64gb004_pim - system.c 抜粋

```c:system.c
/** CONFIGURATION Bits **********************************************/
#pragma config WDTPS = PS1
#pragma config FWPSA = PR32
#pragma config WINDIS = OFF
#pragma config FWDTEN = OFF
#pragma config ICS = PGx1
#pragma config GWRP = OFF
#pragma config GCP = OFF
#pragma config JTAGEN = OFF

//#pragma config POSCMOD = HS //下記に修正
#pragma config POSCMOD = NONE
#pragma config I2C1SEL = PRI
#pragma config IOL1WAY = OFF
#pragma config OSCIOFNC = ON
//#pragma config FCKSM = CSDCMD //下記に修正
#pragma config FCKSM = CSECME
//#pragma config FNOSC = PRIPLL //下記に修正
#pragma config FNOSC = FRCPLL
#pragma config PLL96MHZ = ON
#pragma config PLLDIV = DIV2
#pragma config IESO = OFF

#pragma config WPFP = WPFP0
//#pragma config SOSCSEL = SOSC //下記に修正
#pragma config SOSCSEL = IO
#pragma config WUTSEL = LEG
#pragma config WPDIS = WPDIS
#pragma config WPCFG = WPCFGDIS
#pragma config WPEND = WPENDMEM

#pragma config DSWDTPS = DSWDTPS3
#pragma config DSWDTOSC = LPRC
//#pragma config RTCOSC = SOSC //下記に修正
#pragma config RTCOSC = LPRC
#pragma config DSBOREN = OFF
#pragma config DSWDTEN = OFF
```

- Source Files - bsp - exp16 - pic24fj64gb004_pim - buttons.c 抜粋

```c:buttons.c
/*** Button Definitions *********************************************/
//      S1  is MCLR button
//#define S3_PORT  PORTAbits.RA10       //下記に修正
#define S3_PORT  PORTBbits.RB5      //Overlaps with D3
//#define S6_PORT  PORTAbits.RA9        //下記に修正
#define S6_PORT  PORTBbits.RB5       //Overlaps with D7
//#define S5_PORT  PORTCbits.RC6        //下記に修正
#define S5_PORT  PORTBbits.RB5       //Overlaps with D10
//#define S4_PORT  PORTAbits.RA7        //下記に修正
#define S4_PORT  PORTBbits.RB5       //Overlaps with D4

//#define S3_TRIS  TRISAbits.TRISA10    //下記に修正
#define S3_TRIS  TRISBbits.TRISB5
//#define S6_TRIS  TRISAbits.TRISA9     //下記に修正
#define S6_TRIS  TRISBbits.TRISB5
//#define S5_TRIS  TRISCbits.TRISC6     //下記に修正
#define S5_TRIS  TRISBbits.TRISB5
//#define S4_TRIS  TRISAbits.TRISA7     //下記に修正
#define S4_TRIS  TRISBbits.TRISB5
```

- Source Files - bsp - exp16 - pic24fj64gb004_pim - leds.c 抜粋

```c:leds.c
//#define LED_D3_LAT      LATAbits.LATA10   //下記に修正
#define LED_D3_LAT      LATBbits.LATB15     //Overlaps with S3
//#define LED_D4_LAT      LATAbits.LATA7    //下記に修正
#define LED_D4_LAT      LATBbits.LATB15      //Overlaps with S4
//#define LED_D5_LAT      LATBbits.LATB3    //下記に修正
#define LED_D5_LAT      LATBbits.LATB15
//#define LED_D6_LAT      LATBbits.LATB2    //下記に修正
#define LED_D6_LAT      LATBbits.LATB15
//#define LED_D7_LAT      LATAbits.LATA9    //下記に修正
#define LED_D7_LAT      LATBbits.LATB15      //Overlaps with S6
//#define LED_D8_LAT      LATAbits.LATA8    //下記に修正
#define LED_D8_LAT      LATBbits.LATB15
//#define LED_D9_LAT      LATCbits.LATC5    //下記に修正
#define LED_D9_LAT      LATBbits.LATB15
//#define LED_D10_LAT     LATCbits.LATC6    //下記に修正
#define LED_D10_LAT     LATBbits.LATB15      //Overlaps with S5

//#define LED_D3_TRIS     TRISAbits.TRISA10 //下記に修正
#define LED_D3_TRIS     TRISBbits.TRISB15
//#define LED_D4_TRIS     TRISAbits.TRISA7  //下記に修正
#define LED_D4_TRIS     TRISBbits.TRISB15
//#define LED_D5_TRIS     TRISBbits.TRISB3  //下記に修正
#define LED_D5_TRIS     TRISBbits.TRISB15
//#define LED_D6_TRIS     TRISBbits.TRISB2  //下記に修正
#define LED_D6_TRIS     TRISBbits.TRISB15
//#define LED_D7_TRIS     TRISAbits.TRISA9  //下記に修正
#define LED_D7_TRIS     TRISBbits.TRISB15
//#define LED_D8_TRIS     TRISAbits.TRISA8  //下記に修正
#define LED_D8_TRIS     TRISBbits.TRISB15
//#define LED_D9_TRIS     TRISCbits.TRISC5  //下記に修正
#define LED_D9_TRIS     TRISBbits.TRISB15
//#define LED_D10_TRIS    TRISCbits.TRISC6  //下記に修正
#define LED_D10_TRIS    TRISBbits.TRISB15
```
- リボンバーから「Clean and Build Main Project」を実行し、プロジェクトをビルドします<br/>![04_06.png](https://qiita-image-store.s3.amazonaws.com/0/153698/7831bc19-8ab2-07d5-cd5c-039cb15f208f.png)

- 「BUILD SUCCESSFUL」が出力されビルドが成功したことを確認します<br/>![04_07.png](https://qiita-image-store.s3.amazonaws.com/0/153698/d370e992-7907-21b8-bf04-fb01b2c10693.png)

- [PICでAndroid Open Accessoryをつくる:02](http://qiita.com/sin5-developer/items/fceb3701dc32310eae94)で作成したブレッドボードにPICKit3を接続します
- リボンバーから「Make and Program Device Main Project」を実行し、PICにプログラムを書き込みます<br/>![04_08.png](https://qiita-image-store.s3.amazonaws.com/0/153698/f5f94f3e-8de1-ee9d-2304-6b0650a37962.png)
- 「Programming/Verify complete」が出力され書込みが成功したことを確認します<br/>![04_09.png](https://qiita-image-store.s3.amazonaws.com/0/153698/debbce2f-3079-8f4c-4d6f-22921771b883.png)

##動作確認
- 上記の作業で準備した、ファームウェアの書き込まれたPICを[PICでAndroid Open Accessoryをつくる:03](http://qiita.com/sin5-developer/items/93d008bd43d9b7c6a761)で作成したブレッドボードに設置します
- 電源用マイクロUSBコネクタにACアダプタを接続したうえで、USBコネクタをAndroidに接続します
- Anrdoid上に下記のようなメッセージが表示されますので、Android Playを開きます<br/>![04_10.png](https://qiita-image-store.s3.amazonaws.com/0/153698/524cd874-a60a-72e8-38b2-a3444e285175.png)
- Microchip社の「基本的なアクセサリデモ(Basic Accessory Demo」が開くので、インストールします<br/>![04_11.png](https://qiita-image-store.s3.amazonaws.com/0/153698/d0594a1b-561e-6702-105c-06cbf4d85c29.png)
- インストール後、アプリケーションを開くと下記のようなメッセージが表示されるので、OKとします（チェックボックスはチェックしません）<br/>![04_12.png](https://qiita-image-store.s3.amazonaws.com/0/153698/298d08da-ca86-45fb-501c-aa28b763d052.png)
- LED制御の左端をクリックし、下記のような状態にすると、LEDが点灯します<br/>![04_13.png](https://qiita-image-store.s3.amazonaws.com/0/153698/91dd4577-4b96-ab16-dfaa-ffb1d7ae5db7.png)
- IR受信機に向け赤外線リモコンを操作すると、操作している間プッシュボタン状態が「Not pressed」と「Pressed」が点滅します<br/>![04_14.png](https://qiita-image-store.s3.amazonaws.com/0/153698/c4227c3a-e45b-0b27-389e-e1130b0e9f92.png)

##今後
これで作成した回路の検証は終了です。
次回は、赤外線リモコン受信アプリケーション用にファームウェアの微調整を行います。

##参考にさせていただいたサイトについて
- main.c及びsystem.cの修正内容<br/>[MicrochipのUSB内蔵PICマイコンで楽々USB機器開発 2014年版](http://www.neko.ne.jp/~freewing/cpu/pic_usb_v2/)