시각 장애인의 유일한 소통 수단은 말하기와 듣기인 반면, 청각 장애인은 타이핑과 보기만 가능합니다. 이를 활용해보겠습니다!
시각 장애인 → 청각 장애인:
음성 → 텍스트 → 화면 표시
청각 장애인 → 시각 장애인:
타이핑 → 텍스트 → 음성
이제 이를 하드웨어로 구현해보겠습니다.
1단계: 하드웨어 설정
아두이노 우노 또는 호환 보드
LCD (이 튜토리얼에서는 16x2 사용)
스마트폰
포텐셔미터 (10kΩ면 충분)
2단계: 연결
1Sheeld를 사용하려면 먼저 1Sheeld 라이브러리를 다운로드하여 아두이노에 추가해야 합니다. 또한 1Sheeld 앱을 휴대폰에 다운로드하여 설치해야 합니다. 1Sheeld 사이트에서 받을 수 있습니다: https://1sheeld.com/downloads/
1Sheeld를 아두이노에 연결하고 코드 업로드하는 방법은 다음 튜토리얼을 따르세요: https://1sheeld.com/tutorials/getting-started/
회로가 조금 지저분해 보일 수 있지만 단순한 LCD 회로입니다:
LCD RS 핀 → 디지털 핀 12
LCD Enable 핀 → 디지털 핀 11
LCD D4 핀 → 디지털 핀 5
LCD D5 핀 → 디지털 핀 4
LCD D6 핀 → 디지털 핀 3
LCD D7 핀 → 디지털 핀 2
LCD R/W 핀 → 그라운드
LCD VSS 핀 → 그라운드
LCD VCC 핀 → 5V
10kΩ 저항 양단 → +5V와 그라운드
와이퍼 → LCD VO 핀 (핀 3)
이제 통신은 다음과 같이 이루어집니다:
시각 장애인 → 청각 장애인
음성 인식 → 텍스트 → LCD
청각 장애인 → 시각 장애인
키보드 → 텍스트 → 음성 합성(Text-to-Speech)
기본적으로 음성 인식이 음성을 텍스트로 변환하여 LCD로 보내면 청각 장애인이 볼 수 있습니다. 음성 합성은 키보드에서 텍스트를 받아 음성으로 변환하여 시각 장애인이 들을 수 있게 합니다.
1Sheeld 앱에서 음성 인식, 키보드, 음성 합성, SMS 실드를 선택해야 합니다. SMS 실드를 사용하면 멀리 있는 연락처에게도 메시지를 보낼 수 있습니다. 작동 방식을 보여주는 비디오가 있습니다.
이제 무엇을 하려는지 이해하셨으니, 코드에 대해 이야기해보겠습니다.
3단계: 소프트웨어
#define CUSTOM_SETTINGS
#define INCLUDE_VOICE_RECOGNIZER_SHIELD
#define INCLUDE_TEXT_TO_SPEECH_SHIELD
#define INCLUDE_KEYBOARD_SHIELD
#define INCLUDE_SMS_SHIELD
#define INCLUDE_TERMINAL_SHIELD
#define INCLUDE_VIBRATION_SHIELD
#include
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
String msg;
int sent = 0;
int i = 0;
String phoneNum = ""; // 여기에 전화번호 입력
int patternOne[6] = {1000, 2000, 1000, 2000, 1000, 2000};
int patternOneSize = 6;
void setup() {
OneSheeld.begin();
VoiceRecognition.start();
lcd.begin(16, 2);
}
기본적으로 사용할 라이브러리를 추가하고 나중에 사용할 변수들을 초기화합니다. 진동 센서를 사용할 예정이라 patternOne과 patternOneSize 변수는 그와 관련됩니다. 먼 거리 통신을 위해 SMS 실드도 사용할 것이므로, 보낼 SMS의 전화번호를 담을 phoneNum 변수를 추가했습니다.
// 시각 장애인 → 청각 장애인
if (VoiceRecognition.isNewCommandReceived()) {
String msg1 = VoiceRecognition.getLastCommand();
// 사용자가 먼저 "sms"라고 말하면 원거리 연락처로
if (msg1.substring(0, 3) == "sms") {
String msg1f = msg1.substring(3);
SMS.send(phoneNum, msg1f);
TextToSpeech.say("sms sent");
delay(4000);
}
// 가까운 연락처
else {
if (msg1.length() > 16) {
lcd.clear();
lcd.setCursor(0, 0);
for (int i = 0; i <= 16; i++) {
lcd.print(msg1[i]);
}
lcd.setCursor(0, 1);
for (int j = 16; j <= msg1.length() - 1; j++) {
lcd.print(msg1[j]);
}
} else {
lcd.clear();
lcd.print(msg1);
}
}
}
이 부분에서 원거리 연락처와 가까운 연락처 두 가지 경우를 추가했습니다. 멀리 있는 연락처에게는 시각 장애인이 먼저 "SMS"라고 말해야 합니다. 그렇지 않으면 그냥 LCD에 표시됩니다. 또한 LCD 자체도 두 가지 경우가 있는데, 메시지가 16자보다 길면 두 번째 줄로 넘어가도록 알려줘야 합니다. 한 줄에 16자만 표시할 수 있기 때문입니다.
void MsgBuild(char pC) {
i++;
if (sent < 2) {
if (pC == 'S') {
sent += 1;
msg += pC;
} else {
sent = 0;
msg += pC;
}
} else if (sent = 3) {
i = i - 3;
msg.remove(i);
msg.toLowerCase();
}
}
이 부분은 조금 까다로우니 잘 따라오세요. 이 함수는 키보드가 사용될 때 호출됩니다. 이 함수는 기본적으로 두 가지 일을 합니다: 첫째, 키보드로 입력하는 모든 단일 문자를 가져와 나중에 보낼 메시지를 구성합니다. 둘째, 지금 메시지를 보낼지 확인합니다. 실드 키보드의 엔터 버튼을 제대로 사용할 수 없어서 대신 's' 버튼을 연속 3번 누르면 메시지를 보내도록 했습니다. 물론 다른 버튼으로 변경 가능합니다. 이전과 마찬가지로 원거리 연락처에게는 먼저 SMS를 입력해야 합니다.