목차
나는야 뚝배기머리를 지켜주는 스마트 헬멧착용 알리미!
문제의 발견
최근 들어 전동킥보드 사용자가 증가하고 있는만큼 전동킥보드 사용으로 인한 위험사고도 끊이지 않고 있는데요, 실제로도 학교 주변에서 헬멧을 착용하지 않고 킥보드를 이용하거나 심지어는 두 명에서 이용하는 경우도 목격했습니다. 헬멧의 착용여부에 따라 생존확률이 크게 달라지지만 전동킥보드 사용자들은 헬멧의 위생여부나 미관상의 문제로 헬멧 착용을 꺼려해 헬멧을 착용하지 않고 전동킥보드를 이용하는 사용자들이 많습니다. 또한 사고발생시 차량과 다르게 블랙박스가 설치되어 있지 않아 사고의 진위여부를 확인하기 어렵다는 점이 있습니다.
위의 그래프를 보면 최근 전동 킥보드 사용량이 증가하면서 관련 사고도 높아지고 있다는 것을 알 수 있습니다.
또한 여러 기사들을 찾아보면 알 수 있듯이 킥보드 이용자 중 헬멧을 착용하지 않는 이용자가 꽤 많다는것과 사고 발생시 머리부분을 제일 많이 다쳐 헬멧 착용이 아주 중요하다는 것을 알 수 있습니다.
그래서 우리가 찾은 해결 방법은!
전동킥보드 이용자들을 대상으로 헬멧 미착용에 대한 문제 및 관련사고의 진위여부 확인 문제를 해결하기 위해 '스마트 헬멧착용 알리미'를 만들었습니다.
이렇게 만들었어요
H/W, S/W, 디자인 등 결과물에 대한 제작기를 적어주세요! 이미지도 좋고, 작동되는 최종 동영상을 첨부하면 베스트
H/W: 실제 사용할 수 있는 헬멧과 초음파센서, 피에조부저, LED, 배터리, 아두이노를 이용해 헬멧과 사람의 머리간의 거리를 측정하고 불빛과 소리를 이용해 시각적, 청각적으로 착용여부를 나타낼 수 있도록 했습니다. 또한 ESP32-CAM을 이용해 자동차의 블랙박스와 같은 역할을 하도록 했습니다.
S/W: 초음파센서를 통해 측정한 거리값이 10cm이상 멀어지면 빨간색 LED가 켜지면서 피에조부저가 울리고 10cm미만이면 초록색 LED가 켜지도록 설계했습니다. 또한 ESP32-CAM을 이용해 영상을 촬영하고 휴대폰으로 실시간으로 송출할 수 있도록 프로그램을 설계하였습니다.
디자인: 외관상 깔끔하게 보이기 위해 아두이노와 배터리를 헬멧 내부로 배치하고 선들을 깔끔하게 정리하였습니다.
<H/W & 디자인>
<S/W 프로그래밍>
//초음파센서 & 피에조부저 코딩
int echoPin = 12;
int trigPin = 13;
int led1=3,led2=4,led3=5,speakerpin=8;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
}
void loop()
{
digitalWrite(trigPin, LOW);
digitalWrite(echoPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
unsigned long duration = pulseIn(echoPin, HIGH);
float distance = ((float)(340 * duration) / 10000) / 2;
Serial.print(distance); Serial.println("cm");
if(distance<10)
{ digitalWrite(led3,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led1,LOW);
}
else
{ digitalWrite(led3,LOW);
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
tone(speakerpin,500,1000);
}
delay(1000);
}
JavaScript
복사
//ESP32-CAM 코딩
#include "esp_camera.h"
#include <WiFi.h>
//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
// Ensure ESP32 Wrover Module or other board with PSRAM is selected
// Partial images will be transmitted if image exceeds buffer size
//
// Select camera model
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
#include "camera_pins.h"
const char* ssid = "iphone"; // 와이파이 아이디
const char* password = "123456788"; // 와이파이 비밀번호
void startCameraServer();
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
// if PSRAM IC present, init with UXGA resolution and higher JPEG quality
// for larger pre-allocated frame buffer.
if(psramFound()){
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
#if defined(CAMERA_MODEL_ESP_EYE)
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
#endif
// camera init
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
sensor_t * s = esp_camera_sensor_get();
// initial sensors are flipped vertically and colors are a bit saturated
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1); // flip it back
s->set_brightness(s, 1); // up the brightness just a bit
s->set_saturation(s, -2); // lower the saturation
}
// drop down frame size for higher initial frame rate
s->set_framesize(s, FRAMESIZE_QVGA);
#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
}
void loop() {
// put your main code here, to run repeatedly:
delay(10000);
}
JavaScript
복사
ESP32-CAM의 속성
보드 : ESP32 Wrover Module
Upload Speed : 115200
Flash Frequency : 400MHz
Partition Scheme : Huge APP (3MB No OTA/1MB SPIFFS)
Core Debug Level : None
ESP32-CAM과 노트북의 연결은 cp2102 TTL 변환모듈을 사용하여 코드를 업로드 하였습니다.
이러한 효과를 기대하고 있어요!
[기대효과]
1) 헬멧 착용 장려: 초음파 센서로 헬멧과 머리사이간의 거리를 감지하여 일정 거리 이상 가까워지지 않으면 빨간색 LED에 전원이 들어오면서 피에조 부저가 울리게 된다. 반대로 착용시 초록색 LED가 들어온다. 청각적으로 헬멧의 착용여부를 알려 킥보드 이용자가 헬멧을 반드시 착용하도록 할 수 있고
2) 헬멧 단속 간소화 및 사고 위험성 감소: 야간에 킥보드를 이용할 경우 어두워서 헬멧의 착용 여부를 판단하기 어려운 경우가 있는데 위와 같은 원리로 LED의 불빛의 색깔에 따라 헬멧단속을 더 쉽게 할 수 있고 이와 더불어 차량 운전자가 더 쉽게 알아볼 수 있어 사고의 위험성이 줄어들 수 있다.
3) 사고발생시 진위여부 판단: 헬멧에 부착된 캠을 이용해 영상을 송출할 수 있으므로 이는 사고발생시 사고의 진위여부를 가릴 수 있어 객관적인 판단에 도움이 된다.
[비지니스 모델]
1) 전동킥보드 대여 회사: 전동킥보드 대여 회사인 라임, 씽씽, 킥고잉과 같은 회사에 대량 납품하여 안전이 우선적인 이미지를 취한다면 고객이 더 늘어날 것이다.
2) 대형마트: 전동킥보드를 보유한 개인고객들 중 기능성 헬멧을 찾는 소비자들이 접근하기 쉽다.
3) 전동킥보드 전문점: 이벤트성 상품으로 킥보드와 헬멧을 연관시켜 판매하면 소비자들의 접근성이 더 높을 것이다.
[사회적 효과]
킥보드 이용자가 헬멧의 중요함을 인식: 헬멧 착용을 지속적으로 권고하면서 이용자들의 헬멧 착용률이 증가할 뿐만 아니라 헬멧 착용의 중요성도 인식시킬 수 있다. 이를 통해 교통안전사고에 대한 경각심을 일깨워 준다.
12주간의 여정을 통해 느낀 점
허경민
처음 시작했을 때는 12주가 너무 길었고 새로운 사람들과 함께 활동을 한다는 거에 설렘도 같이 느껴졌었는데 매주에 미션을 클리어하다보니 12주까지 단숨에 오게 되었네요.
아두이노에 아무것도 모르던 제가 초반에 든 생각이 '할 수 있을까'였는데 지금은 '하면 되는구나'라고 느낄정도로 많은 걸 배워가는 12주였습니다. 저희 조 재영,채원 아쉽게 그만두신 시언님 모두 감사하였고 즐거웠습니다. 어벤져스 화이팅!!
임재영
짧다면 짧고 길다면 길었던 12주동안 usg공유대학을 통해서 아두이노에 대해 많은 것을 알아가는 시간이였습니다. 조별활동으로 서로에게 의지하고 많은 도움이 되었기 때문에 포기하지 않고 끝까지 달려온 것 같습니다. 12주동안 수업을 하며 개인미션을 통해 아두이노에 대한 이해도와 다루는 기술을 배웠고 팀미션을 통해 경민님, 채원님과 소통을 하며 서로 알아가는 시간을 갖게 된거 같아 많이 기쁩니다^~^. 그 동안 USG공유대학을 진행하신 멘토분들과 저희 어벤져스 2조분들 다들 고생하셨고 감사했습니다~!!!!
박채원
비록 비대면이었지만 큰 문제없이 수업을 진행할 수 있다는 것이 가장 큰 장점이었던 것 같습니다. 12주동안 단계별로 미션을 수행하면서 자연스레 아두이노를 다룰 수 있는 능력을 키울 수 있었습니다. 그리고 해커톤 프로젝트를 진행하면서도 많은 지식과 경험을 얻어갈 수 있었습니다. 그 동안 함께한 2조 어벤져스팀 조원분들과 멘토님들 덕분에 해커톤도 잘 마무리 할 수 있었던 것 같습니다. 모두 고생 많으셨습니다!