RaspberryPi 시리얼통신 1 제 08 강 시리얼통신제어 시리얼통신시리얼모니터링루프백시리얼통신 Win. PC와의시리얼통신가상머신과의시리얼통신아두이노보드와의시리얼통신 KUT51보드와의시리얼통신
시리얼통신 * Serial 활성화후재부팅 $ sudo raspi-config RaspberryPi 시리얼통신 2 $ sudo reboot : 시리얼통신을위한장치파일 /dev/ttys0 생성
시리얼통신 ( 계속 ) * 몇가지확인사항 $ ls /dev/tty* -al RaspberryPi 시리얼통신 3 : 디바이스파일 /dev/ttys0 이추가생성된것을확인 : 이장치파일의내정된접근권한자는슈퍼유저임을유의 $ cat /boot/config.txt : enable_uart=1 의라인이추가된것을확인
시리얼통신 ( 계속 ) * 몇가지확인사항 ( 계속 ) $ cat /boot/cmdline.txt RaspberryPi 시리얼통신 4 : 내정된 baudrate 는 115200 임을확인가능 $ dmesg grep tty : ttys0 활성화확인가능
RaspberryPi 시리얼통신 5 시리얼통신 ( 계속 ) * 시리얼모니터링 : USB-TTL 시리얼케이블활용 : 회로연결 ( 전원공급기있는경우, 3핀만연결 ) // 흰색 (RxD) 핀을 rpi의 TxD와연결, // 녹색 (TxD) 핀을 rpi의 RxD와연결, // 검정 (Gnd) 는 Gnd와연결, 빨강 (Vcc) 는 5V( 보드에전원공급 ) : 드라이버다운로드및설치 https://learn.adafruit.com/adafruits-raspberry-pi-lesson-5-using-aconsole-cable/software-installation-windows : 시리얼포트확인 ( Win. 장치관리자 )
: PuTTY 로접속 RaspberryPi 시리얼통신 6 // Flow control 항목을필히 none 으로설정후, Open : 라즈베리파이보드전원재투입, 혹은임의키눌러봄 // SSH 를통해새터미널을여는것이아님
RaspberryPi 시리얼통신 7 시리얼통신 ( 계속 ) * wiringserial.h 라이브러리 ( /usr/include ) : 시리얼통신을위한함수제공 - 시리얼통신을위한디바이스파일과보레이트설정하여열기, 닫기, 버리기 extern int serialopen(const char *device, const int baud) ; extern void serialclose(const int fd) ; extern void serialflush(const int fd) ; - 한문자, 문자열, 서식지정된문자열전송하는함수 extern void serialputchar(const int fd, const unsigned char c) ; extern void serialputs(const int fd, const char *s) ; extern void serialprintf(const int fd, const char *message,...) ; - 수신할데이터가가용한지와한문자를수신하는함수 extern int serialdataavail(const int fd) ; extern int serialgetchar(const int fd) ;
RaspberryPi 시리얼통신 8 루프백시리얼통신 [ 실습 1] 루프백시리얼통신 : 자신의시스템에서보낸데이터를자신이수신하는방식 : ASCII 코드 (1Byte) 데이터들송신및수신하는프로그램 : TxD 핀 (BCM_GPIO #14) 과 RxD 핀 (BCM_GPIO #15) 을직접연결 $ nano uart_01.c //======================================= // uart_01.c // loopback // RxD(BCM_GPIO #14), TxD(BCM_GPIO #15) //=======================================
RaspberryPi 시리얼통신 9 #include <stdio.h> #include <string.h> #include <wiringpi.h> #include <wiringserial.h> // delay() #define BAUD 115200 int main(void) { int fd; unsigned char asc, rec; if((fd = serialopen("/dev/ttys0", BAUD)) < 0) { printf("device file open error!! use sudo...\n"); return 1; printf("[uart testing... loopback]\n"); asc = 65; while(1) { printf("transmitting... %d ", asc); serialputchar(fd, asc); delay(1); if(serialdataavail(fd)) { rec = serialgetchar(fd); printf("===> Received : %d %c\n", rec, rec);
RaspberryPi 시리얼통신 10 serialflush(fd); delay(300); asc++; return 0; $ make uart_01 $ sudo./uart_01 // 실행시필히
Win PC 와의시리얼통신 * USB 시리얼포트경우 RaspberryPi 시리얼통신 11 : USB to Serial 케이블, 혹은 PL2303 모듈사용
Win PC 와의시리얼통신 ( 계속 ) * MAX232CPE : 신호레벨변환 IC RaspberryPi 시리얼통신 12
Win PC 와의시리얼통신 ( 계속 ) * RS232C 커넥터 (D-Sub 9) RaspberryPi 시리얼통신 13 : 사용할핀은 #2(RxD), #3(TxD), #5(GND) 이며, : #5(GND) 핀은사용하지않아도됨
Win PC 와의시리얼통신 ( 계속 ) * 회로구성 RaspberryPi 시리얼통신 14 : MAX232 IC와 RS232 컨넥터간의 TxD, RxD 단자는서로교차로연결 : 아래그림과같이구성하면교차연결된것임 ( T1OUT - RxD, R1IN - TxD ) : 1uP 캐패시터 5개, 기판고정용 9핀암 RS232 컨넥터 1개소요
Win PC 와의시리얼통신 ( 계속 ) * USB Serial Port 설정 (Win PC) RaspberryPi 시리얼통신 15 : USB 시리얼케이블연결후, 장치관리자에서시리얼포트확인 : 추가시리얼포트없는경우관련드라이버설치할것 : 통신속성정보설정 (19200, 등등 )
Win PC 와의시리얼통신 ( 계속 ) * PuTTY 통신프로그램 : 연결유형에서 Serial을체크 : 통신포트및보레이트를설정후 Open 클릭 : 설정정보저장하여추후운영시활용가능 RaspberryPi 시리얼통신 16
Win PC 와의시리얼통신 ( 계속 ) [ 실습 2] Win PC 와의시리얼통신 RaspberryPi 시리얼통신 17 : PC 에서전송한데이터를수신후되전송하는프로그램 $ nano uart_02.c //======================================= // uart_02.c // with Windows PC // retransmit a received char from Win PC //======================================= #include <stdio.h> #include <string.h> #include <wiringserial.h> #define BAUD 19200 // 115200 int main(void) { int fd; int rec;
RaspberryPi 시리얼통신 18 if((fd = serialopen("/dev/ttys0", BAUD)) < 0) { printf("device file open error!! use sudo...\n"); return 1; printf("[uart test with Win PC...]\n"); serialputs(fd, "[UART test with Win PC...]\n"); while(1) { if(serialdataavail(fd)) { rec = serialgetchar(fd); printf("received from Win PC : %d %c \n", rec, (char)rec); // re-transmit.. serialputchar(fd, rec); serialflush(fd); return 0; $ make uart_02
Win PC 와의시리얼통신 ( 계속 ) * 실습절차 RaspberryPi 시리얼통신 19 단계1) Windows PC에서 PuTTY 시리얼통신프로그램을실행단계2) 라즈베리파이에서다음과같이실행 $ sudo./uart_02 단계 3) Windows PC 에서 PuTTY 화면에서문자입력
Win PC 와의시리얼통신 ( 계속 ) [ 실습 3] 시리얼통신에의한 LED 제어 RaspberryPi 시리얼통신 20 : Win PC에서전송되는문자중 1, 혹은 0에따라라즈베리파이보드의 LED를 ON/OFF하는프로그램 $ nano uart_03.c //======================================= // uart_03.c // with Windows PC // control LED on Raspberry Pi board //======================================= #include <stdio.h> #include <string.h> #include <wiringpi.h> #include <wiringserial.h> #define P_LED 1 // BCM_GPIO #18 #define BAUD 19200 // 115200 int main(void) {
RaspberryPi 시리얼통신 21 int fd; int rec; if((fd = serialopen("/dev/ttys0", BAUD)) < 0) { printf("device file open error!! use sudo...\n"); return 1; if(wiringpisetup() == -1) return 1; pinmode(p_led, OUTPUT); printf("[uart test with Win PC + LED control]\n"); serialputs(fd, "[UART test with Win PC + LED control]\n"); while(1) { if(serialdataavail(fd)) { rec = serialgetchar(fd); printf("received from Win PC : %d %c ", rec, (char)rec); // re-transmit.. serialputchar(fd, rec); serialflush(fd); //// LED control... if(rec == '0') {
RaspberryPi 시리얼통신 22 digitalwrite(p_led, LOW); printf("==> Led OFF...\n"); else if(rec == '1') { digitalwrite(p_led, HIGH); printf("==> Led ON...\n"); else printf("==> No control data...\n"); return 0; $ make uart_03
가상머신과의시리얼통신 RaspberryPi 시리얼통신 23 * 요구사항 : VM에시리얼포트추가 : VM의통신프로그램 mincom 설치및환경설정
가상머신과의시리얼통신 ( 계속 ) * 가상머신환경설정 : Win 의장치관리자에서시리얼포트설정확인 - 기본 COM1( 마더보드의통신포트 ) - USB-Serial Adaptor 경우기타의 COMx RaspberryPi 시리얼통신 24 : 시리얼포트추가 "Player-Manage-VM settings" 클릭 "Hardware탭" 에서 "Add" 클릭하여 Serial Port 추가, COM1 설정 : CD/DVD 항바른드라이브 (Windows 와동일 ) 지정!
가상머신과의시리얼통신 ( 계속 ) * minicom RaspberryPi 시리얼통신 25 : 텍스트방식의터미널에뮬레이션통신프로그램 (Windows의 hyper terminal과유사 ) : 모뎀제어, 파일업로드 / 다운로드등통신에필요한주요기능포함 : 임베디드시스템개발과정에서타깃보드와개발호스트간시리얼통신을위해사용 : 타깃보드에명령전달및출력메시지확인용 * minicom 설치 root@ubuntu:~# apt install minicom
가상머신과의시리얼통신 ( 계속 ) * minicom 환경설정 : 통신포트, 통신속도등설정이필요 RaspberryPi 시리얼통신 26 # minicom -s
가상머신과의시리얼통신 ( 계속 ) * minicom 직렬포트환경설정 : 'Serial Port Setup' 항목선택 A-Serial Device B-Lockfile Location E-Bps/Par/Bits F-Hardware Flow Control RaspberryPi 시리얼통신 27 : /dev/ttys1 : /var/lock : 115,200bps 8N1 : No -Serial Device... 시리얼포트 1(/dev/ttyS0), 시리얼포트 2(/dev/ttyS1) -Bps/Par/Bits... 통신속도및패리티비트등설정 -Hardware Flow Control... No 로 : 직렬포트환경저장 : 종료 - 'Save setup as dfl' 항목선택 - 'Exit from minicom' 항목선택
가상머신과의시리얼통신 ( 계속 ) RaspberryPi 시리얼통신 28 * 다음과같이하여동작확인!!(2019.09.05.) : USB-TTL Serial cable 연결 (Win관리자에서 COM3) : vm에서시리얼포트2(com3) 선택상태 : /dev/ttys1 설정
가상머신과의시리얼통신 ( 계속 ) * 통신확인 # minicom RaspberryPi 시리얼통신 29 : 종료시 Ctrl-A-q 누름
가상머신과의시리얼통신 ( 계속 ) [ 실습 4] 시리얼통신에의한 LED 제어 RaspberryPi 시리얼통신 30 : 가상머신에서전송되는문자중 1, 혹은 0에따라라즈베리파이보드의 LED를 ON/OFF하는프로그램 : [ 실습3] 참조, 소스그대로사용테스트 * 실습절차 : 가상머신에서통신프로그램실행 (minicom) # minicom : 라즈베리파이에서 $ sudo./uart_03
Arduino 보드와의시리얼통신 * Arduino Mega ADK 보드 RaspberryPi 시리얼통신 31 : USB-Serial 컨버터가내장되어있음 : 이컨버터를경유하는시리얼통신으로목적코드업로드함 : 4개시리얼포트제공 : 목적코드업로드시사용포트... 시리얼포트 0 ( serial ) * Arduino 보드측회로 : 아두이노보드의 pin #3 에 LED 회로연결
Arduino 보드와의시리얼통신 ( 계속 ) * Arduino 보드용소스 RaspberryPi 시리얼통신 32 : 스케치에서다음의소스를작성하여컴파일 : 수신한문자가 0이면 LED OFF, 1이면 ON 기능 : 통신속도는 19200으로. //======================================= // uart_04_arduino.ino // for Arduino board // LED controlled by remote RaspberryPi //======================================= const int ledpin = 3; // LED에연결된핀번호 char data; // 수신문자를저장하기위한변수 void setup() { pinmode(ledpin, OUTPUT); Serial.begin(19200); // LED를출력으로설정 // 시리얼개방, 통신속도설정 void loop() {
RaspberryPi 시리얼통신 33 switch(data) { case '0' : digitalwrite(ledpin, LOW); break; case '1' : digitalwrite(ledpin, HIGH); break; // LED OFF // LED ON default : break; // 수신버퍼에데이터가있을때마다호출되는콜백함수 void serialevent() { data = Serial.read(); Serial.println(data);
Arduino 보드와의시리얼통신 ( 계속 ) * 두보드간연결절차 RaspberryPi 시리얼통신 34 1) 컴파일후목적코드를업로드 ( 플래쉬메모리에기록 ) : 업로딩하기위해서는다음의 2가지작업선행필요, : 메뉴의도구항목중보드와시리얼포트항목에서아두이노보드의모델설정과 ISP를위한시리얼포트설정후, : 업로드아이콘을클릭 2) PC에서아두이노보드및 USB 케이블제거 3) 두보드간 RxD, TxD 단자를교차하여연결 : 라즈베리파이보드와아두이노보드간시리얼통신을위해 4) 아두이노보드에전원인가 : 아두이노보드에연결된 USB 단자를라즈베리파이보드의 USB 단자에연결하여아두이노보드에전원인가 ( 아두이노보드에서아두이노보드용프로그램실행중 )
Arduino 보드와의시리얼통신 ( 계속 ) [ 실습 5] 아두이노보드의 LED 제어 RaspberryPi 시리얼통신 35 : 시리얼통신에의해아두이노보드상의 LED를제어 : 라즈베리파이용소스 $ nano uart_04.c //======================================= // uart_04.c // Arduino LED Control // for Raspberry Pi board // pair file : uart_04_arduino.ino //======================================= #include <stdio.h> #include <string.h> #include <wiringserial.h> #define BAUD 19200 int main(void) { int fd;
RaspberryPi 시리얼통신 36 char con; if((fd = serialopen("/dev/ttys0", BAUD)) < 0) { printf("device file open error!! use sudo...\n"); return 1; printf("[uart test with Arduino board]\n"); serialputs(fd, "[UART test with Arduino board]\n"); while(1) { printf("\ninput a char: "); con = getchar(); getchar(); // trash enter key //fflush(stdin); //serialputchar(serialgetchar(fd)); // transmit serialputchar(fd, con); serialflush(fd); return 0; $ make uart_04
RaspberryPi 시리얼통신 37 $ sudo./uart_04 : 아두이노보드의 LED 를제어하기위해 0, 혹은 1 의문자를입력
응용과제 [ 응용 1] 시리얼통신 : 각자응용과제를정의하여구현 : RaspberryPi 시리얼통신 38 [ 응용 2] KUT51 보드와의시리얼통신 : 마이크로프로세서및실습교과의실습키트활용 : 마프교재끝장 C51 프로그래밍의마지막실습과제로데이터송수신을테스트할것