コンテンツへスキップ

PICマイコンを使ってみます。使用するのはpic16f886で、windows10、MPLAB v5.10。

PICマイコンを使ってみます。使用するのはpic16f886で、windows10、MPLAB v5.10

目次

  • PIC開発環境
  • 回路
  • コード
  • 書き込み
  • 動作確認
  • 雑記
  • 参考

PIC開発環境

ソフトウェアでコーディングした後、ライターを用いてマイコンに書き込みます。

  • ソフト (MPLAB X IDE + MPLAB XC8コンパイラ)

IDEは統合開発環境で、エディタ、デバッカ、シミュレータなどほとんどのプログラムを内蔵しています。MPLAB X IDEは8bit~32bitマイコンで共通で使用できます。 コンパイラはC言語のようなコンパイラ言語をコンパイルして機械語に翻訳するプログラムです。Cコンパイラは別にインストールし、MPLAB X IDE に統合します。

私はwindows10ですが、macでもlinuxでも同様の環境でOKみたいです。

コンパイラはいくつかありますが、microchip社が比較的新しく発表したのが MPLAB XC8コンパイラです。 MPLAB IDE8.84迄のバージョンには既にHI-TECH Cが同梱されているみたいです。

・ MPLAB X IDE | Microchip Technology


MPLAB XC Compilers| Microchip Technology

  • 書き込み機(ライター)

記事によって互換品の付属のアダプタが危険っぽかったので別途用意しました。ネタバレですが、書き込み機の一部機能が壊れてました。

回路

2つLEDをつけて交互に点滅させます。 簡単で良いです。実験中に電源が入っているかを確認するためのLEDと、電源を外したときに瞬間的にマイコン電源がなくなるのを防ぐために (一応)つけているコンデンサが加わっています。

回路図

データシートを見ながら回路を組み立てます。リンクは秋月さんのとこのです。

マイコンのpin

コード

PICに書きこむ例としてリモコンのコードを見ながら、自分でコードを書いていきたいと思います。

プロジェクト

file/New Projectから作成します。MicrochipのStandalone Projectを選択します。

new project

今回使うpic16f886を選択します。

ライターは使用するPickit3を選択します。

コンパイラはXC8を選択します。

ファイル名は適当に決めます。

sourceフォルダの中に1つmainのファイルが必要です。

cファイルを開き、コードを書いていきます。

設定

production/set configuration bit の設定をしていきます。 なお、このマイコンはMCC対応してません。MCCは、簡単に設定できる超便利ツール、らしいです。

MPLAB® Code Configurator -microchip

set configuration bit

出来たら、generate source codeをクリックしてコードをコピペします。

configuration

設定は秋月のリモコンと一緒にします。今回は関数など使ってないので、I/Oさえ間違わなければ問題ないと思われます。

// CONFIG1
#pragma config FOSC     = INTRC_NOCLKOUT    // 発振回路設定 Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE     = OFF               // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE    = OFF               // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE    = ON                // 外部リセット/汎用入力の選択で外部リセット有効化 RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP       = OFF               // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD      = OFF               // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN    = OFF               // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO     = ON                // オシレータのスタートアップとコード実行の潜在時間を最小化Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN    = ON                // オシレータの故障の場合さえ、デバイスが作動し続けるのを許容するように設計Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP      = OFF               // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V    = BOR40V            // リセットしきい値を4V Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT      = OFF               // Flash Program Memory Self Write Enable bits (Write protection off)

BORとは: 事故時などに信号が不安定になるとマイコンによくありません。そこで、一定のしきい値を設定し、4Vなら4V±0.2Vを下回るとリセットを書ける機能を設定します。そのような機能をブラウンアウトリセット機能(BOR)と呼びます。

main関数

I/Oポートを設定します。クロック周期設定 I/Oポートの指定は、init関数の中で行っています。関数の使い方が解らなかったので、0~9999まで数え上げさせて時間を作る雑なコードになりました。すべてPortAの8pinすべて出力にしています。RA2=1;は、RA2が割り当てられたpinに電圧をかける指令です。

void init(){
    OSCCON = 0b01110000; //8MHz
    ANSEL = 0b00000000; //
    TRISA = 0b00000000;//
    TRISB = 0b00000000;
    TRISC = 0x00;
    PORTA = 0b00000000;
}

void main(void){
    int i=0;
    init();
   
    while(1){
        
        i=0;
        while (i <10000){
            i++;
        }
        RA2 = 1;
        RA3 = 0;
        
        i=0;
        while (i <10000){
            i++;
        }
        RA2 = 0;
        RA3 = 1;
    } 
}
portA

書き込み

繋いだらメニューバーの下の△をクリックします。

警告がでました。C:\Program Files (x86)\Microchip\xc8\v2.05\pic\includeやC:\Program Files (x86)\Microchip\xc8\v2.05\pic\include\c99に入っているヘッダファイルを開きます。私の場合はなぜかここにありましたが、多くの場合はProgram Files (x86)じゃなくProgram Filesだと思います。 C標準ライブラリ -PICマイコンによる開発手法

なんだかよく分からないままひたすら関係ありそうなヘッダファイルを開いて確認していくと、xc.hがインクルードしているalloca.hが入っていない。

MPLAB X IDE v5.xxの注意点 -サヌキテックネット にしたがって、projectのプロパティから、XC8 Global OptionsでC99をC90に変更するとビルドに成功しました。警告は無視。

BUILD SUCCESSFUL (total time: 6s)

書き込んでいきます。

電源供給するように設定します(私のライターは安く買ったからか電源を供給する機能がうまくいきませんでした)。マイコンは電源がないと動作しませんので、ライターか回路から電源を供給して下さい。 project上右クリックでpropaties、hardware toolからPICkit3を選択、pickit3からpowerで、チェックボックスにチェック。マイコンのデータシートにWide Operating Voltage Range (2.0V-5.5V)とあったので、5.0Vの電圧を供給します。

電源がない場合はコンピュータがデバイスを見つけられない、とか、以下のようなメッセージが表示されます。

PICkit 3 is trying to supply 5.250000 volts from the USB port, but the target VDD is measured to be 4.875000 volts. This could be due to the USB port power capabilities or the target circuitry affecting the measured VDD.

私はライターが壊れていたので、無理やり外部から接続できるようにしました。

Programming...

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0xfff
configuration memory
Programming/Verify complete

ライターの画像です。Vddに電源+、VssにGNDを接続します。(Vssは本来電源がマイナスになり得る場合のマイナス側です。)ライター付属の紙より転載。

PICkit3

動作確認

チカチカした。

Lチカ
Lチカ

雑談

MCCという便利機能があるんですが、Tools/Embedded/MPLAB Code Configuratorで見たところ、最新版でもサポートしているデバイスが少なく今回使用したPIC16F886もサポートされていませんでした。悲しい。

参考

教育用ロボットビュートローバーを使用して簡単な制御を行ったので、その方法を紹介します。

前回=>教育用ロボットビュートローバー開発環境構[

ビュートシリーズ用 赤外線センサ(1個) -ROBOT SHOP

目次

  • ライントレースとは
  • 使用する機能の詳細
  • プログラム
  • 雑記
  • 参考

ライントレースとは

ライントレースというのは、その名の通り、「線に追従する」ことで、ロボットに電車のように線の上を走らせます。 自動運転技術の1つとして、高速道路の白線を認識していることもあります。

ライントレースの精度や速さを競う大会がいくつもあります。私が知ってるのはこれとか =>ロボトレース -NIF 共益財団法人ニューテクノロジー振興財団

使用する機能の詳細

  • モータードライブ
  • アナログ入力

モーターのサンプルコード

サンプルコードをダウンロードしてビルドします。(詳細は環境構築編)

VS-WRC003LV-ヴイストン株式会社
電池をいれてスイッチを倒して接続します。すると、前後に動いているのがわかります。モーターを動かす関数は以下の通りです。

Mtr_Run_lv(-20000,20000,0,0,0,0);

左端の値は右モータ、右隣の値は左モータで、正転逆転出力は32767~-32767で調節します。モーターが向かい合わせについているので、左のモータは-にします。 上の関数で信号を与えますが、それは一瞬の事です。走らせるにはそのまま待機させなければいけません。そのための関数が下の関数です。

Wait(1000);

たとえばWait(1)だと、1m秒(=1/1000秒)そのまま待機します。

アナログ入力

光センサとアナログ入力について

ビュートローバーには赤外線距離センサがついてきます。距離センサなので、今回の使用方法は邪道ですね。

受光素子と発光素子が並んでついています。発光素子が発した赤外線が、床を反射して受光素子に入ってきます。このときの光の量で距離を判断しています。(量というのはだいぶアバウトですが。)

ビュートローバーでは、帰ってきた光の量をAdRead関数0~1023までの1024段階(10bit)で入手できます。センサ入力はアナログ(連続)で、それをデジタル(離散)に変換しています。このとき、プルアップという方法をとっているので、センサの感度に対して光が最小以下のとき1023,最大以上のとき0になります。

ちなみにプルアップについて
マイコンにセンサから信号が来ないときはどうなるでしょうか。この時、人間からは何レベルか解りませんし、マイコンに取っては不安定な信号になります。これはマイコンにとってとても良くない状態なので、何も入力されていないときには回路的に1023レベルか0レベルに決定できるようにしたのがプルアップ/プルダウンです。

コード

アナログ入力取得する関数が予め定義されていますので、それを使用します。

 AdRead(1);

入力(引数)はチャンネル(0~7 = 1~8)で、出力(戻り値)はA/D 変換の値(0~1023)です。

試験的にアナログ入力情報を取得してLEDを光らせます。

	while(1){
		
		Rightdata = AdRead(0);
		Leftdata = AdRead(1);
		if(Rightdata< 500){
			LED(1);		//緑のLED点灯
			Wait(500);	//1000msec待つ
		}
		if(Leftdata< 500){
			LED(2);
			Wait(500);		//オレンジのLED点灯
		}
		else{
			LED(0);	
		}
	}
左センサが感知右センサが感知左LEDが点灯右LEDが点灯
OOOO
OXOX
XOXO
XXXX

Border以上: 反射がない/黒=>光る
Border以下: 反射がある/白=>光らない

このボーダーは自分で設定する事が出来ます。 50にすると、センサと床の距離が同じなままで白黒を判別できました。私の手元に青いテープしかなかったのでうまく調整します。

プログラム

ライントレース

機体がラインにまたがり、センサがラインの両端に来るような状況を考えています。

作成したコードです。後半で解説しています。簡単なコードなのでかなり改良の余地があります(^^ゞ
使用するセンサの質や数、配置によってコードが変わってくるでしょうが、今回は製品を使用するので誤差は小さめかと思います。

#ifdef __cplusplus
extern "C" {
void abort(void);
#endif
void main(void);
#ifdef __cplusplus
}
#endif

/*インクルード***********************************************************/
#include<36064s.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "vs-wrc003lv.h"

/*グローバル変数***********************************************************/

int Leftdata;
int Rightdata;
int Borderr = 50;
int Borderl = 55;
/*メイン関数***********************************************************/
void main(void)
{
	//制御周期の設定[単位:Hz 範囲:30.0~]
	const BYTE MainCycle = 60;
	Init((BYTE)MainCycle);		//CPUの初期設定
	
	//ループ
	while(1){
		Rightdata = AdRead(0);
		Leftdata = AdRead(1);
		if(Rightdata > Borderr){
			LED(1);		//緑のLED点灯
			Mtr_Run_lv(-10000,-10000,0,0,0,0);
			Wait(100);	//100msec待つ
		}
		
		if(Leftdata>Borderl){
			LED(2);
			Mtr_Run_lv(10000,10000,0,0,0,0);
			Wait(100);		//オレンジのLED点灯
		}
		else{
			Mtr_Run_lv(0,0,0,0,0,0);//停止
			Wait(100);
			LED(0);	
			Mtr_Run_lv(-10000,10000,0,0,0,0);//前進
			Wait(100);
		}
	}
}

#ifdef __cplusplus
void abort(void)
{
	
}
#endif

アルゴリズム

コードを実行する時、処理は上から順に行われますので、私がやったコードの実行手順は以下のようになっています(たぶん)。

実行手順

これを実行すると、下のように動作すると思います。センサは白に反応するので注意してください。

状態左センサ右センサ機体動作
持つXXLED左右交互に点滅
線の上OOLED消灯、前進
右に脱線OX左朱LED点灯、反時計回り
左に脱線XO右緑LED点灯、時計回り

ライントレースの動作

実際に走らせてみたところ、完走です。 センサのボーダーの値はそれぞれの機体で走らせてみて調整してください。動画は諸事情によりありません。


雑記

紹介したコードの場合、手に持っている時にもモーターが左右交互に回転しようとしますので、効率が悪いです。 また、機体進行方向に対して水平なラインに出会ったときにも、左右交互に回転しようとしてしまい、脱出出来ません。

ロボットで勉強してみようという方がいらっしゃいましたら、コードを改良したりセンサを増やしてみたりして、様々な場合に対応できるように改良してみると楽しいのではないでしょうか。

参考

関連商品紹介

これからマイコンを使ってプログラミングの勉強を使用という方へ向けて、

プログラミング教育用ロボットのビュートローバーの開発環境構築とサンプルコードの実行までを、参考本に沿いつつ、(古い本なので)変更点などを書いていきます。

追記: つづき=>教育用ロボットビュートローバーで簡単制御:ライントレース

目次

  • マイコンとは
  • H8マイコンとビュートローバー
  • 組み立て
  • 環境構築
  • LED点滅
  • 雑記
  • 参考

マイコンとは

そもそもマイコンとは、マイクロコンピュータ、つまり小型計算機のことです。かつてはマイコンコンピュータを指していたそうですが、最近はPICマイコンのような部品を指すことが多いと思います。

家電製品を分解してみると回路が入っていますが、その中の計算処理をする部分です。こんな感じの物です。

手元にあったPICマイコン

これにプログラムを書き込んで、LEDを点滅させてリモコンにしたり、モーターに電気を流してタイヤを回したりするというわけです。

私聞いたことがあるのはPIC、LPC、R8C、H8ですが、他にも様々なものが販売されています。これにプログラムを書き込んでいくと、自立的に走行させたりできます。

H8マイコンとビュートローバー

ビュートローバーは専用ソフトウェアでフォーチャートから比較器簡単にプログラミングを学べる教育用ロボットです。統合開発環境HEWを使用することでC言語で開発することもできます。

プログラミング教育用ロボット ビュートローバー H8 [学習教材] [vstone]

プログラミング教材 ビュートローバーARM ビュートローバーH8 -ヴイストン株式会社

搭載されているのはH8/36064G搭載のVS-WRC003LVです。

組み立て

箱の中身

組み立てマニュアルに沿って組み立てます。

この時点で電池を入れると、前後左右に動きます。持ち上げると音が鳴り、その状態で左右のセンサを覆ってみて対応するLEDが点滅します。

ギアボックス

うまく動作しなかったら組み立てに失敗しているので確認しましょう。配線やモーターのギアに注意です。

完成!(左側が前)

環境構築

環境構築の前に

プログラムを書き込んでマイコンを動かすわけですが、C言語というプログラミング言語で命令する場合、一度機械語に翻訳する必要があります。

たとえば2+3=5をする場合、人間は「2+3」と書けば「5」と答えますし、C言語でもそのように書きます。一方、機械は以下のような計算をしています(機械語にかなり近い言語であるアセンブリ言語のイメージ)。

計算のイメージ

A ← 0    Aに初期値0を入れます
A ← A + (79) Aに79番地の値を加えます
A ← A + (80) Aに80番地の値を加えます
(81) ← A   81番地にAのもつ値を入れます

アセンブリ言語では ADD (M) がA ← A + (M)です。計算そのものは回路的に行えます。数値は16進数です。また、加算命令もとある番地に入っていて加算したり値を移動したりするたびに番地を指定して呼び出して...という感じに計算していきます。

ただ、最近一般的に使われているPCやラズパイは計算能力が高いのでこんなめんどうな部分は意識する必要がありません。マイコンは計算能力が低いので、プログラムを作る私たちはこのような部分を知っておくと便利です。宇宙開発のような機械を小さくしたい時や省消費電力化したいとき、あるいは簡単なロボットが作りたいときや教育等にマイコンを使用します。

統合開発環境HEW

統合開発環境とはC/C++によるプログラム作成に必要なソフトウェアが全部入っているソフトウェアのことです。

C言語などを機械語に変換してくれるソフトウェアをコンパイラといいます。機械語はハードウェアごとに違うので、マイコンにあったコンパイラをインストールしなければいけません。

【無償評価版】H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V.7.00 Release 00 -RENESASのページの無償評価版のものを選択します。 ([無償評価版]H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージv.700 Release 00)

ログインしてh8v7000_ev.exeをダウンロードして実行し、推奨設定でインストールします。

HEW

Flash Development Toolkit

フラッシュ開発ツールキットとはフラッシュメモリに対して書き込みを行うためのソフトウェアです。

フラッシュ開発ツールキット Flash Development Toolkit (Programming GUI)の最新版(【無償評価版】フラッシュ開発ツールキット V.4.09 Release 03)をインストールします。

特に変更なしでインストールします。言語だけAsia(japanese)にします。

H8 Writer

書き込み用ツールをインストールします。同じくVS-WRC003LV-ヴイストン株式会社からインストールします。

モニタプログラム

H8/300H、H8/300H Tinyシリーズ用サンプルプログラム -Renesasから、HEW3,HEW4(C/C++ Compiler Ver. 6.0)対応版 H8/300H Tiny用 モニタプログラムをダウンロードします。

デフォルトの設定ならC:\300tに保存されるので、そのフォルダのmonitor.hwsをクリックしてHEWを起動します。何か言われたら「はい」でHEWをアップデートします。

モニタプログラムの設定

ユーザ・イニシャライズ・モジュールを設定します。monitor.cを以下のように設定します。

/************************************************************************/
/*      H8/300H Monitor Program (Normal Mode)           Ver. 2.0B       */
/*              Copyright (C) 2003 Renesas Technology Corp.             */
/************************************************************************/
#include "36064s.h"                              /*変更                 */
#pragma global_register(monitor=R5)             /* Return Address       */
void (*monitor)(void);                          /*                      */
/************************************************************************/
/*      User Initialize Module                                          */
/*              Input   R5  <-- Return Address                          */
/*              Output  Nothing                                         */
/*              Used Stack Area --> 0(0) Byte                           */
/************************************************************************/
#pragma noregsave(INITIALIZE)                   /* Non Register Save    */
void INITIALIZE(void)                           /*                      */
{ 
  WDT.TCSRWD.BYTE=0x92;                         /* 追加分               */
  WDT.TCSRWD.BYTE=0x92;				/* 追加分    			*/
  monitor();                                    /* Goto Monitor Program */
}      

マイコンにはウォッチドックタイマと呼ばれるマイコンの暴走を検知する機能が備わっています。モニタを使用する場合これは邪魔なので、機能を停止させるためのコードを追加しました。H8/36064が搭載されているので、マイコンの種類を指定するために36064s.hに変更します。

リンケージ・サブコンド・ファイルを以下のようにカスタマイズします。 monitor.subを以下のように変更します。

INPUT      NORMAL,MONITOR
LIST       MONITOR.MAP
SHOW       SYMBOL
OUTPUT     MONITOR.MOT
FORM       STYPE
CHANGE     INFORMATION=1320
NOOPTIMIZE
LIBRARY    NORMAL,36064
LIBRARY    MONITOR
DEFINE     $BRR=17
DEFINE     $STACK=FF00
START      VECTOR/0,ROM/100,RAM/F780,USER/F840,SCI/FFA8

変更したのは8行目と10行目です。8行目はマイコンの指定、10行目に通信速度を指定します。参考書p.230に記載されています。

書き換えたらメニューバーからビルドします。ビルドとは、マイコンが実行可能なプログラムに変換することです。ビルドは多少時間がかかりますのでのんびり待ちます。下記のように出たらが完了です。

Build Finished
0 Errors, 0 Warnings

モニタプログラムの書き込み

マイコンのスイッチを押したまま電源を入れると書き込みモードで起動します。 デバイスマネージャーなど(windws10ならスタートを押した後そのままデバイスマネージャーなどと打って検索)でどのポートにつながっているか確認します。USBコネクタを抜き差ししながら確認してください。この場合はCOM3なのでポート3でした。

デバイスマネージャー

H8 Writerを起動して、C:300t\moniter\Release\MONITOR.MOT、COM3を指定して書き込みを行います。

H8 Writer

本との差異について

モニタプログラム専用通信ソフトHtermは配布が終了していたので、参考本に記載されているシリアルコンバータVS-WRC003LV とHtermはインストールしませんでした。

サンプルプログラムのテスト走行

VS-WRC003LV -ヴイストン株式会社からサンプルプログラムをダウンロードできます。zipファイルを解凍し、ドキュメントなど好きなフォルダに張り付けてください。 HEWを起動し、ワークスぺースを開くから先ほど保存したフォルダの中からhwsファイルを開きます。バージョンが異なる場合何か聞かれますが、すべて「OK」です。

サンプルプログラムを開く

メニューバーのビルドから一番上の[H8S,H8/300 Standard Toolchain..]を選択してコンパイラ、リンカなどを設定します。

相対パスはCustom directory、ディレクトリに各 CPU 用のインクルードファイルがあるiodefine フォルダのパスを設定し、OKを押します。このサブディレクトリは各自のPCで必ず確認してください。私の場合はC:\Program Files (x86)\Renesas\Hew\System\Pg\Renesas\H8\H8_7_0\Generate\iodefineを指定しました。

(追記)あとからビルドのインクルードファイル設定を変更する場合

ビルド→RX Standard Toolchain→コンパイラタブ→オプション項目(S)からインクルードファイルディレクトリを選択(Custom directoryから、iodefineを指定。私はC:\Program Files (x86)\Renesas\Hew\System\Pg\Renesas\H8\H8_7_0\Generate\iodefine)→追加ボタン

wirter \WRC003LV_SampleProject_MOTOR_20100826_0926\FILES\Debugの中の.motを開きます

参考

LED点滅

ビルドからすべてをビルドします。pdfの通りにやるとデバックの体験のために必ずerrorを吐きます。 36064S.hの一行目を削除します。保存してすべてをビルド。このとき、保存が拒否されることがありますが、その場合はHEWの起動を右クリック/その他から管理者権限で行ってください。0 Errors, 0 Warningsと出ればOKです。

1: void main(void)
2: {
3:   //制御周期の設定[単位:Hz 範囲:30.0~]
4:   const BYTE MainCycle = 60;
5:
6:   Init((BYTE)MainCycle); //CPU の初期設定
7:   //I2C_init(void); //IXBUS 初期化
8:
9:   //ループ
10:   while(1){
11:     LED(1); //緑の LED 点灯
12:     Wait(1000); //1000msec 待つ
13:     LED(2); //オレンジの LED 点灯
14:     Wait(1000); //1000msec 待つ
15:   }
16: }

VS-WRC003LV -ヴイストン株式会社のページで配布されているLED点滅サンプルコードより引用。

再びH8 Writerを起動して今ビルドしたファイルを (C:\Users\user\Documents\HEW\WRC003LV_SampleProject_LED_20100826_0926\LED\Debug\LED.motなど)を指定します。すると、マイコンのLEDが交互に点滅します。wait関数の引数を1000から500に帰ると点滅が早くなります。

書き込み

雑記

使っているのはDCモーターなので動かすのは簡単そうです。来週やってみようと思います。今後これを使ってなにをしようかな。センサを増やしてフィードバック制御出来たらうれしいですね。

追記(2019/4/22):続編、あとからビルドのインクルードファイル設定を変更する場合について追記しました。

参考