Arduinoで周波数カウンタ【簡易版・Seeeduino Xiao】

Arduinoで周波数カウンタ【Seeeduino Xiao】
Arduinoで周波数カウンタ【Seeeduino Xiao】

以前からArduinoで周波数カウンタを作ってみたかった。しかし、なんだか難しそうと思って遠ざけていたが、割り込み機能を使うと非常に簡単に作れることがわかった。

ここではArduino互換機の超小型マイコンSeeeduino Xiaoを使って、周波数カウンタを作ってみたので紹介する。

信号のアナログデジタル変換

コンパレータでAD変換
コンパレータでAD変換

周波数カウンタを作るにあたって、まず対象となるアナログ信号をArduinoのデジタルピンの基準電圧に揃えなければならない。

アナログ信号が何かにもよるが、例えばオーディオ信号の場合は、GNDを基準に±1V以下に触れている。Arduinoではマイナス電圧は入力できないし、1V程度のピークでは信号を検知することができない。

コンパレータ回路
コンパレータ回路

そこで、以前こちらの記事で作ったオペアンプのコンパレータでアナログ信号を増幅させ、0Vまたは3.3Vのデジタル信号へと変換させた。コンパレータを使うことで、アナログ信号をデジタル変換できるのだ。

オペアンプを使ったコンパレータの製作は難しくないのでぜひ挑戦してみよう!詳しくはこちらの記事を参考に。

周波数カウンタのプログラム

今回は、OLEDディスプレイを使用したが、詳しい使い方はこちらの記事にまとめたので参考にして欲しい。

さて、こちらが周波数カウンタのプログラムである。

#include <U8g2lib.h>
#define FREQ_PIN A2
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

float frequency = 0;
unsigned long lastTime = 0;
float freqz = 0;
float k = 0.5;

void setup() {
//  Serial.begin(9600);
  attachInterrupt(FREQ_PIN, frequencyCounter, RISING);
  u8g2.begin();
}

void loop() {
  displayOLCD(frequency);
  delay(100);  
}


void frequencyCounter() // interrupt handler
{
  unsigned long t = micros();
  unsigned long d = t - lastTime;
//  Serial.println(d);
  lastTime = t;
  float f = 1e6 / d;
  frequency = k * freqz + (1-k)*f;
  freqz = frequency;
}


void displayOLCD(float f) {
    char buf[15];
    snprintf(buf, 15, "%.1f [Hz]", f);

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_crox3hb_tf);
    u8g2.drawStr(0, 16, buf);
    u8g2.sendBuffer();
}

プログラムの解説

割り込み処理から周期の算出
割り込み処理から周期の算出

次のattachInterrupt関数は、割り込み処理を行うものである。

割り込み関数にRISINGを指定することで、ピンの状態がLOWからHIGHに変わったときに指定した関数frequencyCounterが呼び出されるのだ。

attachInterrupt(FREQ_PIN, frequencyCounter, RISING);

ただし、Arduino UNOの場合、FREQ_PINが0の時にデジタルピン2番となるので気をつけよう。割り込み処理ができるピンは端末によって違うので、詳しくはArduinoの公式リファレンスで確認しよう。

frequencyCounterでは、現在の時間から前回トリガされた時間を引いて周期を計算している。だから、信号の周期Tがわかれば周波数fが分かるわけだ。

$$f=\frac{1}{T}$$

これで周波数カウンタは一応出来上がるが、実際周波数を測定してみると周波数が変動しやすいため、ローパスフィルタをかけてみた。

frequency = k * freqz + (1-k)*f;

これは、1つ前にサンプルした周波数と現在の周波数に重みをかけて足し合わせているものである。kの値を大きくすると周波数の変動が安定するが、周波数を変えたときになかなかその値に追従できなくなる。ここでは試行錯誤して\(k=0.5\)と決めた。

$$y[n]=ky[n-1]+(1-k)x[n]$$

実はこれ、アナログにおけるRCローパスフィルタに他ならない。なぜそうなのかはこちらの記事を参考に。

このローパスフィルタは他にも、ジャイロセンサーの角度検出のノイズ除去に使ったりしている。

この周波数カウンタを使えば、LC発振回路を使ってコイルのインダクタンス測定もできそうなので、またそのうちに挑戦してみたいと思う。

この記事で扱った製品はこちら

Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C
Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C

Seeeduino XIAO開発ボードは、ARMCortex-M0+ 32ビット48MHzマイクロコントローラー(SAMD21G18)を搭載し、低消費電力です。クロック周波数は48MHzと、Arduino Uno、Arduino Nanoの3倍です。 又、このArduino IDE互換ボードには256KBのフラッシュメモリ、32KBのSRAMも搭載されています。

AmazonRakuten
DSD TECH 2 PCS OLED 0.91インチディスプレイ IIC I2C シリアルポート Arduino ARM用
DSD TECH 2 PCS OLED 0.91インチディスプレイ IIC I2C シリアルポート Arduino ARM用

0.91インチのOLEDディスプレイ:解像度128 * 32、非常にクリア、黒の背景、青色のテキスト表示。 IIC(I2C)インタフェース:SPIインタフェース画面よりも4つのPIN(VCC、GND、SCL、SDA)だけが簡単です。 他のセンサーを接続するために、さらに多くのポートを残すことができます。

AmazonRakuten

こんな商品も人気です!

1.54インチ 電子ペーパーモジュール 200x200ラズベリーパイ エンベデッドコントローラ付き E-Inkディスプレイ画面
1.54インチ 電子ペーパーモジュール 200x200ラズベリーパイ エンベデッドコントローラ付き E-Inkディスプレイ画面

バックライトがなく、電源を切っても最後のコンテンツが長時間表示される。 超低消費電力、基本的に電力はリフレッシュにのみ必要です。 SPIインターフェイス、Raspberry Pi / Arduino / Nucleoなどのコントローラーボードとの接続用。

AmazonRakuten
M5Stack 開発ボード M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサーUIFlow, MicroPython, A r d u i n o用
M5Stack 開発ボード M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサーUIFlow, MicroPython, A r d u i n o用

Amazon
ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換
ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換

NanoはArduinoと互換性があり、ATmega328PやCH340と同じの公式バージョンで使用しています。 これは、最小で、完全で、ブレッドボードに優しいボードです。より多くのアナログ入力ピンとオンボード+ 5V AREFジャンパを備えた(電気的に)すべてが備わっています。

Amazon
ELEGOO Arduino用の 2.8 Inches TFT ターチスクリーン カードソケット付
ELEGOO Arduino用の 2.8 Inches TFT ターチスクリーン カードソケット付

無料チュートリアル(CDに収録)、より良い価格、より良いサービス。 (技術データ付き) 2.8インチ多彩なディスプレイ液晶画面 タッチペンも付き

AmazonRakuten

Arduinoの参考書

ESP32&Arduino 電子工作 プログラミング入門
ESP32&Arduino 電子工作 プログラミング入門

電子工作ファンに人気のマイコンArduino、そしてWiFiとBluetooth内蔵でネットワーク接続しやすいESP32。それらのマイコンでプログラムを組む際に使うのが「Arduino言語」です。「電子工作は好きだけどプログラミングはよくわからない」あるいは「プログラミングの経験がある。それを活かして電子工作を楽しみたい」--そんなみなさまのための電子工作プログラミング入門が本書です。

KindleAmazonRakuten
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版

電子パーツを自由自在に組み合わせて電子工作ができるように、Arduinoによる電子部品ごとの制御方法を詳しく解説。初心者や電子工作に躓いた人でも安心して取り組めるよう、豊富な図・写真で徹底解説。2018年発刊の「Arduino 電子工作 実践講座」の改訂版です。

KindleAmazonRakuten
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Arduinoをはじめよう 第3版 (Make:PROJECTS)

本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。

AmazonRakuten

Amazonでお得に購入するなら、Amazonギフト券がオススメ!

\Amazonギフトがお得/

コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券

\この記事をシェアする/