[58호]세이프티 볼라드
2019 ICT 융합 프로젝트 공모전 참가상
세이프티 볼라드
글 | 경북대학교 김도훈, 박선우, 박은빈
1. 심사평
칩센 횡단보도등에서 발생하는 사고소식을 접할때마다 늘 생각이 들던 시스템이고, 간혹 주차장 입출입구 등에 유사한 시스템이 적용되어 있는 것을 본적이 있는듯 하다. 하지만 여러가지 현실적인 문제로 인하여 아직까지도 적용이 되지 않는게 아닐까 하는 막연한 추측을 하고 있다. Mechanic적인 요소를 적용한 것이 매우 흥미로우며, 시제품의 완성도도 생각보다는 높게 평가할수 있을듯 하다. 앞서 설명한것과 같이 실제 시스템을 적용하기 위한 현실적인 문제에 대하여 조금 더 고민하여 개선된 제품이 나온다면 아파트 단지등과 같은 변수고려가 적은 환경에 있어 적용가능할 것으로 보인다.
뉴티씨 법적으로 근거가 있는 아이디어이며, 또한, 많은 특허들도 등록되어 있습니다. 실용화가 가능한 것으로, 이미 국내 및 일본 등에서 실용화가 되어 있는 곳도 있는것으로 알고 있습니다. 장소에 따라서는 사고를 막기위하여 매우 중요한 시설로 사용될 수 있다고 생각됩니다. 학생으로 스스로 이런 생각을 해내었다는 점에서 박수를 보냅니다.
위드로봇 아이디어가 독보이는 작품입니다. 실용성 측면을 좀 더 고민하면 더욱 좋은 작품이 될 것 같습니다.
펌테크 작품의 하우징 구성은 상당히 깔끔하고 훌륭하게 구성이 되었으나, 작품의 구성 측면에서는 너무 단순하고 심플한 느낌을 받았습니다. 작품전 출전이라는 것을 감안한다면 현재의 작품에 아디디어를 좀 더 반영한 형태로 출품이 되었다면 좋지 않았을까 생각합니다.
2. 작품 동기 및 개요
2.1. 동기
[랩해서남줄랩]이라는 TV프로그램의 주제 중 ‘나는 장애를 극복하지 않았다.’라는 편을 보았습니다. 이 프로그램에서는 지체장애인분들이 일상생활에서 많은 불편함을 겪고 있고, 이것을 해결하기위해 직접 나서는 모습을 담고 있었습니다. 특히 차가 들어오는 것을 막기 위해 설치를 해둔 볼라드 때문에 휠체어가 지나가지 못하거나, 걸린다는 것을 알게 되었습니다. 이런 불편사항을 보안하기 위해 ‘자동으로 움직이는 볼라드는 어떨까?‘라는 생각을 하게 되었고 주로 횡단보도에 설치되어있는 볼라드에 적용해보기로 했습니다.
볼라드가 올라오고 내려오는 과정을 토의하면서 주의할 점을 파악해 나갔습니다. 무턱대고 볼라드가 땅에서 올라오면 횡단보도에 서있던 보행자가 다칠 위험이 클 것이라고 생각했습니다. 그래서 볼라드를 윈기둥 형태가 아닌 ‘π’자 형태로 만들기로 했습니다. 세이프티 볼라드의 윗부분은 일반 보행자들에게 잘 보이는 색상으로 구성하였고, 지체장애인 분들도 볼라드의 위치를 알도록 들어갔을 때도 약간 볼록한 형태로 구상을 했습니다.
또한, 이 볼라드는 지체장애인분들 뿐만 아니라 보호구역에서도 유용하게 사용될 수 있을 것이라고 판단했습니다. 어린이 보호구역에 세이프티 볼라드가 설치된다면 아이들에게 신호체계를 보다 정확하게 알려 줄 수 있을 것이라고 생각합니다. 더불어 빨간불일 때 횡단보도에서 무단횡단을 하는 사람들이 줄어들어 보다 나은 교통질서를 제공할 것입니다. 결과적으로 안전사고를 예방하는데 큰 도움이 되는 시스템이라고 자부합니다.
2.2. 개요
이 세이프티 볼라드는 신호에 따라 올라가고 내려가는 시스템을 가지고 있다. 이것은 장애인분들의 이동권을 보장 해 줄 수 있을 뿐만 아니라 일반인들의 무단횡단을 줄여 안전사고를 예방할 수 있다. 또한 어린이 보호구역에 설치하여 초록어머니를 대신하는 횡단보도 지킴이가 될 것이다.
3. 작품 설명
3.1. 구상도
차량이 지나다니지 않아도 신호등이 빨간불이 되면 볼라드에 신호를 주어 땅에서 올라와 보행자가 지나가지 못하도록 길을 막습니다. 마찬가지로 신호등이 파란불이 되면 볼라드에 신호를 주어 땅으로 들어가서 보행자가 길을 다닐 수 있도록 합니다.
3.2. 결과물 사양
4. 제작과정
4.1. 단계별 제작과정
도로의 안, 즉 땅 속을 나타낼 틀을 제작합니다. 이 때 볼라드가 만들어질 위치에 모터와 볼라드를 설치할 지지대를 만들어 줍니다.
볼라드 지지대를 만들어 올라가고 내려갈 수 있도록 기존의 지지대에 설치해 줍니다. 이는 모터에 부착된 톱니바퀴가 회전을 하면 아래, 위로 움직여주는 역할을 합니다.
모터를 볼라드와 연결된 부분에 연결시켜 주어 모터가 돌아가면 볼라드가 올라가고 내려가도록 설정해줍니다.
시스템 상단에 도로를 구현해 줍니다. 분홍색부분은 인도 부분이며 검은색부분은 차도로 횡단보도만 나타냈습니다. 빨간색 LED와 초록색LED를 연결한 신호등을 설치해 줍니다.
볼라드를 설치할 구멍을 뚫어 볼라드가 내려가고 올라가도록 합니다.
빨간불 일 때는 볼라드가 올라오도록 모터가 정방향 회전을 합니다.
초록불 일 때는 볼라드가 내려가도록 모터가 후방향 회전을 합니다.
4.2. 주요 동작 및 특징
전체적인 동작 내용은 신호등과 횡단보도를 표현하고 신호등 신호에 맞게 볼라드를 위아래로 움직여 주는 것이다. 이를 위해 아두이노 보드와 모터 쉴드를 이용해 모터의 동작과 LED 깜박임을 제어하도록 구성하였다. 먼저 신호등 빨간불에서 초록불로 바뀌는 경우에 LED-green에 전압을 인가하고 LED-red의 전압을 차단하는 동시에 두 모터에 동작명령을 주어 횡단보도 양측 볼라드가 같이 내려가도록 설계하였다. 초록불 시간이 거의 다 끝나갈 때 즈음 LED-green이 깜박이도록 명령을 주어 신호가 거의 끝나간다는 것을 표현하였다. 이후 시간이 다 되면 LED-green의 불이 꺼짐과 동시에 LED-red의 불이 켜지면서 볼라드가 올라오도록 설계하였다.
상하로 움직일 수 있는 볼라드로 인해 볼라드의 주 기능인 차량 통제의 역할을 수행할 수 있는 동시에 볼라드로 인해 발생했던 보행자의 통행 불편함을 해소할 수 있게 되었다.
또한 제작 과정에서 볼라드가 내려갈 때와 올라갈 때의 모터 구동 시간을 다르게 설정하여 중력으로 인한 모터의 부하로 발생하는 볼라드의 높이 오차를 해결하였다.
4.3. 전체 시스템 구성
#include <AFMotor.h>
AF_DCMotor motor1(3); // M3에 연결
AF_DCMotor motor2(2); // M2에 연결
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println(“Motor test!”);
// turn on motor
motor1.setSpeed(0); // 모터 회전속도 설정
motor2.setSpeed(0);
motor1.run(RELEASE);
motor2.run(RELEASE);
// analog input pin을 output으로 초기화
pinMode(A0, OUTPUT); // RED
pinMode(A5, OUTPUT); // GREEN
}
void loop() {
uint8_t i;
delay(1000);
Serial.print(“tick”);
// 정방향 회전
motor1.run(FORWARD);
motor2.run(FORWARD);
digitalWrite(A0, LOW); // RED off
digitalWrite(A5, HIGH); // GREEN on
// 모터 구동 시작
for (i=0; i<60; i++) {
motor1.setSpeed(180);
motor2.setSpeed(180);
delay(10);
}
// 모터 정지
motor1.run(RELEASE);
motor2.run(RELEASE);
delay(5000);
Serial.print(“tock”);
// 초록불 점멸
for (i=0; i<5; i++) {
digitalWrite(A5, LOW);
delay(200);
digitalWrite(A5, HIGH);
delay(200);
}
Serial.print(“tech”);
// 역방향 회전
motor1.run(BACKWARD);
motor2.run(BACKWARD);
digitalWrite(A0, HIGH); // RED on
digitalWrite(A5, LOW); // GREEN off
// 모터 구동 시작
for (i=0; i<80; i++) {
motor1.setSpeed(200);
motor2.setSpeed(200);
delay(10);
}
// 모터 정지
motor1.run(RELEASE);
motor2.run(RELEASE);
delay(7000);
}
위는 스마트 볼라드의 모형을 구동시키기 위한 소스 코드이다. 상하로 왕복운동을 하는 구조는 과학상자로 만들었으며, 이에 필요한 두 개의 모터를 제어하기 위한 장치로 아두이노(UNO R3 ATmega328)와 아두이노 모터 쉴드(Adafruit L293D Motor Shield)를 선택하였다. 아두이노의 코드는 C++을 기반으로 만들어졌다. 따라서 코드의 문법은 모두 C++과 동일하다. 아두이노에서 모터쉴드를 제어하기 위한 헤더파일(AFMotor.h)이 제공되고 있으므로 이를 활용하였다. 아두이노의 코드는 크게 두 부분으로 구분된다. LED, 모터 등의 객체를 생성하고 객체들의 초기 설정을 해주는 부분인 void setup() 함수와 무한 반복되며 하드웨어의 실질적인 동작을 기술하는 부분인 void loop() 함수로 이루어진다. 먼저, 가장 첫 부분은 다음과 같다.
#include <AFMotor.h>
AF_DCMotor motor1(3); // M3에 연결
AF_DCMotor motor2(2); // M2에 연결
#include <AFMotor.h>는 Adafruit L293D Motor Shield를 활용하기 위한 라이브러리를 추가하는 부분이다. 미리 만들어져있는 헤더파일을 통해 모터 객체를 쉽게 생성하고, 다양한 메소드를 편리하게 사용할 수 있게 된다. 아래의 두 줄은 AFMotor 라이브러리에 정의되어있는 AF_DCMotor 클래스를 사용해 두 개의 모터를 제어하기 위해 각각 motor1, motor2 라는 모터 객체를 생성한다. 이때 생성자의 매개변수로 각각 3, 2를 넘겨주었는데, 이는 모터 쉴드의 4개의 모터 연결 포트 중 motor1은 3번 포트에, motor2는 2번 포트에 연결하겠다는 의미이다.
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println(“Motor test!”);
// turn on motor
motor1.setSpeed(0); // 모터 회전속도 설정
motor2.setSpeed(0);
motor1.run(RELEASE);
motor2.run(RELEASE);
// analog input pin을 output으로 초기화
pinMode(A0, OUTPUT); // RED
pinMode(A5, OUTPUT); // GREEN
}
Serial.begin(speed)는 아두이노가 시리얼 통신을 사용하게 만드는 메소드이다. Serial은 시리얼 통신과 관련된 메소드들이 포함되어있는 정적(static) 클래스이다. 메소드의 인자로 넘겨주는 speed 초당 몇 비트의 속도로 통신을 할지 설정하는 값이다. 이는 컴퓨터 쪽의 시리얼 통신 속도와 일치하여야 시리얼 모니터에 정상적으로 출력이 된다. 다음은 모터와 LED를 초기화하는 부분이다. setup() 함수 이전에 생성한 두 개의 모터 객체의 속도와 현재 구동 상태를 각각 0과 RELEASE 상태로 초깃값을 설정해 준다. 아두이노 보드에는 12개의 출력 핀과 6개의 아날로그 인풋 포트가 있다. 그런데 Adafruit L293D Motor Shield는 2번, 13번 핀을 제외하고는 모두 사용하는 방식으로 아두이노 보드에 장착된다. 따라서 모터를 구동시키는 것 외에 신호등을 구현하기 위한 두 개의 LED의 출력을 제어하기 위해서는 아날로그 인풋 포트를 디지털 아웃풋 핀으로 사용할 필요가 있었다. 그 설정을 해주는 부분이 pinMode() 함수이다.
void loop() {
uint8_t i;
delay(1000);
loop() 함수는 setup() 함수가 실행된 후 프로그램이 종료될 때까지 함수 내부의 내용이 무한 반복되며 실행된다. 먼저 uint8_t i; 는 loop() 함수 내부의 반복문에서 계속 사용할 지역변수 i를 선언하는 코드이다. 자료형 uint8_t 는 <stdint.h>에 정의되어있는 자료형으로, 8비트의 부호가 없는 정수형의 자료형을 나타낸다. 즉, 정수 0에서부터 255까지 표현할 수 있다. 아두이노 UNO R3 ATmega328는 8-bit의 프로세서를 가지고 있어 8비트 보다 큰 자료를 한 번에 처리하지 못하므로 해당 자료형을 사용한다. delay() 함수는 의미 그대로 코드를 실행하는데 시간을 지연시키는 역할을 한다. 함수의 인자로 전달받는 시간의 단위는 ms(밀리세컨드) 이므로 위의 예처럼 1000 을 넘기면 1000ms 즉 1초를 지연시킨다. 이 delay() 함수를 통해 신호등의 빨간불, 초록불이 켜지는 시간과 모터를 동작시키는 반복문의 시간을 제어할 수 있다.
Serial.print(“tick”);
// 정방향 회전
motor1.run(FORWARD);
motor2.run(FORWARD);
digitalWrite(A0, LOW); // RED off
digitalWrite(A5, HIGH); // GREEN on
// 모터 구동 시작
for (i=0; i<60; i++) {
motor1.setSpeed(180);
motor2.setSpeed(180);
delay(10);
}
// 모터 정지
motor1.run(RELEASE);
motor2.run(RELEASE);
delay(5000); Serial.print(“tick”);
// 정방향 회전
motor1.run(FORWARD);
motor2.run(FORWARD);
digitalWrite(A0, LOW); // RED off
digitalWrite(A5, HIGH); // GREEN on
// 모터 구동 시작
for (i=0; i<60; i++) {
motor1.setSpeed(180);
motor2.setSpeed(180);
delay(10);
}
// 모터 정지
motor1.run(RELEASE);
motor2.run(RELEASE);
delay(5000);
Serial.print(“tick”) 메소드는 아두이노 개발환경의 시리얼 모니터에 “tick”이라는 문자열을 출력한다. 이를 통해 loop() 함수 내부에서 해당 메소드까지 소프트웨어적으로 문제없이 실행되고 있음을 확인하기 위한 목적으로 활용한다. 초록불이 되고 모터가 정방향으로 구동되기 시작할 때 “tick”을, 초록불이 깜빡거리기 시작할 때 “tock”을, 빨간불이 되고 모터가 역방향으로 구동되기 시작할 때 “tock”을 출력하도록 하였다.
motor1.run(FORWARD); 는 모터를 회전시키기 위하여 모터 객체(motor1, motor2) 의 상태를 정지(RELEASE)에서 정방향 회전(FORWARD)로 변경시켜 주는 부분이다. digitalWrite(pin, value); 함수는 HIGH 또는 LOW 값을 디지털 핀에 출력하는 함수이다. setup() 함수에서 아날로그 입력 단자 A0, A5를 pinMode() 함수를 통해 디지털 출력 핀으로 설정해 주었기 때문에 A0, A5 단자에 대해서 HIGH, LOW의 값을 출력할 수 있다. A0 단자에는 빨간색의 LED를 연결하고, A5 단자에는 초록색의 LED를 연결할 것이므로, 빨간색 신호등은 끈 상태로, 초록색 신호등은 켜진 상태로 만들기 위해 digitalWrite() 함수의 value 인자를 각각 LOW, HIGH로 설정하였다.
초록불이 켜지고 난 다음은 올라가 있던 스마트 볼라드가 땅으로 내려올 차례이다. AF_DCMotor클래스의 메소드인 .setSpeed(speed) 메소드는 모터의 속력을 설정한다. speed 인자의 값으로 0에서 255까지의 값을 받을 수 있으며, 0은 꺼진 상태를, 255는 최대 속력을 나타낸다. 우리가 설정한 speed 값인 180은 어떤 정확한 수치를 나타내는 것이 아니다. DC 모터의 응답이 일반적으로 선형적이지 않으므로, 실제 RPM이 설정된 값인 180에 비례하게 나타나지는 않는다. 다양한 값으로 구동을 시켜본 결과 볼라드 구조물의 무게와 부하를 이겨내기 위한 적절한 속도를 구한 것이 180이다.
반복문의 한 루프에 10ms씩의 시간 지연이 들어가 있어 총 60번의 반복을 하므로 이론적으로는 총 0.6초가 걸리겠지만, 모터가 구동되는 시간으로 인해 시간이 조금 더 걸려 1초 내외로 동작을 마친다. 반복문의 실행을 마치고 나면 양쪽의 볼라드가 하강하여 땅으로 완전히 내려와 있는 상태가 된다. motor1.run(RELEASE); 메소드는 볼라드가 정지한 이후 두 개의 모터의 동작 상태를 정방향 구동 중에서 정지로 바꿔주는 부분이다. 또한, 초록불이 점멸하기 시작하기 전까지 5초 동안의 시간 지연을 준다.
Serial.print(“tock”);
// 초록불 점멸
for (i=0; i<5; i++) {
digitalWrite(A5, LOW);
delay(200);
digitalWrite(A5, HIGH);
delay(200);
}
초록불이 일정 시간이 지나 빨간불로 바뀌기 전 깜빡이는 기능을 수행하는 부분이다. 따라서 위에서 말한 대로 초록불이 점멸하기 전 Serial.print() 메소드를 통해 “tock”을 시리얼 모니터에 출력하여 프로그램이 정상 작동하고 있는지 확인한다. 초록색 LED가 연결된 A5 포트의 출력을 LOW, HIGH로 0.2초의 시간 지연을 두고 번갈아 가면서 5번 바꾼다. 다시 말해서, 초록불이 다섯 번 깜빡이고 끝난다.
Serial.print(“tech”);
// 역방향 회전
motor1.run(BACKWARD);
motor2.run(BACKWARD);
digitalWrite(A0, HIGH); // RED on
digitalWrite(A5, LOW); // GREEN off
// 모터 구동 시작
for (i=0; i<80; i++) {
motor1.setSpeed(200);
motor2.setSpeed(200);
delay(10);
}
// 모터 정지
motor1.run(RELEASE);
motor2.run(RELEASE);
delay(7000);
초록불이 깜빡거리기를 끝내고 빨간불로 바뀌면서 모터가 작동하여 볼라드가 올라가는 동작을 시키는 부분이다. 초록불이 되고 볼라드가 내려가는 동작을 하는 loop() 함수의 첫 번째 블록과 거의 같은 코드 구성을 하고 있다. 하지만 세세한 설정은 정반대이다. 모터가 구동되는 방향이 반대여야 하므로 이전에 FORWARD로 설정하였던 값을 BACKWARD로 바꾸고, 초록불과 빨간불의 켜지고 꺼짐도 반대로 바뀌었다. 모터 구동 부분의 반복문의 경우 반복 횟수가 위의 블록과 같지 않다. 같은 구조로 코드를 작성하여 실행시켜 보았을 때, 볼라드 구조물의 무게로 인해 볼라드가 내려가는 길이에 비해 올라가는 길이가 적었다. 따라서 반복문의 횟수를 더 크게 설정하여 올라가고 내려오는 길이가 거의 같도록 조절하였다. 또한, 모터의 상태를 정지(RELEASE)로 변경한 후 주는 시간 지연이 더 긴 것은 초록불과는 다르게 깜빡거리는 시간을 고려하지 않았기 때문이다.
4.4. 기대효과 및 예상되는 장애요인과 해결방안
스마트 볼라드가 실제로 도입된다면 필요에 따라 볼라드를 설치 및 제거함으로써 차량 통제가 필요한 곳에 널리 쓰일 수 있을 것이다. 예를 들어 주차장에서의 차량 통제나 인도의 불법 주정차 예방에도 사용될 수 있고, 큰 행사로 인해 넓은 지역의 대규모 차량 통제가 필요한 경우 손쉽게 스마트 볼라드를 이용하여 차량 진입을 막을 수 있다.
또한 스마트 볼라드는 횡단보도에서 지하철의 스크린 도어와 비슷한 역할을 해줄 수 있기 때문에 무단횡단 예방의 효과가 있고, 횡단보도에서의 교통사고 발생 위험을 상당히 낮출 수 있을 것으로 기대된다.
특히, 어린이 보호 구역이나 보행 약자가 많은 지역에서 스마트 볼라드가 빛을 발할 수 있는데 사람 없이도 24시간 교통 약자의 보행을 보호해줄 수 있어 교통 상황을 관리해주는 교통 경찰이나 경비원, 녹색 어머니회의 역할을 대신할 수 있다.
스마트 볼라드를 제작하는 과정에서 여러 좋은 아이디어가 나왔지만 직접 제작하는 데까지는 이르지 못하였다. 예를 들어 볼라드에 LED를 설치하여 야간에 어두운 길을 밝혀 주는 역할을 할 수도 있고, 센서를 부착해 사람을 인식하여 차가 없으면 신호가 바뀌고 자동으로 내려가게 하는 기능과 시간대 별로 보행자와 차량의 통행량 정보를 측정해 교통 정보도 수집할 수 있도록 할수 있을것이다. 그리고 볼라드가 움직이기 전에 음성안내를 해주어 보행자에게 미리 알려주는 기능도 추가되면 좋을 것 같다.
스마트 볼라드에서 예상되는 장애요인으로는 갑자기 움직이는 볼라드로 인한 보행자 피해와 볼라드의 설치 및 유지 관리 문제가 있다.
하지만 이런 문제는 향후 발전 방향에서 언급한 것처럼 볼라드가 움직이기 전에 LED점멸이나 음성 안내 메시지를 통해 보행자가 볼라드의 움직임을 미리 예측할 수 있도록 한다면 보행자가 볼라드의 움직임을 인지하지 못해 생기는 사고를 예방할 수 있을 것이다. 또한 스마트 볼라드는 땅 밑에 장치를 설치하여 볼라드가 올라오는 방식이므로 설치가 비교적 쉬운 편이고 외부 충격으로 인한 파손이 있다 하더라도 볼라드 기둥만 교체해 주면 되기 때문에 수리하기도 편리할 것이다. 또한 컴퓨터로 볼라드를 제어할 수 있기 때문에 볼라드 관리도 간편할 것으로 예상된다.
5. 참고
· 아두이노 코드 및 구동방법: https://youtu.be/V-MXQN3CjEE https://www.youtube.com/watch?v=D5JX2N-7zWo