안드로이드 앱을 이용하여 아두이노를 무선으로 제어하기 위해서는 보통 블루투스 모듈이나 wifi 모듈을 사용하게 된다.
아두이노에서 사용하는 블루투스 모듈에는 블루투스 클래식(HC-05, HC-06)과 블루투스 4.0 BLE(HM-10, AT-09, BT05) 모듈이 있고, wifi 모듈에는 esp8266 칩셋을 사용한 esp-01이 주로 사용된다.
esp8266 칩셋을 사용한 esp8266 dev 보드의 경우 아두이노IDE를 이용하여 아두이노와 같은 사용자 환경 및 컴파일 언어로 프로그래밍을 할 수있어 아두이노를 대체할 수 있으며 wifi가 기본으로 내장되어 있어 따로 wifi 모듈이 필요없는 보드이다. 또한 esp32 칩셋을 이용한 esp32 dev 보드의 경우 esp8266 dev 보드와 마찬가지로 아두이노IDE를 이용하여 프로그래밍 할 수 있으며 추가로 wifi와 블루투스 기능이 통합되어 있다.(단, 블루투스 장치와 wifi 장치를 동시에 연결하여 사용하지는 못한다.)
블루투스 연결 제어는 HC-06과 BT05 모듈을 이용하여 진행하고 wifi 연결 제어는 esp-01, esp8266 dev 보드, esp32 dev 보드를 이용하겠다.
1. 아두이노와 시리얼 통신의 이해
아두이노와 PC, 아두이노와 블루투스 모듈 또는 wifi모듈, 통신 모듈과 안드로이드 사이의 데이터 송신 및 수신은 시리얼 통신을 이용하게 되는데 아두이노에는 hardware 시리얼은 1개가 장치되어 있으며, 이는 보통 아두이노와 PC간에 연결하여 프로그램 업로드 및 시리얼 모니터와의 연결에 사용되고 추가적인 모듈과의 연결에는 프로그램(SoftwareSerial.h 라이브러리)으로 에뮬레이트한 가상의 software 시리얼을 사용하여 연결하고 통신하게 된다.
시리얼 통신은 오래전부터 산업계에서 주로 사용되어오던 통신 규약이다 관련 용어로는 RS232, 485, TTL등 세부적으로 들어가면 살펴보아야 할 사항들이 너무 많다. 여기에서는 아두이노와 관련된 시리얼 통신에 대해서만 다루고 사용상 필요한 요소만 살펴볼 예정이다.
아두이노의 hardware 시리얼은 전송속도(BAUD RATE) 115200까지 지원하지만 프로그램으로 동작하는 software 시리얼은 전송속도 9600까지 지원하는데 시리얼 통신 특성상 송신 측과 수신측의 전송속도를 같게 맞추어 주어야만 데이터가 제대로 전송되며, 맞추어 주지 않을경우 수신측에는 읽은 수 없는 데이터 값이 들어오게 된다.
블루투스 모듈 HC-06의 경우 기본 전송속도는 9600으로 설정 되어 있어서 전송속도 변경없이 software 시리얼을 사용할 수 있지만 wifi 모듈 esp-01의 경우 기본 전송속도가 115200으로 설정되어 있어서 전송속도를 9600으로 맞추어 주어야 software 시리얼을 사용하여 정상적인 데이터 송신 및 수신을 할 수 있다.
시리얼 통신을 사용하기 위한 RX, TX연결에 있어 중요한 점은 송신측 TX는 수신측 RX와 연결되어야 한다는 것이다. 즉, 통신 모듈과 아두이노 사이에 TX - RX / RX - TX로 교차연결이 되어야 제대로 통신이 되게 된다.
TX: 전송의 약자 / RX: 수신의 약자
- 아두이노 세팅
HC - 06 아두이노
VCC -> 3.3V / 5V
GND -> GND
TXD -> 2번 핀 (아두이노 코드에서 RX핀으로 설정)
RXD -> 3번 핀 (아두이노 코드에서 TX핀으로 설정)
위와 같이 연결해주고 시리얼 통신 기본 코드를 아두이노에 업로드 해준다.
- 아두이노 시리얼 통신 기본 코드
#include <SoftwareSerial.h> // 소프트웨어 시리얼 라이브러리 #define rxPin 3 #define txPin 2 SoftwareSerial btSerial(txPin, rxPin); // SoftwareSerial NAME(TX, RX); void setup() { Serial.begin(9600); //시리얼모니터 btSerial.begin(9600); //블루투스 시리얼 } void loop() { if (btSerial.available()) { Serial.write(btSerial.read()); //블루투스측 내용을 시리얼모니터에 출력 } if (Serial.available()) { btSerial.write(Serial.read()); //시리얼 모니터 내용을 블루투스 측에 쓰기 } } |
휴대폰에서 블루투스 페어링을 해주고(처음 블루투스 연결시 비밀번호 입력하라고 한다. 보통 0000 또는 1234) 아두이노 블루투스 앱을 실행하고 연결을 시켜준뒤 텍스트 입력란에 hello world를 입력하고 send를 클릭하면 시리얼 모니터 창에 hello world가 표시되는 것을 볼 수 있으며 반대로 시리얼 모니터 입력창에서 HELLO WORLD를 입력하면 앱에서 HELLO WORLD가 표시되는 것을 볼 수 있다. 이렇게 휴대폰에서 아두이노시리얼 모니터, 시리얼 모니터에서 휴대폰으로 문자를 전송해 봄으로써 코드의 정상 작동 여부를 확인해 볼 수 있다.
arduino bluetooth controller PWM - 아두이노 원격제어 안드로이드 앱 버전 3.5 다운로드
arduino bluetooth controller PWM 매뉴얼
안드로이드 버전업에 따라 안드로이드 특정버전에서만 와이이파이 및 블루투스 연결이 가능합니다.
(*** 와이파이 연결은 안드로이드8 [갤럭시S7]이하 버전에서만 작동합니다 ***)
(*** 블루투스 연결은 안드로이드10 이하 버전에서만 작동합니다 ***)
- 아두이노와 PC간의 시리얼 통신
아두이노와 PC간의 통신은 USB 연결을 통하여 아두이노 IDE의 시리얼 모니터를 이용해 이루어지며 시리얼 모니터 창에는 전송옵션과 전송속도를 설정하는 버튼이 있다.
전송 속도는 아두이노 우노의 경우 일반적으로 9600을 사용하고 전송 옵션 아래의 선택 사항이중 하나를 선택해야 한다.
1. line ending 없음: 2바이트 데이터 hi를 전송한다면 그대로 hi만 전송한다.
2. 새줄(New Line/Line Feed-다음줄로) : hi 다음에 \n(개행문자/줄바꿈-ASCII 10진수 코드 10)을 추가해서 3바이트 전송한다.
3. 캐리지리턴(CR) : hi 다음에 \r(복귀문자/새줄-ASCII 10진수 코드 13)을 추가해서 3바이트 전송한다.
4. BOTH NL & CR : hi 다음에 \r(13), \n(10)을 추가해서 4바이트 전송한다. 캐리지리턴이 앞에, 개행문자(줄바꿈)가 뒤에 위치한다.
* 타자기에서 유래된 용어
CR(Carriage Return): 타자기에서 종이를 오른쪽으로 밀어서 처음으로 오게 하는 행동(복귀)
LF(Line Feed): 타자기에서 종이를 위로 올리는 행동(개행) - 줄바꿈 :: 아두이노 Newline('\n')
컴퓨터에서는 CR('\r')과 LF('\n') 둘 다 새 줄, 줄바꿈으로 사용된다.
전송옵션의 선택은 아두이노에 업로드된 코드에 따라 또는 수신측 코드에 따라 선택하여 보내주어야 한다. 수신측 코드상 CR('\r')을 스트링의 종료로 인식하도록 코딩을 하였다면 캐리지리턴(CR) 옵션을 지정한뒤에 시리얼 모니터 입력란에 데이터를 입력한 뒤 전송해야만 아두이노 또는 수신측 코드에서 스트링의 종료를 인식하고 해당 코드를 실행 할 수 있다.
블루투스 모듈의 AT 커맨드를 예로 보자면 HC-06(Bluetooth Classic)의 경우 line ending 없음으로 "AT 명령"을 보내 주어야 하고 BT05(Bluetooth 4.0 BLE)의 경우 BOTH NL & CR 옵션을 선택한 후 "AT 명령"을 입력해야만 블루투스 모듈에서 명령을 인식하게 된다.
- 시리얼 통신 기본코드의 이해
앞서 아두이노에 업로드한 스케치 파일의 코딩 내용에 대해 살펴 보겠다.
아두이노의 시리얼 통신은 아두이노 기본 프로그램 Serial 클래스에서 정의 되어있으며, 그중 일부만 다룰 예정이다.
SoftwareSerial NAME(TX, RX); // 소프트웨어 시리얼 클래스 객체선언 시리얼 이름(TX 핀 번호, RX 핀번호)
예) SoftwareSerial btSerial(2, 3); // 소프트웨어 시리얼 객체이름을 btSerial로 지정, TX 핀 번호:2, RX 핀번호:3
Serial.begin(baud, config);
baud: 전송속도
config: 8N1(디폴트 값) -> 따로 설정하지 않아도 된다. 8(비트수)|N(패러티비트 설정)|1(스톱비트 설정)
Serial.begin(9600); // 기본 설정에 전송속도 9600 사용
Serial.available() 함수: 시리얼포트에 수신되어 저장된 데이터의 바이트 수를 반환하는 함수, 데이터가 없으면 0을 반환한다.
if (btSerial.available()) { 실행코드 }
시리얼 버퍼에 데이터가 없어서 btSerial.available() 값이 0 일 경우, 0 = 거짓, 0 이외의 값 = 참이므로 코드는 실행되지 않는다. 반대로 시리얼 버퍼에 데이터가 있어서 btSerial.available() 값이 0 이상일경우 참이므로 코드는 실행된다.
Serial.read() 함수: 시리얼 버퍼상의 데이터를 1byte 씩 읽는다. 시리얼 버퍼에 4byte 데이터가 있다고 해서 4byte를 한꺼번에 읽는게 아니며 for루프나 while 루프를 사용하지 않는 이상 메인루프(loop())를 한번 돌때마다 1byte씩 읽는다.
Serial.write() 함수와 Serial.print() 함수
시리얼 통신을 이용한 휴대폰 - 통신모듈 - 아두이노 - PC간의 데이터 흐름을 설명하자면 ASCII CODE에 대한 언급을 안할 수가 없다. 시리얼 통신은 기본적으로 0과 1로 이루어진 전기 신호를 서로 정해진 타이밍(전송속도)마다 8개 비트를 단위(Byte)로 보내고 받는다는 것이다.
* 휴대폰과 통신모듈 사이에는 통신모듈의 프로토콜을 사용하며 통신모듈과 아두이노, 아두이노와 PC사이는 시리얼로 연결되어 시리얼 통신을 하게된다.
8개의 비트로 표현 할수 있는 숫자는 0 ~ 255이고 이 숫자들을 0과 1로 이루어진 전기 신호를 타이밍에 맞게 보냄으로써 의미있는 데이터의 전달이 가능하게 한다. 하지만 0과 1로 이루어진 숫자표현은 한 두개의 데이터라면 0과 1을 분석하여 해석 할 수 있지만 데이터의 양이 늘어날 경우 사람들이 바로 확인하기 어렵고, 또한 수많은 숫자를 전송하기위해 0과 1로 변환해야 하는 어려움이 있어 이를 해소하기 위해 ASCII CODE라는 0 ~ 127에 대응하는 문자를 규정하였으며 시리얼 통신의 기본 바탕이 되었다고 볼 수 있다.
* 전기신호를 타이밍에 맞게 보내는 것은 시리얼 통신의 경우 임.
우선 휴대폰에서 사용자가 대문자 N을 입력한다고 하면 휴대폰상 프로그램은 ASCII CODE에 정해진 십진수 코드(DEC)값 78로 변환하고 이를 다시 0과 1로 이루어진 2진수 형태 01001110로 변환하여 블루투스 통신 프로토콜을 사용해 0과 1신호를 수신측으로 보내준다.
'N' -> 78 -> 01001110 (1Byte=8bit)
수신측에서는 전달받은 1Byte의 데이터를 다시 변환을 할지 아니면 바이트데이터를 그대로 사용하거나 다른쪽으로 전송을 할지를 결정하여 사용하면 되는 것이다.
01001110 -> 78 -> 'N'
그저 중계 역할(통신모듈)을 할 경우에는 다시 변환할 필요없이 바이트 신호 그대로를 전달해주면 될것이고, 아두이노에서도 마찬가지로 PC로 그대로 중계 할 것인지 아니면 들어온 데이터를 취합하여 원래 의도의 문자 'N' 변환한 후 의미있는 값으로 사용할 지를 결정하고 그것에 맞는 CODE를 작성하게 되면 통신을 이용한 프로그램밍이 되는 것이다.
상기 내용은 데이터를 전달하는 전기신호의 관점에서의 흐름이고 아두이노에서 다루는 시리얼통신은 모두 프로그램(라이브러리 또는 클래스)과 관련된 내용이 되는데 데이터 흐름을 이해하는 것이 프로그램을 이해하는데 많은 도움이 된다.
Serial.write() 함수와 Serial.print() 함수 모두 시리얼을 통해 데이터를 전송하는 함수이지만, 시리얼 통신을 통해 받은 값이 01001110(DEC: 78)이고 이를 시리얼 모니터상으로 전송한다고 가정해 보자. 두 함수간에는 차이점이 있는데, Serial.write(78)은 byte(1001110 = 78) 값으로 전송하며 수신측에서는 byte(1001110 = 78) 값을 그대로 받아 ASCII 10진수 코드로 인식하여 'N'을 출력하고, Serial.print(78)은 78을 문자열로 취급하여 전송할때 7과 8을 분리하여 byte값으로 전송하고 수신측에서는 각각 숫자에 대한 byte값을 받아 ASCII 10진수 코드로 인식하고 "78"을 출력하게 된다. 따라서, Serial.read() 함수를 통해 읽어들인 1byte 데이터를 시리얼 모니터상에 그대로 출력하기 위해서는 Serial.write() 함수를 사용하게 된다.
시리얼 통신 기본코드는 if (btSerial.available()) { 실행코드 } 와 Serial.write() 함수를 사용하여 입력된값을 byte 단위로 바로 출력하도록 짜여진 코드이다. 만약 Serial.print() 함수를 사용하고자 한다면 Serial.read() 함수로 읽은 byte 값을 char 변수에 저장하여 데이터의 특성을 지정해 준후 Serial.print() 함수로 출력하면 된다. 변수 선언(테이터 특성 지정)을 하게되면 Serial.print() 함수에서 데이터 값을 스트링으로 인식하지 않고 하나의 문자 값으로 인식하여 전송하게 된다.
if (btSerial.available()) { char c = btSerial.read(); Serial.print(c); //블루투스측 내용을 시리얼모니터에 출력 } |
Serial.write() 함수와 Serial.print() 함수의 관계를 간단히 정리하면 아래와 같다.
아두이노
Serial.write(78);
Serial.print(78); // 7, 8 분리 -> 아스키코드 DEC 55, 아스키코드 DEC 56변환 -> Serial.write(55); Serial.write(56);
char c = 78;
Serial.print(c); // Serial.write(78);
시리얼 모니터 표시
문자 'N'
문자열 "78"
문자 'N'
* 아두이노 시리얼 통신에서 모든 데이터 전송은 1byte 기준이다(문자열 또는 스트링도 1byte 씩 나누어 전송된다).
위에서 잠깐 언급했지만 if (btSerial.available()) { 실행코드 } 대신 while (btSerial.available()) { 실행코드 } 를 사용하면 1byte씩 읽는것은 같으나 시리얼 버퍼를 모두 읽을때 까지 메인루프가 정지하게 되는 차이점이 있으며 시리얼 데이터의 모든 데이터를 읽고 출력한 후 메인루프(loop())로 빠져 나간다. delay() 함수를 사용한것과 같다. 사실, delay() 함수도 while 루프를 사용한다.
while (btSerial.available()) { Serial.write(btSerial.read()); } |
while (btSerial.available()) { char c = btSerial.read(); Serial.print(c); } |
정말 if (btSerial.available()) { 실행코드 } 사용시 메인루프(loop()) 마다 1Byte씩 읽어오고 while (btSerial.available()) { 실행코드 } 사용시 모두 읽은뒤 메인루프(loop())로 빠져 나오는지 테스트 코드를 작성하여 테스트 해보자
메인루프를 돌때마다 카운트를 1씩 증가시키고 딜레이를 1초를 주는 코드를 작성하였다. 즉, 매 1초마다 메인 루프가 한바퀴씩 돈다고 볼수 있고 전체 회전수를 카운트를 통해 확인할 수 있는 코드이다.
코딩한 코드를 아두이노에 업로드 하고 휴대폰 블루투스 앱에서 "hello"를 입력하고 전송한 뒤 아래 결과값을 살펴보면, if (btSerial.available()) { 실행코드 } 에서는 카운트가 증가할 때마다 한글자씩 읽어오는것을 볼 수 있다. 이는 메인푸프가 한바퀴 돌때마다 1Byte씩 읽어오는 것을 의미하며 if를 while로 바꿔준 코드에서는 시리얼 데이터를 모두 읽은 후 메인루프로 다시 돌아가는것을 확인해 볼수 있다.
int count = 0; void loop() { Serial.print("count: "); Serial.print(count); Serial.print(" read: "); if (btSerial.available()) { Serial.write(btSerial.read()); } Serial.println(""); count++; delay(1000); if (Serial.available()) { btSerial.write(Serial.read()); //시리얼 모니터 내용을 블루투스 측에 쓰기 } } |
int count = 0; void loop() { Serial.print("count: "); Serial.print(count); Serial.print(" read: "); while (btSerial.available()) { Serial.write(btSerial.read()); } Serial.println(""); count++; delay(1000); if (Serial.available()) { btSerial.write(Serial.read()); //시리얼 모니터 내용을 블루투스 측에 쓰기 } } |
while 루프로 읽고 char 배열에 저장하기
while 루프가 1회전 할 때마다 count를 0부터 1씩 증가시켜 배열 인덱스를 지정하고 시리얼 데이터를 저장한다.
배열의 크기는 입력 데이터 크기에 맞게 조정하면 된다.
char c[10] = { 0, }; int count = 0; void loop() { while (btSerial.available()) { c[count] = btSerial.read(); count++; } Serial.print(c); delay(2000); if (Serial.available()) { btSerial.write(Serial.read()); //시리얼 모니터 내용을 블루투스 측에 쓰기 } } |
Serial.readString() 함수 이용하여 데이터값 String으로 저장하기
배열에 저장하게 되면 배열의 크기를 지정해줘야 되어 데이터 크기가 유동적인 경우에는 사용하기 곤란하다. 그런때에는 String을 이용하면 된다. Serial.readString() 함수 자체가 while 루프와 같이 시리얼 버퍼의 데이터를 모두 읽을 때까지 자체 루프하고 모두 읽고 난 뒤에 다음 코드로 진행한다.
String c = ""; void loop() { if (btSerial.available()) { // while (btSerial.available()) { 과 같다 c = btSerial.readString(); // Serial.readString() 함수가 while 루프 역할 Serial.print(c); } if (Serial.available()) { btSerial.write(Serial.read()); //시리얼 모니터 내용을 블루투스 측에 쓰기 } } |
시리얼 통신을 이용한 코드를 작성하다보면 의도한대로 결과가 안나오는 경우가 발생하게 된다. 일반 코드의 경우 Serial.print() 함수를 사용하여 값을 확인하고 디버그하게 되는데 시리얼 통신에 관련된 코드 작성시 가장 많이 사용하게되는 디버깅 함수로는 Serial.print(val, BIN) 함수를 꼽을 수 있다.
이진수로 변환하여 출력해주는 함수인데, ASCII 코드상의 10진수 코드값 0~31까지의 통신용 문자와 128 ~ 255까지 문자로 할당되지 않은 영역에 대한 값을 확인하기 위해서는 꼭 필요하다.
ASCII 코드상의 10진수 코드값 32 ~ 127번 값 이외의 문자를 Serial.print() 함수로 출력하게 되면 ⸮⸮⸮ 식으로 출력되어 어떤 값이 들어왔는지 확인을 할 수 없기 때문이다.
if (btSerial.available()) { char c = btSerial.read(); Serial.println(c, BIN); } |
여기서 출력된 이진수 코드를 윈도우 기본 프로그램인 계산기에서 프로그래머용으로 변경한후 이진수를 입력한뒤에 16진수 HEX값이나 10진수 DEC 값을 확인 할 수 있다.
프로그래머용 계산기 사용법을 살펴 보자면 기본이 되는 왼쪽하단의 데이터 크기 Byte(8비트)를 선택하고 바로 상단에 입력 방식으로 이진수(BIN)를 선택하면 우측의 입력 키패드에 0과 1만 활성화 되는 것을 볼 수 있다. 키패드를 이용하여 8비트 숫자의 양수 마지막인 127의 이진수 01111111을 입력하고 입력방식에서 10진수(DEC)를 선택하면 01111111이 십진수 127로 변환되어 표시된다. 10진수(DEC) 입력방식에서는 입력 키패드의 숫자가 모두 활성화 되어 숫자를 입력할 수 있게된다.
1Byte(8비트) 로 표현할 수 있는 숫자는 0 ~ 255까지 이다. 하지만, 이는 음수를 포함하지 않는 양수(unsigned)로만 표현 했을 때인데 프로그래머용 계산기 에서 127 이상의 숫자를 입력하려고 하면 입력이 되지를 않는다. 이는 음수를 포함한 정수체계에서 1Byte(8비트) 로 표현할 수 있는 숫자의 범위가 -128 ~ 127이기 때문이다. 프로그래머용 계산기 에서는 음수를 포함한(signed) 정수체계만을 지원하는 것 같고 정수 체계에서는 1Byte의 첫번째 비트는 음수를 표시하는 것으로 정해져 있어서 128 (이진수: 1000 0000)을 입력하려고 해도 입력이 되지를 않는 것이다.
127 이상의 양수 체계의 숫자를 입력하고자 한다면 음수를 포함한(signed) 정수체계에서도 127 이상의 숫자가 입력이 되도록 데이터 범위를 Word(16비트)로 변경해준 뒤 128을 입력하고 이진수(BIN) 입력방식을 선택하면 10000000으로 변환해준다. 여기에서 다시 입력방식을 10진수(DEC)로 변경 해주면 128로 바뀌고 이 상태에서 데이터 크기를 다시 Byte(8비트) 지정을 해주면 -128이 표시 되는 것을 볼 수 있다.
이진수(BIN)로 직접 입려하게되면 상기와 같이 복잡한 변환 과정이 필요없이 바로 입력 가능하지만 십진수를 이진수로 변환하는게 많이 필요하게 되므로 이 방법을 자주 사용하게 된다. 아울러, 음수 체계에서 127 이상 숫자의 증가는 -128 부터 -127, -126 역순으로 내려가며 양수 체계 8비트 맨 마지막 숫자인 255(11111111)는 -1이 됨을 알 수 있다. 즉, 8비트 이진수 11111111은 양수 체계에서는 255, 음수를 포함한 정수 체계에서는 -1이 된다.
최신 업데이트 유료앱(모든 안드로이드 버전 블루투스 연결 지원)
https://postpop.tistory.com/175
각 진수별 변환 테이블
10진수 16진수 2진수 8진수 | 10진수 16진수 2진수 8진수 | |||||||||
----------------------------------------------- | ----------------------------------------------- | |||||||||
0 = 00 = 00000000 = [ 0] | 128 = 80 = 10000000 = [200] | |||||||||
1 = 01 = 00000001 = [ 1] | 129 = 81 = 10000001 = [201] | |||||||||
2 = 02 = 00000010 = [ 2] | 130 = 82 = 10000010 = [202] | |||||||||
3 = 03 = 00000011 = [ 3] | 131 = 83 = 10000011 = [203] | |||||||||
4 = 04 = 00000100 = [ 4] | 132 = 84 = 10000100 = [204] | |||||||||
5 = 05 = 00000101 = [ 5] | 133 = 85 = 10000101 = [205] | |||||||||
6 = 06 = 00000110 = [ 6] | 134 = 86 = 10000110 = [206] | |||||||||
7 = 07 = 00000111 = [ 7] | 135 = 87 = 10000111 = [207] | |||||||||
8 = 08 = 00001000 = [ 10] | 136 = 88 = 10001000 = [210] | |||||||||
9 = 09 = 00001001 = [ 11] | 137 = 89 = 10001001 = [211] | |||||||||
10 = 0A = 00001010 = [ 12] | 138 = 8A = 10001010 = [212] | |||||||||
11 = 0B = 00001011 = [ 13] | 139 = 8B = 10001011 = [213] | |||||||||
12 = 0C = 00001100 = [ 14] | 140 = 8C = 10001100 = [214] | |||||||||
13 = 0D = 00001101 = [ 15] | 141 = 8D = 10001101 = [215] | |||||||||
14 = 0E = 00001110 = [ 16] | 142 = 8E = 10001110 = [216] | |||||||||
15 = 0F = 00001111 = [ 17] | 143 = 8F = 10001111 = [217] | |||||||||
16 = 10 = 00010000 = [ 20] | 144 = 90 = 10010000 = [220] | |||||||||
17 = 11 = 00010001 = [ 21] | 145 = 91 = 10010001 = [221] | |||||||||
18 = 12 = 00010010 = [ 22] | 146 = 92 = 10010010 = [222] | |||||||||
19 = 13 = 00010011 = [ 23] | 147 = 93 = 10010011 = [223] | |||||||||
20 = 14 = 00010100 = [ 24] | 148 = 94 = 10010100 = [224] | |||||||||
21 = 15 = 00010101 = [ 25] | 149 = 95 = 10010101 = [225] | |||||||||
22 = 16 = 00010110 = [ 26] | 150 = 96 = 10010110 = [226] | |||||||||
23 = 17 = 00010111 = [ 27] | 151 = 97 = 10010111 = [227] | |||||||||
24 = 18 = 00011000 = [ 30] | 152 = 98 = 10011000 = [230] | |||||||||
25 = 19 = 00011001 = [ 31] | 153 = 99 = 10011001 = [231] | |||||||||
26 = 1A = 00011010 = [ 32] | 154 = 9A = 10011010 = [232] | |||||||||
27 = 1B = 00011011 = [ 33] | 155 = 9B = 10011011 = [233] | |||||||||
28 = 1C = 00011100 = [ 34] | 156 = 9C = 10011100 = [234] | |||||||||
29 = 1D = 00011101 = [ 35] | 157 = 9D = 10011101 = [235] | |||||||||
30 = 1E = 00011110 = [ 36] | 158 = 9E = 10011110 = [236] | |||||||||
31 = 1F = 00011111 = [ 37] | 159 = 9F = 10011111 = [237] | |||||||||
32 ( ) = 20 = 00100000 = [ 40] | 160 = A0 = 10100000 = [240] | |||||||||
33 (!) = 21 = 00100001 = [ 41] | 161 = A1 = 10100001 = [241] | |||||||||
34 (") = 22 = 00100010 = [ 42] | 162 = A2 = 10100010 = [242] | |||||||||
35 (#) = 23 = 00100011 = [ 43] | 163 = A3 = 10100011 = [243] | |||||||||
36 ($) = 24 = 00100100 = [ 44] | 164 = A4 = 10100100 = [244] | |||||||||
37 (%) = 25 = 00100101 = [ 45] | 165 = A5 = 10100101 = [245] | |||||||||
38 (&) = 26 = 00100110 = [ 46] | 166 = A6 = 10100110 = [246] | |||||||||
39 (') = 27 = 00100111 = [ 47] | 167 = A7 = 10100111 = [247] | |||||||||
40 (() = 28 = 00101000 = [ 50] | 168 = A8 = 10101000 = [250] | |||||||||
41 ()) = 29 = 00101001 = [ 51] | 169 = A9 = 10101001 = [251] | |||||||||
42 (*) = 2A = 00101010 = [ 52] | 170 = AA = 10101010 = [252] | |||||||||
43 (+) = 2B = 00101011 = [ 53] | 171 = AB = 10101011 = [253] | |||||||||
44 (,) = 2C = 00101100 = [ 54] | 172 = AC = 10101100 = [254] | |||||||||
45 (-) = 2D = 00101101 = [ 55] | 173 = AD = 10101101 = [255] | |||||||||
46 (.) = 2E = 00101110 = [ 56] | 174 = AE = 10101110 = [256] | |||||||||
47 (/) = 2F = 00101111 = [ 57] | 175 = AF = 10101111 = [257] | |||||||||
48 (0) = 30 = 00110000 = [ 60] | 176 = B0 = 10110000 = [260] | |||||||||
49 (1) = 31 = 00110001 = [ 61] | 177 = B1 = 10110001 = [261] | |||||||||
50 (2) = 32 = 00110010 = [ 62] | 178 = B2 = 10110010 = [262] | |||||||||
51 (3) = 33 = 00110011 = [ 63] | 179 = B3 = 10110011 = [263] | |||||||||
52 (4) = 34 = 00110100 = [ 64] | 180 = B4 = 10110100 = [264] | |||||||||
53 (5) = 35 = 00110101 = [ 65] | 181 = B5 = 10110101 = [265] | |||||||||
54 (6) = 36 = 00110110 = [ 66] | 182 = B6 = 10110110 = [266] | |||||||||
55 (7) = 37 = 00110111 = [ 67] | 183 = B7 = 10110111 = [267] | |||||||||
56 (8) = 38 = 00111000 = [ 70] | 184 = B8 = 10111000 = [270] | |||||||||
57 (9) = 39 = 00111001 = [ 71] | 185 = B9 = 10111001 = [271] | |||||||||
58 (:) = 3A = 00111010 = [ 72] | 186 = BA = 10111010 = [272] | |||||||||
59 (;) = 3B = 00111011 = [ 73] | 187 = BB = 10111011 = [273] | |||||||||
60 (<) = 3C = 00111100 = [ 74] | 188 = BC = 10111100 = [274] | |||||||||
61 (=) = 3D = 00111101 = [ 75] | 189 = BD = 10111101 = [275] | |||||||||
62 (>) = 3E = 00111110 = [ 76] | 190 = BE = 10111110 = [276] | |||||||||
63 (?) = 3F = 00111111 = [ 77] | 191 = BF = 10111111 = [277] | |||||||||
64 (@) = 40 = 01000000 = [100] | 192 = C0 = 11000000 = [300] | |||||||||
65 (A) = 41 = 01000001 = [101] | 193 = C1 = 11000001 = [301] | |||||||||
66 (B) = 42 = 01000010 = [102] | 194 = C2 = 11000010 = [302] | |||||||||
67 (C) = 43 = 01000011 = [103] | 195 = C3 = 11000011 = [303] | |||||||||
68 (D) = 44 = 01000100 = [104] | 196 = C4 = 11000100 = [304] | |||||||||
69 (E) = 45 = 01000101 = [105] | 197 = C5 = 11000101 = [305] | |||||||||
70 (F) = 46 = 01000110 = [106] | 198 = C6 = 11000110 = [306] | |||||||||
71 (G) = 47 = 01000111 = [107] | 199 = C7 = 11000111 = [307] | |||||||||
72 (H) = 48 = 01001000 = [110] | 200 = C8 = 11001000 = [310] | |||||||||
73 (I) = 49 = 01001001 = [111] | 201 = C9 = 11001001 = [311] | |||||||||
74 (J) = 4A = 01001010 = [112] | 202 = CA = 11001010 = [312] | |||||||||
75 (K) = 4B = 01001011 = [113] | 203 = CB = 11001011 = [313] | |||||||||
76 (L) = 4C = 01001100 = [114] | 204 = CC = 11001100 = [314] | |||||||||
77 (M) = 4D = 01001101 = [115] | 205 = CD = 11001101 = [315] | |||||||||
78 (N) = 4E = 01001110 = [116] | 206 = CE = 11001110 = [316] | |||||||||
79 (O) = 4F = 01001111 = [117] | 207 = CF = 11001111 = [317] | |||||||||
80 (P) = 50 = 01010000 = [120] | 208 = D0 = 11010000 = [320] | |||||||||
81 (Q) = 51 = 01010001 = [121] | 209 = D1 = 11010001 = [321] | |||||||||
82 (R) = 52 = 01010010 = [122] | 210 = D2 = 11010010 = [322] | |||||||||
83 (S) = 53 = 01010011 = [123] | 211 = D3 = 11010011 = [323] | |||||||||
84 (T) = 54 = 01010100 = [124] | 212 = D4 = 11010100 = [324] | |||||||||
85 (U) = 55 = 01010101 = [125] | 213 = D5 = 11010101 = [325] | |||||||||
86 (V) = 56 = 01010110 = [126] | 214 = D6 = 11010110 = [326] | |||||||||
87 (W) = 57 = 01010111 = [127] | 215 = D7 = 11010111 = [327] | |||||||||
88 (X) = 58 = 01011000 = [130] | 216 = D8 = 11011000 = [330] | |||||||||
89 (Y) = 59 = 01011001 = [131] | 217 = D9 = 11011001 = [331] | |||||||||
90 (Z) = 5A = 01011010 = [132] | 218 = DA = 11011010 = [332] | |||||||||
91 ([) = 5B = 01011011 = [133] | 219 = DB = 11011011 = [333] | |||||||||
92 (\) = 5C = 01011100 = [134] | 220 = DC = 11011100 = [334] | |||||||||
93 (]) = 5D = 01011101 = [135] | 221 = DD = 11011101 = [335] | |||||||||
94 (^) = 5E = 01011110 = [136] | 222 = DE = 11011110 = [336] | |||||||||
95 (_) = 5F = 01011111 = [137] | 223 = DF = 11011111 = [337] | |||||||||
96 (`) = 60 = 01100000 = [140] | 224 = E0 = 11100000 = [340] | |||||||||
97 (a) = 61 = 01100001 = [141] | 225 = E1 = 11100001 = [341] | |||||||||
98 (b) = 62 = 01100010 = [142] | 226 = E2 = 11100010 = [342] | |||||||||
99 (c) = 63 = 01100011 = [143] | 227 = E3 = 11100011 = [343] | |||||||||
100 (d) = 64 = 01100100 = [144] | 228 = E4 = 11100100 = [344] | |||||||||
101 (e) = 65 = 01100101 = [145] | 229 = E5 = 11100101 = [345] | |||||||||
102 (f) = 66 = 01100110 = [146] | 230 = E6 = 11100110 = [346] | |||||||||
103 (g) = 67 = 01100111 = [147] | 231 = E7 = 11100111 = [347] | |||||||||
104 (h) = 68 = 01101000 = [150] | 232 = E8 = 11101000 = [350] | |||||||||
105 (i) = 69 = 01101001 = [151] | 233 = E9 = 11101001 = [351] | |||||||||
106 (j) = 6A = 01101010 = [152] | 234 = EA = 11101010 = [352] | |||||||||
107 (k) = 6B = 01101011 = [153] | 235 = EB = 11101011 = [353] | |||||||||
108 (l) = 6C = 01101100 = [154] | 236 = EC = 11101100 = [354] | |||||||||
109 (m) = 6D = 01101101 = [155] | 237 = ED = 11101101 = [355] | |||||||||
110 (n) = 6E = 01101110 = [156] | 238 = EE = 11101110 = [356] | |||||||||
111 (o) = 6F = 01101111 = [157] | 239 = EF = 11101111 = [357] | |||||||||
112 (p) = 70 = 01110000 = [160] | 240 = F0 = 11110000 = [360] | |||||||||
113 (q) = 71 = 01110001 = [161] | 241 = F1 = 11110001 = [361] | |||||||||
114 (r) = 72 = 01110010 = [162] | 242 = F2 = 11110010 = [362] | |||||||||
115 (s) = 73 = 01110011 = [163] | 243 = F3 = 11110011 = [363] | |||||||||
116 (t) = 74 = 01110100 = [164] | 244 = F4 = 11110100 = [364] | |||||||||
117 (u) = 75 = 01110101 = [165] | 245 = F5 = 11110101 = [365] | |||||||||
118 (v) = 76 = 01110110 = [166] | 246 = F6 = 11110110 = [366] | |||||||||
119 (w) = 77 = 01110111 = [167] | 247 = F7 = 11110111 = [367] | |||||||||
120 (x) = 78 = 01111000 = [170] | 248 = F8 = 11111000 = [370] | |||||||||
121 (y) = 79 = 01111001 = [171] | 249 = F9 = 11111001 = [371] | |||||||||
122 (z) = 7A = 01111010 = [172] | 250 = FA = 11111010 = [372] | |||||||||
123 ({) = 7B = 01111011 = [173] | 251 = FB = 11111011 = [373] | |||||||||
124 (|) = 7C = 01111100 = [174] | 252 = FC = 11111100 = [374] | |||||||||
125 (}) = 7D = 01111101 = [175] | 253 = FD = 11111101 = [375] | |||||||||
126 (~) = 7E = 01111110 = [176] | 254 = FE = 11111110 = [376] | |||||||||
127 = 7F = 01111111 = [177] | 255 = FF = 11111111 = [377] |
이상으로 시리얼 통신의 기본적인 사항들을 살펴보았다.
다음편....
2. 안드로이드 앱과 블루투스 모듈 HC-06을 이용한 아두이노 원격제어
관련 글
[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 1편
[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 2편
[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 3편
[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 4편
[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 5편
[arduino] - 블루투스 4.0 BLE 이용 아두이노 및 ESP32 원격제어
[arduino] - 아두이노 - 시리얼통신 주요함수와 예제, String class
[arduino] - 아두이노 - ESP01 wifi 모듈 무선 원격제어 그리고 시리얼 통신 - 6편
[arduino] - ESP8266 - NodeMcu 1.0 와이파이 이용 원격제어(soft AP, wifi)
[arduino] - ESP32 - Dev Module 와이파이 이용 원격제어(soft AP, wifi)
arduino bluetooth controller PWM - 아두이노 원격제어 안드로이드 앱 버전 3.5 다운로드
arduino bluetooth controller PWM 매뉴얼
'Arduino' 카테고리의 다른 글
아두이노 IDE에 ESP8266 사용 환경 설치하기 (0) | 2019.05.12 |
---|---|
블루투스 4.0 BLE, 스마트폰 연결과 페어링(pairing), AT-09 (0) | 2019.05.11 |
아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 5편 (2) | 2019.05.07 |
아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 4편 (0) | 2019.05.05 |
아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 3편 (0) | 2019.05.03 |
아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 2편 (0) | 2019.05.02 |
아두이노 - 블루투스 4.0 BLE 모듈에 대한 생각, 제품명 확인 프로그램, AT-09 (0) | 2019.04.14 |
아두이노 - 블루투스모듈, 블루투스 클래식과 블루투스 4.0 BLE의 차이 (0) | 2019.04.14 |