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

組み込みエンジニア
本記事はプロモーションが含まれています。

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

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

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

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

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

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

当サイトの記事から標準ライブラリの使い方をまとめた書籍になります。Arduinoライブラリでよく使用されるWireやSPIの通信など使用例を入れて説明しています。

Arduinoの開発環境をつくる

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

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

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

広告

VSCodeを使って開発する

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

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

Arduinoプラグインのアップデートによってインクルードパスなどの動作が不安定になることが残念な点ですがアシスト機能が使用できる状態であれば効率よくコーディングできるメリットがあります。

Grove Beginner Kit for Arduinoで動作確認

Grove Beginner Kit for Arduinoは初心者のためのスターターキットです。Arduino UNOと同じシリーズのマイコンを使用しているためArduinoと同様に使用できます。温湿度センサーやLEDなどの周辺回路が組み込まれているためArduino環境の開発やC言語(C++)の学習に最適です。

このスターターキットはUSBに接続するだけで付属している温湿度センサーなどの動作確認ができます。標準ライブラリの使い方など周辺回路を準備せずArduino環境に慣れたい方にお勧めしたいキットです。

照度センサーとブザーの動作確認を行いました。照度センサーの値が可変抵抗で設定した値以下になった時ブザーを鳴らしています。

気圧、温度センサーであるBMP280の動作確認を行いました。メーカーが提供しているBMP280用のドライバーAPIにArduinoのWireライブラリを組み込んで測定データを取得する方法とArduino IDEでライブラリを追加して測定データを取得する方法をまとめています。

湿度・温度のデータであるDHT11の動作確認を行いました。シングルバス方式で通信を行って測定データを取得する方法とArduino IDEでライブラリを追加して測定データを取得する方法をまとめています。

サウンドセンサーの動作確認を行いました。サウンドセンサーから取得した測定値が閾値を超えた時の測定値の様子をOLEDに履歴データとして表示しました。

加速度センサーであるLIS3DHTRの動作確認を行いました。加速度センサーの特徴であるFIFOを使って測定値の取得し、シングルクリック及びダブルクリックのイベント検出の様子をOLEDに表示して確認できるようにしました。

スポンサーリンク

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

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

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

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

広告

LED8×8マトリクスで点灯パターンを作る

LED8×8マトリクスは8×8の行列にLEDを配置したモジュールです。ArduinoのDOを16本使用することで任意のパターンでLEDを点灯させることができます。パターン1~パターン4でLEDの点灯パターンを切り替えて動作確認を行いました。

RGB LEDを操作する

RGB LEDは赤・緑・青の光の三原色を調整することで様々なパターン色でLEDを点灯させることができます。Adafruit NeoPixelライブラリを追加してRGB LEDを操作して動作確認を行いました。

光の三原色で様々な色を作ることができるのでRGB LEDを使ったイルミネーションなどに応用できて楽しそうです。

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環境ではライブラリによって簡単に表示できることは良い点だと感じています。

PR:スキマ時間を有効に!スマホで学べる人気のオンライン資格講座【スタディング】まずは気になる講座を無料で体験しよう!

SPI通信を行う

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

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

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

SDカードにデータを保存する

SDカードライブラリを使用するとSDカードにデータを読み書きができます。SDカードへのアクセスはSPI通信を使用するためSPIライブラリと同時に使用します。Arduino UNOの拡張基板であるSD CARD SHILDを使ってSDカードにデータの読み書きを行って動作確認を行いました。

PR:アクセンチュアの転職なら【コンサルアクシスコンサルティング】

Wire(I2C)通信を行う

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

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

Wireライブラリを使ってDHT20モジュールから湿度と温度のデータを取得してLCDに表示して動作確認を行いました。sprintf()関数を使ってLCD表示用のデータを生成する方法を説明しています。

スポンサーリンク

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

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

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

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

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

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

PR:技術系の通信教育講座ならJTEX

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

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

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

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

GPSモジュールをライブラリを追加して時刻情報などを取得する方法をまとめています。日本時間に換算したときのあり得ない時間になる対策としてtime.hを使用して管理する方法を紹介しています。NMEAフォーマットの解釈を行わず手早く時刻情報や位置情報を取得したいに場合にお勧めの方法です。

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

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

スポンサーリンク

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

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

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

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

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

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

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

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

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

広告

アナログ電圧をAD変換する

標準ライブラリのanalogRead()を使って土壌センサーであるSEN0114のアナログ値を取得します。計測したデータから土壌の状態を確認しました。

観葉植物への水やりのタイミングを掴んで根腐れさせないように徹底的に管理したい場合に役立ちそうです。

MG812モジュールからアナログ電圧を取得してCO2濃度をシリアルモニターに表示して動作確認を行いました。MG812モジュールのエージングの結果とアナログ電圧をCO2濃度に換算する方法をまとめています。

PR:テックジム:プログラミングの「書けるが先で、理解が後」を体験しよう!

ジョイスティックの情報を取得する

ジョイスティックから取得したアナログ値をOLEDに表示します。またアナログ値を換算してジョイスティックの操作位置をOLEDに描いた図形上に表示する方法をまとめました。

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

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

9軸センサーモジュール(BMX055)のデータを取得

Wireを使用して9軸センサーモジュールであるBMX055が測定したデータを取得する方法をまとめました。OLEDに測定したデータを表示すると同時にシリアルプロッタに測定データを表示して動作確認を行いました。

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

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

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

サーボモーターを操作する

サーボモーターを標準ライブラリで操作する方法をまとめました。スターターキットに付属されていたSG90を使って動作確認を行いました。

サーボモータを使ってラジコンカーを作ったりもできますが、モーターの動きを利用して小刻みに振動させることを利用して何かできそうな気がします。

PR:RUNTEQ(ランテック )- 実践型Webエンジニア養成プログラミングスクール

ステッピングモーターを操作する

DOを使ってステッピングモーターを操作する励磁パターンを生成することで時計/反時計回りに回転させることができます。DOを4つ使用する方法とStepperライブラリを使用する方法の2通りで動作確認しました。

リモコンで遠隔操作する

Arduinoのスターターキットに付属しているリモコンと赤外線受信機モジュールを使って遠隔操作を行う方法をまとめました。受信機の出力をDIで受けて通信フォーマットを解析する方法とIRremoteライブラリを使用する方法の2通りで動作確認しました。

ハードのスイッチを実装せず赤外線受信機モジュールのみでリモコンのボタン分のDIを拡張するのと同等なので応用範囲が広がりそうです。

EthernetライブラリでLAN通信する

ETHERNET SHIELDを実装してEthernetライブラリを使って動作確認を行いました。DHT20から取得した温湿度のデータをHTMLデータに含めてWebサーバーで応答することでパソコンのブラウザーに表示する方法をまとめました。

WebClientを実装してサーバーにDHT20から取得した温湿度のデータを送信します。ESP32をサーバーモードで動作させることでローカルサーバを模擬して動作確認を行いました。

UdpClientを実装してUDP通信を実装します。UDP通信の特徴はパケットを全体に送信するブロードキャストがあります。1対1のユニキャストとブロードキャスト通信の動作確認を行いました。

イーサネットを使用することでLANケーブルが届く範囲であれば遠隔でArduinoからセンサーの情報を取得することができるため応用範囲が広がります。

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

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

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

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

Arduinoと参考書籍の紹介

当サイトの記事から標準ライブラリの使い方をまとめた書籍になります。Arduinoライブラリでよく使用されるWireやSPIの通信など使用例を入れて説明しています。

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

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

このスターターキットはUSBに接続するだけで付属している温湿度センサーなどの動作確認ができます。標準ライブラリの使い方など周辺回路を準備せずArduino環境に慣れたい方にお勧めしたいキットです。

Arduino ETHERNET shield2
Arduino (アルドゥイーノ)
拡張シールドは、TCPとUDPプロトコルをサポートする、シンプルで信頼性の高い通信ライブラリでArduinoボードをオンラインにします。

Ethernetライブラリの動作確認を行う際に使用したETHERNET SHIELDとUSBハブです。動作確認用のイーサーネットと区別した方が便利なのでUSBハブを別途使用した方が良いと思います。

ソフト開発に必要な知識である数値の扱いや文字列の扱いまで基礎から説明されています。Arduino UNOの標準ライブラリやESP32シリーズ専用のライブラリについても説明されているためArduino環境でのソフト開発を1から始めてみたい方にお勧めです。

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

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

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

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

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

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

広告

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

関連リンク

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

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

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

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

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

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

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

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

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