반응형

지난 시간에는  노드레드를 라즈베리파이 또는 윈도에 설치하는 것에 대해 다루었습니다.  이와 관련하여서는 아래 게시물을 참고해 주세요.
【Node-RED #1】라즈베리파이(Raspberry pi)에 Node-RED 설치하기

 이번 시간부터는 본격적으로 노드레드에 대해 알아보고 활용해 보도록 시작해 보겠습니다. 

1. Node-RED의 개념

 노드레드는 플로우(Flow) 즉, 흐름 기반의 프로그래밍으로써 시각적 표현에 매우 적합하고, 복잡하고 어려운 프로그래밍 사용을 자제하고, 사용자가 보다 쉽게 접근할 수 있도록 설계된 모듈입니다.   노드레드에서의 각 노드는 마치 블록코딩의 대명사인 스크래치의 블록과 유사한 개념으로  노드레드는 다수의 노드를 이용하여 각 노드별 원하는 요구사항에 맞는 플로우를 만들 수 있으며 이를 아두이노, 라즈베리파이 및 각종 센서, 디스플레이 등 제어모듈과 같은 하드웨어와 연결하여 시각적으로 보여주거나 제어가능하도록 ioT 시스템을 쉽게 구축할 수 있는 특징이 있습니다. 

아래는 노드레드 Flow 구성 및 편집 예시입니다.

이미지 출처 : nodered.org

아래는 노드레드 UI 예시입니다.

이미지 출처 : hackaday.com

아래는 노드레드 UI 예시입니다.

이미지 출처 : Yaser Ali Husen

아래는 노드레드 UI 예시입니다.

이미지 출처 : Yaser Ali Husen

 

기본 화면 구성은 아래 이미지와 같습니다.

① 노드레드 편집기 화면 구성

 

노드레드는 크게 4개의 영역으로 구성되는데요,,

→ ① 상단(Header) 영역에는 배포(Deploy) 메뉴와(Deploy) 팔레트관리와 같은 설정 메뉴가 배치되어 있습니다.

→ ② 팔레트(Palette) 영역은 각종 기능 구현해 주는 노드 블록들로 배치되어 있습니다.

→ ③ 측면(Sidebar) 영역은 노드에 대한정보/도움말/디버그/노드설정에 대한 메뉴로 구성되어 있습니다.

→ ④ 작업공간(Workspace) 영역은 노드들을 배치하고 이어주며 함수 노드에 프로그래밍을 하는 영역입니다.

 

상단(Header) 영역에 있는 배포(Deploy) 메뉴는 작업공간영역에서 완성된 노드들의 플로우를 실행시키는 역할을 합니다. 만약 UI(User Interface)가 있는 플로우라면 “http://localhost:1880/ui” 주소를 통해서 UI를 확인하거나 실행할 수 있습니다. 그리고 배포하기 옆에 세줄로 표시된 부분을 클릭하면, 라이브러리 추가 등 팔레트관리와 같은 설정 메뉴가 있는데, 제세한 내용은 이후 계속 설명이 됩니다.

팔레트(Palette) 영역은 작업영역 좌측에 있으며, 기본적으로 6개 그룹(카테고리)의 메뉴로 구성되어 있습니다. 여기에서 필요한 노드 블록을 선택하여 작업영역으로 끌어다 놓는 식으로 작업합니다. 기본 그룹 외에 추가적으로 팔레트관리 메뉴에 있는 라이브러리 추가를 통해 대시보드(dashboard)나 라즈베리파이(Raspberry Pi) 노드 그룹 같은 것들을 추가해서 사용할 수 있습니다.  
대략 2,700개 이상의 모듈을 추가 설치가 가능하며, 사용자 정의로 직접 모듈을 등록하고 관리할 수 있습니다.

 

측면(Sidebar) 영역은 노드 편집기 내의 유용한 도구를 제공하는 패널로 구성되어 있는데요, Information/Help/Debug/Configuration nodes/Context Data/Dashboard, 6개의 탭으로 구성되어 있습니다.

주로 Debug탭을 많이 활용하게 되는데요, 작업공간에서 사용한 디버그 노드의 출력을 확인할 수 있습니다. 측면영역은 작업영역 확보를 위해 숨김/보이기 처리할 수 있으며, (Ctrl+Space) 단축키도 할당되어 있습니다. 가령,  "Hello world!"와 같은 

 

작업공간(Workspace) 영역은 필요한 노드 블록을 끌어다 놓고 블록들 사이의 플로우(Flow)를 연결하며, 함수 노드의 경우 Javascript로 프로그래밍을 추가해 넣을 수 있는 작업 공간입니다. 노드들을 클릭하면 세부 설정을 변경하거나 코드를 입력할 수 있는 메뉴가 표시됩니다.  노드레드에서 노드는 플로우를 작성하는 기본 구성단위 요소입니다. 

작업공간 상단 우측에 보면 + 표시와 서브메뉴가 보이는데요,  이를 클릭하면 플로우 페이지를 추가하거나 보이기 감추기 등을 할 수 있습니다. 

또한, 불필요한 플로우 삭제는 아래처럼,  플로우를 더블클릭 후 나타나는 메뉴에서 플로우를 삭제할 수 있습니다.

 

그럼, 사용법을 익히기 위해 먼저 간단한 플로우를 작성해 볼게요.

▶ Hello world ! 문자 출력해 보기

프로그래밍을 배울 때 제일 처음 출력해 보는 것이 “Hello world!”인 것은 이제 국룰? 인데요, 여기서도 그 문장을 출력해 볼게요.

먼저 위 이미지처럼, 공통노드(common node) 그룹에서 inject(타임스탬프)를 플로우 작업화면으로 끌어다 놓으세요.   
그리고, 타임스탬프노드를 더블 클릭하면 설정창이 열리는데, 아래 ②번 부분을 클릭하여 전달할 메시지 타입을 String(문자열)으로 선택합니다. 

그런 다음, 아래 ④번과 같이 "Hello world !" 메시지를 입력하고 완료 버튼을 눌러주세요.

 

 이제 공통그룹에서 debug 노드를 ⑤ 위치에 끌어다 놓으세요. 

그리고 "Hello world! " 노드 끝에 있는 포인트를 마우스로 드래그하면 연결할 수 있는 주황색 선이 나오는데요,  이를 debug노드의 연결점에 이어 붙여주세요.  (아래 이미지 참조)


각각의 노드 오른쪽에 보면, 파란색 점이 있는 것을 볼 수 있는데요, 이는 현재 새로운 노드가 삽입되었거나, 변경 사항이 발생한 표시이며, 아직 배포(적용)되기 전이라는 뜻입니다.     그럼,  이 상태에서 상단메뉴에 보이는 "베포하기" 버튼을 눌러주세요. 

 

그럼, 아래처럼 파란색 점이 사라진 것을 볼 수 있습니다.     이제 "Hello world!"라는 전달 내용(payload)을 가진 타임스탬프 노드의 왼쪽 버튼 부분(Inject)을 클릭하면 디버그 노드로 전달이 이루어집니다.   이윽고 우측 Sidebar의 디버그 창으로 "Hello world !"가 출력되는 것을 볼 수 있게 됩니다.    또한, Inject 버튼을 여러 번 클릭하는 만큼 출력이 됩니다.

 

참고로,  노드레드의 언어 설정은 기본적으로  영어, 독일어, 일본어, 러시아어를 지원하며, 한글도 지원하지만 간혹 한글 표현이 조금 어색한 경우도 있습니다.  
언어 설정 메뉴는 상단메뉴의 "배포하기" 버튼 오른쪽에 있는 삼선을 클릭 후,  창 탭을 클릭하면 나옵니다.

그리고 디버그 창에 출력된 내용이 지저분하거나 하여 삭제하고 싶을 때는 아래 휴지통 버튼을 클릭하면 됩니다. 

 

참고로 디버그(debug) 노드를 클릭 후 보이는 설정메뉴 하단에 "ㅇ사용가능" 표시가 있는데요, 이를 클릭하면 "Ø사용불가능"으로 표시가 바뀌며,  해당 디버그 노드는 실행을 시켜도 디버그 창으로 메시지 출력이 되지 않도록 사용이 중단됩니다. 

아래 이미지처럼,  해당 노드는 점선으로 처리되며,  Inject 버튼을 눌러도 아무것도 출력되지 않게 됩니다.

 노드의 삭제는 삭제하고자 하는 개별 노드를 선택한 다음 Delete 키로 쉽게 삭제 가능합니다.
노드간 연결된 선도 마우스로 선택 후 Delete 키로 삭제할 수 있습니다. 

그럼  "Node-RED의 시작!" 첫 글은 여기까지 하고,  다음 게시글에서 계속 이어가도록 하겠습니다.

반응형
반응형

※ Node-RED 소개

노드레드는 플로우(Flow) 즉, 흐름 기반의 프로그래밍으로써 시각적 표현에 매우 적합하고, 사용자가 보다 쉽게 접근할 수 있는 모듈입니다.  노드레드는 다수의 노드를 이용하여 각 노드별 원하는 요구사항에 맞는 플로우를 만들 수 있으며 이를 아두이노, 라즈베리파이 및 각종 센서, 디스플레이 등 제어모듈과 같은 하드웨어와 연결하여 시각적으로 보여주거나 제어가능하도록 ioT 시스템을 쉽게 구축할 수 있는 특징이 있습니다. 

 

[ Node-red  예시 ]

이미지 출처 : nodered.org
이미지 출처 : hackaday.com

 바로 위 이미지에서도 볼 수 있듯이 그래픽 기반의 GUI 환경으로 인터넷에 연결된 장치들을 모니터링하거나 컨트롤 할 수 있는 웹 앱 대시보드를 보다 쉽고 빠르게 구성할 수 있으며,  예를 들어,  API를 활용한 일기예보, 버스나 지하철 시간표, 뉴스 기사 및 IoT 홈 네트워크 등 활용가능한 범위도 다양합니다.  구동을 위한 서버가 필요한 경우에는 라즈베리파이로 저비용으로 간단히 해결할 수 있습니다.   

Node Red는 2013년 초 IBM의 Emerging Technology Services 그룹의 Nick O'Leary와 Dave Conway-Jonse의 부수 프로젝트로 개발 시작 되었고, 2016년 10월 JS Foundation의 창립 프로젝트 중 하나가 되면서 오픈 소스로 개발되었습니다.

Node Red는 가벼운 Node.JS를 기반으로 하기 때문에 라즈베리파이와 같은 낮은 하드웨어 및 열악한 클라우드 네트웍 환경에서도 실행이 가능합니다.   또한 Node의 패키지 저장소에 있는 22만 개 이상의 노드 패키지 모듈을 활용할 수 있는 장점이 있습니다. 

Node Red에서 생성된 플로우는 JSON 형식의 데이터를 사용하여 저장되며, 자신이 디자인한 플로우를 JSON 포멧으로 온라인상에 공개하거나 다른 사람과 쉽게 공유할 수 있도록 디자인되었습니다.(Node-red 공홈 또는 깃허브 등). 
 이는 자신이 힘들게 처음부터 모든 Node를 다 구성할 필요 없으며 다른 사용자가 공유한 노드를 쉽게 추가 함으로써, 쉽고 빠르게 시스템을 구축할 수 있는 장점이 있습니다.   

노드레드는 다양한 환경에서 설치 및 활용할 수 있는데요, 라즈베리파이, 비글본 블랙과 같은 저비용 하드웨어 뿐아니라, IBM클라우드, 아마존 웹 서비스, 마이크로소프트 애저와 같은 클라우드기반에서도 잘 작동됩니다. 

그럼,  노드레드를 사용해보기에 앞서, Node.JS의 설치가 필요합니다.  링크 : https://nodejs.org/ko/download   
링크에서 설치하려는 시스템에 맞는 Node.JS를 설치하세요.    여기서는 라즈베리파이에 설치하는 것으로 진행합니다만,  윈도 PC에서 라즈베리파이를 원격으로 접속해서 제어하기를 원한다면 윈도용 Node JS를 윈도 PC에 설치할 수도 있습니다.   혹은 라즈베리파이이와 하드웨어 모듈 같은 연결을 활용하지 않고 윈도용 NodeJS를 단순히 윈도 PC에 설치하여 Node-Red를 활용할 수도 있습니다.    

참고로,  각 노드에서 함수 코드를 만들 때에는 자바스크립트(Java Script)를 기본 코딩 언어로 활용하게 됩니다.   

그럼, 본격적으로 Node-Red의 세계로 출발해 보아요~!  

※  라즈베리파이에 Node-Red 설치하기

15년도부터 라즈베리파이 OS(라즈비안)에는 NodeJS와 Node-Red가 기본으로 설치가 돼있습니다.
즉, Node-Red와 업데이트만 진행하면 됩니다.
하지만 이것과 상관 없이 아래 명령어를 이용하여 설치하면 기존 설치된 혹은 구버전 NodeJS와 Node-RED를 자동 제거부터 하고 설치가 진행되니 그대로 진행해도 됩니다.

$ sudo apt-get update
$ sudo apt-get upgrade
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
$ sudo apt-get update
$ sudo apt-get upgrade


그리고 위 명령어를 복붙복 하세요.  NodeRED 참고 공식 링크  : https://nodered.org/docs/getting-started/raspberrypi

아래 이미지들은 Node-Red 설치 진행 과정입니다.

Y를 두 번 입력

Y를 차례로 두 번 입력하여 설치해 주세요. 

그럼, 아래처럼 최신 버전의 Node JS (v16.19.1)와  Node-RED (v3.0.2)가 설치됩니다.  만약 구버전이 있다면 자동 삭제 됩니다. 

▶  부팅시 Node-RED가 자동으로 실행되도록 하려면 아래 명령어를 실행해 주면 됩니다.

$ sudo systemctl enable nodered.service

 - 만약 자동실행 설정을 해제하려면 아래 명령을 입력하세요. 

$ sudo systemctl disable nodered.service

 

▶ node-red의 서비스 시작은 아래 명령어로 시작하면 됩니다.   
Node-RED의 서비스 시작은 터미널에서 명령어를 입력하거나, 라즈베리파이 메뉴에서(개발 》Node-RED)   Icon을 클릭하여 실행 가능합니다.    명령어로는   $ node-red  또는  $ node-red start   하나를 입력하면 됩니다.

$ node-red start

 

▶ 이제 웹브라우저를 열어 Node-Red가 실행될 혹은 작업화면은 라즈베리파이의 IP 주소를 입력하면 되는데요,   기본 설치되어 있는 크롬미움 Chromium (크롬의 리눅스 버전)이나,  파이어 폭스(Fire Fox Web) 웹브라우저에서 아래 주소를 입력하면 됩니다. 
http://localhost:1880      또는  http://localhost:1880/ui/     

혹은 ip를 직접 입력하여   http://192.168.138.130:1880  또는 http://192.168.138.130:1880/ui로 입력하면 아래처럼 Node-Red 에디터(편집) 창이 나타나는 것을 볼 수 있습니다.   이 공간에서 플로우를 개발한다고 생각하면 됩니다.

▶ Samba 툴을 설치하여 윈도우 PC에서 "원격 데스크톱 연결"을 통해서도 가능합니다.  
  라즈베리파이 원격 데스트탑 연결 내용은 아래 게시글을 참고해 주세요. 
  ▷ 윈도PC에서 라즈베리파이 원격 제어하기 ( https://rasino.tistory.com/329 )

 

그리고 Node-RED 네트워크 사용자 추가나 Node-RED 기본 환경설정은 아래 명령어로 설정해 주면 되는데요, 

$ node-red admin init

아래와 같은 내용이 나타나며,  아래 경로의 settings.js 파일에 설정내용이 저장됩니다. 

  /home/pi/.node-red/settings.js

엔터를 하면, 다음으로 진행이 되는데요,   Yes와 No 메뉴 혹은 기타 선택 메뉴가 나타나면 키보드 화살표 위/아래 키로 선택해 주면 됩니다. 

Do you want to setup user security? Yes
 → User Security :    id (예시: pi )와 password (8자 이상, 예시: raspberry)  입력 후 엔터,  →  유저 추가 선택 (여기서는 No) 선택  (ID와 패스워드는 잘 기억해 두세요)
→  User permissions?full access를 선택  
→ Add another user?No 선택 (추후 선택 가능)

②  프로젝트 선택  :  Do you want to enable the Projects feature?No 선택

③ Flow 파일 설정:  Flow File settings?flows.json (기본값으로 저장)

④ 테마 에디터 및 텍스트 에디터 설정 :   Select a theme for the editor default?  두 가지 모두 default로 설정 

⑤ 외부 모듈 받아들일지 여부? :   Allow Function nodes to load external modules?Yes (기본값으로 저장)

 

이와 같이 설정하면 무난하며, 추후에 명령어로 다시 변경 가능합니다. 

 

이렇게 설정하고 재부팅하게 되면,  로그인 창이 뜨는데요,  조금 전에 만들어준 계정으로 로그인하면 됩니다.

(예시)  ID :  pi  ,     Password :  raspberry

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

(기타 참고)   라즈베리파이에 파이어 폭스 Firefox Browser 설치하기  명령어 (최신 버전)

$ sudo apt update
$ sudo apt install firefox-esr

 

아래는 NodeRED를 실행하고 간단한 문자(String) 출력과 함수 노드를 이용한 숫자 카운트를 해보는 모습입니다. 

 

물론 같은 WiFi망 혹은 내부 네트워크에서 접속하는 것이라면, 아래처럼, 윈도 PC에서 라즈베리파이 주소를 입력하면 Node-RED 편집화면에 접속하여 실행시킬 수 있습니다.   ( 예시,  http://192.168.138.130:1880/ )

단, 윈도에서 노드레드를 실행하기 위해서는 윈도에 윈도용 Node JS가 설치되어 있어야 합니다. 
링크 : https://nodejs.org/ko/download    (LTS 안정화 버전을 다운로드하세요)
node js 설치 확인 및 버전확인은 아래처럼 가능하며, 윈도에 설치한  NodeJS의 버전 확인은,  윈도》실행》 cmd 명령 프롬프트 실행 하여,  node  -v로 실치 및 버전을 확인할 수 있습니다.    또한,  라즈베리파이에서는 터미널에서 같은 명령어로 확인 가능합니다. 

 

참고로,  윈도에서 Node-RED 실행은 아래 이미지와 같이 "node-red"를 입력하면 됩니다.   Node-RED의 버전확인도 가능하고 Starting flows라고 표시되는 것을 확인할 수 있습니다. 


마지막으로,
▶ Node-RED의 플로우 편집화면은   http://localhost:1880  또는  http://192.168.138.128:1880 형태의 주소로 접속하면 되며,
▶ Node-RED의 Dash Board(대시보드) 결과 출력 혹은 컨트롤 화면은  주소 마지막에/ui를 붙인 주소를 입력하면 됩니다.   (예시,  http://localhost:1880/ui   또는 http://192.168.138.128:1880/ui )

 

 

그럼, 차후에 Node RED를 이용해서 라즈베리파이에 연결된 모듈이나,  MQTT 브로커와 연동된 통신 실습을 올려볼 예정입니다.   감사합니다.

 

반응형
반응형

라즈베리Pi#22 초음파 센서(HC-SR04) 사용하기!  with (파이썬 코드)
RaspberryPi Ultra-Sonic Sensor with Python !


 라즈베리파이에서 초음파 센서인 HC-SR04 모듈을 사용하는 방법에 대해 다루어 보겠습니다. 
코드는 파이썬으로 하고, "거리 측정기"를 예시로 진행해 보겠습니다.

 그리고, 내용 초반에 라즈베리파이에 직접 모니터와 키보드, 마우스 등을 연결하지 않고 자신의 주 PC인 윈도 PC에서 원격 접속으로 접속하여 동작시키는 방법으로 진행이 되는데요, (물론 직접 연결하여 진행해도 됩니다)

만약 원격 접속 제어 방법이 궁금하다면,  라즈이노 ioT(게시글) 블로그와  유튜브 영상을 참고해 주세요.

【라즈베리Pi#19】 윈도 PC에서 라즈베리 Pi 원격 제어하기

[ 윈도 PC에서 라즈베리 Pi 원격 제어하기 - 유튜브 영상으로 보기 ]

  원격 접속을 하면,  모니터 및 키보드와 마우스를 추가로 연결할 필요 없고, 멀리 떨어진 임의의 장소에 설치되었더라도, 네트워크만 연결되어 있으면, 제어할 수 있어 활용도가 높은 장점이 있습니다. 

 

실습 준비물

 위 실습 준비물을 준비해주시는데요, GPIO 40핀 어댑터&케이블은 없어도 실습을 진행할 수 있으나, 
있다면  핀 네임을 보며 연결할 수 있기에 좀 더 안정적으로 편하게 연결할 수 있습니다.

 브레드보드 또한 크게 사이즈 상관이 없으며,  작은 사이즈를 타이트하게 사용하거나 두 개 이어 붙여 사용할 수 있습니다.

라즈베리Pi 초음파 센서 연결도 

 위 이미지는 라즈베리파이 초음파 거리측정 회로 연결 도면입니다.  연결 도면을 보고 부품들을 연결해 주세요.

※  주의 사항!
아래 주의사항들을 반드시 숙지하고서 작업해 주세요~!

[ 라즈베리파이의 출력 ]
라즈베리파이의 GPIO 핀의 출력 허용 전류는 핀당 최대 8mA로(모든 핀 총합 50mA)로 제한되어 있기에 LED 이상의 모터 등과 같은 모듈을 직접 출력 제어하는 것은 라즈베리파이를 손상시킬 수 있습니다. 

[ 라즈베리파이의 입력 ]
최대 3.3V까지 입력이 허용되며, 신호 레벨의 임계값은 1.8V입니다.   즉, 1.8V 보다 크면 논리 1(High),  작으면 논리 0(Low)으로 인식합니다. 
입력 가능 전류는 핀당 최대 5mA를 넘지 않도록 해야 합니다. 

라즈베리파이의 GPIO는 3.3V 레벨로 동작하기 때문에 반드시 3.3V 이상의 전원 또는 신호 레벨이 입력되지 않도록 주의하세요~!

 아두이노와 달리 컴퓨터 시스템과 같은 라즈베리파이는 포트에 출력으로 할애할 수 있는 여유가 크지 않기 때문에 LED 이상의 부품들은 포트 출력으로 작동시키지 말고 VCC 전원을 싱크(Synk)하여 처리하거나, 별도의 전원을 공급하여 처리하는 것이 좋습니다. 
 또한, 라즈베리파이는 입력받을 수 있는 전압 또는 신호 레벨이 3.3V 이하여서, 초음파 센서의 Echo핀으로 받는 5V의 High 신호 레벨을 3.3V로 낮추기 위해 1 : 2 비율의 저항을 연결하여 아래 그림처럼 3.3V로 낮추어 입력받게 됩니다.

입출력 핀은 어떤 GPIO 핀을 사용해도 상관없으며, 코드에서 핀 번호와 일치시켜주면 됩니다.

그럼, 초음파 센서를 통하여 거리 측정하는 원리를 간단히 설명해 보겠습니다.

초음파 센서 모듈을 살펴보면, 송신 모듈과 수신 모듈이 한 세트로 되어 있는 것을 볼 수 있습니다.

아두이노에서 초음파 센서의  Trigger Pin으로 10us의 펄스 신호를 입력해 주면,  초음파 센서의 송신 모듈에서 25us짜리 8개의 음파를 발사하게 되고, 이 음파가 물체에 부딪혀 수신 모듈로 되돌아올 때, 에코 핀에서는 그 시간 동안만 High 신호를 출력하게 됩니다.

이 High 신호의 간격(시간)을 이용해 아두이노에서 음파의 속도를 적용하여 물체와의 거리 값을 계산하게 됩니다
〔 음파의 속도 : 343m/s (34,300cm/s) 〕

Echo Pin의 High 펄스 시간은 펄스가  발사되고 물체에 반사되어 되돌아오기(왕복)까지의 시간이기 때문에, 나누기 2를 해주면 물체와의 거리 값을 구할 수 있습니다.

distance = (check_time x 34300) / 2

다음은, 회로를 동작시킬 파이썬 코드입니다.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

TRIG = 23
ECHO = 24
print("초음파 거리 측정기")

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

GPIO.output(TRIG, False)
print("초음파 출력 초기화")
time.sleep(2)

try:
    while True:
        GPIO.output(TRIG,True)
        time.sleep(0.00001)        # 10uS의 펄스 발생을 위한 딜레이
        GPIO.output(TRIG, False)
        
        while GPIO.input(ECHO)==0:
            start = time.time()     # Echo핀 상승 시간값 저장
            
        while GPIO.input(ECHO)==1:
            stop = time.time()      # Echo핀 하강 시간값 저장
            
        check_time = stop - start
        distance = check_time * 34300 / 2
        print("Distance : %.1f cm" % distance)
        time.sleep(0.4)
        
except KeyboardInterrupt:
    print("거리 측정 완료 ")
    GPIO.cleanup()

[ 위 코드 다운로드 ]

UltraSonic.zip
0.00MB

 

아래는 초음파 거리측정 회로를 연결한 실제 모습입니다.

이렇게 연결 커넥터(어댑터)를 이용하면 부품을 연결할 때 쉽고 간결하게 작업할 수 있습니다.

또한 핀 레이블이 적혀있어, 잘못 연결되는 실수를 줄일 수 있습니다.

그럼,  실습을 위해 라즈베리파이를 부팅시키세요.

 키보드와 마우스를 직접 연결하여 라즈베리파이에서 코드를 직접 실행시킬 수 있으며, 윈도 PC에서 “원격 데스크톱 연결” 기능을 사용하여 원격으로 실행할 수도 있습니다.
원격 데스크톱 기능을 사용하면 아래 사진처럼, 키보드나 마우스 연결이 필요 없어 Pi 주변이 깔끔해집니다.
물론 랜선 연결 대신, WiFi로 연결하면 더욱 깔끔해지겠죠.

그리고 이때,  네트워크 연결은 PC와 동일한 네트워크로 연결되어 있어야 합니다. 
일반적으로 라즈베리파이가 랜선 연결일 경우 원격 접속하는 PC도 랜선으로 동일한 내부 네트워크로 접속해야 하고, 
WiFi 연결할 경우 동일한 WiFi중계기에 접속된 PC나 노트북 등으로 원결 접속하면 됩니다.

그럼 윈도 PC에서 원격 데스크톱 접속(검색)을 실행시켜 주세요. (라즈베리파이에서 직접 실행시키는 분은 상관없습니다)


컴퓨터 항목에 라즈베리파이가 할당받은 IP주소를 입력하고 연결을 클릭하세요.

라즈베리파이가 할당 받은 IP주소는 사전에 한 번 라즈베리파이로 모니터를 연결하여 파악해 주세요.

ID와 패스워드를 화면처럼 소문자로 입력합니다.

일반적으로 User 이름과 패스워드를 특별히 다른 것으로 변경하지 않았다면, 아이디는  pi  ,  비번은  raspberry입니다.

부팅이 완료되면,   Raspberry Pi Configuration (환경설정) 메뉴로 들어갑니다. 

Interfaces 메뉴로 들어가서 (SSH)를 Enable로 체크해 주세요.

만약 설정이 바뀌었다면 재부팅을 하고 다시 원격으로 연결하세요.

그리고 원격에서 Pi 시작 메뉴의 종료(다시 시작) 메뉴가 작동하지 않는 경우: 원격에서 라즈베리파이를 종료시키는 명령어 (터미널 창 이용)를 사용해 보세요

$ sudo shutdown -h now

그럼 이제, 개발 메뉴에서 Thonny Python IDE를 실행합니다.

토니 파이썬에 코드를 입력하고 실행시켜 봅니다.

그럼, 초음파 센서의 정면으로 평평한 면적의  노트나 박스 같은 것을 준비해서 측정해 보세요.

아래는 실제 측정되는 모습입니다.

만약, 수치가 들쭉날쭉하다면,  초음파가 잘 반사될 수 있도록 센서의 각도와 반사판의 면적이 너무 작지 않은지? 등 확인해 보세요.

네, 이렇게 라즈베리파이에서 초음파 센서(sr-04)를 연결하고, 응용 예시로 거리측정까지 다루어 보았습니다.

 본 게시글의 내용을 따라 하기 쉽도록 영상으로도 만들었으니,  아래 유튜브 영상을 참고해 보세요. 
감사합니다. 

 

 

 

반응형
반응형

라즈베리Pi#21 서보(Servo) 모터 제어하기!  with (파이썬 코드)
RaspberryPi Servo-motor control with Python !

 안녕하세요 라즈이노 IoT 입니다.
이번 시간에는 라즈베리 Pi에서 각도단위로 매우 정확하게 움직이는 서보모터를 파이썬 코드로 제어해보는 실습입니다.
서보 모터는 다양한 곳에 활용하기 좋은 부품이기에, 이번 영상을 학습해 두면,  많은 도움이 되리라 생각됩니다.
이번 영상은 라즈베리pi에 모니터를 연결하지 않고, 윈도PC에서 원격 접속하여 진행합니다. 

만약 원격 접속 제어 방법이 궁금하다면,  라즈이노 ioT(게시글) 블로그와  유튜브 영상을 참고해 주세요.

【라즈베리Pi#19】 윈도 PC에서 라즈베리 Pi 원격 제어하기

[ 윈도 PC에서 라즈베리 Pi 원격 제어하기 - 유튜브 영상으로 보기 ]

  원격접속을 하면,  모니터 및 키보드와 마우스를 추가로 연결할 필요 없고, 멀리 떨어진 임의의 장소에 설치되었더라도, 네트워크만 연결되어 있으면, 제어할 수 있어 활용도가 높은 장점이 있습니다. 

먼저, 윈도 시작 메뉴 검색에서 ‘원격 데스크톱 연결’을 검색해서 실행합니다.

 


  라즈베리pi가 꺼져 있기에 지금은 접속이 되지 않는데요,  라즈베리pi의 전원을 넣어 부팅 시켜 볼게요. 
그리고 랜 케이블(또는 WiFi) 연결하여 네트워크에 접속할 수 있도록 합니다.
중요한 사실은 동일한(공유기) 내부 네트워크에 접속된 상태여야 원격제어가 됩니다. 
또는 외부에서 인지할 수 있는 공인 ip 주소를 할당받은 경우에  접속이 가능한데요,
만약  집에서,  같은 WiFi 공유기라 하더라도, PC(랜선) ↔ 라즈베리pi(WiFi) 연결은, 할당받는 사설 ip 대역이 달라서 접속이 안 될 수 있습니다.
그래서,   PC (LAN) ↔ 라즈베리pi (LAN)  , PC (wifi) ↔ 라즈베리pi (wifi) 연결해 주세요.
먼저, 서보모터를 아래 연결도와 실제 연결 모습을 참고하여 연결해 주세요.

※ 게시글 모든이미지는 클릭하면 확대됩니다

게시글 모든이미지는 클릭하면 확대됩니다



 회로를 연결할  때, +와 -가 합선이 되지 않도록 특별히 주의해주세요 .
합선이 되는 순간, 라즈베리pi가 큰 데미지를 먹게 되어 작동이 안 될 수 있어요.
  가급적이면,  별도의 전원을 준비해서, 아래 처럼 연결해서 사용하는 것이 합선에 대비할 수 있고 안전합니다. 

  그리고, 라즈베리파이의 GPIO핀으로는 출력 전류가 크지 않습니다(약, 50mA) ,  이런 출력을 서보모터 같은 것으로 강하게 뽑아 쓸 경우,  라즈베리파이에 손상을 입힐 수 있기 때문에, 별도의 전원을 달고 모터에 공급해주는 것이 좋습니다.   이 때,  두 전원의 GND는 서로 연결해 주어야 합니다.
 전원은, 보조 배터리나, 리튬이온, AA 건전지도 가능한데요, 약5v 정도를 구성해 주세요.
이때, 라즈베리Pi와 추가 전원의 GND(-)는 서로 연결해 주어야 합니다.  (일부 보조 배터리의 경우 잠시 배터리 사용이 없을 경우 절전 모드로 들어가버려, 전원이 꺼지는 경우가 있을 수 있습니다.  이럴 때는 , 다른 전원을 사용해 보세요)

서보모터 전용 전원을 추가한 연결도

 

그럼, 연결된 라즈베리파이를 부팅해서 네트워크까지 연결 시켜 주세요. 
그리고 처음에 한 번, 라즈베리pi에 모니터를 연결해서 할당 받는 ip 주소를 확인하여 적어두면 좋습니다.

그럼, 아래 이미지 처럼, 이렇게 확인해둔, ip를 입력하고 연결(N)을 클릭하세요.

 아래 이미지와 같은 메시지가 뜨면 예(Y)를 클릭합니다.

 

그럼, 리눅스계열 X윈도 원격 테스크톱 로그인 창이 뜹니다.

그럼,  여러분의 라즈베리파이의 삼바서버 설치 때, 유저(user)생성시 만든 user id와 비번을 입력하면 되는데요,
제 이전 영상에서는 ID와 비번은 아래와 같습니다.
username  : pi     
password  : raspberry  

로그인에 성공하면 아래와 같은 라즈베리파이의 라즈비안 OS의 화면이 열립니다.

그런데,  만약, 패스워드 비번에 문제가 없는데,  로그인이 되지 않는다면, 아래 이미지 처럼 SSH 접속 허용을 해주셔야 합니다.  (만약 SSH 허용 설정이 되지 않았다면, 라즈베리파이에 모니터를 연결하고 직접 로그인하여 설정해야 합니다)

원격접속이 되기 위해서는 사전에 SSH채널 허용함(Enabled)으로 되어 있어야 합니다

 네, 라즈베리 pi로 접속이 잘 된 것을 볼 수 있는데요, 먼저, 파이썬 코드를 작성할 텐데요, 파이썬 코드 작성은 선호하는 편집기나 혹은 메모장으로 작성해도 되는데요, 여기서는 라즈비안OS에 기본 내장된 Thonny Python IDE를 사용해 보겠습니다.
프로그램 위치는 아래 이미지를 참고해 주세요.

Thonny Python IDE 프로그램 실행 모습

먼저 서보 모터의 동작 원리에 대해 간략히 설명드릴게요.  
아래는 일반적으로 많이 사용되는 SG90 서보모터의 스팩입니다.

  서보모터는 DC 모터처럼 빠른 속도로 회전하는 용도로 사용하는 것은 아니며, 일정한 각도와 원하는 위치로 정확한 회전을 하기 위한 곳에 사용되는 모터입니다. 
예를 들어, RC-Car 앞바귀 좌우 회전, 로봇 팔다리 회전, 문 열고 닫기 등 무한 회전보다는 한정된 각도 내에서 정확한 위치제어가 필요한 곳에 많이 사용됩니다.
보다 더  정밀하고 파워를 필요로 곳에는 스텝 모터를 사용하면 되고, 서보모터는 저렴하면서 작은 크기와 낮은 소비전력으로 인해 활용성이 좋습니다. 
보통은, 90도 회전용, 180도 회전용이 주를 이루고 있으나 360도 무한 회전용도 있습니다.

서보모터는 20ms 주기의  펄스파에서 High 신호 파형을 1ms~2ms 범위를 가지고, 회전 각도가 정해지며, 180˚ 서보의 경우, 1ms 신호일 때, 0˚의 위치로 이동하며,  1.5ms 이면 90˚ ,   2ms 일 때 180˚의 위치로 이동하게 됩니다.

그래서,  1ms~2ms의 신호 범위로 0˚~180˚의 각도를 조절하게 됩니다.

단, 일부 서보모터의 경우 1~2ms 작동 범위의 오차가 다소 있으며, 180˚서보의 경우 실제적으로 움직일 수 있는 각도 범위는 2˚~177˚ 이하로 보는 것이 좋습니다.

만약 서보모터가 심하게 떨리는 증상이 있다면, 이 범위를 벗어난 신호 때문일 수 있습니다.

이미지 클릭하여 확대해서 보세요

 라즈베리pi에서 서보모터의 각도 변경은 ChangeDutyCycle (  ) 함수를 사용합니다. 
함수의 인자값으로 사용되는 듀티비는 화면과 같은 수식으로 구할 수 있습니다. 
서보모터를 0˚ 위치로 보내기 위해서는 1ms의 PWM 신호를 넣어주면 되는데요, 
- 1ms는 20ms 신호 주기의 5%에 해당됩니다.
  따라서 ‘5’%라는  인자값을 듀티비 함수에 넣어 주면, 서보모터는 0˚로 이동합니다.

서보모터를 180˚ 위치로 보내기 위해서는 2ms의 PWM 신호를 넣어주면 되는데요, 2ms는 20ms 신호 주기의 10%에 해당됩니다.  
따라서 ‘10’%라는  인자값을 듀티비 함수에 넣어 주면, 서보모터는 180˚로 이동합니다. 마찬가지로, 90˚는  인자값 7.5%를 함수에 넣으면 되고, 나머지 각도 계산도 동일한 방식입니다. 

문제는, 서보모터 제품별로 1ms~2ms(5%~10%) 작동 범위에 오차가 있을 수 있습니다.
실습에 사용된 일부 매우 저렴한 SG90 제품의 경우, 테스트를 해보니,  신호 주기를 0.6ms~2.4ms(3%~12%)의 범위로 하였을 때, 0˚~180˚의 각도 대부분을 제어할 수 있었습니다.  따라서  5%~10% 의 기본값을 적용해 보고  오차가 있을 경우, 듀티비 값을  조금씩  조절해서  각도를 최대로 안정적으로 움직이는 값을 찾아보면 됩니다.

실습 순서와 실습 파일은 화면을 참고하세요.

[ 실습 파일 링크 ] 
실습 파일 6개를 하나로 압축해 놓았습니다.

python-Code.zip
0.01MB

Thonny python IDE  편집기는 기본에 충실하고, 디버깅이 지원되며,  매우 직관적이고 사용법이 간단하여 많이 사용되고 있는 편집기입니다.  그럼, 첫 번째 실습 코드를 직접 작성하거나,  링크한 파일을 여세요. 

### (실습 1) 서보모터 각도 조절해 보기 (0도 위치로 돌리기) , 실습 파일 :  Servo1.py  ###
### 학습 자료 제공 페이지 : Rasino.tistory.com/341
# 서보는 PWM을 20ms(50hz) 주기로 동작시키고 펄스 폭(duty)만 조절해 위치(각도)를 조절함.
# 여기서 duty는 1주기 동안 High를 유지하는 기간이며, 
# 20ms 주기에 100% 면 20ms가 되는 것이고 10% 면 2ms 5% 면 1ms가 됨.
# 펄스 폭은 1ms 일때 0도 2ms 일때 180도, 중간값 1.5ms 일때 90도로 이동함.
# 단, 저렴한 서보는 3%~12%(0도~180도)의 동작 특성을 가짐.
# 만약 모터가 떨린다면, 이 범위를 벗어났기 때문이며, 0도에서 떨린다면
# 3%값에서 조금 올려주고, 180도에서 떨린다면 12%에서 값을 조금 내려주면 됨.

import RPi.GPIO as GPIO
import time

servo_pin = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)

pwm = GPIO.PWM(servo_pin, 50)  # 50Hz (서보모터 PWM 동작을 위한 주파수)
pwm.start(3.0)  # 0.6ms

time.sleep(2.0)
pwm.ChangeDutyCycle(0.0)

pwm.stop()
GPIO.cleanup()

준비되었으면, 코드를 실행해보세요.
실행하면, 서보의 축이 0˚의 위치로 이동하게 됩니다.
코드에 대한 설명은 주석을 상세히 달아 두었으니 꼭 참고해 보세요.
그럼, 바로 이어서 실습2번 코드를 여세요.

2번 실습은 0˚→90˚→180˚ 단계로 회전을 하되 3회 반복하도록 하였습니다.

### (실습 2-1) 서보모터 각도 조절해 보기 (0도, 90도, 180도 조절하기)  실습 파일 :  Servo2.py ###

import RPi.GPIO as GPIO
import time
servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)  # 50Hz (서보모터 PWM 동작을 위한 주파수)
pwm.start(3.0) #서보의 0도 위치(0.6ms)이동:값 3.0은 pwm주기인 20ms의 3%를 의미하므로,0.6ms됨.

for cnt in range(0, 3) :       # 0부터 3미만까지(3번) for문의 내용을 반복
    pwm.ChangeDutyCycle(3.0)   # 서보모터를 0도로 회전(이동)
    time.sleep(1.0)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(7.5)  # 서보 모터를 90도로 회전(이동)
    time.sleep(1.0)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(12.5)  # 서보 모터를 180도로 회전(이동)
    time.sleep(1.0)            # 서보 모터가 이동할 시간을 줌
    
pwm.ChangeDutyCycle(0.0)

pwm.stop()
GPIO.cleanup()

준비가 되었으면, 2번 코드를 다시 실행해 보세요.

실습 2-1 실행 모습

 

### (실습 2-2) 서보모터 각도 조절해 보기2 (0도, 45도, 90도, 135도 , 180도,...역순으로 조절하기)
조정된 듀티비 약 3%→12%를 적용하였습니다.   

import RPi.GPIO as GPIO
import time
servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)  # 50Hz (서보모터 PWM 동작을 위한 주파수)
pwm.start(3.0) #서보의 0도 위치(0.6ms)이동:값 3.0은 pwm주기인 20ms의 3%를 의미하므로,0.6ms됨.
timeA = 0.6

for cnt in range(0, 3) :       # 0부터 3미만까지(3번) for문의 내용을 반복
    pwm.ChangeDutyCycle(3.0)   # 서보모터를 0도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(5.5)  # 서보 모터를 45도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(7.5)  # 서보 모터를 90도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(9.5)  # 서보 모터를 135도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌    
    pwm.ChangeDutyCycle(12.5)  # 서보 모터를 180도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(9.5)  # 서보 모터를 135도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌    
    pwm.ChangeDutyCycle(7.5)  # 서보 모터를 90도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(5.5)  # 서보 모터를 45도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(3.0)   # 서보모터를 0도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌

pwm.ChangeDutyCycle(0.0)
pwm.stop()
GPIO.cleanup()

실습 2-2를 실행한 모습입니다.

 

그리고 마지막 실습 파일 Servo3-3을 여세요.
3%↔12%(0˚↔180˚)의 값을 1%단위로  왕복하도록 구성했습니다.

### (실습 3-1) 서보모터 각도 조절해 보기 (0~180도까지, 1%단위로 조절하기)
조정된 듀티비 약 3%→12% (0˚→180˚)의 값을 1%단위로 움직이도록 하였습니다. 

import RPi.GPIO as GPIO
import time

servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin,GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(3.0)

for high_time in range (30, 125):
    pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
    time.sleep(0.02)
    
pwm.ChangeDutyCycle(3.0)
time.sleep(1.0)
pwm.ChangeDutyCycle(0.0)

pwm.stop()
GPIO.cleanup()

실습 3-1 실행 모습

 

### (실습 3-2) 서보모터 각도 조절해 보기 (0~>180도 까지만 1%씩 움직이기 x 3회)

 

import RPi.GPIO as GPIO
import time

servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin,GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(3.0)

for i in range (0,3) :    
    for high_time in range (30, 125):
        pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
        time.sleep(0.02)
    
    pwm.ChangeDutyCycle(3.0)    
    time.sleep(1.0)
    
pwm.ChangeDutyCycle(0.0)
pwm.stop()
GPIO.cleanup()

실습 3-2 실행 모습

 

### (실습 3-3) 서보모터 각도 조절해 보기 (0↔180도 1% 단위로 왕복 움직이기 x 3회)

import RPi.GPIO as GPIO
import time

servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin,GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(3.0)

for i in range (0,3) :    
    for high_time in range (30, 125):
        pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
        time.sleep(0.02)
 
    for high_time in range (124, 30,-1):
        pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
        time.sleep(0.02)
        
pwm.ChangeDutyCycle(0.0)
pwm.stop()
GPIO.cleanup()

실습 3-3 실행 모습

그리고, 터미널 창을 통해 명령어로 파일을 실행시켜 볼 수 있습니다.
우선, 파일 탐색창을 열어 파이썬 파일을 저장한 위치를 먼저 확인해보면 찾기 쉽습니다.
터미널 창을 열고, 리눅스 명령어를 사용하여, python 실습 파일이 저장된 위치로 이동하세요.



그리고, 아래 처럼, 파이썬 실행 명령으로 실행 시키면, 서보모터가 동작하는 것을 볼 수 있습니다.

명령어 : sudo python3  파일명
$ sudo python3  Servo3-2.py

【 설명 내용 영상으로 시청하기 】


네, 이렇게 해서 서보모터를 라즈베리pi에서 제어하기 위한 전반적인 내용을 다루었고,
파이썬 코드를 이용해서 직접 제어해 보았습니다.
감사합니다.

반응형
반응형

라즈베리Pi#20피에조 부저 사용하기!  with (파이썬 코드)
RaspberryPi Buzzer control with Python !

 안녕하세요 라즈이노 IoT 입니다.
이번 시간에는 라즈베리 Pi에서 부저를 사용해 보는 실습을 진행합니다.
GPIO 출력을 제어하여 부저를 울리는 방법을 설명드리며, 
주파수를 이용하여 음의 높낮이를 조절할 수 있기에, 실습5 에서는 간단한 동요를 출력해 보겠습니다.


1.  음계(Scale)와 옥타브(Octave)

  음계란, 음악에 쓰이는 음을 높이의 차례대로 배열한 음의 층계를 말합니다.   
음 높이는 Pitch.    

음계(Scale)

  "도, 레, 미, 파, 솔, 라, 시, 도" 의 8가지 음계를 옥타브라고 합니다.  즉, 옥타브는 어떤 음에서 완전 8도의 거리에 있는 음까지를 말하며, 물리학적으로는 주파수(진동수)가 두 배 차이나는 두 음 사이의 음정을 말하는데,  예를 들어, 음높이가 400Hz인 음과  800Hz인 음 사이의 음정은 옥타브라고 말하며, 인간의 귀는 이 두 음을 높이는 다르지만 서로 같은 음으로 인식합니다.  (예, 낮은 '도'와 높은'도',  낮은 '솔'과 높은 '솔')

옥타브
8 옥타브



2.  소리와 주파수 (음계 별 표준 주파수)


스피커나 부저를 통해서 듣게 되는 음도, 진동판의 떨림(주파수)에 의해 들을 수 있게 되는데요, 1초(Second)에 1회의 떨림을 1Hz라 부르며,  1초에 100회면 100Hz라 말합니다.  떨림(주파수)이 낮을수록 낮은음을 내게 되며, 높을수록 늪은 음을 내게 됩니다. 
음악에 사용되는 악기들의 종류는 매우 다양하고 많지만, 합주를 했을 때 음의 일치가 되는 이유는,  각각의 음 높이가 특정 주파수로 정리되었기에 가능합니다. 
아래가 각 음계 별 표준 주파수입니다.

이미지 참조 : control.cntc.ac.kr/cpu

 그럼, 이 번 실습에서 각 음계 별 주파수를 참고하여, 적당히 반올림한 수를 코드에 적용하면, 해당음의 소리를 출력할 수 있게 됩니다.   

 

 3. 부저의 종류와 특징 : 


    - Passive type : 전원만 가해서는 소리가 나지 않고, PWM 형태의 일정한 주파수일 때 소리가 나는 타입.
    - Active type : 전원만 연결해 주면 소리가 나는 타입.

위 이미지에서 녹색의 기판이 보이는 부저가 (좌) 패시브 타입이며,  PWM처리 회로를 내장하여 검은색으로 마감 처리한 부저가 (우) 액티브 타입 부저입니다.

  라즈베리 Pi의 포트에서 High 신호를 내보내어 직접 부저를 울릴 수도 있지만, 출력이 약할 수 있고, 포트를 통한 직접적인 출력을 제한하기 위해,  아래와 같은 Low level trigger 방식을 사용할 수 있습니다. 
이 방식은, GPIO 포트를 통한 직접적인 출력을 사용하지 않고, VCC 전원을 사용하게 함으로, 포트를 보호하게 되며, 부저에 충분한 전류를 공급할 수 있게 합니다. 

(Low level trigger 부저 연결회로도와 연결도)

 회로 연결을 보면, 입출력(I/O) 부분이 Low 신호가 되면, TR이 작동(스위치 On) 되어, VCC(+), Buzzer로 이어지는 전류가 E(에미터) - C(컬렉터)로 빠져나가면서, Buzzer를 울리게 됩니다.  그래서 이런 작동 형태를 '로우-레벨-트리거'(Low level trigger)라 말합니다.  
TR은 위 회로 기준으로,  가지고 있는 PNP타입의 TR 어떤 것이든 사용 가능합니다.
TR의 경우는  NPN 타입과 PNP타입으로 나뉘는데요,   PNP 타입도 제품 품번마다 E(에미터),  B(베이스),  C(컬렉터) 핀의  위치가 다르기 때문에  자신이 사용하는 TR의 스펙을 확인(검색 가능)해서 연결하면 됩니다. 

(좌)NPN 타입과  (우)PNP 타입 참고 이미지

즉,  같은 PNP 타입의 TR이라 하더라도, 위 이미지처럼, A1015품번의 경우 핀이 E C B의 순으로 되어 있지만,  
또 다른 PNP타입의 A9012 TR의 경우 핀 순서는 E B C로 되어 있습니다. (핀 배열 구분 주의!)   

또한 아래처럼,  액티브 타입 부저를 '로우-레벨-트리거' 방식으로 모듈화 한 제품도 있으니 참고하세요.
그림에 보면 TR과 저항이 내장되어 있습니다.(Low level trigger 방식)

모듈형 액티브 타입 부저

 

4.  라즈베리파이+부저 연결도 (실습을 위한 연결 도면)


 기본적으로 아래처럼 라즈베리 Pi 포트 출력으로 직접 부저를 작동시키는 연결을 하면 됩니다. 

또는 아래와 같이 TR과 저항을 이용한 Low level trigger 방식의 연결을 하여도 됩니다.  
이때, 사용한 TR은 PNP 타입의 A1015 품번을 사용했습니다. PNP타입의 다른 품번을 사용해도 되며, 이때는 ECB의 핀 배열이 다를 수도 있으니, 해당 TR의 스펙을 확인해 보세요.

 

또한 아래처럼, TR과 저항이 내장되어 모듈화 된 부저 모듈을 사용하여 간편하게 연결할 수도 있습니다.



부저를 이용한 실습

  (실습 1) 부저 1회 울리기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가 1.5 동안 1회 울리고 종료됩니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
GPIO.setwarnings(False)
 
pwm = GPIO.PWM(buzzer, 262) # '262'는 음의 높이에 해당하는 특정 주파수
pwm.start(50.0)
time.sleep(1.5) # 1.5초간 음이 울리도록 시간지연
 
pwm.stop()
GPIO.cleanup()
cs

 

 (실습 2) 부저로 '도, 레, 미' 음 3회 반복 울리기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가 1.0초 간격으로 도, 레, 미 음을 3번 반복한 후 종료됩니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
GPIO.setwarnings(False)
 
pwm = GPIO.PWM(buzzer, 1.0)  # 초기 주파수 설정을 1Hz로 함.
pwm.start(50.0)
 
for cnt in range(0,3):
    pwm.ChangeFrequency(262)   # 262는 4옥타브의 '도'에 해당되는 주파수 
    time.sleep(1.0)
    pwm.ChangeFrequency(294)   # 294는 4옥타브의 '레'에 해당되는 주파수 
    time.sleep(1.0)
    pwm.ChangeFrequency(330)   # 330은 4옥타브의 '미'에 해당되는 주파수 
    time.sleep(1.0)
 
pwm.ChangeDutyCycle(0.0)
 
pwm.stop()
GPIO.cleanup()
 
 
cs

 

 (실습 3) 부저로 '도레미파솔라시도' 음계 출력하기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가 4옥타브 영역의 주파수인 '도, 레, 미, 파, 솔, 라, 시, 도' 음을 출력한 후 종료됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
 
pwm = GPIO.PWM(buzzer, 1.0)   # 초기 주파수를 1Hz로 설정
pwm.start(50.0)               # 듀티비를 50%로 설정
 
scale = [262294330349392440494523]
 
for i in range(0,8):
    pwm.ChangeFrequency(scale[i])
    time.sleep(1.0)
 
pwm.stop()
GPIO.cleanup()
 
cs

 

(실습 4) 부저로 '도-레-미-파-솔-라-시- 도 -시-라-솔-파-미-레-도' 음계 출력하기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가  '도, 레, 미, 파, 솔, 라, 시, 도' 음을 올리고 다시 내리는 형태로 출력합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
 
pwm = GPIO.PWM(buzzer, 1.0)   # 초기 주파수를 1Hz로 설정
pwm.start(50.0)               # 듀티비를 50%로 설정
# 4옥타브 주파수 : 도(262)/레(294)/미(330)/파(349)/솔(392)/라(440)/시(494)/도(523)  
scale = [262294330349392440494523]
 
for i in range(0,8):
    pwm.ChangeFrequency(scale[i])
    time.sleep(1.0)
 
 
for i in range(7,-1,-1):
    pwm.ChangeFrequency(scale[i])
    time.sleep(1.0)
    
pwm.stop()
GPIO.cleanup()
 
cs

 

(실습 5) 부저로 '반짝반짝 작은 별' 동요를 출력해 봅니다.

 : 아래 코드를 작성하여 멜로디를 출력해 보세요.
부저가  '반짝 반짝 작은별' 계이름을 울리고 종료하도록 합니다. 
아래,  '작은 별' 악보를 참고하세요.  실습을 이해한 후, 다른 곡도 코딩하여 연습해 보세요.

작은 별 악보
작은 별 계이름
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
 
pwm = GPIO.PWM(buzzer, 1.0# 초기 주파수를 1Hz로 설정
pwm.start(90.0) # 듀티비를 90%로 높여 설정함(음 구분이 더 잘되고 조금 더 부드럽게 들림)
 
# == 동요 : 반짝 반짝 작은별 계이름 ==
#도도솔솔라라솔파파미미레레도 솔솔파파미미레 솔솔파파미미레 도도솔솔라라솔파파미미레레도
 
# 4옥타브:도(1)/ 레(2)/ 미(3)/ 파(4)/ 솔(5)/ 라(6) / 시(7)  
scale = [ 262 , 294  , 330 ,  349 , 392 ,  440 ,   494 ]
twinkle = [ 11556654433221, \
            55443325544332, \
            11556654433221 ]
try :
    for i in range(0,42):
        pwm.ChangeFrequency(scale[twinkle[i]])
        if i==6 or i==13 or i==20 or i==27 or i==34 or i==41:
            time.sleep(1.0)   # 2분음표 부분을 모두 1초로 출력
        else :
            time.sleep(0.5)   # 기타 4분음표는 모두 0.5초로 출력함 
    pwm.stop()
 
finally :
    GPIO.cleanup()
 
cs

 

자, 어떠신가요?   비록 단순 부저여서 음질이 좋지는 못하지만, 음 고유의 주파수를 이용하여 동요나 가요의 멜로디를 얼마든지 연주할 수 있습니다.

그럼, 아래 전체 과정을 담은 동영상을 함께 보면서 실습해 보세요. 

라즈베리파이에 부저 사용하기 영상으로 학습하기

 

반응형
반응형

라즈베리Pi#19윈도 PC에서 라즈베리 Pi 원격 제어하기

 안녕하세요~ 이번 시간에는 윈도 PC에서 라즈베리 Pi를 원격 제어해 보는 실습을 진행합니다.

라즈베리Pi에 네트워크가 연결되어 있다면, 모니터 연결 없이 원격으로 제어할 수 있고 연결된 회로를 동작시킬 수 있습니다.
리눅스(라즈비안) 터미널에 접속하기 위한 Putty 프로그램을 먼저 설치하게 되며, 원격제어를 위해 서로 다른 OS 시스템인,  윈도↔라즈비안의 파일 시스템을 연결해주는 Samba Server 설치를 진행합니다.
아울러, 지난 시간 실습한 LED 밝기 조절 예제로 테스트를 해 보겠습니다.

※  본 계시 글의 모든 이미지는 클릭하면 선명한 이미지로 확대하여 볼 수 있습니다. 

 먼저, 라즈베리Pi에 초기 설정이 필요한데요, 모니터를 연결하고 부팅해 주세요. 
외부에서 라즈베리 Pi로 접속할 수 있도록, 'SSH' 통신 채널을 오픈해 주어야 합니다.

 라즈베리파이 라즈 비안 OS의 상단 메뉴에서 Preferences 》'Raspberry Pi Configuration'를 실행합니다.
Interfaces 탭에서 'SSH' 부분을 Enabled로 체크 후, 'OK'를 누르고 재부팅합니다.
그리고 현재 '라즈베리 Pi'가 접속한 IP주소를 확인해야 하는데요,


여기서 중요한 것은 라즈베리 Pi의 주소가 외부에서 접속이 되는 공인 IP의 경우는 문제없지만, 대부분의 경우 라우터에서 할당받은 사설 IP인 경우이므로,  원격 접속하려는 PC는 라즈베리 Pi와 동일한 내부망으로 접속해야 합니다.

또한, 일반적인 WiFi 공유기의 경우 WiFi 접속과 LAN선 접속을 함께 제공하는데요, 예를 들어 라즈베리 Pi는 WiFi에 접속되어 있고, LAN선으로 연결된 Pc에서의 접속은 가능합니다. (같은 내부망이라면, wifi ↔ wifi  ,  LAN ↔ LAN 모두 가능합니다)  대부분의 WiFi 공유기는 WiFi 망과 LAN선망이 같은 IP대역의 내부망으로 할당되기 때문입니다.

먼저 검색 엔진에 접속해서 'Putty'로 검색합니다.  그리고  Download 페이지를 클릭하세요.

Putty 프로그램이란?  

 


'here' 여기를 클릭하세요

 

설치하려는 운영체제에 맞는 버전을 선택합니다. 여기서는 'Windows,64bit'를 선택합니다.

다운로드한 파일을 클릭해서 설치해 주세요.

 Next를 눌러 계속 설치해주세요.  설치에 별다른 어려움 없을 거예요. 


그럼, 설치된 Putty를 실행하세요.

위 이미지의 붉은 네모 부분에 라즈베리 Pi가 할당받은 IP 주소를 입력해야 합니다.  
접속 포트는 '22' 기본 설정으로 두고,  SSH로 체크하세요.

(아래 이미지) 'Default Settings'을 선택하고 Save를 누르고 'Open' 버튼을 클릭하세요. 


(아래 이미지) 만약 Open을 눌렀는데, 이런 보안 경고창이 뜬다면, Yes를 눌러 주셔야 합니다.


아래 이미지와 같은 창이 떴을 때, 
라즈베리 Pi의 계정-비번을 건드리지 않았다면, 로그인 ID는 : pi , 비번은 : raspberry (모두 소문자)

로그인 ID와 패스워드는 아래 이미지를 참고하세요.

※ 만약! 여기 처럼 로그인 메뉴가 뜨지 않는 다면,  접속하려는 라즈베리파이가 외부에서 접속이 가능한 공인IP 인지?  혹은 공인IP에 링크된(포트포워딩 같은) IP 인지? 확인해 보세요.         
하지만  사설 IP에 연결 된 라즈베리파이라도, 동일한 라우터(네트웍, WiFi 공유기)에 접속된 기기일 경우 접속이 가능합니다. 

 

현재, 라즈베리 Pi 파일 시스템에 로그인된 상태이며, 간단한 리눅스 명령어를 입력해서 테스트해 보세요. 
- ls        : 현재 폴더 내의 리스트  ,  
- pwd    : 현재 작업 중인 디렉터리 경로 표시 , 
- mkdir  : 디렉토리 만들기   
- cd      : 디렉토리 바꾸기 (폴더 이동) 
- cd..     : 상위 디렉터리로 이동     
- clear   : 현재 화면 지우기

그럼, 삼바 서버를 설치해볼 텐데요, 

우선, 화면의 명령어로 apt 설치 프로그램 관리자 DB를 먼저 업데이트해주세요. 

DB 업데이트


업데이트되었다면, 지금 보이는 아래의 명령어로 삼바 프로그램을 설치해 주세요. 

삼바 프로그램 설치


아래 이미지처럼,  'Yes / No'를 묻는 창이 나온다면, 모두 'Yes'를 선택해 주세요.

Tab키나 화살표키로&nbsp; Yes를 선택하세요

마우스로는 선택이 안되며, 키보드 '← →' 키 혹은, <Tab> 키로 '<예>'를 선택할 수 있습니다.

삼바 서버 설치 모습

설치 완료 후에는, 아래의 명령어로, 삼바가 정상적으로 설치되었는지 확인할 수 있습니다

삼바 서버 설치 확인 명령어

 ' | ' 기호는 키보드 역슬래시 ' \ ' 또는 '₩' 키와 함께 있는 키에 있습니다.
네, 현재의 화면과 같이 나온다면, 설치가 잘 된 것입니다.

모든 이미지를 클릭하면 확대됩니다~

다음 명령어로 네트워크 연결 상태를 확인해 봅니다.

삼바 서버 네트워크 상태 확인 명령어

 

삼바 네트웍 설치 확인 명령어

라즈베리 Pi의 IP 주소가 보이고, 삼바 서버가 사용하는 445번 포트 번호도 보입니다.
이제 설치된 삼바 서버의 설정만 해주면 됩니다.
이제 , 라즈베리 pi 사용자의 파일 시스템을 윈도에서 접속할 수 있도록 설정합니다.
아래의 명령어를 입력하세요.

pi에 사용자 추가하는 명령어(nano 에디터 사용)

간단한 리눅스용 에디터인 'nano'를 가지고, 삼바 설정 파일에 pi 사용자를 추가해 주는 과정입니다.

위 이미지처럼, 설정 파일 문서가 열리면 커서의 위치를 잘 확인하면서 Page Down 키나 ↓화살표 키로 제일 아래 까지 내려옵니다.  그리고, [pi] 라고 되어 있는 6줄가량을 입력하세요. 
입력이 완료되었다면, 'Ctrl+X'를 눌러 저장할지를 물을 때, 'y'를 입력하고, 엔터키를 치세요. 
엔터키 이외의 다른 키를 잘못 누르거나 하면, 내용 수정이 안 되는 등의 오류가 생길 수 있으니 설명대로 해보세요.
추후에 로그인 접속 문제가 있다면, 방금 작업한 내용의 입력 내용에 오타가 없는지? 이 부분을 다시 살펴보세요.

그리고, 추가한 사용자에게 아래 이미지처럼, 공유 폴더 접근 가능한 비번을 부여해 줍니다.
비번은 기억하기 쉽도록 우선 'raspberry'로 할게요.  

사용자 추가시 등록한 아이디(pi)에 대한 비번(raspberry)예시

비번은 확인 비번까지, 두 번 입력하게 되고, 입력하는 과정이 화면에 표시되지 않으니, 당황하지 말고, 입력 후 엔터를 해주면 됩니다. 

비번 입력표시는 되지 않으니 참고하세요


 추후에 다른 사용자 추가도 이런 형태로 추가해 주면 됩니다.
이제 삼바 서버 설치와 모든 설정은 끝났습니다.
그럼, 이제 설정한 파일이 적용되려면, 다음 명령어로 삼바를 재 실행해야 합니다.

그럼, 같은 내부망으로 연결된 윈도 PC에서 네트워크로 접속해 볼게요.
아래 이미지는, 삼바 서버를 재시작했을 때, 표시되는 화면이며, 윈도 탐색 창으로 접속이 가능한 상태가 됩니다.
그리고서 윈도 실행창을 열어(윈도키 + R키), 라즈베리 pi의 ip 주소를 입력하는 모습입니다. 

 

아래처럼, 윈도 탐색 창이 열리면,  pi 드라이브를 클릭하고 열린 창에 추가해 주었던, 사용자 id와 패스워드를 입력해 줍니다.

이때, '내 자격 증명 기억'에 체크를 해 두면, 다음번에 패스워드를 다시 입력하지 않아도 됩니다.

네, 아래 이미지처럼, 라즈베리 pi에서 보았던, 폴더와 파일 목록이 그대로 뜨는 것을 볼 수 있습니다.

pi의 네트워크 드라이브를 윈도 탐색창으로 접속된 모습

그럼 여기서 잠시, NotePad++을 설치해 볼게요.  
notepad++은 윈도 기본 프로그램인 notepad처럼 가볍고, 가볍게 코딩하거나 편집하기에 정말 좋은 프로그램인데요,
화면처럼 검색해서 운영체제에 맞는 버전으로 다운로드해 설치하면 됩니다.  

노트패드++ 검색하여 설치하기

노트패드++은 코딩 전문 툴은 아니지만, 코드를 비교 분석할 수 있고, 가볍게 코딩하거나 편집하기에 정말 좋은 프로그램인데요, 아래 이미지처럼 검색해서 운영체제에 맞는 버전으로 다운로드해 설치하면 됩니다.

아래 이미지처럼, 노트패드++을 실행해주세요. 

실행시켜 보면 위 모습처럼 뜨며, 첫 화면에 뜬 change.log의 x를 눌러 닫고 새 파일을 작성하면 됩니다.
테스트를 위해 간단히, print("Hello Raspberry pi World")로 작성해보세요.

 작성한 파일을 'piWork'폴더나 적당한 곳에 'hello.py'이름으로 저장합니다.
그럼, 다시, 라즈베리 pi 접속창으로 가서, 방금 작성한 파일을 실행시켜 볼게요.
먼저, 파일을 저장한 경로로 이동합니다.

현재 라즈베리에 pi에는 파이썬 2.x대 버전과 3.x대 버전이 설치되어 있을 텐데요, 각각의 버전을 아래 이미지처럼, 확인할 수 있습니다.

위 이미지처럼, 각각의 버전으로 작성한 코드를 테스트해 보세요.
〔 2.x대 버전은 'python...'으로, 3.x대 버전은 'python3...'로 코드 실행합니다.〕

자, 이제 끝으로, 라즈베리 pi를 직접적으로 컨트롤할 수 있도록, 원격 데스크톱 연결을 해볼게요.
아래 이미지의 명령어를 입력하여, xrdp라는 프로그램을 설치해 주세요.

xrdp는 원격 접속할 때 그래픽 형태의 로그인을 지원하는 프로그램입니다.

설치가 되었다면, 윈도 검색에서 '원격 데스크톱 연결'을 검색하여 실행하세요.

위 이미지처럼, 컴퓨터 항목에, 라즈베리 pi 이름을 입력하고, 연결을 클릭하세요.
그리고, 아래와 같은 질문 창이 뜨면 (예)'(예) Y'를 클릭합니다.


그러면, 잠시 후에 아래와 같은 라즈베리 pi이 접속된 원격 데스크톱 화면이 뜨게 됩니다. 
그리고서,  좀 전에 pi 사용자로 추가해 주었던, id와 패스워드를 입력합니다.

드디어, '윈도 PC'에서 '라즈베리 pi 데스크톱 화면'이 열렸습니다   - 짝짝짝!!! - 

 SSH 관련 경고창은 닫아 주면 됩니다. 추후에 필요한 경우, Raspberri pi의 관리자 비번을 변경하면 경고창은 없어집니다.  다만, 변경 후 비번을 잘 기억해 두지 않으면, 시스템 접속이 불가할 수 있으니,  중요한 파일을 다루거나 하지 않거나, 학습용으로 사용한다면, 변경 없이 사용해도 될 것 같습니다. 

그럼, 라즈베리파이에 직접 로그인하지 않고, 이렇게 원격으로 접속된 상태에서의 파이썬 코드가 잘 실행이 되는지, 
아래처럼, 간단히 확인해 보세요. 

네, hello.py 코드 실행이 잘 되네요. 
그럼, 끝으로, 아래 이미지처럼, 지난 시간 라즈베리 pi에서 직접 pwm 예제를 실행했던 python IDE를 열어보겠습니다. 

Thonny Python IDE를 열고서,  지난 시간 PWM 회로에 사용한 코드나,  혹은 다른 코드를 올려서 라즈베리파이에 연결된 회로를 작동시켜 보세요. 

Run을 눌러 실행시켜 보면, 잘 작동하는 것을 볼 수 있습니다. 
중요한 것은,  지금 이 상황은, (멀리서?) 원격으로 라즈베리파이에 연결된 회로를 동작시킨 상황입니다.  
그래서, 이번 실습을 통해, 라즈베리 pi에 별도로 모니터 연결을 하지 않고, pi와 회로를 제어할 수 있으며,
또한,  라즈베리 pi를 이용해, NAS 서버나, 네트워크 드라이브 저장소와 같은 기능을 구축할 수 있습니다.
그럼, 다음 실습도 기대해 주세요.  감사합니다~

《 전 과정 영상으로 보기 》

 

반응형
반응형

라즈베리Pi#18HardWare PWM 사용하기!  with LED

『 선수학습 』
▶ 라즈베리Pi에 라즈비안 OS설치와 세팅, 그리고 PWM이전 기초실습 :
 【 라즈베리파이 】#01 라즈베리파이 설치하기   #01~#07까지 라즈비안OS 설치와 한글화 설정 등이 있습니다.
  
→  【 라즈베리파이 】#09 RaspberryPi 실습 ①   
→  【 라즈베리파이 】#10 RaspberryPi 실습 ②  
→  【 라즈베리파이 】#11 RaspberryPi GPIO   
→  【 라즈베리파이 】 #12 LED On Off 실습 with Switch   
→  【 라즈베리파이 】 #13 LED Fade In Out 실습 (소프트웨어 PWM) 
→  【 라즈베리파이 】 #14 타이밍 차트 활용한 LED 실습   
→  【 라즈베리파이 】 #15 LED SOS 신호와 동기신호 실습  
→  【 라즈베리파이 】 #16 State Diagram 구현 실습 
→  【 라즈베리파이 】 #17 4LED 순차 점멸 with Timing chart  

-------------------------------------------------------------------------------------------------------------------

안녕하세요~
라즈이노 IoT입니다.
라즈베리파이 베이직 학습 시리즈로 "하드웨어 PWM 사용하기"편을 준비해 봤습니다.

PWM은 디지털 출력을 가지고 아날로그처럼 동작할 수 있도록 해주는 기능이라고 보시면 되는데요,
(PWM : Pulse Width Modulation )
이번 실습에서 PWM 기능은 Led를 점점 밝게 또는 점점 어둡게 컨트롤해봄으로써 테스트해 볼 수 있습니다.

PWM 회로 연결은 아래와 같습니다.

LED는 연결할 때 + - 구분을 해주어야 합니다.

LED +- 극성구분

소프트웨어적인 PWM 기능은 입출력으로 사용되는 GPIO핀 어떤 핀이든 사용 가능한데요, 하지만 CPU에 과부하가 걸릴 수 있고 정밀 타이밍 제어가 필요한 곳에서는 오류가 날 수 있기에, 하드웨어적으로 동작하는 PWM 기능을 이용하게 되며, 그 핀은 정해져 있습니다.

화면 이미지에서 GPIO 18, 12번이 PWM0 로 사용되고, 13번 19번이 PWM1 채널로 사용됩니다.
채널별로 연동되기 때문에, 개별로 동작시킬 수 있는 핀은 실질적으로 두 개로 보시면 됩니다.
하드웨어 PWM기능은 오디오 출력 시에도 사용되기 때문에 동시에 사용할 수 없음을 주의하세요.

《주의 사항!》
1. GPIO 핀 출력 신호의 최대 전압은 3.3v이며,  각 핀당 약 18mA로 제한하며, 가급적 핀 전체 출력 전류가 50mA를 넘지 않도록 주의해 주세요. ( 전류값은 옴의 법칙인 I=V/R 으로 간단히 계산해 볼 수 있으며, 제한 값은 보드에 공급되는 전원과 소모 전력에 따라 달라질 수 있어요.)
2. 헤더 핀의 대부분은 Broadcom 메인 칩으로 직접 연결되어 있기 때문에, 잘못된 연결로 인하여 라즈베리 Pi를 영구적으로 손상시킬 수 있으니, 연결에 주의해 주세요!

실습에 사용된 환경과 준비 사항입니다

LED를 보호하는 저항 값은 220Ω~470Ω사잇값 중에 가지고 있는 것을 사용하면 됩니다.
영상에서는 라즈베리 Pi의 라즈비안 OS에서 직접 코드를 동작시키게 됩니다. 
다음번 영상에서는 윈도 PC에서 원격으로 접속하여 동작시켜 보겠습니다.

아래는 회로 동작에 사용한 파이썬 코드입니다.

《 회로 실행용 파이썬 코드 》

코딩에 사용된 프로그램은,  라즈베리 Pi 라즈비안OS에 기본 설치된 Thonny Python IDE 프로그램입니다. 
아래 이미지처럼, 실행과 디버그, Shell창이 함께 구성되어 있습니다. 

 동작 방식에는 몇 가지 있는데요, 여기서는 비교적 코드가 간단하고 이해하기 쉬운 RPi.GPIO라이브러리 모듈의 PWM 명령어를 사용했습니다.


LED의 밝기는 아래 이미지처럼, 출력 신호의 High와 Low신호의 비율(Duty Rate)로 결정됩니다.


ChangeDutyCycle(듀티비%) 함수로 0~100%의 값을 직접 입력해 넣어 주면 조절할 수 있습니다.

그리고, PWM 파형에는 주파수의 개념이 들어가는데요, 
주파수(Frequance)라는 것은 PWM 1주기의 신호가 1초에 몇 번 반복되는지를 의미합니다.

좌측 이미지처럼 1초에 1회 반복되면 1Hz라 하며, 우측 이미지처럼 1초에 3번 반복되는 형태이면 3Hz라 합니다.
만약 1초에 100번 반복되면 100Hz, 1000번 반복이면 1KHz(1000Hz)가 됩니다.
PWM 신호의 주파수는 LED에서는 신호의 깜빡임으로 나타나게 되며,  주파수가 낮으면 깜빡임이 확연하게 보이며, 주파수가 높으면 밝기 조절 때 더 자연스럽게 보입니다. 
다만, 사람의 눈은 잔상효과로 인하여 주파수가 낮더라도 깜빡임이 없는 것처럼 보일 수 있는데요, 디지털 눈인 카메라로 보면 그 차이를 쉽게 확인할 수 있습니다. 
(아래는 이미지여서 실제 깜빡 임의 차이는  맨 아래 전체 영상에서 확인 가능합니다.)


그럼 위 코드를 입력하고 Python IDE를 실행시켜 라즈베리 Pi에 연결된 LED를 동작시켜 보세요. 
코드를 살펴보면,  듀티비 값은 for 문에 의해 0~100% 증가/감소를 반복하며 밝기 조절이 되고 있습니다.
그럼 time.sleep( )의 delay 값을 0.1초에서 0.01초로 바꾸어 보면, 더 빠르게 Faid In / Faid Out이 되는 것을 볼 수 있습니다. 
주파수의 경우도, 주파수가 낮을수록 깜빡임이 심해지고, 일정 주파수가 이상 되면 깜빡임이 없는 자연스러운 Faid In/Out을 볼 수 있는데요,  옵션 값을  1000Hz, 100 Hz, 50Hz, 10Hz  이렇게 단계적으로 바꾸어 가며 실습해 보세요. 
특히 핸드폰 카메라 렌즈로 확인해 보면, 더 명확히 느끼실 수 있습니다. 

다음 영상에서는 라즈베리 Pi에 모니터를 연결하지 않고, 윈도 PC에서 원격 접속을 통해 라즈베리 Pi에 연결된 회로를 작동시켜 보는 실습을 진행합니다. 
라즈베리Pi에 라즈비안 OS설치와 세팅, 그리고 PWM이전 기초실습도 여기 블로그 【라즈베리파이 기초】 카테고리에 있으니, 필요하신 분은 함께 보면 도움이 되실 듯합니다. 

▶ 실습 전 과정 영상으로 학습하기

 

반응형
반응형

【라즈베리파이 화면 해상도 설정

 

 라즈베리파이를 처음 설치하게 되면 화면사이즈가 모니터에 꽉차지 않고 모니터 크기(해상도) 보다 조금 작게 나타납니다.  이럴때는 HDMI 설정과 관련한 옵션파일을 열어 강제로 지정해주면 간단히 해결 됩니다. 

 

▶ 해상도 강제 지정하기

 

1. 나노 에디터를 이용하여, 아래와 같은 명령어로 부팅환경 설정 파일을 파일을 열어 봅니다. 

: ~$  sudo nano /boot/config.txt     

 

2. 에디터에서 중간쯤에 아래와 같은 문장이 있어요. 

# uncomment to force a specific HDMI mode (this will force VGA) 

# hdmi_group=1

# hdmi_mode=1

 

3. 이것을 일반적으로 22인치 이상 모니터에 많이 사용하는 1920*1080(16:9) 1080p 해상도로 할 경우에는 아래 숫자로 바꾸어 주면 됩니다. 

# uncomment to force a specific HDMI mode (this will force VGA) 

hdmi_group=2

hdmi_mode=82

수정후에는 Ctrl + X ,   저장할까요?  --> Y  엔터    

저장하고 빠져 나온 후,   재부팅 한다.  ( : ~$  sudo reboot )

 

4. 기타 그외에 다른 해상도는 아래를 참고해주세요~

( 여기에서 주의해야 할 것은 ,  자신의 모니터가 지원되지 않는 해상도로 변경해서 재부팅하면 화면이 보여지지 않는 경우가 생기게 되고,  설정값을 원래대로 다시 돌려 놓을 수 없는 상황이 생깁니다.  그렇게 되면, 다른 모니터나 TV 등에 연결해서 볼 수 있는 상태를 찾아다녀서 복구시키거나,  방법이 없는 경우는 운영체제를 다시 설치해야 되는 경우도 발생 할 수 있으니 잘 확인 후 변경하시길 바랍니다.  ^^;;  )  

- hdmi_group

아래값은 HDMI 출력 그룹이 CEA(Consumer Electronics Association, TV에서 일반적으로 사용되는 표준)인지 DMT(Display Monitor Timings, 모니터에서 일반적으로 사용되는 표준)인지를 정합니다. 이 설정은 hdmi_mode와 함께 사용됩니다.

hdmi_group결과

0 EDID로부터 자동 감지
1 CEA
2 DMT

- hdmi_mode

아래 값들은 hdmi_group=2(DMT)인 경우에 유효합니다. (TV용이 아닌 디지털 모니터용에 대한 설정 값들입니다)

 

hdmi_mode해상도주파수비고

1 640x350 85Hz
2 640x400 85Hz
3 720x400 85Hz
4 640x480 60Hz
5 640x480 72Hz
6 640x480 75Hz
7 640x480 85Hz
8 800x600 56Hz
9 800x600 60Hz
10 800x600 72Hz
11 800x600 75Hz
12 800x600 85Hz
13 800x600 120Hz
14 848x480 60Hz
15 1024x768 43Hz Raspberry Pi와 호환되지 않음
16 1024x768 60Hz
17 1024x768 70Hz
18 1024x768 75Hz
19 1024x768 85Hz
20 1024x768 120Hz
21 1152x864 75Hz
22 1280x768 블랭킹 감소
23 1280x768 60Hz
24 1280x768 75Hz
25 1280x768 85Hz
26 1280x768 120Hz 블랭킹 감소
27 1280x800 블랭킹 감소
28 1280x800 60Hz
29 1280x800 75Hz
30 1280x800 85Hz
31 1280x800 120Hz 블랭킹 감소
32 1280x960 60Hz
33 1280x960 85Hz
34 1280x960 120Hz 블랭킹 감소
35 1280x1024 60Hz
36 1280x1024 75Hz
37 1280x1024 85Hz
38 1280x1024 120Hz 블랭킹 감소
39 1360x768 60Hz
40 1360x768 120Hz 블랭킹 감소
41 1400x1050 블랭킹 감소
42 1400x1050 60Hz
43 1400x1050 75Hz
44 1400x1050 85Hz
45 1400x1050 120Hz 블랭킹 감소
46 1440x900 블랭킹 감소
47 1440x900 60Hz
48 1440x900 75Hz
49 1440x900 85Hz
50 1440x900 120Hz 블랭킹 감소
51 1600x1200 60Hz
52 1600x1200 65Hz
53 1600x1200 70Hz
54 1600x1200 75Hz
55 1600x1200 85Hz
56 1600x1200 120Hz 블랭킹 감소
57 1680x1050 블랭킹 감소
58 1680x1050 60Hz
59 1680x1050 75Hz
60 1680x1050 85Hz
61 1680x1050 120Hz 블랭킹 감소
62 1792x1344 60Hz
63 1792x1344 75Hz
64 1792x1344 120Hz 블랭킹 감소
65 1856x1392 60Hz
66 1856x1392 75Hz
67 1856x1392 120Hz 블랭킹 감소
68 1920x1200 블랭킹 감소
69 1920x1200 60Hz
70 1920x1200 75Hz
71 1920x1200 85Hz
72 1920x1200 120Hz 블랭킹 감소
73 1920x1440 60Hz
74 1920x1440 75Hz
75 1920x1440 120Hz 블랭킹 감소
76 2560x1600 블랭킹 감소
77 2560x1600 60Hz
78 2560x1600 75Hz
79 2560x1600 85Hz
80 2560x1600 120Hz 블랭킹 감소
81 1366x768 60Hz
82 1920x1080 60Hz 1080p
83 1600x900 블랭킹 감소
84 2048x1152 블랭킹 감소
85 1280x720 60Hz 720p
86 1366x768 블랭킹 감소

 

- 위 설정값들은 RasberryPi WiKi를 참고 하였습니다. 

 ( https://wikidocs.net/7826 )

 

감사합니다. 

오늘 하루도 행복하세요! ~

 

반응형
반응형

【 라즈베리파이】 Raspberry Pi ↔ windows , 간편한 파일 전송 프로그램 WinSCP 설치 & 셋업

 

라즈베리파이와 윈도우 시스템 사이에서 파일을 주고 받을 일이 생기는데, 이 때 설치와 사용이 간편한 WinSCP에 대해 소개하고자 합니다.

FTP 접속 WinScp은  오픈소스(무료) 이면서 , 파일 전송을 위해 최근 많이 사용되고 있고, 사용법도 어렵지 않습니다. 

 

우선, 아래 사이트로 이동합니다.

https://winscp.net/eng/download.php

- 위 화면에서 DOWNLOAD WINSCP 5.15...xxx (9.4 MB) 버전을 다운 받는다.

- 단, 이 때 설치가 필요 없는 포터블 버전을 받고자 한다면 , 오른쪽에 있는  OTHER DOWNLOADS를 클릭하면,

아래와 같은 포터블 다운로드 화면이 나온다.

 

- 여기서는 설치 버전으로 직접 설치해서 프로그램 사용법에 대해 설명하겠습니다.

아래와 같은 다운받은 파일을 실행해 주세요~

- 그런데, 막상 설치를 진행 하려고 하면 아래와 같은 경고 메시지를 보여줍니다.

 그럼, 당황하지 말고, 화면 중간에 있는 추가 정보 를 클릭해 줍니다.

- 그러면 아래처럼 실행 버튼이 나오게 됩니다.

- 실행을 눌러 설치를 진행합니다.

 

- 아래 화면에서, 파일을 복사해서 주고 받을 때에는 전통적인 FTP 스타일이 편하므로, 컴맨더(C)를 선택하는 것을 추천합니다.

- 설치가 완료되면 아래와 같은 완료 화면을 보실 수 있습니다.

- 완료를 누르고 바탕화면에 있는 WinSCP 아이콘을 실행시킵니다.

- 그럼 아래와 같은 화면이 나타납니다. 

- 그럼 접속 하려는 라즈베리파이의 IP 주소를 아래처럼 입력해줍니다.  (접속할 포트 번호는 디폴트 값으로 22 입니다)

- 사용자 이름은 특별히 변경하지 않았으면, 소문자료  ' pi ' 이며 ,  비번도 ' raspberry ' 로 하면 됩니다.  만약 접속이 안 된다면, ID 와 비번을 바꾼 경우 이니 확인해야 합니다.  그리고, 접속하려는 라즈베리파이에 인터넷 연결이 제대로 되어 있는지 확인하면 됩니다. 

 

- 그런데 이때 ,  User name과 Password 는 일치하나 다른 문제로 접속이 안되는 문제가 발생할 거예요. 

- 라즈베리파이와는 원격 접속형태로 이루어 지는데, 이때 사용되는 암호와된 접속 방식이 바로 SSH(Secure SHell) 입니다.   다만, 라즈베리파이의 기본 설정 상태는 접속 할 수 없는 Disable 상태로 되어 있어요.   따라서 이 설정을 Enable로 변경해주면 접속이 잘 됩니다. 

 

 그럼, 라즈베리파이의 주 메뉴중에어 아래에 표시한 'Raspberry Pi Configuration ' 을 클릭하여 들어 갑니다. 

[ 메뉴 ≫ 기본 설정 ≫ Raspberry Pi Configuration ]

 

- 그럼 아래와 같은 설정 메뉴가 뜨면 두 번째 탭에서 SSH 설정 부분의 Enable 영역에 클릭해 주고 OK 를 누르면 됩니다. 

그리고 재부팅해주고, 윈도우의 WinSCP 프로그램에서 다시 접속 시도해보면 접속이 잘 될 거예요.  

 

 

- 호스트 접속에 성공했다면, 맨처음 접속시에는 아래와 같은 메시지가 뜨는데, '예'를 눌러 주면 이후로는 뜨지 않습니다.

 

- 여기서 만약 라즈베리파이의 IP 주소를 바로 알고 싶다면, 라즈베리파이 화면 우측 상단에  인터넷(또는 WiFi) 연결 모양에 마우스 커서를 가져다 대면 IP 주소를 바로 볼 수 있어요.  저의 경우는 일반 랜선과 WiFi 둘 다 동시에 접속되어 있는 경우 입니다. 

- 접속이 제대로 이루어 지면 아래 처럼 윈도우 PC 탐색창 화면과,  라즈베리파이 PC 탐색창 화면으로 각각 나뉘어진 창을 볼 수 있습니다.   ( 라즈베리파이 첫 화면 위치는 ' /home/pi/ '  )

 

- 그러면 원하는 파일들을 선택해서 끓어다 놓으면 복사가 됩니다.  폴더 지정과 생성도 가능하며, 삭제 또한 자유자제로 가능합니다.  접속한 라즈베리파이에서도 파일의 복사와 삭제 또한 가능합니다. 

 

만약, 파일을 분명히 복사 해 넣었는데, 탐색창에 보이지 않는 다면,   이는 FTP와 같은 접속 툴 방식의 특성인데, 이럴 때는 상단 메뉴 중 아래와 같은 새로고침 버튼을 클릭하면 보일 거예요. 

 

 그럼 즐겁게 라즈베리파이 공부하세요~

반응형
반응형

【 라즈베리파이 】 #17 4LED 순차 점멸 with Timing chart

 지난시간 2개의 LED를 이용해서 타이밍 차트에 따라 반복 점멸을 하도록 만들어 보았다. 이번에는 4개의 LED이용할 것이며, 타이밍 차트 대로 순차로 점멸하되, 총 10회만 반복하도록 프로그래밍 해보자. 


▶ 선수 학습 :

 

  1. (기초#16State Diagram 구현 실습 (타이밍 차트 참고 강좌클릭


▶ 회로 구성 : 

( 이미지를 클릭하면 크게 확대 됩니다)



▶ 개요 

  GPIO의 출력을 순서대로 제어 해보는 실습으로,  파이썬의 while 구문을 함께 연습해 볼 수 있다.  아래 이미지는 스테이트 다이어그램(State Diagram)으로 동작의 순서를 도식화 해서 이를 다시 프로그래밍으로 구현해 보는 연습을 통해 정확한 동작의 구현을 기대할 수 있다. 



(아래 이미지를 클릭해서 보면 눈금등을 더 선명하게 보실 수 있어요) 



▶ 실습절차 

 저항과 LED를 준비하고 위 회로도와 같이 연결한다. 
(저항은 LED가 보호되면서 적당량의 밝기를 가질 수 있도록 용량값을 선택하는데, 통상적으로 100
Ω~470Ω 사이값으로 준비하면 실험을 위한 짧은 실습에는 크게 문제가 없다)

  

- LED1 → GPIO 18번 핀 연결  / LED2 → GPIO 23번 핀 연결

- LED3 → GPIO 24번 핀 연결  / LED4 → GPIO 25번 핀 연결

(LED 극성에 주의 : 리드선이 긴 쪽이 '+'  ,  짧은 쪽이 '-' 이다)


1. 부품 : 220Ω x 4 ,  LED x 4




▶ 파이썬 코드 


라즈베리파이에서 파이선을 실행시킨다. 

메뉴에서 새파일을 선택하고 아래와 같이 작성 저장후 실행시킨다.(F5)




▶ 코드설명 

4개의 LED가 순차적으로 반복 실행

-타이밍 차트에서 한 눈금당 0.2초 씩 계산함.
-L1High 신호 : 0.8초 동안 On
-L2High 신호 : L1신호 시작부터 0.4Delay 0.8초 동안 On
-L3High 신호 : L2신호 시작부터 0.4Delay 0.8초 동안 On
-L4High 신호 : L3신호 시작부터 0.4Delay 0.8초 동안 On
-L1High 신호 : L4신호 종료부터 1.2Delay 0.8초 동안 On

-이후 반복   (10회 반복)


-위 타이밍 차트를 분석해보면 패턴 L L L L의 패턴이 순서 대로 이어지고 있고, L4가 Off 된 이후 12개의 눈금(각0.2초 총 1.2초)

이후 다시 첫 L1으로 반복되는 것을 알 수 있다.  


- 총 10회를 반복하도록 while 구문에 조건을 주어야 한다. 

- ' no += 0.1 ' 은   'no = no + 0.1' 과 동일한 코드이다.

- State_1(0.4)  :  State_1() 함수를 호출하면서 delay 타임을 위한 인자값으로 0.4(초)를 전달하고 있다.   [ State_1(0.4)  ]



▶ 실행 결과 

( 영상을 전체보기로 크게 하여 보세요)



ED On Off 실습 with Python

반응형