Skip to content

중요공지

아두이노 기반의 IR-CT01은 기본 프로그램이 내장되어 있어, 별도의 코딩 없이도 보드의 물리 버튼과 슬라이더를 이용해 12Lf, L12, 12Df, D12 계열 액츄에이터를 즉시 조작할 수 있습니다. 또한 각 액츄에이터 시리즈별 IR-CT01 아두이노 라이브러리를 참고하여 사용자 프로그램을 작성하고, 이를 보드에 업로드하여 사용할 수도 있습니다. 다만, 17Lf 시리즈는 공장 출하 시 기본 프로그램만으로는 즉시 조작할 수 없습니다. 17Lf 시리즈를 사용하려면 아래의 17Lf 전용 아두이노 프로그램을 IR-CT01에 업로드해야 하며, 이후 보드에서 조작할 수 있습니다. 해당 프로그램에는 17Lf 전용 예제도 포함되어 있어 사용자 프로그램 작성에도 활용할 수 있습니다.

1 개 요 ​

Arduino 기반의 EZ Controller는 mightyZAP 리니어 액츄에이터를 손쉽게 동작 / 테스트해보기 위한 컨트롤러입니다.

EZ Controller의 특징은 다음과 같습니다.

  • 제품 구매 시 이미 내장되어 있는 기본 프로그램을 이용하여 보드 상의 여러 입력 장치를 통해 리니어 액츄에이터를 간단히 손 쉽게 동작시킬 수 있습니다.
  • 당사가 제공한 다양한 예제 프로그램을 이용하거나, 아두이노 프로그램을 통해서 원하는 프로그램을 자유롭게 직접 만들어, 원하는 동작을 만들어낼 수도 있으며, 목적에 맞는 다양한 제어가 가능합니다.
  • 다양한 기능의 외부 악세서리들이 연결 가능한 구조입니다.
  • MightyZAP 리니어액츄에이터를 제어하기 위한 별도의 회로 구성이 필요 없으며 역극성 방지, 과전류 방지, 정전기 방지 등 전원 보호회로가 내장되어 있어 안전하게 사용하실 수 있습니다.

1.1 사용 시 주의 사항 ​

아래 주의사항은 사용시 각별히 주의를 요하는 사항이므로, 반드시 숙지를 하여 주십시오. 아래 사항을 준수하지 못해 발생한 문제에 대해서는 보증 서비스를 받을 수 없음을 알려드립니다.

  1. 제품 연결 시 무리한 힘으로 결합하지 마십시오. 또한, 소자 또는 외부로 돌출 된 핀에 무리한 힘을 가하지 마십시오. 고장의 원인이 됩니다.

  2. 절연이 되어 있지 않은 금속판 위에서 전원 연결 시 단락이 될 수 있습니다. 반드시 동봉된 플라스틱 서포트를 기판에 장착 후 사용하여 주시기 바랍니다.

    support단락방지를 위해 사용 전 반드시 동봉된 플라스틱 서포트 장착

  3. 이지 컨트롤러에 인가된 전압이 연결 액츄에이터에 바로 인가 되므로, 액츄에이터의 구동 전압범위를 확인하시고 전원 연결 시 극성을 확인하십시오. 예) 입력 전압 범위가 6.5V – 8.9V인 7.4V 인가 전압의 액츄에이터(D7또는 L7계열) 연결 시, 실수로 12V전원을 연결하면 액츄에이터가 구동을 하지 않고 파손 위험이 있습니다.

  4. 이지 컨트롤러에 전원 인가 시 꼭 메인 전원 입력 단자를 통해 공급하십시오**.**

  5. 이지 컨트롤러에 배터리를 전원 공급원으로 사용하지 마십시오**.**

  6. 제품에 액츄에이터 연결 시 핀의 극성을 꼭 확인하고 결합하십시오. 극성이 바뀔 경우 모터 손상의 원인이 됩니다

  7. 알맞은 규격의 커넥터를 사용하십시오. 액츄에이터와 연결 시 오삽에 따른 제품 파손의 위험이 있습니다.

  8. 각 단자에 용도에 맞는 입력을 넣어주십시오. 오동작의 원인이 됩니다. 알맞은 전압레벨의 신호단자와 전원/신호 단자의 혼란에 유의 하십시오.

  9. 로드의 시작 및 종료 지점을 설정하기 위한 가변저항의 노브를 과도하게 많이 돌리지 마십시오.

  10. 제품을 화기, 물기, 먼지, 기름으로부터 멀리하십시오.

  11. 본 제품은 실내용도로 설계된 제품입니다. 실외에서의 사용은 최대한 자제하여 주십시오.

  12. 어린이의 손이 닿지 않는 곳에 제품을 보관하십시오.

1.2 적절한 보관 ​

아래와 같은 극한환경에서 제품을 사용하거나 보관하지 마십시오. 오작동이나 제품의 파손을 불러올 수 있습니다.

  • 섭씨 60도 이상의 고온환경 또는 섭씨영하 20도의 극저온환경
  • 직사광선 또는 화기근처
  • 고온다습하고 먼지가 많은 장소
  • 진동이 심한 장소
  • 정전기를 유발할 수 있는 장소

2 제품 기능 및 기본동작 ​

2.1제품 기능 설명 ​

  • EZ Controller 구성 부품 및 설명

    function

참고

청색 가변저항 ③(A포지션), ④(B포지션)를 각각 시계·반시계 방향으로 조절하여 A와 B지점의 위치를 조정합니다. 편의상 아래와 같이 A는 최소위치, B는 최대 위치로 설정하는 것이 편합니다.

  • 시계 방향 : - (액츄에이터 수축방향)
  • 반시계 방향 : + (액츄에이터 확장방향)
  • A 지점(부품③) : 시계(수축) 방향으로 돌려 최소 위치 설정
  • B 지점(부품④) : 반시계(확장) 방향으로 돌려 최대 위치 설정 다만, 사용자 설정에 따라 A와 B의 최소/최대위치가 역전되어 변경될 수도 있습니다.
  1. A Position 외부 스위치 입력 (○: +, ●:-)

  2. B Position 외부 스위치 입력 (○: +, ●:-) : ①, ②번 단자는 외부 스위치 연결 또는 외부 입력 신호를 받아 동작 (⑨, ⑩번 푸시버튼과 같은 기능이며 포지션 설정은 마찬가지로 ③과 ④를 통해 설정함)

  3. A Position 설정 가변저항 : 가변 저항을 조절하여 ① 또는 ⑨번 입력 시 액츄에이터가 움직일Position을 설정

  4. B Position 설정 가변저항 : 가변 저항을 조절하여 ② 또는 ⑩번 입력 시 액츄에이터가 움직일 Position을 설정

  5. PC 연결 USB Type-C 단자 : 아두이노 스케치 다운 / Serial 통신

  6. Reset 스위치 : 컨트롤러의 동작에 이상이 있을 시, 동작을 초기화

  7. 12V 메인 전원 입력 단자(VIN) : EZ Controller, 액츄에이터 메인 전원

  8. Mode 변환 스위치 (내용 2.2 참고)

  9. A Position 택트 스위치

  10. B Position 택트 스위치

  11. MCU F/W 다운로드 커넥터(ICSP) : 사용자 조작 금지

  12. 아두이노 I/O 핀(Digital:3 , Analog:3 / GND, 5V, SIG)

  13. 내부 전원 단자(GND / 3.3V / 5V / VIN(12V)) : 내부에서 사용하는 전원 출력 단자 [각 단자의 Current Limit]

    • 3.3V : ~150mA / 5V : ~ 900 mA / VIN(12V) : Depending on Input Voltage Source
  14. 니어 액츄에이터 PWM 포트

  15. 리니어 액츄에이터 TTL 포트

  16. 리니어 액츄에이터 RS-485 포트

  17. 리니어 액츄에이터 위치 조작 Potentiometer

  18. 사용자 외부 통신 단자 (Bluetooth : TX / RX / GND / 3.3V)

2.2모드 선택 ​

  • EZ Controller에 내장되어 있는 기본동작 프로그램을 이용하여 액츄에이터의 동작을 테스트 합니다.
  • 기본 동작 프로그램은 Manual Mode, Position Select Mode, Position Toggle Mode로 구성되어 있습니다. (모드스위치는 기본 내장된 프로그램에서만 영향을 미칩니다.)
ManualPosition SelectPosition Toggle
modeSW_manualmodeSW_selectmodeSW_toggle
  • Manual Mode : 액츄에이터를 연결하고 Mode 스위치를 하단으로 내려 Manual Mode로 설정하고 중앙부 선형 Potentiometer의 위치를 변화시켜 액츄에이터를 조작할 수 있습니다.
  • Position Select Mode : 액츄에이터를 연결하고 Mode 스위치를 중간단으로 올려 Position Select Mode로 설정하고 파란색 포지션 설정 가변 저항을 조절하여 A, B Position을 각각 설정한 후, 중앙부 흰색 Push Button을 눌러 액츄에이터를 A지점과 B지점으로 동작시킬 수 있습니다.
  • Position Toggle Mode : 액츄에이터를 연결하고 Mode 스위치를 상단으로 올려 Position Toggle Mode로 설정하고 파란색 포지션 설정 가변 저항을 조절하여 A, B Position을 각각 설정한 다음 중앙부 흰색 Push Button 둘중 아무 버튼을 눌러 액츄에이터를 A지점과 B지점으로 반전 동작시킬 수 있습니다.

2.3외부 스위치 및 외부 신호 입력 ​

A/B 포지션 외부 스위치 및 신호 입력을 통한 위치 명령 (사진의 ①,②번 단자) 스위치를 연결하거나, 또는 전압 레벨 신호를 인가하여 위치 이동 명령을 내립니다. 흰색의 택트 스위치(⑨,⑩)와 동일한 기능을 합니다. 위치 명령만 내릴 뿐, 위치 지정은 청색 가변저항(③과④)을 통해 셋팅을 합니다.

  1. External Switch 연결 : 단자의 양단을 스위치를 통해 연결해 신호를 입력해줍니다. (단자 양단 단락)

    external_switch

  2. External Signal 입력 : 단자의 두번째 홀에 신호 인식을 위하여 3.3~12V 전압 레벨의 신호를 인가 시킵니다.

    external_signal

2.4 파트 핀 맵 ​

Part NoPin NamePurposePart NoPin NamePurpose
①,⑨I/O10GPIO– A Signal⑫A0,A2,A3GPIO - Analog
②,⑩D3GPIO– B Signal⑫D7,IO11,IO13GPIO - Digital
③A4Analog–A 가변저항⑭D5GPIO - PWM
④A5Analog–B 가변저항⑮,⑯D0,D1TTL,RS485 통신 전용
⑤SerialUSB Serial, Sketch다운⑰A1Analog -Potentiometer
⑧D4,IO12,D6GPIO – Slide SW⑱IO8,IO9Software Serial
  • Parts No : 구성 부품 표기 번호

  • Pin Name : Arduino(Leonardo) I/O핀

  • Purpose : I/O핀 Function

    pinmap

3 아두이노 개발환경 구축하기 ​

IRROBOT Ez Controller를 통해 테스트 프로그램을 동작시키기 위해선 PC에 아두이노 개발 환경을 구성해야 합니다.

3.1 아두이노 IDE 설치 ​

  1. https://www.arduino.cc/en/main/software 에서 Window Installer를 선택

    arduino_install1

  2. JUST DOWNLOAD를 눌러 다운로드를 진행합니다.

    arduino_install2

  3. 다운로드가 완료 되면 arduino-xxx-windows.exe를 실행 합니다.

    arduino_install3

  4. 다음의 과정을 따라 소프트웨어를 설치를 진행 합니다.

    arduino_install4

    arduino_install5

    arduino_install6

    arduino_install7

  5. 설치 과정에서 나오는 추가 드라이버를 설치합니다.

    arduino_install8

  6. 소프트웨어 설치가 완료되면 Close를 누릅니다.

    arduino_install9

  7. 바탕화면에 생성된 아두이노를 실행 합니다.

    arduino_icon

3.2. 아두이노 IDE 기본 구성 ​

아두이노 개발환경 기본 구성은 다음과 같습니다.

arduino_ide1. 컴파일 버튼 : 이 버튼을 누르면 프로그램이 컴파일 합니다.(컴파일 결과는 4번에 표시) 2. 업로드 버튼 : 컴파일과 동시에 Arduino에 업로드 합니다. (컴파일 오류 또는 Arduino와의 USB 연결 오류가 발생하면 4번 영역에 표시) 3. 시리얼 모니터 버튼 : USB로 아두이노와 연결된 상태로 아두이노가 동작하면 아두이노에서 PC로 메시지를 보낼 수 있습니다. Serial.write() 또는 Serial.print()같은 함수를 사용하여 프로그램이 작성된 경우 시리얼 모니터를 통해 메시지를 확인할 수 있습니다. 4. 메시지 영역 :아두이노 개발환경을 사용하면서 발생하는 알림 메시지나 컴파일, 업로드 결과 등이 표시되는 영역입니다.

3.3. 아두이노 라이브러리 추가 ​

  1. 당사 웹사이트(http://www.mightyzap.com) API 자료실에서 IRROBOT_EZController_XXXX.Zip을 내려 받습니다. (사용하는 액츄에이터가 Position control제품인지, Force Control제품군인지 확인후 그에 맞는 자료실을 선택해 주세요)

  2. [스케치] – [라이브러리 포함하기] – [.ZIP 라이브러리 추가…] 선택

    arduino_add_library1

  3. IRROBOT_EZController_XXXX.Zip를 선택 (파일명은 업데이트에 따라 변경될 수 있습니다.)

    arduino_add_library2

3.4. 예제 불러오기 ​

  1. 아두이노 IDE 실행

  2. [파일] - [예제] - [IRROBOT_EZController_FC]-[EZ] – 사용할 예제 선택

    loading

3.5. 프로그램 업로드 하기 ​

  1. [툴]-[보드]-[Arduino Leonardo] 선택

  2. [툴]-[포트]-[COMXX (Arduino Leonardo)] 연결된 보드의 포트 선택

    upload

  3. 업로드 버튼을 통해 실행된 프로그램을 보드에 업로드 시켜줍니다.

4. 아두이노 IDE를 통한 액츄에이터 제어 예제 ​

아두이노 IDE의 데이터 통신 프로토콜(RS-485 또는 TTL)을 통해 액츄에이터를 제어합니다. 데이터 통신을 통해 액츄에이터를 보다 자유롭게 제어하고 싶을 때 사용합니다.

4.1 개요 ​

EZ Controller를 통해 mightyZAP을 제어하기 위한 아두이노 예제입니다. 본 예제는 시리얼 데이터 통신(TTL 혹은 RS-485통신)을 통한 제어가 가능하며 PWM통신은 지원하지 않습니다.

EZ Controller는 아두이노 레오나르도 기반으로 제작된 보드이며, 당사에서 제공한 아두이노 API는 아두이노 레오나르도/우노 기준입니다. 각 파라메터 기능에 대한 구체적인 설명은 마이티잽 사용자 매뉴얼을 참고하여 주십시오.

4.2 예제 - 2 Position Control (RS-485/TTL) ​

두 지점을 지정할 수 있는 가변저항 2개(사진의 3, 4번)와 지정한 지점에 도달하도록 동작시킬 수 있는 Switch 2개(사진의 9,10번)를 내장하고 있습니다. 또는 외부 물리 스위치, 외부 전압 신호 (사진의 1번 또는 2번)로도 지정한 지점에 도달할 수 있도록 할 수 있습니다.

가변저항으로 지정시킨 2Position을 2개의 스위치를 통해 이동시키는 예제입니다. [예제] - [IRROBOT_EZController] - [EZ]–[EZController_2Positions] 선택

2position### 4.3.1 사용 설명

  • 모드 스위치(8번)는 어디에 위치시켜도 무방합니다. (기본 내장 프로그램에서만 모드 스위치 동작)
  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 연결합니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터(14번)의 경우 6페이지 핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오)
  • A, B 지점의 위치를 조절하는 가변저항(3, 4번)을 시계(-), 반시계(+) 방향으로 돌려 동작시킬 지점을 설정합니다. 시계 방향은 수축(short stroke), 반시계 방향은 확장(long stroke) 방향입니다.
  • A, B 스위치(9, 10번)를 눌러 원하는 위치로의 명령을 내립니다.
  • 좌측 상단의 단자(1, 2번)를 이용하여 외부 스위치·신호를 이용하여 동작시킬 시, 5페이지를 참고하여 주십시오.

4.3.2 프로그램 설명 ​

가변 저항의 값으로 두 지점을 설정하며 A와 B의 버튼이 눌렸을 때 해당 지점으로 움직이게 해주는 예제

C++
#include <IRROBOT_EZController.h>  
#define ID_MAX 11
#define A_POSITION_VR Easy.VR_2
#define B_POSITION_VR Easy.VR_3
#define VR_MIN 0
#define VR_MAX 1023
#define VAL_MIN 0
#define VAL_MAX 4095
#define IS_A_POSITION_ON Easy.POS_A.isOFF()
#define IS_B_POSITION_ON Easy.POS_B.isOFF()
#define ID_NUM 0
#define PWM_MIN 900
#define PWM_MAX 2100
#define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

IRROBOT_EZController Easy(&Serial1);

void setup() {
  Easy.begin();
  Easy.MightyZap.begin(32);
  Easy.setStep(ID_MAX,0,1023);
}

void loop()
{
  unsigned char MightyZap_actID = ID_NUM;
  short A_stroke_val, B_stroke_val, position_val;
  int A_stroke_limit, B_stroke_limit;
  A_stroke_val = map(A_POSITION_VR.read(), VR_MIN, VR_MAX, VAL_MIN, VAL_MAX);
  B_stroke_val = map(B_POSITION_VR.read(), VR_MIN, VR_MAX, VAL_MIN, VAL_MAX);

  if(IS_A_POSITION_ON)
    position_val = A_stroke_val;
  else if(IS_B_POSITION_ON)
    position_val = B_stroke_val;

  Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);
  Easy.servo_CH1.writeMicroseconds(PWM_VAL);
  delay(10);

}
  • PWM 값 매핑

    C++
    #define PWM_MIN 900                         
    #define PWM_MAX 2100                       	
    #define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)
    • short : 900
    • long : 2100
  • 가변저항을 이용한 위치값 입력

    C++
    A_stroke_val=map(A_POSITION_VR.read(), VR_MIN, VR_MAX, VAL_MIN, VAL_MAX);
    B_stroke_val=map(B_POSITION_VR.read(), VR_MIN, VR_MAX, VAL_MIN, VAL_MAX);
    • Position A 와 Position B 의 가변 저항 값을 읽어 A_stroke_val 변수와 B_stroke_val 변수에 각각 값을 할당해 줍니다.
    • map()함수를 통해 가변저항의 저항 값을 액츄에이터의 위치 범위에 맞게 매핑시켜줍니다.
    • 가변 저항을 이용하지 않을 시 아래의 값을 사용하시기 바랍니다. A_stroke_val = 100; B_stroke_val = 3600;
  • 출력 제어

    • Easy.MightyZap.GoalPosition() : TTL/RS485 출력 제어
    • Easy.servo_CH1.writeMicroseconds() : PWM 출력 제어
    C++
    Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);
    Easy.servo_CH1.writeMicroseconds(PWM_VAL);

4.3. 예제 - TogglePosition ​

1개의 스위치로 지정시킨 2 Position을 반전시켜주는 예제 입니다. [예제] - [IRROBOT_EZController] - [EZ]– [EasyControl_TogglePosition] 선택

4.3.1 사용설명 ​

  • 모드 스위치(8번)는 어디에 위치시켜도 무방합니다. (기본 내장 프로그램에서만 모드 스위치 동작)
  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 합니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터(14번)의 경우 6페이지 핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오)
  • A, B 지점의 위치를 조절하는 가변저항(3, 4번)을 시계(-), 반시계(+) 방향으로 돌려 동작시킬 지점을 설정합니다. 시계 방향은 수축(short stroke), 반시계 방향은 확장(long stroke) 방향입니다.
  • A 또는 B 스위치(사진의 9 또는 10번)를 눌러 원하는 위치로의 명령을 내립니다.
  • A와 B 스위치 상관없이, 동일한 스위치를 반복하여 누르면 A->B 지점으로 B->A 지점으로 액츄에이터가 이동합니다.
  • 좌측 상단의 단자(1, 2번)를 이용하여 외부 스위치·신호를 이용하여 동작시킬 시, 5페이지를 참고하여 주십시오.

4.3.2 프로그램 설명 ​

가변저항으로 설정된 두 지점을 A나 B 버튼을 눌렀을 시, A 지점에서 B지점 또는 B지점에서 A지점으로 반전 동작

toggle```C++ #include <IRROBOT_EZController.h>
#define ID_MAX 11 #define A_POSITION_VR Easy.VR_2 #define B_POSITION_VR Easy.VR_3 #define VR_MIN 0 #define VR_MAX 1023 #define VAL_MIN 0 #define VAL_MAX 4095 #define IS_A_POSITION_ON Easy.POS_A.isOFF() #define IS_B_POSITION_ON Easy.POS_B.isOFF() #define ID_NUM 0 #define PWM_MIN 900 #define PWM_MAX 2100 #define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

IRROBOT_EZController Easy(&Serial1);

short position_val; bool tg_flag,Sw_status = 0; int sw_cnt = 0,cnt =0 ;

void setup() {   Easy.begin();   Easy.MightyZap.begin(32);   Easy.setStep(ID_MAX,0,1023); }

void loop() {   unsigned char MightyZap_actID = ID_NUM;   short A_stroke_val;   short B_stroke_val;   A_stroke_val = map(A_POSITION_VR.read(),VR_MIN,VR_MAX,VAL_MIN,VAL_MAX);   B_stroke_val = map(B_POSITION_VR.read(),VR_MIN,VR_MAX,VAL_MIN,VAL_MAX);  
  if(IS_A_POSITION_ON || IS_B_POSITION_ON) tg_flag ^= 1;   if(tg_flag) position_val = A_stroke_val;   else position_val = B_stroke_val;

Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);   Easy.servo_CH1.writeMicroseconds(PWM_VAL);   delay(10);

}


- **toggle 동작**
  - A 나 B 버튼이 눌렸을 시에 bool 형으로 선언된 tg_flag 값을 반전시키고 그 값이 1 일 때는 A 지점을, 0 일 때는 B 지점으로 이동한다

  ```C++
    if(IS_A_POSITION_ON || IS_B_POSITION_ON) tg_flag ^= 1;
    if(tg_flag) position_val = A_stroke_val;
    else position_val = B_stroke_val;

4.4. 예제 –Manual Position ​

Linear Potentiometer의 이동거리만큼 액츄에이터의 위치를 움직여줍니다. [예제] - [IRROBOT_EZController] - [EZ]– [EasyControl_MPosition] 선택

4.4.1 사용설명 ​

  • 모드 스위치는 어디에 위치시켜도 무방합니다. (기본 내장 프로그램에서만 모드 스위치 동작)
  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 연결시켜 줍니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (사진의 14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터의 경우 핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오)
  • 중단의 가변 Potentiometer(사진의 17번) 를 조절하여 액츄에이터를 동작시켜 줍니다. 매뉴얼 모드에서는 위치 가변저항 (사진의 3, 4번)의 설정에 영향을 받지 않고, Potentiometer가 움직이는 만큼 full stroke 구간에서 위치 제어가 됩니다.

4.4.2 프로그램 설명 ​

manual```C++ #include <IRROBOT_EZController.h>

#define ID_MAX 11 #define MANUAL_POSITION_VR Easy.VR_1 #define VR_MIN 0 #define VR_MAX 1023 #define VAL_MIN 0 #define VAL_MAX 4095 #define ID_NUM 0 #define PWM_MIN 900 #define PWM_MAX 2100 #define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

IRROBOT_EZController Easy(&Serial1);

short position_val;

void setup() {   Easy.begin();   Easy.MightyZap.begin(32);   Easy.setStep(ID_MAX,0,1023); }

void loop() {   unsigned char MightyZap_actID = ID_NUM;   short Manual_position_val;   short A_stroke_val;   short B_stroke_val;   Manual_position_val  = map(MANUAL_POSITION_VR.read(),VR_MIN,VR_MAX,VAL_MIN,VAL_MAX);     position_val = Manual_position_val;   Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);   Easy.servo_CH1.writeMicroseconds(PWM_VAL);   delay(10); }


- **Potentiometer 를 이용한 Manual 제어**
  - Manual_position_val변수로 Potentiometer 의 값을 읽은 후 액츄에이터 위치 동작

  ```C++
   Manual_position_val  = map(MANUAL_POSITION_VR.read(),VR_MIN,VR_MAX,VAL_MIN,VAL_MAX);  
    position_val = Manual_position_val;
    Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);
    Easy.servo_CH1.writeMicroseconds(PWM_VAL);

4.5. 예제 –Basic Function ​

Slide 스위치를 통하여 액츄에이터 제어 방식을 전환시키며 제어하는 예제입니다. 공장 출하 프로그램* [예제] - [IRROBOT_EZController] - [EZ]-[EasyControl_BasicFunction] 선택

4.5.1 사용설명 ​

  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 연결합니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (사진의 14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터의 경우 페이지 핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오
  • 모드 슬라이드 스위치(사진의 8) 로 Mode를 변환시켜 액츄에이터를 동작시켜 줍니다.
ManualPosition SelectPosition Toggle
modeSW_manualmodeSW_selectmodeSW_toggle
1) Mode0 : Manual Control (스위치 최하단)  
2) Mode1 : 2 Position Control (스위치 중간단)  
3) Mode2 : Toggle Control (스위치 최상단)
  • Mode1(Manual Control) 동작 시, 사진의, 4번의 가변저항 값이 17번 가변 Potentiometer의 가동범위 Limit 값으로 설정 되니 참고바랍니다.

4.5.2 프로그램 설명 ​

C++
#include <IRROBOT_EZController.h>

#define ID_MAX 11
#define MANUAL_POSITION_VR Easy.VR_1
#define A_POSITION_VR Easy.VR_2
#define B_POSITION_VR Easy.VR_3
#define IS_MANUAL_MODE_ON Easy.MODE_0.isOFF()
#define IS_2P_MODE_ON Easy.MODE_1.isOFF()
#define IS_TOGGLE_MODE_ON Easy.MODE_2.isOFF()
#define IS_A_POSITION_ON Easy.POS_A.isOFF()
#define IS_B_POSITION_ON Easy.POS_B.isOFF()
#define VR_MIN 0
#define VR_MAX 1023
#define VAL_MIN 0
#define VAL_MAX 4095
#define ID_NUM 0
#define PWM_MIN 900
#define PWM_MAX 2100
#define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

IRROBOT_EZController Easy(&Serial1);

short position_val;
bool tg_flag,Sw_status = 0;
int sw_cnt = 0, cnt = 0;
int nFilter=0;

void setup() {
  Easy.begin();
  Easy.MightyZap.begin(32);
  Easy.setStep(ID_MAX,0,1023);
}

void loop()
{
  unsigned char MightyZap_actID = ID_NUM;
  short Manual_position_val,A_stroke_val,B_stroke_val;
  int A_stroke_limit, B_stroke_limit, stroke_limit_dir;

  Manual_position_val  = map(MANUAL_POSITION_VR.read(),VR_MIN,VR_MAX,VAL_MIN,VAL_MAX);
  nFilter = nFilter - (nFilter >> 3) + Manual_position_val;
  Manual_position_val = (Unit16_t)(nFilter >> 3);

  A_stroke_val = map(A_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);
  B_stroke_val = map(B_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);

  if(A_stroke_val>B_stroke_val)
  {
    int temp = A_stroke_limit;
    A_stroke_limit = B_stroke_val;
    B_stroke_limit = temp;
  }

  if(IS_MANUAL_MODE_ON) position_val = Manual_position_val;
  else if(IS_2P_MODE_ON)
  {
    if(IS_A_POSITION_ON) position_val = A_stroke_val;
    else if(IS_B_POSITION_ON) position_val = B_stroke_val;
  }
  else if(IS_TOGGLE_MODE_ON)
  {
    if(IS_A_POSITION_ON || IS_B_POSITION_ON){
      if(!Sw_status){
        if(sw_cnt++>7){
          tg_flag ^= 1;
          Sw_status = 1;
          sw_cnt = 0;
        }
      }
      else sw_cnt = 0;
    }
    else {
      sw_cnt = 0;
      if(!IS_A_POSITION_ON && !IS_B_POSITION_ON){
        if(cnt++>7){
          cnt = 0;
          Sw_status = 0;
        }
      }
    }
    if(tg_flag ==1) position_val = A_stroke_val;
    else position_val = B_stroke_val;
  }
  Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);
  Easy.servo_CH1.writeMicroseconds(PWM_VAL);
  delay(10);
}
  • Slide Switch Mode 정의

    • Slide Switch 의 하단, 중단, 상단이 각 순서대로 MODE_0,MODE_1,MODE_2 로 정의되어 있습니다.
    #define IS_MANUAL_MODE_ON Easy.MODE_0.isOFF()
    #define IS_2P_MODE_ON Easy.MODE_1.isOFF()
    #define IS_TOGGLE_MODE_ON Easy.MODE_2.isOFF()
  • 스위치 Debounce

    • Sw_status : 스위치가 눌러져 있는 상태 판별
    • sw_cnt : SW On 시, Debouncing 후 인식
    C++
    if(IS_A_POSITION_ON || IS_B_POSITION_ON)
    {
    	if(!Sw_status){
    		if(sw_cnt++>7){
    			tg_flag ^= 1;
    			Sw_status = 1;
    			sw_cnt = 0;
    		}
    	}
    	else sw_cnt = 0;
    }
    else {
    	sw_cnt = 0;
    	if(!IS_A_POSITION_ON && !IS_B_POSITION_ON){
    		if(cnt++>7){
    			cnt = 0;
    			Sw_status = 0;
    		}
    	}
    }

4.6. 예제 –Extra IO(1) ​

상단의 Digital IO핀의 입력을 받아 액츄에이터를 제어하는 예제 입니다. [예제] - [IRROBOT_EZController] - [EZ]–[EasyControl_ExtIO] 선택

4.6.1 사용설명 ​

  • 모드 스위치는 어디에 위치시켜도 무방합니다. (기본 내장 프로그램에서만 모드 스위치 동작)
  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 연결합니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (사진의 14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터의 경우 핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오)
  • 상단의 헤더핀(사진의 12번) 중 좌측 3개는 Digital 단자이며, 이 중에서 좌측에서부터 첫 번째와 두 번째 핀을 사용합니다.
  • 신호 단자는 3핀 중 제일 하단의 있는 핀이며 해당 핀은 5V의 신호 레벨을 가집니다. (아래 사진의 참조) (Active Low / 5V : High Signal / 0V : Low Signal)
  • 좌측 두 개의 가변저항(사진의 3,4번)를 통해 이전방법과 동일하게 이동시킬 두 지점을 설정해줍니다.
  • 첫 번째 핀에 Low 신호를 가하게 되면 설정한 A지점으로 액츄에이터가 이동하며, 두 번째 핀에 Low 신호를 가하게 되면 설정한 B 지점으로 액츄에이터가 이동합니다.
  • Push Button Switch 위에 6 개의 부가적인 IO 핀이 있으며 좌측 3 개는 Arduino 의 Digital IO, 우측 3 개는 Analog IO 핀 입니다.

4.6.2 프로그램 설명 ​

extraio_pinmap```C++ #include <IRROBOT_EZController.h> #define ID_MAX 11 #define A_POSITION_VR Easy.VR_2 #define B_POSITION_VR Easy.VR_3 #define VR_MIN 0 #define VR_MAX 1023 #define VAL_MIN 0 #define VAL_MAX 4095 #define ID_NUM 0 #define PWM_MIN 900 #define PWM_MAX 2100 #define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

IRROBOT_EZController Easy(&Serial1);

short position_val;

void setup() {   pinMode(7,INPUT);   pinMode(11,INPUT);   Easy.begin();   Easy.MightyZap.begin(32);   Easy.setStep(ID_MAX,0,1023); }

void loop() {   unsigned char MightyZap_actID = ID_NUM;   short A_stroke_val,B_stroke_val;   A_stroke_val = map(A_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);   B_stroke_val = map(B_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);

if(digitalRead(7) == HIGH) position_val = A_stroke_val;   else if(digitalRead(11) == HIGH) position_val = B_stroke_val;   else position_val = position_val;

Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);   Easy.servo_CH1.writeMicroseconds(PWM_VAL);

delay(10); }


- \*\* IO Pin 설정\*\*
  - Digital IO (7,11,13)중 7 번과 11 번 IO 를 입력으로 선언

  ```C++
  pinMode(7,INPUT);
  pinMode(11,INPUT);
  • IO input 제어

    • 7 번핀에 5V 신호가 인가되면 액츄에이터는 설정한 지점 A 로 11 번핀에 5V 신호가 인가되면 액츄에이터는 설정한 지점 B 로 이동한다.
    C++
    if(digitalRead(7) == HIGH) position_val = A_stroke_val;
    else if(digitalRead(11) == HIGH) position_val = B_stroke_val;
    else position_val = position_val;

4.7. 예제 -Extra IO(2) ​

상단 Analog IO핀에 외부 센서의 입력을 받아 액츄에이터를 제어하는 예제 입니다. [예제] - [IRROBOT_EZController] - [EZ]–[EasyControl_Sensing] 선택

4.7.1 사용설명 ​

  • 모드 스위치는 어디에 위치시켜도 무방합니다. (기본 내장 프로그램에서만 모드 스위치 동작)
  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 연결합니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (사진의 14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터의 경우 핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오)
  • 상단의 헤더 핀(사진의 12번) 중 우측 3개는 Analog 단자이며, 본 우측에서 3개의 핀을 사용합니다. (아래 사진 참조)
  • 해당 핀에 Analog 값을 읽을 센서를 용도에 알맞게 연결시켜줍니다.
  • 센서의 값에 따라 액츄에이터가 이동하게 됩니다. ex) CDS => 밝을수록 전진, 어두울수록 후진 동작

4.7.2 프로그램 설명 ​

  • 라이브러리 내부적으로 상단의 아날로그핀 A0,A2,A3 가 각각 VR_4,VR_5,VR_6 으로 정의되어 있으며 사용하고자 하는 핀을 정의되어있는 이름으로 선언 또는 매칭되어 있는 아날로그 핀을 직접 선언하여 사용합니다.

    extraIO2

C++
#include <IRROBOT_EZController.h>

IRROBOT_EZController Easy(&Serial1);

#define ID_MAX 11
#define MANUAL_POSITION_VR Easy.VR_1
#define A_POSITION_VR Easy.VR_2
#define B_POSITION_VR Easy.VR_3
#define EXT_ANALOG_VR Easy.VR_4   //VR4 : A0  //VR5 : A2  //VR6 : A3
#define VR_MIN 0
#define VR_MAX 1023
#define VAL_MIN 0
#define VAL_MAX 4095
#define ID_NUM 0
#define PWM_MIN 900
#define PWM_MAX 2100
#define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

short position_val;
  
void setup(){
  Easy.begin();
  Easy.MightyZap.begin(32);
  Easy.setStep(ID_MAX, 0, 1023);
}

void loop() {
  unsigned char MightyZap_actID = ID_NUM;
  short Ext_analog_val;

  Ext_analog_val = map(EXT_ANALOG_VR.read(), VR_MIN, VR_MAX, VAL_MIN, VAL_MAX);
  position_val = Ext_analog_val;
  Easy.MightyZap.GoalPosition(ID_NUM, position_val);
  Easy.servo_CH1.writeMicroseconds(PWM_VAL);
  delay(10);
}
  • 아날로그 PIn 설정

    C++
      #define EXT_ANALOG_VR Easy.VR_4   //VR4 : A0  //VR5 : A2  //VR6 : A3
  • 아날로그 입력 제어

    C++
      Ext_analog_val = map(EXT_ANALOG_VR.read(), VR_MIN, VR_MAX, VAL_MIN, VAL_MAX);

4.8. 예제 –External Communication ​

우측 하단의 Bluetooth 포트를 통해 외부 통신을 하며 액츄에이터를 제어하는 예제 입니다. [예제] - [IRROBOT_EZController] - [EZ]–[EasyControl_ExtCom] 선택

4.8.1 사용설명 ​

  • 모드 스위치는 어디에 위치시켜도 무방합니다. (기본 내장 프로그램에서만 모드 스위치 동작)
  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 연결시켜 줍니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (사진의 14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터의 경우핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오)
  • 우측 하단 외부 통신을 위한 핀(사진의 18번)이 있으며 해당 핀에 연결하고자 하는 장비를 핀 배열에 맞게 연결합니다.
  • 해당 예제에선 A버튼을 누르면 ASCII값으로 ‘A’가 송신되고 B버튼을 누르면 ASCII값 ‘B’가 송신됩니다. 보드가 ASCII값으로 ‘A’를 수신하면 이전과 동일하게 설정해두었던 A 지점으로 액츄에이터가 이동하며, 마찬가지로 ASCII값 ‘B’를 수신하면 설정해두었던 B지점으로 액츄에이터가 이동합니다.

4.8.2 프로그램 설명 ​

  • 아두이노 상으로 IO8,IO9 핀을 각각 RX,TX 로 선언시켜줍니다.

  • Serial.begin()함수로 시리얼 모니터의 baud rate 설정 Sw_func()함수와 ExtComData_Func()함수에서 송수신 된 데이터를 시리얼 모니터에 출력하여 확인합니다.

  • ExtComData_Listen() 함수를 통하여 통신 데이터를 한 바이트씩 수신해줍 니다.

  • Sw_Func()함수에선 A 와 B 각각 해당하는 ASCII 코드 값을 송신하며 ExtComData_Func()함수에선 수신된 ASCII 코드값에 해당하는 Position 으로 액츄에이터를 이동시켜줍니다.

    externalUart_ENG

C++
#include <IRROBOT_EZController.h>

IRROBOT_EZController Easy(&Serial1);
SoftwareSerial userSerial(8,9);

#define ID_MAX 11
#define A_POSITION_VR Easy.VR_2
#define B_POSITION_VR Easy.VR_3
#define VR_MIN 0
#define VR_MAX 1023
#define VAL_MIN 0
#define VAL_MAX 4095
#define IS_A_POSITION_ON Easy.POS_A.isOFF()
#define IS_B_POSITION_ON Easy.POS_B.isOFF()
#define ID_NUM 0
#define PWM_MIN 900
#define PWM_MAX 2100
#define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

short position_val;
char RxChar;
short A_stroke_val,B_stroke_val;

void setup() {
  Easy.begin();
  Easy.MightyZap.begin(32);
  Easy.setStep(ID_MAX,0,1023);

  Serial.begin(9600);
  userSerial.begin(9600);
}

void loop() {
  unsigned char MightyZap_actID = ID_NUM;
  A_stroke_val = map(A_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);
  B_stroke_val = map(B_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);
  Sw_Func();
  ExtComData_Listen();
  ExtComData_Func();
}

void Sw_Func(void){
  if(IS_A_POSITION_ON){
    userSerial.write('A');
    Serial.println("'A' Send");
    delay(500);
  }
  else if(IS_B_POSITION_ON){
    userSerial.write('B');
    Serial.println("'B' Send");
    delay(500);
  }
}

void ExtComData_Listen(void){
  if(userSerial.available()>0){
    RxChar = userSerial.read();
  }
}

bool ExtComData_Func(){
  if(RxChar == 'A'){
    position_val = A_stroke_val;
    Serial.println("'A' Recieved");
  }
  else if(RxChar == 'B'){
    position_val = B_stroke_val;
    Serial.println("'B' Recieved");
  }
  Easy.MightyZap.GoalPosition(ID_NUM, position_val);
  Easy.servo_CH1.writeMicroseconds(PWM_VAL);
  delay(10);
}

4.9. 예제 – Mode Selection ​

좌측 Slide Switch(사진의 8번)의 값에 따라 동작할 수 있는 모드를 설정할 수 있는 예제 입니다. [예제] - [IRROBOT_EZController] - [EZ]–[EasyControl _ModeSelect] 선택

4.9.1 사용설명 ​

  • [Basic Function]과 동일하게 슬라이드 스위치 위치에 따라 동작이 다르며 Mode별로 동작을 지정할 수 있습니다.

4.9.2 프로그램 설명 ​

modeSelect```C++ #include <IRROBOT_EZController.h>

#define ID_MAX 11 #define ModeSW_1 Easy.MODE_0.isOFF() #define ModeSW_2 Easy.MODE_1.isOFF() #define ModeSW_3 Easy.MODE_2.isOFF() #define MANUAL_MODE 1 #define POS2_MODE 2 #define TOGGLE_MODE 3 #define EXT_IO_MODE 4 #define EXT_SENSING_MODE 5 #define EXT_COM_MODE 6

IRROBOT_EZController Easy(&Serial1);

void setup() {   Easy.begin();   Easy.MightyZap.begin(32);   Easy.setStep(ID_MAX,0,1023); }

void loop() {   int sw_val;   if(ModeSW_1)sw_val = 1;   else if(ModeSW_2) sw_val = 2;   else if(ModeSW_3) sw_val = 3;   Easy.ModeSelect(MANUAL_MODE,POS2_MODE,TOGGLE_MODE,sw_val);   delay(10); }


- **Mode 정의**

  ```C++
    #define MANUAL_MODE 1
    #define POS2_MODE 2
    #define TOGGLE_MODE 3
    #define EXT_IO_MODE 4
    #define EXT_SENSING_MODE 5
    #define EXT_COM_MODE 6
  • Switch 값 정의

    • Slide Switch 가 하단일 때는 1, 중단일 때는 2, 상단일 때는 3 으로 구분 지어 줍니다.
    • Tester.ModeSelect(int mode1, int mode2. int mode3, int sw); mode1 : sw 값이 1 일 때의 동작 mode 2 : sw 값이 2 일 때의 동작 mode3 : sw 값이 3 일 때의 동작 sw : Slide Switch 에 의해 설정된 Mode 값
    C++
    if(ModeSW_1)sw_val = 1;
    else if(ModeSW_2) sw_val = 2;
    else if(ModeSW_3) sw_val = 3;
    Easy.ModeSelect(MANUAL_MODE,POS2_MODE,TOGGLE_MODE,sw_val);

4.10. 예제 –Stroke Limit ​

좌측 2개의 가변저항으로 Stroke의 Max/Min Limit을 설정할 수 있는 예제 입니다. [예제] - [IRROBOT_EZController] - [EZ]–[EasyControl StrokeLimit] 선택

4.10.1 사용설명 ​

  • 모드 스위치는 어디에 위치시켜도 무방합니다. (기본 내장 프로그램에서만 모드 스위치 동작)
  • 전원 입력 단자(7번)에 사용하고 하는 액츄에이터에 맞는 VCC전원(7.4V or 12V)과 GND를 방향에 맞게 연결합니다.
  • 선택한 통신에 알맞은 커넥터에 방향을 유의하여 삽입해줍니다. (사진의 14번 PWM / 15번 TTL / 16번 RS-485) (PWM 커넥터의 경우 핀맵을 참고하여 극성에 유의하여 삽입하여 주십시오)
  • Stroke의 Max와 Min 지점의 위치를 조절하는 가변저항(사진의 3, 4번)을 시계(-), 반시계(+) 방향으로돌려 동작시킬 지점을 설정합니다. 시계 방향은 수축(short stroke), 반시계 방향은 확장(long stroke) 방향입니다.
  • 중단의 가변 Potentiometer(사진의 17번) 를 조절하여 액츄에이터를 동작시켜 줍니다. 해당 프로그램에선 위치 가변저항 (사진의 3 ,4번)의 설정에 영향을 받으며, Potentiometer를 움직여도 가변저항으로 설정한 구간에서만 위치 제어가 됩니다.

4.10.2 프로그램 설명 ​

strokeLimit```C++ #include <IRROBOT_EZController.h>

#define ID_MAX 11 #define MANUAL_POSITION_VR Easy.VR_1 #define A_POSITION_VR Easy.VR_2 #define B_POSITION_VR Easy.VR_3 #define IS_A_POSITION_ON Easyter.POS_A.isOFF() #define IS_B_POSITION_ON Easy.POS_B.isOFF() #define SW_A Easy.POS_A #define SW_B Easy.POS_B #define VR_MIN 0 #define VR_MAX 1023 #define VAL_MIN 0 #define VAL_MAX 4095 #define ID_NUM 0 #define PWM_MIN 900 #define PWM_MAX 2100 #define PWM_VAL map(position_val,VAL_MIN,VAL_MAX,PWM_MIN,PWM_MAX)

IRROBOT_EZController Easy(&Serial1);

short position_val; bool tg_flag,Sw_status = 1; int sw_cnt = 0;

void setup() {   Easy.begin();   Easy.MightyZap.begin(32);   Easy.setStep(ID_MAX,0,1023); }

void loop() {   unsigned char MightyZap_actID = ID_NUM;   short Manual_position_val,A_stroke_val,B_stroke_val;   int A_stroke_limit, B_stroke_limit, stroke_limit_dir;   int short_stroke_limit,long_stroke_limit;

Manual_position_val  = map(MANUAL_POSITION_VR.read(),VR_MIN,VR_MAX,VAL_MIN,VAL_MAX);     short_stroke_limit = map(A_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);   long_stroke_limit = map(B_POSITION_VR.read(),  VR_MIN, VR_MAX,  VAL_MIN, VAL_MAX);

if(short_stroke_limit>long_stroke_limit)   {     int temp = short_stroke_limit;     short_stroke_limit = long_stroke_limit;     long_stroke_limit = temp;   }

if(Manual_position_val<short_stroke_limit) Manual_position_val = short_stroke_limit;   else if(Manual_position_val>long_stroke_limit) Manual_position_val = long_stroke_limit;   position_val = Manual_position_val;     Easy.MightyZap.GoalPosition(MightyZap_actID,position_val);   Easy.servo_CH1.writeMicroseconds(PWM_VAL);   delay(10); }


- **아날로그 값 Min/Max 설정**
  - 두 개의 아날로그 값을 읽어와 가장 작은 쪽을 Short stroke limit로 큰 쪽을 Long stroke limit로 설정합니다.

  ```C++
    if(short_stroke_limit>long_stroke_limit)
    {
    	int temp = short_stroke_limit;
    	short_stroke_limit = long_stroke_limit;
    	long_stroke_limit = temp;
    }
  • Position Limit 값 설정

    • 가변 Potentiometer 의 값이 설정한 범위를 벗어나지 못하도록 값 판별
    C++
      if(Manual_position_val<short_stroke_limit) Manual_position_val = short_stroke_limit;
      else if(Manual_position_val>long_stroke_limit) Manual_position_val = long_stroke_limit;
      position_val = Manual_position_val;