Arduino UNO R4 MinimaはADCの分解能が変更可能!【新機能】
こんにちは、せでぃあ(@cediablog)です。
Arduino UNO R3の後継機種であるArduino UNO R4 Minimaが発売され、本ブログではその新機能を紹介しています。
今回、新機能紹介記事の第4弾として「ADC(アナログデジタルコンバーター)の分解能変更」という機能を紹介します。
ADC機能って何?という話から解説していきます。
- ADC(アナログデジタルコンバーター)と分解能変更方法について
- ADC分解能変更機能を確認するための配線方法
- Arduino IDEでのプログラミング例
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
購入方法と価格
Arduino公式サイトからも購入できますが、海外からの発送になるためコストや納期を考えたら国内サイトからの購入がおすすめです!
R4 Minimaが買える国内サイト
・スイッチサイエンス:3,410円(税込み)+送料無料
・秋月電子通商:3,190円(税込み)+送料
・Amazon:3,246円(税込み)+送料
Arduinoは気軽に始められるマイコンなので、おすすめです!
アナログ入力信号について
まずアナログ信号って何?というところから解説します。
信号は大きく分けて「デジタル信号」と「アナログ信号」に分けられます。
デジタル回路は「0(OFF)」か「1(ON)」の信号のみで構成されるのに対して、アナログ回路は連続的な変化をする信号で構成されます。
デジタル信号の一例
・LEDランプの点灯・消灯
・タクトスイッチのON・OFF
アナログ信号の一例
・可変抵抗器によって変化した電圧入力値
・明るさセンサー(CdSセル)の明るさ値
アナログ入力信号は、変化する「値」だと思ってください。
Arduinoへのアナログ信号入力方法
Arduino UNO R4には、6か所のアナログ入力ピンがあります。
このピンに+側の線を差し込み0~5Vの範囲で電圧をかけることで、Arduinoにアナログ信号を入力することができます。
アナログ入力回路について詳しく知りたい方は、こちらの記事がおすすめです。
ADC(アナログデジタルコンバーター)とは
ADC(アナログデジタルコンバーター)とは、アナログ入力信号をデジタル信号に変換する機能です。
アナログ入力ピンに入力された電圧0~5Vを、Arduino内部で0~1023の値に変換します。(デフォルト分解能10Bitの場合)
今回のテーマでは、可変抵抗器を使ってArduinoに入力する電圧を変化させ、LCDディスプレイにデジタル変換した値を表示させます。
ADC分解能とは
ADC分解能とは、「入力した電圧0~5Vをどれくらいのデジタル値に分解するか」というものです。
Arduino UNO R4 Minimaの標準ADC分解能は10Bitです。
10Bitとは、2進数で10ケタ分使ってデジタル分解するということになります。
上記が分解能10Bitの最大値=1023の説明式です。
分解能10Bitのときは、アナログ入力電圧0~5Vをデジタル信号0~1023に変換されます。
5(V)÷1023(Data)≒0.0049(V/Data)
入力電圧が0.0049V変化すると、デジタル値が1変化することになります。
ADC分解能が変えられる
Arduino UNO R4 Minimaは、ADC分解能が10Bitから12Bit,14Bitに変えられます。
つまり、入力した0~5Vをより細かく表現できるようになるということです。
10Bitで表現できる範囲は、先ほど解説した通り「0~1023」となります。
分解能12Bitの表現範囲
分解能12Bitの表現範囲の最大値は、1023+3072=4095となります。
分解能12Bitのときは、アナログ入力電圧0~5Vをデジタル信号0~4095に変換されるということです。
分解能12Bitの表現範囲
分解能12Bitの表現範囲の最大値は、1023+3072+12288=16383となります。
分解能12Bitのときは、アナログ入力電圧0~5Vをデジタル信号0~46383に変換されるということです。
ADC分解能に応じた表現能力
10Bit:5(V)÷1023(Data)≒0.0049(V/Data)
12Bit:5(V)÷4095(Data)≒0.0012(V/Data)
14Bit:5(V)÷16383(Data)≒0.0003(V/Data)
ADC分解能が14Bitの場合は、10Bitに比べて18倍もの精度で電圧値をデジタル表現できることになります。
ADC分解能の変更方法
ADC分解能は、Arduinoプログラムに記述することで変更が可能です。
プログラムでの分解能指示方法
analogReadResolution(分解能Bit数) ;
分解能Bit数の部分には10、12、14のいずれかを指定します。
たった1行のプログラムで、ADC分解能を変更できます。
Arduino UNO R3のADC分解能は10Bit固定
前世代のArduino UNO R3(写真は互換機)にも、ADC機能はあります。
Arduino UNO R3のADC分解能はUNO R4 Minimaと同じく10Bitです。
Arduino UNO R3は分解能を変えることができません。
ADC分解能変更機能の確認方法
上記写真が今回実践する、ADC分解能変更を確認する回路になります。
動作としては、可変抵抗器によってArduinoのアナログ入力ピンに入力された電圧を(0~5Vの範囲で)変更させ、デジタル変換された値をLCDディスプレイに表示させるというものです。
タクトスイッチを押すごとに、ADC変換分解能が10Bit⇒12Bit⇒14Bitに切り替わります。
分解能が14Bitのときにタクトスイッチを押すと10Bitに戻ります。
LCD(液晶ディスプレイ)の表示内容説明
LCD(液晶ディスプレイ)には、3つの要素が表示されます。
LCD表示内容
①ADC分解能モード
②ADC分解能Bit数
③アナログ入力電圧をデジタル変換した値
分解能Bit数に応じた、デジタル変換値の違いを確認します。
分解能モードは3種類
分解能モードは0、1、2の3種類あります。
各モードに対する分解能の割り当ては、上記説明図のようになります。
プログラムの構成上、ADC分解能をモード別にするとわかりやすいので、このようなモードを準備しました。
ADC分解能切り替え動作確認回路で使うもの
- パソコン
- Arduino本体
- USBケーブル(typeC)
- ブレッドボード
- 可変抵抗器
- タクトスイッチ
- 抵抗(1kΩ)
- LCDモジュール
- I2Cモジュール
- ジャンパー線(オスーオス)×7本
- ジャンパー線(オスーメス)×4本
今回はELEGOO社のスーパースターターキットに含まれる部品を使っています。
コスパ最強のArduinoキットに含まれる、すべてのパーツを紹介しています。
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino UNO R4 Minima本体
今回は、Arduino純正品の「Arduino UNO R4 Minima」を使用します。
納期や価格面から、国内から発送される通販サイトからの購入がおすすめです。
R4 Minimaが買える国内サイト
Arduino UNO R4 Minimaの始め方は、こちらを参考にしてみてください。
ピン配置などの基本的な仕様は、UNO R3と同じです!
USBケーブル(TypeC)
UNO R3は本体に接続する側の端子形状が(TypeB)でしたが、R4 MinimaではTypeC形状になります。
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
USBケーブルは別売りなので、買い忘れに注意してください。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです
ブレッドボードだけの購入も可能です。
可変抵抗器【キット】
今回使用する可変抵抗器はツマミを回転させることで、10kΩまで変化させることができるものです。
極性はありませんが、ツマミを左右どちらに回転させたときにどういった動作をさせたいか?によって各固定端子への配線が変わります。
可変抵抗器については、こちらの記事にて詳しく説明しています。
タクトスイッチ【キット】
今回の回路では、タクトスイッチ(押しボタンスイッチ)を使用します。
押しボタンは押されている間のみ、上記写真での2点が内部でつながります。
このようなボタンをモーメンタリボタンといいます。
今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。
モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。
抵抗(1kΩ)【キット】
1kΩの抵抗を1本使用し、押しボタンスイッチに接続します。
抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。
この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。
抵抗カラーコードの見分け方については、こちらの記事で詳しく説明しています。
LCD1602モジュール【キット】
液晶ディスプレイ「LCD(Liquid Crystal Display)」モジュールになります。
数字や文字などを表示させることが可能です。
LCD(液晶ディスプレイ)については、こちらの記事にて詳しく説明しています。
I2Cモジュール
I2Cを使ってLCDを制御するために必要なモジュールです。
電源線2本と通信線2本の合計4本の配線だけで、LCDを制御することが可能になります。
I2C通信については、こちらの記事にて詳しく説明しています。
ジャンパー線(オスーオス)【キット】
ジャンパー線を7本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
ジャンパー線(オスーメス)【キット】
オス-メスジャンパー線を4本使用します。
I2CシリアルインターフェースボードとArduino本体を接続させるために使用します。
ADC分解能切り替え回路の配線図
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
機器が故障するおそれがあるので、接続するプラスマイナス極性には十分注意して配線してください。
今回はタクトスイッチをデジタル入力ソケット「2番」に接続しています。
1kΩ抵抗もタクトスイッチに接続していますが、スイッチOFF状態では確実に電位が0Vになるようにしています。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください。
LCDモジュールなど複数のピンを同時にブレッドボードに挿入する場合は、なるべく垂直に差し込むようにしてください。
ADC分解能切り替え動作プログラム
配線が完了したところで、ADC分解能切り替え動作の確認プログラムを作っていきます。
Arduino IDEを開く
Arduinoの開発環境ソフトウェアである、Arduino IDEを開きます。
今回Arduino IDE2.2を使ってプログラムを作成しました。
プログラムを作成していきます。
USBケーブルで、Arduino UNO R4 Minimaと接続した状態で開くと、プルダウンから機種選択が可能です。
機種選択は、プログラム作成後でも問題ありません。
Arduino IDE2.2のインストール方法については、こちらの記事にて紹介しています。
LiquidCrystal_I2Cライブラリのインストール
今回LCDディスプレイをI2C通信で制御するため、LiquidCrystal_I2Cライブラリのダウンロードとインストール作業が必要となります。
LiquidCrystal_I2Cライブラリのダウンロードとインストール方法を解説します。
mBlockでプログラミングをする場合は、本ライブラリインストール作業は不要です。
「Download ZIP」をクリックして、ZIPファイルをダウンロードします。
ArduinoIDEを開き、「スケッチ」⇒「ライブラリをインクルード」⇒「.ZIP形式のライブラリをインストール…」の順に選択して、STEP3でダウンロードしたZIPファイルを選択。
インストールが行われ、ライブラリインストール作業が完了となります。
LiquidCrystal_I2Cライブラリの説明
今回はLCD1602の制御をするために、「LiquidCrystal_I2Cライブラリ」を使用します。
このライブラリを使うだけで、簡単にLCD表示を制御できます。
LiquidCrystal_I2Cライブラリの読み出し
プログラム冒頭の宣言部にてLiquidCrystalライブラリを読み出します。
#include <LiquidCrystal_I2C.h>
LiquidCrystal型変数の指定
プログラム冒頭の宣言部にてLiquidCrystal_I2C型の変数を定義します。
LiquidCrystal_I2C lcd(I2Cアドレス, 桁数, 行数)
変数「lcd」は例であり、任意の変数文字列を指定してください
init()
LCDの表示内容をクリアし、カーソルを左上に移動させます。
lcd型変数.init
clear()
LCDの表示内容をクリアします。
lcd型変数.clear()
setCursor(桁 , 行)
カーソル位置を指定します。テキスト表示開始位置を指定することができます。
lcd型変数.setCursor(桁、行)
桁は左端が「0」、行は上段が「0=1行目」になります。
print(“表示させたい文字列”)
LCDに文字列を表示させます。
lcd型変数.print(“表示させたい文字列”)
backlight()
LCDバックライトを点灯させます。
lcd型変数.backlignt()
分解能を変更するための関数
ADC分解能は、Arduinoプログラムに記述することで変更が可能です。
プログラムでの分解能指示方法
analogReadResolution(分解能Bit数) ;
分解能Bit数の部分には10、12、14のいずれかを指定します。
指定分解能に応じた、プログラム指示方法
analogReadResolution(10) ; //分解能10Bit
analogReadResolution(12) ; //分解能12Bit
analogReadResolution(14) ; //分解能14Bit
動作プログラム
/* 作品名:UNO R4 Minima ADC_Resolution */
/* 作成者:せでぃあ https://cediablog.com */
/* アナログ⇒デジタル変換分解能切り替え表示プログラム */
#include <LiquidCrystal_I2C.h> // ライブラリのインクルード
// LiquidCrystal_I2C型変数の宣言
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27のアドレス,16列2行のLCDを使用
//入出力ソケット番号指定
const int BTN_SOCKET = 2; //タクトスイッチ入力ソケット番号
const int VOL_SOCKET = A0; //ボリューム入力ソケット番号
//解像度モード初期化(0:10bit , 1:12bit , 2:14bit)
int MODE = 0;
//改造度bit変数初期化
int BIT = 0;
void setup() {
//プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(BTN_SOCKET, INPUT); //2番ピンは入力として使用
//LCD初期化
lcd.init(); // LCDの初期化
lcd.backlight(); // LCDバックライトの点灯
}
void loop() {
//プログラム起動後ループ処理される回路
int analog_val; //アナログ入力値を格納する変数
analogReadResolution(BIT); //アナログ入力解像度
analog_val = analogRead(VOL_SOCKET); //アナログ入力値を代入
if (digitalRead(BTN_SOCKET) == HIGH) { //押しボタンがONのとき
if (MODE >= 2) { //解像度モードが2以上のとき
MODE = 0; //解像度モードを0にする
} else { //解像度モードが1以下のとき
MODE = MODE + 1; //解像度モードを+1の値にする
}
while (digitalRead(BTN_SOCKET) == HIGH) { //押しボタンが押されたままのときに待機させる
}
}
if (MODE == 0) { //解像度モード「0:10bit(0-1023)」
BIT = 10; //アナログ入力解像度10bit
} else if (MODE == 1) { //解像度モード「1:12bit(0-4096)」
BIT = 12; //アナログ入力解像度12bit
} else if (MODE == 2) { //解像度モード「2:14bit(0-16383)」
BIT = 14; //アナログ入力解像度14bit
}
//LCDディスプレイをクリア
lcd.clear();
//LCD上段に温度データを表示
lcd.setCursor(0, 0); // カーソルの位置を指定(1文字目、上段)
lcd.print("MODE"); // 文字の表示
lcd.setCursor(5, 0); // カーソルの位置を指定(4文字目、上段)
lcd.print(MODE); // 文字の表示
lcd.setCursor(9, 0); // カーソルの位置を指定(1文字目、上段)
lcd.print(BIT); // 文字の表示
lcd.setCursor(12, 0); // カーソルの位置を指定(4文字目、上段)
lcd.print("bit"); // 文字の表示
//LCD下段に湿度データを表示
lcd.setCursor(0, 1); // カーソルの位置を指定(1文字目、上段)
lcd.print("val="); // 文字の表示
lcd.setCursor(4, 1); // カーソルの位置を指定(1文字目、上段)
lcd.print(analog_val); // 文字の表示
delay(200); //0.2秒ウェイト
}
タクトスイッチを押すたびに、ADC分解能モードが切り替わる回路になっています。
モードとADC分解能の対照表
モード0:10Bit
モード1:12Bit
モード2:14Bit
モード2の状態でタクトスイッチを押すとモード0に戻り、以降繰り返し動作となります。
動作確認
プログラムをArduino本体に転送したら、動作確認します。
押しボタンを押すと、ADC分解能が10Bit⇒12Bit⇒14Bitと変化していきます。
可変抵抗器のツマミを回しながら、各ADC分解能に応じたLCDディスプレイに表示される変換値の変化を確認してください。
ADC分解能の範囲で数値が変動することがわかります。
まとめ
Arduino UNO R4 Minimaになって、ADC分解能がUNO R3の10Bitからさらに細かくすることが可能になりました。
Arduino UNO R4 MinimaはCPUの演算処理速度が、UNO R3の3倍に進化しています。
これにより、細かい電圧の変化を素早く読み取って判断することが可能となったと言えます。
ちなみに秋月電子通商でのArduino UNO R4 Minimaの税込み販売価格は以下となっており、R4のほうが安いです。
・R3:3630円+送料
・R4:3190円+送料
純正品を買うならR4 Minimaの購入がおすすめです。
以上で、Arduino UNO R4 MinimaのADC分解能の変更機能についての紹介を終わります。
ぜひあなたも新機能を使って遊んでみてください!
最後まで読んでいただき、ありがとうございました。
Arduino R3互換品キットなら、本体と30以上の電子パーツが入って5,000円程度と高コスパです。
ELEGOOのArduino互換キットは本ブログのLESSONシリーズでも活用しています。
Arduino UNO R4 Minimaの新機能を紹介しています。
コメント