Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

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

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を取り出すことができました。

まとめ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?