2015. 서영진 All Rights Reserved. 초판 1쇄 발행 2015년 8월 31일 지은이 서영진 펴낸이 장성두 펴낸곳 제이펍 출판신고 2009년 11월 10일 제406 2009 000087호 주소 경기도 파주시 문발로 141 뮤즈빌딩 403호 전화 070 8201 9010 / 팩스 02 6280 0405 홈페이지 www.jpub.kr / 이메일 jeipub@gmail.com 편집부 이민숙, 이 슬, 이주원 / 소통 기획팀 민지환, 현지환 표지디자인 미디어픽스 / 삽화 나예랑 용지 신승지류유통 / 인쇄 한승인쇄 / 제본 광우제책사 ISBN 979 11 85890 28 9 (93000) 값 33,000원 이 책은 저작권법에 따라 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금지하며, 이 책 내용의 전부 또는 일부를 이용하려면 반드시 저작권자와 제이펍의 서면동의를 받아야 합니다. 잘못된 책은 구입하신 서점에서 바꾸어 드립니다. 제이펍은 독자 여러분의 아이디어와 원고 투고를 기다리고 있습니다. 책으로 펴내고자 하는 아이디어나 원고가 있으신 분께서는 책의 간단한 개요와 차례, 구성과 저(역)자 약력 등을 메일로 보내주세요. jeipub@gmail.com
드리는 말씀 이 책에 기재된 내용을 기반으로 한 운용 결과에 대해 저자, 소프트웨어 개발자 및 제공자, 제이펍 출판사는 일체의 책임을 지지 않으 므로 양해 바랍니다. 이 책에 등장하는 회사명, 제품명은 일반적으로 각 회사의 등록 상표(또는 상표)이며, 본문 중에는 TM, C, R 마크 등을 생략하고 있습 니다. 이 책에서 사용하고 있는 제품 버전은 독자의 학습 시점에 따라 책의 내용과 다를 수 있습니다. 본문에 실린 그림들은 저자가 직접 촬영하거나 CCL에 의하여 허가를 받은 것들입니다만, 혹시 문제가 될만한 그림이 있다면 출판사로 연락주시기 바랍니다. 이 책은 흑백으로 편집되었으나 몇몇 그림의 이해를 돕기 위해 컬러 화보를 포함하였습니다. (해당 그림이나 표에는 화보 참조 라는 문 구를 표시하였습니다.) 이 책의 소스 코드는 소스포지(Sourceforge.net)에서 서브버전(Subversion)을 사용하여 다운로드할 수 있습니다. 자세한 설명은 이 책에 대하여 를 참고하세요. 코드 우측 상단에 접기 표시가 된 코드는 소스 코드, HTML 문서, 프로젝트 문서 또는 라즈베리 파이나 우분투의 터미널을 나타냅니 다. 그 외의 코드로는 함수 개요, 구조체 등이 있습니다. 이 책은 맥과 라즈베리 파이 2를 기준으로 작성되었으며, 다른 환경(윈도우 또는 라즈베리 파이 2 이하 버전)에서 이와 특별히 다른 점 이 있을 경우 해당 내용을 명시하였습니다. 책과 관련된 문의사항은 도서 커뮤니티인 페이스북 그룹이나 출판사로 연락주시기 바랍니다. - 페이스북 도서 커뮤니티: http://www.facebook.com/groups/linuxprogrammingwithraspberrypi - 출판사 : jeipub@gmail.com
세상을 사랑으로 살 수 있게 해주신 마음속의 그분께 바칩니다 할머니 사랑합니다
차 례 머리말 감사의 글 이 책에 대하여 베타리더 후기 xii xiii xiv xx PART I 라즈베리 파이 사용하기 CHAPTER 1 사물인터넷과 라즈베리 파이 3 1.1 사물인터넷과 오픈 소스 하드웨어 플랫폼 4 1.1.1 사물인터넷 4 1.1.2 오픈 소스의 발전과 오픈 소스 하드웨어의 등장 5 1.1.3 아두이노 7 1.2 라즈베리 파이 한 입 베어 물기 10 1.2.1 라즈베리 파이 10 1.2.2 라즈베리 파이의 모델 및 구조 10 1.3 라즈베리 파이를 위한 주변 도구 13 1.3.1 라즈베리 파이와 SD 카드 14 1.3.2 라즈베리 파이의 외부 하드웨어 16 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 18 1.4.1 라즈베리 파이의 디스크 이미지와 윈도우에서의 설치 18 1.4.2 라즈베리 파이 이미지 설치: MS 윈도우 20 1.4.3 라즈베리 파이 이미지 설치: 리눅스 22 1.4.4 라즈베리 파이 이미지 설치: 맥 OS X 27 1.4.5 라즈베리 파이의 설정 28 1.5 요약 40 vi CHAPTER 2 리눅스의 기초: 라즈베리 파이와 친해지기 43 차 례 2.1 리눅스의 사용환경과 구조 44 2.1.1 리눅스의 시작 44 2.1.2 리눅스의 특징 45 2.1.3 리눅스의 구조 47 2.2 리눅스의 기본 명령어 48 2.2.1 셸과 프롬프트 48 2.2.2 리눅스의 기본 명령어 49 2.2.3 사용자 계정과 그룹 63
2.3 vi 에디터 63 2.3.1 텍스트 에디터 63 2.3.2 vi 에디터 64 2.3.3 nano 에디터 71 2.4 리눅스의 프로그래밍 도구 72 2.4.1 GCC 72 2.4.2 gcc 컴파일러 73 2.4.3 make 유틸리티 75 2.4.4 gdb 유틸리티 83 2.4.5 라이브러리 만들기 88 2.5 요약 94 CHAPTER 3 라즈베리 파이와 GPIO: 하드웨어 제어 97 3.1 GPIO의 개요 98 3.1.1 라즈베리 파이와 GPIO 98 3.1.2 하드웨어의 스케치와 fritzing 99 3.2 LED 제어 프로그래밍 101 3.2.1 전자 부품 101 3.2.2 전자 블록 102 3.2.3 GPIO와 LED 104 3.2.4 echo 명령어와 LED의 점멸 108 3.2.5 gpio 명령어 111 3.3 wiringpi를 이용한 GPIO 프로그래밍 112 3.3.1 wiringpi 112 3.3.2 wiringpi를 이용한 프로그래밍 113 3.4 스위치와 센서를 이용한 입출력 116 3.4.1 스위치의 사용 116 3.4.2 스피커의 사용 118 3.4.3 빛 감지 센서의 사용 122 3.4.4 DC 모터의 사용 124 3.4.5 7세그먼트의 사용 129 3.4.6 온습도 센서의 사용 134 3.5 요약 138 PART II 리눅스 기본 프로그래밍 CHAPTER 4 리눅스 프로그래밍의 기초 143 4.1 리눅스의 기본 구조와 파일 시스템 144 4.1.1 리눅스 시스템의 구조 144 4.1.2 리눅스 파일 시스템 146 차 례 vii
4.2 파일 처리와 표준 입출력 148 4.2.1 저수준 파일 입출력 148 4.2.2 표준 입출력 라이브러리 158 4.2.3 파일 조작 함수 168 4.3 파일 정보와 권한 171 4.3.1 파일 정보와 권한을 위한 리눅스 명령어 171 4.3.2 파일 정보 175 4.3.3 권한과 소유자 181 4.4 디렉터리와 시간 처리 185 4.4.1 디렉터리 185 4.4.2 유닉스의 시간 191 4.5 리눅스 시스템 프로그래밍과 라즈베리 파이의 제어 199 4.6 요약 203 CHAPTER 5 프로세스와 스레드: 다중 처리 205 5.1 프로세스와 시그널 207 5.1.1 프로세스 207 5.1.2 프로세스 관련 명령어 211 5.1.3 시그널 218 5.2 멀티 프로세스와 다중 처리 프로그래밍 229 5.2.1 리눅스의 부팅 과정과 프로세스 229 5.2.2 프로세스의 처리 233 5.3 프로세스 간 통신 249 5.3.1 파이프 249 5.3.2 FIFO 253 5.3.3 유닉스 시스템 V의 IPC 함수 255 5.4 POSIX 스레드와 동기화 272 5.4.1 POSIX 스레드 272 5.4.2 동기화 277 5.5 다중 처리와 라즈베리 파이의 제어 282 5.6 요약 286 CHAPTER 6 리눅스 네트워크 프로그래밍: 사물인터넷의 연결을 위한 기초 289 6.1 네트워크의 개요와 BSD 소켓 290 6.1.1 네트워크의 개요 290 6.1.2 BSD 소켓 303 6.2 UDP 네트워크 프로그래밍 306 6.2.1 소켓의 사용 307 6.2.2 서버를 위한 bind( ) 함수 308 6.2.3 바이트 순서 변환 310 viii 차 례
6.2.4 네트워크 주소 변환 311 6.2.5 UDP 데이터의 송수신 312 6.2.6 바이트 조작 313 6.3 TCP 서버와 클라이언트 프로그래밍 316 6.3.1 TCP 클라이언트 317 6.3.2 TCP 서버 318 6.3.3 병행 처리 서버 324 6.4 HTTP와 웹 서버 프로그래밍 331 6.4.1 웹과 HTTP 331 6.4.2 웹 브라우저와 웹 엔진 332 6.4.3 HTTP의 구조 333 6.4.4 HTML 340 6.4.5 데몬 프로세스 348 6.4.6 인터넷 패킷 모니터링: Wireshark 352 6.5 웹 서버와 라즈베리 파이의 제어 355 6.6 요약 362 PART III 리눅스 고급 프로그래밍 CHAPTER 7 리눅스 멀티미디어 프로그래밍: 현란함과 즐거움 367 7.1 멀티미디어와 라즈베리 파이 368 7.1.1 멀티미디어 368 7.1.2 색상 체계 369 7.1.3 사운드 372 7.1.4 아날로그/디지털 변환 373 7.1.5 리눅스 멀티미디어 시스템 379 7.1.6 라즈베리 파이의 멀티미디어 시스템 380 7.2 리눅스 사운드 프로그래밍 380 7.2.1 리눅스 사운드 시스템 380 7.2.2 ALSA를 이용한 오디오 프로그래밍 384 7.2.3 ALSA 프로그래밍 389 7.2.4 ALSA 믹서 프로그래밍 404 7.2.5 WAV 파일의 출력 408 7.3 프레임 버퍼를 통한 이미지 출력 418 7.3.1 프레임 버퍼의 정보 표시 419 7.3.2 프레임 버퍼를 이용한 그래픽 422 7.3.3 BMP 파일 표시하기 430 7.3.4 Qt를 이용한 이미지 표시 438 7.4 Video4Linux2와 Pi Camera 440 7.4.1 Video4Linux 440 7.4.2 Pi Camera 442 7.4.3 Video4Linux2 프로그래밍 445 7.4.4 BMP 파일로 이미지 캡처 455 차 례 ix
7.5 라즈베리 파이와 멀티미디어 458 7.6 요약 460 CHAPTER 8 Qt를 이용한 GUI 프로그래밍: 더 편리한 접근성 463 8.1 Qt와 라즈베리 파이: Qt on Pi 464 8.1.1 X 윈도우 시스템 464 8.1.2 Qt의 개요 473 8.1.3 라즈베리 파이로 Qt 4 설치하기 477 8.1.4 라즈베리 파이에 Qt 5 설치하기 478 8.2 Qt 프로그래밍과 사용자 정의 위젯 484 8.2.1 Hello World! 프로그래밍 485 8.2.2 Qt에서의 위젯 488 8.2.3 Qt에서의 이벤트 처리 489 8.2.4 사용자 정의 위젯 493 8.2.5 사용자 정의 시그널과 슬롯 495 8.3 Qt 위젯과 레이아웃 498 8.3.1 Qt의 기본 위젯 498 8.3.2 버튼 위젯 499 8.3.3 정보 표시 위젯 503 8.3.4 문자 입력 위젯 507 8.3.5 범위 선택 위젯 509 8.3.6 레이아웃 512 8.3.7 Qt의 다이얼로그 516 8.3.8 Qt와 Video4Linux2 519 8.4 Qt Creator를 이용한 GUI 디자인 524 8.4.1 Qt Creator를 위한 환경 설정 524 8.4.2 C 언어를 위한 프로젝트 생성과 실행 527 8.4.3 Qt 애플리케이션을 위한 프로젝트 531 8.5 GUI와 라즈베리 파이 545 8.6 요약 552 CHAPTER 9 리눅스 커널과 디바이스 드라이버: 더 깊은 곳으로... 555 9.1 리눅스 커널과 디바이스 드라이버 556 9.1.1 리눅스 커널과 모듈 556 9.1.2 커널 영역과 유저 영역 558 9.1.3 리눅스 디바이스 드라이버 559 9.2 리눅스 디바이스 드라이버 프로그래밍 563 9.2.1 라즈베리 파이에 리눅스 커널의 설치 563 9.2.2 시스템 호출 567 9.2.3 커널 모듈 576 x 차 례
9.3 시스템 레지스터와 LED 출력 580 9.3.1 CPU와 데이터 입출력 580 9.3.2 시스템 레지스터 582 9.4 LED 출력을 위한 GPIO 드라이버 프로그래밍 589 9.4.1 리눅스 디바이스 파일과 GPIO 589 9.4.2 리눅스 디바이스 드라이버 GPIO 프로그래밍 590 9.4.3 애플리케이션으로의 시그널 전달 610 9.5 요약 616 CHAPTER 10 부록 619 10.1 임베디드 리눅스 공부하기 620 10.1.1 하드웨어 621 10.1.2 소프트웨어 623 10.2 라즈베리 파이와 OpenCV 626 10.2.1 OpenCV 설치 626 10.2.2 OpenCV를 이용한 영상 처리 프로그래밍 627 10.2.3 OpenCV와 프레임 버퍼를 이용한 카메라 프로그래밍 631 10.2.4 OpenCV를 이용한 얼굴 인식 633 10.3 GStreamer를 이용한 멀티미디어 프로그래밍 637 10.3.1 GStreamer와 멀티미디어 638 10.3.2 GStreamer를 이용한 프로그래밍 642 10.3.3 GStreamer의 도구들 649 10.3.4 GStreamer와 스트리밍 652 10.4 소스 코드: 라즈베리 파이의 제어 664 10.4.1 프로젝트 파일 664 10.4.2 헤더 파일 665 10.4.3 소스 코드 666 찾아보기 682 차 례 xi
머 리말 리눅스 사용 20주년을 기념하고 싶어서 무언가를 남기고 싶었다. 그러다 생각해본 것이 바로 집필이다. 나에게 리눅스는 자유를 위한 꿈이었고 새로운 세계에 대한 동경이었다. 1994년 4월 11일 청운의 꿈을 잠시 접고 육군 논산훈련소에 입대했 다. 군에서 부여받은 주특기 번호는 290, 일명 전산병이다. 4주간의 기초 훈련을 끝내고 성남에 있는 육군 종합 행정학교에 입교했다. 6 주간의 주특기 교육을 받으면서 UNIX 기초, COBOL 프로그래밍, Informix와 4GL 등을 배웠다. 군복무 동안 유닉스를 사용하였는데 실제 시스템을 다루어볼 수 없었기 때문에 막연한 아쉬움이 있었다. 그러던 그해 겨울 C 프로그램 세계 라는 잡지를 통해서 리눅스를 접하게 되었다. 1996년 군 제대 후 때마침 알짜리눅스가 출시되었고, 이때부터 리눅스와의 동고동락이 시작되 었다. 1999년 비트교육센터를 통해서 본격적으로 프로그래밍을 시작하였으며, 2000년에 새롬 에서 만들었던 리눅스용 다이얼패드를 통해서 미래를 위한 발판을 마련하였다. 오랜 시간이 지난 지금도 리눅스는 밥벌이이자 취미이며 인생의 낙이다. 20년 전 리눅스를 하 기로 했던 그날의 선택을 언제나 고맙게 생각하고 있다. 나처럼 보다 많은 사람들이 더 나은 삶을 살아갈 수 있는 세상을 바라며 이 책을 세상에 내놓는다. 지은이 서영진 xii 머리말
감 사의글 세상사 모든 일이 그렇듯이 혼자서 되는 일은 없습니다. 주위 많은 분의 도움으로 긴 여정을 마치고 책을 낼 수 있었습니다. 이 자리를 빌어서 그분들에게 감사의 말을 전합니다. 출판을 허락해주신 출판사 제이펍의 사장님과 관계자 여러분, 그리고 사물인터넷에 이어서 이번 책의 삽화를 그려주신 디자이너 나예랑 님에게 감사의 말씀을 전합니다. 생애 가장 중요했던 시절인 중학교 1학년 때 세상을 알게 해주신 문인고 선생님께 정말 감사드 립니다. 또한, 대학교 때의 은사님이신 목포대학교 전자공학과 박순영 교수님, 오일환 교수님, 故 방만원 교수님, 컴퓨터공학과의 김종화 교수님, 전북대학교 컴퓨터공학과의 조기환 교수님 께도 감사드립니다. 항상 따뜻한 사랑으로 보살펴주시는 숭실대학교 컴퓨터구조 연구실의 김 병기 교수님과 김석윤 교수님에게도 감사드립니다. 그리고 항상 부족한 저를 가르쳐주고 마르 지 않는 샘물 같은 사랑과 지혜로 이끌어주시는 장훈 교수님께 감사의 마음을 전합니다. 뒤에서 변함없는 사랑으로 저를 이끌어주시는 부모님과 동생에게도 감사의 마음을 전합니다. 마지막으로 항상 삶의 방향과 조언을 함께 고민해주고 뒤에서 물심양면으로 말없이 도와주는 세상에서 단 하나뿐인 사랑하는 아내 류영화와 항상 책을 쓰면서 바쁜 가운데 많이 놀아주지 못해도 밝은 웃음으로 기쁨을 주는 나의 사랑하는 딸 서지안에게 고마움을 표하고 싶습니다. 감사의 글 xiii
이 책 에 대 하여 스마트폰이나 스마트패드의 시대에 이어, 모든 사물이 네트워크에 연결되는 사물인터넷의 시 대가 도래했다. 이로 인해 안드로이드 같은 스마트 기기에서 많이 사용되는 리눅스는 더욱 각 광을 받고 있다. 앞으로 (임베디드) 리눅스 전문가가 많이 필요할 것이라는 분석과 함께 임베디 드 리눅스 개발자가 많이 필요한 실정이다. 임베디드 리눅스 개발자를 양성하기 위해서는 임베 디드 보드를 이용한 교육이 필수적이다. 하지만 학교나 일반 교육에서 사용하는 임베디드 보 드 장비들은 수십만 원에서 수백만 원에 이르기 때문에 일반 학생들이 임베디드 교육을 접하 기가 어렵다. 이 책에서는 $20이나 $35 정도로 저렴하게 구입할 수 있는 라즈베리 파이를 이용해서 임베디 드 리눅스 프로그래밍을 배워본다. 기본적인 리눅스의 지식과 리눅스의 기본 명령어, GPIO 같은 하드웨어의 제어, 리눅스 시스템 프로그래밍, 리눅스 GUI 프로그래밍, 리눅스 멀티미디 어 프로그래밍, 리눅스 커널과 디바이스 프로그래밍 등의 다양한 사물인터넷을 위한 리눅스 프로그래밍에 대해서 살펴볼 수 있다. 전체적으로 라즈베리 파이에 HTTP 기반의 웹 서버(Web Server)를 프로그래밍하고 원격 감시 서버를 제작해보면서 기본적인 리눅스 시스템 및 네트워크 프로그래밍에 대한 지식을 획득할 수 있다. 스마트폰이나 PC의 웹 브라우저를 이용해서 라즈베리 파이의 웹 서버에 원격으로 접 속하면 라즈베리 파이에서 카메라로 사진을 찍어서 보여주는 웹페이지가 표시된다. 라즈베리 파이에서는 Pi Camera를 이용해서 1초에 한 장씩 이미지 1 를 찍어서 스마트폰이나 PC로 주기 적으로 전송하고, 사용자는 웹 페이지에 보이는 버튼을 눌러 라즈베리 파이를 직접 제어할 수 있는, 경고음이나 LED 등을 점멸하는 애플리케이션을 작성할 수 있다. 1 동영상 스트리밍을 하고 싶은 경우에는 부록의 GStreamer를 이용할 수 있다. xiv 이 책에 대하여
이렇게 만들어진 원격 감시 서버는 웹상에서만 이용 가능한 것이 아니라, Qt를 이용한 GUI를 통해서 로컬상에서도 기본적인 사용과 서버 관리가 가능하다. 이러한 애플리케이션의 제작을 통해서 원격 감시 서버나 베이비 모니터, 애완견 돌보미 등의 다양한 사물인터넷을 위한 기기 들을 제작할 수 있을 것이다. 운칠기삼( 運 七 技 三 )이라는 말이 있다. 운이 70%, 기술이 30%라는 말로, 사람이 노력만 가지고 모든 일을 이룰 수 없다는 말이지만, 기회가 왔을 때 기회를 놓치지 않으려면 기술이 있어야 한다. 어찌 보면 30%가 아니라 10%의 기술이 없어서 기회를 잡지 못하는 사람들을 여럿 보았 다. 20여 년 전에 리눅스를 만난 것이 필자의 삶을 바꾼 것처럼 이 책이 여러분들에게도 새로 운 기회를 찾을 수 있는 큰 기술의 밑바탕이 될 수 있으면 좋겠다. 이 책은 라즈베리 파이를 이용해서 리눅스 프로그래밍을 할 수 있는 대부분의 사항을 담고 있 고, 특히 리눅스 프로그래밍을 시작하는 사람들을 위해 꼭 필요한 정보들을 담았다. 십여 년 전에 필자를 리눅스 프로그래밍으로 이끌었던 그 책들처럼 누군가에게는 소장하고 싶은 책이 되기를 바랄 뿐이다. 책의 구성 이 책은 3부로 구성되어 있고, 각 부는 3장으로 구성되어 있다. 1부에는 라즈베리 파이를 이용해서 리눅스 프로그래밍을 할 수 있도록 라즈베리 파이의 설정 과 리눅스의 사용법, 그리고 라즈베리 파이의 GPIO를 사용해서 하드웨어를 조작하는 내용을 담았다. 1부는 라즈베리 파이를 다루기 위한 기본적인 내용으로, 아래 설명처럼 해당 내용을 이미 알고 있는 독자는 각 장을 건너뛰고 2부로 넘어가도 괜찮다. 1장은 라즈베리 파이의 설정과 관련된 장으로, 라즈베리 파이를 사용했던 독자라면 다음 장으 로 넘어가도 된다. 2장은 리눅스의 명령어, vi 에디터, gcc, make, gdb, 라이브러리 생성 등 리 눅스 명령어와 관련된 장으로, 리눅스를 이용해서 프로그래밍을 오래 해왔던 독자라면 필요한 내용만 참고하고 다음으로 넘어가도 좋다. 3장은 라즈베리 파이의 GPIO를 이용해서 LED, 스 위치, 모터, 빛 감지 센서, 스피커 등을 다루는 장으로, 이 역시 라즈베리 파이를 이전에 이용 해봤던 독자라면 기본적인 하드웨어만 구성하고 2부로 넘어가도 좋다. 2부에서는 리눅스 시스템 프로그래밍과 네트워크 프로그래밍을 다룬다. 리눅스 시스템 프로 그래밍에는 리눅스의 기본적인 입출력과 시간의 처리, 시그널과 프로세스, IPC와 스레드에 대 이 책에 대하여 xv
한 내용을 담고 있으며, 리눅스 네트워크 프로그래밍에서는 TCP/IP의 개요와 BSD 소켓, UDP 프로그래밍과 TCP를 이용한 서버/클라이언트 프로그래밍 그리고 웹 서버를 만드는 내용을 담 고 있다. 마지막 3부에서는 리눅스 고급 프로그래밍으로 리눅스 멀티미디어 프로그래밍, Qt를 이용한 리눅스 GUI 프로그래밍 그리고 리눅스 커널 프로그래밍을 담고 있다. 리눅스 멀티미디어 프 로그래밍에서는 멀티미디어의 기본적인 이론과 리눅스 사운드 프로그래밍, 리눅스 프레임 버 퍼 프로그래밍, 라즈베리 파이의 Pi Camera를 이용한 Video4Linux 프로그래밍에 대해서 설명 하고 있으며, GUI 프로그래밍에서는 Qt의 기본적인 내용과 사용자 정의 위젯 및 슬롯의 생성, 기본 위젯과 레이아웃, 다이얼로그 등에 대해서 설명한다. 그리고 마지막으로 리눅스 커널에서 는 리눅스 커널을 이용한 라즈베리 파이의 GPIO 제어와 리눅스 커널과 모듈 프로그래밍에 대 한 내용을 담고 있다. 이 책은 스마트폰이나 PC를 이용하여 라즈베리 파이의 Pi Camera에서 찍은 영상을 확인하고, 라즈베리 파이의 하드웨어를 제어할 수 있는 프로그램을 제작한다. 4장부터 8장까지 각 장의 제일 마지막에는 각 장에서 배운 내용을 라즈베리 파이와 어떤 식으로 함께 사용할 수 있는지 담았는데, 이 내용만 따라 해보면 하나의 간단한 프로젝트를 만들 수 있을 것이다. 이 책에는 숙련자를 위한 깊게 보기 코너가 있다. 초보자는 이해가 되지 않을 수도 있으므로 읽지 않고 넘어가도 좋다. 참고하기 는 프로그래밍과 깊은 관계는 없지만 읽어보면 본문의 내 용을 보다 쉽게 이해할 수 있는 내용을 담았고, 각 내용에 대한 참고나 더 자세한 내용을 알고 자 하는 독자를 위해 각주 를 추가하였다. 숨은 이야기 에는 책을 읽다가 머리가 아프거나 심 심할 때 읽어볼 수 있도록 재미있는 내용들을 담았다. 준비사항 라즈베리 파이의 사용에 대해서는 1장에서 이야기한다. 책 내용을 프로그래밍하기 위해서는 기본적으로 라즈베리 파이가 필요하다. 라즈베리 파이는 최신 버전의 라즈베리 파이를 이용하 면 좋은데, 기본적으로 라즈베리 파이 2 B 모델을 기반으로 책을 작성하였다. 이전 버전인 라 즈베리 파이 A+, B나 B+ 모델을 사용할 수도 있으나 속도가 느리며, 몇몇 사항이 다를 수 있 으므로 라즈베리 파이 2 모델과 다른 점에 대해서는 본문의 내용을 참고하기 바란다. xvi 이 책에 대하여
7장의 멀티미디어 프로그래밍에서 카메라와 관련된 사항을 프로그래밍하기 위해서는 라즈베 리 파이 재단에서 공식으로 제공하고 있는 Pi Camera가 있어야 한다. Pi Camera가 없는 경우 에는 리눅스와 Video4Linux2를 지원하는 USB WebCam을 이용할 수도 있겠지만, 라즈베리 파이에서의 설정과 관련해서는 사용하는 USB WebCam에 따라 각각 다르므로 이와 관련된 내용은 인터넷이나 다른 문서들을 참고하기 바란다. 라즈베리 파이는 별도의 외장 공간을 제공하지 않는다. 이를 위해서 라즈베리 파이 A와 B 모 델의 경우에는 SD 카드를 사용하고, A+, B+, 라즈베리 파이 2 B 모델의 경우에는 microsd 카 드를 사용한다. 책의 예제와 Qt, 리눅스 커널을 컴파일하기 위해서는 8GB 이상의 용량이 필 요한데, 라즈베리 파이는 기본적으로 32GB까지 지원하므로 용량을 넉넉하게 준비해두는 것이 좋겠다. 그리고 PC나 노트북에 SD 카드 리더기가 내장되어 있지 않다면 SD/microSD 카드를 위한 외부의 SD 카드 리더기가 필요하다. 라즈베리 파이를 모니터나 TV와 연결하기 위해서는 별도의 HDMI 케이블이 필요하고, USB 포트를 사용하는 키보드나 마우스가 필요하다. 이는 기존의 PC에서 사용하던 것을 그대로 가 져와서 연결해서 사용할 수 있다. 그리고 라즈베리 파이에 전원을 공급하기 위해서 안드로이 드 폰이나 윈도우 폰에서 사용하는 5V 2A의 마이크로 USB 타입의 어댑터가 필요하다. 또한, UTP 케이블을 직접 라즈베리 파이와 연결해서 유선랜을 사용할 수도 있고, 무선 USB 카드를 이용해서 무선랜을 사용할 수도 있다. 라즈베리 파이와 전자 부품과 관련된 사항들은 이 책의 3장에서 이야기하고 있다. 이 책에서 는 라즈베리 파이의 GPIO 포트를 이용해서 발광 다이오드 등 다양한 부품을 사용하며, 이 책 에서 사용한 전자부품의 종류는 다음과 같다. 이 책에 대하여 xvii
이 책에서 사용한 부품 리스트 구분 단위 수량 내용 비고 발광 다이오드 1개 전기 에너지를 빛으로 발산한다. + / 극성 저항 220 9개 전류의 흐름을 제한한다. 10 2개 스위치 1개 전류를 흐르거나 흐르지 않게 한다. 4단자 스피커 1개 전기의 신호를 소리로 변환한다. 2단자 빛 감지 센서(CdS) 1개 빛을 감지해서 내부 저항을 조정한다. DC 모터 1개 전기를 운동 에너지로 변환한다. 트랜지스터 PN2222A 1개 전류의 흐름을 제어한다. NPN형 건전지 박스 1개 전류를 제공한다. AA형x2 온습도 센서 DHT11 1개 온습도 정보를 제공한다. 7세그먼트(FND) 1개 숫자를 표시한다. 애노드 공통형 SN7447 1개 7세그먼트를 위한 디코더 IC 브레드보드 1개 전자 소자를 구성하기 위해서 필요하다. 이 기본적인 전자소자들 이외에도 다른 용량의 저항이나 콘덴서가 필요하고, 라즈베리 파이와 브레드보드 위의 전자 소자들과의 연결을 위해서 커넥터나 별도의 전선 등이 필요할 수 있다. 그리고 건전지 박스에서 사용할 별도의 건전지 등이 필요하다. 그리고 라즈베리 파이도 전자제품이기 때문에 아랫면이 금속이나 액체에 의해서 파손될 수 있 다. 2015년 6월 16일 라즈베리 파이 재단에서는 라즈베리 파이를 위한 공식 케이스를 출시하였 다. 또한 여러 종류의 케이스를 판매하고 있는데 이러한 케이스를 이용해서 제품을 보호해주 는 것이 좋다. 라즈베리 파이 공식 케이스 xviii 이 책에 대하여
책에서 사용하는 라즈베리 파이와 부품들은 (주)에이티코퍼레이션의 온라인 쇼핑몰(http:// minishop.gmarket.co.kr/atcorp11)에서 구매할 수 있다. 라즈베리 파이와 부품들 소스 코드는 소스포지(Sourceforge.net)에서 다운로드할 수 있다. 서브버전(Subversion)을 이용해 서 다운로드해야 하는데, 라즈베리 파이에는 기본적으로 서브버전이 설치되어 있지 않다. 우 분투의 apt-get 명령어 2 를 이용하여 다음과 같이 다운로드한다. pi@raspberrypi ~ $ sudo apt-get install subversion Reading package lists... Done /* ~ 중간 생략 ~ */ Setting up subversion (1.7.5-1+rpi3)... pi@raspberrypi ~ $ svn checkout svn://svn.code.sf.net/p/linuxprogrammingwithrpi/ svn/ linuxprogrammingwithrpi-svn A linuxprogrammingwithrpi-svn/trunk A linuxprogrammingwithrpi-svn/branches /* ~ 중간 생략 ~ */ 서브버전을 설치한 후 svn의 checkout 옵션을 이용해서 소스 코드를 다운로드한다. A S 책과 관련된 새로운 내용의 업데이트는 다음의 페이스북 그룹을 통해서 얻을 수 있다. 또한 책 내용과 관련하여 궁금한 사항이 있다면 이 그룹을 통해 문의할 수 있다. http://www.facebook.com/groups/linuxprogrammingwithraspberrypi 2 apt-get은 우분투(Ubuntu)를 포함한 데비안(Debian) 계열의 리눅스에서 쓰이는 패키지 관리 명령어이다. 이 책에 대하여 xix
베 타 리 더 후 기 제이펍은 책에 대한 애정과 기술에 대한 열정이 뜨거운 베타리더들로 하여금 출간되는 모든 서적에 사전 검증을 시행하고 있습니다. 장승진 (한단정보통신) 임베디드 리눅스 개발은 광범위한 영역을 포함하기에 실무를 담당하는 개발자라도 개발 영역 전체를 제대로 알기가 어렵습니다. 이 책에서는 라즈베리 파이를 이용하여 임베디드 리눅스의 많은 영역을 쉽게 설명하고자 노력한 저자의 고민과 내공이 느껴집니다. 도움을 주고자 베타리 딩을 신청했지만 오히려 제가 도움을 받게 되어 감사를 드립니다. 조덕명 (에이치엠씨) 라즈베리 파이에 대한 활용서는 많지만 임베디드 프로그래밍을 다룬 책은 거의 없었는데 이 책을 먼저 읽을 기회를 가져서 무척 기쁩니다. 이 책은 기본적인 라즈베리 파이에 대한 설명부 터 네트워크, GUI, 멀티미디어, 디바이스 드라이버까지 넓은 분야를 설명하고, 구동 가능한 코드까지 포함하여 어렵지 않게 읽을 수 있었습니다. 라즈베리 파이를 이용해서 메이커 프로 젝트를 해보고 싶은 분이라면 이 책을 읽어보기를 추천합니다. 조철현 (커머스플래닛) 이 책은 어렵다고 느낄 수 있는 시스템 프로그램을 포함해 다양한 개발 영역을 다루는 풍부한 내용이 강점이라고 생각합니다. 라즈베리 파이를 이용하여 기존의 리눅스보다 쉽게 접근할 수 있도록 했고, 차근히 따라 하면서 프로그래밍을 학습하기에 좋은 책입니다. gcc와 vi에 대한 설 명은 리눅스 프로그래밍을 위해 반드시 알아야 할 부분인데, 이를 충실히 포함하고 있어 더욱 좋았습니다. xx 베타리더 후기
IPART 21세기에 들어서면서 스마트폰과 웨어러블 장비 등의 스마트 기기들로 대표되는 사물인터넷 시대가 열렸다. 이러한 사물인터넷의 중심에는 리눅스 같은 오픈 소스와 위키피디아나 TED로 잘 알려진 오픈 콘텐츠 그리고 아두이노, 라즈 베리 파이 같은 오픈 소스 하드웨어가 자리 잡고 있다. 이 책은 라즈베리 파이라는 임베디드 보드를 이용해서 사물인터넷을 위한 리눅스 애플리케이션 프로그래밍에 대해서 학습하는 책이다. 1부에서는 라즈베리 파이를 사용하기 위해 필요한 라즈베리 파이의 설정을 비롯한 개발환경의 구성과 기본적인 리눅 스 사용법을 다루며, 라즈베리 파이의 GPIO를 이용하여 LED나 스위치 같은 하드웨어를 다루는 방법들을 배운다. 여 기에서 배우는 라즈베리 파이와 리눅스 개발환경에 대한 기본적인 개념은 뒤에서 리눅스 시스템 프로그래밍, 리눅스 네트워크 프로그래밍 등의 내용과 함께 실제 임베디드 리눅스 애플리케이션을 작성하는 초석이 될 것이다.
P A R T I 1부는 라즈베리 파이와 리눅스 프로그래밍을 위한 기본적인 내용들을 설명하며, 총 세 개 장으로 구성 되어 있다. CHAPTER 1 사물인터넷과 라즈베리 파이 : 라즈베리 파이 시작하기 1.1 사물인터넷과 오픈 소스 하드웨어 플랫폼 1.2 라즈베리 파이 한 입 베어 물기 1.3 라즈베리 파이를 위한 주변 도구 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 1장에서는 사물인터넷이라는 개념을 설명하고 아두이노나 라즈베리 파이 같은 오픈 소스 하드웨어 플랫 폼에 대해서 설명한다. 라즈베리 파이의 등장 배경과 라즈베리 파이를 사용하기 위해서 필요한 디스크 이미지 설치와 환경 설정과 같은 기본적인 내용들을 설명하는데, 이를 이용해서 라즈베리 파이와 리눅 스 프로그래밍을 위한 기본적인 개발환경을 구성할 수 있을 것이다. CHAPTER 2 리눅스의 기초 : 라즈베리 파이와 친해지기 2.1 리눅스의 사용환경과 구조 2.2 리눅스의 기본 명령어 2.3 vi 에디터 2.4 리눅스의 프로그래밍 도구 2장에서는 라즈베리 파이를 사용해서 프로그래밍을 진행하기 위한 기본적인 내용을 설명한다. 리눅스 의 기본적인 유틸리티에 대해서 설명하는데, 이를 통해서 리눅스와 라즈베리 파이를 사용하는 방법에 대해서 알 수 있을 것이다. 그리고 리눅스 프로그래밍에 필요한 vi 에디터, gcc, make, gdb 등의 텍스트 에디터나 컴파일러 같은 도구들의 사용법도 설명한다. CHAPTER 3 라즈베리 파이와 GPIO : 하드웨어의 제어 3.1 GPIO의 개요 3.2 LED 제어 프로그래밍 3.3 wiringpi를 이용한 GPIO 프로그래밍 3.4 스위치와 센서를 이용한 입출력 3장에서는 라즈베리 파이의 GPIO를 이용해서 하드웨어를 제어하는 방법에 대해서 설명한다. 라즈베리 파이에서도 아두이노를 다루는 것처럼 쉬운 방법을 제공하기 위해 WiringPi라는 라이브러리를 제공하 는데, 여기서는 이를 통해 GPIO를 제어하는 방법을 설명하고, 이를 이용해서 LED를 켜고 끄는 프로그램 을 작성한다. 그리고 라즈베리 파이에서 사용할 수 있는 각종 센서를 소개하며, 이를 이용한 회로의 구 성과 프로그래밍 방법을 설명한다.
C H A P T ER 1 사물인터넷과 라즈베리 파이 남극이 녹아 세상을 찾아 떠나다. 북극곰과 펭귄을 구해주세요. (Save Mother Earth, Save the Arctic.)
2007년 애플의 스티브 잡스의 아이폰으로부터 시작된 스마트 기기와 소셜 인터넷의 시대는 이 제 새로운 사물인터넷의 시대로 진화하고 있다. 사물인터넷은 인터넷에 연결된 모든 것으로 번 역할 수 있는데, 사물이 인터넷을 통해서 연결되고, 통신으로 정보를 교환하는 모든 기기가 유 기적으로 하나로 연결되는 시대가 도래한 것이다. 이러한 사물인터넷 시대의 중심에는 리눅스를 필두로 하는 오픈 소스와 오픈 콘텐츠 그리고 오픈 소스 하드웨어 플랫폼과 같은 자유와 공유의 정신이 자리 잡고 있다. 리처드 스톨먼의 GNU(GNU s Not UNIX) 프로젝트로 시작한 자유 소프트웨어 운동은 GNOME이나 KDE 등 수 많은 오픈 소스 프로젝트를 가능하게 하였고, 이는 아두이노와 라즈베리 파이 같은 오픈 소스 하드웨어나, 위키피디아와 TED 같은 오픈 콘텐츠 시대의 토대가 되고 있다. 이러한 다양한 오 픈 정신과 여러 플랫폼의 융합을 통해 새로운 사물인터넷의 시대로 널리 퍼지게 될 것이다. 이번 장에서는 사물인터넷의 기본적인 개념과 오픈 소스와 오픈 소스 하드웨어 플랫폼에 대해 서 알아보고, 오픈 소스 하드웨어의 대표 주자인 라즈베리 파이를 이용한 리눅스의 사용에 필 요한 기본적인 사항들에 대해서도 알아보도록 하겠다. 1.1 사물인터넷과 오픈 소스 하드웨어 플랫폼 스마트 기기의 발전은 사물인터넷 시대라는 새로운 시대를 열고 있다. 사물인터넷과 오픈 소 스 하드웨어 플랫폼 그리고 라즈베리 파이에 대해서 알아보도록 하자. 1.1.1 사물인터넷 2007년 발표된 아이폰으로부터 시작된 스마트폰은 스마트패드, 스마트TV 등의 스마트 기기들 로 이어졌으며, 스마트글래스, 스마트워치 등의 웨어러블 기기로까지 발전했다. 이외에도 스마 트 가전제품, 스마트홈에 대한 기술들이 쏟아지고 있다. 웨어러블 디바이스 (Wearable Device) 스마트 카 (Smart Car) 스마트 홈 (Smart Home) 페이저 (Pager) 베이식폰 (Basic phone) 피처폰 (Feature Phone) 스마트폰/패드 (Smart Phone/Pad) 스마트 TV (Smart TV) 스마트 플랫폼 (Smart Platform) 그림 1-1 스마트 기기들의 발전 4 CHAPTER 1 사물인터넷과 라즈베리 파이
다양한 스마트 기기들의 발전과 함께 모든 기기들이 인터넷에 연결되는 사물인터넷은 우리 생 활 속 깊숙이 침투하고 있으며, 이러한 기기들은 사람의 삶을 보다 편리하고 안전하게 만들어 줄 것으로 기대된다. 이러한 사물인터넷의 발전에는 리눅스 같은 오픈 소스나 위키피디아나 TED(Technology, Entertainment, Design)와 같은 오픈 콘텐츠 그리고 오픈 소스 하드웨어가 밀접 하게 관련되어 있다. 1.1.2 오픈 소스의 발전과 오픈 소스 하드웨어의 등장 초창기의 오픈 소스는 미국 해커들과 BSD 유닉스와 함께 시작하였다. 1 AT&T의 연구소인 벨 (Bell) 연구소에서 1960년대 말에 개발된 유닉스는 UC 버클리(University of California, Berkeley)에 제공하였고, 이는 다시 많은 해커들의 도움으로 크게 발전해나갔다. 2 1984년 AT&T가 해체되 면서 유닉스의 상업화가 시작된다. 리차드 스톨먼에 의해서 시작된 GNU(GNU s Not UNIX) 프 로젝트는 자유롭게 사용할 수 있는 GNU의 도구 및 컴파일러를 만들었고, 이는 다시 리눅스 (Linux)를 비롯한 많은 오픈 소스 소프트웨어의 개발을 이끌었다. 2010년 SourceForge.net 설립 Free Software Foundation 설립 리차드 스톨만 2007년 2000년 1999년 1998년 1991년 1990년 1985년 1983년 1980년 1976년 1970년 오픈 소스 모바일 플랫폼 Android 발표 Google Inc. Open Source Initiative 설립 에릭 레이몬드(Eric S. Raymond) Linux Kernel 공개 리누스 토발즈 GNU 프로젝트 시작 리차드 스톨만 Apple I 발표 스티브 워즈니악, 스티브 잡스 2015년 Linux 커널 4.0 발표 2011년 Linux 커널 3.0 발표 2007년 Android 발표 2005년 Maemo 발표 1996년 Linux 커널 2.0 발표 1995년 MS Windows 95 발표 1994년 3월 14일 Linux 커널 1.0 발표 1992년 MS Windows 3.1 발표 1990년 MS Windows 3.0 발표 1988년 10월 12일 NeXTSTEP 발표 1984년 Mac OS 발표 1982년 UNIX System III 개발 1981년 MS-DOS 출시(Microsoft) 1977년 BSD UNIX 발표 (Computer Systems Research Group) 1976년 4월 1일 Apple Inc 창업 1973년 UNIX를 C 언어로 재작성 (Bell 연구소/켄 톰프슨, 데니스 리치) 그림 1-2 오픈 소스의 발전 1 http://www.joinc.co.kr/modules/moniwiki/wiki.php/site/linux/documents/hacker_unix 2 1980년대 초까지만 하더라도 AT&T는 미국 통신 시장을 90% 이상 점유하고 있었기 때문에 독과점으로 컴퓨터 시장 쪽으로 진출할 수 없었다. 1.1 사물인터넷과 오픈 소스 하드웨어 플랫폼 5
1991년 핀란드의 리누스 토발즈(Linus Benedict Torvalds)가 공개한 리눅스는 수많은 해커들의 영 향으로 급속도로 발전하였다. 이러한 리눅스의 발전은 1990년대 서버 시장에서 두각을 나타내 었고 2000년대에 들어서면서 임베디드(Embedded) 분야로 진출한다. 2005년 이후에는 모바일 분야로도 진출하는데 안드로이드(Android), 리모(LiMo), 모블린(Moblin), 마에모(Maemo), 미고 (MeeGo), 타이젠(Tizen) 등 수많은 스마트폰 플랫폼의 기본 운영체계로 사용되었으며, 삼성전자 나 LG전자, 구글의 스마트TV에서도 기본 운영체제로 사용되고 있다. 리눅스가 발전하면서 오픈된 리눅스 커널을 이용한 수많은 프로젝트들이 생겨났고, 이는 곳 임 베디드 기기의 발전과 오픈 소스 하드웨어의 등장을 불러일으켰다. 초기의 임베디드 교육은 값 비싼 임베디드 보드를 이용하였는데 이는 개발자들이 임베디드 개발에 뛰어들기 어렵게 하였다. 그리고 기초 전자 부품들을 다루기 위해서는 기본적인 저항과 콘덴서, PCB 설계와 인두를 이 용한 납땜 등의 전자공학에 대한 전문 지식이 필요하다. 게다가 만들어진 하드웨어를 구동시 키기 위해 필요한 소프트웨어 개발 등의 상당히 많은 지식을 필요로 했다. 이는 비전공자뿐만 아니라 소프트웨어 전공자에게도 상당한 진입의 장벽으로 작용했다. 이에 대한 대안으로 비글보드, 아두이노, 라즈베리 파이, 인텔의 갈릴레오 보드, NVIDIA Jetson TK1 등 다양한 오픈 소스 하드웨어들이 등장하였다. 이러한 오픈 소스 하드웨어 플랫 폼은 진입 장벽을 낮춰서 보다 많은 개발자들이 쉽게 하드웨어를 다룰 수 있도록 하였다. 이를 통해서 자신의 아이디어를 직접 구현할 수 있게 되었는데, 그중에서도 아두이노나 라즈베리 파 이 같은 오픈 소스 하드웨어 기반의 임베디드 보드가 많이 사용되고 있다. 표 1-1 대표적인 오픈 소스 하드웨어의 비교 분류 아두이노 라즈베리 파이 비글 보드 인텔 갈릴레오 엔비디아 젯슨 TK1 주요 모델 우노(Uno) R3 RPi2 B 비글본 Black GALILEO GEN 2 NVIDIA Jetson TK1 가격 $24.95 $35 $55 $70 $192 CPU ATmega 328P Cortex-A7 쿼드코어 OMAP3530 Cortex-A8 듀얼 코어 Quark SoC X1000 Cortex-A15 쿼드코어 테그라K1 192코어 리눅스 미지원 지원 지원 지원 지원 클록 주파수 16MHz 900MHz 1GHz 400MHz 2.3GHz 메모리 2KB 1GB 512MB 256MB 2GB 저장공간 32KB micro SD 카드 4GB micro SD 카드 16GB / SD 카드, SATA 이더넷 없음 10/100M 10/100M 10/100M 10/100/1000M USB 없음 4x USB 2.0 1x USB 2.0 1x USB 2.0 1x USB 3.0 6 CHAPTER 1 사물인터넷과 라즈베리 파이
숨은 이야기 오픈 소스의 탄생 과정 오픈 소스란 소프트웨어 혹은 하드웨어의 제작자의 권리를 지키면서 원시 코드를 누구나 열람할 수 있도록 한 소프트웨어 혹은 오픈 소스 라이선스에 준하는 모든 통칭 3 을 뜻하며, 일반적으로 자 유롭게 사용, 복사, 배포, 수정이 가능한 애플리케이션으로 자유(Free) 소프트웨어를 포함한 넓은 개 념을 의미한다. 자유 소프트웨어 운동은 리처드 스톨먼(Richard Matthew Stallman)에 의해 시작되었다. 리처드 스톨 먼은 기존의 유닉스에서 컴파일러 같은 소프트웨어가 값비싸게 판매되는 것 때문에 다른 소프트웨 어의 개발이 저해된다고 생각하였다. 그래서 1985년에 자유 소프트웨어의 생산과 보급을 장려하기 위해 FSF(Free Software Foundation)라는 단체를 설립하였다. 1985년에 스톨먼은 GNU 선언문을 발표하였고, 1989년에 일반 공중 사용 허가서(GPL) 내에 카피레 프트(copyleft)의 개념을 적용하였다. GNU/FSF하에 많은 자유 소프트웨어 기반의 애플리케이션이 만들어지기 시작되었으며, 리처드 스톨먼을 비롯한 수많은 개발자들이 GNU 시스템을 완성하기 위 해 노력했다. 이러한 오픈 소스 소프트웨어의 대표 주자가 바로 리눅스다. 리눅스는 1991년 리누스 토발즈(Linus Torvalds)가 리눅스 커널을 발표하면서 시작되었다. 리눅스는 미닉스를 기반으로 만들어졌는데 GPL 로 공개된 이후 수많은 해커들이 모여들면서 현재 가장 많이 사용되는 운영체제로 거듭났다. 리눅스는 소스 코드가 공개되어 있어서 누구나 수정이 가능하고 자유롭게 배포할 수 있기 때문에 특정한 기기 기반으로 작동하는 임베디드 시장에 적합하였고, 효율성을 중시하는 정책 때문에 낮 은 사양의 CPU에서도 높은 성능을 발휘할 수 있었다. 리눅스 등장 이래 많은 개발자들이 오픈 소스로 모여들었다. 단순한 이윤 추구를 넘어 재미와 실험 적 정신들, 70년대 히피들이 공유했던 자유, 박애, 평화의 문화가 소프트웨어에 불어닥친 것이다. 이 러한 오픈 소스 운동은 자신의 코드를 남과 공유하면서 서로의 발전을 이끌었으며 자유를 누리고 픈 개발자들 사이에서 폭발적인 인기를 끌었다. 현재 웹 서버의 60~70%를 점유하고 있는 아파치(Apache)도 오픈 소스의 결과물이고, 리눅스의 대 표적인 소프트웨어인 GNOME이나 KDE 같은 프로젝트가 생겨났으며, IBM과 다른 기업들도 오픈 소스 운동에 적극 동참하였다. 현재는 세계 스마트폰 시장 점유율 70% 이상을 차지하는 구글의 안드로이드나 리눅스 재단의 타 이젠 등의 스마트 플랫폼도 오픈 소스로 개발되고 있으며, IBM에서 개발한 이클립스(Eclipse) 역시 오픈 소스로 개발되고 있다. 이러한 오픈 소스의 성공은 사물인터넷 시대의 등장에 지대한 영향을 주었고 앞으로 함께 발전하리라 생각된다. 1.1.3 아두이노 아두이노(Arduino)는 2005년 이탈리아의 디자인학교 교수였던 마시모 반지(Massimo Banzi)가 이 탈리아의 풍부한 예술적 감성을 지닌 디자이너와 정보기술(IT)의 융합 인재 교육을 목표로 개 발한 임베디드 보드다. 아두이노는 임베디드 개발 경험이 전혀 없는 이용자들도 쉽게 활용할 수 3 http://ko.wikipedia.org/wiki/ _ 1.1 사물인터넷과 오픈 소스 하드웨어 플랫폼 7
있도록 개발 툴이나 회로도 등을 오픈 소스 형태로 제공하고 있다. 기존의 디자인 시장에서는 디자인에 하드웨어를 접목하는 데 문제가 많았는데, 이를 해결해준 것이 바로 아두이노다. 아두이노는 오픈 소스와 8비트 AVR CPU인 Atmel AVR을 기반으로 하는 저사양의 마이크로 컨트롤러 보드로, 크기가 작고 저전력의 배터리로도 구동이 가능하다. 최근에는 아두이노 듀 에(Due)나 제로(Zero)와 같이 Cortex-M3를 이용한 제품들도 선보이고 있다. 가격이 비교적 저 렴하여 아두이노 우노(UNO)의 경우 30달러 내외로 구매가 가능하다. 그림 1-3 다양한 아두이노 보드(왼쪽부터 UNO, DUE, MEGA, MICRO) 아두이노는 보다 편리한 소프트웨어 개발을 위해 스케치(sketch)라는 통합 개발환경(IDE, Integrated Development Environment)을 제공한다. 스케치는 단순하고 간단한 문법을 사용하는 데 C나 C++을 모르더라도 쉽게 접근할 수 있다. 여기에 어도비 플래시, 프로세싱(Processing), Max/MSP 같은 소프트웨어 도구들을 연동할 수도 있다. 그림 1-4 아두이노의 개발환경 이러한 아두이노의 쉬운 개발환경은 AVR이나 임베디드를 모르는 사람들에게도 쉽게 개발에 접근할 수 있는 환경을 제공한다. 이를테면, 아두이노 보드를 컴퓨터의 USB에 연결하고 스케치 8 CHAPTER 1 사물인터넷과 라즈베리 파이
프로그램으로 명령어를 작성해서 실행(다운로드)하면 된다. 이처럼 기존의 임베디드 보드를 사용 하는 데 필요한 복잡한 과정을 대폭 생략했기 때문에 초보자들도 쉽게 사용할 수 있다. 또한 아두이노는 여러 개의 디지털 핀과 아날로그 핀을 제공한다. 이를 통해 조도, 온도, 습도 등을 측정하는 다양한 센서는 물론, 스피커, LED, 모터 등의 다양한 외부장치를 연결하여 다 른 디바이스들을 제어할 수 있다. 디지털 핀 RX / TX LED USB 잭 파워 LED 리셋 버튼 ICSP 헤더 전원 레귤레이터 마이크로 컨트롤러 전원 잭 파워 핀 그림 1-5 아두이노의 다양한 포트 아날로그 입력 핀 이러한 입출력 포트를 이용해서 다양한 디바이스들을 제어할 수 있으며, 이를 이용한 여러 제 품들이 출시되고 있다. 구글은 안드로이드와 통신해서 사용할 수 있는 표준 보드로 아두이노 메가(Mega)를 선정하였다. 안드로이드 허니콤(버전 3.1)부터 USB를 통한 액세서리 장치를 지원 하는 표준인 ADK(Accessory Development Kit)를 사용할 수 있다. 디자인에서도 간단한 전자장치의 구현을 위해 아두이노 보드를 사용하고 있다. 특히 패션과 웨어러블 분야에서는 아두이노 호환 보드인 릴리패드나 FLORA 보드를 이용해서 많은 제품 들을 개발하고 있다. 그림 1-6 아두이노 릴리패드(LilyPad) 1.1 사물인터넷과 오픈 소스 하드웨어 플랫폼 9
1.2 라즈베리 파이 한 입 베어 물기 1.2.1 라즈베리 파이 라즈베리 파이(Raspberry Pi)는 영국의 라즈베리 파이 재단(Raspberry Pi Foundation)에서 2012년 1월 29일에 출시한 ARM 기반의 초소형 임베디드 보드 컴퓨터로, 기초 컴퓨터 과학 교육을 증 진시키기 위한 목적으로 개발된 싱글 보드 컴퓨터다. USB(Universal Serial Bus)와 하드웨어 연결을 위한 GPIO, 인터넷 연결을 위한 이더넷(B와 B+ 모 델), 사운드 출력 단자, 모니터 연결을 위한 HDMI(High-Definition Multimedia Interface) 등의 다 양한 포트들을 지원하며, 기존의 데스크탑 PC와 유사하게 키보드, 마우스 등의 주변기기와 연결해서 사용할 수 있어 일반적인 소형 PC로도 사용이 가능하다. 간단한 C 언어 프로그래밍 이나 동영상을 재생할 수 있는 MPC(Multimedia PC)로도 사용되고 있다. 모델 A 모델 A+ 모델 B 모델 B+ 그림 1-7 라즈베리 파이 Raspberry Pi 2 모델 B 1.2.2 라즈베리 파이의 모델 및 구조 라즈베리 파이는 ARM 기반의 미국 브로드컴(Broadcom)에서 나온 700MHz의 싱글코어 BCM2835나 900MHz의 쿼드코어 BCM2836 SoC를 사용하는데 그래픽 처리 장치 4 (GPU: Graphics Processing Unit), 디지털 신호 처리 장치(DSP: Digital Signal Processor), SD램(SDRAM) 등 4 https://ko.wikipedia.org/wiki/ _ _ 참고 10 CHAPTER 1 사물인터넷과 라즈베리 파이
이 탑재되어 있다. 라즈베리 파이는 여러 모델로 판매되는데, CPU의 종류, 램(RAM)의 크기 및 USB 포트 수에 따라 모델 A와 모델 B, 그리고 2014년에 발표된 모델 B+(7월), 모델 A+(11월)와 2015년 2월에 발표된 라즈베리 파이 2 모델 B 등으로 구분할 수 있다. 모델 A 시리즈는 한 개 의 USB 포트 장착되어 있지만 이더넷 콘트롤러는 없으며, 모델 B 시리즈는 두 개 혹은 네 개의 USB 포트와 10/100 이더넷 컨트롤러가 장착되어 있다. 표 1-2 라즈베리 파이의 모델 비교 구분 Model A Model A+ Model B Model B+ RPi 2 B CPU 멀티미디어 애플리케이션 프로세서 Broadcom BCM2835 Broadcom BCM2836 메모리 (RAM) 256MB SDRAM 400MHz 512MB SDRAM 400MHz 저장공간 SD Card microsd Card SD Card microsd Card USB 포트 1x 2x 4x 이더넷 포트 없음 1x 전원 5V 1.2A 600mA 5V 1.8A 600mA 5V 1.2A 750mA 5V 1.8A 600mA GPIO 핀 26 40 26 40 1GB LPDDR2 SDRAM 400MHz 5V 2A 800mA USB의 출력 전압은 5V이며 전류는 USB 1.0/2.0에서 0.5A(500mA)이고, USB 3.0에서 0.9A(900mA)이다. 라즈베리 파이는 아두이노에 비해서 상당히 빠른 CPU(브로드컴의 BCM2835 700MHz 또는 BCM2836 900MHz 쿼드코어)와 128MB 5 /256MB/512MB/1GB의 메모리(RAM)를 가지고 있으며, SD 메모리 카드를 이용해서 외부 메모리 공간을 사용할 수 있다. 그리고 OpenGL ES를 지원 하는 그래픽 칩을 사용하고 있으며, 성능에 비해 아주 저렴한 가격(모델 A는 25달러, 모델 A는 20 달러, 모델 B와 B+, 라즈베리 파이 2 B는 35달러)에 제공된다. 라즈베리 파이 모델 B 시리즈는 유선랜을 지원하기 위해 UTP(Unshielded Twisted Pair) 케이블 을 위한 RJ-45 단자를 제공하고 있지만 라즈베리 파이 모델 A 시리즈에서는 별도의 랜을 위한 단자를 지원하지 않는다. 초기의 라즈베리 파이 A 모델은 메모리가 128MB였지만 256MB로 바 로 업데이트되었다. 라즈베리 파이 B 모델은 512MB의 메모리를 지원하고, 라즈베리 파이 2는 1GB의 메모리를 지원한다. 기본적으로 디스크 공간을 위해 SD 카드(모델 A, B)나 MicroSD 카드 (모델 B+)를 사용하고 있다. 5 초기 모델에는 있었으나 현재 모델에는 나오지 않는다. 1.2 라즈베리 파이 한 입 베어 물기 11
기본적으로 USB 포트를 이용해서 USB 이더넷이나 무선랜, PC의 키보드나 마우스를 사용할 수 있다. 기존의 B 모델의 경우 USB 포트가 두 개였기 때문에 마우스나 키보드를 사용하면 다 른 포트를 사용할 수 없으므로 별도의 USB 허브가 필요했다. 2014년에 출시된 모델 B+와 2015 년에 나온 라즈베리 파이 2 모델 B에서는 기존의 컴포지트를 위한 RCA 단자를 없애고 USB가 두 개 더 추가되었다. 40핀 GPIO 헤더 USB & LAN 컨트롤러 브로드컴 BCM2836 USB(4 Ports) DSI 디스플레이 커넥터 메모리 10/100 BaseT 이더넷 SD 카드 슬롯 Micro USB (5V 1A DC) HDMI CSI 카메라 커넥터 그림 1-8 라즈베리 파이 2 모델 B의 외부 포트 오디오와 컴포지트 비디오 (4-pole 3.5mm) 라즈베리 파이는 영상 출력을 위한 HDMI 포트와 CSI 카메라 커넥트 그리고 아두이노처럼 외 부 하드웨어 제어를 위한 GPIO 포트 등을 제공한다. 이러한 GPIO 포트와 같은 외부 포트를 이용하는 하드웨어들이 있는데 Pi 카메라 같은 표준 모듈과 LCD나 Rapiro 같은 비표준 모듈 들이 제공되고 있다. 그림 1-9 Pi 카메라와 다양한 비표준 모듈 12 CHAPTER 1 사물인터넷과 라즈베리 파이
2015년 2월 2일 발표된 라즈베리 파이 2 모델은 기존의 모델 B+와 동일한 구조를 제공하지만 CPU가 브로드컴의 BCM2836으로 바뀌면서 900MHz의 쿼드코어를 지원하고 있으며, 메모리 도 1GB로 2배 증가하여 기존에 비해 6배 이상 빨라졌다. 1.3 라즈베리 파이를 위한 주변 도구 이제 라즈베리 파이를 이용한 임베디드 개발에 필요한 도구들을 알아보자. 이를 위해서 라즈 베리 파이와 더불어 표 1-3과 같은 도구들이 필요하다. 표 1-3 라즈베리 파이 사용을 위한 준비도구 구분 SD / microsd 키보드 / 마우스 마이크로 USB 5V 2A 전원 USB 무선랜 HDMI 케이블 내용 라즈베리 파이에서 리눅스의 사용이나 디스크 공간을 위한 별도의 저장공간이 필요한데 SD 카드를 이용해서 이를 해결하고 있다. 사용자와의 입력을 위한 키보드와 마우스가 필요하며, 기존의 PC에서 사용하던 USB 기반의 키보드나 마우스를 이용하면 된다. 라즈베리 파이는 마이크로 USB 단자 형태의 5V 2A의 전원을 사용한다. 기존의 스마트폰에서 사용하는 전원을 그대로 이용하면 된다. 무선랜을 사용하기 위해서는 별도의 무선랜 카드가 필요하다. PC에서 사용하는 대부분의 USB 무선랜은 라즈베리 파이를 지원하며, 구매하기 전에 사용 가능한지 인터넷 등을 통해서 확인해보도록 한다. 라즈베리 파이에서 나오는 영상을 모니터나 TV에 표시하기 위해서는 별도의 HDMI 케이블이 필요하다. 라즈베리 파이를 사용하기 위해서는 라즈베리 파이 본체와 저장공간으로 사용되는 SD 카드, 전원 공급을 위한 USB 어댑터(5V)나 USB 케이블이 기본적으로 필요하다. 또한, 모니터 출력을 위한 HDMI 케이블이나 비디오 컴포지트 케이블이 필요하고, Pi 카메라 같은 외부 주변장치나 LED 등의 전자부품, 브레드보드(Breadboard) 등의 하드웨어가 별도로 필요할 수 있다. 1.3 라즈베리 파이를 위한 주변 도구 13
1 17 16 15 14 2 3 4 5 6 7 8 9 1 7세그먼트 2 저항 3 발광 다이오드(LED) 4 온습도 센서 5 빛 감지(조도) 센서 6 DC 모터 7 IC(74 시리즈) 8 건전지 박스 9 브레드보드 10 HDMI 케이블 11 마이크로 USB 케이블 12 마이크로 SD 카드 13 5V 전원 14 무선랜 15 피에조 부저(스피커) 16 커넥터 17 스위치 13 12 11 10 그림 1-10 라즈베리 파이를 이용하기 위해 필요한 주변장치들 6 1.3.1 라즈베리 파이와 SD 카드 당연한 이야기일지 모르겠지만 기본적으로 라즈베리 파이가 있어야 한다. 라즈베리 파이는 공식 적으로 RS컴포넌츠(RS Components) 7 나 엘리먼트14(element14) 8 에서 판매하고 있으며, 국내에서는 엘 레파츠(eleparts) 9, 아이씨뱅큐(ICBanq) 10, 인터파크나 옥션 등의 사이트를 통해 구매가 가능하다. 그림 1-11 라즈베리 파이 패키징과 B+ 및 B 모델 6 각 부품들에 대해서는 이 책에 대하여 의 준비사항 을 참고하라. 7 http://www.rs-components.com/raspberrypi 8 http://kr.element14.com 9 http://www.eleparts.co.kr 10 http://www.icbanq.com 14 CHAPTER 1 사물인터넷과 라즈베리 파이
이미 기존의 모델 B+나 B, A가 있다면 이를 사용해도 되지만 속도가 너무 느리기 때문에 새로 운 라즈베리 파이 2를 구매하는 것이 좋다. 라즈베리 파이의 각 모델에 따라서 SD 카드와 USB 단자의 수가 다르기 때문에 별도의 USB 허브가 필요할 수도 있고, A나 A+ 모델의 경우 유선 랜을 사용하기 위해 USB LAN 어댑터가 필요할 수도 있다. 라즈베리 파이에는 컴퓨터의 하드디스크 같은 저장공간이 없다. 이러한 공간을 SD 카드나 microsd 카드로 대신하기 때문에 라즈베리 파이를 사용하기 위해서는 SD 카드나 microsd 카 드가 반드시 필요하다. A와 B 모델은 SD 카드를 이용하고 A+와 B+ 모델이나 라즈베리 파이 2 모델은 microsd 카드를 사용하는데, A나 B 모델의 경우에도 SD 카드 어댑터를 이용한다면 microsd 카드를 사용할 수 있다. 그림 1-12 SD 카드와 MicroSD 카드 및 어댑터 라즈베리 파이를 일반적인 용도로 사용할 경우 4GB 용량을 사용해도 크게 문제가 없겠지만, 라즈베리 파이로 직접 Qt 라이브러리를 빌드하거나 커널이나 애플리케이션을 개발하기 위해서 는 최소 8GB 이상 11 의 넉넉한 용량이 필요하다. 12 그리고 라즈베리 파이는 시중에 판매되고 있 는 대부분의 SD 카드를 지원하지만, 아주 드물게 지원하지 않는 SD 카드도 있으므로 구매하기 전에 라즈베리 파이가 해당 모델을 지원하는지 확인하는 것이 좋다. 디스크의 속도에 따라서 시스템의 속도가 좌우되기 때문에 라즈베리 파이의 속도를 높이기 위해서는 SD 카드도 빠른 것을 사용하는 것이 좋다. 11 Qt 라이브러리와 리눅스 커널을 동시에 개발하려면 16GB 이상이 필요하다. 12 현재 공식적으로는 최대 32GB까지 지원하고 있지만, 특정 모델은 64GB도 사용 가능하다고 한다. http://www.raspberrypi.org/forums/viewtopic.php?f=91&t=98639 1.3 라즈베리 파이를 위한 주변 도구 15
1.3.2 라즈베리 파이의 외부 하드웨어 라즈베리 파이에는 모니터 같은 액정이나 마우스나 키보드 그리고 무선랜과 같은 기능을 지원 하지 않는다. 모니터를 사용하기 위해서는 B 모델의 경우 HDMI나 비디오 컴포지트 케이블을 통해서 출력이 가능하므로 이러한 입력을 사용할 수 있는 일반 PC의 모니터나 TV를 이용할 수 있다. HDMI2DVI 케이블이나 어댑터를 이용하면 DVI 모니터도 사용할 수 있다. 그림 1-13 다양한 종류의 케이블(왼쪽부터 HDMI, HDMI2DVI, HDMI2DVI 어댑터, 비디오 컴포지트) 카메라를 통해서 영상을 입력받기 위해서는 라즈베리 파이 재단에서는 Raspberry Pi Camera 를 정식으로 제공하고 있으며, 이외에도 리눅스를 지원하는 USB 카메라 13 를 이용할 수도 있다. Pi Camera 는 라즈베리 파이를 판매하는 곳에서 함께 판매하고 있다. 7장의 멀티미디어 프로 그래밍에서 카메라를 사용할 때 이 Pi Camera 모듈을 이용할 것이다. 그림 1-14 Raspberry Pi Camera 인터넷을 사용하기 위해서는 별도의 네트워크 케이블이나 USB 무선랜카드를 구매해야 한다. 무선 인터넷을 위한 AP(Access Point)가 있다면 이동성을 위해 USB 무선랜카드를 사용하는 것 이 좋다. 13 UVC(USB video device class)를 지원하는 최신의 웹캠이면 쉽게 사용가능하다. 16 CHAPTER 1 사물인터넷과 라즈베리 파이
그림 1-15 다양한 종류의 USB 무선랜카드 라즈베리 파이는 1GHz까지 오버클럭(Overclock)이 가능한데, 이때 메인칩의 온도가 50~60도 를 넘어가지 않도록 주의해야 한다. 이러한 문제점을 해결하기 위해 방열판(Heat sink)을 사용할 수 있다. 그림 1-16 라즈베리 파이용 방열판 마지막으로, 라즈베리 파이의 GPIO를 이용해서 여러 하드웨어들을 제어하기 위해서는 LED나 모터 등의 액추에이터(actuator)와 스위치나 센서 등의 전자부품이 필요하다. 각각의 전자부품 들은 별도로 구매하기 번거로우므로 라즈베리 파이 스타터킷(LED나 스위치, 저항 등의 기본적인 부품들을 함께 모은 패키지) 14 과 같은 제품을 구매하는 좋다. 그림 1-17 라즈베리 파이 스타터킷과 브레드보드 스타터킷에는 브레드보드(Bread Board)가 포함되는데, 이를 이용하면 LED와 같은 전자부품을 라즈베리 파이의 GPIO의 핀과 직접 연결하는 귀찮은 작업을 보다 편리하게 할 수 있다. 14 시중에서 판매되는 다양한 라즈베리 파이 스타터킷(Starter Kit)에는 이 책에서 사용하는 부품 중에 빠진 것들이 있다. 책에서 사용하는 부품들을 구매하고 싶다면 이 책에 대하여 를 참고하라. 1.3 라즈베리 파이를 위한 주변 도구 17
1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 라즈베리 파이를 사용하려면 리눅스가 시스템에 설치되어야 하는데 이를 위해서 SD 카드에 디 스크 이미지를 쓰면(flashing) 된다. 이제 라즈베리 파이를 사용하기 위한 기본적인 준비운동을 시작해보자. 라즈베리 파이에서 사용 가능한 리눅스 배포판으로는 라즈비안(Raspbian, 라즈베리 파이를 위 한 데비안)과 NOOBS, 아치(Archi) 리눅스, Pidora(라즈베리 파이를 위한 Fedora) 등이 제공되고 있으며, 라즈베리 파이 2부터 우분투와 안드로이드가 지원되고 마이크로소프트의 윈도우 (Windows) 10도 무료로 제공된다. 주 프로그래밍 언어로 파이썬(Python)과 BBC 베이직(BBC Basic), C 언어와 같은 고급 언어 및 스크립트 언어인 펄(Perl) 등을 지원하고 있다. 그림 1-18 마이크로소프트의 라즈베리 파이 지원 사이트 1.4.1 라즈베리 파이의 디스크 이미지와 윈도우에서의 설치 라즈베리 파이를 사용하기 위해서는 SD 카드에 라즈베리 파이용 리눅스 이미지를 설치 15 해야 한다. 이를 위해서는 기본적으로 리눅스나 맥(Mac) OS X처럼 유닉스 기반의 운영체제나 윈도우 가 필요하다. 윈도우를 이용해서 디스크 이미지를 설치하는 것은 비교적 간단하고 쉬운 반면에, 리눅스나 맥은 커맨드 라인을 사용해야 하기 때문에 유닉스에 관한 지식이 필요하다. 아직 리눅 스에 익숙하지 않다면 윈도우를 사용해서 디스크 이미지를 설치하는 것이 좋다. 15 각 운영체제별 라즈베리 파이용 디스크 이미지 설치 페이지 http://www.raspberrypi.org/documentation/installation/installing-images/readme.md 18 CHAPTER 1 사물인터넷과 라즈베리 파이
SD 카드나 microsd 카드에 디스크 이미지를 설치하는 작업은 다음 순서로 진행할 수 있다. 1. 2. 3. 4. 디스크 이미지를 다운로드한다. SD 카드 리더를 이용해서 SD 카드나 microsd 카드를 PC에 연결한다. SD 카드에 라즈베리 파이의 이미지를 설치한다. 디스크 이미지가 설치된 SD 카드를 라즈베리 파이의 SD 카드 슬롯에 삽입한다. 라즈베리 파이에서 사용할 수 있는 디스크 이미지는 라즈베리 파이 홈페이지에서 다운로드 16 할 수 있다. 데비안 기반의 라즈비안(Raspbian)이 가장 많이 사용되고 있으며, 페도라 기반의 PIDORA나 홈 미디어 센터를 쉽게 만들 수 있는 OPENELEC이나 OSMC 17 같은 디스크 이미 지도 제공한다. 라즈비안(Raspbian)은 라즈베리 파이에 최적화되어 있으며 35,000개 이상의 패 키지들을 제공한다. 이 책에서도 가장 많이 쓰이는 라즈비안을 사용하기로 한다. 그림 1-19 라즈베리 파이 다운로드 디스크 이미지는 압축된 형태의 ZIP 파일이나 토렌트(torrent)를 이용해서 다운로드할 수 있다. 디스크 이미지의 다운로드가 완료되면 앞에서 준비한 SD 카드에 설치해야 하는데, PC의 SD 카드 리더를 이용해서 SD 카드를 운영체제로 마운트한다. 16 http://www.raspberrypi.org/downloads 17 예전의 RASPBMC는 OSMC 프로젝트로 변경되었다. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 19
그림 1-20 다양한 SD 카드 리더기 SD 카드에 이미지를 설치하는 것은 리눅스, 맥 OS X, MS 윈도우에서 수행할 수 있다. 리눅스 나 맥 OS X에서는 마운트된 SD 카드에 dd 명령어를 이용해서 설치할 수 있는데, 터미널(콘솔) 에서 작업해야 하므로 그 과정이 조금 복잡하다. 먼저 윈도우에서의 설치 방법을 살펴보고 계 속해서 리눅스와 맥에서의 설치 방법에 대해서 알아보겠다. 1.4.2 라즈베리 파이 이미지 설치: MS 윈도우 윈도우에서 SD 카드나 MicroSD 카드에 라즈베리 파이용 디스크 이미지를 설치하기 위해서는 Win32DiskImager라는 프로그램을 사용한다. Win32DiskImager는 소스포지(SourceForge) 사 이트 18 에서 다운로드할 수 있다. 그림 1-21 소스포지에서 Win32DiskImager 다운로드와 실행 파일 다운로드된 파일의 압축을 해제하고 실행하면 마법사 형태로 간단하게 프로그램을 설치할 수 있다. Win32DiskImager-0.9.5-install.exe 프로그램을 실행해서 Win32DiskImager을 설치하고 실행해본다. 18 http://sourceforge.net/projects/win32diskimager/ 20 CHAPTER 1 사물인터넷과 라즈베리 파이
Win32DiskImager 프로그램을 실행하면 이미지 파일과 SD 카드가 위치한 디스크 드라이브명 을 설정해야 한다. Image File 아래에 있는 폴더 아이콘을 선택해서 앞에서 다운로드한 라즈비 안 이미지 파일(20xx-xx-xx-raspbian-wheezy.img 19 )을 선택하고, Device 아래의 콤보박스에서 SD 카드가 삽입된 디바이스 드라이브명을 선택한다. 그림 1-22 디스크 이미지의 선택 디바이스명을 설정하고 나면 Write 버튼이 활성화된다. 이 버튼을 클릭하면 이미지를 디바이스 에 쓰기(write)를 진행할지 묻는 다이얼로그가 나타나는데 Yes를 선택하여 다음으로 진행한다. 그림 1-23 디스크 이미지를 SD 카드로 쓰기 SD 카드로 이미지를 쓰는 진행 과정이 표시되고, 쓰기가 완료되면 완료 다이얼로그가 표시된 다. 디스크에 이미지를 쓰는 시간은 SD 카드의 종류와 시스템에 따라서 다를 수 있으며 몇 분 에서 몇 십분 정도 소요된다. 19 20xx-xx-xx에서 xx는 2015-05-05와 같은 날짜를 의미한다. xx에는 최신 버전에 맞는 날짜를 사용한다. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 21
그림 1-24 쓰기 진행화면과 완료화면 이 과정이 완료되면 SD 카드를 라즈베리 파이 뒷면의 SD 카드 슬롯에 삽입한 후 라즈베리 파 이에 전원을 인가해서 리눅스가 잘 부팅되는지 확인한다. 그림 1-25 SD 카드의 설치 1.4.3 라즈베리 파이 이미지 설치: 리눅스 리눅스나 맥 OS X과 같은 유닉스 기반의 운영체제에서는 마운트(Mount) 20 된 SD 카드를 언마운 트하고, dd 명령어를 통해 라즈베리 파이의 디스크 이미지를 SD 카드에 설치한다. 디스크 이미지를 설치하기 위해서는 먼저 리눅스가 설치되어 있어야 한다. 디스크 이미지 설치 외에도 프로그래밍이나 다른 설치 작업을 위해서도 PC에 리눅스가 설치되어 있는 것이 좋다. 기본적으로 라즈베리 파이만으로도 프로그래밍을 진행할 수 있지만, PC에 비해 느려서 큰 규 모의 라이브러리를 설치하려면 시간이 많이 소요된다. 이러한 크기가 큰 라이브러리는 속도가 빠른 PC에서 빌드(Build)하는 것이 좋다. 일반적으로 PC에서는 페도라(Fedora), 우분투(Ubuntu), 데비안(Debian), opensuse 등의 리눅스 배포판을 자유롭게 사용할 수 있는데, 이 책에서는 라즈베리 파이에서도 사용하고 있는 데비 안 기반의 우분투를 이용할 것이다. 20 윈도우는 디스크나 CD-ROM을 넣으면 자동으로 인식되지만, 리눅스는 사용자가 장치를 사용할 수 있도록 시스템에 연결해 주어야 한다. 이처럼 장치를 운영체제에 인식시키는 것을 마운트라고 한다. 22 CHAPTER 1 사물인터넷과 라즈베리 파이
우분투 21 는 영국의 캐노니컬(Canonical)의 지원을 받는 리눅스 배포판으로 인터넷에서 무료로 다운로드할 수 있다. 우분투는 GNOME 기반으로 일반적으로 사용자 편의성에 초점을 두고 최적화된 데스크탑이나 노트북 등에서 널리 사용되고 있다. 참고하기 우분투(Ubuntu)라는 용어는 남아프리카 공화국의 건국이념인 네가 있으니 내가 있다(humanity towards others) 라는 의미의 우분투 정신에서 비롯되었다. 22 우분투는 우분투 재단에 의해서 비교적 안정적으로 관리되며, 높은 사양의 PC를 요구하지 않 는다. 우분투는 KDE 23 기반의 쿠분투(Kubuntu)나 주분투(Xubuntu), 루분투(Lubuntu) 등 다양 한 배포판이 있으며, 아이들의 교육을 위한 에듀분투(Edubuntu) 배포판도 있다. 우분투는 이러 한 PC용 버전과 함께 사물인터넷 시장에 대비해 모바일을 위한 우분투 모바일(Ubuntu Mobile) 이나 안드로이드용 우분투, 우분투 터치와 우분투 TV 등의 제품들을 준비 중이다. 그림 1-26 우분투 다운로드 24 우분투를 설치하는 과정은 비교적 간단하다. 우분투 설치를 위해서는 DVD 라이터나 부팅이 가 능한 USB 메모리가 필요할 수 있다. 먼저, 우분투 사이트에서 우분투 이미지를 다운로드한다. 용량은 우분투 14.10 버전이 1.16GB 정도인데, 이 이미지를 이용하여 PC에 설치를 시작하자. PC를 부팅한 후 DVD를 이용해서 설치를 시작한다. 시작 화면에서 Ubuntu 설치 를 선택하면 21 http://www.ubuntu.com 22 http://it.donga.com/15738/, http://www.ubuntu.com/about/about-ubuntu http://news.jtbc.joins.com/article/article.aspx?news_id=nb10651272 23 KDE는 리눅스를 위한 X 윈도우의 표준 데스크탑 환경으로 GNOME과 함께 많이 사용된다. 24 우분투 다운로드 사이트(http://www.ubuntu.com/download/desktop) 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 23
다음 화면으로 넘어간다. 계속해서 설치할 디스크를 선택하고 관련 옵션을 선택한다. 설치하 기 위해서는 최소 4GB 이상이 필요한데, 애플리케이션의 개발을 위한 다른 유틸리티의 설치와 스왑(Swap) 용량까지 더하면 8~16GB 이상의 넉넉한 용량이 필요하다. 우분투 설치를 위한 디스크의 설정이 완료되면 국가와 살고 있는 도시를 선택하는 화면이 나 타난다. 여기서 Seoul이나 실제 살고 있는 도시를 선택하고, 그다음 화면에서 사용하는 키보드 를 선택한다. 키보드 선택이 끝나면 우분투에서 사용할 사용자 계정을 입력해야 하는데, 사용자 계정(영어 사용)과 비밀번호를 입력하면, 우분투 패키지가 설치되는 화면으로 넘어가게 되고 이 과정을 거쳐 우분투의 설치를 완료할 수 있다. 1 2 3 Ubuntu 설치를 선택해서 설치 시작 설치를 위한 항목 확인 설치 형식 선택 - 디스크와 포맷 설정 4 5 6 설치 디스크 선택 - 해당 디스크 및 포맷 국가 및 도시 선택 키보드 선택 7 8 9 컴퓨터 이름 및 사용자 계정 설정 기본 패키지 설치 미러 사이트 검색 및 다운로드/설치 10 완료 화면 표시 후 재부팅 그림 1-27 Ubuntu 리눅스 배포판 설치 24 CHAPTER 1 사물인터넷과 라즈베리 파이
보다 자세한 우분투의 설치 방법은 부록의 우분투 관련 책이나 인터넷 자료들을 참고하기 바 란다. root 리눅스를 이용해서 디스크 이미지를 SD 카드에 쓰기 위해서는 여러 단계를 거쳐야 한다. 리눅 스에서 디바이스 파일을 다루는 작업은 슈퍼 유저(root)의 권한이 필요한데, 우분투에서는 보 안상의 이유로 root로 로그인하는 것을 차단하고 있다. 우분투를 설치한 후 root를 사용하기 위해서는 root의 암호를 입력하는 별도의 과정이 필요하다. 다음과 같이 사용자 계정에서 sudo passwd 명령어를 실행해서 root의 암호를 입력하고 설정할 수 있다. root 계정이 활성화되면 $ su 25 를 이용해서 root로 계정을 변경할 수 있다. $ sudo passwd root SD SD 카드에 디스크 이미지를 설치하기 위해서는 먼저 마운트된 SD 카드를 언마운트해야 한다. 리눅스 시스템에서 SD 카드의 언마운트는 umount 유틸리티를 사용하면 되는데, 마운트된 디 바이스의 파일명을 인자로 사용하면 된다. PC에 연결된 기기에 따라 마운트 위치가 달라질 수 있는데 # df h 유틸리티를 통해서 마운트된 SD 카드에 대한 정보를 가져올 수 있다. # df -h # df h 명령어를 실행하면 /dev/mmcblk0p1 이나 /dev/sdb1 과 같이 표시될 것이다. 26 umount 유틸리티를 이용해서 다음과 같이 언마운트한다. # umount /dev/sdb1 # umount /dev/sdb2 25 책에서 터미널에 입력할 내용 앞에는 $나 # 같은 프롬프트를 표시하는데, $는 일반 계정을 의미하고, #은 root 계정을 의미한 다. 일반 계정에서 root 계정의 권한이 필요하면 명령어 앞에 sudo 를 붙여서 실행하면 된다. 26 여기에서 제일 뒤에 있는 p1이나 1은 파티션 넘버(디바이스 파일 부번호)를 의미한다. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 25
Raspbian 이제 설치를 위한 Raspbian 이미지를 다운로드해보자. Raspbian 이미지는 라즈베리 파이 사이 트의 다운로드 페이지에서 다운로드할 수 있다. 웹 브라우저를 사용할 수도 있지만 wget 명령 어를 사용하면 보다 간단히 다운로드할 수 있다. ubuntu:~$ wget http://downloads.raspberrypi.org/raspbian_latest --2015-06-23 07:11:03-- http://downloads.raspberrypi.org/raspbian_latest Resolving downloads.raspberrypi.org... /* ~ 중간 생략 ~ */ Saving to: `raspbian_latest' 100%[============ /*~ 중간 생략 ~ */ ============>] 1,xxx,xxx,xxx 1.44M/s in 12m 55s 20xx-xx-xx xx:xx:xx (1.28 MB/s) - `raspbian_latest' saved [xxxxxxxxxx/xxxxxxxxxx] ubuntu:~$ mv raspbian_latest raspbian-wheezy.zip ubuntu:~$ unzip raspbian-wheezy.zip Archive: raspbian-wheezy.zip inflating: 20xx-xx-xx-raspbian-wheezy.img 다운로드가 완료되면 파일의 이름을 해당 이미지 이름으로 변경한 후 unzip 명령어로 압축을 해제한다. 참고하기 압축 파일 해제하기: tar와 unzip 그리고 기타 명령어 tar 명령어는 여러 개의 파일을 하나로 묶는 명령어이나 파일을 압축하는 기능을 제공하지 않는다. 유닉스의 기본 모토인 나눠서 정복하기(divide and conquer) 와 같이 복잡한 작업을 여러 유틸리티로 나눠서 진행하는데, tar 명령어를 이용해서 여러 파일을 하나로 묶고, gzip이나 bzip2 같은 명령어 를 이용해서 압축을 수행한다. tar 명령어에서는 압축 유틸리티와 함께 작업을 자동으로 처리할 수 있도록 관련 옵션을 제공한다..tgz 나.tar.gz 확장자를 갖는 파일의 압축을 해제할 때는 zxvf 옵션을 이용하면 자동으로 gzip 명령어가 수행되고,.tar.bz2 나.tbz 확장자를 갖는 파일에는 jxvf 옵션을 사용하면 bzip2 명령어 가 수행한다. 압축을 할 경우에는 zcvf 와 같이 x(extract) 옵션 대신 c(create) 옵션을 사용하면 된다. $ tar zcvf 압축된_파일명.tar.gz 압축을_원하는_디렉터리명 일반적으로 윈도우에서도 많이 사용되는.zip 의 확장자를 갖는 파일은 unzip 명령어 사용하여 압 축을 해제한다. 26 CHAPTER 1 사물인터넷과 라즈베리 파이
SD 이제 dd 명령어 27 를 사용하여 디스크 이미지를 SD 카드에 설치해보자. if 옵션 뒤에 다운로드 한 파일의 이름을 명시하고, of 옵션에는 언마운트할 때 사용한 SD 카드에 대한 디바이스의 파일명을 명시한다. # dd bs=4m if=20xx-xx-xx-raspbian-wheezy.img of=/dev/sdb 781+1 records in 781+1 records out 3276800000 bytes (3.3 GB) copied, 385.186 s, 8.5 MB/s 디스크 이미지를 SD 카드로 설치되는 시간은 시스템에 따라 다를 수 있으나 대략 몇분에서 몇 십분 정도의 시간이 소요된다. 작업이 완료되기 전까지 어떠한 메시지나 화면도 표시하지 않으 므로 완료 메시지가 표시될 때까지 기다려야 한다. 1.4.4 라즈베리 파이 이미지 설치: 맥 OS X 맥 OS X에서도 터미널 프로그램을 이용해서 다음과 같이 SD 카드에 디스크 이미지를 설치할 수 있다. 맥 OS X에서는 디스크를 언마운트할 때 diskutil 유틸리티에 unmountdisk 옵션을 사 용한다. 맥에서도 마찬가지로 디바이스에 접근할 때는 root의 권한이 필요하다. sh-3.2# sudo diskutil unmountdisk /dev/disk1 Unmount of all volumes on disk1 was successful sh-3.2# sudo dd bs=1m if=20xx-xx-xx-raspbian-wheezy.img of=/dev/disk1 3125+0 records in 3125+0 records out 3276800000 bytes transferred in 1854.842502 secs (1766619 bytes/sec) 맥 OS X에서도 디스크 이미지 설치를 위해 dd 명령어를 이용하면 되는데, 설치 시 리눅스에서 와 마찬가지로 완료 시까지 아무런 메시지가 출력되지 않는다. 그림 1-28 맥 OS X에서의 dd 명령어 사용 27 dd 유틸리티는 지정된 크기만큼 파일을 복사하거나 디스크 이미지를 복제할 때 사용된다. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 27
1. 4. 5 라즈베리 파이의 설정 지금까지 라즈베리 파이에서 리눅스를 사용하기 위한 기본 작업을 완료하였다. 이제 라즈베리 파이를 시동하기 위한 마무리 작업을 진행해보자. 라즈베리 파이는 기본적으로 터치 기반의 액정이나 다른 입력 장치를 제공하지 않는다. 라즈베 리 파이의 입력 장치로 PC에서 사용하는 USB 키보드와 마우스를 연결해서 사용하면 된다. 영상 출력을 위해서는 HDMI 케이블로 모니터와 라즈베리 파이를 연결한다. HDMI 포트는 그림 1-8과 같이 라즈베리 파이의 윗면에 있으며, 이를 이용해서 모니터나 TV를 연결한다. HDMI를 지원하는 영상 장치가 없는 경우에는 그림 1-13의 HDMI2DVI 컨버터나 케이블을 이용해서 DVI가 지원되는 영상 장치를 이용할 수도 있다. 그림 1-29 라즈베리 파이의 외부 연결 - TV의 HDMI 포트와 USB 키보드와 마우스 라즈베리 파이에서 인터넷을 사용하려면 유선으로 네트워크를 연결하거나 USB 무선랜카드를 이용할 수 있다. 라즈베리 파이 모델 B를 사용하는 경우 USB 단자가 부족할 수 있는데, 이럴 때는 별도의 USB 허브를 사용하면 된다. 그림 1-30 전원, HDMI와 키보드, 무선랜의 연결 28 CHAPTER 1 사물인터넷과 라즈베리 파이
이처럼 디바이스를 연결하고 전원을 연결하면 라즈베리 파이를 동작시킬 수 있다. 마이크로 USB 케이블을 이용해서 PC로부터 전원을 공급하거나, 휴대폰에서 많이 사용하고 있는 마이 크로 USB 단자를 제공하는 아답터를 통해서 전원을 공급할 수 있다. 28 그림 1-31 전원 공급을 위한 microusb 기반의 아답터 무선 조정 탱크나 휴대용으로 라즈베리 파이를 사용하는 경우에 휴대폰 충전용으로 사용되는 외장 충전 배터리를 이용해서 라즈베리 파이를 동작시킬 수 있다. 라즈베리 파이에 전원을 연 결하면 바로 동작하는데, 키보드와 마우스를 이용해서 라즈베리 파이를 사용할 수 있다. 그림 1-32 동작된 라즈베리 파이의 화면 raspi config Raspbian을 설치한 후 처음 라즈베리 파이가 시동되면 raspi-config 유틸리티가 자동으로 실행 되고 설정을 완료하면 다음 시작 시부터는 로그인 화면이 뜬다. 라즈베리 파이의 기본 계정은 pi 이다. 만약 로그인 화면이 나타나면 터미널에 다음의 기본 계정과 비밀번호를 이용해서 로 그인한다. 28 microusb 기반의 어댑터 사용 시 표 1-1과 같이 1A 이상을 지원하는지 확인해보아야 한다. 전압이 부족하면 부팅 시 화면 우측 상단에 무지개 색 박스가 보인다. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 29
표 1-4 라즈베리 파이의 기본 계정 구분 내용 비고 raspberrypi login: pi 계정(ID) Password: raspberry 비밀번호 raspi-config 유틸리티를 이용해서 라즈베리 파이와 관련된 옵션을 설정할 수 있는데 일반적인 경우에는 기본값을 사용하면 된다. 탭 키를 사용하여 Finish를 선택해서 설정 프로그램(raspiconfig)을 종료하면 라즈베리 파이를 사용할 수 있다. 그림 1-33 raspi-config 유틸리티 로그인한 후 셸(Shell)에서 리눅스를 사용하려면 2장에서 살펴볼 기본 명령어를 사용하면 된다. 셸을 나오고 싶으면 logout 명령어나 키보드의 Ctrl + D 키를 누르면 되고, 라즈베리 파이를 종 료하고 싶은 경우에는 poweroff 명령어를 수행하고 끄면 된다. X 윈도우 29 를 사용하는 경우 라즈베리 파이를 설정하려면 LXTerminal 프로그램을 실행하고 터미널에서 raspi-config 프로그램을 실행하면 된다. $ sudo raspi-config raspi-config 프로그램을 이용하면 오버클럭킹, ssh 사용, 부팅 시 GUI 사용 등의 다양한 옵션 을 설정할 수 있다. 라즈베리 파이가 지원하는 옵션은 다음과 같다. 29 X 윈도우는 유닉스의 표준 GUI 시스템이다. 관련 사항에 대해서 궁금한 경우 8장을 참고하라. 30 CHAPTER 1 사물인터넷과 라즈베리 파이
표 1-5 설정 옵션 옵션 Expand Filesystem Change User Password Enable Boot to Desktop/ Scratch Internationalisation Options Enable Camera Add to Rastrack Overclock Advanced Options About raspi-config 내용 SD 카드의 모든 공간을 파일 시스템으로 사용한다. 사용자의 기본 패스워드를 변경한다. 로그인 시 Console로 로그인을 할지, GUI(X-Window)로 로그인을 할지, Scratch 프로그래밍 환경으로 부팅할지 설정한다. 국제화 관련해서 로케일이나 타임존(Timezone), 키보드 레이아웃을 설정한다. Pi Camera를 사용할 수 있도록 설정한다. 현재의 라즈베리 파이를 장비를 Rastrack 사이트에 등록한다. 라즈베리 파이를 오버클러킹한다. 최대 1GHz까지 오버클럭킹이 가능하다. 부가 옵션들을 표시한다. raspi-config 프로그램에 대한 정보를 출력한다. 기본적인 설정 이외에도 다음과 같은 고급 설정(Advanced Options)이 있다. 표 1-6 부가 옵션 옵션 Overscan Hostname Memory Split SSH SPI I2C Serial Audio Update 내용 디스플레이가 제대로 표시되지 않을 때 이를 해결하기 위해 오버스캔을 설정한다. 네트워크상에서 표시되는 호스트 이름을 설정한다. GPU에서 사용되는 공유 메모리의 양을 조정한다. 외부 연결 시 ssh(secure Shell)를 사용 가능하도록 설정한다. SPI 커널 모듈을 자동으로 로딩될 수 있도록 설정한다. I 2 C 커널 모듈을 자동으로 로딩될 수 있도록 설정한다. 시리얼 연결로 셸과 커널 메시지가 출력되도록 설정한다. 오디오의 출력 방향을 HDMI 또는 3.5mm 잭으로 설정한다. raspi-config 프로그램을 최신 버전으로 업데이트한다. 라즈베리 파이는 영국에서 개발되었기 때문에 기본적으로 지원하는 키보드는 영국식 키보드 이다. 우리나라에서 사용하는 키보드는 미국식 키보드이기 때문에 키의 조합이 조금 다르다. 위의 옵션 중에서 먼저 언어와 관련된 설정을 진행해보자. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 31
미국식 키보드를 이용해서 프로그래밍을 진행하기 위해서는 언어를 먼저 설정해야 한다. raspi-config 유틸리티의 메인 메뉴에서 Internationalisation Options을 선택하고 Change Locale 항목을 선택해서 들어간다. 그림 1-34 raspi-config 유틸리티에서의 언어 설정 Change Locale 항목을 선택하고 들어가면 여러 언어에 대한 옵션이 있다. 키보드의 방향키 를 이용하여 기본 값인 영국 영어를 사용하기 위한 en_gb.utf-8 UTF-8 옵션이 선택(체크)되 어 있는지 확인하고, 미국식 언어를 사용하기 위한 en_us.utf-8 UTF-8 옵션을 키보드의 스 페이스바(space bar)를 눌러서 선택한다. 만약 한글을 사용하고 싶은 경우라면 추가적으로 ko_ KR.UTF-8 UTF-8 옵션을 선택하면 된다. 탭 키를 눌러서 아래의 <Ok> 버튼을 선택하면 앞 에서 사용한 언어 중 시스템에서 사용할 기본 언어를 선택하는 화면이 나오는데 여기에서 en_ US.UTF-8 UTF-8를 기본(Default) 언어로 선택하면 된다. 그림 1-35 라즈베리 파이를 위한 기본 언어의 설정 이제 키보드를 위한 레이아웃을 설정해보자. 앞의 화면으로 나가면 Change Keyboard Layout 항목을 선택한다. 키보드의 모델 선택 화면이 나오면 한글을 사용하려면 Generic 105 key (Intl) PC 항목을 선택하면 되는데 본인이 사용하는 키보드가 따로 있는 경우에는 그 키보드 를 선택하면 된다. 32 CHAPTER 1 사물인터넷과 라즈베리 파이
그림 1-36 키보드 레이아웃의 변경 한글 키보드를 사용하기 위해서는 다음 키보드 레이아웃(Keyboard layout) 화면으로 넘어가서 other 항목을 선택한 후 다음의 키보드를 위한 국가 설정 화면에서 Korean 항목을 선택하 면 된다. 그림 1-37 한글을 위한 키보드 레이아웃 설정 계속해서 키보드의 레이아웃으로 Korean Korean (101/104 key compatible) 항목을 선택한 후 다음으로 진행한 후 The default for the keyboard layout 항목을 선택하면 된다. 그림 1-38 한국어를 위한 키보드 설정 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 33
마지막으로 다음 화면에서 한글에서는 특수 문자 입력을 위한 컴포즈 키(Compose key)를 사용 하지 않기 때문에 No compose key 옵션을 선택한 후 마지막 화면으로 넘어가서 일반적으로 X 윈도우를 강제 종료하기 위해서 사용되는 Control + Alt + Backspace 단축키를 이용할 것인 지 설정하면 된다. 그림 1-39 컴포즈 키와 X 윈도우 강제 종료 키의 설정 참고하기 X 윈도우 한글 설정 라즈베리 파이의 X 윈도우는 한글 입력을 기본적으로 지원하지 않는다. X 윈도우에서 한글을 사용 하기 위해서는 별도의 한글 입력기를 사용해야 하는데 나비 등의 다양한 한글 입력기가 있지만 라즈베리 파이에서는 IBus(Intelligent Input Bus)라는 입력기를 사용하고 있다. IBus는 유닉스에서 다 국어를 사용하기 위해서 제공되는 입력기로 입력기의 구조가 버스와 비슷해서 지금의 이름을 가지 게 되었다. 데비안 계열의 우분투에서 패키지는 apt-get을 이용해서 설치할 수 있는데 다음과 같이 입력하면 한글 입력과 관련된 ibus 패키지를 설치할 수 있다. $ sudo apt-get install ibus ibus-hangul ssh ssh를 이용해서 외부에서 라즈베리 파이로 접속하기 위해서는 부가 옵션에서 SSH를 사용 (<Enable>)으로 설정하면 된다. ssh로 접속하려면 $ ssh 서버의_IP주소 명령어를 사용하는데, 이때 필요한 라즈베리 파이의 네트워크 주소는 $ ifconfig 명령어를 통해 알 수 있다. 네트워크 가 연결되어 있으면 inet addr 항목에 관련 사항이 표시되며, inet addr 항목 뒤의 주소를 이용 해서 네트워크를 사용할 수 있다. 유선랜을 사용한다면 eth0 30 의 inet addr 값을 이용하고, 무 선랜을 사용한다면 wlan0의 inet addr 값을 이용한다. pi@raspberrypi ~ $ ifconfig 30 일반적으로 유선랜은 eth, 무선랜은 wlan으로 불리며, 뒤의 0, 1, 2 등의 숫자는 네트워크 장비의 순서를 의미한다. 34 CHAPTER 1 사물인터넷과 라즈베리 파이
eth0 lo wlan0 Link encap:ethernet HWaddr b8:27:eb:b7:29:dc UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Link encap:local Loopback inet addr:127.0.0.1 31 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1104 (1.0 KiB) TX bytes:1104 (1.0 KiB) Link encap:ethernet HWaddr 00:08:9f:db:2b:fe inet addr:10.0.1.99 Bcast:10.0.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:292 errors:0 dropped:5 overruns:0 frame:0 TX packets:73 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:44816 (43.7 KiB) TX bytes:12204 (11.9 KiB) 라즈베리 파이를 네트워크에 바로 연결한 경우에는 네트워크를 사용하지 못하는 경우가 있다. 네트워크를 사용하기 위해서는 다음의 인터넷의 설정을 참고하기 바란다. ssh 명령어를 이용하여 라즈베리 파이의 pi 계정으로 바로 접속할 때는 $ ssh pi@라즈베리_파 이의_네트워크_주소 명령어를 입력한다. 접속을 위한 pi 계정의 기본 암호는 로그인 암호와 같 은 raspberry 이다. 32 $ ssh pi@10.0.1.99 33 pi@10.0.1.99's password: raspberry 31 127.0.0.1은 현재 기기에서 자신을 접속하기 위한 위한 IP 주소로 루프백(Loopback) 주소라고 한다. 32 보다 자세한 도움말은 제이펍 사이트에 나와 있다. http://jpub.tistory.com/286 33 IP 주소는 네트워크에 따라 다르다. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 35
참고하기 SSH 재접속 ssh로 라즈베리 파이에 접속한 후 라즈베리 파이를 초기화하면 동일한 IP 주소로는 재접속할 수 없다. 이런 경우에는 접속하려는 기기의 ~/.ssh/known_hosts 파일에서 해당 IP 주소의 내용을 삭제하고 다 시 접속하면 된다. 그림 1-40 known_hosts 파일 유선랜이나 무선 네트워크 34 를 사용하기 위해서는 몇 가지 설정이 필요하다. 간편한 설정을 위 해 X 윈도우의 설정 프로그램을 이용해 보도록 하자. 현재 X 윈도우 상태가 아닌 경우에는 터 미널에서 $ startx 명령어를 입력해서 X 윈도우를 실행한다. Raspbian 2015-02-16 버전까지는 X 윈도우의 메뉴에서 Preferences 항목을 보면 WIFI Config 라는 유틸리티를 사용하였지만, 2015-05-05 버전부터 좀 더 편리하게 설정할 수 있도록 변경되 었다. X 윈도우를 실행하면 패널의 오른쪽 위에 와이파이 설정과 관련된 패널 아이템이 있다. 그림 1-41 무선랜 설정을 위한 패널 아이템 패널 아이템을 선택하면 현재 검색된 Wifi의 목록이 표시되는데, 리스트에서 접속하고 싶은 무선랜을 선택한다. 선택된 무선랜에 보안이 설정되어 있으면 암호를 입력하는 창이 뜨는데, 여기에서 암호를 입력하면 패널 아이콘이 접속되었다고 변경되어 표시된다. 34 라즈베리 파이에 연결된 USB 장비들은 lsusb 명령어를 실행하면 확인할 수 있다. 36 CHAPTER 1 사물인터넷과 라즈베리 파이
그림 1-42 패널 아이템을 이용한 무선랜 설정 기존에 설정된 무선랜을 멈추거나 다시 시작할 때에는 터미널 명령어를 사용한다. 네트워크 카 드를 멈출 때는 $ sudo ifdown wlan0 (일반적으로 유선랜은 eth0, 무선랜은 wlan0)처럼 ifdown 명 령어를 사용하고, 네트워크 카드를 시작하고 싶으면 $ sudo ifup wlan0 처럼 ifup 명령어를 사 용한다. 유선랜을 설정하기 위해서는 /etc 디렉터리 아래의 interfaces 파일과 resolv.conf 파일에 현재의 네트워크와 관련된 사항을 설정해야 한다. 두 파일을 조작하기 위해서는 vi 에디터(또는 다른 텍스트 에디터)와 root 권한이 필요하다. (텍스트 에디터 사용과 관련된 내용은 다음 장에서 자세히 설 명한다.) /etc/network/interfaces는 현재 네트워크의 IP나 netmask 등의 사항을 설정하는 파일이며, / etc/resolv.conf는 DNS와 관련된 사항을 설정하는 파일이다. IP 주소나 DNS에 관한 내용은 6 장 리눅스 네트워크 프로그래밍을 참고하기 바란다. 먼저 /etc/network/interfaces 파일을 열어 IP 주소를 설정한다. IP 주소를 동적으로 받아오는 DHCP를 사용하는 경우에는 기본값을 사용해도 괜찮지만, 고정 IP를 사용하는 경우에는 고 정 IP와 관련된 사항을 추가해야 한다. pi@raspberrypi ~ $ cat /etc/network/interfaces auto lo iface lo inet loopback iface eth0 inet dhcp # 유선랜과 관련된 설정 allow-hotplug wlan0 # 무선랜과 관련된 설정 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp pi@raspberrypi ~ $ sudo vi /etc/network/interfaces auto lo 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 37
iface lo inet loopback #iface eth0 inet dhcp # 유선랜과 관련된 설정 auto eth0 iface eth0 inet static address 10.0.10.147 # 사용자의 IP 주소 35 network 10.0.10.0 # IP 주소의 Network 부분 netmask 255.255.255.0 # IP 주소의 Network 부분을 구분하기 위한 마스크 gateway 10.0.10.1 # 기본 게이트웨이의 IP 주소 broadcast 10.0.10.255 # 브로드캐스트를 위한 IP 주소(Host 부분만 255) 36 allow-hotplug wlan0 # 무선랜과 관련된 설정 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp pi@raspberrypi ~ $ sudo ifup eth0 일반적으로 유선랜을 위한 네트워크 카드는 eth0, eth1과 같이 eth 로 시작하고 여러 개의 네트 워크 카드가 있을 때 각각의 디바이스들은 뒤의 숫자로 구분한다. 위의 작업이 끝나면 ifup 명 령어를 이용해서 네트워크 카드를 다시 시작한다. DNS 서버를 위한 주소는 /etc/resolv.conf 파일을 이용하여 설정한다. DHCP를 이용한다면 기 본값이 설정되어 있을 것이다. 그렇지 않은 경우에는 다음과 같이 설정하면 된다. pi@raspberrypi ~ $ cat /etc/resolv.conf domain kornet search kornet nameserver 10.0.1.1 pi@raspberrypi ~ $ sudo vi /etc/resolv.conf nameserver 168.126.63.1 # KT의 Olleh DNS 서버 37 : kns.kornet.net nameserver 168.126.63.2 # kns2.kornet.net DNS가 제대로 설정되었는지 확인하려면 nslookup 명령어를 사용할 수 있으며, nslookup 명령 어와 관련한 내용은 6장에서 자세히 다루기로 한다. 위의 설정이 완료되면 네트워크를 사용할 수 있다. 이제 라즈베리 파이를 사용하기 위한 기본적인 설정 작업이 완료되었다. 다음 장부터는 리눅 스를 사용해서 라즈베이 파이를 다루는 방법에 대해서 살펴보도록 하자. 35 여기에서 입력한 IP 주소는 사용자의 환경에 따라서 다를 수 있다. 36 호스트 관련 내용은 다음을 참고하라. http://dorigom.tistory.com/322 37 http://imarket.tistory.com/276 참고 38 CHAPTER 1 사물인터넷과 라즈베리 파이
참고하기 간단한 X 윈도우의 사용 유닉스의 표준 GUI 시스템으로 X 윈도우를 사용한다. X 윈도우에 대해서는 8장에서 설명하겠지만, 여기에서는 간단한 사용법에 대해서 알아보자. X 윈도우를 사용하게 되면 GUI를 이용해서 라즈베 리 파이를 다룰 수 있기 때문에 보다 편리한 작업이 가능하다. 먼저, MS 윈도우처럼 라즈베리 파이의 부팅 시 X 윈도우를 바로 실행하고 싶은 경우에는 raspiconfig 명령어를 통해 설정할 수 있다. $ sudo raspi-config 명령어를 실행하고 메뉴에서 3 Enable Boot to Desktop/Scratch 옵션을 선택한다. 그림 1-43 raspi-config의 부팅 옵션 설정 옵션을 선택하고 들어가면, 터미널이나 GUI 혹은 스크래치 개발환경으로 부팅할 것인지에 대 한 옵션이 있는데, 여기에서 GUI로의 부팅을 위한 Desktop Log in as user pi at the graphical desktop 옵션을 선택한다. 이 옵션을 선택하고 다시 부팅하면 X 윈도우로 실행되는 것을 확인할 수 있다. 터미널을 그대로 사용한다면 $ startx 명령어를 이용해서 X 윈도우를 실행할 수 있다. 종료하려면 메뉴(Menu)의 Shutdown... 항목을 선택한다. 그러면 End session 창이 뜨는데 여기에서 라즈베리 파이를 종료 하고 싶으면 Shutdown을 선택하고, 다시 부팅하고 싶으면 Reboot를 선택한다. 그냥 로그아웃을 하고 로그인 화면으로 넘어가고 싶으면 Logout을 선택하면 된다. 그림 1-44 X 윈도우에서 라즈베리 파이의 종료 X 윈도우에서 문서 편집을 할 경우, GUI 기반의 텍스트 에디터(Text Editor)를 사용할 수 있다. 메뉴 에서 Accessories 항목의 Text Editor 옵션을 선택하면 텍스트 에디터를 시작할 수 있다. 1.4 라즈베리 파이를 위한 준비운동: 사용환경 설정 39
그림 1-45 GUI 기반의 문서 편집기 GUI 기반의 텍스트 에디터를 이용하면 코드나 기타 문서들을 쉽게 편집할 수 있지만 /etc 아래의 설정 파일이나 숨김 파일 같은 문서들은 작업하기 어려울 수 있으니 2장에 나오는 vi나 nano 같은 텍스트 기반 텍스트 에디터의 사용법에 대해 알아두는 것이 좋다. 1.5 요약 사물인터넷은 스마트 기기 등의 사물들이 인터넷을 통해 유기적으로 동작하는 것을 의미하 며, 세계적으로 차세대 사업의 하나로 손꼽힌다. 이러한 사물인터넷의 중심에는 리눅스를 비 롯한 오픈 소스와 아두이노와 라즈베리 파이로 대표되는 오픈 소스 하드웨어가 있다. 리눅스는 커널이 인터넷상에 공개되어 있어 누구나 무료로 사용할 수 있으며 소형 장비에 맞 춰 최적화가 가능하다. 이러한 이유로 임베디드 장비에서부터 스마트폰, 스마트TV, 웨어러블 기기, 스마트 자동차, 스마트홈 등의 다양한 사물인터넷의 분야에 사용되고 있다. 라즈베리 파이는 $20부터 $35의 아주 저렴한 가격에 구매가 가능하며, ARM CPU를 기반으로 한 높은 성능과 OpenGL ES 등의 기능을 제공하고, 리눅스 운영체제를 사용하여 다양한 임베 디드 프로젝트 및 교육에 사용되고 있다. 2015년 2월 발표된 라즈베리 파이 2는 기존의 B+와 같은 구조와 호환성을 제공하고 CPU가 브 로드컴의 BCM2836으로 바뀌면서 900MHz의 쿼드코어를 지원한다. 메모리도 1GB로 2배 증 가하여 기존에 비해 6배 이상 빨라졌다. 40 CHAPTER 1 사물인터넷과 라즈베리 파이