Long Range 의 약자인 LoRa.

저전력 장거리 통신이 가능한 프로토콜로, 국내에선 SK가 LoRaWAN 망을 구축하여 서비스 중이다.


LoRaWAN 은 LoRA PHY, 즉 물리적 통신 프로토콜을 기반으로 암호화, 노드 관리 등을 가능케하는 프로토콜이다.


SK의 LoRaWAN 는 비용도 들고 이래저래 번거로운 점이 많았고, 일단 LoRa 모듈 자체를 사용해보고 싶었다.

(SK LoRa 모듈도 가지고 있기 때문에 언젠가 기회가 있다면 테스트를...)



aliexpress 에서 구매한 sx1276 모듈. 내가 구매한 링크는 여기.

한국에서는 915MHz 를 사용하면 된다.


구매하면 구매자가 친절히 이런저런 데이터시트 등을 메일로 보내주는데.. 딱히 필요없었다.

내가 구매한 17년도 12월엔 $16.48/2개 였는데, 글 작성 시점에는 $13.11/2개 정도.


송수신이 가능하므로 2개 이상이 있으면 된다.


LG01-S 등 LoRa Gateway 같은 것도 판매는 하는데, 얘들은 그냥 LoRa 모듈과 인터넷 연결을 편하게 해뒀을 뿐 꼭 필요한건 아니니 당장은 필요없음.




핀간격이 빵판용이 아니라 납땜이 좀 많이 귀찮다.

SPI 통신을 사용하며, 전원과 수신용 인터럽트 핀(DIO0)까지 총 8개가 필요하다.

인터럽트 핀을 생략한다면 7개 핀으로 가능.


동봉된 안테나까지 납땜을 하면 완성!



나는 두개의 아두이노 UNO 와 연결을 하였고,

LoRa 모듈의 작동 전압은 3.3v 이지만, 그동안 경험상 전원만 3.3v 에 물려주면 별 문제가 없었으니 그냥 진행했다.


Arduino Uno 

 LoRa sx1276

GND

GND 

 13

SCK

 12

MISO 

 11

MOSI 

 10

NSS 

 2

DIO0 

 3.3V

VCC 

 8

NRESET 


검색해보니 5v circuit 출력 3.3v circuit 입력의 경우에만 전압 조정을 해주면 된다고 하던데 난 저항 등을 달았을 경우 오히려 작동이 안되어서 전부 바로 연결하였음.


아두이노 라이브러리는 Sandeep Mistry의 LoRa 를 사용하였다. Arduino 라이브러리 매니저에 있지만,

링크는 https://github.com/sandeepmistry/arduino-LoRa


코드야 예제코드가 잘 만들어져이으니 참고하면 됨.


나의 경우 송신/수신 나눠서 테스트를 하였고, 송신부가 두번째 LoRa.endPacket() 이 무한 blocking 되는 문제가 있었다.

그냥 모듈 두개를 서로 바꿔주니 해결이 되었음.. 아마 납땜과정에서 모듈 하나가 송신이 안되는 불구가 된 듯하다ㅠㅠㅠ




거리 테스트..

송신기를 건물 안에 두니 밖으로 나가면 바로 안되어서, 야외에 두고(71m 거리 태그가 있는 곳) 움직여보았다.


안테나가 별로인건지, 내가 잘못 납땜한건지 여튼 저 정도 거리까지만 수신이 되었음...ㅠ

송신기를 좀 높은 곳에 두고 안테나를 잘 세팅한다면.... 더 잘되지 않을까 기대를 해본다.


일단 통신이 되긴 했으니 만족!

자판기를 만들고 싶어서, 일단 지폐인식기를 구해보았다.


일반적으로 아두이노 관련 제품을 파는 쇼핑몰에서는 구할 수 없고, 오락기나 자판기 부품을 판매하는 업체 등에서 구할 수 있는데

중고나라에 자주 올라오니 중고나라에서 구매하는 것도 좋은 방법.


나는 마침 중고나라에 올라온 GBK-PS500 이라는 제품을 구매하였는데, 기억은 안나지만 개당 2만원 정도에 구매했던 것 같다.



이렇게 생긴 친구이며, 좌측에 MOLEX 53015 10P 커넥터가 달려있고, 우측에 있는 DIP 스위치로 신호 출력방식, 지폐 권종 등을 조절할 수 있다.


문제는 중고로 샀더니 정말 제품만 덜렁왔고... 커넥터에 맞는 케이블을 구하기가 어려웠다.

그러다 모 쇼핑몰에서 동일 제품을 판매하는걸 발견했고, 옵션 상품에 케이블을 판매하길래 전화로 별도 구매 성공!

링크는 여기 http://smartpon4989.com/item.php?ct_id=18&id=F154916030


다만 전원과 VEND1 출력만 연결된 3선 케이블이라고 한다.

3개만으로도 작동을 하니까 파는거겠지.. 하면서 일단 받았다.


전원 연결을 하면 지폐인식이 매우 잘 되는건 확인.

이제 신호를 받아야하니 이전에 사뒀던 DSO138 에 물려서 확인해보았다.




(내가 쓸줄 몰라서 그러는건지.. 뭔가 이쁘게 딱 보이진 않았지만...)

사진에 보이다시피 펄스가 주기적으로 계속 나오다가, 지폐가 입력되면 100 ms 동안 LOW 신호가 1000원 단위로 출력되는 구조였다.

앞에서 얘기했듯이 DIP 스위치로 1000원 당 펄스 횟수(1~10,11,12,15,20)를 조절할 수 있고, 펄스길이(100ms / 50ms)도 조정가능함.

지폐가 인식이 안되어서 반환이 되었는지, 현재 지폐 인식 중인지 등의 정보도 받을 수 있는 것 같지만 선이 연결 안되어있으니 일단 패쓰.

아날로그 신호다 보니 노이즈가 들어오면 돈이 잘못 인식될 수도 있을.. 것 같지만 3선밖에 없어서 검증루틴 같은걸 추가하기도 곤란하다. 그냥 배선을 잘 해두는 수밖에.


여튼 아두이노 코드로는 간략히 아래와 같이 작성하였다.

(이제보니 purseIn 이라는 내장 함수가 있네... 다음에 깔끔하게 고쳐보는걸루...)



100ms 의 경우 만원권 등을 넣었을때 그만큼 인식에 시간이 걸리기 때문에, 50ms 로 줄여도 된다. 그 경우엔 조건문을 조금 수정해야할 듯.


여튼 일단 잘 됨!


추가로, LCD 같은 부품을 사용해서 아두이노가 loop 한번 돌때 걸리는 시간이 길어진다면, 펄스 신호를 제대로 체크할 수 없기 때문에 제대로 작동하지 않을 수도 있다. 알..아서 잘 해결해보자ㅎㅎ



+ INHIBIT 포트를 LOW 로 주면 지폐를 받지 않는다.

ESCROW 는 모르겠음

ubuntu 17 부터인지

ifupdown 대신 netplan 이 네트워크 설정을 담당하고,

기본 nameserver 로는 127.0.0.53, systemd-resolved 가 작동하면서 알아서 질의한다.


같은 시기에 설치한 ubuntu 18 서버 두대 중 한대가 dns 질의가 안되었는데,


$ nslookup google.com

Server: 127.0.0.53

Address: 127.0.0.53#53


** server can't find google.com: SERVFAIL


$ sudo journalctl -u systemd-resolved -f

Jun 26 18:53:46 hostname systemd-resolved[688]: Got packet on unexpected IP range, refusing.



대충 이런 상황...?


원인을 찾아보니 황당하게도 iptables 설정 문제.

포트 포워딩을 하면서 SNAT 을 위해 아래와 같이 설정해두었는데 이게 문제였다.

# iptables -t nat -A POSTROUTING -j MASQUERADE



로컬 인터페이스에 대해서도 SNAT 이 걸려서 뭔가 문제라고 판단을 하였고, 

# iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE

이렇게 네트워크 인터페이스를 지정해주고 문제 해결.


참고로 네트워크 인터페이스 지정을 안해주니 sudo 도 hostname 을 제대로 못찾아서 에러를 낸다.

127.0.1.1 주소를 /etc/hosts 파일에 hostname 과 연결해주면 해결되지만, (또 그렇게 연결해두라고 하지만)

SNAT 설정을 안해두면 애초에 이 문제가 발생하지 않음.


여튼 해결.

'Linux, Server, Web' 카테고리의 다른 글

tar 압축/해제  (0) 2018.09.10
[OpenVPN] client 에서 route 설정하기  (0) 2018.07.31
Heroku + Python + Flask  (0) 2017.12.06
Mac + VirtualBox + Xpenology 설치하기  (0) 2017.11.25
AWS Lambda 에서 RDS + 외부 인터넷 접근  (0) 2017.07.30

+ Recent posts