エレキ素人が何か考える（その19）：コンパレータ

# コンパレータを試す
秋月電子で購入したコンパレータ「[４回路入コンパレータ　ＮＪＭ２９０１Ｎ](https://akizukidenshi.com/catalog/g/gI-05736/)」の超基本動作を確認してみる。

## コンパレータとは
比較器である。参照（基準）電圧があり、その電圧より大きければ供給電圧を出力、小さければ0Vを出力するのが基本。下記サイト参照。
- [コンパレータの原理](http://arduinopid.web.fc2.com/M19.html)
- [コンパレータ（比較器）](https://www.kairo-nyumon.com/practice_comparator.html)

## データシート
NJM2901Nのデータシートは、[こちら](https://akizukidenshi.com/download/ds/njr/NJM2901N.pdf)を参照。ピン配置および基本回路を下記。

### ピン配置
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1701989d-602c-16d2-2aa3-2885643126b9.png", width=60%>

### 基本回路
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/eba61ab0-a342-6dcf-6724-5bf11269600d.png", width=60%>

## 実験回路
上記基本回路をもとに作成した回路は下記。
![Comparator_回路図のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1e4ded04-c008-531c-2c5e-f1c03a443c77.png)
Arduino互換機からの3.3Vを基準電圧とし（NJM2901NのPin4）、Arduino互換機で制御するデジタルポテンショメーター（POW）により入力電圧（Pin5）を変化させる。Pin2がアウトプットとなり、上記ではLEDが接続されている。実際の状況は下記のとおり。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0bba3a32-b1f5-d5e8-b185-25041919f8cf.jpeg", width=70%>
左側がコンパレータNJM2901N、右側がポテンショメーターであり、Arduino互換機から制御されている。なお、後述する「実験」では、LEDを接続せず、Pin2の電圧測定も行っている。

## ソースコード
デジタルポテンショメーターを操作するもの。[こちらの回「エレキ素人が何か考える（その６：ツェナーダイオード；失敗?）」](https://qiita.com/infinite1oop/items/e3dae125473e17dba479)のコードと全く同じ。

```c++
#include <SPI.h>

#define W_ADDR 0x00
#define R_ADDR 0x0c
#define CS 10

void setup() {
  pinMode(CS, OUTPUT);
  SPI.begin();
  Serial.begin(9600);
  digitalPotWrite(127);  // 0: Vwb=0V;Vaw=Max   127: Vwb=Max;Vaw=0V
  delay(10);
  int r_val = digitalPotRead();
  Serial.print("Read  "); Serial.println(r_val);
}

void loop() {
  while (Serial.available()) {  // Waiting for writing data (0-127)
    String data = Serial.readStringUntil('\n');
    int w_val = data.toInt();
    Serial.print("Write "); Serial.println(w_val);
    digitalPotWrite(w_val);
    delay(10);
    int r_val = digitalPotRead();
    Serial.print("Read  "); Serial.println(r_val);
  }
  delay(10); 
}

int digitalPotWrite(int value) {
  digitalWrite(CS, LOW);
  SPI.transfer(W_ADDR);
  SPI.transfer(value);
  digitalWrite(CS, HIGH);
}

int digitalPotRead() {
  int val;
  digitalWrite(CS, LOW);
  SPI.transfer(R_ADDR);
  val = SPI.transfer(255); // Must be 255, instead of 127
  digitalWrite(CS, HIGH);
  return val;
}
```
シリアルコンソールから入力された数値（0-127）により、ポテンショメーターの出力（＝コンパレータへの入力）電圧をコントロールするもの。

## 実験
シリアルコンソールから入力された数値（入力電圧）により、コンパレータのPin5（インプット）およびPin2（アウトプット）の電圧を測定する。

### Arduino互換ボードの、5Vおよび3.3Vの電圧
![5&3.3V.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/924ca342-e1a8-14a2-fab1-e66d60aa2e9d.png)
この＜3.310V＞がコンパレータの基準となる電圧である。

### シリアルからの入力値：127
![Input127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7a28454c-02e7-1012-3dd8-cf734a92fbee.png)
ポテンショメーター出力値最大のケースである。基準値＜3.310V＞より大きいので、コンパレータの出力はVdd（約5V：上記の写真で＜4.959V＞）となる。

### シリアルからの入力値：86
![Input86.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e7b72609-f22d-5d93-dba0-007073d326a1.png)
入力値は、基準値＜3.310V＞より若干大きい値（3.314V）を探した結果である。コンパレータの出力はVddとなる。

### シリアルからの入力値：85
![Input85.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/00800c98-e986-a00d-7882-8587ec7d8fbb.png)
入力値は、基準値＜3.310V＞より若干小さい値（3.276V）を探した結果である。コンパレータの出力は限りなく0Vに近くなり、ここでは、＜106.6mv＞となっている。

## 終わりに
まずは基本動作を確認。（レベルは低いけど。）