http://www.martyncurrey.com/arduino-serial-part-2-serial-data/
이전 게시물에서는 Arduino에서 직렬을 사용하는 기본 사항을 살펴보고 다양한 명령을 실행했습니다. 이 게시물에서는 다양한 유형의 직렬 데이터와 코드 생성을 시작하기 전에 고려해야 할 몇 가지 사항에 대해 이야기하고 싶습니다. 사용하거나 사용할 수 있는 통신 유형은 프로젝트에 따라 크게 다르지만 시작하기 전에 고려할 수 있는 사항이 있습니다.
- 커뮤니케이션의 종류? 1방향 또는 2방향
- 데이터 유형? 값 또는 문자열? 단순하거나 복잡합니까?
- 얼마나 많은 데이터와 빈도? 몇 초마다 몇 개의 값 또는 고속 연속 스트림.
- 데이터가 중요합니까? 모든 데이터를 받았는지 확인해야 합니까 아니면 일부를 잃을 여유가 있어야 합니다.
통신 유형
커뮤니케이션 유형에 따라 프로젝트의 부분이 얼마나 복잡한지 결정됩니다. 단방향 커뮤니케이션은 일반적으로 구현하기가 더 쉽지만 어느 방법을 고려해야 합니다. Arduino에서 보내거나 Arduino로 보냅니다. Arduino에는 높은 수준의 데이터 처리 기능이 없으므로 복잡한 데이터 패턴이 있는 경우 이를 구문 분석하는 코드를 만들어야 합니다.
양방향 통신은 양쪽에서 송수신해야 함을 의미합니다. 통신은 동기식입니까 아니면 비동기식입니까? 이것은 코드와 사용할 수 있는 기능에 영향을 줍니다. 예를 들어 Arduino의 소프트웨어 직렬은 동시에 수신 및 송신할 수 없습니다.
데이터 유형
어떤 정보를 전달해야 하는지, 전달하는 데 사용되는 데이터 형식을 단순화할 수 있는지 생각해 보십시오. 예를 들어 조명을 켜고 끄려면 단일 문자(또는 8비트 문자의 한 비트)와 같은 매우 간단한 코드나 명령으로 이를 수행할 수 있습니다.
기상 모니터링 스테이션을 생성하는 경우 부동 소수점 값이 필요할 수 있는 풍속 및 온도를 수용해야 할 수 있습니다.
다른 값이 많이 있는 경우 Arduino에 어떤 값을 받았는지 알릴 방법이 필요합니다.
또한 데이터를 얼마나 빨리 보내고 받아야 하는지도 고려해야 합니다. 속도가 문제가 아닌 경우 데이터가 얼마나 복잡할 수 있는지에 대한 실제 제한은 없으며 XML 또는 "Temperature=24.75,humidity=34.5%"와 같은 사람이 읽을 수 있는 데이터를 사용할 수 있습니다. 데이터가 매우 빨리 수신되면 가능한 한 단순해야 합니다.
항상 그렇듯이, 나는 가능한 한 단순하게 유지하는 것을 지지하며 항상 내가 사용하는 데이터 또는 보다 구체적으로 데이터 형식을 단순화하려고 노력합니다.
속도가 주요 관심사가 아닌 복잡한 데이터의 경우 형식이 지정된 데이터 세트와 가능하면 고정 길이 데이터를 사용합니다. 데이터 형식에 따라 데이터 형식이 달라질 수 있습니다.
Arduino에 데이터를 보낼 때 나는 거의 항상 같은 방법을 고수합니다. 고정 길이 데이터를 사용하고 숫자에 ASCII를 사용합니다. App Inventor 또는 VisualBasic과 같은 고급 언어로 데이터를 보낼 때는 덜 중요하지만 형식이 지정된 데이터를 사용하면 작업이 더 쉬워집니다.
고정 길이 데이터
여기에서 내가 의미하는 바에 대한 예를 제공하기 위해 몇 가지 예가 있습니다. Arduino에 연결된 RGB LED를 제어하는 데 사용되는 App Inventor에 3개의 슬라이더가 있는 경우 3개의 값(빨간색, 녹색 및 파란색)이 있고 각 값은 0에서 255 사이일 수 있습니다.
숫자 값이 영숫자(문자열) 값으로 변환되는 ASCII를 사용하여 각 값에 3자를 사용합니다. 0은 "000", 100은 "100", 255는 "255"가 됩니다. 그런 다음 실제 데이터가 "[100000255]"가 되도록 데이터를 시작 및 종료 마커로 묶을 수 있습니다. 그런 다음 Arduino 측에서 데이터를 수신할 때 버퍼에 추가합니다. 버퍼에 시작 마커와 끝 마커가 모두 있을 때 모든 데이터가 있다는 것을 압니다. 이렇게 하면 데이터를 쉽게 읽을 수 있지만 전송이 필요한 것보다 느립니다. 속도가 중요한 경우 데이터를 "[" byte1 byte2 byte3 "]"로 줄일 수 있습니다. 여기서 byte1, byte2 및 byte3은 실제 숫자 값입니다. 그래도 시작 및 끝 마커를 사용합니다.
얼마나 많은 데이터
또한 전송할 데이터의 양과 전송 빈도를 고려해야 합니다. 1분에 한 번 온도를 보내는 것과 음악을 스트리밍하는 것은 상당한 차이가 있습니다. 많은 데이터를 매우 자주 보내려면 대기 시간과 Arduino가 데이터를 수신하고 처리할 수 있는 속도도 고려해야 합니다.
예를 들어 Arduino에서 소프트웨어 직렬을 사용하면 데이터를 안정적으로 수신하고 전송할 수 있는 속도에 제한이 있습니다. 하드웨어 직렬이 훨씬 낫지만 여전히 한계가 있습니다.
중요 데이터
데이터가 중요하고 모든 것을 받았다는 것을 알아야 하는 경우 확인 방법이 필요합니다. 이 작업을 수행하는 방법에는 여러 가지가 있지만 항상 그렇듯이 가능하면 간단하게 유지하는 것이 좋습니다. 내가 모든 것을 받았는지 확실히 알고 싶은 소수의 경우 기본 체크섬 값과 데이터가 전송되고 데이터에 추가된 횟수를 사용했습니다. 즉, 데이터 블록을 얻었는데 체크섬이 올바르지 않으면 데이터가 손상되었음을 알고 재전송을 요청할 수 있습니다. 모든 데이터 블록에 번호가 매겨진 경우 block1, block2, block3, 모든 블록을 받았는지 확인하는 간단한 방법이 있으며 하나가 없으면 다시 보낼 수 있습니다.
다음 몇 개의 게시물은 한 Arduino에서 다른 Arduino로 직렬 데이터를 보내는 방법을 살펴봅니다. 모든 예에서 나는 물리적 전선을 사용하여 Arduinos를 연결하지만 전선은 Bluetooth 모듈과 같이 UART를 말하는 모든 무선 모듈로 교체할 수 있습니다. 그리고 아두이노에 대한 예를 들어 설명하지만, 어떤 장치에서든 직렬 데이터를 수신할 때 동일한 기술을 사용할 수 있습니다.
'Arduino' 카테고리의 다른 글
Arduino Serial Part 4: ASCII data and using markers to separate data (0) | 2022.03.13 |
---|---|
Arduino Serial Part 3: Getting started with serial communication (0) | 2022.03.13 |
Arduino Serial Part 1 (0) | 2022.03.13 |
[아두이노] 시리얼 통신 (0) | 2021.12.04 |
소프트웨어 시리얼(SoftwareSerial) 통신 (0) | 2021.12.04 |