[아두이노] 부품이 없을 때 아두이노 실험 팁

IOT/아두이노|2019. 7. 15. 09:00

[아두이노] 부품이 없을 때 아두이노 실험 팁



수 많은 부품들과 오픈 라이브러리 소스를 이용하여 아두이노로 쉽게 실험을 할 수 있습니다. 하지만 많은 부품들을 실험할 때마다 구매하기는 사실 부담이 됩니다. 부품을 구매해서 실험을 하면 좋지만 꼭 구매해야만 실험 할 수 있는 것은 아닙니다. 제가 post를 쓰면서 자주 온라인 가상시뮬레이터에서 실험을 해왔는데 이 가상시뮬레이터를 이용하여 실험하고 싶은 주제의 결과물을 얻을 수 있습니다. 하지만 가상시뮬레이터도 만능은 아닙니다. 모든 전자부품을 제공되지 않습니다. 기초적인 기본 부품만을 제공합니다. 없는 부품을 실험 할 때는 가상시뮬레이터에서도 제약이 따릅니다. 제공되지 않는 부품의 경우는 실험을 못하느냐고 묻는다면 충분히 실험을 할 수 있습니다. 실제 구매해야 하는 부품을 가상시뮬레이터에서 해당 부품의 특징과 비슷한 부품을 대체해서 코딩상으로 해당 주제에 대한 실험을 할 수 있습니다. 즉, 부품의 특징과 원리만 잘 이해하고 있다면 충분히 다른 부품을 사용하더라고 실험하고 싶은 내용으로 실험을 충분히 할 수 있습니다.

그러면, 어떻게 실험을 하는지 그 방법에 대해 살펴보도록 하죠.

1. 온라인 가상시뮬레이터를 이용한 실험


온라인 가상시뮬레이터 tinkercad에서 제공되는 기본 아두이노우노와 부품들은 몇개 되지 않습니다. 하지만 많은 것들을 실험할 수 있습니다. 기본적으로 제공되는 각 부품들의 특징들만 잘 이해하고 있으면 제공되지 않는 부품들도 어느정도 유사한 실험을 할 수 있습니다. 그러면 어떻게 유사한 실험을 할 수 있는지 알아봅시다.

1) 가상시뮬레이터에서 제공되는 부품의 특징


크게 읽기/출력 부품으로 나뉩니다. 읽기는 디지털 읽기와 아날로그 읽기가 있으며 출력도 디지털 출력과 아날로그 출력으로 나뉩니다.

  • 디지털 읽기 : 0 or 1 신호를 읽습니다. (0-0V, 1-5V)
  • 디지털 출력 : 0 or 1 신호를 출력합니다.
  • 아날로그 읽기 : 0~1023 신호를 읽습니다.
  • 아날로그 출력(PWM핀) : 0~255 신호를 출력합니다.
  • 시간값(HIGH->LOW 변환시간, LOW->HIGH변환시간) 외 신호 펄스 관련 제어

2) 실험 할 부품의 특징 파악 후 대체 부품 찾기


실험에 사용 할 부품이 가상시뮬레이터에서 제공되지 않는 부품일 때 해당 부품은 디지털/아날로그 신호를 읽어오는지 출력하는지의 부품의 특징을 우선 알아야 합니다. 그 특징과 유사한 부품의 특징을 가진 가상시뮬레이터의 부품으로 실험 목적에 맞는 유사 실험을 진행 할 수 있습니다.

예를들면, 지난시간에 실험한 토양수분센서를 실험하고 싶을 때 아래 부품을 구매를 해야 실험을 할 수 있습니다. 가상시뮬레이터에서도 제공되지 않는 부품이라서 구매하지 않으면 실험을 할 수 없겠죠.


토양수분센서가 없다고 해서 실험을 할 수가 없는것은 아닙니다. 바로 대체 부품을 찾으면 됩니다. 토양수분센서는 0~1023의 아날로그 신호를 만들어 냅니다. 그러면 0~1023의 신호를 발생하는 부품을 찾으면 되겠죠. 가상시뮬레이터에서 0~1023의 신호를 발생하는 부품은 여러개가 있는데 그 대표적으로 조도센서가 있습니다. 가스센서를 이용해도 되고 가변저항기를 이용해도 됩니다. 0~1023의 아날로그 신호를 발생하는 부품이면 토양수분센서를 대신 할 가상부품으로 여기고 실험을 수행할 수 있습니다.


위 조도센서를 이용하여 토양수분센서의 역할을 수행 할 있습니다.

3) 실험 할 부품이 원리를 파악 후 대체 부품 만들기


실험에 사용 할 부품이 가상시뮬레이터에서 제공되지 않을 경우 해당 부품을 직접 만들 수 있습니다. 원리만 잘 이해하면 그 원리에 맞게 가싱시뮬레이터에서 디자인을 할 수 있습니다.

예를들면, 4-Digit 7-Segment Display는 가상시뮬레이터에서 제공되지 않습니다.


직접 만든다면 4-Digit 7-Segment Display의 원리를 데이터시트를 보고 파악을 해야 겠죠. 가상시뮬레이터로 대체 부품을 만들면 아래와 같습니다.


응용해서 추가로 만든다면은 다음과 같이 늘릴 수 도 있겠죠.


대체 부품을 만들기 위해서는 해당 부품의 데이터시트를 보고 동작 원리에 맞게 부품을 만들어야 하는 어려움이 있지만 어느정도 LED 원리를 터득하고 7-Segment Display를 터득했다면 복잡해 보일뿐 위 표현은 충분히 하실 수 있습니다. 다른 부품의 경우도 이와 유사합니다.

4) 실험 할 부품을 대체 부품을 못 구할 시 Serial 통신 이용


대체한 부품을 찾지 못하거나 부품을 만들 수 없을 때는 Serial 통신을 이용하여 가상 입력과 출력를 표현하는 방법입니다. 즉, 어떤 특정한 부품이 있을 때 부품의 읽는 값을 대신해서 시리얼통신에서 가상 데이터를 입력하고 그 값을 코딩 상에서 가상 데이터를 처리하고 그 결과를 대체 부품이 있으면 출력시키고 출력을 대체 할 부품이 없을 때는 시리얼모니터로 출력시켜서 부족한 부분을 Serial 통신으로 대체하면 됩니다.

예) 시간변환 예제

만약 대체 부품을 구했다면 아래의 post처럼 직접 만들어서 실험을 할 수 있겠죠.

이처럼 가상시뮬레이터에서 대체 할 부품이 있다면 그 부품으로 이용하고 대체 할 부품을 만들 수 있다면 직접 디자인하고 이것도 저것도 아니면 Serial 통신을 이용해서 가상데이터를 입력 받게 하고 출력도 Serial 모니터로 대신 동작하게 할 수 있습니다.

위에 열거한 방법들을 잘 기억해 놓고 아두이노 실험을 하시기 바랍니다.

2. 대체 부품을 이용 시 코딩에 중점을 두자


아두이노를 실험하는 것은 회로도를 만드는 것도 중요한 목적이지만 코딩에 더 집중 하셔야 합니다. 우리가 아두이노를 실험하는 큰 이유가 아두이노를 통해 어떤 특정한 동작 명령을 내려 그 동작을 수행하게 하기 위해서 입니다. 하드웨어에 명령을 내리기 위해서는 코딩을 해야 하고 이부분은 무척 중요합니다.

현재 실험에서 부품이 없더라도 유사 느낌으로 코딩상에서 동작을 제어할 수 있습니다.

지난시간의 자동토양물주기를 토양수분센서와 water pump가 없었지만 충분히 가상시뮬레이터에서 실험을 할 수 있었습니다. 대체 할 부품으로 조도센서와 DC모터를 사용하고 실제 자동토양물주기 동작 명령 코딩에 중점을 두고 실험을 했기 때문입니다. 이 실험은 코딩 상에서 조도센서의 값을 토양수분센서로 인식하고 DC모터를 water pump로 인식하고 코딩을 했고 그 처리 동작도 자동토양물주기의 동작명령을 코딩했기 때문에 실제 다른 부품을 사용했지만 정상적인 결과물을 얻을 수 있었습니다.

아두이노를 실험할 때는 실험 할 부품이 있으면 실감나게 실험을 할 수 있지만 없더라도 대체 부품으로 실험 목적의 맞는 내용으로 코딩을 하면 원하는 결과를 얻을 수 있기 때문에 아두이노 실험에서는 코딩이 역할이 무엇보다 중요합니다. 그래서, 틈틈히 코딩 연습을 해주세요.

아두이노는 부품없이 코딩만으로도 실험을 할 수 있습니다. 부품이 있으면 좋고 없으면 대체부품을 찾고 그것도 없다면 부품을 디자인하고 그게 힘들면 Serial 통신으로 대체하더라도 결과물을 얻을 수 있습니다. 뭔가를 실험하기 위해서 꼭 부품이 필요한 것이 아니니깐 코딩적 관점으로 실험을 하셔도 됩니다.

3. 시간 날 때마다 부품의 이해


부품은 각각 고유의 특징을 지니고 있습니다. 기울기 센서는 기울기에 따라서 0 or 1의 신호를 발생하고 조도센서는 빛의 영향으로 아날로그 신호가 발생하고 LED은 0 or 1의 전류 상태로 불이 on/off 상태가 되고 초음파센서는 전방에 장애물에 거리를 초음파로 벽에 부딛치고 되돌아오는 시간값으로 거리를 측정하고 스위치버턴은 스위치를 누르면 스위치버턴에 연결된 전류의 선이 이여지는 등의 새로운 부품들의 특징을 시간 날 때마다 원리를 머리속에 담아 두세요. 그래야 새로운 부품으로 실험을 해야 하는데 그 부품이 없는 경우에 그 부품의 특징과 기존에 공부한 부품과의 유사 부품으로 대체해서 원하는 실험을 할 수 있게 됩니다.

그리고, 전자부품 쇼핑몰에 가셔서 시간 날 때마다 어떤 부품들이 있는지 부품을 검색하세요. 그 부품의 동작 원리와 특징들을 알아 두셨으면 합니다. 그러면 특정 부품을 가지고 실험을 할 때 같이 연동할 부품을 상상하기 편하고 상상을 할 때 공부 해놓은 부품들이 많으면 다양한 상상설계에 도움이 됩니다.

부품 공부는 전자부품 쇼핑몰에서 찾은 부품을 다시 구글검색에서 해당 부품으로 실험한 자료들을 수집하거나 데이터시트를 검색하셔서 동작 원리를 공부해 주세요. 상상코딩에 무척중요한 부분입니다.

상상코딩의 예를 들면 영화나 애니메이션에서 SF 장면을 보면 제 경우 그 한 장면 장면들이 아두이노적 시각으로 상상을 할 수 있습니다. SF영화에서 특수 장갑을 끼고 VR 화면을 조정하거나 실제 로봇을 조정하는 장면이 있다면 이 부분을 아두이노로 표현한다면 어떻게 할까요. 다양한 방법이 있지만 간단하게 소개하면 구부림센서가 있습니다. 구부림의 각도에 따라서 로봇의 손을 움직일 수 있습니다. 그리고 VR화면을 조정할 수 있습니다. 아니면 근육신경센서를 이용해서 근육의 움직임센서값을 이용해서 로봇의 손을 움직일 수 있습니다. 뇌신경센서로 로봇을 조정할 수 있습니다. 이런것들을 상상하기 위해서는 여러분들이 다양한 많은 부품들을 알고 있어야 합니다. 각 부품들의 특징만이라도 알고 있으면 특정 부품을 공부하거나 상상 실험을 할 때 응용할 수 있는 상상력의 범위가 넓어집니다.

꼭 전자부품 쇼핑몰에 가셔서 특수 부품들을 살펴보시고 해당 부품의 데이터시트를 보시고 동작을 이해하는 공부를 꼭 해주세요. 상상은 그냥 되는게 아닙니다. 여러분들이 얼마나 많은 부품을 체험해 보았느냐에 따라 남들과 다른 상상을 할 수 있습니다.

마무리


오늘은 좀 두서없는 이야기를 한 것 같네요. 꼭 하고 싶은말은 특정 실험을 할 때 꼭 실제 부품이 필요하지 않습니다. 아두이노로 실험할 것들은 엄청 많습니다. 그 많은 실험을 하기 위해서 모든 부품을 다 사용할 수 없습니다. 왠만큼 실험하기 위해서는 금전적 부담이 크기 때문에 특수한 실험의 경우는 부품 하나의 가격이 만만치 않기 때문에 실험을 하기 부담 됩니다. 그럴 때는 꼭 부품을 구해서 실험을 할 필요는 없습니다. 그 부품을 대신 할 부품으로 원하는 동작을 수행하게 할 명령 코딩만 잘 짜시면 됩니다.

실험에 사용되는 부품을 대체 할 부품을 찾기, 대체 할 부품이 없을 때 비슷한 동작 부품 만들기, 부품 없을 때 Serial 통신으로 대체하기 등 이 세가지를 이용하여 아두이노로 다양한 실험을 하시고 많은 상상을 하셨으면 합니다.

댓글()

[아두이노] 자동토양물주기 원리

IOT/아두이노|2019. 7. 12. 22:07

[아두이노] 자동토양물주기 원리



지난 시간에 토양수분센서 측정기를 만들어 보았습니다. 오늘은 토양수분센서를 이용한 자동토양물주기 원리에 대해 살펴보고자 합니다. 실제 구현은 아래와 같은 모습이지만 모터펌프가 없고 DC모터로 간단히 동작을 실험하려고 했는데 차라리 가상시뮬레이터로 실험을 하여 post를 읽는 분들도 직접 실험에 참여할 수 있게 하는 방향으로 나가는게 좋을 것 같아서 간단히 가상시뮬레이터로 자동토양물주기 원리를 실험하는 것이 좋을 것 같아서 post의 방향을 변경했습니다.


위 그림처럼 디자인하고 제작했다면 좀 더 좋았을 텐데 준비물 화분과 워터펌프가 없어서 실제 구현은 못했네요.

오늘 post 실험은 자동토양물주기 원리를 이해하기인데 여기서 사용되는 부품은 조도센서와 DC모터입니다. 조도센서는 토양수분센서이고 DC모터는 모터펌프라는 가정하에 실험이 가상시뮬레이터에서 이루어 집니다. 실제로 가상시뮬레이터에서는 토양수분센서와 모터펌프를 제공하지 않기 때문에 조도센서와 DC모터를 통해 자동토양물주기 원리를 이해하는 시간이니깐 조도센서와 DC모터를 상상으로 토양수분선세와 모터펌프라고 머리속에 담아놓고 post를 보시기 바랍니다.

1. 자동토양물주기 회로도


  • 준비물 : LED 2개, 저항 200옴 2개, 저항 10k옴 1개, 조도센서, 릴레이모듈, 토양수분센서, 아두이노우노, 외부전원
  • 내용 : 아두이노우노 A0핀을 조도센서의 A0에 연결하고 LED를 각각 11,12핀에 연결한다. 그리고 릴레이모듈핀으로 7번에 연결한다.

아두이노 가상시뮬레이터에서는 토양수분센서를 제공하지 않습니다. 가상시뮬레이터에 실험하기 위해서는 대신 할 센서가 필요합니다. 실험에 사용할 센서는 조도센서입니다. 조도센서가 토양수분센서라는 가정하에서 가상으로 실험을 하기 때문에 감안하시고 글을 읽어주시기 바랍니다.


3. 코딩



LED, 조도센서, 릴레이모듈 등을 사용하기 위해서는 위 참고 자료를 한번 살펴보시 오시면 됩니다.

회로도의 기본 동작원리를 유사 post와 거의 90%이상 유사합니다. 차이점은 화분자동물주라는 코딩부분만 약간 차이가 있을 뿐 기본 베이스 코딩은 동일합니다. 아무튼 복습차원으로 이번 post를 공부하시기 바랍니다.

화분에 자동토양물주기를 가정하고 실험 코딩을 해보도록 하겠습니다.

[설계]

  1. 조도센서의 값의 따라 motor on/off 설정(조도센서을 토양수분센서로 가정)
  2. led를 이용하여 토양의 현재 상태를 시각적으로 표현
  3. 릴레이모듈을 이용하여 외부전원을 이용하여 motor를 회전(일반모터를 모터펌프로 가정)

설계는 3가지로 크게 나눠서 생각하게 되었습니다. 동작 원리는 가령 토양수분센서가 건조하여 수분이 없을 때 일정 센서의 일정 수치가 되면 모터펌프로 물을 공급을 하고 토양의 일정한 수분값을 갖게 되면 모터펌프를 중단하는 기본 동작이 코딩입니다. 이때 현재상태로 토양수분상태가 양호하면 Green LED가 켜지고 토양수분이 부족하면 Red LED에 불이 들어오게 하여 현재 상태를 시각적으로 보여주도록 하는 간단한 테스트입니다.

참고로, 모터는 릴레이모듈을 이용하여 motor의 외부전원을 사용하도록 하였습니다. 릴레이모듈은 스위치 역활을 하고 아두이노에서 스위치를 누르면 모터를 동작하고 해제하면 모터를 중단하는 느낌이라고 이해하시면 됩니다.

자~! 이제부터 설계할 3부분을 자세히 살펴 볼까요.

1) 조도센서의 값의 따라 motor on/off 설정


물을 자동으로 주기 위해서는 물을 주기위한 센서값에 도달했을 때 모터펌프로 화분에 물을 주도록 코딩해야 합니다. 어떻게 해야 할까요. 처음에는 정교한 코딩을 할 필요는 없습니다. 단순하게 생각하고 코딩하시면 됩니다.

m_cds = analogRead(cdsPin); //Sensor Read
if(m_cds>=물주기상태값){
  digitalWrite(motorPin, HIGH);
}else{
  digitalWrite(motorPin, LOW);
}

위와 같이 if문으로 간단히 코딩을 할 수 있습니다. 여기서, 조금 개선 시켜볼까요.

if(m_cds>=물주기상태값 && state==false){ //모터동작 체크
    state=true;
    digitalWrite(motorPin, state);
        timeVal=millis();
}else if(m_cds<=물중단상태값 && state==true){ //모터중지 체크
    if(millis()-timeVal>=2000){ //모터동작 최소유지시간 
      state=false;
      digitalWrite(motorPin, state);
    }           
}

위와 같이 timeVal(이전시간값)의 현재시간 millis()함수로 저장됩니다. 그 시간을 기준으로 모터가 최소 동작하는 시간을 2초로 잡았는데 이경우는 실제 실험에서는 적당한 시간을 잡아 주시면 됩니다. 가상 실험이니깐 대충 2초정도로 motor 동작하게 설정했습니다.

참고로, 모터동작이 시작되면 다음 loop()함수가 수행될 때 물공급 상태값과 물중단 상태값을 체크할 때 state를 조건문으로 추가했는데 이 조건문은 모터가 동작했을 때에 모터중단 동작을 수행하게 하기 위해서 추가한 조건문입니다. 물공급은 모터상태가 false(중지) 상태일 때 가동해야 하니깐 false인지 확인하고 물중단이면 state은 가동중단 해야하니깐 true인지 확인해야 합니다. 물공급/물중단 상태를 나타내는 토양수분센서값으로 비교하지만 같이 현재 Motor상태도 비교하면 중복 반복되는 동작을 줄일 수 있습니다.

2) led를 이용하여 토양의 현재 상태를 시각적으로 표현


센서의 값으로 모터를 동작을 제어했지만 시각적으로 현재 상태를 확인하기가 애매합니다. 그래서 LED 2개로 현재 토양상태를 표현해 봅시다.

[토양수분충분상태]

digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);

[토양수분부족상태]

digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW);

위 두가지 조건을 어디에 코딩해야 할까요.

if(m_cds>=물주기상태값 && state==false){ //모터동작 체크
  토양수분충분상태;
}else if(m_cds<=물중단상태값 && state==true){ //모터중지 체크
  토양수분부족상태;
}

위 코딩 위치에 위 상태 코딩을 넣으시면 됩니다.

3) 릴레이모듈을 이용하여 외부전원을 이용하여 motor를 회전


모터는 아두이노에서 전원으로 돌리는 것은 문제가 있습니다. 그래서 외부전원을 사용하여 motor를 동작시켜야 하는데 이경우는 여러가지 방법이 있습니다.

첫번째, 트랜지스터를 이용하여 motor를 동작시키는 방법

두번째, 모터쉴드를 이용하여 motor를 동작시키는 방법

세번째, 릴레이모듈을 이용하여 motor를 동작시키는 방법

세번째의 경우는 전구 대신에 motor로 교체하시면 됩니다. 릴레이모듈을 제어하기 위해서 릴레이핀의 상태값으로 motor를 제어하게 됩니다.

digitalWrite(motorPin, HIGH); //동작

digitalWrite(motorPin, LOW); //정지

릴레이 모듈이 좀 햇갈리시면 위 링크 걸어놓은 post에 가셔서 한번 원리를 이해하시고 오세요.

위 설계된 내용을 종합하여 코딩하면,

const byte cdsPin = A0;
const byte redPin = 12;
const byte greenPin = 11;
const byte motorPin = 7;

unsigned long timeVal = 0; //이전시간
unsigned long checkTime = 0;
boolean state = false; //모터상태값

int m_cds =0; //센서값 변수

void setup()
{
  Serial.begin(9600);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(motorPin, OUTPUT);
  
  //초기상태
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);
}

void loop()
{
  if(millis()-checkTime>=1000){ //1초단위로 센서읽기
    m_cds = analogRead(cdsPin); //Sensor Read
    Serial.println(m_cds);
    checkTime=millis();
  }
  
  if(m_cds>=960 && state==false){ //모터동작 체크
    state=true;
    digitalWrite(motorPin, state);
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW); 
    timeVal=millis();
  }else if(m_cds<=60 && state==true){ //모터중지 체크
    if(millis()-timeVal>=3000){ //모터동작 최소유지시간 
      state=false;
      digitalWrite(motorPin, state);
      digitalWrite(redPin, LOW);
      digitalWrite(greenPin, HIGH); 
    }
  }
}

센서값을 모터 동작값으로 960이상으로 가상으로 설정했고, 모터 중지값으로 60이하로 설정했습니다. 나머지는 위에 설명한 부분을 합쳐놓은 코딩이니깐 어렵지 않을거라 생각합니다.

4. 결과


조도센서를 토양수분센서로 가정했기 때문에 조도센서를 토양수분센서라고 상상하시고 동작을 이해해 주시기 바랍니다. 조도센서가 960이상이되면 Red LED에 불이 들어고 DC모터가 동작하게 하게 됩니다. 그리고 일정시간(3초)동안은 최소 동작하게 하고 조도센서값이 60이하이고 최소 동작시간이 지나게 되면 Green LED에 불이 들어오고 DC모터가 정지됩니다.

위 코딩에서 모터동작/정지에 사용되는 제어값 960과 60은 가정하에서 설정한거라 실제 토양에서의 수분값은 측정해보고 물주는 토양수분상태값을 정하시고 위 코딩에서 수정하시면 됩니다. 그리고 모터동작을 최소 3초동안 동작하게 했는데 이 경우도 토양에 물주는게 딱 3초로 할 수 없습니다. 실제로는 일정이상의 시간으로 물을 줘야하는데 water pump의 물을 끌어올리는 양을 기준으로 테스트해보고 이정도의 시간으로 물을 주면 되겠다 싶은 정도의 시간을 water pump로 실제 물을 주면서 시간을 측정해 놓고 위 코딩에서 시간값을 수정하시면 됩니다.

그리고, 위 코딩에서 센서값을 읽은 if문안에 나머지 모터동작 코딩을 넣으셔도 됩니다. 센서의 읽은 값을 기준으로 모터의 동작을 결정하게 되기 때문입니다. 외부로 뺀 이유는 따로 몇가지 추가할 경우 별도의 동작을 체크할 일을 감안하여 외부로 모터 동작 if문을 뺐놓은 것일뿐 여러분들은 안에서 넣을지 뺄지는 알아서 판단하시고 코딩을 배치하시면 됩니다.


5. 진짜 자동토양물주기 회로도




대충 지금까지 다뤘던 것들을 종합해서 회로도로 만들어 보았네요. 토양수분 측정기의 회로도에 추가로 bluetooth를 연결해 보았고 모터펌프는 이미지를 못찾아서 그냥 DC모터로 표현했네요. [아두이노] 토양수분 측정기의 회로도와 오늘 배웠던 회로도를 결합해 보았네요.

위 회로도는 토양수분센서 값을 따라 Motor를 동작을 제어를 기본으로 하는데 추가로, 토양수분센서의 값을 LCD16x2에 출력할 수 있고 현재 상태를 LED로 확인이 가능하고 Bluetooth로 스마트폰에 센서값을 출력이 가능합니다.

코딩은 오늘 배운 코딩과 토양수분측정기 코딩을 합치고 시리얼통신 코딩 부분을 bluetooth 통신 코딩형태로 변경하면 됩니다.

코딩부분은 post에 올리지 않겠습니다. 한번 오늘 배웠던 내용을 기반으로 LCD16x2 I2C모듈과 Bluetooth 모듈만 추가 되었으니깐 그 부분만 상상해서 코딩을 하시면 됩니다. 난이도를 살작 올렸습니다. 이번 post에서 회로도만 보시면 코딩을 상상할 수 있는지 보기 위해서 코딩부분은 생략했습니다. 각 부품이 주어질 때 이 부품은 어떻게 제어할 수 있는지와 이 부품에 어떤 출력을 할 것인지는 여러분들의 상상에 맡기겠습니다.

마무리


오늘은 가상시뮬레이터에서 조도센서를 이용하여 Motor 동작을 제어하는 실험을 하였습니다. 가상시뮬레이터로 실험한 이유는 여러분들도 한번 동작 원리를 체험을 해보셨으면 하는 맘으로 표현 했네요. 위 실험을 실제로 실험해 봐야 하는데 모터펌프가 없네요. DC모터로 대신해서 실험해도 되지만 RC카에 조립된 DC모터를 다시 분해해서 만들기가 좀 그래서 구현된 실제 모습은 없습니다. 실제 구현을 안하더라고 가상시뮬레이터로 충분히 의미를 전달할 수 있기 때문에 오늘 내용은 가상시뮬레이터로만 실험을 마무리 하겠습니다.

오늘 내용은 조도센서는 토양수분센서이고 DC Motor는 모터펌프라고 가정하에 실험한 post 입니다. 간단하게 동작 제어만을 실험한 것이라 추가로 좀더 상황을 만들어 업그레이드를 해야 좀 더 완벽한 자동토양물주기 시스템이 도비니다. 이부분은 여러분들의 상상력을 발휘하는 부분으로 남겨 놓겠습니다. 상상은 전류 공급문제, 자동토양물주기 모형틀, 추가 연동 할 부품 등을 여러분들이 상상해서 한번 업그레이드 시켜 보세요.


댓글()

[아두이노] 토양수분 측정기

IOT/아두이노|2019. 7. 9. 09:00

[아두이노] 토양수분 측정기



지난 시간에 토양수분센서 값을 간단히 출력하는 실험을 하였습니다. 오늘은 토양수분센서로 측정한 값을 어떤 출력방식을 상상할지 고민하다가 LCD16x2에 센서값을 출력하도록 하여 간단히 토양수분 측정기를 만들어보는 실험을 해 보겠습니다.


1. 토양수분 측정기 회로도


  • 준비물 : LCD16x2 I2C 모듈, 토양수분센서, 아두이노우노
  • 내용 : 아두이노우노 A0핀을 토양수분센서의 A0에 연결하고 LCD16x2 I2C 모듈에 SDA(A4), SCL(A5)핀에 연결하시오
  • 참고 : [아두이노] LCD16x2 I2C(LiquidCrystal_I2C) 제어

LCD16x2 I2C 모듈에서 I2C통신에 사용되는 아두이노우노 A4, A5핀에 주의해서 연결하시면 나머지는 연결하는데 어려움이 없습니다.


3. 코딩



[함수]

LiquidCrystal_I2C lcd(0x3F,16,2);  // 0x27 or 0x3F
  • 초기화 : lcd.init()
  • 배경 : lcd.backlight()
  • 커서위치 : lcd.setCursor(0, 0)
  • 출력 : lcd.print("문자열")

추가 함수는 참조 링크된 곳에 가셔서 "LiquidCrystal_I2C.h"파일에 가셔서 함수명들을 살펴보시기 바랍니다.

[기존소스]

void setup() {  
  Serial.begin(9600);
}
void loop() {
  int val = analogRead(A0);  //토양수분센서값 읽기
  Serial.println(val);
  delay(1000);
}

LCD16x2 I2C모듈에 결과를 출력하는 코딩을 추가하시면 됩니다.

종합해보면,

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F,16,2);  // 0x27 or 0x3F

void setup() {    
  lcd.init(); //초기화
  lcd.backlight(); //배경불켜기
  lcd.setCursor(0, 0);
  lcd.print("Sensor Start!");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Moisture Sensor");
  lcd.setCursor(0, 1);
  lcd.print("value : ");
}
void loop() {
  int val = analogRead(A0);   
  lcd.setCursor(9, 1);
  lcd.print(val);    
  delay(1000);
  lcd.setCursor(9, 1);
  lcd.print("    "); //센서값0~1023사이가 값이 출력되기 때문에 4칸을 공백처리하면 센서값만 지울 수 있음.
}

lcd.setCursor(0, 0)은 첫줄의 0번째 위치에 커서가 위치합니다. 이 함수 뒤에 lcd.print(값)함수로 출력함수를 표현하면 커서의 위치에서부터 값이 출력됩니다. lcd.setCursor(9, 1)함수는 두번째 줄의 9번째칸의 커서가 위치하고 그 9번째 칸부터 lcd.print(값)함수의 출력값이 LCD16x2에 출력됩니다.

혹시, LCD16x2 I2C모듈에 관한 위 코딩이 이해가 안되신다면 사전학습으로 링크 걸어놓은 post를 한번 읽고 오세요.

4. 결과


이번 실험에서도 토양에 직접 토양수분센서를 꼽지 않고 손에 물을 묻혀서 측정하는 방식을 선택했습니다. 그리고 PC USB로 전원을 공급 받았는데 외부 건전지를 이용해서 아두이노우노를 자유롭게 분리해 냈습니다. 이동식 토양수분측정기로 만들었는데 모양을 이쁘게 케이스로 만들었다면 손전등같은 형태로 측정기를 만들었을텐데 그러지는 못했네요.

아무튼 손으로 토양수분센서를 만지면 LCD16x2 I2C 모듈에 측정된 센서값이 아래 동영상에서 보는 것처럼 정상적으로 출력되었네요.


5. 추가 출력 방식


1) Bluetooth 응용


Bluetooth를 이용하여 스마트폰으로 토양수분센서를 출력할 수 있습니다.

위 링크된 조도센서값을 Bluetooth를 이용하여 스마트 폰에 센서값을 출력한 예제에서 토양수분센서 부분만 수정하면 됩니다.

스마트폰으로 토양수분센서값을 전송 받을 수 있게 된다면 많은 것들을 할 수 있습니다. 가령 화분에 토양수분센서가 꼽아져 있으면 화분에 수분상태를 실시간으로 스마트폰으로 확인이 가능합니다. 화분에 물주는 시기를 스마트폰으로 확인이 가능해 지겠죠. 그리고, 토양수분상태를 확인하고 물을 줘야 할 상황이면 자동으로 물을 줄 수 있으며 아니면 스마트폰으로 물주는 명령을 아두이노 수동으로 명령을 내릴 수 도 있습니다. Bluetooth 대신에 wifi모듈을 이용한다면 화분이 있는 위치에서 벗어난 외부에서도 화분 토양수분상태를 확인이 가능해지고 외부에서 화분에 물을 줄지를 원격으로 제어할 수 있습니다.

2) LED or 피에조부저 응용


위 링크된 LED와 피에조부저를 이용하면 토양의 현재 수분상태를 LED Color로 시각적으로 표현이 가능합니다. 그리고 피에조부저를 이용하면 수분상태를 소리로도 표현이 가능합니다. 어떻게 이용하느냐에 따라서 다양한 응용이 가능합니다.

마무리


오늘은 토양수분 측정기를 만들어 보았습니다. 측정기를 만들었지만 이 토양수분센서를 통신에 이용하면 더 많은 것들을 할 수 있습니다. 응용으로는 식물을 재배하는 곳에 설치하면 모터펌프를 이용해서 자동으로 토양에 물을 줄 어 식물재배에 이용할 수 있습니다. 또는 주기적으로 토양수분상태를 측정하게 되면 이 데이터로 토양의 수분상태의 정보를 수집하여 그 정보를 토대로 토양수분변화를 분석하는 통계 자료로 활용할 수 있습니다. 즉, 토양수분값을 어떤 방향으로 상상하느냐에 따라서 그 활용도는 넓습니다.

여러분들은 토양수분센서가 있다면 무엇을 하고 싶은지 상상의 나래를 펼쳐 보세요.


댓글()

[아두이노] 토양수분센서 제어

IOT/아두이노|2019. 7. 8. 09:00

[아두이노] 토양수분센서 제어



오늘은 토양수분센서를 이용한 실험을 할까 합니다. 토양수분센서는 흙 속의 수분의 상태를 측정 할 수 있는 센서인데 식물을 키울 때 유용하게 활용 할 수 있습니다. 즉, 흙 속의 수분 상태에 따라 식물에 물 주는 시기를 결정할 수 있기 때문에 적절할 시기에 자동으로 식물에 물을 줄 수 있게 됩니다. 주변의 흙의 수분 상태를 측정할 수 있는 측정기를 만드는 데 이 센서를 이용하면 좋겠죠.


이제 간단하게 토양수분센서를 실험을 합시다.

1. 토양수분센서


아래 사진처럼 두개의 부분으로 나뉩니다. 토양수분센서는 여러가지 종류가 있는데 하나로 된 일체형 센서가 있거나 아래와 같이 두개로 나눠진 형태의 선세거 있습니다. 제가 사용하는 토양수분센서는 아래 사진처럼 두개로 나누어져 있습니다.


첫번째 사진을 보시면 왼쪽의 +, - 부분이 있는데 두번째 사진의 실제 흙속에 수분을 탐지하는 센서 부분으로 핀이 두개 있는데 앞에 첫번재 사진의 모듈 부분에 +.- 부분을 순서없이 그냥 연결하시 됩니다.

첫번재 사진에 오른쪽에 A0(아날로그신호), D0(디지털신호), GND, VCC로 4개의 핀이 있는데 정교하게 수분상태를 측정할려면 A0(아날로신호)핀을 사용하면 됩니다. 두번째 탐지센서부분에 전류를 공급해서 수분에 따라서 전류의 신호값이 변화가 일어나는데 수분이 전혀 없다면 1023값이 되고 수분의 상태에 따라서 수치는 작아집니다.

수분에 따라 0~1023 사이의 신호를 발생하게 됩니다.(이부분만 기억하시면 됩니다.)

토양수분센서는 아날로그신호를 읽기 때문에 다음과 같이 읽으시면 됩니다.

analogRead(A0);

디지털신호를 읽기를 사용할 경우는 다음과 같겠죠.

digitalRead(D0);

2. 토양수분센서 회로도


  • 준비물 : 토양수분센서, 아두이노우노
  • 내용 : 아두이노우노의 A0핀을 토양수분센서의 A0핀에 연결하시오.
  • 이미지 출처 : FC-28 Soil Hygrometer Module : https://github.com/Teutatis/Fritzing-Parts
    • FC-28 Soil Hygrometer Module.fzpz
    • FC-28 Soil Hygrometer Module_-_Probe.fzpz

fritzing 이미지 찾느라고 고생했는데 겨우 찾아서 회로도 그림을 완성했네요.


토양수분센서 모듈의 A0핀을 아두이노우노 A0핀에 연결만 제대로 하시면 됩니다. 나머지는 Vcc, Gnd 핀은 해당 핀에 맞춰서 연결하시면 됩니다.

3. 코딩


간단히 토양수분센서를 통해서 수분값을 읽는 명령만 수행하는 코딩으로 실험합니다.

void setup() {  
  Serial.begin(9600);
}
void loop() {
  int val = analogRead(A0);  //토양수분센서값 읽기
  Serial.println(val);
  delay(1000);
}

analogRead()함수를 이용하여 토양수분센서의 값을 읽고 시리얼모니터로 토양수분센서의 값을 출력합니다.

4. 결과


실험은 토양에 직접 꼽아서 토양의 수분상태를 측정해야 하는데 적당한 흙이 없어서 그냥 손으로 물을 묻히고 수분을 측정해 보았습니다. 아래 동영상은 손이 흙이라고 가정하여 손에 묻은 수분 측정을 하는 실험 영상입니다.


마무리


오늘은 간단히 토양수분센서를 이용하여 수분을 측정하는 실험을 하였습니다. 부품을 몇개 더 추가해서 좀 더 그럴싸하게 만들어 실험을 해 볼까도 했지만 순수하게 토양수분센서에 대한 의미만 전달하는 것이 좋을 것 같아서 간단히 실험했네요.

토양수분센서를 analogRead(A0), digitalRead(D0)로 측정을 간단히 할 수 있게 되었으니 다음 post에서 부품을 어떤 것을 추가해서 좀 더 그럴싸하게 표현을 해보는 실험을 연구를 좀 해 봐야 겠네요. LCD16x2로 토양수분센서값을 출력시키는 토양수분측정기를 만들지 아니면 Bluetooth에 연결하여 스마트폰으로 토양수분센서값을 전달 받아 스마트폰에 제어권을 넘길지 고민을 좀 해야 봐겠네요. wifi 모듈이 있으면 좀 더 확장해서 라즈베리파이에 서버를 만들고 서로 통신하는 방법을 취하면 멋질 것 같은데 wifi 모듈이 없네요. 나중에 하나 장만을 해서 실험을 해봐야 겠네요.

아마도 복습차원으로 Bluetooth은 최근 주제에서 너무 많이 연동한 실험을 했기 때문에 LCD16x2로 토양수분센서값을 출력하는 측정기를 만들 것 같기는 한데 아직은 결정하지 않았고 결정되면 둘 중 하나를 선택해서 좀 더 개선된 실험을 해보도록 하겠습니다.


댓글()