이 튜토리얼에서는 아두이노 기반 SCARA 로봇을 만드는 방법을 배워보겠습니다. 로봇 설계부터 제어를 위한 자체 그래픽 사용자 인터페이스 개발까지 전체 제작 과정을 보여드리겠습니다.
아래 영상을 시청하거나 작성된 튜토리얼을 읽어보세요.
개요
로봇은 4자유도를 가지며 4개의 NEMA 17 스테퍼 모터로 구동됩니다. 또한 엔드 이펙터(이 경우 로봇 그리퍼) 제어를 위한 작은 서보 모터도 있습니다. 이 SCARA 로봇의 두뇌는 아두이노 우노 보드로, CNC 쉴드와 네 개의 A4988 스테퍼 드라이버와 짝을 이뤄 모터들을 제어합니다.
Processing 개발 환경을 사용해 순기구학과 역기구학 제어를 모두 갖춘 그래픽 사용자 인터페이스를 만들었습니다. 순기구학으로는 각 로봇 관절을 수동으로 움직여 원하는 위치를 얻을 수 있습니다. 왼쪽 슬라이더들로 각 관절 각도를 설정할 수 있습니다. 엔드 이펙터의 최종 위치인 X, Y, Z 값은 계산되어 화면 오른쪽에 표시됩니다.
반면 역기구학으로는 엔드 이펙터의 원하는 위치를 설정하면 프로그램이 로봇이 그 위치에 도달하기 위한 각 관절 각도를 자동 계산합니다.
실제로 같은 화면에서 두 방법을 동시에 사용할 수 있도록 프로그램을 만들었습니다. 관절 각도들과 엔드 이펙터의 X, Y, Z 값들이 연결되어 항상 화면에 표시됩니다.
물론 로봇은 자동으로도 작동할 수 있습니다. 프로그램의 "Save" 버튼으로 로봇의 각 움직임이나 위치를 저장할 수 있습니다. 그런 다음 "Run" 버튼을 누르면 로봇이 저장된 움직임들을 첫 번째부터 마지막까지 반복 실행합니다. 사용자 인터페이스에서 이동 속도와 가속도도 조절할 수 있습니다.
SCARA 로봇 3D 모델
먼저 3D 모델을 살펴보겠습니다.
이 SCARA 로봇을 3DEXPERIENCE SOLIDWORKS로 설계했는데, 이 또한 이 영상의 후원사입니다.
3 3DEXPERIENCE SOLIDWORKS는 기본적으로 3DEXPERIENCE 플랫폼을 통해 클라우드 기능을 갖춘 SOLIDWORKS입니다. 모든 것이 클라우드를 통해 작동하므로 귀하나 팀의 누구나 언제 어디서나 데이터나 모델에 접근할 수 있습니다. 3DEXPERIENCE 플랫폼에는 많은 유용한 생산성 및 관리 앱들도 포함되어 있습니다.
예를 들어, Project Planner는 작업 구성, 마감일 설정, 진행 상황 추적에 좋은 방법입니다. 3D Markup 앱으로는 노트북, 태블릿, 심지어 스마트폰 같은 어떤 기기에서든 모델을 보고 탐색하고 메모할 수 있습니다.
브라우저 내에서 실행되는 별도의 클라우드 기반 3D 모델러인 SOLIDWORKS xDesign도 있습니다. Solidworks와 함께 사용하거나 단독으로 사용할 수 있으며 언제 어디서나 어떤 기기에서든 모델링하기에 좋습니다.
이런 교육 콘텐츠를 후원해준 Solidworks에 큰 감사를 드립니다. SOLIDWORKS와 3DEXPERIENCE 플랫폼이 귀하에게 맞는지 알고 싶다면 아래 링크를 확인하세요.
무료 3DEXPERIENCE 체험 (특별 링크): www.solidworks.com/HTMTryNow
3DEXPERIENCE SOLIDWORKS 더 알아보기: www.solidworks.com/HTMLearnMore
자, 모델로 돌아가 이 설계를 어떻게 구상했는지 설명하겠습니다. 로봇 목표는 대부분의 부품을 3D 프린팅할 수 있게 하는 것이었습니다. 여기 보이는 모든 것을 작은 프린팅 베드의 3D 프린터에서도 프린팅할 수 있습니다. GT2 풀리들도 3D 프린팅 가능합니다. 매개변수 설계로 만들었으므로 필요시 크기를 쉽게 변경할 수 있습니다. 치아 수만 변경하면 모든 치수가 자동 업데이트되어 풀리 적정 크기가 됩니다.
첫 번째 관절에는 이 커스텀 설계 풀리들로 2단계에 걸쳐 20:1 감속비를 달성했습니다. 여기서 사용하는 두 GT2 벨트는 200mm와 300mm 길이의 폐루프입니다. 로봇 관절들은 두 개의 스러스트 베어링과 하나의 레이디얼 베어링으로 구성됩니다.
두 번째 관절에는 같은 방식으로 16:1 감속비를, 세 번째 관절에는 단일 단계 감속으로 4:1 감속비를 가집니다. 관절들은 속이 비어 있어 모터들과 마이크로 스위치들의 와이어들을 통과시킬 수 있습니다. 각 벨트마다 텐셔닝용 아이들러 풀리를 부착할 수 있는 슬롯들이 있습니다.
로봇 그리퍼는 MG996R 서보 모터로 구동되며 그리퍼 엔드들을 쉽게 교체해 다양한 그립 크기를 구현할 수 있습니다. 로봇 Z축은 8mm 리드 스크루로 구동되며, 전체 암 어셈블리는 네 개의 10mm 매끄러운 봉과 리니어 볼 베어링으로 슬라이드합니다. 로봇 높이는 매끄러운 봉 길이에 따라 달라지는데, 이 경우 40cm입니다. 리드 스크루는 이 구성에 맞게 2cm 짧아야 하거나, 그렇지 않으면 스페이서 너트로 Z 모터를 2cm 높여야 합니다.
Thangs에서 이 3D 모델을 찾고 다운로드하거나 브라우저에서 탐색할 수 있습니다:
Thangs에서 어셈블리 3D 모델 다운로드.
3D 프린팅용 STL 파일:
로봇 부품 3D 프린팅
자, 이제 부품 3D 프린팅으로 넘어가겠습니다. 제 Creality CR-10 3D 프린터로 모든 부품을 프린팅했는데, 저렴한 가격에 정말 훌륭한 3D 프린터입니다. 앞서 말했듯 부품들은 작은 3D 프린터(예: Ender3)에도 맞도록 설계되었습니다.
대부분 부품에는 PLA+ 소재(파란색)를, 풀리와 그리퍼에는 일반 PLA를 사용했습니다. 60mm/s 프린팅 속도로 모든 부품 프린팅에 약 120시간 걸렸습니다. 베이스가 가장 큰 부품으로 약 32시간 걸렸습니다. 하지만 프린팅 속도를 높이면 더 빠르게 프린팅할 수 있습니다.
참고: 초보자와 메이커를 위한 최고의 3D 프린터 [2021 업데이트]
여기 모든 3D 프린팅된 부품들입니다.
여기서 잠깐, 슬라이싱 소프트웨어에서 Horizontal Expansion -0.1mm를 활성화해 모두 프린팅했습니다. 이는 부품들이 더 정확한 치수를 가지게 하고 베어링, 봉, 볼트 같은 다른 기계 부품들과 더 잘 맞게 합니다.
로봇 조립하기
이 아두이노 기반 SCARA 로봇 조립에 필요한 구성품 목록입니다. 전자 부품 목록은 아래 회로도 섹션에서 확인할 수 있습니다.
4x 매끄러운 봉 샤프트 – 10mm 400mm……… 아마존 / 뱅굿 / 알리익스프레스
1x 리드 스크루 – 8mm 400mm ………………… 아마존 / 뱅굿 / 알리익스프레스
4x 리니어 베어링 10mm …………………..……. 아마존 / 뱅굿 / 알리익스프레스
1x 스러스트 볼 베어링 40x60x13mm …..… 아마존 / 알리익스프레스
2x 스러스트 볼 베어링 35x52x12mm …..… 아마존 / 알리익스프레스
5x 레이디얼 볼 베어링 8x22x7mm ……………. 아마존 / 뱅굿 / 알리익스프레스
다양한 길이 M3, M4, M5 볼트와 너트
이 프로젝트에 필요한 볼트 크기들:
베이스부터 조립을 시작합니다. 여기서는 안지름 35mm, 바깥지름 47mm의 레이디얼 볼 베어링을 먼저 끼웁니다.
그 다음 안지름 40mm, 바깥지름 60mm의 첫 번째 스러스트 베어링이 들어갑니다. 이 베어링은 풀리와 베이스 사이에 위치합니다.
베이스 반대쪽에는 같은 크기의 또 다른 스러스트 베어링과 조인트 커플러를 사용합니다.
그런 다음 55mm 길이의 M4 볼트 네 개로 풀리와 상부 부분을 결합합니다. 관절이 견고하면서도 자유롭게 회전할 수 있도록 셀프락 너트를 사용하고 적절히 조입니다.
다음으로 중간 풀리를 설치해야 합니다. 이 풀리는 300mm GT2 벨트로 조인트 풀리와 짝을 이룹니다. 이 풀리 설치를 위해 베이스 상단과 하단에 608 볼 베어링 하나씩을 사용합니다. 그런 다음 45mm M8 볼트, 와셔, 셀프락 너트로 풀리를 고정합니다.
다음으로 이 관절용 스테퍼 모터를 설치합니다. 스테퍼는 200mm 벨트로 중간 풀리와 짝을 이룹니다. 베이스 고정을 위해 네 개의 M3 볼트가 필요합니다.
볼트 조이기 전에 벨트를 최대한 팽팽하게 당겨야 합니다. 여기서 잠깐, 중간 풀리용 M8 볼트 헤드를 아래쪽으로 향하게 교체해 베이스 내부에 들어가게 했습니다.
이 시점에서 벨트들이 충분히 팽팽한지 확인해야 합니다. 그렇지 않다면 아이들러 풀리들로 더 팽팽하게 조일 수 있습니다. 여기서는 35mm M5 볼트와 너트들로 텐셔닝 풀리를 만들었습니다.
이것을 벨트 양쪽 슬롯에 부착해 원하는 만큼 벨트를 팽팽하게 조일 수 있습니다. 양쪽 벨트 모두 팽팽하게 조였습니다. 이로써 첫 번째 관절이 완성되었습니다.
이 관절용 마이크로 스위치 설치를 진행했습니다. 여기가 좀 타이트해 나중에 하기 어려우니 미리 선들을 납땜해두고 고정했습니다. 20mm M3 볼트와 너트로 마이크로 스위치를 고정합니다.
조인트 커플러가 스위치 바로 옆을 지나가서 스위크 고정에 볼트 하나만 사용했습니다. 다른 구멍에는 짧은 볼트를 끼워 아래쪽에 본드로 붙였습니다. 이렇게 하면 스위치가 충분히 고정되고 제대로 작동합니다.
자, 이제 Z축 조립으로 넘어갑니다. 먼저 조인트 커플러 위에 Z축 하단 플레이트 부품을 고정합니다.
그 위에 매끄러운 봉용 네 개의 클램프를 고정합니다. 그런 다음 매끄러운 봉들을 제자리에 끼웁니다. 타이트하게 맞아야 하며 조인트 커플러 부품까지 끝까지 내려가야 합니다. 클램프로 M4 볼트와 너트로 봉들을 조입니다.
이 시점에서 리드 스크루용 베어링을 끼워야 합니다. 이 섹션을 마무리하기 위해 모든 것을 숨기고 로봇에 더 깔끔한 모습을 주는 심플한 커버를 슬라이드해 끼웁니다.
다음으로 로봇 첫 번째 팔을 조립합니다. 팔은 두 부분이 볼트로 결합된 구조입니다. 첫 번째 부분은 매끄러운 봉들을 통과할 리니어 베어링들을 설치하는 곳입니다. 이들을 제자리에 끼우는 게 좀 어려울 수 있는데, 꽤 타이트하게 맞기 때문입니다.
사실 이는 프린터가 부품들을 얼마나 정확하게 프린팅하느냐에 달려 있습니다. 따라서 부품 프린팅 시 Horizontal Expansion 기능을 사용하고 프린터에 맞게 조정하는 것을 추천합니다. 제 경우 두 베어링이 끝까지 내려가지 않았는데 큰 문제는 아닙니다.
좋습니다, 이제 팔의 두 부분을 결합합니다. 이를 위해 25mm M5 볼트 네 개를 사용합니다.
다음으로 두 번째 스테퍼 모터를 설치합니다. 여기서는 20개 치아의 3D 프린팅 GT2 풀리를 사용했습니다. 앞서 언급한 매개변수 설계로 만들었고 꽤 잘 작동합니다. 여기서 리드 스크루 너트도 제자리에 고정해야 합니다.
다음으로 두 번째 관절용 벨트들과 풀리들을 설치합니다. 여기서는 400mm와 300mm 길이의 벨트 하나씩이 필요합니다. 설치 절차는 첫 번째 관절에서 설명한 것과 거의 같습니다.
여기서 두 번째와 세 번째 관절에는 첫 번째보다 작은 베어링들을 사용합니다. 레이디얼 볼 베어링은 안지름 30mm, 바깥지름 42mm이고, 스러스트 베어링은 안지름 35mm, 바깥지름 52mm입니다.
두 번째 조인트 커플러 설치 전에 육각 슬롯에 20mm M4 볼트 여섯 개를 끼워야 합니다.
이것들은 두 번째 팔을 조인트에 부착하는 역할을 합니다. 필요시 앞서 설명한 아이들러 풀리 방식으로 벨트 텐션을 조절할 수 있습니다. 마지막으로 두 번째 마이크로 스위치를 제자리에 고정하면 1번 팔 어셈블리가 완성됩니다.
조인트 커플러에 미리 설치해둔 볼트들을 사용해 두 번째 팔을 조인트 커플러에 부착했습니다.
이 시점에서 관절들에 얼마나 백래시가 있는지 테스트해보고 싶었습니다. 벨트 때문에 약간 백래시가 있을 거라 예상했지만, 실제로는 관절 두 부품 사이에 훨씬 더 많은 유격이 있었습니다. 볼트가 들어가는 구멍들이 볼트 자체보다 약간 더 크다는 것이 문제였습니다. 이 문제를 해결하려면 볼트와 구멍 사이에 더 타이트한 핏이 필요합니다.
제 경우 4.5mm 드릴로 구멍을 넓히고 M4 볼트 대신 M5 볼트로 두 관절 부품을 고정했습니다. 하지만 3D 모델을 업데이트해 구멍을 3.5mm로 만들었으므로 M4 볼트로 이 두 부분을 결합할 수 있습니다. 첫 번째 관절에도 같은 작업을 했습니다. 이제 관절 유격은 벨트에서 오는 약간의 백래시를 제외하고 거의 사라졌습니다.
자, 이제 두 번째 팔 조립을 계속합니다. 여기서는 세 번째 관절용 스테퍼 모터를 먼저 설치합니다.
이 경우 팔이 좀 더 가볍도록 더 작은 스테퍼 모터를 사용합니다. 여전히 NEMA 17이지만 길이가 24cm로 더 짧습니다.
세 번째 관절용 벨트와 풀리 설치 절차는 다시 거의 같지만, 여기서는 400mm 벨트 하나로 단일 단계 감속만 사용합니다. 이 하부 팔을 상부 팔에 결합하기 전에 모터와 마이크로 스위치를 연결하고 선들을 두 번째 관절로 통과시킵니다.
이 시점에서 엔드 이펙터용 와이어들도 삽입해야 합니다. 제 경우 3선 필요한 그리퍼용 서보 모터 구동을 위해 스테퍼 모터 4선 케이블을 끼웠습니다.
다음으로 상부 팔 슬롯에 M4 너트들을 끼워 하부 팔을 고정하는 역할을 하게 합니다.
합치기 직전, 선들이 저 훅들 아래로 지나가게 해 움직이는 부품들과 닿지 않게 해야 합니다.
두 번째 관절에서 나오는 선들이 풀리의 너트들에 걸릴 수 있으므로 선들을 너트들로부터 떨어뜨려 놓는 간단한 와이어 홀더를 만들었습니다.
선들이 팔 한쪽으로 지나가게 배열해 움직이는 부품들과 접촉을 피해야 합니다. 마지막으로 첫 번째 팔 커버를 끼웁니다.
커버는 스냅핏 조인트로 팔에 고정됩니다. 이로써 로봇 팔 어셈블리가 완성되었습니다.
이제 이 전체 어셈블리를 Z축 봉들에 끼웁니다.
다음으로 로드 상단 끝을 고정할 Z축 상단 플레이트를 준비합니다. 여기서는 먼저 Z축 마이크로 스위치를 설치하고 네 클램프를 플레이트에 부착합니다.
상단 플레이트를 끼우기 전에 아래쪽과 같은 심플한 커버를 먼저 끼워 클램프, 볼트, 마이크로 스위치를 숨깁니다. 그런 다음 클램프로 상단 플레이트를 봉들에 끼우고 조입니다.
다음으로 리드 스크루를 제자리에 끼웁니다.
가지고 있던 게 좀 길어 금속 손톱으로 38cm로 잘랐습니다. 다음으로 네 번째 스테퍼 모터를 제자리에 부착합니다. 여기서는 모터와 리드 스크루 연결용 5mm-8mm 샤프트 커플러가 필요합니다.
마지막으로 선들을 커버로 통과시키고 두 볼트로 상단 플레이트에 고정합니다.
좋습니다, 이제 케이블 정리를 좀 할 수 있습니다. 케이블 슬리브로 선들을 묶어 깔끔하게 정리했습니다. 케이블 타이도 사용했습니다.
선들을 케이블 슬리브에 넣기 전에 각각 표시해두면 잘못 연결하는 것을 방지할 수 있습니다.
이제 로봇 엔드 이펙터를 만들 차례입니다. 실제로 어떤 종류의 엔드 이펙터든 만들어 로봇에 부착할 수 있습니다. 저는 MG996R 서보 모터로 구동되는 심플한 그리퍼를 만들기로 했습니다. 그리퍼는 두 개의 6mm 봉을 기반으로 양쪽이 슬라이드하는 구조입니다.
두 슬라이딩 측면은 서보 혼, 3D 프린팅된 링크들, M3 볼트와 너트로 서보에 연결됩니다. 그리퍼 어셈블리 전체에 M3 볼트와 너트를 사용했습니다. 웹사이트 기사에서 이 프로젝트에 필요한 볼트와 너트 전체 목록을 확인할 수 있습니다. 볼트와 너트 고정 공간이 꽤 타이트해 일부 부품 조립엔 인내심이 필요합니다.
하지만 이 설계의 좋은 점은 그리퍼 엔드들을 쉽게 교체할 수 있다는 것입니다. 더 넓거나 좁게, 특정 모양으로 만들 수 있습니다. M4 볼트와 너트로 그리퍼를 로봇 팔에 부착할 수 있습니다.
마지막으로 앞서 설치한 와이어들에 서보 모터를 연결합니다.
이제 SCARA 로봇 팔이 완전히 조립되었습니다. 남은 건 이 프로젝트 전자 부품들을 연결하는 것뿐입니다.
SCARA 로봇 회로도
아두이노 우노 보드와 CNC 쉴드, 네 개의 A4988 스테퍼 드라이버를 사용합니다.
로봇이라 더 복잡해 보이지만 이게 이 프로젝트에 필요한 전자 부품의 전부입니다. 아두이노 우노 대신 아두이노 메가와 RAMPS 3D 프린터 컨트롤러 보드 조합을 사용해도 됩니다.
어쨌든 아두이노 우노용 케이스를 3D 프린팅해 로봇 베이스에 쉽게 부착할 수 있게 했습니다. 스테퍼 구동에 1/4 스텝 해상도를 사용하므로 적절한 핀들에 점퍼들을 꽂았습니다. 이제 스테퍼 모터들과 마이크로 스위치들을 CNC 쉴드에 연결합니다.
이 SCARA 로봇의 회로도와 모든 연결 방법입니다.
이 프로젝트에 필요한 구성품은 아래 링크에서 구할 수 있습니다:
스테퍼 모터 – NEMA 17………………
A4988 스테퍼 드라이버…………………..…
아두이노 CNC 쉴드 ………………………. 아마존 / 뱅굿 / 알리익스프레스
아두이노 우노………………………………..…
MG996R 서보 모터………………….….
리미트 스위치 …………………………………. 아마존 / 뱅굿 / 알리익스프레스
DC 파워 서플라이 …………………………. 아마존 / 뱅굿 / 알리익스프레스
로봇 전원 공급을 위해 최소 4A, 하지만 12V 6A 파워 서플라이를 추천합니다. 물론 이는 스테퍼 드라이버 전류 제한 설정에 따라 달라지며, 가능한 최저 레벨로 설정하는 것을 추천합니다.
마지막으로 모든 선들을 케이스 안에 밀어 넣으면서 드라이버 방열판들은 자유롭게 두고 커버를 씌웠습니다.
조립 마무리
SCARA 로봇이 이제 완성되었습니다. 이제 베이스를 무언가에 고정해야 합니다. 이를 위해 20mm 두께 나무 조각을 사용하겠습니다. 로봇 베이스 바닥면에 12개 고정용 구멍이 있습니다. 로봇 베이스 도면을 출력해 나무에 구멍을 뚫었습니다.
바닥면에서는 카운터싱크로 파서 플랫 헤드 볼트를 사용해 나무 표면과 평평하게 했습니다. 베이스 슬롯에 M4 너트들을 끼우고 나무 베이스를 로봇 베이스에 고정했습니다.
이상적으로는 로버를 테이블에 볼트로 고정하거나, 저는 단순히 클램프로 고정하겠습니다.
자, 이제 SCARA 로봇이 완전히 완성되었습니다. 이 영상에서 남은 건 로봇이 어떻게 작동하는지 보는 것뿐입니다.
참고: 스마트폰 제어 DIY 아두이노 로봇 팔
SCARA 로봇 작동 원리
로봇 위치와 방향 제어에는 순기구학과 역기구학 두 가지 방법이 있습니다.
순기구학은 주어진 관절 각도에서 엔드 이펙터의 위치와 방향을 구할 때 사용합니다.
반면 역기구학은 엔드 이펙터의 주어진 위치에서 관절 각도들을 구할 때 사용합니다. 이 방법은 로봇공학에서 더 의미가 있는데, 대부분 로봇이 도구를 특정 위치나 특정 X, Y, Z 좌표에 위치시키길 원하기 때문입니다.
순기구학으로 로봇 두 팔의 설정된 관절 각도(theta1, theta2)와 길이(L1, L2)에 따라 엔드 이펙터의 X, Y 값을 계산합니다.
반면 역기구학으로는 주어진 위치 또는 X, Y 좌표에 따라 관절 각도(theta2, theta1)를 계산합니다.
/ INVERSE KINEMATICS void inverseKinematics(float x, float y) { theta2 = acos((sq(x) + sq(y) - sq(L1) - sq(L2)) / (2 * L1 * L2)); if (x < 0 & y < 0) { theta2 = (-1) * theta2; } theta1 = atan(x / y) - atan((L2 * sin(theta2)) / (L1 + L2 * cos(theta2))); theta2 = (-1) * theta2 * 180 / PI; theta1 = theta1 * 180 / PI; // Angles adjustment depending in which quadrant the final tool coordinate x,y is if (x >= 0 & y >= 0) { // 1st quadrant theta1 = 90 - theta1; } if (x < 0 & y >= 0) { // 2nd quadrant theta1 = 90 - theta1; } if (x < 0 & y < 0) { // 3d quadrant theta1 = 270 - theta1; phi = 270 - theta1 - theta2; phi = (-1) * phi; } if (x >= 0 & y < 0) { // 4th quadrant theta1 = -90 - theta1; } if (x < 0 & y == 0) { theta1 = 270 + theta1; } // Calculate "phi" angle so gripper is parallel to the X axis phi = 90 + theta1 + theta2; phi = (-1) * phi; // Angle adjustment depending in which quadrant the final tool coordinate x,y is if (x < 0 & y < 0) { // 3d quadrant phi = 270 - theta1 - theta2; } if (abs(phi) > 165) { phi = 180 + phi; } theta1=round(theta1); theta2=round(theta2); phi=round(phi); cp5.getController("j1Slider").setValue(theta1); cp5.getController("j2Slider").setValue(theta2); cp5.getController("j3Slider").setValue(phi); cp5.getController("zSlider").setValue(zP); }Code language: Arduino (arduino)
위치가 어느 사분면에 설정되느냐에 따라 이 "if" 문들로 관절 각도들을 조정합니다. 이 로봇 구성에서는 실제로 두 링크만으로 역기구학을 계산합니다. "phi"라고 부르는 세 번째 각도는 그리퍼 방향 설정에 사용됩니다.
그래픽 사용자 인터페이스는 Processing IDE의 controlP5 라이브러리로 만들었습니다. 이 라이브러리로 버튼, 슬라이더, 텍스트 필드 등을 쉽게 만들 수 있습니다.
예를 들어, 왼쪽 슬라이더들로 관절 각도들을 제어하고, 텍스트 필드들로 로봇이 갈 위치를 입력할 수 있습니다. 여기서 우리가 하는 각 행동마다 시리얼 포트로 아두이노 보드에 데이터를 보냅니다.
if (gripperValuePrevious != gripperValue) { if (activeIK == false) { // Check whether the inverseKinematics mode is active, Executre Forward kinematics only if inverseKinematics mode is off or false gripperAdd = round(cp5.getController("gripperValue").getValue()); gripperValue=gripperAdd+50; updateData(); println(data); myPort.write(data); } }Code language: Arduino (arduino)
이 데이터에는 관절 각도들, 그리퍼 값, 속도와 가속도 값들, 저장 또는 실행 버튼 클릭 여부 표시자들이 포함됩니다.
public void updateData() { data = str(saveStatus) +","+str(runStatus) +","+str(round(cp5.getController("j1Slider").getValue())) +","+str(round(cp5.getController("j2Slider").getValue())) +","+str(round(cp5.getController("j3Slider").getValue())) +","+str(round(cp5.getController("zSlider").getValue())) +","+str(gripperValue) +","+str(speedSlider) +","+str(accelerationSlider); }Code language: Arduino (arduino)
이 모든 데이터는 하나의 긴 문자열로 아두이노에 옵니다. 여기서 먼저 그 문자열에서 데이터를 추출해 별도 변수들에 넣어야 합니다.
if (Serial.available()) { content = Serial.readString(); // Read the incomding data from Processing // Extract the data from the string and put into separate integer variables (data[] array) for (int i = 0; i < 10; i++) { int index = content.indexOf(","); // locate the first "," data[i] = atol(content.substring(0, index).c_str()); //Extract the number from start to the "," content = content.substring(index + 1); //Remove the number from the string } /* data[0] - SAVE button status data[1] - RUN button status data[2] - Joint 1 angle data[3] - Joint 2 angle data[4] - Joint 3 angle data[5] - Z position data[6] - Gripper value data[7] - Speed value data[8] - Acceleration value */Code language: Arduino (arduino)
이제 이 변수들로 로봇 동작을 제어할 수 있습니다. 예를 들어 SAVE 버튼을 누르면 현재 관절 각도 값들을 별도 배열에 저장합니다.
// If SAVE button is pressed, store the data into the appropriate arrays if (data[0] == 1) { theta1Array[positionsCounter] = data[2] * theta1AngleToSteps; //store the values in steps = angles * angleToSteps variable theta2Array[positionsCounter] = data[3] * theta2AngleToSteps; phiArray[positionsCounter] = data[4] * phiAngleToSteps; zArray[positionsCounter] = data[5] * zDistanceToSteps; gripperArray[positionsCounter] = data[6]; positionsCounter++; }Code language: Arduino (arduino)
RUN 버튼을 클릭하면 저장된 스텝들을 실행하고 그런 식입니다.
스테퍼 모터 제어에는 AccelStepper 라이브러리를 사용했습니다. 여러 스테퍼를 동시에 제어하는 데 훌륭한 라이브러리지만, 이런 로봇 제어에는 한계가 있습니다. 여러 스테퍼 제어 시 라이브러리가 가감속을 구현할 수 없는데, 이는 로봇의 부드러운 작동에 중요합니다.
자, 이제 아두이노에 코드를 업로드하면 Processing 프로그램을 실행하고 전원을 연결하면 SCARA 로봇이 홈 위치로 이동하기 시작합니다.
그 후부터 원하는 건 뭐든 할 수 있습니다. 수동으로 이것저것 해보거나 자동으로 작동하게 설정할 수 있습니다. 물론 어떤 종류의 엔드 이펙터든 부착해 멋진 것들을 만들 수 있습니다. 예를 들어 3D 프린터 핫엔드를 부착해 로봇을 3D 프린터로 만들거나, 레이저 헤드를 부착해 레이저 커터로 만들 수 있습니다. 이 두 아이디어를 시도해볼 계획이니 구독해서 향후 영상들 놓치지 마세요.
영상이 끝나기 전에 이 프로젝트에 대해 몇 가지 더 말씀드리고 싶습니다. 로봇이 예상만큼 견고하지 않다는 것을 발견했습니다.
문제는 거의 전체 SCARA 로봇, Z축과 팔들이 첫 번째 관절만으로 지탱된다는 점인 것 같습니다. 전체 무게와 이동 시 발생하는 관성력이 첫 번째 관절이 위치한 베이스에 상당한 스트레스를 주는데, 플라스틱이라 약간 휘어지는 경향이 있습니다. 또한 벨트들이 백래시 프리하지 않아 이로도 로봇 강성이 떨어집니다. 하지만 전반적으로 SCARA 로봇이 어떻게 작동하는지 배우고 직접 만들어볼 용기를 주기엔 충분히 좋은 프로젝트라고 생각합니다.