LoginSignup
2
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-30

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

レギュレータとは

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

材料

環境

  • MacOS Catalina 10.15.7
  • Arduino IDE 1.8.12

配線

下記の図のようにして配線します。
配線図.png

コード

こちらは前回と同様です。
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);
    }
}


結果

実際にテスターで電圧を計測してみます。
入力電圧(レギュレータの+VIN-GND間)は12.30Vです。
入力電圧12V.jpeg
出力電圧(レギュレータの+VOUT-GND間)の電圧を測ると……
出力電圧5V.jpeg
無事5.09Vを取り出すことができました。

まとめ

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1