Nixie tube test

닉시관(nixie tube)의 테스트를 진행했습니다.
아주 오랜 시간이 걸렸네요. 하지만 다행히도 잘 작동합니다.

조금 고민이 되는 것은 100kOhm저항을 걸어서 연결하면 글자가 절반밖에 나오지 않는다는 것입니다.
10kOhm을 걸어보니 글자가 잘 나오는 것으로 봐서는 전류량의 문제같은데 제 멀티미터는 180V에서 전류를 측정할 수 없기 때문에 답답합니다.

부스트 컨버터와 한계

닉시튜브를 이용한 환경 모니터를 만들려는 시도중, 승압회로를 만들다 한계에 봉착했습니다. 그래서 이런 저런 자료를 찾아보다 몇 가지 사실을 알게 되었습니다.

보통 DC-DC 승압회로로 사용하는 것이 Boost Converter(부스트 컨버터)인데요, 이 회로는 인덕터와 스위치(MOSFET)을 이용해 승압을 시키는 방식입니다. 일반적인 회로는 아래와 같습니다.

tumblr_inline_p64sb07xNm1vpz0g9_540

이 회로의 특징은 MOSFET을 켰다 꺼서(On/Off) 인덕터(L)를 충전했다 방전하여 조금씩 전압을 키워 승압시키는 방식이라 생각하시면 좋습니다.

이 방식의 한계에 대해서 알아본 결과 다음의 그래프를 얻을 수 있었습니다.

tumblr_inline_p64sgl93Ll1vpz0g9_540

부스트 컨버터의 승압 능력은 기본적으로 듀티 사이클의 영향을 받는다고 합니다. 다시 말해 듀티 사이클(작동 시간)이 길어지면 길어질 수록 승압의 배율(Vin에서 Vout의 배율)이 증가한다고 합니다. 이론상의 최대 승압 비율은 약 10배(x10)이며, 이 수치가 나오기 위해서는 듀티 사이클(Duty cycle)이 95%이상 나와야 한다고 합니다. 하지만… 저도 잘은 모르겠지만 이건 어디까지나 이론상의 수치라 실제로 부스트 컨버터를 이용한 승압 회로는 6배(x6)를 최대로 보고 있다고 합니다.
네… 이 이야기를 듣고 555타이머와 부스트 컨버터를 이용한 승압회로는 한계가 있음을 깨달았습니다. 오히려 9V를 넣어(Vin) 120V(Vout) 나온것만 해도 장하다고 생각하기로 했습니다.

역시 “교류는 승압도 간단해요!”라고 하셨던 무선통신 강사님의 말씀이 맞나 봅니다.

 References :

1. Determining the practical limit for boost factor in DC-DC voltage conversion

2. Working with Boost Converters

로봇 팔

로봇의 팔을 만들어보자

주의 : 손이 없음

주의 : 작업하다 그만둔문서입니다. 

로봇 팔을 만들어 보고 있습니다. 부제목과 같이 아직 손을 만들 생각은 전혀 없습니다.

(두둥! 그렇다면 팔이 왜 필요해)

…사실은… 손도 같이 만들어 보고 싶지만 팔에 비해서 어마어마하게 복잡하고 또 관절운동도 복잡해서 엄두를 못 내겠 더라구요. 그래서 팔만 만들어 보기로 했습니다.

1. 기본 도안

지난번 로봇을 만들다 포기했던 가장 큰 이유는 “내가 가지고 있는 부품에 딱 맞는 프레임(로봇의 껍질이나 골격등등)을 구하기가 너무나 어려웠기 때문입니다. 그래서 이번에는 직접 디자인을 해서 요즘 많은 관심을 받고 있는 3D 프린터로 직접 인쇄를 해보기로 했습니다. 3D프린터로 출력을 하려면 아래의 도구가 필요하겠지요.

  • 3D 프린터
  • 프린팅용 프로그램 (프린터에 같이 포함되어 있음)
  • 디자인 프로그램 (프린터에 같이 포함되어 있는 경우가 많음)

어차피 저는 3D프린터로 무언가 예쁘고 아름다운 조형물을 출력할 계획은 아니었기 때문에 가능한한 싼 물건을 사기로 했습니다. 제가 고른 것은 Anet A8 제품이고요.

……조립한 당일날 메인보드가 고장나서 모든걸 포기하곤 XYZ 프린팅의 제품을 구입했습니다. “과정에 불가한 3D프린터”에 너무 많은 노력을 하고 싶지 않았다고 할까요?

디자인 소프트웨어는 AutoDesk에서 무료로 공급하고 있는 TinkerCAD를 사용했습니다. 제품 고유의 프로그램을 쓸 수도 있지만 온라인으로 바로바로 작업이 가능해서 이것을 선택했습니다.

기본적인 형태 디자인은 아래와 같습니다.

 

upper
기본형태

한쪽 팔만 다시 보자면..

shoulder

  1. 몸통에 서보모터와 스테핑 모터를 고정시킵니다 (청색은 스테핑 모터)
  2. 커플러에 몸통 밖으로 나갈 축을 연결하고 몸통에 부착된 베어링으로 안정시킵니다
  3. 이 그림에서는 보이지 않지만 관절 역할을 할 유니버설 조인트를 이용해 팔과 잇습니다.
  4. 역시 그림에는 없지만 뼈대 역할을 할 막대와 유니버설 조인트로 전완부와 상완부를 연결합니다
  5. 마지막으로 와이어를 이용해 관절운동을 조절합니다

 

2. 좀 더 세부적인 문제들

여기까지 디자인 하면서 지인분과 많은 이야기를 나눴습니다. 전 기계공학적 머리가 0 상태인데다, 아무 생각이 없기 때문이죠. 지인분이 가장 문제로 삼은 것은 ‘동력전달’ 문제 입니다. 저는 금속 와이어를 사용해서 동력을 전달할 생각이었는데 지인분은 관절축(뼈대)에 모터를 직결하는게 어떤지 물어봤습니다. 사실 이런 방식으로 만들어 본 적이 한번 있지만 다시 한번 고민을 해봤습니다. 아래와 같은 문제가 있었습니다.

SE-A410_4
서보모터의 형태 (출처)
  • 내가 가지고 있는 모터는 대부분 서보모터이다
  • 어깨와 팔꿈치 관절, 그리고 조금 억지를 부리면 손목 관절까지도 구부림, 폄, 내회전, 외회전의 기능이 있다
  • 서보모터라도 이런 움직임을 구현하지 못하는 것은 아니지만 가장 큰 문제는 이런 움직임을 구현하기 위해서는 서보모터의 모터헤드에 움직이려는 관절의 축(뼈대)을 직접 연결해야 한다
  • 모터에 직결한 경우 아래쪽(원위부)의 전체 무게는 모터의 정지부하 또는 하중으로 작용한다
  • 와이어를 쓰던 축을 모터에 직결하던 정지부하가 안 걸리는 것은 아니지만, 모터에 축을 직결하면 손목에서 어깨 관절로 가면 갈 수록 모터는 더 많은 하중을 견뎌야 하고 이로인해 불필요한 전력 낭비가 발생한다
  • 또한 관절부에 모터를 위치시키면 아무리 토크가 높은 모터라고 하더라도 팔 자체의 기본 무게(프레임 + 각종 부품 + 원위부 관절에 달린 모터 무게)로 인해 실제 사용 가능한 토크는 줄어들게 된다
  • 대부분의 서보모터는 모터헤드가 모터의 가운데 위치하지 않기 때문에 설계가 극도로 어려워진다
  • 와이어를 이용하면 팔 전체에 모터의 무게를 제거할 수 있다
  • 모터를 몸통에 위치 시키면 무게 중심을 안정시킬 수 있다
  • 와이어를 안쪽과 바깥쪽에 각각 두 개씩 위치 시키면 비틀림을 구현할 수 있다
  • 와이어가 프레임에 직접적으로 닿는 것을 피하기 위해 추가적인 베어링과 축을 바꿀 부위가 필요하다
  • 와이어를 제어하는 모터의 제어 코딩이 더 복잡해지고, 몸통부에서의 설계가 복잡해진다
  • 모터 직결보다 좁은 범위에서의 관절운동만이 가능하다

뭐 이러한 이유로 인해 와이어를 선택한 것도 있지만, 안 해본 것이니 해보자는 생각으로도 시작을 해봤습니다.

3. 실제 디자인

아래의 사이트에서 직접 도면을 보실 수 있습니다.

  1. 팔의 아래쪽
  2. 팔의 위쪽

기본적으로 어떻게 움직이는지에 대해 많은 고민을 했습니다. 이건 고민을 하며 그려본 기본 개념도입니다.

arm
골격의 움직임 기본 개념(왼쪽이 손목)

관절은 3D프린터로 정밀하게 만들기 어려울 것 같고, 또 두 부위를 연결하기 위한 부품도 복잡해서 유니버설 조인트(Universal joint)라는 것을 이용하기로 했습니다.

arm joint
관절의 기본 컨셉
IMG_0502
관절의 축과 와이어를 지지할 지지대

관절의 형태는 지금까지 한번도 구상해본 적이 없어서 제 나름대로 디자인을 해봤습니다. 처음 생각에서 조금 차이가 생겼다고 한다면 근육이 되는 와이어를 골격에 붙일 수가 없어서 프레임에 봉(rod)을 달아 연결하기로 했습니다.

이런 저런 것들을 고려한 다음 다음의 형태로 두 개의 플라스틱 판을 만들어 결합시키기로 했습니다.

forearm_upper.png
팔의 위쪽 프레임
lower.png
팔의 아래쪽 프레임

이 두 가지를 3D프린터로 제작해서 결합시키면 제일 위의 그림처럼 연결이 됩니다. 물론 프린트 후 어느정도의 손질이 필요하겠지만요. 아무튼 이런 형태로 조립을 했을 때 로봇의 몸제는 아래의 그림처럼 될 것 같습니다.

concept02
몸통

그림에 갈색은 서보모터구요, 파란색은 스테핑 모터, 그리고 녹색은 아두이노 보드 입니다. 앞 뒤의 회색 부분은 껍질입니다. 네에.. 아무 기능도 없는 껍질입니다. 킁;;

concept01
몸통의 후측면

앞에서 잘 보이지 않지만, 앞쪽 서보모터 네 개는 가운데 붉은색 패널에 구멍을 뚫어 등쪽까지 나오게 했습니다. 그리고 뒤쪽 서보모터 두개는 패널에 수평으로 배치해서 가급적 어깨와 가까운 부위에 모터 헤드가 위치하도록 해봤습니다.

여기까지 디자인을 하고 나서 ‘알리 익스프레스‘에서 이것 저것 부품을 주문했습니다. 알리 익스프레스는 가격이 싼 대신 시간이 오래 걸려서 아마 다음달에나 조립을 시작하지 않을까 싶습니다. 필요한 부품으로 아래의 것들을 우선 주문했습니다.

4.  Bill Of Material (BOM, 자재 명세서)

  • 볼 베어링
  • 커플러
  • 유니버설 조인트
  • 4mm 카본 막대
  • 5mm 스테인레스 막대

5. 제작

3D 프린터가 도착해서 우선 프레임을 제작해 봤습니다. 유니버설 조인트와 카본 막대가 가장 중요한데 아직 도착을 안해서요. ㅠㅠ 대략 두 시간 정도가 걸렸고 아래와 같은 형태가 되었습니다.

2017-08-31 09.37.38

멀리서 보면 아름답기 그지 없지요..?

2017-08-31 09.37.58  2017-08-31 09.37.43

잘 보면 솔기 같은 것도 있고 불규칙한 부분도 있고 그렇습니다. 약간의 사포질은 필요하겠군요.

ㅡㅡ; 나머지 부분도 한번 출력을 해봐야 겠습니다. 반대쪽도 출력해 봤는데 디자인의 사이즈와 실제 출력 사이즈가 달라서 맞물리지가 않았습니다. 또한 가운데 봉을 지지대 없이 설계했더니 엉망이 되어버렸습니다.

2017-08-31 14.49.16
사진을 확대해 보면 거미줄 같은 것이 잔뜩 있습니다
2017-08-31 14.55.47
끼워 보면 끼워지지 않습니다

그런데… 만들다가 크나큰 문제를 하나 발견했습니다. 유니버설 조인트를 이용해 팔의 내회전/외회전을 구현하려고 했는데 그게 축이 조인트와 고정되어 버리면 불가능하겠더군요. 그걸 왜 지금까지 몰랐는지. ㅠㅠ 결국 이 문제를 해결하기 위해서 고민하다가 아주 굵은(?!) 뼈대를 만들기로 했습니다.

arm_shaft_cover.png
플라스틱 샤프트

3D프린터로 샤프트를 만드는 겁니다. 가운데 4mm 카본 막대가 들어갈 수 있는 공간을 만들었고, 양쪽 끝 부분에 볼베어링이 들어갈 수 있는 공간도 확보했습니다. 카본 막대는 통으로 쓰는 것이 아니라 절반 정도로 잘라서 위/아래에 각각 따로 끼울 겁니다. 그리고 그 카본 막대를 볼 베어링에 끼우면 플라스틱 샤프트와 카본막대가 따로 움직일 수 있기 때문에 내회전/외회전이 가능할 것으로 생각합니다. 양쪽에 있는 작은 네모 구멍은 와이어를 90° 간격으로 고정하기 위한 구멍입니다.

설계대로 출력을 해 봤는데 원하는 사이즈가 나오지 않아서 다시 조정을 한 후 출력을 했습니다.

2017-09-01 11.24.20
출력한 결과물

생각보다 오차가 심각해서 조금 더 수정을 해야 할 것 같습니다. 베어링이 제대로 안 들어가네요. 그리고… 몇 번의 시행착오 끝에 추가로 조금 변경했습니다. 와이어를 고정할 위치와, 와이어가 지나갈 구멍을 만들어 주었지요. 아래는 그 이미지입니다.

rev_shaft
수정한 샤프트

몇 차례의 리비전 후에 이런 모습이 되었습니다. 처음보다는 많이 복잡해 졌지요? 저도 만들다 보니 이렇게 복잡하다는 것을 알게 되었습니다. ㅎ

일단 안쪽에 베어링을 넣을 공간을 총 네 개 만들었습니다. 카본 샤프트의 흔들림을 막기 위해 각각 두 개의 베어링을 끼울 수 있도록 했구요, 와이어를 고정한 후 그 와이어가 샤프트의 방향을 따라 위치할 수 있도록 중간에 작은 걸쇠를 만들었습니다. 물론 이 부분은 추후에 바뀔 가능성이 높습니다. 아무래도 스텐레스보다 플라스틱은 경도가 약하기 때문에 부러질 수 있다는 생각이 들었거든요.

2017-09-04 17.25.24

어라.. 사진이 돌아갔네요. 왜 그러지…? 아무튼 베어링 위치는 잘 맞습니다.

2017-09-04 17.25.37

베어링도 잘 들어가 있습니다. 삐딱한 것은 고정을 안해서 그런 것이구요. ㅎ 일단은 이대로 만들어 볼 생각입니다.
이제.. 나머지 재료만 오면 되겠군요. 기다려야 겠습니다. 기다리면서 시간도 남고 해서 어깨 관절을 위한 플라스틱 프레임을 만들어 보기로 했습니다. 초기 디자인과 사뭇 다른 부분도 있지만 기본적인 개념은 아래와 같습니다.

2017-09-02 01.10.15
기본 개념

까만 동그라미는 와이어의 방향(벡터)가 바뀌는 부위입니다. 위쪽 그림을 보시면 이해가 되실 거구요, 몸통의 스테핑 모터를 기준으로 몇 번의 각이 바뀌며 와이어가 몸통에 이어지도록 했습니다. 측면도를 보시면 조금 더 이해가 쉬울지도 모르겠습니다.

2017-09-02 01.14.43
기본 개념. 측면도 포함

잘 보시면 아주 복잡한 각도로 벡터가 바뀌게 됩니다. 어쩔 수 없어요. 제가 머리가 나쁘니 더 좋은 방법을 찾아내질 못했습니다. ㅠㅠ

2017-09-03 10.26.12
모터의 위치

모터가 아주… 어마어마하게 붙어 있습니다. 가운데 정사각형은 스테핑 모터이구요, 나머지는 전부 서보모터 입니다.

2017-09-03 10.26.17
Pullley(도르레)를 이용한 결선도

지금 생각은 중간에 몇 군데 도르레를 위치 시켜서 와이어의 방향을 바꾸면 어떨까 생각해 보고 있습니다. 아직, 어떻게 구현할 지는 제대로 정하지 못했어요. 아무튼 여기까지 해 놓고 3D 디자인을 해 보았습니다.

shoulder_final
어깨 구동축. Pulley 없음

Pulley를 넣지 않았는데도 어마어마하게 복잡한 형태가 되었습니다. 좌우에 튀어나와 있는 곳은 전부 서보모터를 고정하기 위한 곳이구요, 가운데 정사각형 공간에는 커플링과 모터의 축이 위치할 공간입니다. 실제 서보모터는 뒤쪽에 위치하구요. 여기까지는 되었는데! 아직 도르레(Pulley)를 넣을 공간을 만들지 못했습니다. ㅠㅠ

 

크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.

아두이노 우노(Arduino UNO) 설계도

아두이노 기본 사이즈에 대한 설계도

로봇 만들기를 진행하면서 필요에 의해 찾은 자료입니다.

원본 출처는 여기 입니다. 개인적인 생각으로는 이 분도 이곳 저곳에서 검색을 통해 정리하신 것 같습니다.

1. Arduino UNO

arduino_uno_dims_lg.png

Screen-shot-2013-08-28-at-18.14.41.png

Arduino-Uno-Mega-Dimensions

arduino_uno_drawing_1000x703.png

2. Arduino Mega

arduino_mega_drawing_1000x528

3. Arduino Nano v3.0

arduino-nano-v30-atmega328-blue-4.jpg

arduino-nanomanual23-3-728

크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.

아두이노의 온습도 측정값을 MariaDB에 저장하기

읽기 전에:
전 아두이노는 초급 수준, 그리고 php를 조금 쓸 줄 알고, APM이나 LAMP를 설치하고 설정할 줄 압니다. 
비록 저도 초보적인 수준이지만 APM이나 LAMP가 무엇인지 전혀 모르시는 분은 걍 ‘아.. 이런 방법도 있구나..’하고 읽어주심이 좋을 것 같습니다. ^^

아두이노를 가지고 가장 흔하게 하는 연습이 LED켜기와, 버튼 누르기, 그리고 온도센서를 이용한 환경 측정일거라 생각합니다.
처음에는 시리얼 모니터에 쏟아져 나오는 결과값만 보고 있어도 흐믓한 마음에 어쩔줄을 모르죠.

(제가 그랬습니다) 근데 조금 만지작 거리다 보면 ‘이걸 어떻게 하면 컴퓨터에 저장할 수 있을까? 하는 생각이 듭니다. 왠지 기록하고 싶어지잖아요. ^^
그래서 이런 저런 자료를 찾아봤습니다.

1. 아두이노와 컴퓨터와의 통신

미리 말씀드리지만.. 전 전자공학이 전문인 사람은 아닙니다. 그리고 컴퓨터용 언어에 능통한 사람도 아니구요. 그래서 제가 아는 선에서만 설명할 예정입니다.

방법1 : Arduino MySQL Connector이용하기 (Arduino – DB 직접연결)

척 벨(Chuck Bell)이라는 분이 만든 아두이노 전용 MySQL 커넥터가 있습니다. 라이브러리 형태로 되어 있고요, 아두이노 IDE (Sketch)에서 적용해 사용하실 수 있습니다. 관련 예제는 github에서 찾아보실 수 있고요, 예제를 읽어보시면 사용법을 이해하실 수 있습니다.

단, 이 방법을 쓰기 위해서는 데이타베이스의 사용자 설정과 시스템 설정에서 외부에서의 직접 연결을 허용해 줘야 합니다. 전… Maria DB에서 이걸 실패해서 포기했어요.. ㅠㅠ

방법2 : Arduino – PHP – MariaDB로 연결하기 (간접 연결)

위의 방법1이 나오기 전에 가장 많이 사용한 방법인 것 같습니다. 구글링을 하다보면 php나 파이썬, 그리고 자바까지 이용해 데이타베이스에 저장하는 방법이 나옵니다. 방법1의 내용을 읽어보시면 적혀있지만 상당히 귀찮고 복잡하지만 딱히 좋은 방법이 없어 지금까지 계속 사용하는 방법 같습니다.

일단 APM이나 LAMP를 설치해야 하고, 웹페이지의 코드를 짜야하고, 데이타베이스도 만들고, 그런 다음에 아두이노 코드를 짜야 하니 일을 세 개나 해야한다는 단점이 있지요. ㅠㅠ  그리고, 제 경험이지만 에러가 뜨면 정말 찾기 어렵습니다. 아두이노, 아파치 서버, php코드, 데이타베이스 중 어디에서든 에러는 발생할 수 있고, 그걸 일일히 다 찾아야 하니까요.

 제가 이 방법을 사용한 것은 위의 방법1을 실패했기 때문입니다.

방법3 : 내가 모르는 여러가지 방법들

제가 잘 모르는.. FTDI라는걸 쓰는 방법도 있고, SD카드를 이용하는 방법도 있나 봅니다. 근데 전 모르겠어요. 나중에 쓰게 되면 알려드리죵…;;;

(전 무책임의 대명사 입니다)

2. 준비물

  • 아두이노 보드 (호환형이든, 정품이든 상관 없습니다)
  • 브래드 보드(빵판), 커넥터 케이블 몇 개
  • 작은 테스트 커넥터
  • 온습도 센서
  • Wifi 쉴드 (이제 안나오죠? ㅡㅡ;)
  • 온습도 센서 (ETH-01DV)

다른 건 다 쉽게 구할 수 있는데 Wifi 쉴드가 이제 품절이 되어서 문제가 있죠? 아두이노용 Yun 쉴드라는 것이 네트워크 연결기능이 있어서 가능할 것 같습니다. 아니면 호환 쉴드라도 상관은 없어요. ㅎㅎ

그리고 온습도 센서는 아날로그 출력용을 선택했습니다. 가격은 좀 비싸긴 하지만 온도와 습도를 모두 출력할 수 있는 제품이라 전 이게 좋더라구요. 그리고 I2C 출력 제품은 쉴드 사용시 문제가 될 수 있어서 (사실은 사용법을 익히지 않았어요. 나란 놈은.. ㅠㅠ ) 안 썼습니다.

3. 보드 구성

뭐… 회로도를 보여드릴 것도 없이 단순하고 창피하지만, 그래도 조금 그려봤습니다.;;;

아참, 회로도에 적혀있는 모델명은 신경쓰지 마셔요. Fritzing에 있는거 아무거나 사용했습니다.;;

선택 영역_001.png

다 만들면 대충 이런 모양이 됩니다.

2016-09-18 21.08.55   2016-09-18 21.09.03.jpg

뭐.. 비웃음이 나오겠지만 그래도 이쁘게 보아주시고, 이제 본격적으로 코딩에 들어가 볼까요?

4. 데이타베이스 설정

저는 데이타베이스는 ᅟarduino_db라는 이름으로 만들었어요. 앞으로 이것 저것 데이타들을 이곳에 적재해 보려구요. 아무튼 데이타베이스를 만든 후 아래의 테이블을 하나 만듭니다.

내용을 보시면 아시겠지만 rowid라는 고유번호가 있고, 기록 날짜와 시간(타임스탬프)는 자동으로 찍히도록 했어요. 그리고 나머지 측정갑은 모두 소수점 둘째자리까지 기록하도록 했습니다.


CREATE TABLE temp_rec ( 

rowid int NOT NULL AUTO_INCREMENT,

rec_datetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

humidity decimal(5,2) DEFAULT NULL,

centigrade decimal(5,2) DEFAULT NULL,

farenheit decimal(5,2) DEFAULT NULL,

PRIMARY KEY ('rowid')

) ENGINE = InnoDB DEFAULT CHARSET = utf8;

여기까지 끝났으면 사용자를 하나 만들어서 이 데이타베이스에 권한을 부여합니다. 아래는 사용자를 생성하는 코드이고, 그 다음은 사용자에게 해당 데이타베이스의 권한을 부여하는 코드입니다.


mysql -u root -p //MariaDB의 관리자 계정으로 접속

use mysql; //DB관리 데이타베이스 접속

CREATE USER '아이디'@'localhost' identified by '비밀번호';  //아이디와 비밀번호 생성. 어차피 php는 로컬접속이라 이렇게 설정합니다. 

GRANT ALL PRIVILEGES ON arduino_db.* TO '아이디'@'localhost';  //아이디에게 arduino_db의 모든 권한을 할당합니다. 

FLUSH PRIVILEGES; //설정 적용 

여기까지 하고 방금 생성한 아이디로 mysql에 접속해 봅니다. (mysql -u 아이디 -p ) 제대로 접속이 되고 해당 데이타베이스를 이용할 수 있으면 DB설정은 다 끝난 겁니다.

5. PHP 코딩

아주 단순하게 짜기로 했습니다. 보통의 경우 php파일 중 데이타베이스 접속용 파일은 따로 만드는데요, 이건 그런것도 없습니다. 걍 한 파일에 다 때려 넣었습니다.;;;


     
mysqli_set_charset($db, "utf8");


     
if (mysqli_connect_errno()){ 

echo "ERROR: 데이타베이스에 연결할 수 없습니다.";

exit;

}

$hum = $_GET["hum"];

$temp = $_GET["temp"];

$ftemp = $_GET["ftemp"];



$query = "INSERT INTO temp_rec (humidity, centigrade, farenheit) VALUES ('".

$hum."', '"

.$temp."', '"

.$ftemp."')";





$result = mysqli_query($db, $query);



if ($result) {

echo $db->affected_rows." data inserted into databases.";

}else{

echo "ERROR: 자료가 추가되지 않았습니다.";

}

mysqli_free_result($result);

mysqli_close($db);

?> 

코드를 보시면 에러메시지를 보여주는 항목이 있는데 다 덧없는 짓입니다…;; 그냥 제가 너무 게을러서, 전에 쓰던 코드를 재사용해서 그런 것이구요, 사실은 우리가 이 프로그램이 돌아가는 과정에 발생하는 문제를 컴퓨터 화면이나 아두에노에서 볼 방법은 거의 없습니다.

어쨌든..  이제 거의 다 끝났습니다.

6. 아두이노 스케치 코드

아두이노의 스케치 코드는 아래와 같습니다.


#include 
#include  //왜 쓰는지 모르는데 남들이 쓰길래 따라 써봤음

char ssid[] = "네트워크SSID";     //  your network SSID (name)
char pass[] = "네트워크 암호";    // your network password
int status = WL_IDLE_STATUS;     // the Wifi radio's status
WiFiClient client;
char server[] = "서버의 IP주소";

const int HumPin = A0;
const int TempPin = A2;


void setup() {
  Serial.begin(115200);

  // attempt to connect using WPA2 encryption:
  Serial.println("Attempting to connect to WPA2 network...");
  status = WiFi.begin(ssid, pass);

  // if you're not connected, stop here:
  if ( status != WL_CONNECTED) {
    Serial.println("Couldn't get a wifi connection");
    while (true);
  }
  // if you are connected, print out info about the connection:
  else {
    Serial.println("Connected to network");
    IPAddress ip = WiFi.localIP();
    Serial.print("IP address is : ");
    Serial.println(ip);
    Serial.println("");
  }
}


void loop() {
  int HumVal = analogRead(HumPin);
  int TempVal = analogRead(TempPin);

  float HumVoltage = (HumVal / 1024.0) * 5.0;
  float TempVoltage = (TempVal / 1024.0) * 5.0;

  float Hum = -12.5 + (125 * (HumVoltage / 5.0));
  float Temp = -66.875 + (218.75 * (TempVoltage / 5.0));
  float FTemp = -88.375 + (393.75 * (TempVoltage / 5.0));

  char CharHum[5];
  char CharTemp[5];
  char CharFTemp[5];

  dtostrf(Hum, 5, 2, CharHum);
  dtostrf(Temp, 5, 2, CharTemp);
  dtostrf(FTemp, 5, 2, CharFTemp);

  if(client.connect(server,80)){
    Serial.println("Connected...");
    client.print("GET /temp_rec.php?");
    client.print("hum=");
    client.print(Hum);
    client.print("&&");
    client.print("temp=");
    client.print(Temp);
    client.print("&&");
    client.print("ftemp=");
    client.print(FTemp);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
    client.println();
    Serial.println("Transfer terminated");
    delay(2000);
  }else{
    delay(1000);
    Serial.println("Connection failed");
    delay(2000);
  }
  delay(1000);
  client.stop();

  delay(2000);

  Serial.print("Temperature (C) is : ");
  Serial.println(CharTemp);
  Serial.print("Temperature (F) is : ");
  Serial.println(CharFTemp);
  Serial.print("Humidity (%) is : ");
  Serial.println(CharHum);
  Serial.println("");
  
  delay(55000);  
}

앞 부분은 아두이노 와이파이 쉴드의 기본 레퍼런스를 참조 했구요, 그대로 옮겨다 붙인 겁니다. 전 개인적으로 보안을 신경쓰다 보니 WPA2를 쓰는지라 그 예시를 참조했어요.

일단 시스템이 켜지면 와이파이 쉴드를 통해 공유기(게이트웨이)에 연결이 됩니다.  연결이 완료되면 온습도 센서(A0, A2)의 결과값을 받아서 전압값으로 변환해 줍니다. 그리고 이 전압값을 다시 센서의 제품 설명서에 나와있는 변환 공식에 따라 검침값으로 변환합니다.

변환 공식은 아래와 같습니다.

sepc
이렇게 변환된 실수값을 다시 char 타입으로 변환하고 서버와의 통신을 통해 php에 GET으로 넘겨줍니다. 코드를 보시면 조금 의아할 수 있는데요, 반드시 “GET /temp_rec.php?”형태라든가, ” HTTP/1.1″, 그리고 “Connection: close”의 빈칸까지 동일하게 써야 하는 것 같습니

다. 사실 저도 컴퓨터에서 컴퓨터로의 연결은 아는게 없어서 이 부분에서 3일을 고생했습니다. 다른 사람들이 만들어 놓은 모든 코드를 다 시도해 봤구요, 제 결론은 위의 코드는 제대로 작동한다는 것입니다.
일단 정상 작동하는지 시리얼 모니터에서 확인한 후 데이타베이스에서도 같이 확인해 봅니다. 데이타베이스까지 자료가 제대로 전달되었다면 성공한 겁니다!

스크린샷, 2016-09-18 20-50-46

7. 이런 저런 것들

일단 ‘매우 단순한 아두이노 회로 설계’에 비해 ‘더럽게 어렵고 복잡한’ 네트워크 – php – mariaDB의 연결이 이 프로젝트의 핵심입니다. 센서를 이용한 데이타 수집 자체는 제 글을 보지 않으셔도 얼마든지 하실 수 있는 수준이니까요. 그런데 직접 해보시면 알겠지만 여러 부분에서 문제가 발생할 수 있습니다.

  • 아두이노 회로 설계 에러
  • 아두이노 코딩 에러
  • 공유기의 에러(IP 못 받음, 네트워크 접속 실패)
  • Apache2와 php의 에러 (/var/log/apache2/error.log에서 확인하세요)
  • 데이타베이스의 에러 (사용자 권한이나 포트의 문제)

이 프로젝트를 하시면서 고려하셔야 하는 것은 위의 내용이구요, 만약 제대로 작동을 안한다고 느끼시면 각 부분에 문제가 없는지 한 단계, 한 단계씩 다 확인하며 고쳐야 합니다. 특히 error.log에서 나오는 은 웹 서버에서 아예 막아버리는 것이므로 코드를 잘 살펴보시고 고쳐야 합니다.

저야 오픈소스 신봉자(공짜를 밝힘)니까 마리아 DB(Maria DB)를 사용하고 있지만, 설치 후 소켓 문제로 처음에 신경쓸 것이 많습니다. 그래서… 만약 DB에 대해 많이 알고싶지 않으시다면 MySQL을 추천해요. ㅠㅠ

 

크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

IRF-540을 이용한 햄스터 온풍기

제가 자주가는 ‘재미있는 전자공작소’에 올렸던 햄스터 온풍기 입니다.

여기서도 변명을 풀어보자면.. 햄스터가 생각보다 활동가능한 온도가 제한적이라는 사실을 발견했지요. 그래서 겨울에도 햄스터가 따뜻하고 신선한 공기를 제공받을 수 있도록 120mm 팬과 발열소자를 사용해 온풍기를 만들기로 했습니다.

냉각용으로 사용하는 120mm팬들이 소리가 좀 커서.. 지난번에 펠티어 냉풍기를 만들때 썼던 Kraft팬을 사용했습니다. PWM으로 팬의 회전속도를 조절하는 능력이 있으면 좋겠지만.. 불행이도 그렇지가 않아서 조용하고 저속회전을 보여주는 이 팬이 좋더군요. (냉각 목적이 아니니까요)

255156_550

그리고… 발열 모듈은 이것을 사용했습니다. 사진을 보시믄 알겠지만 납작한 판때기처럼 생겼는데 AC든 DC든 전기만 가하면 240도까지 발열하는 재미있는 제품입니다. 실제 내부구조가 조금 궁금하긴 하지만.. 아무튼 그렇습니다. ㅎㅎ

032016008000000030

사실… 이 부품 두개가 전부지요.;;; 이것 말고 꼭 필요한 제품이라고 한다면..
MOSFET일겁니다. 전 IRF540을 사용했어요. 쉽게 설명하면 MOSFET이란 전압을 걸어주면 전류가 흐를 수 있도록 스위치를 올려주는 회로라고 생각하시면 되요. 다리두.. 달랑 세개 달려 있어 Gate, Drain, Source이렇게 세군데를 이어주면 작동하게 됩니다. 저같은 경우 펠티어 냉풍기를 만들때 사용할 목적으로 구입하다보니 상온에서 25A까지 흐를 수 있는 대용량을 쓰게되었습니다. 하지만… 폴리스위치가 4A까지 용인하다보니 큰 의미가 없어졌지요. ^^;
사실 폴리스위치가 햄스터 온풍기에서 하는 역할이라고 한다면… 효율을 떨어뜨리는 것 말고는 없습니다. 훨씬 고출력으로 발열모듈을 사용할 수 있는데 일정 출력이상 작동할 수 없게 만드니까요. 그럼에도 불구하고 제가 폴리스위치를 사용한 것은 아무래도 화재의 위험성때문일겁니다. 발열모듈이라니..;; 무섭거든요. ㅎㅎ;

어쨌거나 저쨌거나 기판을 얼렁뚱땅 조립했습니다.

2014-09-23 14.10.17.jpg

아두이노의 2파이 잭에도 전원을 공급받을 수 있게 했구요, 오른쪽 위에 보이는 6핀 PCIe 커넥터로 전원공급을 받게 했습니다. 그리고… 오른쪽 아래에 있는 두개의 거대한 커패시터. 이건 쿨링팬을 위한 겁니다(의외였죠?). 이것도 안전을위한 저만의 고민이었는데요, 고온으로 발열모듈이 작동하다 갑자기 쿨링팬이 꺼져버리면 위험할 것 같아서요. 그래서 쿨링팬에 2200uF의 커패시터를 써서 전원이 꺼져도 약간의 시간차를 두고 멈추게 했습니다.

2014-09-23 21.43.16

이건 아까보신 발열모듈입니다. 발열모듈에 40x40mm 히트싱크 두개를 앞뒤로 붙이고 간극은 전부 써멀 그리스로 매꿨습니다. 그리고… 와이어로 다시 고정을 했지요. 열을 뿜어내는 발열체다 보니 조금 무섭기도 해서 공중에 매달아 두고 쿨링팬으로 이 발열체에 바람을 불어주기로 했습니다.

2014-09-23 22.16.09

이건 온습도 센서입니다. 엘레파츠에서 특가로 팔때 잽싸게 샀지요. ㅎㅎ 기본적으로 이 온습도 센서의 온도 데이터를 이용해 발열모듈과 팬을 작동시키기로 했습니다.

회로가 복잡하지도 않고… 머리가 좋지도 않아 뚝딱뚝딱 금방 만들었습니다 ㅎㅎ;

2014-09-25 00.22.27.jpg

MDF라고 파티클보드 비슷한 나무판에 올려놨습니다. 생각보다 이 나무판에 구멍내는데에 더 오랜시간이 걸렸던 같습니다. ㅎㅎ

약간의 코딩을 하고나니 별 문제없이 작동을 시작했습니다. ㅎㅎ

2014-09-25 00.22.27-1

사진이 뿌연것은… 햄스터들이 살고있는 리빙박스가 반투명이라..;;
아무튼 사진에 보시면 왼쪽 위에 작은 온습도센서를 걸어놨고요… 팬의 아래쪽에 발열모듈이 대롱대롱 달려있습니다. 음.. 원래 두개를 달 생각이었는데 히트싱크가 모자라 하나는 아직 못 달았어요. ㅎㅎ;;;
원래는 작동상태를 알아보기 쉽게 LED를 몇개 더 달아서 현재 온도와 발열모듈의 작동여부를 알수있도록 할까 생각했었는데…. ‘귀찮아서’ 걍 시리얼 출력으로 알 수 있게 만들었습니다. 물론 LED에 대한 욕구를 참지 못해 디지털 13번 핀을 이용해 아두이노 기판에서 발열모듈의 작동여부는 알수있게 만들었어요. ㅎㅎ;
이건 시리얼모니터에서 보여주는 현재 측정값입니다.

RetrievingData

가운데 것을 잘 보시면 총 네가지 데이터가 나오는데요, Temperature는 온습도 센서에서 출력되는 값입니다. 28.1도라… 좀 이상하죠? 아무튼. 두번째 RH%는 상대습도 입니다. 현재 56.7%라네요. 그리고 TMP Temperature는 아까 이야기 하지 않았는데 TMP36GZ에서 나오는 값입니다. 이 제품은 온도가 어떻게 나오는지 궁금해서 추가로 달아봤는데 마지막에 보여주듯이 2.8도 정도 센서끼리 차이가 납니다. ㅠㅠ

아무튼… 뭐든지 적당히 넘어가는 곰닥터이므로… 그냥 살기로 했습니다. ㅋ
조금 웅웅거리는 소리가 나서 걱정이긴 하지만 어쨌든 햄스터들이 겨울에 춥지는 않을것 같아요.

아참… 데이터 쉬트는 아래와 같습니다.

1. 발열모듈 :     HP05-1/22-24
2. MOSFET :    IRF-540
3. 온습도센서 : HT-01DV

마지막으로 말씀드리고 싶은건, 여기까지 제가 만든것은 ‘그냥 재미로’한 것입니다. 온라인쇼핑몰 가시믄 만 이삼천원에 애완동물용 온돌방석을 팔고 있어요. ㅋ 그냥 그거 사세요. ^^;
크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

아두이노와 통신하기

자아 이제 Arduino IDE를 설치했으면 컴퓨터로 아두이노 보드와 통신이 가능합니다. 작동여부를 보기 위해 프로그램을 업로드할 시간이에요!

1. 아두이노 응응프로그램을 더블클릭해서 소프트웨어를 실행시킵니다. 만약 프로그램의 언어 설정이  이상하면 응용프로그램 설정부분에서 언어를 변경해 줍니다.
다국어 지원에 대한 자세한 설명은 arduino.cc/ide 에서 찾을 수 있어요.

2. 스케치 – 아두이노 프로그램을 스케치라고 불러요 – 에서 LED Blink 예시를 선택하세요.

LED Blink예시는 FILE > EXAMPLES > 01. BASICS > BLINK 에 있어요.

img004

3. 아참, 제대로 작동하게 하기위해서는 여러분이 사용하고 있는 보드를 미리 선택해 주셔야
해요.
 TOOLS > BOARD

img0041

4. 아두이노가 연결되어 있는 직렬포트를 선택해줘야 해요.
TOOLS > SERIAL PORT

– Windows : 보통 가장 큰 숫자의 COM포트에 아두이노가 연결되어 있어요. 물론 잘못
선택해도 문제가 생기진 않아요. 단지 에러가 뜰 것이고 그럼 다음 번호를 선택해 보면
되지요.
– Mac : /dev/tty.usbmodem 안에 있을거에요. 보통 두개중에 하나니까 아무꺼나 하나를
선택해보고 안되면 다른걸 해보면 되요.

5. Arduino IDE에서 Blink 예시에 관한 스케치를 업로드할 시간이 되었네요. 스케치의
왼쪽 위에 두번째 버튼(UPLOAD)를 눌러 아두이노로 스케치 파일을 업로드 하세요.

img0042

6. 업로드 버튼을 누르면 아두이노 프로그램의 하단에 진행상태가 보여집니다. 우선 컴파일
한다는 말이 나오고 그 다음에 업로드한다고 메시지가 보이지요. 업로드를 시작하면
아두이노 보드에 TX/RX LED가 반짝반짝 거리는 것을 볼 수 있어요. 업로드가 문제없이
끝났다면 DONE UPLOADING이라는 메시지가 스케치에 보일거에요.

7. 업로드가 끝나고 몇초가 지나면 TX/RX위에 L이라고 적혀있는 노란색 LED가 깜박이는
것을 볼 수 있을거에요. 단순해 보이지만….. 성공적으로 아두이노 보드에 프로그램을
업로드 한거에요!

L_LED

기본적으로 이 LED Blink예시는 코딩이 다 되어있지만, 여러분이 delay(100)이런 식으로 적혀있는 코드를 바꿈으로써 깜박이는 시간을 얼마든지 조절해 볼 수 있어요. 아직 처음이니까 이정도만 바꿔도 신기한 경험을 해볼 수 있답니다.
오늘은 여기까지 할까요? 아두이노 프로젝트북을 번역하면서 스캔하고 설명 붙이자니 멍청한 저로선 가랭이가 찢어지는 기분이에요. ㅠㅠ
그렇지만… 계속 따라가다 보면 점점 내가 원하는 전자장비를 만들 수 있다는 자신감을 가질 수 있으니 천천히 따라해보길 바래요. ^^)b

다음 챕터는 ‘여러분의 도구에 대해 이해하기’입니다.

 

 

크리에이티브 커먼즈 라이선스

Arduino Projects Book은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
arduino LCC의 저작물에 기반