- Bluetooth 통신에 필요한 패키지 설치 :
- Bluetooth를 통해 장치를 Raspberry Pi와 페어링 :
- 장난감 자동차 선택 :
- 회로도 및 설명 :
- Android 앱 BlueTerm을 사용하여 원격으로 자동차 제어 :
- Python 프로그래밍 :
Raspberry Pi는 인터넷을 통한 원활한 무선 통신 기능으로 인해 IoT 프로젝트에 매우 인기가 있습니다. Raspberry Pi 3에는 Wi-Fi 및 Bluetooth가 내장되어 있으며 Bluetooth는 매우 인기있는 무선 통신 프로토콜입니다. 오늘 우리는 Raspberry Pi 3 및 Bluetooth를 사용하여 원격 제어 자동차 를 만들 것입니다 . 여기서는 스마트 폰을 원격 제어로 사용하여 자동차를 제어 할 것입니다. 우리는 이전에 Arduino를 사용하여이 RC 자동차를 만들었습니다.
여기에서는 Bluetooth가 내장 된 Raspberry Pi 3를 사용하므로 외부 USB Bluetooth 동글을 사용할 필요가 없습니다. 여기에서는 무선 통신을 위해 RFCOMM Bluetooth 프로토콜을 사용합니다.
Python에서 Bluetooth 프로그래밍 은 소켓 프로그래밍 모델을 따르며 Bluetooth 장치 간의 통신은 RFCOMM 소켓을 통해 수행됩니다. RFCOMM (Radio Frequency Communication)은 에뮬레이트 된 RS-232 직렬 포트를 제공하고 직렬 포트 에뮬레이션이라고도하는 Bluetooth 프로토콜입니다. Bluetooth 직렬 포트 프로필은이 프로토콜을 기반으로합니다. RFCOMM은 광범위한 지원과 공개적으로 사용 가능한 API로 인해 Bluetooth 애플리케이션에서 매우 인기가 있습니다. L2CAP 프로토콜에 바인딩됩니다.
Raspberry Pi 2가있는 경우 외부 Bluetooth 동글 또는 Bluetooth 모듈 HC-06을 사용해야합니다. 이러한 외부 Bluetooth 장치를 사용하기위한 이전 프로젝트를 확인하십시오: Bluetooth 및 Raspberry Pi 제어 가전 제품을 통해 Android 앱을 사용하여 Raspberry Pi GPIO 제어.
Bluetooth 통신에 필요한 패키지 설치:
시작하기 전에 Raspberry Pi에서 Bluetooth 통신 을 설정하기 위한 일부 소프트웨어를 설치해야합니다. Raspberry Pi와 함께 준비된 Raspbian Jessie에 설치된 메모리 카드가 있어야합니다. Raspbian OS를 설치하고 Raspberry Pi를 시작하려면이 문서를 확인하십시오. 이제 먼저 아래 명령을 사용하여 Raspbian을 업데이트해야합니다.
sudo apt-get 업데이트 sudo apt-get 업그레이드
그런 다음 몇 가지 Bluetooth 관련 패키지를 설치해야합니다.
sudo apt-get 설치 블루투스 blueman bluez
그런 다음 Raspberry Pi를 재부팅합니다.
sudo 재부팅
BlueZ 는 오픈 소스 프로젝트이자 공식 Linux Bluetooth 프로토콜 스택입니다. 모든 핵심 Bluetooth 프로토콜을 지원하며 이제 공식 Linux 커널의 일부가됩니다.
Blueman 은 Bluetooth 장치를 관리하고 제어 할 수있는 데스크탑 인터페이스를 제공합니다.
마지막으로 Python 언어를 사용하여 RFCOMM을 통해 데이터를 보내고받을 수 있도록 Bluetooth 통신을위한 Python 라이브러리 가 필요 합니다.
sudo apt-get install python-bluetooth
Raspberry Pi 용 GPIO 지원 라이브러리도 설치합니다.
sudo apt-get install python-rpi.gpio
이제 Raspberry Pi에서 Bluetooth 통신에 필요한 패키지를 설치했습니다.
Bluetooth를 통해 장치를 Raspberry Pi와 페어링:
휴대폰과 같은 Bluetooth 장치를 Raspberry Pi와 페어링하는 것은 매우 쉽습니다. 여기에서 Android 스마트 폰을 Raspberry Pi와 페어링했습니다. 이전에 Pi에 BlueZ를 설치했는데, 이는 Bluetooth 장치를 관리하기 위해 "bluetoothctl" 이라는 명령 줄 유틸리티를 제공 합니다.
이제 아래 명령으로 bluetoothctl 유틸리티를 엽니 다.
sudo bluetoothctl
'help' 를 입력하여 bluetoothctl 유틸리티 의 모든 명령을 확인할 수 있습니다. 지금은 주어진 순서대로 아래 명령을 입력해야합니다.
# 전원 켜기 # 에이전트 켜기 # 검색 가능 # # 페어링 가능 # 스캔 켜기
마지막 명령 "스캔 켜기" 후에 목록에 Bluetooth 장치 (휴대폰)가 표시됩니다. 모바일에서 Bluetooth가 켜져 있고 근처 장치에서 볼 수 있는지 확인하십시오. 그런 다음 장치의 MAC 주소를 복사하고 주어진 명령을 사용하여 페어링합니다.
쌍
그런 다음 터미널 콘솔에 암호 또는 핀을 입력하라는 메시지가 표시되고 거기에 암호를 입력하고 Enter 키를 누릅니다. 그런 다음 메시지가 표시 될 때 휴대폰에 동일한 암호를 입력하면 이제 Raspberry Pi와 성공적으로 페어링됩니다. 우리는 또한 이전 GPIO 제어 튜토리얼에서 제공된 비디오에서이 전체 프로세스를 설명했습니다. 다음은 직접 YouTube 링크입니다.
앞서 말했듯이 데스크톱 인터페이스를 사용 하여 휴대폰을 페어링 할 수도 있습니다. Blueman을 설치하면 아래와 같이 Raspberry Pi 데스크탑의 오른쪽에 Bluetooth 아이콘이 표시되어 쉽게 페어링 할 수 있습니다.
장난감 자동차 선택:
이 Raspberry Pi Controlled Car 프로젝트에서 우리는 데모를 위해 장난감 자동차를 사용했습니다. 여기서 우리는 좌우 스티어링 기능이 있는 RF 장난감 자동차 를 선택 했습니다. 이 차를 구입 한 후 RF 회로를 Raspberry 회로로 교체했습니다. 이 차에는 두 개의 DC 모터가 있는데 하나는 두 개의 앞바퀴를 회전시키는 것이고 다른 하나는 두 개의 뒷바퀴를 회전시키는 것입니다. 앞쪽 모터는 자동차 방향을 지정하는 데 사용되며 실제 자동차 스티어링 기능과 같이 왼쪽 또는 오른쪽으로 회전하는 것을 의미합니다. 그리고 리어 사이드 모터는 차량을 전후 방향으로 운전하는 데 사용됩니다. 라즈베리의 블루투스는 안드로이드 폰에서 무선으로 명령을 받아 차량을 제어하는 데 사용됩니다.
두 개의 DC 모터가있는 장난감 자동차를 사용하여 앞바퀴와 뒷바퀴를 회전 할 수 있습니다.
회로도 및 설명:
이 Remote Controlled Car 에서는 L293D 모듈을 사용하여 Raspberry Pi와 2 개의 모터 만 연결하면 됩니다. Raspberry Pi 및 자동차에 전원을 공급하기 위해 모바일 파워 뱅크를 사용했습니다. 모바일 파워 뱅크는 라즈베리 파이와 자동차의 모터에 전원을 공급하기에 충분하지만, 우리가 파워 뱅크를 차 위에 놓으면 모바일 파워 뱅크의 무거운 무게로 인해 차량이 제대로 움직일 수 없습니다. 따라서 시스템에 전원을 공급하기 위해 경량 전원 공급 장치 또는 리튬 배터리를 사용하는 것이 좋습니다. 모든 연결은 아래 회로도에 나와 있습니다. 또한 다양한 기술로 모터를 제어하는 방법에 대해 자세히 알아 보려면 로보틱스 섹션을 확인하십시오.
참고: 라즈베리 파이에 5V 이상을 넣지 마십시오.
이 회로는이 프로젝트를 위해 Perf Board에서 만들어 졌기 때문에 차의 무게가 적습니다.
Android 앱 BlueTerm을 사용하여 원격으로 자동차 제어:
이제 모든 것을 설정하고 블루투스를 통해 스마트 폰 페어링을 성공적으로 시도한 후 블루투스 직렬 어댑터를 사용하여 Raspberry Pi와 통신하기위한 Android 앱 을 설치해야 Raspberry Pi 의 GPIO 핀을 제어 할 수 있습니다. 앞서 언급 했듯이 RFCOMM / SPP 프로토콜은 Bluetooth를 통한 직렬 통신을 에뮬레이트 하므로이 프로토콜을 지원하는 BlueTerm App 을 여기에 설치했습니다.
RFCOMM 소켓을 통한 통신을 지원하는 다른 Bluetooth 터미널 앱을 사용할 수도 있습니다.
이제 BlueTerm 앱을 다운로드하고 설치 한 후 터미널에서 아래 주어진 Python 프로그램 을 실행 하고 BlueTerm 앱에서 페어링 된 라즈베리 피 장치를 동시에 연결합니다.
성공적으로 연결되면 아래와 같이 앱의 오른쪽 상단에 connected: raspberrypi 가 표시됩니다.
이제 BlueTerm 앱에서 다음 명령을 입력하여 자동차를 원하는 방향으로 이동할 수 있습니다. 프로그램을 종료하려면 'q'를 누르십시오. Google Voice Typing Keyboard 를 사용하여 Voice로이 자동차를 제어 할 수 있습니다. 마지막에 주어진 비디오 에서 전체 데모를 확인하십시오.
명령:
F – 앞으로 이동
B – 뒤로 이동
S – 중지
L – 앞으로 왼쪽 이동
R – 앞으로 오른쪽으로 이동
A – 뒤로 왼쪽 이동
P – 오른쪽 뒤로 이동
Q – 종료
Python 프로그래밍:
Android 앱으로 Raspberry Pi GPIO 를 제어 하기위한 Python 프로그램 은 매우 간단하고 자명합니다. Bluetooth RFCOMM 통신과 관련된 코드에 대해 조금만 배울 필요가 있습니다. 그렇지 않으면 모터의 핀을 높거나 낮게 만들어 로봇이나 자동차를 제어하는 것과 같습니다. 전체 프로그램 은 아래 코드 섹션에 나와 있습니다.
먼저 Python 언어로 Bluetooth를 제어 할 수 있는 Bluetooth 소켓 라이브러리 를 가져와야합니다. 이전 섹션에서 동일한 라이브러리를 설치했습니다.
블루투스 가져 오기
그런 다음 더 많은 헤더 파일을 포함하고 모터에 대한 핀을 정의하여 기본값을 낮게 설정했습니다.
import bluetooth import time import RPi.GPIO as GPIO m11 = 18 m12 = 23 m21 = 24 m22 = 25 GPIO.setwarnings (False) GPIO.setmode (GPIO.BCM) GPIO.setup (m11, GPIO.OUT) GPIO.setup (m12, GPIO.OUT) GPIO.setup (m21, GPIO.OUT) GPIO.setup (m22, GPIO.OUT) GPIO.output (m11, 0) GPIO.output (m12, 0) GPIO.output (m21, 0) GPIO.output (m22, 0)
다음은 Bluetooth 통신을 담당하는 코드입니다.
server_socket = bluetooth.BluetoothSocket (bluetooth.RFCOMM) port = 1 server_socket.bind (("", port)) server_socket.listen (1) client_socket, address = server_socket.accept () print "", address에서 연결 허용
여기서 우리는 그것들을 한 줄씩 이해할 수 있습니다.
server_socket = bluetooth.BluetoothSocket (bluetooth.RFCOMM): 블루투스 RFCOMM 통신을위한 소켓 생성.
server_socket.bind (("", port):- 서버는 ''호스트의 스크립트를 포트에 바인딩합니다.
server_socket.listen (1): 서버는 한 번에 하나의 연결을 허용하도록 수신합니다.
client_socket, address = server_socket.accept (): 서버는 클라이언트의 연결 요청을 수락하고 mac 주소를 변수 주소에 할당합니다. client_socket은 클라이언트의 소켓입니다.
그 후 원하는 방향으로 자동차를 움직이는 일부 함수를 만들었습니다: def left_side_forward (), def right_side_forward (), def forward (), def left_side_reverse (), def right_side_reverse (), def reverse () def stop (). 이러한 기능은 Mobile blueTerm 앱에서 L, R, F, A, P, B, S를 누르면 각각 호출되며 그에 따라 자동차가 움직입니다.
data = ""while 1: data = client_socket.recv (1024) print "Received: % s"% data if (data == "F"): forward () elif (data == "L"): left_side_forward () elif (data == "R"): right_side_forward () elif (data == "B"): reverse () elif (data == "A"): left_side_reverse () elif (data == "P"): right_side_reverse () elif data == "S": stop () elif (data == "Q"): print ("종료") break client_socket.close () server_socket.close ()
data = client_socket.recv (1024): 클라이언트 소켓 client_socket을 통해 데이터를 받아 변수 데이터에 할당합니다. 한 번에 최대 1024 자까지 수신 할 수 있습니다.
마지막으로 모든 프로그래밍이 끝나면 아래 코드를 사용하여 클라이언트와 서버 연결을 닫습니다.
client_socket.close () server_socket.close ()