LEGO SPIKE Prime과 RaspberryPi를 UART를 통해 협업

이번에는 LEGO SPIK Prime과 Raspberry Pi의 합작으로 사용하기 전 단계로 UART를 사용하여 신호를 교환하는 구조를 만들어 보았다.
앞으로 이를 활용해 라즈베리피에서 카메라 등을 이용해 기계학습을 하고 그 결과에 따라 SPIKE를 구동하는 모터 등의 협업을 진행할 예정이다.

사용품

  • LEGO SPIKE PRIME
  • RaspberryPi4(3에서 URAT 설정이 변경될 수 있음)

  • Breadboard Connector Kit for SPIKE Prime Ultrasonic sensor cable(용접 필요)

  • T6 토크 드라이버
    (초음파 센서 분해에 필요함)
  • RaspberryPi 환경 구축을 위한 네트워크 환경
    (Raspberry iOS를 사용하려면 별도의 SDHC 카드가 필요합니다.)
  • RaspberryPi 환경 건설


    OS 사용: RaspberryPi OS
    PC에서 원격 액세스할 때 사용VNCviewer이 편리합니다.
    Raspberry PiOS를 준비한 후 필요한 것을 설치합니다.
  • 이번에는 Python 편집기Mu를 사용합니다.
    u는 간단하게 Python3를 실행할 수 있는 편집기 외에도 USB를 통해 SPIKE에 연결하여 SPIKE 내의 MicroPython을 직접 실행할 수 있습니다.
    RaspberryPi에서 터미널을 시작하고 명령을 입력하여 Mu를 설치합니다.
  • 1.Raspberrypi OSのリポジトリから必要なものをインストールする。
    
    sudo apt-get install python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtserialport
    python3-pyqt5.qtsvg python3-dev python3-gpiozero python3-pgzero libxmlsec1-dev libxml2
    libxml2-dev
    
    2.virtualenvの環境を作成する。
    
    sudo pip3 install virtualenv
    
    virtualenv -p /usr/bin/python3 --system-site-packages ~/mu-venv
    
    3.作成したvirtualenvの環境をアクティブにする。
    source ~/mu-venv/bin/activate
    
    4.Muをgitからクローンする。
    git clone https://github.com/mu-editor/mu.git ~/mu-source
    
    5.virtualenvを有効にした状態で、pipでRaspberry Pi用のPythonパッケージをインストールする。
    
    cd ~/mu-source
    
    pip install -e ".[dev]"
    
    6.Muのエディタを起動する。
    
    mu-editor
    
    이로써 Mu 가져오기가 완료됩니다.
    다음에 뮤 시작할 때.source ~/mu-venv/bin/activate mu-editor의 순서는 터미널에서 명령을 실행하면 시작할 수 있습니다.(여러 터미널에서 여러 Mu 시작 가능)

    RaspberryPi 지원 GPIO(UART5 사용)


    SPIKE와의 신호 교환에 사용되는 GPIO를 활용할 수 있도록 Raspberry Pi를 설정합니다.
    1. RaspberryPi의 "/boot/config.txt"를 편집합니다.
    파일의 끝에 "dtoverlay=uart5"를 추가로 입력하고 저장합니다.
    파일의 편집은 나노 편집 프로그램과vi 편집 프로그램을 이용합니다.
    다음은 나노 편집기를 이용하여 편집할 때의 명령입니다.
    sudo nano /boot/config.txt
    ↓
    ファイル内編集、保存
    
    2. 명령을 통해 새 포트가 열려 있는지 확인합니다.
    ls /dev/ttyA*
    ↓
    表示されるリストの中にttyAMA1があればOK
    
    3. 라즈베리피와 Breadboard Connector Kit를 사용하여 SPIKE를 연결합니다.

    4. SPIKE를 RaspberryPi의 USB 포트에 연결합니다.
    이렇게 통신할 준비가 끝났다.

    통신의 교환을 시도해 보다.


    다음 순서에 따라 프로그램을 제작하고 실행하여 통신을 진행하였다.
    1. RaspberryPi에서 Mu 편집기 두 개를 시작합니다.
    RaspberryPi에서 두 터미널을 각각 시작합니다.source ~/mu-venv/bin/activate mu-editor실행을 통해 Mu 창이 2개 상승합니다.
    2.2 시작된 Mu 편집기의 모드를 변경합니다.
    한쪽은 Python3 모드, 한쪽은 SPIKE MicroPython 모드로 변경됩니다.
    3. Mu 편집기에서 각각 Raspberry Pi 측면, SPIKE 측면의 Python 프로그램을 만듭니다.
    각 Python 프로그램은 다음과 같습니다.
    Raspberrypi 측면(Python3 모드 측면)
    Test.py
    import time
    import serial,time
    
    
    ser = serial.Serial('/dev/ttyAMA1',115200)
    
    while True:
        if ser.in_waiting: #if data, read until \n
            x=ser.readline()
            print(x)
            ser.write(bread: %s\n % x)
    
    SPIKE 측면(SPIKE MicroPython 모드 측면)
    Main.py
    import hub, time
    
    serial = hub.port.C
    serial.mode(hub.port.MODE_FULL_DUPLEX)
    time.sleep(1)
    serial.baud(115200)
    
    serial.read(1000)
    serial.write("\n testing \n\n")
    serial.read(1000)
    
    4. Raspberry Pi와 SPIKE를 연결하여 2개의 Mu 편집기에서 각각의 Python 프로그램을 실행합니다.
    다음 그림을 연결합니다.(A 포트의 모터는 다음 항목에 사용됩니다.)

    송신 프로그램의 write 설명 부분입니다.
    실행할 때 수신된 데이터는 Python3 측면 Mu 편집기의 콘솔 부분으로 출력됩니다.( testing )

    수신 플래그로 SPIKE 제어


    신호 교환이 끝났기 때문에 SPIKE 제어에 놓으세요.
    같은 방식으로 각자의 Mu 편집기에서 프로그램을 만든다.
    Raspberrypi 측면(Python3 모드 측면)
    Test2.py
    import time
    import serial
    
    # serial ini
    ser = serial.Serial('/dev/ttyAMA1', 115200)
    
    # start send
    print('start')
    while True:
        time.sleep(5.0)
        ser.write(b't')
        print('send test')
    
    SPIKE 측면(SPIKE MicroPython 모드 측면)
    Main2.py
    import hub, time
    from spike import Motor
    
    # serial ini
    serial = hub.port.C
    serial.mode(hub.port.MODE_FULL_DUPLEX)
    time.sleep(1)
    serial.baud(115200)
    
    # motor ini
    motor = Motor('A')
    
    # start recive
    print('start')
    while True:
        reply = serial.read(1000)
        if reply:
            response = reply.decode('utf-8')
            print(response)
            if response == 't':
                motor.run_for_degrees(360,speed=50)
                time.sleep(1.0)
    
    프로그램이 완료되면 SPIKE의 A 포트에 M 모터를 연결합니다.
    실행자가 동작을 확인하지만, 이번에는 대기 상태가 된 SPIKE 측에서 먼저 수행합니다.
    그런 다음 Raspberrypi 측면을 수행합니다.
    정상적인 동작이면 Raspberrypi 측에서 5초마다 바이트 유형t을 보냅니다.
    수신된 SPIKE 사이드 디코딩이 utf-8이고 수신된 것으로 판정된 경우t, 모터를 360도 회전시키는 처리를 합니다.

    좋은 웹페이지 즐겨찾기