- 회로도
- 서보 모터 제어를 위해 GPIO 핀에서 PWM 신호 생성
- 로봇 팔을위한 프로그래밍 PIC16F8771A
- PIC 로봇 팔 코드 시뮬레이션
- EasyEDA를 사용한 PCB 설계
- 온라인으로 샘플 계산 및 주문
- PIC 로봇 팔의 작동
자동차 제조 산업의 조립 라인에서 우주의 원격 수술 로봇에 이르기까지 Robotic Arms는 어디에나 있습니다. 이러한 로봇의 메커니즘은 유사한 기능과 향상된 기능을 위해 프로그래밍 할 수있는 인간과 유사합니다. 인간보다 빠르고 정확하게 반복 작업을 수행하는 데 사용할 수 있으며, 인명을 위험에 빠뜨리지 않고 열악한 환경에서 사용할 수 있습니다. 우리는 이미 특정 작업을 수행하도록 훈련되고 영원히 반복되도록 할 수있는 Arduino를 사용하여 Record and Play Robotic Arm을 구축했습니다.
이 자습서에서는 산업 표준 PIC16F877A 8 비트 마이크로 컨트롤러를 사용하여 전위차계로 동일한 로봇 팔을 제어합니다. 이 프로젝트의 과제는 PIC16F877A에 PWN 가능 핀이 두 개뿐이라는 것입니다.하지만 5 개의 개별 PWM 핀이 필요한 로봇을 위해 약 5 개의 서보 모터를 제어해야합니다. 따라서 GPIO 핀을 활용하고 타이머 인터럽트를 사용하여 PIC GPIO 핀에서 PWM 신호를 생성해야합니다. 이제 물론 우리는 더 나은 마이크로 컨트롤러로 업그레이드하거나 디멀티플렉서 IC를 사용하여 여기서 일을 훨씬 쉽게 할 수 있습니다. 그러나 여전히이 프로젝트를 학습 경험을 위해 시도해 볼 가치가 있습니다.
이 프로젝트에서 사용하고있는 로봇 팔의 기계 구조는 이전 프로젝트에서 완전히 3D 프린팅되었습니다. 여기에서 전체 설계 파일과 조립 절차를 찾을 수 있습니다. 또는 3D 프린터가없는 경우 링크에 표시된대로 판지를 사용하여 간단한 로봇 팔을 만들 수도 있습니다. 어떻게 든 로봇 팔을 잡았다 고 가정하면 프로젝트를 진행할 수 있습니다.
회로도
이 PIC 마이크로 컨트롤러 기반 로봇 암 의 전체 회로 다이어그램 은 다음과 같습니다. 회로도는 EasyEDA를 사용하여 그려졌습니다.
회로도는 매우 간단합니다. 전체 프로젝트는 12V 어댑터로 전원이 공급됩니다. 이 12V는 2 개의 7805 전압 조정기를 사용하여 + 5V로 변환됩니다. 하나는 + 5V로 표시되고 다른 하나는 + 5V (2)로 표시됩니다. 두 개의 레귤레이터가있는 이유는 서보가 회전 할 때 전압 강하를 생성하는 많은 전류를 끌어 들이기 때문입니다. 이 전압 강하는 PIC가 자체적으로 다시 시작되도록하므로 동일한 + 5V 레일에서 PIC와 서보 모터를 모두 작동 할 수 없습니다. 따라서 + 5V로 표시된 것은 PIC 마이크로 컨트롤러, LCD 및 전위차계에 전원을 공급하는 데 사용되며 + 5V (2)로 표시된 별도의 레귤레이터 출력은 서보 모터에 전원을 공급하는 데 사용됩니다.
0V ~ 5V의 가변 전압을 제공하는 전위차계의 5 개 출력 핀은 PIC의 아날로그 핀 An0 ~ AN4에 연결됩니다. 타이머를 사용하여 PWM을 생성 할 계획이므로 서보 모터는 모든 GPIO 핀에 연결할 수 있습니다. 서보 모터 용으로 RD2에서 RD6까지의 핀을 선택했지만 원하는 GPIO가 될 수 있습니다.
이 프로그램에는 많은 디버깅이 포함되므로 16x2 LCD 디스플레이도 PIC의 포트 B에 연결됩니다. 제어중인 서보 모터의 듀티 사이클이 표시됩니다. 이 외에도 향후 센서를 인터페이스해야하는 경우를 대비하여 모든 GPIO 및 아날로그 핀에 대한 연결을 확장했습니다. 마지막으로 ICSP 프로그래밍 옵션을 사용하여 pickit3로 PIC를 직접 프로그래밍하기 위해 프로그래머 핀 H1을 연결했습니다.
서보 모터 제어를 위해 GPIO 핀에서 PWM 신호 생성
회로가 준비되면 서보 모터를 제어하기 위해 PIC의 GPIO 핀에서 PWN 신호를 생성하는 방법을 알아 내야합니다. 우리는 이미 Timer 인터럽트 방법을 사용하여 비슷한 것을 지 쳤고 성공했습니다. 여기서 우리는 그 위에 빌드 할 것이므로 여기에서 처음 인 경우 계속 진행하기 전에이 이전 자습서를 읽는 것이 좋습니다.
모든 취미 서보 모터 는 50Hz의 주파수로 작동합니다. 서보 모터의 완전한 펄스 사이클 하나는 20ms 인 1/50 (F = 1 / T)입니다. 이 완전한 20ms 중 제어 신호는 0 ~ 2ms이고 나머지 신호는 항상 꺼져 있습니다. 아래 그림은 총 20ms 기간의 0도에서 180도까지 모터를 회전시키기 위해 ON 시간이 0에서 2ms까지만 변하는 방법을 보여줍니다.
이를 염두에두고 PIC가 전위차계에서 0 ~ 1204를 읽고 서보 모터의 듀티 사이클이 될 0 ~ 100에 매핑하는 방식으로 프로그램을 작성해야합니다. 이 듀티 사이클을 사용하여 서보 모터의 ON 시간을 계산할 수 있습니다. 그런 다음 Arduino의 millis () 함수와 유사하게 작동하도록 일정한 간격으로 오버플로되도록 타이머 인터럽트를 초기화 할 수 있습니다. 이를 통해 상태 GPIO 핀을 원하는 기간 동안 하이로 전환하고 20ms (한 번의 완전한 사이클) 후에 끄고 동일한 프로세스를 반복 할 수 있습니다. 이제 논리를 이해 했으므로 프로그램을 시작하겠습니다.
로봇 팔을위한 프로그래밍 PIC16F8771A
항상 비디오 가 포함 된 전체 프로그램 은이 페이지 끝에서 찾을 수 있으며 필요한 모든 파일과 함께 여기에서 코드를 다운로드 할 수도 있습니다. 이 섹션에서는 프로그램의 논리에 대해 설명합니다. 이 프로그램은 ADC 모듈, 타이머 모듈 및 LCD 모듈을 사용하여 로봇 암을 제어합니다. ADC 기능 또는 타이머 기능을 사용하거나 LCD를 PIC와 인터페이스하는 방법을 모르면 해당 링크로 돌아가서 배울 수 있습니다. 아래 설명은 독자가 이러한 개념에 익숙하다고 가정합니다.
타이머 0 포트 구성
코드에서 가장 중요한 부분 은 Timer 0을 모든 특정 지연에 대해 오버 플로우로 설정하는 것 입니다. 이 지연을 계산하는 공식은 다음과 같이 주어질 수 있습니다.
지연 = ((256-REG_val) * (Prescal * 4)) / Fosc
OPTION_REG 및 TMR0 레지스터를 사용하여 32의 프리 스칼라 값으로 작동하도록 Timer 0을 설정하고 REG 값은 248로 설정했습니다. 하드웨어에서 사용되는 수정 주파수 (Fosc)는 20Mhz입니다. 이 값으로 지연은 다음과 같이 계산할 수 있습니다.
지연 = ((256-248) * (32 * 4)) / (20000000) = 0.0000512 초 (또는) = 0.05msec
이제 0.05ms마다 오버플로되도록 타이머를 설정했습니다. 동일한 작업을 수행하는 코드는 다음과 같습니다.
/ ***** 타이머 용 포트 구성 ****** / OPTION_REG = 0b00000100; // 외부 주파수와 32를 프리 스칼라로 사용하는 Timer0 // PULL UP도 활성화합니다 . TMR0 = 248; // 0.0001s의 시간 값을로드합니다. delayValue는 0-256 사이 일 수 있습니다 . TMR0IE = 1; // PIE1 레지스터에서 타이머 인터럽트 비트 활성화 GIE = 1; // 글로벌 인터럽트 활성화 PEIE = 1; // 주변 장치 인터럽트 활성화 / *********** ______ *********** /
서보 모터의 총 0ms ~ 2ms 제어 창 중에서 0.05msec의 분해능으로 제어 할 수 있으며, 이는 0도에서 180도 사이의 모터에 대해 (2 / 0.05) 40 개의 다른 위치를 가질 수 있습니다. MCU가 더 많은 위치와 정확한 제어를 위해 지원할 수 있다면이 값을 더 줄일 수 있습니다.
ISR (인터럽트 서비스 루틴)
타이머 0이 0.05ms마다 오버 플로우로 설정되었으므로 TMR0IF 인터럽트 플래그를 0.05ms로 설정합니다. 따라서 ISR 함수 내에서 해당 플래그를 재설정하고 count라는 변수 를 1 씩 증가시킬 수 있습니다. 이제이 변수는 0.05ms마다 1 씩 증가합니다.
void interrupt timer_isr () { if (TMR0IF == 1) // 타이머 오버플로로 인해 타이머 플래그가 트리거되었습니다-> 0.05ms마다 오버플로로 설정 { TMR0 = 248; // 타이머 값로드 TMR0IF = 0; // 타이머 인터럽트 플래그를 지 웁니다. ++; //0.05ms마다 1 씩 증가 }
듀티 사이클 및 작동 시간 계산
다음으로 5 개의 서보 모터 모두에 대한 듀티 사이클과 시간을 계산해야합니다. 우리는 각각 팔의 개별 섹션을 제어하는 데 사용되는 5 개의 서보 모터를 가지고 있습니다. 그래서 우리는 5 개의 ADC 값을 모두 읽고 각각의 듀티 사이클과 시간을 계산해야합니다.
ADC 값의 범위는 0 ~ 1024이며, 얻은 값에 0.0976 (100/1024 = 0.0976)을 간단히 곱하여 0 % ~ 100 % 듀티 사이클로 변환 할 수 있습니다. 이 0-100 % 듀티 사이클은 ON 시간으로 변환되어야합니다. 100 % 듀티 사이클에서 ON 시간은 2ms (180도) 여야하므로 0.02 (2/100 = 0.02)를 곱하면 0 ~ 100 듀티 사이클이 0 ~ 2ms로 변환됩니다. 그러나 타이머 변수 수는 0.05ms마다 한 번씩 증가하도록 설정됩니다. 즉, 1ms마다 카운트 값이 20 (1 / 0.05 = 20)이됩니다. 따라서 프로그램의 정확한 정시를 계산하려면 20에 0.02를 곱해야합니다. 그러면 0.4 (0.02 * 20 = 0.4) 값이됩니다. 동일한 코드는 아래에 나와 있습니다. for 루프를 사용하여 5 개 포트 모두에 대해 5 번 반복되는 것을 볼 수 있습니다. 결과 값은 T_ON 배열에 저장됩니다.
for (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // ADC를 사용하여 POT 값 읽기 Duty_cycle = (POT_val * 0.0976); // 0 ~ 1024 ~ 0 ~ 100 매핑 T_ON = Duty_cycle * 0.4; // 20 * 0.02
회전 할 모터 선택
ISR 코드가 무거워 져 전체 마이크로 컨트롤러의 속도를 늦출 수 있으므로 5 개의 모터를 모두 제어 할 수는 없습니다. 따라서 한 번에 하나의 서보 모터 만 회전해야합니다. 회전 할 서보를 선택하기 위해 마이크로 컨트롤러는 5 개의 서보 모터 모두의 ON 시간을 모니터링하고 이전 시간과 비교합니다. ON 시간이 변경되면 특정 서보를 이동해야한다고 결론을 내릴 수 있습니다. 동일한 코드는 다음과 같습니다.
if (T_ON! = Pev_val) { Lcd_Clear (); 서보 = pot_num; Lcd_Set_Cursor (2,11); Lcd_Print_String ("S:"); Lcd_Print_Char (servo + '0'); if (pot_num == 0) {Lcd_Set_Cursor (1,1); Lcd_Print_String ("A:");} else if (pot_num == 1) {Lcd_Set_Cursor (1,6); Lcd_Print_String ("B:");} else if (pot_num == 2) {Lcd_Set_Cursor (1,11); Lcd_Print_String ("C:");} else if (pot_num == 3) {Lcd_Set_Cursor (2,1); Lcd_Print_String ("D:");} else if (pot_num == 4) {Lcd_Set_Cursor (2,6); Lcd_Print_String ("E:");} char d2 = (Duty_cycle) % 10; char d1 = (Duty_cycle / 10) % 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
또한 사용자가 현재 위치를 알 수 있도록 LCD 화면에 서보 듀티 사이클을 인쇄합니다. ON 시간의 변화에 따라 가변 서보는 각각 개별 모터를 나타내는 0에서 4까지의 숫자로 업데이트됩니다.
ISR 내부의 서보 모터 제어
ISR 내부에는 0.05ms마다 증가하는 변수 수가 있습니다. 이것은 1ms마다 변수가 20 씩 증가한다는 것을 의미합니다.이를 사용하여 PWM 신호를 생성하기 위해 핀을 제어해야합니다. 카운트 값이 on 시간보다 작 으면 아래 라인을 사용하여 해당 모터의 GPIO를 켭니다.
PORTD = PORTD-servo_code;
여기서 servo_code 배열에는 5 개의 서보 모터 모두의 핀 세부 정보가 있으며 가변 서보의 값에 따라 해당 특정 서보 모터의 코드가 사용됩니다. 그런 다음 기존 PORTD 비트와 논리적으로 OR (-)되어 다른 모터의 값을 방해하지 않고이 특정 모터 만 업데이트합니다. 핀을 끄는 것과 유사합니다.
PORTD = PORTD & ~ (servo_code);
논리 역 (~) 연산자를 사용하여 비트 값을 반전 한 다음 PORTD에서 AND (&) 연산을 수행하여 원하는 핀만 끄고 다른 핀은 이전 상태로 둡니다. 전체 코드 스 니펫은 다음과 같습니다.
void interrupt timer_isr () { if (TMR0IF == 1) // 타이머 오버플로로 인해 타이머 플래그가 트리거되었습니다.-> 0.05ms마다 오버플로로 설정 { TMR0 = 248; // 타이머 값로드 TMR0IF = 0; // 타이머 인터럽트 플래그를 지 웁니다. ++; //0.05ms마다 1 씩 증가-> 1ms마다 20 (0.05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; if (count> = 20 * 20) count = 0; if (count <= (T_ON)) PORTD = PORTD-servo_code; else PORTD = PORTD & ~ (servo_code); }
GPIO 핀이 다시 켜지 기 전에 총주기가 20ms 동안 지속되어야한다는 것을 알고 있습니다. 따라서 카운트 값을 400 (위에서 설명한 것과 동일한 계산)과 비교하여 카운트가 20ms를 초과했는지 확인하고, 그렇다면 카운트를 다시 0으로 초기화해야합니다.
PIC 로봇 팔 코드 시뮬레이션
실제 하드웨어로 가져 오기 전에 코드를 시뮬레이션하는 것이 항상 좋습니다. 그래서 Proteus를 사용하여 코드를 시뮬레이션하고 올바르게 작동하는지 확인했습니다. 시뮬레이션에 사용 된 회로는 다음과 같습니다. 오실로스코프를 사용하여 PWM 신호가 필요에 따라 생성되고 있는지 확인했습니다. 또한 LCD 및 서보 모터가 예상대로 회전하는지 확인할 수 있습니다.
보시다시피 LCD는 세 번째 모터 인 pot 값을 기준으로 모터 D의 듀티 사이클을 07로 표시합니다. 다른 포트를 이동하면 마찬가지로 해당 포트의 듀티 사이클과 모터 번호가 LCD에 표시됩니다. 오실로스코프에 표시된 PWM 신호는 다음과 같습니다.
총 사이클주기는 오실로스코프의 커서 옵션을 사용하여 22.2ms로 측정되며 이는 원하는 20ms에 매우 가깝습니다. 마지막으로 우리는 코드가 작동하는지 확인하므로 회로를 계속하기 위해 성능 보드에 납땜하거나 PCB를 사용할 수 있습니다. POT는 연결 상태가 좋지 않아 항상 문제를 일으키는 경향이 있기 때문에 브레드 보드에서 쉽게 작동하지 않습니다.
EasyEDA를 사용한 PCB 설계
이 PIC Robotic Arm 을 설계하기 위해 EasyEDA라는 온라인 EDA 도구를 선택했습니다. 나는 오랫동안 그것을 사용하고 있으며 방대한 풋 프린트와 사용하기 쉬운 자연 때문에 매우 편리하다는 것을 알았습니다. PCB를 설계 한 후 저렴한 PCB 제조 서비스를 통해 PCB 샘플을 주문할 수 있습니다. 또한 전자 부품 재고가 많고 사용자가 PCB 주문과 함께 필요한 부품을 주문할 수있는 부품 소싱 서비스를 제공합니다.
회로 및 PCB를 설계하는 동안 다른 사용자가 복사 또는 편집하고 작업의 이점을 얻을 수 있도록 회로 및 PCB 설계를 공개 할 수도 있습니다. 또한이 회로에 대해 전체 회로 및 PCB 레이아웃을 공개했습니다. 아래 링크:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
이 링크를 사용하면이 프로젝트에서 사용하는 것과 동일한 PCB를 직접 주문하여 사용할 수 있습니다. 설계가 완료되면 보드를 3D 모델 로 볼 수 있으며, 이는 제작 후 보드가 어떻게 나타나는지 시각화하는 데 매우 유용합니다. 우리가 사용하고있는 보드의 3D 모델은 아래와 같습니다. 이 외에도 보드의 상단 및 하단 레이어를보고 매끄러운 화면이 예상대로인지 확인할 수 있습니다.
온라인으로 샘플 계산 및 주문
이 PIC 로봇 PCB 의 설계를 완료 한 후 JLCPCB.com을 통해 PCB를 주문할 수 있습니다. JLCPCB에서 PCB를 주문하려면 Gerber File이 필요합니다. PCB의 Gerber 파일을 다운로드하려면 EasyEDA 편집기 페이지 에서 Generate Fabrication File 버튼을 클릭 한 다음 거기에서 Gerber 파일을 다운로드하거나 아래 이미지와 같이 JLCPCB 에서 주문을 클릭 할 수 있습니다. 그러면 아래에 표시된 스냅 샷과 같이 주문하려는 PCB 수, 필요한 구리 레이어 수, PCB 두께, 구리 무게 및 PCB 색상을 선택할 수있는 JLCPCB.com으로 리디렉션됩니다.
모든 옵션을 선택한 후 "장바구니에 저장"을 클릭하면 EasyEDA에서 다운로드 한 Gerber 파일을 업로드 할 수있는 페이지로 이동합니다. Gerber 파일을 업로드하고 "장바구니에 저장"을 클릭하십시오. 마지막으로 Checkout Securely를 클릭하여 주문을 완료하면 며칠 후 PCB를 받게됩니다. 그들은 $ 2의 매우 낮은 비율로 PCB를 제작하고 있습니다. 그들의 빌드 시간은 또한 3-5 일의 DHL 배송으로 48 시간 인 매우 적습니다. 기본적으로 주문 후 일주일 이내에 PCB를 받게됩니다.
PCB 주문 후 날짜와 시간으로 PCB 생산 진행 상황 을 확인할 수 있습니다. 계정 페이지로 이동하여 "생산 진행률"을 클릭하여 확인합니다.
PCB를 주문한 후 며칠 후 아래 그림과 같이 멋진 포장재로 PCB 샘플을 얻었습니다.
그리고이 조각들을 얻은 후 PCB 위에 필요한 모든 구성 요소를 납땜했습니다. 또한 연결 와이어를 사용하는 대신 POT를 직접 납땜했습니다. 처음에 사용한 암-암 와이어는 접점이 느슨하여 이상한 아날로그 출력 전압을 제공하는 곳 이었기 때문입니다. 모든 구성 요소가 조립되면 내 PCB는 다음과 같이 보입니다.
이 보드에 7805가 하나만 있다는 것을 눈치 챘을 것입니다. 처음에는 PIC와 서보 모터 모두에 전원을 공급하기 위해 레귤레이터만으로도 벗어날 수 있다고 생각했고 나중에 두 개가 필요하다는 것을 깨달았 기 때문입니다. 그래서 저는 외부 회로를 사용하여 여기 보이는 녹색 와이어를 통해 서보 모터에 전원을 공급했습니다.
그럼에도 불구하고 당신은 그것에 대해 많이 걱정할 필요가 없습니다. 이제 PCB를 변경했습니다. 수정 된 PCB를 사용하고 보드 자체의 두 조정기를 납땜 할 수 있습니다.
PIC 로봇 팔의 작동
모든 피곤한 작업이 끝나면 갚을 시간입니다. 보드의 모든 구성 요소를 납땜하고 프로그램을 PIC 컨트롤러에 업로드합니다. 전체 코드는 아래에 제공되거나 여기에서 다운로드 할 수 있습니다. 보드에 제공된 프로그래밍 커넥터는 별다른 번거 로움없이 Pickit 3을 사용하여 프로그램을 직접 업로드 할 수 있도록 도와줍니다. 프로그램이 업로드되면 현재 제어중인 서보를 표시하는 LCD가 표시됩니다. PIC 마이크로 컨트롤러 프로그래밍에 대해 자세히 알아 보려면 이전 튜토리얼을 따르십시오.
거기에서 냄비를 돌리고 서보 모터가 각 전위차계에 어떻게 반응하는지 확인할 수 있습니다. 형식을 이해하면 로봇 팔을 제어하여 수행하고 즐기기 위해 필요한 모든 작업을 수행 할 수 있습니다. 아래 링크 된 비디오에서 프로젝트의 전체 작업을 찾을 수 있습니다.
그것은 여러분이 프로젝트를 이해하고 새로운 것을 배웠기를 바랍니다. 질문이 있으시면 댓글 섹션에 남겨 두거나 다른 기술 토론을 위해 포럼을 사용하십시오.