dc모터 예제

모터가 목표 위치로 실행되는 동안 코드는 기다려야 합니다. 이 예제에서는 DcMotor.isBusy() 기능을 시청하는 방법(모터가 대상에 도달하지 않은 경우 true)을 보고 다른 하나는 현재 모터 위치를 대상 위치와 비교하는 두 가지 방법을 보여 주며, 다른 하나는 이를 수행하는 방법을 보여 주며, 다른 하나는 현재 모터 위치를 대상 위치와 비교합니다. 또한 이동을 완료하는 데 필요한 시간을 결정하고 해당 시간이 지나갈 때까지 기다릴 수도 있습니다. 두 경우 모두 모터 주행 모드를 RUN_TO_POSITION로 선택했기 때문에 모터는 브레이크를 켜고 자체적으로 정지합니다. DriveWithEncoder라는 새 클래스를 만들고 예제 코드를 복사/붙여넣습니다. 인코더 수를 사용하여 프로그램을 시연합니다. 이 두 모드 모두 PID 컨트롤을 사용하여 모터의 전력(및 방향,대상 위치 지정의 경우)을 결정합니다. 예를 들어 모터가 대상 위치에 실제로 가까우면 소량의 전력을 사용하여 전진하거나 후퇴합니다. 멀리 떨어져 있으면 훨씬 더 많은 전력을 사용합니다. 프로그램에서 인코더를 사용한 후 인코더를 사용하지 않고 모터를 실행하도록 요청하는 경우 enum DcMotor.RunMode.RUN_WITHOUT_ENCODER를 사용하여 인코더 없이 모터를 실행하도록 설정해야 합니다. 인코더없이 실행하면 모터가 자동 작업을 수행하지 않지만 인코더는 여전히 계산됩니다.

예제와 같이 인코더 수를 직접 모니터링하고 모터가 자동으로 수행되는 대신 중지 시기를 결정할 수 있습니다. 모터 스톱이 자동으로 유지되는 것이 더 정확합니다. 지금까지 우리는 로봇이 경과 된 시간으로 이동하는 거리를 제어해 왔습니다. 움직임을 제어하는 보다 정확한 방법은 인코더를 사용하면 더욱 정확합니다. 인코더는 드라이브 모터에 연결되거나 통합되어 있으며 모터 샤프트의 회전수를 광학적으로 또는 자기적으로 계산합니다. DcMotor 오브젝트에는 인코더 카운트를 사용하여 켜졌을 때 모터가 실행되는 길이를 제어할 수 있습니다. 예제 코드에서는 5000 개의 인코더 개수에 대해 앞으로 실행하고 중지합니다. 그런 다음 시작 지점까지 인코더 카운트를 0으로 거꾸로 실행합니다.

두 드라이브 모터에 인코더를 추가해야 합니다. 인코더는 회전을 직접 계산하지 않지만 부분 회전을 계산하여 작은 움직임을 처리할 수 있습니다. 미국 디지털 E4P 인코더(Tetrix 키트)는 모터 샤프트의 한 회전에 대해 1440카운트를 보고합니다. 각 인코더 유형에는 회전값당 카운트가 다르므로 각 인코더에 대한 사양을 참조하여 회전당 개수 수를 결정해야 합니다(응용 프로그램에 필요한 경우). 실제로 모터에 의해 보고된 카운트를 표시하고 이동을 통해 로봇을 수동으로 이동/구동하여 실험적으로 움직임을 완료하는 데 필요한 인코더 개수를 확인할 수 있습니다. 또한 인치 또는 피트의 실제 거리로 변환되는 인코더 개수를 측정한 다음 해당 단위에서 이동을 설정하여 개수로 변환할 수 있습니다. 거리 단위에 대한 개수는 모터 샤프트와 휠 샤프트 사이에 사용되는 휠 크기와 기어의 함수입니다. 선택한 거리를 피트로 이동하도록 예제를 수정합니다. 거리를 카운트로 변환하는 코드를 재사용할 수 있는 함수로 만듭니다. 모터의 방향을 반대로 반대로 향하도록 좌우 드라이브 모터가 있는 경우 를 반대로 되돌릴 수 있습니다. 모터를 초기화한 직후에 바로 그렇게 할 수 있습니다: 물론 모터를 „플로팅“으로 설정했다고 해서 기계적으로 자유롭게 움직일 수 있다는 의미는 아닙니다.