Arduino 基礎ドリル|レジスタから学ぶ組込みマイコン入門(全7テーマ+総合演習問題)
この記事は、組込みエンジニアを目指してArduinoを学び始める人のための練習問題シリーズ(全7テーマ+総合)の目次となる記事です。
Arduinoは、サンプルコードを貼り付ければ最初のLEDは光らせられます。ただ、それだけでは「なぜ動くのか」「タイマはどうやって時間を数えるのか」が分からず、少し複雑なセンサや通信を扱う場面で手が止まります。
本シリーズでは、Arduinoの便利な書き方でまず動きを確認したあと、同じ動作をレジスタ操作で書き直す形で学びます。最終的には、温湿度を見てエアコンを赤外線で操作する自動温湿度調整システムを、自分の成果物として組み上げることがゴールです。
<自己紹介>
筆者は現役の車載組込みソフトエンジニアです。Arduinoでもレジスタ設定やBoot下回りを学んだ経験があり、転職前にはUno R3と温湿度センサ、赤外線を使った熱中症リスク監視システムを約1か月かけて作りました。このシリーズでは、そのときに必要だった考え方を、未経験者が順番に追える形へ整理します。
目次
学修記事の読み方について
このシリーズは、各テーマを講義形式の解説+練習問題7問+回答例で進めます。コードを読むだけでなく、まず自分で書き、実行結果を確かめてから回答を開いてください。
- 番号順に進める。後のテーマでは、前のテーマで扱ったビット演算やタイマを使います。
- まずArduino APIで最短の動きを作り、次に同じ動作をレジスタで書き直す。
- 各記事の「データシートのこの部分を読む」を開き、設定値の根拠を一次資料で確認する。
- 問題を解いたあとに、完成品のどの部品になるかを確認する。
前提として、C言語 基礎ドリルの変数、if文、ループ、関数、ポインタ、ビット演算を終えていることをおすすめします。特にビット演算は、レジスタの一部だけを変更するときにそのまま使います。
始める前にそろえるもの
本シリーズはArduino Uno R3(ATmega328P搭載)を前提にします。Uno R3はATmega328Pを搭載したボードで、内蔵EEPROM、タイマ、GPIOを使って学習できます。Uno R4など別のマイコンを搭載したボードでは、レジスタ名も設定方法も変わるため、このシリーズのコードをそのまま使うことはできません。Arduino公式のUno R3仕様も、最初に確認してください。まだボードを持っていない方は、Arduinoは結局どれを買う?初心者へのおすすめと主要ボード比較で、なぜR3系が学習に向くか・どのスターターキットを選べばいいかを確認してからそろえると失敗しません。
| 用途 | 必要なもの | 使うテーマ |
|---|---|---|
| 最初の出力確認 | Uno R3系、LED、抵抗、USBケーブル | #1 |
| 温湿度の入力 | DHT11、ジャンパ線 | #4、総合 |
| 赤外線の解析・送信 | IR受信モジュール、赤外線LED、抵抗、ジャンパ線 | #5、総合 |
| 保存・省電力 | 追加部材は原則不要。内蔵EEPROMとスリープだけで完結する | #6、#7、総合 |
開発環境は、初心者ならArduino IDE、実務に近い環境へ進みたいならVS Code+PlatformIOを選べます。どちらから始めるか迷う場合は、先にArduino開発環境の選び方を読んでください。Arduino IDEの導入手順はArduino IDEのダウンロード〜インストール完全ガイド、PlatformIOを使う場合はVS Code+PlatformIOで作るArduino開発環境へ進みます。
Arduinoドリルの全7テーマ一覧
以下の7テーマは、総合課題を作るために必要なものだけを選びました。各記事は公開後、この表から読めるようにします。
| # | テーマ | 学べること | 総合課題での役割 | 記事 |
|---|---|---|---|---|
| 1 | Lチカとデジタル出力 | digitalWrite()で動かしたあと、DDRBとPORTBでLEDを操作する |
状態や異常を知らせるLED | 記事を読む |
| 2 | シリアルで見る | シリアルモニタで値と状態を確認する。発展ではUARTのボーレート分周も見る | 温湿度・制御状態のデバッグ | 記事を読む |
| 3 | タイマと実行周期 | プリスケーラ、カウンタ、比較一致、タイマ割り込みを使って周期タスクを作る | 5分ごとの測定と制御の基礎 | 記事を読む |
| 4 | DHT11をライブラリなしで読む | パルス幅を測り、40ビットのデータをパースしてチェックサムを確認する | 温湿度の入力 | 記事を読む |
| 5 | 赤外線リモコンを解析して送る | パルス幅から信号を読み、タイマで38kHzキャリアを作って送信する | エアコンの操作 | 記事を読む |
| 6 | 電源が切れても状態を失わない設計 | EEPROMへ状態や異常の記録を残し、あとから原因を解析できるようにする | 設定値の保存・異常記録の解析 | 記事を読む |
| 7 | 低消費電力で動かす設計 | スリープと割り込みで、必要なときだけマイコンを起こす | 電池での長時間動作を意識した周期設計 | 記事を読む |
総仕上げでは、要件定義書から作る自動温湿度調整システムに取り組みます。温湿度を読み、危険値の80%を目安に判断し、ヒステリシスで不要な動作を避けながら、赤外線で実際のエアコンを操作します。人がリモコンを操作したときは人の操作を優先し、5分ごとの温度変化から設定温度25℃へ近づくように調整します。
学習の順番について
迷ったら、1から7まで順番に進めてください。特に#3のタイマと実行周期は、DHT11のタイミング測定、赤外線の送受信、低消費電力での周期起床へつながる、このシリーズの背骨です。
- #1 Lチカで、出力ポートとビット操作に慣れる
- #2 シリアルで、動いている中身を確認する手段を持つ
- #3 タイマと実行周期で、
delay()に頼らない時間管理を作る - #4 DHT11で、データシートを読みながらセンサの信号を解釈する
- #5 赤外線で、家電の信号を解析し、外部へ出力する
- #6 EEPROM保存と#7 低消費電力で、止まり方・電源断まで考える
- 総合課題で、要件定義、設計、実装、試験を1つにつなげる
総合課題は、C言語 総合実力テストのエアコン模擬プログラムを実機にする位置付けです。紙の上で考えた条件分岐、配列、関数、ビット演算を、温湿度センサと赤外線LEDを使って本物の入出力へつなぎます。
なぜレジスタから教えるのか
ArduinoのAPIは学び始めるうえで便利です。まずはpinMode()やdigitalWrite()でLEDを動かし、配線とコードの関係をつかみます。
ただし、組込みソフトの仕事では「ライブラリで動いた」で終わりません。どのポートの何ビットを出力にするのか、どの分周比でタイマを動かすのか、割り込みをいつ許可するのかを、データシートとレジスタで確認して決めます。
私自身も、Arduinoでレジスタ操作やBoot下回りを学んだことで、実務のマイコン設定を理解する助けになりました。最初から難しい設定だけを見せるとつまずくため、本シリーズではAPI版で動きを見る → レジスタ版で中身を確認するという順番にしています。
特にタイマは重要です。delay()は待っているあいだ他の処理を止めるため、複数の仕事を同時に進める必要がある組込みソフトでは使いどころを選びます。車載でも10msや100msといった周期で処理を回すことが多く、時間をどう作るかを説明できることが大切です。
マイコンのデータシートの歩き方
レジスタを扱うときに最初につまずくのが、データシートです。私も、分周の計算方法、割り込みハンドラの設定、そもそもの割り込みの概念で手が止まりました。ページ数が多い資料を最初から読む必要はありません。今やりたい動作に必要な章だけを、決まった順番で読むようにします。
読む前に決めること
データシートを開く前に、「LEDを13番ピンで点灯したい」「1msごとに処理を呼びたい」のように、やりたい動作を1文で決めます。その動作が決まると、調べる対象はポート、タイマ、割り込みなどに絞れます。
Uno R3で使うATmega328Pの一次資料は、MicrochipのATmega328Pデータシートです。記事ごとに、読む章と表を抜粋して示します。
レジスタ設定を追う順番
- ブロック図と端子機能を見て、目的の機能がどのポート・周辺回路につながるかを確認する
- レジスタの概要で、設定に必要なレジスタ名を拾う
- 各ビットの説明で、0と1が何を意味するかを確認する
- 初期化手順と注意事項を読み、設定する順番や禁止条件を確認する
- タイミング図・電気的特性で、センサ信号や時間の条件を確認する
例えばタイマなら、「どのタイマを使うか」→「クロック源とプリスケーラ」→「比較値」→「割り込み許可」→「割り込み関数」の順です。分周比や比較値を暗記するのではなく、どのビットがその設定を持っているかをデータシートでたどります。
#6では、Uno R3のATmega328Pで電源断後に残せる内蔵領域であるEEPROMを扱います。このシリーズでは、当時「DF保存」と呼んでいた要件を、Uno R3ではEEPROMへ状態を保存する設計として扱います。保存する内容、書き込むタイミング、書込み回数の抑え方まで考えます。
次に読む
- Arduino総合演習|自動温湿度調整システム:7テーマを組み上げて作る、転職のポートフォリオになる総合課題
- C言語 基礎ドリル:Arduinoのコードで使うC言語の基礎を、練習問題で先に固める
- Arduinoとは?できること・種類:Arduinoが何に使えるのか、ボード選びの前提を確認する
- Arduino開発環境の選び方:IDEとPlatformIOのどちらで始めるかを決める
- 未経験から組込みエンジニアになるまでの全体ロードマップ:Arduino学習が、組込みエンジニアを目指す学習全体のどこにあるかを確認する
まとめ|動いた理由まで説明できるようにする
- Arduinoドリルは、レジスタ、タイマ、実行周期を扱う全7テーマ+総合課題で進める
- 最初はAPIで動かし、その後に同じ動作をレジスタで書き直す
- タイマと実行周期を背骨にして、センサ、赤外線、保存、省電力へつなげる
- データシートは最初から読破せず、目的の機能に必要な章を順番に確認する
このシリーズでは、単にLEDを光らせるところで終わらず、温湿度を読み、家電を動かし、電源断まで考えた成果物を作ります。まずは#1のLチカから、実機で1ビットを動かすところを確認してください。
よくある質問(FAQ)
C言語を全部終えてから始めるべきですか?
最低限、変数、if文、ループ、関数、ポインタ、ビット演算は確認してから始めることをおすすめします。とくにビット演算は、レジスタの特定のビットだけを変更する場面で使います。C言語に不安がある場合は、C言語 基礎ドリルから進めてください。
Uno R4でも学べますか?
このシリーズはUno R3(ATmega328P)専用です。R4ではマイコンとレジスタ体系が異なるため、同じコードを写してもレジスタ操作の学習にはなりません。Uno R3またはATmega328P搭載のR3互換ボードを用意してください。
ライブラリを使わないと、初心者には難しすぎませんか?
最初から全部を自力で書くのではなく、まずArduino APIで動きを確認します。その後で、どの設定をAPIが肩代わりしているのかをレジスタで確かめます。シリアル出力はデバッグの道具として使い、発展ではUARTレジスタの設定も確認する予定です。