以前、Arduinoの高速化のことを調べてたら便利だなあと思うプログラムが結構見つかりました。
そこで自分なりにライブラリにまとめてみました。
名前は「Utlityライブラリ」です、そのまんま(´・ω・`)
まぁ既に同じライブラリの名前があってかぶっているようなんですが、私は気にしません(オイ
スポンサーリンク
使い方はいつもどおりで、ダウンロードして解凍したフォルダをlibrariesフォルダに入れてください。
そしてプログラムに
#include <Utility.h>
と書けばOKです。
Arduino UNO用に作っているのでMegaなんかではほとんどの関数が動かないと思います。
ライブラリの関数は以下の6つです。
また、システムクロックが16MHzの前提で話していきます。
目次
void setPWMFrequency(uint8_t pin, int divisor)
関数名の通りArduinoのPWMの周波数を変えます。
setPWMFrequency(11, PWM_DIV32);
第1引数はPWMの使えるピンの番号(3, 5, 6, 9, 10, 11)です。
それ以外を指定するともちろんスルーされます。
第2引数は分周比を指定します。
分周比は定数を用意していますのでそれを用いたほうがわかりやすいかもしれません。
分周比と周波数は次のように対応しています。
また、Arduinoのデフォルトは64分周(PWM_DIV64)に設定されています。
注意して欲しいのが5, 6ピンを使うとmillis(), micros(), delay(), delayMicroseconds()などの関数が正常に動かなくなることです。
millis()とdelay()には代わりにadjustMillis()とadjustDelay()という関数を用意しているのでそれを使ってください。
adjustMillis()とか使うなら、PWMの周波数を変えないほうが無難かもしれませんね。
void setADCFrequency(int divisor)
前の関数と似ていますが、こちらはAD変換器の周波数を変える関数です。
setADCFrequency(ADC_DIV8);
AD変換器はanalogRead()関数で使います。
つまりanalogRead()が高速化できるのです。
高速化できるのですが、速ければ速いほどその分精度が落ちるので注意が必要になります。
分周比とAD変換器の周波数は次のように対応しています。
Arduinoのデフォルトは128分周に設定されているのでAD変換器の周波数は125kHzです。
注意して欲しいのはこれはサンプリング周波数ではなく、あくまでAD変換器の「クロック」の周波数です。
AD変換には13クロックを要するのでサンプリング周波数はこれを13で割ったらいいことになります。
また、ArduinoでAD変換で10ビットの精度を確実に得るためには、50kHz~200kHzのクロックが必要とのことです。
最高速は2分周の8MHzですが、速すぎて全くと言っていいほど正確な値が取得できません。
速度が必要でも、せめて32分周ぐらいにはしたほうがいいと思います。
double analogReadVoltage(uint8_t pin, double vref)
analogRead()は0~1023の値が返ってきますが、この関数の場合は例えば0~5000の値が返ってきます。
つまり電圧値がmVで返ってきます。
便利といえば便利なのかもしれませんが、実際私自身が使うかどうかは不明です。
double val = analogReadVoltage(A0);
第2引数はanalogReference()が"DEFAULT"か"INTERNAL"なら省略可能です。
"EXTERNAL"の場合はARefピンの入力電圧値を書く必要があります。
double val = analogReadVoltage(A0, 3.3);
スポンサーリンク
ちなみにanalogReference()を書いてない場合は"DEFAULT"なので省略できます。
void forPinMode(int pinArray[], unsigned int num, uint8_t mode)
おそらく私が一番使うであろう関数です。
この関数はpinModeをfor文で行なってくれます。
int pin[5] = {2, 3, 4, 5, 6}; for (int i = 0;i < 5;i++) { pinMode(pin[i], OUTPUT); }
このように今まで書いていたのが以下のようになります。
int pin[5] = {2, 3, 4, 5, 6}; forPinMode(pin, 5, OUTPUT);
ライブラリにする程でもないだろと言われるとそれまでなんですけどね。
void i2c_faster(void), void i2c_default(void)
この2つの関数はI2Cを高速化したり標準速度に戻したりできます。
標準のSCLの周波数は100kHzですが、高速化すると400kHzまで上げることができます。
高速化してもいいですが、スレーブデバイスが400kHzに対応しているか調べておきましょう。
ちなみにこんな感じの関数が入ったI2Cライブラリが既にあります。
標準のWireライブラリより結構便利になっているそうで、移行できるならしたほうがよさそうです。
でも面倒くさい時はこの関数を使ったらいいかもしれませんね。
注意することはWire.begin()を書いたあとにi2c_faster()やi2c_default()を書くことです。
そうしないと動作しません。
最初はクラスにしてすべての関数の前に「util.」とかつけようと思ったんですけど毎回書くのがめんどそうなのでやめました。
自分でも使うか怪しいライブラリですが、作成することで勉強にはなりました。
今後も便利な関数があれば増やしていく予定です。
まぁこんなライブラリは私以外使う人がいなさそうですが、使ってくれたら幸いです。
スポンサーリンク
Pingback: メイカーズ塾実習 データロガー作り(Arduinoで性能検証) | 自立型太陽光発電システム自作
Pingback: » Arduinoのアナログ入出力
某大学で学生をしている者です.
研究に忙殺され秋葉原にマイコンを買いに出る時間もなく,
かといってネットで精度よく,処理速度のマイコンを買うお金もなく困っていましたが,
こちらのプログラムを使用させていただき,いくらか状況が改善されました.
本当にありがとうございます.