파이톤으로 EV3의 모터와 센서를 제어해 보세요.

15786 단어 ev3devEV3Python
이 글은 ET 로봇 경연 Advent Calendar 201612/22의 조목이다.
안녕하세요, 저는 비마입니다.
작년까지 우리 팀은 모두 자바로 ET 로봇 경기에 참가했다
올해는 마음을 돌려 파이톤의 참가에 도전했다.
하지만 도전을 위해 정보를 조사했음에도 필요한 정보를 찾지 못했다.
그래서 앞으로 파이톤에서 LEGO Mindstorms EV3를 돌려보고 싶은 분들에게 참고가 되고 싶어요.
나는 이 보도를 쓰기로 결정했다.
이번 보도는 이용자가 많아 윈도를 대상으로 한다.
또한 앞으로 파이톤의 개발 환경과 v3dev의 교차 컴파일 환경에 대한 화제를 발표할 것이라고 생각합니다.

운영 환경


OS: ev3 dev2016-10-17 Release Edition(Debian 기반 Linux)
프로그램 라이브러리 사용: python-ev3dev 0.8.0 (pyhon-ev3이라는 프로그램 라이브러리가 있습니다. 다른 것이기 때문에 주의하십시오)
파이썬 버전: 파이썬 3.4.2
(pythn-ev3 dev0.8.0에서는 Pytht2가 지원되지 않으므로 Python3을 사용해야 함)

ev3 dev 설치/시작


[참조] Getting Started with ev3dev-ev3dev.org
1. ev3 dev 공식 사이트에서 OS 이미지 다운로드
다음 링크에서 "Download for EV3"을 클릭하여 ZIP 파일을 다운로드합니다.
Downloads-ev3dev.org
(집필시 버전 2016-10-17)
2. 다운로드한 ZIP 파일의 압축을 풉니다.
ev3 dev 이미지 파일을 확장합니다.
(2016-10-17 버전에서 이미지 파일의 이름은'ev3 dev-jessie-ev3-generic-206-10-17')
3. SD 카드에 이미지 파일 쓰기
Win32 DiskImager를 사용하여 확장된 이미지 파일을 SD 카드에 씁니다.
쓰기 절차는 아래 사이트에 기재되어 있으니 참고하세요.
SD 카드 준비 - OpenRTM-aist
또 대응하는 SD 카드는 2GB~32GB의 마이크로SD 또는 마이크로SDHC다.
마이크로SDXC는 지원되지 않습니다.
4. 작성된 SD 카드를 EV3에 삽입하고 EV3를 시작합니다.
시작 로그를 출력하고 이따가 메뉴 화면을 표시합니다.
메뉴 화면을 표시하면 성공합니다.

네트워크에 ev3 dev 연결


EV3를 네트워크에 연결하는 방법은 다음과 같습니다.
  • 와이파이 동글로 무선 LAN 연결
    EV3-Python 프로그래밍(ev3 dev) 환경 와이파이 연결 프로그램 - Afrel
  • USB LAN 어댑터로 유선 LAN 연결
    →물소 루아-U2-ATX를 통해 동작 확인
  • USB 케이블(Type A-mini B)을 사용한
  • 연결
    →교육용 레이고 폭풍 EV3 기본설정 V2와 함께 USB 케이블 확인
  • 내장형 Bluetooth 연결
    → 동작 미확인
  • ※ LAN 연결 시 DHCP를 사용할 수 있는 환경이나 수동으로 IP 주소를 설정해야 합니다.

    SSH를 통한 원격 로그인 EV3


    SSH를 사용하여 ev3 dev에 로그인합니다.
    TeraTerm 연결을 사용합니다.
    1. TeraTerm을 시작하면 호스트에 EV3의 IP 주소를 입력하고 "OK"단추를 누릅니다.

    ※ IP 주소는 EV3 호스트의 화면 왼쪽 상단에 표시됩니다.
    2. 보안 경고 창이 표시되면 계속 버튼을 누릅니다.

    3. 사용자 이름과 암호를 입력합니다.ID: robot/Pass: maker

    4. 로그인에 성공하여 터미널에 ev3 dev 로고를 표시합니다.

    python-ev3 dev 업데이트


    v3 dev2016-10-17 릴리즈 버전의 psyhon-ev3 dev 버전은 0.7.0으로 업데이트됩니다.
    (pythn-ev3 dev0.8.0에서 센서 주변의 API가 변경되었으니 이전 버전에 설치된 소스 코드가 있음을 주의하십시오.)
    robot@ev3dev:~$ sudo apt-get update
    robot@ev3dev:~$ sudo apt-get install --only-upgrade python3-ev3dev
    
    ※ 명령 도중에 비밀번호를 입력해야 하므로 메이커를 입력해야 합니다.

    샘플 프로그램


    다음은 모터 제어와 센서 제어의 샘플 프로그램입니다.
    프로그램의 문자 코드를 UTF-8로 저장하십시오.

    모터 제어


    motor.py
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import ev3dev.ev3 as ev3
    import time
    
    # モータクラスをインスタンス化
    m = ev3.LargeMotor('outA')
    # モータを3秒間回転
    m.run_timed(time_sp=3000, speed_sp=500)
    
    # 5回ループ
    for i in range(0,5):
        # モータの状態を標準出力に表示
        print(m.state())
        # 1秒間スリープ
        time.sleep(1)
    

    센서 제어(컬러 센서)


    color.py
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import ev3dev.ev3 as ev3
    
    # カラーセンサクラスをインスタンス化
    c = ev3.ColorSensor('in1')
    
    # 赤色LEDの光の反射強度を表示
    print(c.reflected_light_intensity)
    # センサモードを表示
    print(c.mode)
    
    # RGB値を表示
    print(c.raw)
    # センサモードを表示
    print(c.mode)
    
    # 取得した色を表示(0:無色, 1:黒, 2:青, 3:緑, 4:黄, 5:赤, 6:白, 7:茶)
    print(c.color)
    # センサモードを表示
    print(c.mode)
    

    모터+센서 제어


    motor_color.py
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import ev3dev.ev3 as ev3
    import time
    
    # モータクラスをインスタンス化
    m = ev3.LargeMotor('outA')
    
    # カラーセンサクラスをインスタンス化
    c = ev3.ColorSensor('in1')
    
    # モータを回転(stopをコールするまで回転し続ける)
    m.run_forever(speed_sp=300)
    
    # カラーセンサが黒を検出するまでループ
    while c.color != 1:
        # 取得した色を表示(0:無色, 1:黒, 2:青, 3:緑, 4:黄, 5:赤, 6:白, 7:茶)
        print(c.color)
        # 1秒間スリープ
        time.sleep(1)
    
    # モータを停止(停止後、モータの位置を固定するためstop_actionにholdを指定)
    m.stop(stop_action="hold")
    

    샘플 프로그램 전송


    ev3 dev는 기본적으로 SFTP를 사용할 수 있으므로 Windows에서 샘플 프로그램을 전송할 때는 WinSCP를 사용하는 것이 좋습니다.
    WinSCP를 사용하지 않는 방법
    연결에 대한 설정은 다음과 같다.
    전송 프로토콜: SFTP
    호스트 이름: EV3 화면 왼쪽 상단에 표시된 IP 주소
    포트 번호: 22
    사용자 이름: 로봇
    암호:maker

    샘플 프로그램 실행


    이번에는 샘플 프로그램의 모터입니다.py를 예로 들다.

    터미널에서 실행할 때

    robot@ev3dev:~$ pwd
    /home/robot
    robot@ev3dev:~$ ls
    color.py  motor.py  motor_color.py
    robot@ev3dev:~$ python3 motor.py
    
    실행 결과
    robot@ev3dev:~$ python3 motor.py
    ['running', 'stalled']
    ['running']
    ['running']
    []
    []
    robot@ev3dev:~$ 
    

    EV3 호스트에서 시작할 때


    EV3 호스트에서 프로그램을 시작할 때는 먼저 객체의 프로그램에 실행권을 부여해야 합니다.
    chmod 명령을 사용하여 실행권을 부여합니다.
    robot@ev3dev:~$ pwd
    /home/robot
    robot@ev3dev:~$ ls -l
    total 12
    -rw-r--r-- 1 robot robot 522 Dec 21 07:55 color.py
    -rw-r--r-- 1 robot robot 236 Dec 21 04:19 motor.py
    -rw-r--r-- 1 robot robot 735 Dec 21 08:03 motor_color.py
    robot@ev3dev:~$ chmod +x motor.py
    robot@ev3dev:~$ ls -l
    total 12
    -rw-r--r-- 1 robot robot 522 Dec 21 07:55 color.py
    -rwxr-xr-x 1 robot robot 236 Dec 21 04:19 motor.py
    -rw-r--r-- 1 robot robot 735 Dec 21 08:03 motor_color.py
    robot@ev3dev:~$
    
    실행권 부여가 완료되면 EV3 호스트 화면에서 File Browser 를 선택합니다.
    커서 이동은 EV3 호스트의 위아래 단추로 중앙 단추로 결정됩니다.
    File Browser를 열면/home/robot의 부하가 먼저 표시되므로 motor가 표시됩니다.py를 선택합니다.
    정상적으로 실행권이 부여되면 파일 이름 옆에 별표가 표시됩니다.
    파일을 선택한 후 잠시 후 프로그램이 실행되고 File Browser 화면이 표시됩니다.
    실행 결과
    ['running', 'stalled']
    ['running']
    ['running']
    []
    []
    

    문제점


    개발할 때 주의했던 몇 가지 문제를 열거하다.
  • 더블 라운드 물구나무 진자 라이브러리 없음
    →ET 로봇 경연대회 2016 초급반 불참을 공식 선언.
    사용 가능한 플랫폼 정보 ET 로봇 경연 2016
  • 컬러 센서의 LED는 꺼지지 않습니다.
    → OS 규격상 컬러 센서의 LED를 닫을 수 없기 때문에 매달린 추적을 할 수 없습니다.
  • 연속 컬러 센서로 RGB 값을 검색하는 중 오류 발생
    → 컬러 센서를 사용하면 값을 가져올 때 오류가 발생할 수 있습니다.
    Linux의 dmesg로 확인하면 버퍼 초과 실행 오류가 발생하는 것과 관련이 있습니까?(혹시 이유를 아시는 분 있으면 알려주세요)
  • 느린 처리
    →TOPPERS 등 RTOS에 비해 처리 속도가 느려 ET 로봇 경기에 불리할 수 있다.
  • API


    모터 유형 API의 일부 사용 예제를 기록합니다.
  • 마달류
  • motorApiTest.py
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import ev3dev.ev3 as ev3
    import time
    
    l = ev3.LargeMotor('outA')  # EV3 インタラクティブサーボモーターL
    m = ev3.MediumMotor('outB') # EV3 インタラクティブサーボモーターM
    
    print(l.count_per_rot) # 1回転あたりのモータカウント
    
    l.speed_sp = 200 # 目標スピードを設定(秒間200カウント)
    print(l.speed_sp) # 設定されている目標スピード値を表示
    
    l.run_forever() # モータを回転させる
    m.run_forever(speed_sp=200) # 回転と同時にスピードを設定することも可能
    
    time.sleep(2)
    
    l.speed_sp = 300 # モータ回転速度を変更
    l.run_forever()
    
    m.speed_sp = -200 # モータを逆回転
    m.run_forever()
    
    time.sleep(2)
    
    l.stop_action = 'hold' # 停止時のモータ状態を「固定」に設定
    print(l.stop_action) # モータ停止後の動作を表示
    
    l.stop() # モータを停止
    m.stop(stop_action='brake') # モータを停止(停止時のモータ状態を「ブレーキ」に設定
    
    print(l.position) # モータカウント値を表示
    
    # モータを100カウント分回転
    l.run_to_abs_pos(position_sp=l.position_sp+100) # 絶対値指定
    m.run_to_rel_pos(position_sp=100) # 相対値指定
    

    좋은 웹페이지 즐겨찾기