회로

모스 부호 번역기 (Light -> Text & Text -> Light) : 5 단계 (그림 포함)

#KoreanPronunciation Help - Why does 네 sound like 데? ㄴ/ㄷ and ㅁ/ㅂ

#KoreanPronunciation Help - Why does 네 sound like 데? ㄴ/ㄷ and ㅁ/ㅂ

차례:

Anonim

이것은 자동화 대회에서 필자의 입장을 위해 작성된 것으로, 약간의 코드가 포함 된 것을 시도하고 싶다.

프로젝트는 버튼으로 전환 할 수있는 두 가지 기본 상태 (읽기 빛 및 쓰기 빛)로 나뉩니다

Light-Text를 텍스트로 변환하는 것은 가장 어려운 부분이었습니다. 점과 대시를 구별 할 필요가있는 LDR을 사용하여 빛이 꺼질 때까지 빛의 진행 시간을 추적해야했습니다. 또한 문자와 단어의 끝을 구별해야했습니다. 빛이 사라질 때까지 시간을 추적합니다.

그러나 가장 흥미로운 부분은 모스 코드 그래프를 나타 내기 위해 이진 트리와 노드 클래스를 만들었습니다.

그래서 나는 나무를 통과하는 많은 시간과 처리 능력을 절약 할 수 있었고 간단한 논리로 도트와 대쉬 시퀀스에서 문자를 찾았다.

도트 = 왼쪽 자식

대쉬 = 오른쪽 아이

어레이에서 선형 적으로 테스트하고 문자별로 비교하는 대신

2 - 텍스트를 빛으로 변환하기 위해 4X4 키패드를 4X4X2로 바꿨 기 때문에 모든 영어 알파벳 (숫자는 불행히도 포함되지 않음)을 나타낼 수 있습니다. 이전의 교훈에서 그렇게 할 수 있습니다. 그 다음 텍스트를 LED 라이트로 표현한 도트 및 대시 시퀀스로 변환해야했습니다.

Unity3D는 코드와 pproject를 시각화하는 데 사용되었으며, 쉽게 LCD 화면으로 대체 될 수 있었고 100 % arduino가되었습니다. :)

용품:

1 단계 : 구성 요소 가져 오기

1- LDR

2- LED

3- 2 10Kohm 저항기

4 푸시 버튼

5 - 키패드 4X4

6- 점퍼 전선 (남성에서 남성까지)

2 단계 : 배선

LDR은 한쪽 끝에서 10Kohm의 저항을 통해 일정한 5V를 가져야하며 다른 쪽 끝은 접지에 연결되어야합니다

그러나 LED는 한쪽 끝의 저항기를 통해 A 디지털 핀 (4)에 연결되고 다른 쪽 끝은 접지에 연결됩니다

내가 사용하는 버튼에 대해서는 저항 기술을 끌어 당겨 접지와 digitalPin (4)

키패드에는 디지털 핀 5-12에서 연결된 8 개의 전선이 있습니다.

3 단계 : Unity 인터페이스 구축

우리는 UI 캔버스를 사용하여 각각의 텍스트 구성 요소, 텍스트를 표시하는 LCD 및 두 개의 표시 등 상태 (Light to Text)를 나타내는 다른 이미지가 쓰기 상태 (Text To Light) 인 3 개의 이미지를 생성합니다.

내가 사용한 두 개의 스프라이트를 통합했고 intrested 한 사람들에게 비디오 자습서를 제공합니다.

4 단계 : 코드 : Arduino

최종 코드는 여기에서 찾을 수 있습니다 (BinaryTree와 Node 클래스를 MorseCode.ino 파일에 추가하십시오)

모스 식 부호

코드는 크게 세 단계로 나뉩니다.

1- 푸시 버튼을 통해 읽기 상태와 쓰기 상태간에 전환

2- (쓰기 상태) 키패드에서 텍스트 입력을 가져 와서 LED 표시 등으로 표시된 점 및 대시 시퀀스로 변환합니다.

3- (Reading 상태)는 가벼운 입력을 위해 LDR을 모니터하고 문자와 단어 사이의 점, 대시 및 띄어쓰기를 구별합니다. 문자와 점을 순서대로 나열하면 이진 트리를 사용하여 문자 표현을 찾습니다.

#포함
#include "BinaryTree.h"#include "Node.h"#include

const 바이트 행 = 4; const 바이트 열 = 4; const int LedPin = 4; int holdDelay = 500; // 각 보류가 지속되는 시간 int int dotDelay = 1000; int n = 2; // 각 키가 나타내는 문자의 수 int state = 0; // 홀드가 발생했는지 그리고 얼마나 오랫동안 지속되었는지를 나타 내기 위해 사용됨, state = 0 홀드 없음, state = 1 short hold, state = 2 long char key = 0; 문자열 텍스트 = ""; String Array 26 = { ".-", "-…", "-.-.", "- ..", ".", "..-.", "-." …. ",".--- ","----- ","- ","- ","--- "," - ","- .- ",".-. ","… ","- ","..- ","…- ",".-- ","- " - ","- .-- ","- .. "}};

// 키 패드에서와 같이 키 맵을 정의 할 것입니다 : * 각 문자는 3 개의 간격을두고 있습니다. n 개의 char 키 rows columns = {{ 'a', 'c', 'e', ​​'g '', '', '', '', '' '' '' '' '' '' '' '' '' '' ' , '#'}};

byte rowPins rows = {12, 11, 10, 9}; 바이트 columnPins columns = {8, 7, 6, 5};

키패드 키패드 = 키패드 (makeKeymap (keys), rowPins, columnPins, rows, columns);

const int ButtonPIN = 3; bool isReading = false;

QueueList 단어; bool sendData = false; 부울 lightOn = 거짓; 부호없는 long elapsedTime = 0; 부호없는 long elapsedTimeOff = 0; 부호없는 long previousTime = 0; 부호없는 long previousTimeOff = 0; char 데이터; BinaryTree * 트리; void setup () {// 설정 코드를 여기에 입력하여 한 번 실행합니다. Serial.begin (9600); pinMode (ButtonPIN, INPUT); pinMode (LedPin, OUTPUT); digitalWrite (ButtonPIN, HIGH);

트리 = NULL; tree = new BinaryTree (); }

void loop () {// 주 코드를 여기에 넣어 반복적으로 실행합니다 : if (digitalRead (ButtonPIN) == LOW) {isReading =! isReading; Serial.println ( "0"); 지연 (500); }

if (isReading) {char temp = keypad.getKey ();

if ((int) keypad.getState () == PRESSED) {

if (temp! = 0) {key = temp; }} if ((int) keypad.getState () == HOLD) {state ++; state = constrain (state, 1, n - 1); 지연 (holdDelay); }

if ((int) keypad.getState () == RELEASED) {

if (key == '#') {textToLight (text); text = ""; Serial.println ( "#"); } else if (key == '') {text + = ""; Serial.println ( ""); } else {

키 + = 상태; int index = key - 97; 텍스트 + = 배열 ​​인덱스; Serial.println (key); } 상태 = 0;

}

} else {int data = analogRead (A0); if (data <100 &&! lightOn) {// 조명이 켜진 순간 elapsedTimeOff = millis () - previousTimeOff; previousTime = millis (); lightOn = true; if (elapsedTimeOff> (7 - 1) * dotDelay) {words.push ( '*'); } else if (elapsedTimeOff> 3 * dotDelay) {words.push ( ''); }

/ * else if (elapsedTimeOff> (3-1) * dotDelay) {

}*/ }

if (lightOn) {// 조명이 켜져있는 동안

if (data> 70) {// 라이트가 꺼지는 순간 lightOn = false; previousTimeOff = millis (); elapsedTime = millis () - previousTime;

if (elapsedTime> (7 - 1) * dotDelay) {readData (); } else if (elapsedTime> (3 - 1) * dotDelay) {words.push ( '-');

} else {words.push ( '.'); }}

}

}

지연 (100);

} void textToLight (문자열 텍스트) {

(int i = 0; i <text.length (); i ++) {if (text.charAt (i) == '.) {digitalWrite (LedPin, HIGH); 지연 (dotDelay); digitalWrite (LedPin, LOW); 지연 (dotDelay * 3);

} else if (text.charAt (i) == '-') {digitalWrite (LedPin, HIGH); 지연 (dotDelay * 3); digitalWrite (LedPin, LOW); 지연 (dotDelay * 3); } else {delay (dotDelay * 3);

} }

}

void readData () {

노드 * 포커스 = 트리 -> 루트; while (! words.isEmpty ()) {char letter = words.pop (); if (문자 == '.') {초점 = 초점 -> 오른쪽;

} else if (문자 == '-') {초점 = 초점 -> 왼쪽;

} else if (letter == '') {char letter = focus-> get_Key (); Serial.println (letter); focus = tree-> root;

} else {char letter = focus-> get_Key (); Serial.println (letter); focus = tree-> root; Serial.println ( ""); }} char letter = focus-> get_Key (); Serial.println (letter);

}

BinaryTree 클래스

#include "arduino.h"
#include "Node.h"#include

class BinaryTree {

public : BinaryTree (); void initialize ();

char 문자 32 = { '', 'e', ​​'t', 'i', 'a', 'n', 'm', 's', 'u' 'd', 'k', 'g', 'o', 'h', 'v', 'f', '', '' ','p ','j ' 'x', 'c', 'y', 'z', 'q', '', ''}; QueueList 단어; 노드 * 루트;

};

BinaryTree :: BinaryTree () {

루트 = NULL; 루트 = 새 노드 (letters 0); 초기화 ();

}

void BinaryTree :: initialize () {큐리스트 노드; int counter = 0; nodes.push (루트);

for (int i = 0; i <15; i ++) {Node * focus = nodes.pop (); focus-> right = 새로운 노드 (글자 i + 1 + counter); 포커스 -> 왼쪽 = 새 노드 (글자 i + 2 + 카운터);

nodes.push (focus-> right); nodes.push (focus-> left);

카운터 ++;

} }

노드 클래스

#ifndef Node_h
#define Node_h

#include "arduino.h"클래스 Node; 클래스 Node {

public : Node (char _key); Node * right; 노드 * 왼쪽; char get_Key (); private : char key; // 노드 자식; };

Node :: Node (char _key) {key = _key;}

char Node :: get_Key () {

리턴 키; }

#endif

5 단계 : 화합 코드

1 - SerialPort 통신을 활성화하려면 다음을 수행하십시오.

편집 -> 프로젝트 설정 -> 플레이어 -> 최적화 -> API 호환성 수준 -> .NET 2.0

2 - 빈 게임 객체를 만들고 다음 스크립트를 그것에 첨부하십시오.

UnityEngine 사용하기;
using System.Collections; UnityEngine.UI 사용; System.IO.Ports를 사용하여; 공용 클래스 Controller : MonoBehaviour {

public Sprite onSprite, offSprite; 공용 이미지 readImage, writeImage; 공개 텍스트 lcd;

비공개 SerialPort 포트 = 새로운 SerialPort (@ ". "+ "COM11", 9600); 개인 bool isReading = false; // 초기화에 사용 void Start () {port.Open (); port.ReadTimeout = 25; StartCoroutine (readString ()); } // 업데이트는 프레임 당 한 번 호출됩니다. void Update () {

if (! isReading) {readImage.sprite = onSprite; writeImage.sprite = offSprite;

}

else {readImage.sprite = offSprite; writeImage.sprite = onSprite; }}

IEnumerator readString () {

while (true) {

if (port.IsOpen) {

시도 {

문자열 데이터 = port.ReadLine (); Debug.Log (data); if (data == "0") {isReading =! isReading; lcd.text = ""; } else if (data == "#") {lcd.text = ""; } else {lcd.text + = data;

}

} catch (System.Exception) {

}

}

yield 반환 null; }

} }