다중 선형 액추에이터 간의 동기식 동작은 일부 고객 애플리케이션의 성공에 중요 할 수 있습니다. 하나는 트랩 도어를 여는 두 개의 선형 액추에이터입니다. 이를 달성하려면 전용 Firgelli를 사용하는 것이 좋습니다. 동기식 컨트롤 박스 FA-SYNC-2 및 FA-SYNC-4. 그러나 일부 DIY 사용자와 해커는 Arduino와 같은 마이크로 컨트롤러가 제공하는 자유를 선호하고 대신 자체 동기 제어 프로그램을 작성하는 것을 선호합니다. 이 자습서는 다음을 사용하여이를 달성하는 방법에 대한 개요를 제공하는 것을 목표로합니다. 광학 시리즈 선형 액추에이터.
머리말
이 튜토리얼은 Arduino로 동기 제어를 달성하는 데 필요한 단계를 엄격하게 처리하는 것이 아니라 사용자 정의 프로그램을 작성하는 데 도움이되는 광범위한 개요입니다. 이 튜토리얼은 고급이며 Arduino 하드웨어, 소프트웨어에 이미 익숙하고 이상적으로는 펄스 폭 변조 (PWM) 신호, 인터럽트 서비스 루틴 (ISR), 센서 디 바운싱 및 모터 인코더에 대한 경험이 있다고 가정합니다. 이 튜토리얼에서 제공하는 예제는 기본 비례 제어기입니다. PID 제어 루프 구현 및 두 개 이상의 선형 액추에이터로의 확장을 포함하되 이에 국한되지 않는 다음 예에서 많은 개선 사항을 구현할 수 있습니다. Arduino 응용 프로그램에 대한 기술 지원을 제공 할 리소스가 없으며 공개적으로 사용 가능한 자습서 외부에서 코드 또는 배선 다이어그램을 디버그, 편집, 제공하지 않습니다.
동기 제어 개요
동기 제어는 두 개의 선형 액추에이터의 길이를 비교하고 속도를 비례 적으로 조정하여 이루어집니다. 한 액추에이터가 다른 액추에이터보다 빠르게 움직이기 시작하면 속도를 늦 춥니 다. 내장 된 광학 인코더를 통해 선형 액추에이터의 위치를 읽을 수 있습니다. 광학 인코더는 DC 모터에 연결된 10 개의 구멍이있는 작은 플라스틱 디스크로 모터가 회전 할 때 플라스틱 디스크도 마찬가지입니다. 적외선 LED는 플라스틱 디스크를 향하여 빛이 회전 할 때 광 디스크의 구멍을 통해 전송되거나 디스크의 플라스틱에 의해 차단됩니다. 디스크 반대편에있는 적외선 센서는 빛이 구멍을 통해 투과 될 때이를 감지하여 구형파 신호를 출력합니다. 수신기가 감지하는 펄스 수를 세어 모터의 RPM과 선형 액추에이터가 이동 한 거리를 모두 계산할 수 있습니다. 35lb 광학 선형 액추에이터에는 인치당 50 (+/- 5) 광학 펄스가있는 반면 200lb 및 400lb 액추에이터는 모두 인치당 100 (+/- 5) 펄스를 가지고 있습니다. 각 선형 액추에이터가 얼마나 멀리 확장되었는지를 비교하여 두 액추에이터의 속도를 비례 적으로 조정할 수 있으므로 확장하는 동안 항상 동일한 길이를 유지할 수 있습니다.
필수 구성 요소
- 두 개의 광학 선형 액추에이터
- 2 개의 IBT-2 모터 드라이버
- Arduino Uno
- 12V 전원
- 3 개의 순간 버튼 (Firgelli에서 판매하지 않음)
- 추가 배선
배선도
위의 배선 연결을하십시오. 선형 액추에이터에서 나오는 와이어 색상을 항상 확인하십시오. 색상 규칙이 위 다이어그램에 표시된 것과 다를 수 있습니다.
빠른 튜토리얼
두 개의 선형 액추에이터를 동기식으로 이동하려면 다음 단계를 따르십시오.
- 배선도에 표시된대로 연결하십시오.
- 아래의 첫 번째 프로그램을 업로드하고 실행하십시오.
- 이 프로그램에서 출력 한 두 값을 아래 두 번째 프로그램의 23 행에 복사합니다.
- 두 번째 프로그램을 업로드하고 실행합니다.
- 변수 K_p (37 행, 두 번째 프로그램)를 변경하여 시스템을 미세 조정하십시오. 이것은 전위차계를 아날로그 핀 A0에 연결하고 코드를 수정하여 전위차계를 읽고 map () 함수를 사용하여 가장 쉽게 수행 할 수 있습니다. K_p = map (analogRead (A0), 0, 1023, 0, 20000);
이 튜토리얼의 나머지 부분에서는 프로그램의 주요 기능 중 일부에 대해 자세히 설명합니다. 다시 한번 우리는 이것이 완전한 튜토리얼이 아니라 자신의 프로그램을 만들 때 고려해야 할 사항에 대한 개요임을 반복합니다.
교정 프로그램 개요
동기 제어가 이루어지기 전에 먼저 시스템을 보정해야합니다. 여기에는 제품 사양에 명시된대로 1 인치당 (+/- 5) 펄스의 허용 오차가 있기 때문에 작동주기 당 펄스 수를 계산하는 것이 포함됩니다. 아래 프로그램을 업로드하고 실행하십시오. 이 프로그램은 액추에이터 (라인 53)를 완전히 후퇴시키고 광학 펄스 카운터 변수를 0으로 설정 한 다음 완전히 확장되고 완전히 후퇴합니다 (각각 라인 63 및 74). 이 작동주기 동안 펄스 수는 인터럽트 서비스 루틴 (ISR), 라인 153 및 166에 의해 계산됩니다. 작동주기가 완료되면 평균 펄스 수가 출력됩니다 (88 행). 나중에이 값을 기록해 두십시오.
https://gist.github.com/Will-Firgelli/89978da2585a747ef5ff988b2fa53904
동기식 프로그램 개요
동기 제어 프로그램을 업로드하기 전에 먼저 보정 프로그램에서 출력 한 값을 23 행에 복사하고 현재 배열 : {908, 906}을 자신의 값으로 바꿔야합니다. 또한 35lb 선형 액추에이터를 사용하는 경우 29 행의 변수 값을 20 밀리 초에서 8 밀리 초로 변경해야합니다.
한 번 완전히 후퇴 한 후 (원점 식별을 위해) 확장, 후퇴 및 중지 명령에 해당하는 세 개의 버튼을 눌러 두 선형 액추에이터를 동시에 이동할 수 있습니다. 액추에이터는 상대 펄스 카운터를 비교하고 항상 동기 상태를 유지하도록 속도를 조정하여 고르지 않은 부하에서도 동기 상태를 유지합니다. 현재 프로그램은 평형 주변에서 오버 슈트 및 진동의 영향을 받기 때문에 단순한 비례 컨트롤러 라인 93을 구현합니다. 37 행에 정의 된 K_p 변수를 변경하여이를 조정할 수 있습니다. 이것은 전위차계를 아날로그 핀 A0에 연결하고 코드를 수정하여 전위차계를 읽고 map () 함수를 사용하여 가장 쉽게 수행 할 수 있습니다. K_p = map (analogRead (A0), 0, 1023, 0, 20000);
최상의 결과를 얻으려면 비례 컨트롤러를 제거하고 PID 제어 루프를 구현하는 것이 좋습니다. 그러나 이것은이 입문 자습서의 범위를 벗어나고 의도적으로 생략되었습니다.
https://gist.github.com/Will-Firgelli/44a14a4f3cac3209164efe8abe3285b6
Bullet 36 및 Bullet 50 액추에이터를 동기식으로 사용
광학 시리즈 선형 액추에이터 외에도 엔코더가 내장 된 두 가지 선형 액추에이터 인 Bullet 36 Cal을 제공합니다. 그리고 Bullet 50 Cal은 모두 내부 구적 홀 효과 인코더를 가지고 있습니다. 홀 효과 인코더는 광학 인코더와 동일한 원리로 작동하지만 빛을 사용하는 대신 자기를 사용합니다. 또한 구적 엔코더이기 때문에 각각 90도 위상차가있는 두 개의 신호 출력이 있습니다. 따라서 4 개 이상의 인터럽트 핀 (Arduino Uno에는 2 개만 있음)이있는 Arduino 보드를 사용하고 액추에이터 당 2 개의 신호에서 입력을 처리하도록 코드를 수정해야합니다. 또한 디 바운스 시간 변수 인 falsepulseDelay를 K_p와 함께 조정해야합니다.
자신 만의 프로그램 작성을위한 팁
2 개 이상의 선형 액추에이터
두 개 이상의 선형 액추에이터를 사용할 때 Arduino Uno는 두 개의 인터럽트 핀만 사용할 수 있으므로 더 이상 작동하지 않습니다. 적절한 수의 인터럽트 핀을 사용할 수있는 Arduino 보드를 사용해야합니다. 자세한 정보 : https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
둘째, 효율성을 위해 배열 및 for () 루프를 사용하여 프로그래밍을 벡터화하여 각 액추에이터를 반복하는 것이 좋습니다.
디 바운싱
많은 센서와 마찬가지로 바운싱 신호를 인식하는 것이 중요합니다. 기계식 스위치와 마찬가지로 인코더도 바운싱 문제를 겪을 수 있습니다. 위의 예에서 디 바운싱 프로세스는 간단한 지연 (falsepulseDelay 변수에 의해 정의 됨)에 의해 처리되었습니다. 모든 소프트웨어 변경에서 또는 물리적 회로를 사용하여 바운싱 노이즈를 필터링하여이를 처리하는 것이 중요합니다.
롤오버 처리
코드를 수정하는 경우 millis () 함수를 다룰 때 롤오버에 유의하십시오. millis () 및 lastDebounceTime 배열은 모두 부호없는 long 변수로 선언되어 최대 4,294,967,295 (32 ^ 2-1)의 값을 저장할 수 있습니다. 이는 대략 49.7 일의 롤오버 기간으로 해석됩니다. 현재 프로그램은 ISR (인터럽트 서비스 루틴) 함수 (count_0 및 count_1)에서 롤오버를 처리하도록 설계되었습니다. 그러나이 프로그램을 수정하면 변수 롤오버를 올바르게 처리해야합니다. 그렇지 않으면 프로그램이 49.7 일 연속 사용 후 충돌합니다. 자세한 내용은 다음을 참조하십시오. https://www.norwegiancreations.com/2018/10/arduino-tutorial-avoiding-the-overflow-issue-when-using-millis-and-micros/