전기를 이용해 수도 밸브 개폐를 제어하려면 '솔레노이드 밸브' 를 사용해야 한다고 한다. 다양한 제품들이 판매되고 있는데, 내가 사용하려는 환경이 별로 가혹하지 않기 때문에 1만원대 초반의 저렴한 플라스틱 제품으로 선택했다. 일반적으로 사용하는 수도 호스와 바로 연결할 수 있는 외경 20mm 짜리 수관이 장착돼 있고, 12V 직류 전압으로 작동하기 때문에 어댑터도 쉽게 구할 수 있다.
우선 정상 작동여부를 확인하고자 수관 한쪽에 수도꼭지에 연결한 후, 12V 0.5A 짜리 어댑터를 연결해봤다. 처음 전기가 통하지 않은 상태에서는 물이 흐르지 않다가, 어댑터를 통해 전기가 공급되자 물이 흐르기 시작했다. 그리고 이 상태에서 전기를 차단하면 다시 물이 흐르지 않았다. 반응속도가 좀 느리긴 했지만, 문제될 것은 없는 정도였다.
처음 테스트를 했을 때는 전기가 통하지 않은 상태에서도 물이 흐르고, 전기가 통하는 상태에서도 약하긴 하지만 물이 흘러 나왔었다. 불량품인가 싶어 걱정했는데, 나중에 보니 솔레노이드 밸브 한 쪽 수관에 화살표 표시가 돼 있었고 나는 그 반대쪽 수관에 수도꼭지를 연결해 놓은 상태였다. 화살표 방향대로 수돗물이 공급되도록 수도꼭지를 연결하니 잘 작동했다.
이제 아두이노로 제어할 수 있도록 전원선을 아두이노 보드에 연결할 차례이다. 하지만 어댑터의 전원선을 아두이노 보드에 바로 연결하지 말아야 한다. 어댑터에서 공급되는 전기는 12V 인 반면 아두이노 보드가 사용하는 전기는 5V 라서 바로 연결했다가는 과전압으로 아두이노 보드가 손상될 수 있기 때문이다. 마찬가지로 아두이노 보드에서 나오는 전기는 5V 뿐이라서 이걸 바로 솔레노이드 밸브에 연결하면 12V 에 턱없이 부족하기 때문에 밸브가 작동하지 않는다.
이렇게 낮은 전압의 기기로 높은 전압의 기기를 제어해야 하는 경우에는 '릴레이' 라는 부품을 사용해야 한다고 한다.
이 릴레이의 우측에는 어댑터와 솔레노이드 밸브에서 나온 +극과 -극 선이 연결되고, 좌측에는 아두이노 보드에서 나온 전원(5V, GND)과 제어핀이 연결된다. 아두이노 프로그램에서 이 제어핀에 신호를 줌으로써, 어댑터에서 나온 전기가 솔레노이드 밸브에 공급되거나 끊어지게 제어할 수 있다.
릴레이 우측에는 총 세 개의 연결부가 있고 각각에는 NC, COM, NO 라고 씌여 있다. 우선 COM 은 반드시 +극이나 -극을 하나 연결해야 하고, 나머지 NC 와 NO 중 하나를 선택해서 또 -극이나 +극을 연결한다.
NC (Normal Close) 와 COM 을 선택하면 평소에는 솔레노이드 밸브에 항상 전기가 공급돼 물이 흐르게 되므로, 제어핀에 신호를 줘서 밸브를 닫아 물이 흐르지 않게 한다.
NO (Normal Open) 와 COM 을 선택하면 평소에는 솔레노이드 밸브에 전기가 공급되지 않아 물이 흐르지 않으므로, 제어핀에 신호를 줘서 밸브를 열어 물이 흐르게 한다.
이번 제작에서는 NO 쪽으로 연결해야 한다.
아두이노 IDE 에서 다음과 같이 테스트용 코드를 업로드했다.
int valvePin = 2;
void setup() {
Serial.begin(9600);
pinMode(valvePin, OUTPUT);
delay(3000);
Serial.println("Started");
digitalWrite(valvePin, HIGH);
delay(1000);
digitalWrite(valvePin, LOW);
delay(3000);
digitalWrite(valvePin, HIGH);
delay(1000);
digitalWrite(valvePin, LOW);
Serial.println("Ended");
}
작동을 시켜봤는데, 기대했던 것과 다르게 작동한다. 시작과 동시에 릴레이 하단의 녹색 LED 가 점등되고 솔레노이드 밸브가 열려 물이 흘렀다. 게다가 제어핀을 통해 릴레이에 HIGH 신호를 주면 녹색 LED 가 꺼지며 솔레노이브 밸브가 닫혔고, 릴레이에 LOW 신호를 주면 릴레이의 녹색 LED 가 켜지며 솔레노이브 밸브가 열렸다. 의도했던 것과 정 반대로 작동하고 있는 것이다.
인터넷을 검색해보니 다음과 같이 pinMode 설정 전에 HIGH 값으로 초기화 하라고 한다.
digitalWrite(valvePin, HIGH);
pinMode(valvePin, OUTPUT);
하지만 여전히 반대로 작동했다. 혹시나 릴레이가 불량품인가 싶어 다른 걸로 바꿔서 테스트해 봤지만 여전했다.
그러던 중 릴레이의 뒷 면에 Low level trigger 라고 프린트 돼 있는 걸 발견했다.
인터넷에서 검색해보니 LOW 신호일 때 릴레이가 작동하고 HIGH 일때 멈추는 제품이라는 뜻이었다. 릴레이는 High level trigger 제품과 Low level triigger 제품으로 나뉘며 보통 High level trigger 를 사용한다고 하는데, 나는 잘 모르다보니 Low level trigger 제품을 구입했던거 같다. 시판중인 릴레이 중에서는 보드에 있는 점퍼를 변경해서 High 와 Low 를 자유롭게 선택할 수 있는 제품도 있다고 한다.
아래와 같이 HIGH 와 LOW 를 변경하니 원하는 대로 잘 작동한다.
int valvePin = 2;
void setup() {
Serial.println("Started");
Serial.begin(9600);
digitalWrite(valvePin, HIGH);
pinMode(valvePin, OUTPUT);
delay(3000);
Serial.println("Started");
digitalWrite(valvePin, LOW);
delay(1000);
digitalWrite(valvePin, HIGH );
delay(3000);
digitalWrite(valvePin, LOW);
delay(1000);
digitalWrite(valvePin, HIGH );
Serial.println("Ended");
}
'아두이노 > 자동 화분 급수기' 카테고리의 다른 글
#5 제작 - 스케쥴링, unix time(epoch, POSIX) 변환 (0) | 2024.01.29 |
---|---|
#4 제작 - 릴레이 멈춤 현상, RC스너버 (0) | 2024.01.03 |
#2 기획 및 검토 - SSD1306 OLED 모듈(I2C) (0) | 2023.08.13 |
#1 기획 및 검토 - DS1302 RTC 모듈, LCD 모듈(I2C) (0) | 2023.06.23 |