GSM 연결 휴대용 투표 시스템 - 모바일 투표함 만들기
부품 및 소모품
| 아두이노 우노 (Arduino UNO) |
× |
1 |
| Adafruit FONA 미니 GSM 브레이크아웃 |
× |
1 |
| 솔더리스 브레드보드 (풀 사이즈) |
× |
1 |
| 원형 촉각 버튼 스위치 (컬러) |
× |
2 |
| LED (일반) |
× |
3 |
앱 및 온라인 서비스
- Hologram Data Router: 셀룰러 데이터 라우팅 서비스
- IFTTT Maker 서비스: 웹훅을 통한 구글 시트 연동
프로젝트 배경
사람들이 정보를 처리하고 결론을 내리는 방식, 그리고 집단 압력과 그룹씽크가 개인의 반응에 미치는 영향에 매료되어 이 프로젝트를 시작했습니다. 익명의 무작위 군중에게 질문을 던질 수 있는 기계를 만들고 싶었습니다. 위압적이지 않고(단순함), 동료 압력이나 외부 영향이 없는 환경에서 말이죠.
이것이 모바일 투표함(Mobile Vote Box)의 MVP(Minimum Viable Product)입니다. 첫 실험으로 열정적인 토론을 불러일으키는 간단한 질문을 던졌습니다.
시카고와 라스베이거스의 무작위 장소에 모바일 투표함을 설치했습니다. 배터리로 작동하며 셀룰러 네트워크를 통해 모든 투표를 전송하므로, 설치 후 방치(set-and-forget)가 매우 쉽습니다. 부품 비용은 약 $50지만, 알리익스프레스에서 부품을 조달하면 $6까지 낮출 수 있습니다.
셀룰러 연결은 Hologram.io에서 무료로 제공됩니다. 개발자 플랜으로 무료 글로벌 SIM 카드와 월 1MB 무료 데이터(약 2,000개 투표 데이터 패킷/월)를 받을 수 있습니다. 프로모션 코드 BUDS-WITH-BENSTR로 무료 배송과 크레딧 혜택을 받으세요.
공개: 저는 Hologram에서 근무하고 있어 셀룰러 연결 기반 IoT 튜토리얼을 많이 제작합니다.
전 세계에 수백 개의 모바일 투표함을 배치하여 매일 새로운 질문을 던지고 데이터를 공개하는 것이 궁극적인 목표입니다.
모바일 투표함 제작 과정
높은 수준에서 역순으로 작업합니다. 데이터 출구에서 시작해 입구로 향합니다.
- IFTTT 애플릿 생성 → 구글 스프레드시트로 데이터 전송
- SIM 활성화, 데이터 라우트 설정, 모의 데이터로 검증
- 하드웨어 배선 및 펌웨어 플래싱
- 흥미로운 질문을 정해 공공장소에 설치
데이터 흐름 이해
투표가 기록될 때마다 장치는 Hologram Data Router로 데이터 문자열을 보냅니다. 라우터는 이를 JSON 객체로 변환해 IFTTT 웹훅으로 전송하고, IFTTT는 각 투표를 구글 시트에 추가합니다.
복잡해 보이지만 각 요소는 고유한 역할을 합니다:
- Hologram Data Store: SIMCom 모듈에서 클라우드로 데이터 전송의 복잡성 추상화
- Hologram Data Router: 최소한의 문자열 데이터를 IFTTT가 요구하는 JSON 형식으로 변환, 기기 코드 수정 없이 다른 연동 추가 가능
- IFTTT: 복잡한 클라우드 연동(구글 시트 등) 추상화
- 구글 시트: 데이터 저장용
1단계: IFTTT 설정
- IFTTT 로그인/가입 → 새 애플릿 생성
- 트리거: Webhooks → "Receive a web request" → 이벤트명
vote
- 액션: Google Drive → "Add row to spreadsheet"
- 액션 필드 완성 (이미지 참조)
- 애플릿 완료 → 웹훅 키 복사 (URL의 마지막 부분)
키 확인: https://ifttt.com/services/maker_webhooks/settings
2단계: Hologram 설정
- Hologram.io 로그인/가입 → SIM 활성화 또는 기존 기기 선택
- 새 기기 생성 (예: "Vote Btn #1")
- 좌측 메뉴 Routes → 새 라우트 추가
- IN: 토픽
vote
- OUT: IFTTT Maker Webhook 선택
- Webhook Key: IFTTT에서 복사한 키 붙여넣기
- Event:
vote
- Data:
{"value1": "Pizza: Chicago or New York Style?", "value2": "<>"}
- 라우트 생성
3단계: 라우트 및 웹훅 테스트
- Devices → 기기 선택 → Messaging → Simulate from Device
- 데이터
chicago를 토픽 vote로 전송
- Hologram 콘솔에서 성공적인 라우트 확인
- 구글 드라이브 스프레드시트에서 새 항목 확인
- 문제 발생 시 Hologram 커뮤니티에서 도움 요청
4단계: 하드웨어 구성
- Hologram 대시보드에서 Data Router Device Key 복사
(Devices → 기기 선택 → Configure → Show CSR Credentials)
- 아래 회로도와 스케치 코드 참조
- 전역 변수
HOLO_KEY에 본인의 Device Key 입력
코드
#include
#define RX_PIN 2 // SIMCom RX - MCU TX
#define TX_PIN 3 // SIMCom TX - MCU RX
#define RESET_PIN 4 // SIMCom 리셋
#define HOLO_KEY "########" // 본인의 SIM 키로 교체
#define CONNECT_LED 12
#define VOTE1_BTN_PIN 6
#define VOTE1_LED_PIN 7
#define VOTE2_BTN_PIN 9
#define VOTE2_LED_PIN 10
HologramSIMCOM Hologram(TX_PIN, RX_PIN, RESET_PIN, HOLO_KEY);
String VOTE1_VALUE = "chicago";
String VOTE2_VALUE = "newYork";
String HOLOGRAM_TOPIC = "vote";
void setup() {
Serial.begin(19200);
while (!Serial);
Hologram.debug();
pinMode(CONNECT_LED, OUTPUT);
pinMode(VOTE1_BTN_PIN, INPUT);
pinMode(VOTE1_LED_PIN, OUTPUT);
pinMode(VOTE2_BTN_PIN, INPUT);
pinMode(VOTE2_LED_PIN, OUTPUT);
bool cellConnected = Hologram.begin(19200, 8888);
if (cellConnected) {
digitalWrite(CONNECT_LED, HIGH);
}
}
void loop() {
Hologram.debug();
if (digitalRead(VOTE1_BTN_PIN) == HIGH) {
sendVote(VOTE1_VALUE, VOTE1_LED_PIN);
}
if (digitalRead(VOTE2_BTN_PIN) == HIGH) {
sendVote(VOTE2_VALUE, VOTE2_LED_PIN);
}
}
void sendVote(String VOTE_VALUE, const int VOTE_LED) {
digitalWrite(VOTE_LED, HIGH);
if (Hologram.send(VOTE_VALUE, HOLOGRAM_TOPIC)) {
// 성공 시 LED 깜빡임
digitalWrite(VOTE_LED, LOW); delay(100);
digitalWrite(VOTE_LED, HIGH); delay(100);
digitalWrite(VOTE_LED, LOW); delay(100);
digitalWrite(VOTE_LED, HIGH); delay(100);
digitalWrite(VOTE_LED, LOW);
} else {
digitalWrite(VOTE_LED, LOW);
}
}
회로도

라이브러리 설치
Arduino IDE에 HologramSIMCOM 라이브러리를 수동으로 추가해야 합니다:
https://github.com/hologram-io/hologram-SIMCOM
확장 아이디어
- 투표 옵션 2개 → 4개 이상으로 확장 (버튼 및 LED 추가)
- OLED 디스플레이로 실시간 투표 현황 표시
- 태양광 패널 + 리튬 배터리로 완전 무인 장기 운용
- GPS 모듈 추가로 설치 위치 자동 기록
- 질문 내용을 원격에서 변경할 수 있는 펌웨어 OTA 업데이트 기능