JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Arduino UNO R4 (WiFi) DAC テスト

2024-02-28 10:18:24 | Arduino
 Arduino UNO R3では、analogWrite()でPWMを出力して疑似アナログ出力としていますが、Arduino UNO R4(WiFi)には、独立したDACが内蔵されています。

 DACの分解能は12bitですが、analogWriteResolution()でビット数を指定することができます。この関数でDACの分解能を指定することによりDACが使用可能になります。出力先はA0です。


 まず、テストとしてDAC out(A0)に分解能10bitで、1023の値で出力してみます。次のスケッチを書き、コンパイル書き込みをします。
----------------------------------------------
void setup(){
analogWriteResolution(10);
analogWrite(DAC,1023);
}

void loop(){}
----------------------------------------------
出力された電圧です。4.76Vでした。


 次に、分解能を12bitにして、同じ値1023をDACで出力してみます。
----------------------------------------------
void setup(){
analogWriteResolution(12);
analogWrite(DAC,1023);
}

void loop(){}
----------------------------------------------
当然ですが、1/4の値1.19Vが出力されました。


 次にDACの出力電圧を変化させて、鋸歯状波を作ってみます。
 スケッチです。分解能は10bitで、0~1023の値を連続して出力します。
----------------------------------------------------
void setup() {
analogWriteResolution(10);
}

void loop() {
for(int i=0;i<1024;i++ ){
analogWrite(DAC,i);
}
}
----------------------------------------------------
 出力された波形です。周波数は97Hzです。

 かなりギザギザした鋸歯状波(ノコギリ波)が出力されました。


 分解能を12bitにして、0~4095の値をDACから出力してみた時の波形です。
 周波数は24Hzです。



 スケッチ例にある「SineWave.ino」を書き込んで出力波形を見てみました。
 周波数は、約290Hzです。




Arduino UNO R4 (WiFi) ADCテスト

2024-02-27 11:52:28 | Arduino
 Arduino UNO R4 (WiFi)のADCのテストをします。

 Arduino UNO R3は、6チャンネル(A0~A5)のADCを持っており、分解能10bitで入力電圧に対して0~1023の値が得られます。
 Arduino UNO R4(WiFi)でも6チャンネルのADCで、分解能は14bitに性能アップされています。
 ただし、Arduino IDEのデフォルトでは、10bitに設定されていますので、例えば、
int val = analogRead(A0);とすれば、valの値は、0~5Vの電圧を0~1023の数字で読み取ることができます。

 分解能を上げるには、setup()でanalogReadResolution(12);とすれば12bitになり、0~4095の値が得られます。また、analogReadResolution(14);とすれば、分解能が14bitになり、0~16383の値が得られます。

 内部参照電源を使うには、setup()でanalogReferebce(AR_INTERNAL);とします。これで10bit分解能でテストすると1.5Vで1023となりました。





 オプションで、INTERNAL_2_0VやINTERNAL_2_5Vとすると参照電圧が2.0Vや2.5Vになるらしいのですが、結果は得られませんでした。

Arduino UNO R4 WiFi PWM テスト その2

2024-02-25 14:17:52 | Arduino
 Arduino UNO R4 WiFiで任意の周波数、パルス幅のPWM信号を作るテストをします。これについては、「imo lab.」というサイトのこちらの記事を参考にさせていただきました。ありがとうございます。

 PwmOutというクラスを使い、周期をus単位で、パルス幅もus単位で指定することにより、任意の周期(周波数)と任意のパルス幅のPWM信号を得ることができます。Arduinoでは、tone(pin,ftrquency)という関数があり、任意の周波数を発生させることができますが、出力pinは1つに制限されています。PwmOutでは、複数のピンに任意の周期、パルス幅のPWM信号を発生させることができます。PICのNCO(数値制御発振器)に相当します。これは、Arduino UNO R4のマイクロコントローラRA4M1が下のようにTimerをたくさん持っているからでしょう。


 まず、imo lab.に掲載されている次のスケッチを試してみます。
----------------------------------------------------------------
#include "pwm.h"

PwmOut pwm3(3);
PwmOut pwm5(5);
PwmOut pwm6(6);

void setup() {
pwm3.begin(50, 25); //周期 50us = 20kHz; パルス幅 25us = 50%
pwm5.begin(100, 0); //周期 100us = 10kHz; パルス幅 0us = 0%
pwm5.pulse_perc(25.0); //duty 25% = 25us
pwm6.begin(200, 0); //周期 200us = 5kHz; パルス幅 0us = 0%
pwm6.pulseWidth_us(20); //パルス幅 20us = 10%;
}

void loop() {}
----------------------------------------------------------------
pwm3(pin3)の出力波形です。指定したとおり周期50us=20KHz、パルス幅25us デューティ比50%です。


 pwm5(pin5)の出力波形です。周期100us=10KHz、パルス幅25us デューティ比25%です。

 pwm6(pin6)の出力です。周期200us=5KHz、パルス幅20us デューティ比10%です。


 出力されるPWM信号の周波数の精度をみてみます。次のスケッチで500KHzデューティ比50%の信号を発生させて周波数カウンタ(自作のPIC16F1827周波数カウンタ)で測定してみました。
----------------------------------------------
#include "pwm.h"

PwmOut pwm3(3);

void setup() {
pwm3.begin(2,1);//周期2us=500KHz パルス幅1us デューティ比50%
}

void loop() {
}
----------------------------------------------
 499.131KHzでした。(周波数は少し変動します。)
 誤差1%以下で、任意の周波数を発生させることができます。



 今回、PwmOutというクラスを使うときに、参照した記事にはどのようなメソッドがあるのか詳しくは書いてありませんでした。
 しかし、Arduino IDE 2では、オートコンプリート機能があり、インスタンス.まで記入するとメソッドが表示されるので便利でした。

Arduino UNO R4 WiFi PWM テスト その1

2024-02-24 18:39:57 | Arduino
 Arduino UNO R4 (WiFi)のPWMのテストをします。

 Arduino UNO R4 WiFi本体には、PWM出力のマーク(~)が、R3と同じピン、3,5,6,9,10,11についています。(これは、R3とR4の互換性を考慮しているのだと思います。)

 とりあえず、ピン3にデューティ比50%のPWM信号を出力してみます。
 スケッチです。Arduino UNO R3と同じです。
-------------------------------------
void setup() {
analogWrite(3,128);
}

void loop() {
}
-------------------------------------.

 PWM出力の波形です。

 PWMの周波数です。R3と同様に約490Hzです。


 ネット上の情報では、R4では、すべてのデジタルポートにPWMが出力できるようなので、試してみました。

 確かに、D0~D13まで、すべてにPWMが出力できました。

Arduino UNO R4 WiFi RTC その2

2024-02-23 20:55:16 | Arduino
 前の記事で、Arduino UNO R4 WiFi内蔵のRTCの書き込みと読み出し方を勉強しました。前の記事はこちら

 今回は、ネット上のNTPサーバーに接続して現在の時刻を取得して、その値をArduino UNO R4 WiFiのLEDMatrixにスクロール表示してみます。

 まず、Arduino IDEでスケッチ例のRTCの中の「RTC_NTPSync」というスケッチを開き適当な名前でスケッチを保存し、このスケッチが動作するようにします。

 新しいタブを開き、「arduino_secrets.h」という名前で、次のようなスケッチを書き、保存します。
---------------------------------------------------------
#define SECRET_SSID "************" //無線LANルーターのSSID
#define SECRET_PASS "************" //無線LANルーターのパスワード
---------------------------------------------------------
 これで、チェック(検証)をします。
 不足しているライブラリがあれば、ライブラリマネージャーを使ってライブラリをインストールします。

 エラーがでなければ、Arduino UNO R4 WiFiを接続して、コンパイル書き込みをします。

 数秒後、うまくNTPサーバーに接続できると次のようにシリアルモニタに表示されます。(これは私の場合です。)
--------------------------------------------------------------------
Connected to WiFi
SSID: ********
IP Address: ***.***.**.**
signal strength (RSSI):-58 dBm

Starting connection to server...
Unix time = 1708698196
The RTC was just set to :2024-02-23T14:23:16
-------------------------------------------------------------------
 時刻は、JSTに対してー7時間で表示されます。

 NTPサーバーへの接続が確認できたら、LEDMatrixにスクロール表示するように次のようにスケッチを加えます。

 次の2つのライブラリをincludeします。
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
更に
ArduinoLEDMatrix matrix;
を入れます。

 次に setup()に
 matrix.begin();
を書き入れます。

 loop()は次のように書きました。
----------------------------------------------------
void loop(){
RTCTime currentTime;
RTC.getTime(currentTime);
String NowTime = String(currentTime);
Serial.println(NowTime);

// Make it scroll!
matrix.beginDraw();

matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(70);

matrix.textFont(Font_5x7);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println("     " + NowTime + "     ");
matrix.endText(SCROLL_LEFT);

matrix.endDraw();

}
----------------------------------------------------


 コンパイル書き込みをするとシリアルモニタに現在時刻が表示され、続いてLEDMatrixに時刻が約10秒間隔でスクロール表示されます。