산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

레이저 모듈로 구현하는 모스 부호 통신 – 아두이노 양방향 프로젝트

부품 및 소모품

부품 수량
아두이노 우노 (Arduino UNO) 2
브레드보드 2
레이저 송신 모듈 (Autodesk LASER TRANSMITTER) 1
포토 레지스터 (CdS 광센서) 1
점퍼 와이어 1세트

앱 및 온라인 서비스

프로젝트 개요

모스 부호란?

영숫자를 점(·)과 선(―) 조합으로 변환하는 통신 방식. 각 문자는 고유한 점/선 패턴을 가져 비밀/암호 통신에 활용됩니다. 본 프로젝트는 송신부(레이저)와 수신부(포토레지스터)로 구성되며, 수신부 알고리즘이 기존 방식보다 매우 단순하다는 점이 특징입니다.

레이저 모듈로 구현하는 모스 부호 통신 – 아두이노 양방향 프로젝트

1단계: 송신부 (레이저 발신)

레이저 모듈로 구현하는 모스 부호 통신 – 아두이노 양방향 프로젝트

하드웨어

배선

레이저 +극 → 아두이노 13번 디지털 핀 (코드상 정의)
레이저 -극 → 아두이노 GND

알고리즘

  1. 전송할 문자를 char 배열에 저장
  2. 레이저 제어 핀 정의 (13번)
  3. 모스 부호 속도 설정 (dotLen 기본 200ms)
  4. 점(·) = dotLen, 선(―) = dotLen × 3, 요소 간 간격 = dotLen, 문자 간 간격 = dotLen × 3, 단어 간 간격 = dotLen × 7
  5. 입력 문자를 switch-case로 매핑해 해당 점/선 패턴으로 레이저 ON/OFF 제어

2단계: 수신부 (광신호 수신 및 디코딩)

레이저 모듈로 구현하는 모스 부호 통신 – 아두이노 양방향 프로젝트

하드웨어

배선

LDR 한 쪽 → 아두이노 5V
LDR 다른 쪽 → 10kΩ 저항 + 아날로그 입력 A0
저항 다른 쪽 → 아두이노 GND

중요: 외부광 차단을 위해 LDR을 검은 도화지 돔으로 덮어주세요. 레이저 미조사 시 아날로그 값 < 1000, 조사 시 > 1000이 되도록 환경 조정 필요.

수신 알고리즘 (핵심 아이디어)

  1. 레이저 미조사 시 아날로그 값 < 1000, 조사 시 > 1000
  2. 임계값 1000 기준으로 양자화: 1000 초과 = '1', 이하 = '0'
  3. 루프 내에서 '1'의 개수(a)와 '0'의 개수(f) 카운트
  4. 각 문자는 고유한 (a, f) 쌍을 가짐 → 매핑 테이블로 디코딩

예: 'a'는 (4, 10), 'b'는 (6, 8), 'e'는 (1, 13) 등

제한사항

제공 코드는 일부 문자만 디코딩합니다. 조합 로직 확장 시 전체 영숫자 지원 가능. 본 코드의 주목적은 알고리즘 이해와 동작 검증입니다.

코드

CODE-1: 레이저 송신부 제어

int led13 = 13;
int dotLen = 200;
int dashLen = dotLen * 3;
int elemPause = dotLen;
int Spaces = dotLen * 3;
int wordPause = dotLen * 7;

char stringToMorseCode[] = "HELLO WORLD";  // 전송할 메시지

void setup() {
  pinMode(led13, OUTPUT);
}

void loop() {
  for (int i = 0; i < sizeof(stringToMorseCode) - 1; i++) {
    char tmpChar = stringToMorseCode[i];
    tmpChar = toLowerCase(tmpChar);
    GetChar(tmpChar);
  }
  LightsOff(8000);  // 메시지 간 긴 간격
}

void MorseDot() {
  digitalWrite(led13, HIGH);
  delay(dotLen);
}

void MorseDash() {
  digitalWrite(led13, HIGH);
  delay(dashLen);
}

void LightsOff(int delayTime) {
  digitalWrite(led13, LOW);
  delay(delayTime);
}

void GetChar(char tmpChar) {
  switch (tmpChar) {
    case 'a': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'b': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'c': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'd': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'e': MorseDot(); LightsOff(elemPause); break;
    case 'f': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'g': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'h': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'i': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'j': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'k': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'l': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'm': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'n': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'o': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'p': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 'q': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'r': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 's': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    case 't': MorseDash(); LightsOff(elemPause); break;
    case 'u': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'v': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'w': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'x': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'y': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
    case 'z': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
    default: LightsOff(Spaces);  // 공백 처리
  }
}

CODE-2: 수신부 디코딩

int sensorPin = 0;   // A0
int sensorValue = 0;
int a, f;  // '1' 카운트, '0' 카운트

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  
  if (sensorValue > 1000) {  // 레이저 감지 시
    for (int i = 0; i <= 13; i++) {
      sensorValue = analogRead(sensorPin);
      if (sensorValue > 1000) {
        a++;   // '1' (점/선) 카운트
      } else {
        f++;   // '0' (간격) 카운트
      }
      delay(200);
    }
  }
  
  // 패턴 매칭으로 문자 판별
  if (a == 4 && f == 10) Serial.print("a");
  if (a == 6 && f == 8)  Serial.print("b");
  if (a == 8 && f == 6)  Serial.print("c");
  if (a == 1 && f == 13) Serial.print("e");
  if (a == 2 && f == 12) Serial.print("i");
  if (a == 10 && f == 4) Serial.print("j");
  if (a == 7 && f == 7)  Serial.print("g");
  if (a == 9 && f == 5)  Serial.print("o");
  if (a == 3 && f == 11) Serial.print("s");
  
  f = a = 0;
  delay(200);
}

커스텀 파트 및 인클로저

레이저 모듈로 구현하는 모스 부호 통신 – 아두이노 양방향 프로젝트

검은 도화지로 LDR 차광 돔 제작

회로도

레이저 모듈로 구현하는 모스 부호 통신 – 아두이노 양방향 프로젝트

제조공정

  1. 레이저 마킹 종합 가이드: 유형, 이점, 적용 분야 총정리
  2. 레이저 포인터: 설계, 제조, 안전성 개요
  3. 반도체 레이저: 현대 기술을 위한 정밀 광원
  4. 바코드 스캐너: 기술, 설계 및 미래 트렌드
  5. 레이저 유도 미사일: 개발, 제조 및 전략적 영향
  6. 지그비 센서와 Gravio 엣지 플랫폼으로 인터랙티브 레이저 프로젝터 만들기
  7. 라즈베리 파이 4와 HiFive1 보드 간 UART 통신 구축
  8. 라즈베리 파이 기반 제스처 제어 로봇
  9. 아두이노만으로 DTMF 디코더 구축하기 – 추가 IC 불필요
  10. 산업 제조를 위한 로우코드 솔루션의 4가지 핵심 이점