"파이브가이즈"의 두 판 사이의 차이

신소재공학과 캡스톤위키
이동: 둘러보기, 검색
(개발 과제의 배경)
(개발 과제의 배경)
33번째 줄: 33번째 줄:
 
  현재 지하철 내에는 음성 방송 외에 교통 정보를 안내하는 시스템이 존재하지 않으므로 상기 시스템은 시각장애인 및 교통약자에게 높은 효용가치를 지닌다.
 
  현재 지하철 내에는 음성 방송 외에 교통 정보를 안내하는 시스템이 존재하지 않으므로 상기 시스템은 시각장애인 및 교통약자에게 높은 효용가치를 지닌다.
 
====개발 과제의 배경====
 
====개발 과제의 배경====
2023년 현재, 시각 장애인의 지하철 이용은 여전히 많은 어려움이 있는 것으로 나타나고 있습니다. [윤지영 외. “시각장애인 및 저시력자를 위한 버스 도착 안내 어플리케이션”, 한국HCI학회, 856-861. 2018]에 의하면 시각장애인이 이용하는 교통수단을 살펴보면 장애인 콜밴의 이용률이 가장 높으며(31%)  다음으로 지하철/전철(28%)인 것으로 나타납니다. 시각장애인이 대중교통을 이용하기에 불편한 이유는 교통안내가 부족한 점과 거주지에서 버스 정류소 또는 지하철역까지 이동이 어려운 점이 동일하게 17%로 높게 나타납니다. 이 밖에도 지하철역의 편의시설이 충분히 갖춰져 있지 않은 경우가 많습니다. 점자블록이 제대로 설치되어 있지 않거나, 점자 표지판이 표기되어 있지 않아 시각 장애인이 이동하기 어렵습니다. 또한, 지하철 안내방송이 너무 빠르거나, 소음이 심해 시각 장애인이 알아듣기 어렵습니다.
+
2023년 현재, 시각 장애인의 지하철 이용은 여전히 많은 어려움이 있는 것으로 나타나고 있습니다. [윤지영 외. “시각장애인 및 저시력자를 위한 버스 도착 안내 어플리케이션”, 한국HCI학회, 856-861. 2018]에 의하면 시각장애인이 이용하는 교통수단을 살펴보면 장애인 콜밴의 이용률이 가장 높으며(31%)  다음으로 지하철/전철(28%)인 것으로 나타납니다. 시각장애인이 대중교통을 이용하기에 불편한 이유는 교통안내가 부족한 점과 거주지에서 버스 정류소 또는 지하철역까지 이동이 어려운 점이 동일하게 17%로 높게 나타납니다. 이 밖에도 지하철역의 편의시설이 충분히 갖춰져 있지 않은 경우가 많습니다. 점자블록이 제대로 설치되어 있지 않거나, 점자 표지판이 표기되어 있지 않아 시각 장애인이 이동하기 어렵습니다. 또한, 지하철 안내방송이 너무 빠르거나, 소음이 심해 시각 장애인이 알아듣기 어렵습니다.
  
 
  하지만, 최근 들어 시각 장애인을 위한 지하철 이용 편의 개선을 위한 노력이 이어지고 있습니다. 서울교통공사는 지하철역마다 음성유도기를 설치하고, 또 타지하철 앱을 통해 실시간 위치 안내를 제공하고 있습니다. 또한, 카카오맵은 승강장 연단 정보를 음성으로 안내하는 기능을 제공하고 있습니다. 국내에는 NAVIWALK-STICK이 RFID를 적용하여 시각장애인의 보행 및 위치정보를 제공하는 기술로 개발되었으며 RF 지팡이, RF IC TAG, TTS 단말기로 구성되어 있습니다.
 
  하지만, 최근 들어 시각 장애인을 위한 지하철 이용 편의 개선을 위한 노력이 이어지고 있습니다. 서울교통공사는 지하철역마다 음성유도기를 설치하고, 또 타지하철 앱을 통해 실시간 위치 안내를 제공하고 있습니다. 또한, 카카오맵은 승강장 연단 정보를 음성으로 안내하는 기능을 제공하고 있습니다. 국내에는 NAVIWALK-STICK이 RFID를 적용하여 시각장애인의 보행 및 위치정보를 제공하는 기술로 개발되었으며 RF 지팡이, RF IC TAG, TTS 단말기로 구성되어 있습니다.

2023년 12월 19일 (화) 01:23 판

프로젝트 개요

기술개발 과제

국문 : 시각 장애인을 위한 지하철 내 실시간 점자 안내판

영문 : Real-time Braille Information Board for the Blind in the Subway

과제 팀명

파이브가이즈

지도교수

김현식 교수님

개발기간

2023년 9월 ~ 2023년 12월 (총 4개월)

구성원 소개

서울시립대학교 신소재공학과 20184500** 이*형(팀장)

서울시립대학교 신소재공학과 20184500** 김*호

서울시립대학교 신소재공학과 20184500** 석*창

서울시립대학교 신소재공학과 20184500** 이*서

서울시립대학교 신소재공학과 20184500** 한*창

서론

개발 과제의 개요

개발 과제 요약

본 과제에서는 지하철 내 시각장애인을 위한 실시간 점자 안내판을 제작한다. 제작된 점자 안내판은 모터를 통해 지하철 노선도에 따라 실시간으로 점자판을 표시한다.
지하철 내 벽면에 부착하는 기기이므로 편리하게 이용할 수 있고 비장애인이 보는 노선도처럼 현재 위치까지 파악 가능하므로 시각장애인의 교통상황 파악에 도움이 된다.
현재 지하철 내에는 음성 방송 외에 교통 정보를 안내하는 시스템이 존재하지 않으므로 상기 시스템은 시각장애인 및 교통약자에게 높은 효용가치를 지닌다.

개발 과제의 배경

2023년 현재, 시각 장애인의 지하철 이용은 여전히 많은 어려움이 있는 것으로 나타나고 있습니다. [윤지영 외. “시각장애인 및 저시력자를 위한 버스 도착 안내 어플리케이션”, 한국HCI학회, 856-861. 2018]에 의하면 시각장애인이 이용하는 교통수단을 살펴보면 장애인 콜밴의 이용률이 가장 높으며(31%)  다음으로 지하철/전철(28%)인 것으로 나타납니다. 시각장애인이 대중교통을 이용하기에 불편한 이유는 교통안내가 부족한 점과 거주지에서 버스 정류소 또는 지하철역까지 이동이 어려운 점이 동일하게 17%로 높게 나타납니다. 이 밖에도 지하철역의 편의시설이 충분히 갖춰져 있지 않은 경우가 많습니다. 점자블록이 제대로 설치되어 있지 않거나, 점자 표지판이 표기되어 있지 않아 시각 장애인이 이동하기 어렵습니다. 또한, 지하철 안내방송이 너무 빠르거나, 소음이 심해 시각 장애인이 알아듣기 어렵습니다.
하지만, 최근 들어 시각 장애인을 위한 지하철 이용 편의 개선을 위한 노력이 이어지고 있습니다. 서울교통공사는 지하철역마다 음성유도기를 설치하고, 또 타지하철 앱을 통해 실시간 위치 안내를 제공하고 있습니다. 또한, 카카오맵은 승강장 연단 정보를 음성으로 안내하는 기능을 제공하고 있습니다. 국내에는 NAVIWALK-STICK이 RFID를 적용하여 시각장애인의 보행 및 위치정보를 제공하는 기술로 개발되었으며 RF 지팡이, RF IC TAG, TTS 단말기로 구성되어 있습니다.
이러한 노력에도 불구하고, 시각 장애인이 지하철을 이용하기 위해서는 여전히 많은 개선이 필요합니다. 그 예로, 지하철 내 목적지 및 플랫폼 정보는 시각 장애인에게 음성 안내로만 이뤄지고 소리가 작거나 안내 되지 않는 경우도 있습니다. 철도차량의 소음권고기준 및 검사방법 등에 관한 규정에서는 권고 주행소음 기준 최대 92dB(데시벨)로 규정하고 있습니다. 소음이 심하면 90~100dB 이상으로 시끄러워지기도 하며, 이는 국가소음정보시스템에서 언급하는 난청 증상 발현 구간으로 안내 방송이 들리지 않을 가능성이 충분합니다.
따라서 본 과제를 통해 지하철 내에서도 시각 장애인에게 목적지 및 플랫폼 정보를 원활하게 전달하겠습니다.

개발 과제의 목표 및 내용

내용

관련 기술의 현황

관련 기술의 현황 및 분석(State of art)

  • 전 세계적인 기술현황

내용

  • 특허조사 및 특허 전략 분석

내용

  • 기술 로드맵

내용

시장상황에 대한 분석

  • 경쟁제품 조사 비교

내용

  • 마케팅 전략 제시

내용

개발과제의 기대효과

기술적 기대효과

내용

경제적, 사회적 기대 및 파급효과

내용

기술개발 일정 및 추진체계

개발 일정

내용

구성원 및 추진체계

내용

설계

설계사양

제품의 요구사항

내용

설계 사양

내용

개념설계안

내용

이론적 계산 및 시뮬레이션

[Python 코드]

 python 코드의 핵심 요소는 역 표시 알고리즘, 역 이동 알고리즘, Wi-Fi를 통한 아두이노와의 통신이다.
 

1) 역 표시 알고리즘 def gogo():

   global station,station_num, next_station, now_station
   
   # 초기화
   station_num = 1
   for widget in frame_up.winfo_children():
       widget.destroy()
   # Station 목록 생성
   str_station = cbx_str.get()
   end_station = cbx_end.get()
   # 조건에 따라 역 목록 불러오기
   if end_index > -1 and str_index > -1: # 일반노선에 대해    
       # 다른라인: 충청 출발 경기북부 도착
       if str_station in station_3 and  end_station in station_1:
           station = station_3[station_3.index(str_station)::-1] 
           + list(reversed(station_1[end_index:]))
       
       # 다른 라인: 경기 출발 충청 도착
       elif str_station in station_1 and end_station in station_3: 
           station = station_1[str_index:] 
           + station_3[:station_3.index(end_station)] 
           + [station_3[station_3.index(end_station)]]
                         
       else: # OG station 내에서 이어져 있는 라인 (같은 라인, 인천~경기 북부 라인)
           if end_index < str_index: # 상행
               station = OG_station[str_index:end_index:-1] + [OG_station[end_index]]
           else: # 하행
               station = OG_station[str_index:end_index] + [OG_station[end_index]]

# 이후 급행, 특급에 따른 역 불러오기 코드

   now_station = station[0]
   if next_station != "":
       parameter = OG_station.index(next_station) - OG_station.index(now_station)
       sock.sendall(f"{parameter}\n".encode())
   next_station = station[1]
   parameter = OG_station.index(now_station) - OG_station.index(next_station)
   sock.sendall(f"{parameter}\n".encode())
 GUI에서 선택한 지하철의 출발역과 도착역 정보를 받으면, 해당된 역 list를 바탕으로 GUI에 역 리스트를 표시한다. 이 과정에서 기존에 진행 중이던 역이 있을 시 모터를 현재 출발역으로 돌리고, 역의 표시와 동시에 지하철 출발로 인식하여 이동을 진행한다.

2) 역 이동 알고리즘 def drive():

   global station, station_num, next_station, now_station
   i = station_num
   if i == len(station) - 1:
       return
   if i != len(station)-1: #끝까지 다 안했다면
       globals()[f"label_{i}"].config(font=start_font) # (구)다음역 -> (현) 지금역
       globals()[f"label_{i+1}"].config(font=arrive_font) # (구)다다음역 -> (현) 다음역
       globals()[f"label_{i}"].config(fg = "#5a64f6") # (구)다음역 -> (현) 지금역
       globals()[f"label_{i+1}"].config(fg = "#ff4d4d") # (구)다다음역 -> (현) 다음역
       globals()[f"arrow_{i+1}"].config(text="🚇")
       globals()[f"arrow_{i+1}"].config(font=subway_font)
       
       globals()[f"arrow_{i}"].config(text="➡")
       globals()[f"arrow_{i}"].config(font=arrow_font)
       
       globals()[f"label_{i-1}"].config(font=button_font) # (구)현재역 -> (현) 이전역
       globals()[f"label_{i-1}"].config(fg = "black") # (구)현재역 -> (현) 이전역
       now_station = station[i]
       next_station = station[i+1]
       parameter = OG_station.index(now_station) - OG_station.index(next_station) 
       sock.sendall(f"{parameter}\n".encode())
   station_num += 1
 GUI의 "다음 역" 버튼을 누르면 GUI에 표시된 Label의 색을 바꾸고 지하철 아이콘을 이동 시켜 다음 역, 현재 역, 지하철 위치를 표시한다. 또한 현재역과 다음역의 OG_station(=점자판에서의 역 순서 위치) index를 찾아 이동할 step을 아두이노로 전달한다.

3) Wi-Fi를 통한 아두이노와의 통신

esp8266_ip = "192.168.145.70" esp8266_port = 80 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((esp8266_ip, esp8266_port))

 socket 라이브러리를 통해 Wi-Fi와 통신한다. 이때 연결할 IP의 설정은 아두이노를 통해 확인한다. 데이터의 전달은 역 이동, 표시 알고리즘에서 있던

sock.sendall(f"{parameter}\n".encode())를 통해서 전달한다.

[Arduino 코드]

 Wi-Fi 연결과 모터 구동을 위한 코드에 대해 각 부분 별로 나눠서 다음과 같이 설명을 할 수 있습니다.

1) 라이브러리 및 상수 선언

  1. include <ESP8266WiFi.h>
  2. include <AccelStepper.h>

// Wi-Fi 구동 상수 설정 const char *ssid = "AndroidHotspot4506"; const char *password = "qwerty123456"; const int serverPort = 80;

// 스텝모터 구동 상수 설정 const int en = D2; // Enable 핀 const int step = D3; // Step 핀 const int dir = D4; // Direction 핀

AccelStepper stepper(AccelStepper::DRIVER, step, dir);

 ESP8266와 AccelStepper 라이브러리를 사용하기 위한 헤더 파일을 포함하고, Wi-Fi 연결 및 서보 모터 제어를 위한 변수 및 상수를 선언합니다.

2) setup 함수 설정 WiFiServer server(serverPort);

void setup() {

 Serial.begin(115200);  
 WiFi.begin(ssid, password);   // 와이파이 연결
 pinMode(LED_BUILTIN, OUTPUT); // 우노 보드 내장 LED 설정
 while (WiFi.status() != WL_CONNECTED) { // 와이파이 미연결 시, 연결 중일 때
   digitalWrite(LED_BUILTIN, HIGH); // 우노 보드 LED 점멸
   delay(250);
   digitalWrite(LED_BUILTIN, LOW);
   delay(250);
 }
 Serial.println("Connected to WiFi");
 Serial.println(WiFi.localIP());
 server.begin();
 // 각 핀을 출력 모드로 설정
 pinMode(en, OUTPUT);
 digitalWrite(en, LOW); 
 stepper.setMaxSpeed(1000);  // 최대 속도 설정 (스텝/초)
 stepper.setAcceleration(500);  // 가속도 설정 (스텝/초^2)
 stepper.moveTo(0);  // 초기 위치 설정

}

 setup 함수에서는 시리얼 통신을 시작하고, LED 핀을 출력으로 설정하며, Wi-Fi에 연결하고 서버를 시작한다. 이때 Wi-Fi 연결 완료 상태를 확인하기 위해 LED를 점멸한다. Wi-Fi 연결 완료 시 로컬 IP를 출력하고 서버를 시작한다. 또한, 스텝 모터를 제어하기 위한 핀 및 가속도, 최대 속도 등의 초기 설정을 수행한다.

2) loop 함수 설정 void loop() {

 WiFiClient client = server.available();
 if (client) {
   Serial.println("Client connected"); // 클라이언트 연결 확인
   // Read the data from the client
   while (client.connected()) {
     if (client.available()) { // 파이썬에서 클라이언트로 보낸 신호 확인
       delay(1000);        
       int step_count = client.parseInt(); // 클라이언트에서 보낸 신호 정수로 받기
       Serial.println(step_count);
       if (step_count != 0) {
         // 모터를 지정된 스텝 수만큼 이동
         stepper.moveTo(stepper.currentPosition() + (step_count * 100));
         // 이동이 완료될 때까지 대기
         while (stepper.isRunning()) {
           stepper.run();
         }
       }
     }
   } 
 }

}

 loop 함수에서는 클라이언트의 연결을 확인하고, 클라이언트로부터 수신된 데이터를 읽어들여 스텝 모터를 제어한다. 클라이언트가 연결되면 데이터를 읽어들이고, 클라이언트로부터 수신된 데이터를 처리하여 스텝 모터를 움직인다. 클라이언트로부터 전달된 스텝 수를 읽어들여, 스텝 모터를 해당 스텝 수만큼 이동하도록 설정하고 이동이 완료될 때까지 대기한다.




[점자 1칸의 Step 수 calibration]


1step당 angle θ= step angle * microstep = 1.8° * 1/4 = 0.45° 1step당 움직이는 길이 l = 2πr*θ/360 = 2*3.14*20*0.45/360 = 0.157mm 벨트의 전체 길이 = 590mm 역 한 칸을 이동하기 위한 step = 전체 길이 / 역 개수 / l = 590 / 24 / 0.157 = 157 step

기기의 오차를 감안하였을 때 이론적 값을 토대로 실제로 기기를 구동해보며 step을 조절하였고, 한 칸을 이동하기 위한 step수로 147 step을 얻었다.

상세설계 내용

내용

결과 및 평가

완료 작품의 소개

프로토타입 사진 혹은 작동 장면

내용

포스터

내용

관련사업비 내역서

내용

완료작품의 평가

내용

향후계획

내용

특허 출원 내용

내용