【C言語入門】プログラミング初心者がロボットカーを動かすまでの道

C言語入門では、これからプログラミングを学ぶ初心者を対象に、「C言語とは」からC言語の基本構文、マイコンや電子部品などのハードウェアの知識を身に付けます。

最終的にはロボットカーを動かすことを目標としています。

C言語は、電子部品などの制御装置で使われることが多く、アプリを作ることを題材にしてもあまり現実的ではないと思い、ロボットカーを選択しました。

ただ、C言語以外にも覚えることが多いので道のりは大変ですが、最終目標のロボットカーを作ることができるまでお付き合いいただけると幸いです。

こちらのC言語入門では、Windowsを使用しています。ご了承ください。

C言語入門編

「C言語とは何か」から基本的な構文を覚えるまでの内容です。難しい内容は省略し、ロボットカーを作るうえで必要最低限の内容としました。
C言語を勉強したことがある方、基本的なことは理解できている方は、読み飛ばしていただければと思います。
内容は以下のようになります。

見出し概要
C言語とはC言語の特徴や、C言語でできることについて学びます。
プログラミング環境の構築C言語のプログラミングができる環境の構築方法について解説します。(Windows向け)
プログラミングの書き方C言語プログラムの書き方のルールについて学びます。
文字を画面に表示画面に文字列を表示する方法を学びます。
数値の記憶(変数)と演算変数とは何かについてと、変数を使った四則演算などの演算について学びます。
数値や記憶した値を画面に表示数値や変数の値を画面に表示することについて学びます。
キーボードから数値を入力キーボードから数値を入力する方法について学びます。
条件の判定C言語の基本構文であるif文を使って基本的な条件分岐する方法について学びます。
場合分けの処理C言語の基本構文であるif~else if~else文や、switch文について条件を場合分けする方法について学びます。
繰り返しの処理C言語の基本構文であるfor文、while文について学びます。
複数の値をまとめて扱う(配列)同じ型の変数をまとめて扱えるようにする配列の仕組みについて学びます。
文字列の扱い文字と文字列を扱う変数について学びます。
変数の型と数値の種類変数の型の種類と、8進数、16進数、2進数について学びます。
プログラムの部品化(関数)関数の仕組みについて学びます。
不変の値の扱い値が変化しない固定された値に名前を付ける方法(#define)について学びます。
異なる種類の変数をまとめる(構造体)異なる型の変数をまとめる構造体について学びます。
ポインタの仕組みメモリの仕組みから変数とメモリの関係、ポインタ変数の基本的な使い方について学びます。
複数ファイルに分割プログラムを複数のソースファイルに分割してプログラムする方法について学びます。
変数が使用できる有効な範囲変数が使用できる有効な範囲(スコープ)と、ローカル変数、スタティック変数、グローバル変数について学びます。
演算子の種類と優先順位C言語にはいろいろな演算子があります。その中でもよく使用する、論理演算子、sizeof、シフト演算子、キャスト演算子について学びます。

補足資料

C言語入門編で補足した内容を取り上げたいと思います。

見出し概要
インクリメント・デクリメント++演算子と、--演算子について解説します。
ビットとバイトと負数についてビット、バイトについて解説します。また、2の補数で負数を表現していることを解説します。

ハードウェアを動かしならが学ぶC言語入門

RL78マイコンを使って、プログラミングを行っていき、ハードウェアの入出力の動きを学びます。
ここでは、プログラミングを行っていくに際して、電子部品などハードウェアやマイコンの知識も必要になるため、これらの基礎知識について学習する予定です。
本当なら、メジャーなArduinoやRaspberry Piを使うのが初心者の方にはとっつきやすいのかなと思うのですが、筆者が知識不足のため、RL78マイコンを使わせていただきました。

見出し概要
開発環境の解説学習するマイコン基板を紹介します。
開発環境の準備(開発ツールのインストール)開発ツールであるCS+のインストール方法について解説します。
開発環境の準備(マイコン基板と接続)マイコン基板とパソコンを接続方法を解説します。
マイコンの基本知識RL78マイコンを学ぶ前にマイコン全般の基本的な知識について学びます。
IOポートのレジスタの説明マイコンのIOポート機能のレジスタについて解説します。
IOポートの設定マイコン基板に接続されている周辺装置に合わせたIOポートの設定を行います。
LEDを点灯/消灯させるIOポートの設定で作成したIOポート設定関数を呼び出し、IOポートの設定を行い、ポート・レジスタを使用してスイッチのON/OFFにより、LEDの点灯/消灯させるプログラムを作成して、実際に動かしてみます。
タイマのレジスタの説明マイコンのタイマ機能であるタイマ・アレイ・ユニット機能のレジスタについて解説します。
インターバル・タイマを使ってLEDを点滅させるインターバル・タイマ機能を使用して、1秒毎にLEDを点灯/消灯を繰り返すプログラムを作成します。
PWM出力を行い、LEDの明るさを調整する2つのタイマを使用して、マイコン機能のPWM制御を行い、LEDの明るさを変更するプログラムを作成します。
A/Dコンバータのレジスタの説明A/Dコンバータ機能のレジスタについて解説します。
温度センサから温度を取得するA/Dコンバータ機能を使用して、温度センサから温度を取得するプログラムを作成します。
※今回は、表示させる装置がないので、グローバル変数に温度を入れるところまでを行います。
照度センサから明るさをもとにLEDの明るさを調整する
シリアル・インタフェース IICA機能のレジスタの説明シリアル・インタフェース IICA機能のレジスタについて解説します。

補足資料

見出し概要
RL78マイコンで必ず必要な設定(オプション・バイト)RL78マイコンの電源投入時、リセットからの起動時に自動的にオプション・バイトという設定値を参照して、指定された機能の設定を行います。
このため、オプション・バイトの設定は必ず行う必要があります。このオプション・バイトの説明と、CS+でのオプション・バイトの設定を行います。

ロボットカーを作ろう

最終的にロボットカーを作ります。
ここでは、「ハードウェアを動かしながら学ぶC言語入門」で使用したマイコンボードを使って、ロボットカーを組み立てていきます。ただし、拡張用のライン・トレース・カーが販売していないため、手元にあった「ロボットカー」を使用することにします。こちらは、Arduinoの使用したものですが、このArduinoの基板を今回、このC言語入門で使用している基板に差し替えて動かしていきます。
このため、マイコンは、RL78/G14となります。
ロボットカーは、いつかは、自動制御で動かす予定を考えていますが、C言語入門では、リモコンを使用して簡単な走行を想定しています。

教科書付き基板をAmazonで見る

ロボットカーをAmazonで見る

ロボットカーについては、Arduino互換のものであれば、基板を差し替えることができると思いますので、同じものである必要はないと思います。赤外線センサとリモコンは必要になりますが。
また、開発環境は、「開発環境の解説」、「開発環境の準備(開発ツールのインストール)」、「開発環境の準備(開発ツールのインストール)」を参照していただけるとスムーズに学べると思います。

見出し概要
ロボットカーにRL78/G14マイコンボード取り付けロボットカーのバッテリからの電源をRL78/G14マイコンボードにDCジャックを取り付けます。それから、ロボットカーのArduinoボードをRL78/G14マイコンボードに交換するまでを説明します。
ロボットカーとRL78/G14マイコンボードの配線とポート割り付けロボットカーのモータドライバー、赤外線センサと、RL78/G14マイコンボードの配線を接続させます。
IOポート割り付け表を作成します。
ロボットカーの制御仕様今回は、赤外線リモコンを使用してロボットカーを動かします。このロボットカーの仕様を考えます。
赤外線リモコン受信処理の設計赤外線リモコンから送信されるデータを受信する処理の設計を行います。
メイン処理と受信解析処理、モータ制御処理の設計赤外線リモコン受信処理は割り込み処理として設計しました。今回、メイン処理では、受信したデータの解析する処理と、モータを制御する処理を想定しています。ここでは、メイン処理側の設計を行います。
マイコン故障の設計マイコン故障の検出は、マイコンの機能を使うため、特に設計する必要はないのですが、機能の説明を簡単に行います。
プロジェクト作成とオプション・バイトの設定今回は、ウォッチドッグ機能を使用するため、ユーザ・オプション・バイト値の値を変更します。
ファイル構成ロボットカー制御のファイル構成を考えていきます。
ロボットカー用のIOポートの設定「ハードウェアを動かしならが学ぶC言語入門」にて、RL78/G14マイコンのIOポートのレジスタの説明のところで、一通り設定していますが、ここでは、ロボットカー用にポート割り付けを変更します。
ロボットカー用のタイマ機能の設定「ハードウェアを動かしならが学ぶC言語入門」にて、タイマ機能のレジスタの説明のところで一通り説明していますが、ロボットカー用にタイマを設定していきます。
また、今回、ロボットカー用に使用するタイマが異なることと、新たにタイマRD機能も使用しますので、簡単に説明します。
クロック発生回路を制御するレジスタの設定まだ、学習していませんが、クロックの設定に関する制御レジスタについて実装します。
共通ファイルの定義ロボットカーシステム制御内で共通して使用する定義をcommon.hに実装していきます。
モータ制御とウォッチドッグ制御の実装モータ制御とウォッチドッグ制御の実装をします。モータ制御とウォッチドッグ制御には関連がありませんが、共に、説明するほどの処理がないため、まとめて説明します。
タイマ制御の実装タイマ制御は、メイン処理の10ms周期のタイマの制御を行うのみとなります。
赤外線リモコン受信時のタイマは受信のほうの処理で制御する予定です。
赤外線リモコン受信処理の実装赤外線リモコン受信処理を実装します。
赤外線リモコン受信データ解析処理の実装赤外線リモコン受信データ解析処理を実装します。
メイン処理の実装スケジューリングを行うメイン処理を実装します。
イニシャル時ROMチェック処理の実装ロボットカー起動時のROMチェック処理(アセンブラ言語)を実装します。
動作中ROMチェック処理の実装ロボットカー動作中のROMチェック処理を実装します。
RAMチェック、不正メモリアクセス検出処理の実装その他マイコン異常検出の実装をします。