레이블이 DIY인 게시물을 표시합니다. 모든 게시물 표시
레이블이 DIY인 게시물을 표시합니다. 모든 게시물 표시

2015년 12월 16일 수요일

Amazon Dash Button을 다른 용도로 사용하기

 아마존에서 판매하고 있는 Dash button을 구해 보았다. 이 버튼은 버튼에 특정 제품을 등록해 놓으면 버튼을 누르는 것 만으로 아마존으로 자동으로 주문이 되도록 되어 있어 화장지, 면도크림, 기저귀 등 반복적으로 주문해야 하는 제품을 매우 손쉽게 주문할 수 있도록 해 준다.

아마존 prime member면 개당 $4.99에 구입할 수 있다. (이 정도 가격이면 거의 하드웨어 가격 그대로거나 약간의 손해를 보고 판매하는 수준이라고 본다. 아마존의 킨들과 마찬가지로 비지니스 모델이 하드웨어는 손해를 보고 팔아도 그를 통해 아마존에서 반복적인 주문을 하도록 하는게 목적이기 때문)





이 버튼은 무선랜을 사용해서 통신을 하는데 인터넷을 검색해 보니 Ted Benson이라는 사람이 이 버튼을 해킹(?)해 다른 용도로 사용하는 방법을 소개해 놓았다. (How I hacked Amazon's $5 WiFi button to track baby data)

간단하게 설명하자면 버튼이 눌려도 주문하지 않도록 하고, 버튼의 ARP 패킷을 검출해 버튼이 눌린걸 알아내는 것이다. Ted는 2개의 dash 버튼을 사용해 하나는 아기가 똥을 쌌을 때 누르고, 다른 하나는 잠에서 깨었을 때 눌러 각각이 눌린 시간이 구글 스프레드쉬트에 자동으로 기록되도록 만들어 놓았다.

원 글에서는 python과 scapy를 사용해서 프로그램을 만들었는데 scapy는 설치하기가 까다롭고 이번에 필요한 것 이상의 기능을 가지고 있다보니 좀 무거운 느낌이 든다. 그래서 Bob Steinbeiser가 만든 python 코드를 수정해 보았다.

Dash 버튼을 사용하려면 먼저 설정을 해 줘야 한다.

스마트폰에서 Amazon 앱을 실행한다.


앱 좌측 상단의 메뉴 버튼을 클릭한다.


메뉴에서 Your Account를 선택한다.


화면을 아래로 내려 Dash Devices 에서 'Set up a new device'를 선택한다.



기본적으로 화면에 그림으로 잘 설명되어 있으므로 그대로 따라하면 된다.



자신이 현재 연결되어 있는 공유기의 SSID와 암호를 넣어준다. 


 이 단계에서 Dash button의  버튼 바로 위의 LED가 파란색으로 깜빡일 때 까지 흰색 버튼을 누르고 있는다.


 Dash button은 무선네트웍 정보(SSID, 암호)를 전달받기 위해 초음파를 사용하고 있다.위의 그림처럼 폰의 스피커와 Dash button의 마이크(흰색 버튼 반대쪽의 조그마한 구멍)을 가까이 가져다 대고 'Connect' 버튼을 누른다. 잠시 기다리면 깜빡이던 파란색 불빛이 켜져 있게 된다. 그러면 정상적으로 정보가 전달된 것이다.


마지막 단계로 Dash button에 특정 상품을 등록하는 단계인데 여기서는 이 단계에서 우측상단에 있는 'X' 버튼을 눌러 상품을 등록하지 않아야 한다. (여기서 상품을 등록해 놓으면 버튼을 누를 때 마다 해당 상품이 자동주문됨)

이제 버튼이 눌린걸 감지하기 위한 코드를 실행하면 된다. 여기서는 Raspberry Pi를 사용했다.

코드는 아래와 같다.

$ cat dash-socktest.py
import socket
import struct
import binascii





rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))


while True:
    packet = rawSocket.recvfrom(2048)

    ethernet_header = packet[0][0:14]
    ethernet_detailed = struct.unpack("!6s6s2s", ethernet_header)

    arp_header = packet[0][14:42]
    arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header)

    # skip non-ARP packets
    ethertype = ethernet_detailed[2]
    if ethertype != '\x08\x06':
        continue

    src_mac = binascii.hexlify(arp_detailed[5])
    dst_mac = binascii.hexlify(arp_detailed[7])
    src_ip = socket.inet_ntoa(arp_detailed[6])
    dst_ip = socket.inet_ntoa(arp_detailed[8])

    # print source_mac

    if src_mac == '001122334455' and dst_ip != '192.168.0.1':
        print "Tide button pressed!"
        print    "SrcIP = " + src_ip + ", SrcMAC = " + src_mac + \
                    ", DstIP = " + dst_ip + ", DstMAC = " + dst_mac


$

위에서 빨간색 001122334455 부분은 자신의 Dash button의 MAC address로 바꿔준다.

위의 코드를 실행할 때는 sudo로 실행시켜 줘야 한다.

$ sudo python dash-socktest.py
Tide button pressed!
SrcIP = 0.0.0.0, SrcMAC = 001122334455, DstIP = 192.168.0.20, DstMAC = 000000000000

위와 같이 버튼이 눌릴 때 마다 버튼의 정보를 출력해 준다.
코드를 백그라운드에서 실행하려면 다음과 같이 하면 된다.

$ (sudo python dash-socktest.py &)
$

위의 코드는 단순히 버튼이 눌리면 그 정보를 출력하도록 되어 있지만 이 코드를 약간 수정하면 원하는 여러가지 동작을 하도록 쉽게 만들어 줄 수 있다.





2015년 8월 27일 목요일

Pillar bracket으로 선반이나 가벽 DIY

Pillar bracket은 집을 꾸미려고 하는데 벽에 구멍을 내거나 못을 함부로 박아 넣기 힘든 경우 매우 유용하게 사용할 수 있는 부품이다. 


벽에 기둥을 세우려면 천장 높이의 목재를 구해야 하는데 정확하게 자르기도 쉽지 않고 끼워 넣어도 약간 틈이 생겨 헐겁게 되기 쉽다. 이 때 pillar bracket을 사용하면 목재를 천장 높이보다 약 5cm 정도 짧게 자른 후 목재 위쪽에 pillar bracket을 끼워주고 나사를 돌려 높이를 조절하면 된다.



위의 케이스 사진에서 볼 수 있는것처럼 집에 가벽 또는 선반등을 깔끔하고 손 쉽게 만들 수 있다.

목재는 투 바이 포 규격을 사용하면 된다. 나는 이번에 알게 된 사실이지만 투 바이 포가 2 inch X 4 inch를 말하는게 아니고 목재에 사용되는 별도의 규격 단위이다. 밀리미터 단위로 표현하면 38mm X 89 mm가 된다.




이런식으로 되어 있어 목재를 끼워 넣은 다음 나사로 고정할 수 있게 되어 있다.


위쪽은 펠티어가 붙어 있어 천장에 딱 고정되어도 상처를 내지 않도록 신경을 썼다.








일본에서만 판매되고 있고 가격은 개당 1800엔(소비세 8% 별도)으로 좀 비싼 편인게 아쉽긴 하다. 다만 재미있는건 일본 내에서 주문하면 우송료가 별도인데 해외에서 주문하면 우송료가 무료이다. 일본에서 EMS로 오다 보니 주문하고 2~3일이면 제품을 받을 수 있다.

http://www.pinkflag.me/pillarbracket/index.html

아래는 pillar bracket으로 만든 선반이나 가벽 샘플들이다.




2015년 2월 12일 목요일

초소형 아두이노 호환 보드 8pino

Arduino Pro Mini

Arduino Micro


Femtoduino

Digi Spark

Lilypad Arduino

Olimexino


Arduino mini나 arduino micro, 또는 Femtoduino, Digi Spark, Lilypad같이 작은 크기의 아두이노 호환 보드들이 많은데 최근에 그 보다도 더 작은 보드가 나왔다.

8pino라는 이름의 보드로 프로세서로는 ATTiny85를 사용하기 때문에 IO핀이 많지는 않아도 웨어러블 디바이스같은걸 만들 때 적합하다.



사진에서 볼 수 있는것처럼 보드를 Micro USB 커넥터에 직접 꽂을 수 있다. 그리고 보드 전체의 크기가 DIP 8핀과 동일하기 때문에 브레드보드에 ATTiny85 대신 8pino로 대신 꽂을수도 있다.
아두이노와 호환되기 때문에 Arduino IDE를 사용할 수도 있고, USB에 연결하면 USB Tiny ISP로 인식하기 때문에 avr-gcc나 AVR Studio를 사용해 컴파일 한 바이너리를 직접 플래쉬에 구울수도 있다.



회로도 및 gerber 파일까지 다 공개되어 있고 아직 제품으로 판매하는곳은 없는 상태이다.
조만간 Seeedstudio에서 판매를 시작할 예정이고 가격은 대략 $8 정도가 될 듯 하다.

2015년 1월 30일 금요일

HM-10 iBeacon 제작

이전 포스트(HM-10 Bluetooth 모듈을 iBeacon으로 사용하기)에서 소개한대로 CR2032 배터리를 사용해 소형 iBeacon 모듈을 제작해 보았다.



만능기판 위에 HM-10 모듈을 약간 두께가 있는 양면테입으로 붙여주고 뒷면에 배터리 홀더를 붙여 주었다. 위쪽 사진 우측 상단의 커넥터는 모듈에 명령을 주기 위해 USB-to-Serial 컨버터를 연결하기 위한 것이고 설정이 끝나면 케이블은 분리하고 모듈 자체적으로 동작하게 된다.


제작한 iBeacon의 크기 비교이다. 위의 사진처럼 500원짜리 동전보다 조금 큰 정도의 크기이다. 이렇게 만든 경우 배터리 한개로 대략 55일 정도 동작하게 된다.

커넥터를 연결하고 컴퓨터에서 시리얼 터미널 에뮬레이터를 동작시켜 명령을 내려준다. (통신 파라미터는 9600-N81)


이전 포스트에서 이야기 했던것처럼 명령어 입력이 끝난걸 엔터키로 확인하는게 아니고 타이밍을 가지고 하기 때문에 위와 같이 줄바꿈이 되지 않고 명령어, 응답이 계속 붙어 보이게 된다.

AT+VERR?HMSoft V533AT+RENEWOK+RENEWAT+RESETOK+RESETATOKAT+MARJ0x1234OK+Set:0x1234AT+MINO0xFA01OK+Set:0xFA01AT+ADVI5OK+Set:5AT+NAMEARSVIATOROK+Set:ARSVIATORAT+ADTY3OK+Set:3AT+IBEA1OK+Set:1AT+DELO2OK+DELO2AT+PWRM0OK+Set:0AT+RESETOK+RESET

쉽게 볼 수 있게 색깔로 구분해 놓은 것이다. 빨간색 볼드는 입력한 명령어, 파란색 이태릭체는 모듈의 응답이다. 

명령 입력이 끝났으면 이제 케이블을 분리해도 된다. 

실제로 정상 동작하는지 확인해 보겠다.



 아이폰에서 Locate 앱을 실행시켜 본 결과이다. 디폴트 UUID는 변경하지 않았으므로 Apple AirLocate로 보인다. 모듈에 설정해 준 대로의 Major 0x1234 (십진수로 4660), Minor 0xFA01 (십진수로 64001)를 확인할 수 있다.


Apple AirLocate.... 부분을 클릭하면 상세정보를 볼 수 있다. 


2015년 1월 28일 수요일

HM-10 Bluetooth 모듈을 iBeacon으로 사용하기

Aliexpress등에서 매우 저렴하게 구입할 수 있는 Bluetooth 4.0 Low Energy (BLE) 모듈인 HM-10을 iBeacon으로 사용할 수 있다. 물론 HM-10은 데이터 통신 또는 단독 센서, 디바이스 제어등의 용도로 사용할수도 있지만 여기서는 그것들에 대한 설명은 생략한다. 

HM-10은 TI의 CC2540 또는 CC2541 BLE SoC 기반의 Bluetooth 4.0 모듈이다. 개당 약$6~7 정도의 가격이다. 펌웨어 버젼은 2014년 9월 기준으로 펌웨어 버젼 531이 나와있다.



모듈은 위의 사진에서 볼 수 있는것처럼 매우 작다. 접촉패드 간격은 1.5mm이라 일반 브레드보드나 만능기판등에서 바로 사용하기는 힘들다. 전원에 연결하거나, 모듈을 iBeacon으로 설정하기 위해 PC에 연결된 USB-to-Serial 케이블에 납땜을 할 때 매우 주의해야만 한다. HM-10은 2.0~3.7V에서 동작하고 I/O핀은 3.3V tolerant이다.

Hardware Connections


모듈에 전원을 공급하기 위해 두가닥의 선이 필요하고, USB-to-Serial adapter를 통해 모듈을 설정하기 위해 임시로 3개의 선이 필요하다. 



위의 사진은 모듈이 3개의 NiMH 충전 배터리가 들어있는 배터리 팩(1.2V * 3 = 3.6V) 과 USB-to-Serial adapter에 연결되어 있는걸 보여준다. Arduino를 사용하고 있다면 아마도 이런 류의 adapter를 이미 가지고 있을것이고, 그렇지 않다면 약 $15정도로 구입할 수 있을 것이다. 만일 구입해야 한다면 3.3V/5V 점퍼나 선택 스위치가 있는 것으로 구입하길 권한다. 



HM-10은 평균적으로 약 0.18mA의 전류를 사용한다. 사진의 배터리팩은 약 1800mAh의 용량을 가지고 있으므로 약 10000시간(즉 1년 이상) 지속될 수 있다. 만일 매우 작은 iBeacon을 만든다면 240mAh 용량의 CR2032 코인셀을 사용할 수도 있고, 이 경우 약 55일정도 사용할 수 있다. 



위의 다이어그램은 케이브블을 어떻게 연결해야 하는지 보여준다. 배터리는 모듈의 12(+), 13(-)번 핀에 연결되어 있다. RS232 adapter의 RxD는 1번핀에, TxD는 2번핀에 연결한다. Adapter의 그라운드 핀은 모듈의 14번 핀에 연결한다. 

Using a Terminal Emulator to talk to the HM-10


하드웨어가 준비되었으면 HM-10이 동작하는지 확인할 수 있다. 배터리와 serial adapter가 HM-10에 연결되었으면 adapter의 USB케이블을 PC에 연결한다. 처음으로 adapter를 사용하는 것이면 adapter의 디바이스 드라이버를 설치하도록 요구받을 수도 있다. 대부분의 경우 OS가 자동으로 드라이버를 찾아준다. 

HM-10은 AT 명령셋을 사용하는데 매우 특이한 타이밍을 요구한다. 명령은 CR이나 LF로 끝나는것이 아니고, 명령이 완전히 다 입력된 다음의 매우 짧은 딜레이에 의존한다. 그러므로 arduino 소프트웨어의 시리얼 모니터를 이용하기를 권장한다. 이 글을 읽는 대다수는 arduino IDE가 이미 설치되어 있을것이라고 생각한다.



Tools 메뉴에서 Serial Port를 선택하고 거기에서 자신의 serial adapter에 해당하는 COM 포트를 선택한다. 대부분의 경우 가장 아래쪽의 COM포트이다. 위의 스크린샷에서는 COM3이다. 

그 다음에 Tools 메뉴에서 Serial Monitor를 실행한다. 아래 메뉴에서 “9600 Baud”와 “No line ending”을 선택한다. 이제 HM-10과 이야기 할 수 있다. “AT” 뒤에 엔터키를 타이핑 해 본다. HM-10이 “OK”라고 응답해야 한다. HM-10은 출력하는 내용 뒤에 LF로 끝나지 않기 때문에 모든 응답 메시지는 뒤에 계속 추가된다.



다음으로 HM-10의 펌웨어 버젼을 확인한다. “AT+VERR?”를 입력한다. 최근에 HM-10을 구입했으면 버젼은 526 또는 그 이후 버젼일것이다. 그렇다면 아래의 Firmware Update 부분은 건너 뛰고 iBeacon Configuration을 가도 된다.

Firmware update

펌웨어 업데이트가 필요하면, 먼저 JNHuaMao 사이트에서 적합한 버젼을 다운로드 받아야 한다. 자신이 가지고 있는 HM-10 모듈이 어떤 칩(2540인지 2541인지)을 사용하는가를 확인한다.  초기모듈은 CC2540을 사용했고 신형 모듈은 CC2541을 사용한다. (최근에 구입했다면 대부분은 CC2541을 사용했을 것이다.)


위의 링크에서 펌웨어를 다운받으면 된다. 다운받았으면 압축을 해제해준다. 최소 3개의 파일이 있을 것이다. readme.txt 파일에는 업데이트 하는 설명이 들어있다. .bin으로 끝나는 파일이 업데이트 할 실제 펌웨어이다. 그리고 .exe로 끝나는 실행파일은 펌웨어를 업데이트 해 주는 프로그램이다. 

1. Arduino 시리얼 모니터에서 ‘AT+SBLUP’를 입력해 준다. 그러면 ‘OK+SBLUP’라고 응답할 것이다. 이제 HM-10은 펌웨어 업데이트를 할 준비가 된 것이다.
2. 시리얼 모니터를 종료한다.
3. 펌웨어 업데이트 프로그램을 실행한다. 
4. COM 포트에 HM-10이 연결되어 있는 시리얼 포트 번호를 설정한다.
5. ‘…’ 버튼을 클릭해 다운로드 한 .bin 파일을 선택한다.
6. 마지막으로 ‘Load Image’ 버튼을 클릭한다.
7. 펌웨어 업데이트는 몇분이 걸린다. 업데이트 하는 도중에는 중단하면 안된다. 
8. Verification이 끝나면 ‘Download completed successfully’라는 메시지가 나올 것이다.



이제 업데이트가 끝났으니 펌웨어 업데이트 프로그램을 종료하면 된다.

iBeacon Configuration


HM-10을 iBeacon으로 설정하려면 몇가지 명령을 입력해 줘야 한다. Arduino Serial Monitor 프로그램을 사용해 명령을 입력해 준다. 아래 리스트에서 볼드로 되어 있는 부분이 실제 입력해줘야 하는 명령이고 그 뒷부분은 각 명령이 어떤 동작을 하는지에 대한 설명으로 입력하면 안된다. 각 명령은 “OK …”으로 ack 되어야 한다. 

1.  AT+RENEW       Factory default로 복구
2.  AT+RESET       Reboot
3.  AT             OK를 기다림
4.  AT+MARJ0X1234  Major no.를 0x1234로 설정
5.  AT+MINO0XFA01  Minor no.를 0xfa01로 설정
6.  AT+ADVI5       Advertising interval을 5(546.25 ms)로 설정
7.  AT+NAMEDOPEY   HM-10 모듈 이름을 DOPEY로 설정
8.  AT+ADTY3       non-connectable로 설정 (전원 절약)
9.  AT+IBEA1       iBeacon 모드 활성화
10. AT+DELO2       iBeacon broadcast-only로 설정 (전원 절약)
11. AT+PWRM0       Auto-sleep 활성화. 8에서 0.18mA로 전력소비를 줄여줌
12. AT+RESET       Reboot

위의 명령들을 다 입력했다면 HM-10은 아이폰이나 안드로이드에서 iBeacon으로 보여야 한다. 4~5단계에서 적절한 major와 minor no.를 선택할 수 있다. Major no.는 특정 범위(스토어 또는 빌딩)내에서 동일하고, minor no.가 iBeacon을 유일하게 식별한다. 위의 프로시져는 HM-10의 디폴트 UUID(표준 proximity UUID)는 변경하지 않는다. UUID를 변경하고 싶으면 AT+IBE0, AT+IBE1, AT+IBE2, AT+IBE3 명령을 사용할 수 있다. 16버이트 UUID는 4바이트 단위로 나뉘어 각각은 다른 명령으로 바꿀 수 있다. 아래 테이블은 UUID를 4개의 명령으로 각각 어느 부분을 변경할 수 있는지 보여준다. 



Removing the Programming Cable


HM-10이 정상적으로 iBeacon으로 동작하는게 확인되었으면 serial adapter에 납땜질 된 케이블을 제거하고, 전원 케이블만 연결해 놓으면 된다. 



배터리 팩과 모듈을 보호하기 위해 케이스에 집어넣어 준다.



Simple iBeacon Scan

아이폰이나 안드로이드 폰에서 iBeacon 스캔을 할 수 있는 앱을 실행시켜 본 결과이다. 위와 같이 정상 동작하고 있음을 확인할 수 있다. 단 iBeacon과의 거리는 RSSI값을 가지고 계산한 것이기 때문에 상대적인 거리이지 정확한 거리는 아님을 주의해야 한다. 

Using the HM-10 as an iBeacon Proximity Device


다음의 8개 UUID는 Apple AirLocate에 proximity device로 들어있다. AirLocate를 사용하는 iOS app과 호환성을 보장하기 위해 이 값을 사용한다.




Waking Up the HM-10


HM-10이 auto-sleep 모드로 설정되어 있으면 전원이 들어오거나 리부팅 될 때 빨리 sleep모드로 갈 수 있다. AT+PWRM0 명령을 보낸 뒤에 재시작하면 MH-10은 더이상 AT 명령에 응답하지 않는다. 디바이스를 깨우려면 80글자 이상의 랜덤 알파벳을 보내면 된다. 그러면 모듈이 깨어나 OK+WAKE라고 응답한다. 한동안 디바이스에 명령을 내려야 하면 잠들지 않게 하기 위해 먼저 AT+PWRM1 명령을 보내준다. 명령이 끝나면 전력소비를 줄이기 위해 AT+PWRM0을 보내면 된다. 


To be continued....   HM-10 iBeacon 제작

2009년 4월 23일 목요일

PD2437을 Arduino에서 사용하기 (Connect PD2437 (5x7 character 4-digit display) to Arduino)

동네의 부품샵을 구경하다 우연히 구하게 된 부품이다. 저렴한 가격($1.99)때문에 메뉴얼 여부에 관계 없이 일단 구입하여 버렸다. 물론 '구글신'을 믿고 있었기 때문이지만...


부품 명칭은 PD2437로 OSRAM에서 나온 4-character 5x7 dot matrix alphanumeric programmable display with built-in CMOS control functions 이다. DIL 패키지 안에 5x7 매트릭스가 4개 들어있고 디스플레이 컨트롤러를 내장하고 있다.

이 부품을 사용하기 위해 구글의 도움으로 유저메뉴얼과 어플리케이션 노트를 찾아내었다.


일반적인 메모리같이 8-bit bidirectional data bus를 사용해서 마이크로컨트롤러와 데이터를 교환하고 ASCII 코드를 입력받아 그에 해당하는 문자를 표시하게 되어 있었다.

Arduino에 연결하려고 하는데 8-bit data bus를 모두 digital i/o에 연결해 버리면 arduino에 다른 주변기기를 붙일 수 없을거 같아 74LS164(8-Bit Parallel-Out Serial-In Shift Registers)를 같이 사용하기로 하였다.

이를 토대로 구성한 회로는 다음과 같다.


Arduino의 D2-D9까지를 사용하였다.

실제 기판에 만들기 전에 먼저 브레드보드에서 프로토타입으로 확인을 해 보았다.


큰 문제 없이 원하는 글자를 표시해 주었다. 테스트에 사용한 코드는 다음과 같다.

View source code


PD2437은 매우 쉽게 여러개를 cascading이 가능하기 때문에 현재 총 10개의 PD2437을 연결하여 20x2 LED display를 만들어 볼까 생각중이다. LCD에 비해 직접 발광을 하기 때문에 시야각 문제도 없고 시중에서 구할 수 있는 20x2 LCD보다 크기도 크기 때문에 야간에도 글자를 정확하게 확인할 수 있기 때문에 signboard로 적합할 거 같다.