Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方

組み込みエンジニア

こんにちは、ENGかぴです。

Arduinoは簡単にソフト開発ができるためマイコン開発の練習教材としても使用されます。ソフト開発に対して苦手意識があり敷居が高く感じていた方でも簡単に動作確認ができるため趣味や業務で簡単なアプリを作りたい場合にお勧めの開発環境です。

楽に開発ができて動作確認ができるためモジュール製作メーカもArduino開発環境でWiFi接続ができるモジュールやLPWA通信モジュールが販売しています。標準ライブラリを使いながらIoTモジュールの動作が確認できるため楽しさ満点です。

ソフト開発と標準ライブラリの使い方

Arduinoはオープンハードフェアのライセンスのもと資料などが無料で公開されておりいろいろな互換機があります。資料がオープンであるためマイコン周辺回路などは自作することは容易にできます。

ArduinoはATMEL社のAVRシリーズで8ビットマイコンが使用されています。Arduino開発環境ではマイコンの制御が簡単にできるようにマイコンの設定について精通した有志によってライブラリ化されており関数をコールするだけで簡単に動作確認ができます。

Arduinoの開発環境をつくる

Arduinoの開発環境であるArduino IDEのダウンロードからインストールまでの手順をまとめていきます。対象OSはWindows10です。

スケッチ例が準備されているためArduino環境でライブラリの使い方やソフト開発の方法を学習することができます。

スケッチ例から使えそうなコマンドをコピーしたりと実際にマイコンで動作させることで効率よく学習できます。スケッチ例を少し改造してシリアル通信をシリアルモニタで動作確認しています。

VSCodeを使って開発する

Arduinoの開発環境はArduino IDEのみでなくVSCodeを使用しても開発できます。VSCodeはマイクロソフト社が提供しているソフト開発用のエディターです。

Arduinoの開発環境に合わせたプラグインをインストールすることで機能拡張によりVSCodeを使ってArduinoのソフトが開発できます。

プログラムの検証や書き込み時に文字化けしてしまう部分は残念ですが、開発している段階ではコマンドのアシスト機能が使えるため効率よくコーディングできるメリットがあります。

7セグメントLEDで数値を表現する

Arduino環境ではDOの操作が簡単にできます。複数のDOを組み合わせることで7セグメントLEDに数値を表現することができます。数値のパターンの作って7セグメントLEDに表示する方法をまとめています。MsTime2を使用して1秒ごとに0~99をカウントさせて動作確認を行いました。

4桁の7セグメントLEDをDOを切り替えて表示しているためLED表示が少し薄くなりますが、LCDよりも迫力のある表示ができるのは面白いと思います。

10ビットのAD変換では温度表示が少し荒くなってしまいますが、室温が測定できていたので面白かったです。

DIをマルチプレクサで拡張する

ArduinoのデジタルピンはLCDや7セグメントLEDなどを接続していると不足してしまうことがあります。マルチプレクサは制御用の3本のDOと一本のDI(DO)によって8つのDI(DO)のピンの情報を取得することができます。

7セグメントLEDは専用のドライバーICを使用することでデジタルピンを節約できますが、7セグメントLEDに限らずDI(DO)が拡張できるマルチプレクサの効果をまとめました。

7セグメントLEDの表示パターンを追加してスイッチの状態変化を「d-3」などのように表示しましたが、8ピン分の状態変化が検出できたためDIの拡張の効果を感じました。

タイマ管理とDIのチャタリング防止の方法

DIに信号を入力して判定させることがありますがDI信号がチャタリングによってDI信号が安定しないことがあります。

MsTimer2ライブラリを追加しタイマの設定を行いメイン関数内でベースタイマを作ってタイマの管理を行います。タイマ管理を行いながらDIのフィルタを作っています。

LCDで文字を表示する

LCDに文字を表示するために標準ライブラリとしてLiquidCrystalがあります。外部機器から取得したデータの情報をLCDに表示したりボタンで表示を切り替えてモードを選択したりと用途は様々です。

LiquidCrystalのライブラリを使用することで最小の組み合わせで制御線2本とデータ用の4本をつなぐことでLCD表示ができます。タイマを使用してカウント値をLCDに表示しボタンを押すと10進数と16進数表示に切り替えるソフトを作って動作確認しました。

Arduino環境ではない他のマイコンでDOを制御してLCDに表示するソフト開発をしたことがありますが、Arduino環境ではライブラリによって簡単に表示できることは良い点だと感じています。

SPI通信を行う

Arduino環境ではSPI通信を行うために標準ライブラリとしてSPIライブラリがあります。BME280の製作メーカが提供しているAPIを使用して温度・気圧・湿度の計算を行いSPI通信でセンサー情報を取得する方法をまとめました。

BME280の製作メーカであるBOSCH社が提供しているAPIを使用することを推奨しているためAPIの実装方法についても説明しています。

温度は室温計とほぼ同じ値でしたが気圧や湿度はスマホのデータを比較した場合少しずれている気がしました。実際はスマホのデータ環境と室内では環境が違うため厳密には比較できませんが、センサーからデータが取得できているのが確認できると達成感があります。

Wire(I2C)通信を行う

Wireライブラリを使ってI2C通信を行いBME280から温度・気圧・湿度のデータを取得しBOSCH社が提供しているAPIを組み込んで計測値を各種データに換算して表示しました。

I2C通信を持つセンサーモジュールが増えてきているためArduinoのI2C通信で動作確認ができることはセンサーの性能が検討しやすいのは良い点だと思います。センサーはDC3V仕様であることが多いので電圧変換が必要になることが多いのが残念な点です。

RTCを使って時刻情報を管理する

Wireライブラリを使ってRTCモジュールにRX8900(秋月電子)を使用してRTCモジュールから書き込んだ時刻からの時間を取得しています。RTCモジュール専用のcppファイルとヘッダーファイルを作成しArduinoプロジェクトに組み込んで実装しました。

Arduinoプロジェクトで関数をコールするだけでデータが取得できるように簡単なAPIを実装しました。ファイルを分離したときの管理方法についても説明しています。

時刻データは任意のタイミングで変更できるように工夫しないと使い勝手が悪いかもしれません。LCDを使って時刻を表示してみるなど応用範囲が広がりそうです。

応用編として任意の時刻を設定するためにLCDで設定項目を表示しボタンを押して任意のデータがセットできるようにしました。時刻を表示するモードと時刻を設定するモード(サブモード)を切り替えて時刻設定する方法についてまとめています。

日時の設定範囲の上限に関する考え方やボタンの誤動作防止のための対策についてのテクニックについても説明しています。

GPSモジュールを使って時刻管理する

GPSモジュールAE-GYSFDMAXB(秋月電子)を使用してGPSモジュールから時刻情報をシリアル通信を使って取得しLCDに表示するようにしました。GPSモジュールに対する出力項目の設定し日付と時刻を管理しています。

GPSモジュールのパケットフォーマットであつNMEAフォーマットによるデータ生成の方法やシリアル通信でデータを受信して管理する方法についてまとめています。

GPSモジュールの時刻データは世界標準時が基準であるため日本時間に換算するときは+9時間して考える必要があります。日時を表示するとなると+9時間したときに日付も変更する必要があるため日付の管理までする際は少し面倒なのが難点です。

応用編としてGPSモジュールとRTCモジュールでGPS時計を作りました。Wireライブラリとシリアル通信を使ってRTCモジュールとGPSモジュールの双方と通信を行い、お互いの利点と欠点を補完します。

RTCモジュールへの時刻設定がGPSモジュールの受信によって楽にできるようになり、RTCモジュールが時刻カウントを管理するため一度でもGPSから(世界標準時で15時までに)時刻データを受信できていれば、世界標準時から日本時間に換算したときの日付超えの問題も問題になりません。

日本時間で0:00~8:59まではGPSの時刻を反映できない欠点があるものの各種モジュールの特徴を活かしてシステム構成を考えると応用例の選択肢が増えて面白いと思います。

超音波距離センサーUS-015で距離を測定する

Arduinoと超音波距離センサーを組み合わせることで距離を測定することができます。US-015は2cm~4mまで測定できます。

ArduinoのDOを使ってパルス波形をUS-015に入力することで音波が出力し対象物からの反射波の戻り時間から距離を算出します。

US-015の配置の仕方で距離データがばらつくため複数回のデータを平均化して対策をしました。また距離の測定に関して気づいた点についてもまとめています。

設置方法が悪いと数mm程度の誤差が出てしまうため確実に固定できるように工夫が必要なのが難しい点だと感じました。

応用編として無線通信モジュールであるトワイライトと組み合わせることで距離データを無線で送信しパソコンでモニターできるようにした距離測定モジュールを製作しました。

無線通信が届く範囲で距離が測定できるため測定範囲が広がったように感じました。段ボールを使って工作しながらセンサーを取り付けていると昔の図工の授業を思い出したように楽しめたのが面白かったです。

パルス波形でブザーを鳴らす

標準ライブラリのanalogWrite()によってPWM波形を生成しブザーを鳴らしました。analogWrite()ではPWMのデューティ比が変更できるためデューティ比を変更してブザーに供給する電圧を変化させることで若干音程が変わります。

デジタル加速度センサのデータを取得

ArduinoのWire(SPI)を使用すると加速度センサー(ADXL345)の加速度やタップ情報などを取得することができます。ADXL345モジュール(秋月電子)を使用して加速度を取得しています。Arduino UNOではADXL345の特徴でもあるFIFO機能を使用して取得する方法をまとめました。

人感センサーを組み込んで検知する

Arduinoと人感センサーをSB612Aを組み込んで人体を検知してブザーとLEDで通知する人感センサーモジュールを製作しました。人感センサーSB612A(秋月電子)の使い方や感度の調整についてまとめています。

人感センサーモジュールは厚紙で箱を作りArduino UNOや人感センサを詰め込んだだけの簡単なものでしたが、基板などがむき出しよりに配置されているより良い環境で動作確認が行えました。

Arduinoとトワイライト(TWELITE)でセンサー情報を表示する

トワイライトを親機と子機に分けて子機側にはBME280と組み合わせてセンサー情報を取得し親機に無線通信を行います。親機はArduinoと組み合わせることで子機からのセンサー情報をLCD表示します。

子機ではI2C通信と無線通信を使用し親機では無線通信を受信しシリアル通信して親機にデータを送信します。

子機を部屋を変えて設置してセンサー情報をLCDに表示しているとArduinoと組み合わせることで応用範囲が広がることや無線通信をうまく使えている感覚になりセンサーを変えていろいろと試したくなってきました。

Arduinoと参考書籍の紹介

私が使用しているArduinoはArduinoUNOです。Arduinoはオープンソースであるためスターターキッドは各種いろいろありますが、ArduinoUNO本体だけでは動作確認するには部品が足りないのでスタータキットでまとめて購入するのがおすすめです。

ELEGOO Arduino用のUNO R3 最終版スタータキット UNOチュートリアル付 (63 Items)
ELEGOO
200以上のコンポーネントも付き、本品は最も完全なArduinoを始めようとするキットです。部品が63種類も入れて、お買い得です

私は数年前にHYPERIONのArduinoUNOを購入して動作確認しています。

私がArduino環境でマイコンを動作させるために勉強した書籍です。初版から7年以上になりますが今でも現役として活躍しているほどの書籍です。(関数やライブラリの使い方を忘れた時使っています。)

スケッチ例やライブラリについて説明が多くマイコンや電子回路に少し精通しており応用例を勉強したい場合に参考になります。ただし、回路使用例に使用しているモジュール(スイッチモジュールやCAN通信モジュールなど)が別途必要になるため楽ちんに動作を確認できるわけではないと思います。

まとめ:Arduinoでソフト開発のハードルを下げよう

Arduinoはライブラリを使用することでSPIやI2C通信などが簡単に実現できるためマイコンの動作を勉強するには最適な環境です。ソフト開発に対して苦手意識があり敷居が高く感じていた方でも簡単に動作確認ができるため苦手意識をなくせることがメリットと言えます。

Arduinoはライブラリを使って各種機能を実現するためライブラリにない動作を組み込みたい場合は自作する必要があります。ライブラリは有志が作成したものであるためバグがある可能性もあり動作の保証はないのがデメリットです。

実際にセンサー情報を取得したりシリアルモニタに表示したりと動作確認しながら1つ1つの技術の成功を積み重ねていけばできることが増えていき自信がつくことでソフト開発に対するハードルが下がっていくことは間違いありません。

自信がつきマイコンの機能をフル活用してみようとレジスタの操作についてデータシートを見てみようと興味が湧いてくれば、あっという間に脱初心者となるでしょう。

私は業務に追われながらも独学していたためソフト開発に慣れるまでに10年程度かかってしまいました。ArduinoだけでなくPICマイコンやRXマイコン最近はIoTモジュールのソフト開発などをしていますが、早い段階でプログラミングを教養として身に着けておけば10年もかからなかったと感じています。

TECH::CAMPプログラミング教養【無料体験会】

最近では無料体験できるプログラミングスクールも増えてきており、あなたに合った学習プランによって短期集中してプログラミングに親しめる環境があります。無料体験でもプログラミングに対する感覚を掴めておけばソフト開発に対するハードルが下がることは間違いありません。

関連リンク

Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。

Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方

ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方

Arduinoのようにソフト開発したり周辺回路と組み合わせてデータを取得させたりして電子製品を開発するエンジニアは組み込みエンジニアといいます。IoT社会実現と組み込みエンジニアの職種との関係についてまとめています。

組み込みエンジニアはIoT社会実現のために需要が高い職種

IoTモジュールであるトワイライトでソフト開発と無線通信を行い動作確認したことについてリンクをまとめています。

トワイライト(TWELITE)のソフト開発と無線通信でできること

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました