三端子レギュレータで外部電源の電圧調整

12VのRS485センサーと5VのRS-485ドライバを、一つの基板でまとめて楽に使いたかったので、
外部電源（12VDCアダプタ）から12Vと5Vの2つの電圧を取るようにします。
電源周り以外は前回（[RS-485トランシーバを使ってRS-485センサーとModbus通信](https://qiita.com/s_fujii/items/54194d3b86a52b28481f)）の応用となっています。

# レギュレータとは
出力する電圧や電流を常に一定に保つようにする電子部品です。
今回は6.5〜36V・もしくは7〜31Vの入力電圧を5V・もしくは-5Vに出力する三端子DC/DCレギュレータを使用します。


# 材料
- Seeeduino Mega
- [RS485ドライバ MAX485EN](https://akizukidenshi.com/catalog/g/gI-15806/)
- [三端子レギュレータ DC/DCレギュレータ５Ｖ(-５Ｖ出力可)　ＶＸ０７８０５－５００](https://akizukidenshi.com/catalog/g/gM-15209/)
- RS485センサー
- ジャンパーワイヤ
- ブレッドボード
- 基板取り付け用DCジャック
- 12VDCアダプタ

# 環境
- MacOS Catalina 10.15.7
- Arduino IDE 1.8.12

# 配線
下記の図のようにして配線します。
![配線図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/4a59f63a-d51d-ecda-f57b-5096ce309e7a.png)


# コード
<details><summary>こちらは前回と同様です。</summary>
<div>

```c:rs485_data.ino
#include <Arduino.h>
#include <stdio.h>

#define DE_PIN  3
#define RE_PIN  2

byte slaveID = 0x01;
// 各自のRS-485センサーでの命令を記述してください
byte getVolt[] = {slaveID, 0x03, 0x00, 0x16, 0x00, 0x02, 0x25, 0xCF};

// 各自のRS-485センサーでのレスポンス時間に従って書き換えてください
const int modbusTimeout = 30 * 1000;

uint32_t startMillis = 0;
int bytesRead = 0;

byte responseBuffer[20];
unsigned char p[4];
float f = 0;

void setup() {
  pinMode(DE_PIN, OUTPUT);
  pinMode(RE_PIN, OUTPUT);

  Serial.begin(115200);
  Serial1.begin(9600);

  Serial.println("setup completed!");
}

void loop() {
  transmit_enable();

  Serial1.write(getVolt, sizeof(getVolt)/sizeof(getVolt[0]));
  Serial1.flush();
  startMillis = millis();

  Serial.print("write instructions : ");
  // iは各自のセンサーの命令バイト数に従って書き換えてください
  for(int i=0; i < 8; i++){
    Serial.print(getVolt[i], HEX);  Serial.print(" ");
  }

  receive_enable();

  while ((Serial1.available() == 0) && ((millis() - startMillis) < modbusTimeout))
  { delay(1UL);}

  Serial.println();

  if (Serial1.available() > 0){
    // バイト数(10)は各自のセンサーのレスポンスバイト数に従って書き換えてください
    bytesRead = Serial1.readBytes(responseBuffer, 10);

    Serial.print("response frame : ");

    if(bytesRead > 0){
      // jは各自のセンサーのレスポンスバイト数に従って書き換えてください
      for(int j=0; j < 9; j++){
        Serial.print(responseBuffer[j], HEX); Serial.print(" ");
      }
    }

    Serial.println();

    // ここは私が使用しているセンサーの仕様で記述しています
    // 各自のセンサーのレスポンス仕様に従ってresponseBufferから値を取得してください
    p[0] = responseBuffer[3];
    p[1] = responseBuffer[4];
    p[2] = responseBuffer[5];
    p[3] = responseBuffer[6];
    f = get_float(p); // byte to float
    // 値取得ここまで

    Serial.print("float value : "); Serial.print(f);
    Serial.println();
  }

  Serial.println();

  emptyResponseBuffer(&Serial1);
  delay(5 * 1000UL);
}

void transmit_enable() {
  digitalWrite(DE_PIN, HIGH);
  digitalWrite(RE_PIN, HIGH);
}

void receive_enable() {
  digitalWrite(DE_PIN, LOW);
  digitalWrite(RE_PIN, LOW);
}

// Byte convert to float
float get_float(unsigned char *p) 
{ 
  float value = 0;
  unsigned char *valueAddress = (unsigned char*)&value;

  *valueAddress = p[1];
  valueAddress++;
  *valueAddress = p[0];
  valueAddress++;
  *valueAddress = p[3];
  valueAddress++;
  *valueAddress = p[2];

  return(value); 
}

// This empties the serial buffer
void emptyResponseBuffer(Stream *stream)
{
    while (stream->available() > 0)
    {
        stream->read();
        delay(1);
    }
}
```
</div>
</details>

# 結果
実際にテスターで電圧を計測してみます。
入力電圧（レギュレータの+VIN-GND間）は12.30Vです。
![入力電圧12V.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/f19b3425-fda5-d732-1c25-ec232cf8f2de.jpeg)
出力電圧（レギュレータの+VOUT-GND間）の電圧を測ると……
![出力電圧5V.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/f8536d55-042c-b750-6d54-38d3dfa1fdd2.jpeg)
無事5.09Vを取り出すことができました。

# まとめ
電源電圧の違いで配線を悩まされることがしばしばありましたが、これで解決することができそうです。
自作基板制作に向けて、使えそうな部品はどんどん試して実装していけるといいと思います。