Beaglebone용 Bluetooth 저에너지(BLE) 자습서

30759 단어

1. 소개



Python 스크립트를 사용하여 Beaglebone Black에 연결된 BleuIO 동글을 제어하는 ​​방법을 보여주는 간단한 예입니다.

스크립트를 실행할 때 먼저 동글이 연결된 com 포트(보통 '/dev/ttyACM0')를 묻습니다. 그 후 BleuIO가 광고를 시작합니다. 8초마다 온보드 Beaglebone Black LED 중 하나를 켜고 어떤 LED가 켜져 있는지 나타내기 위해 BLE 광고 이름을 변경합니다.

Linux 데비안 이미지: 'OMAP3/DM3730 Debian 9.5 2018-10-07 4GB SD LXQT'(https://beagleboard.org/latest-images)를 사용하고 있습니다.

2. 강령에 대하여



프로젝트HEREhttps://github.com/smart-sensor-devices-ab/beaglebone_bleuio_example에 액세스할 수 있습니다.

온보드 LED를 제어하기 위해 Beaglebone과 함께 제공되는 Adafruit_BBIO Python 라이브러리를 사용하고 있습니다. 먼저 LED 이름을 정의한 다음 GPIO 출력으로 설정합니다.
그런 다음 BleuIO가 전환할 광고 메시지를 정의합니다.
하나를 분해하자:

"10:09:42:6C:65:75:49:4F:20:4C:45:44:20:30:20:4F:4E:"



"10"은 광고 패킷의 HEX 크기입니다.
"09"는 장치 이름(완전한 로컬 이름)에 대한 플래그입니다.
"42:6C:65:75:49:4F:20:4C:45:44:20:30:20:4F:4E"는 HEX에서 ASCII로 변환된 패킷 자체입니다. "BleuIO LED 0 ON"

그런 다음 사용자에게 BleuIO가 연결된 COM 포트를 입력하라는 메시지가 표시됩니다. USB 허브를 사용하지 않는 경우 포트는 '/dev/ttyACM0'이어야 합니다.

Python 스크립트에서 com 이름을 변경하고 COM 포트를 채울 수 있습니다.

com_input = "/dev/ttyACM0"


스크립트는 메인 루프로 계속 진행되며, 여기서 먼저 모든 LED가 꺼져 있는지 확인한 다음 BLE 광고를 시작합니다.

루프는 4개의 LED 모두를 통해 반복됩니다. 모든 반복에서 하나의 LED를 켜고 LED 이름을 알린 다음 다음 LED로 계속 진행합니다.
이것은 스크립트가 중단될 때까지 계속됩니다.


import serial
import time
import Adafruit_BBIO.GPIO as GPIO


LED_USR0 = "USR0"
LED_USR1 = "USR1"
LED_USR2 = "USR2"
LED_USR3 = "USR3"

GPIO.setup(LED_USR0, GPIO.OUT)
GPIO.setup(LED_USR1, GPIO.OUT)
GPIO.setup(LED_USR2, GPIO.OUT)
GPIO.setup(LED_USR3, GPIO.OUT)

LED0_ON_ADV_MSG = "10:09:42:6C:65:75:49:4F:20:4C:45:44:20:30:20:4F:4E:"
LED1_ON_ADV_MSG = "10:09:42:6C:65:75:49:4F:20:4C:45:44:20:31:20:4F:4E:"
LED2_ON_ADV_MSG = "10:09:42:6C:65:75:49:4F:20:4C:45:44:20:32:20:4F:4E:"
LED3_ON_ADV_MSG = "10:09:42:6C:65:75:49:4F:20:4C:45:44:20:33:20:4F:4E:"

# Turn off all LEDs
GPIO.output(LED_USR0, GPIO.LOW)
time.sleep(0.1)
GPIO.output(LED_USR1, GPIO.LOW)
time.sleep(0.1)
GPIO.output(LED_USR2, GPIO.LOW)
time.sleep(0.1)
GPIO.output(LED_USR3, GPIO.LOW)
time.sleep(0.1)

print("\nBlueIO BeagleBone Example!\n\n")
connecting_to_dongle = 0
com_input = ""

start_input = 0
valid_input = 0
while start_input == 0:
    com_input = input(
        "Enter Com port of Dongle (default for BeagleBone: '/dev/ttyACM0'):\n>>"
    )
    print("\nComport to use: " + com_input)
    input_continue = input(
        "If your happy with your choice just press Enter to continue the script. Else type E to exit or R to redo your choice. \n>>"
    )
    if input_continue.upper() == "E":
        start_input = 1
    elif input_continue.upper() == "":
        start_input = 1
    elif input_continue.upper() == "R":
        valid_input = 0
        start_input = 0
if input_continue.upper() == "E":
    print("Exiting script...")
    exit()

console = None

while 1:
    try:
        print("Please wait...")
        time.sleep(0.5)
        console.write(str.encode("AT+DUAL"))
        console.write("\r".encode())
        time.sleep(0.5)
        print("Starting Advertising...")
        console.write(str.encode("AT+ADVSTART"))
        console.write("\r".encode())
        time.sleep(0.5)
        led_turn = 0
        # Turn off all LEDs
        GPIO.output(LED_USR0, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED_USR1, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED_USR2, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED_USR3, GPIO.LOW)
        time.sleep(0.1)
        while True:
            if led_turn == 0:
                print("\nTurning LED USR0 ON")
                console.write(str.encode("AT+ADVRESP="))
                console.write(LED0_ON_ADV_MSG.encode())
                console.write("\r".encode())
                GPIO.output(LED_USR0, GPIO.HIGH)
                GPIO.output(LED_USR1, GPIO.LOW)
                GPIO.output(LED_USR2, GPIO.LOW)
                GPIO.output(LED_USR3, GPIO.LOW)
                led_turn = led_turn + 1
            elif led_turn == 1:
                print("\nTurning LED USR1 ON")
                console.write(str.encode("AT+ADVRESP="))
                console.write(LED1_ON_ADV_MSG.encode())
                console.write("\r".encode())
                GPIO.output(LED_USR0, GPIO.LOW)
                GPIO.output(LED_USR1, GPIO.HIGH)
                GPIO.output(LED_USR2, GPIO.LOW)
                GPIO.output(LED_USR3, GPIO.LOW)
                led_turn = led_turn + 1
            elif led_turn == 2:
                print("\nTurning LED USR2 ON")
                console.write(str.encode("AT+ADVRESP="))
                console.write(LED2_ON_ADV_MSG.encode())
                console.write("\r".encode())
                GPIO.output(LED_USR0, GPIO.LOW)
                GPIO.output(LED_USR1, GPIO.LOW)
                GPIO.output(LED_USR2, GPIO.HIGH)
                GPIO.output(LED_USR3, GPIO.LOW)
                led_turn = led_turn + 1
            elif led_turn == 3:
                print("\nTurning LED USR3 ON")
                console.write(str.encode("AT+ADVRESP="))
                console.write(LED3_ON_ADV_MSG.encode())
                console.write("\r".encode())
                GPIO.output(LED_USR0, GPIO.LOW)
                GPIO.output(LED_USR1, GPIO.LOW)
                GPIO.output(LED_USR2, GPIO.LOW)
                GPIO.output(LED_USR3, GPIO.HIGH)
                led_turn = 0

            time.sleep(8)

    except KeyboardInterrupt:
        GPIO.output(LED_USR0, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED_USR1, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED_USR2, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED_USR3, GPIO.LOW)
        time.sleep(0.1)
        print("Exiting script...")
        exit()
    except:
        print("\n\nDongle not connected.\n")
        connecting_to_dongle = 0
        while connecting_to_dongle == 0:
            try:
                print("Trying to connect to dongle...")
                console = serial.Serial(
                    port=com_input,
                    baudrate=57600,
                    parity="N",
                    stopbits=1,
                    bytesize=8,
                    timeout=0,
                )
                if console.is_open.__bool__():
                    connecting_to_dongle = 1
                    print("\n\nConnected to Dongle in port: " + com_input + ".\n")
            except:
                print(
                    "Dongle not found. Retrying connection to port: "
                    + com_input
                    + "..."
                )
                time.sleep(5)




3. 예제 프로젝트 사용하기



3.1 필요한 것


  • 컴퓨터
  • BleuIO 동글 ( https://www.bleuio.com/ )
  • BeagleBone 펌웨어가 설치된 BeagleBone Black( https://beagleboard.org/black )( https://beagleboard.org/latest-images )

  • 4. 프로젝트 설정 방법



    4.1 GitHub에서 프로젝트 다운로드



    프로젝트에 대한 액세스 권한 얻기HERE
    https://github.com/smart-sensor-devices-ab/beaglebone_bleuio_example

    프로젝트를 복제하거나 zip 파일로 다운로드하여 BeagleBone의 폴더에 압축을 풉니다.

    BeagleBone에서 Cloud9 IDE를 사용하여 새 Python 파일을 생성할 수도 있습니다(http://192.168.7.2:3000/로 이동하여 실행).


    코드를 복사하여 새로 만든 파일에 붙여넣습니다.



    4.2 파이시리얼 설치하기



    스크립트를 실행하려면 Python 라이브러리 pyserial을 설치해야 합니다.

    가장 쉬운 방법은 shh를 통해 BeagleBone에 연결하는 것입니다(기본 비밀번호는 temppwd).



    또는 Cloud9 IDE에서 bash 탭을 사용하고 다음을 입력합니다.

     sudo pip3 install pyserial
    




    5. 예제 실행하기



    Python 스크립트 파일이 있는 폴더로 이동하여 다음을 실행합니다.
    (Pyserial이 작동하려면 sudo 권한이 필요합니다.)

    sudo python3 name_of_script.py
    

    좋은 웹페이지 즐겨찾기