산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

스카라 로봇 | 나만의 Arduino 기반 로봇을 구축하는 방법

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서 우리는 Arduino 기반 SCARA 로봇을 구축하는 방법을 배울 것입니다. 로봇 설계부터 로봇을 제어하기 위한 자체 그래픽 사용자 인터페이스 개발까지 전체 과정을 보여드리겠습니다.

다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

개요

로봇은 4개의 자유도를 가지며 4개의 NEMA 17 스테퍼 모터로 구동됩니다. 또한 이 경우 엔드 이펙터 또는 로봇 그리퍼를 제어하기 위한 소형 서보 모터가 있습니다. 이 SCARA 로봇의 두뇌는 모터 제어를 위한 CNC 실드 및 4개의 A4988 스테퍼 드라이버와 쌍을 이루는 Arduino UNO 보드입니다.

Processing 개발 환경을 사용하여 Forward 및 Inverse Kinematics 제어를 모두 제공하는 그래픽 사용자 인터페이스를 만들었습니다. 순운동학을 사용하면 원하는 위치를 얻기 위해 각 로봇 관절을 수동으로 이동할 수 있습니다. 왼쪽의 슬라이더를 사용하여 각 관절의 각도를 설정할 수 있습니다. 엔드 이펙터의 최종 위치인 X, Y, Z 값이 계산되어 화면 우측에 출력됩니다.

반면에 역운동학을 사용하여 엔드 이펙터의 원하는 위치를 설정할 수 있으며 프로그램은 로봇이 원하는 위치에 도달할 수 있도록 각 관절의 각도를 자동으로 계산합니다.

실제로 같은 화면에서 두 가지 방법을 동시에 사용할 수 있도록 프로그램을 만들었습니다. 관절의 각도와 엔드 이펙터의 X, Y, Z 값이 연결되어 항상 화면에 나타납니다.

물론 로봇도 자동으로 작동할 수 있습니다. 프로그램의 "저장" 버튼을 사용하여 로봇의 각 움직임이나 위치를 저장할 수 있습니다. 그런 다음 "실행" 버튼을 누르면 로봇이 루프에 저장된 움직임을 처음부터 마지막까지 반복해서 실행합니다. 사용자 인터페이스에서 이동 속도와 가속도를 조정할 수도 있습니다.

스카라 로봇 3D 모델

먼저 3D 모델을 살펴보겠습니다.

이 비디오의 후원자이기도 한 3DEXPERIENCE SOLIDWORKS를 사용하여 이 SCARA 로봇을 설계했습니다.

3 3DEXPERIENCE SOLIDWORKS는 기본적으로 3DEXPERIENCE 플랫폼을 통해 얻을 수 있는 클라우드 기능을 갖춘 SOLIDWORKS입니다. 모든 것이 클라우드를 통해 작동하므로 귀하 또는 귀하의 팀의 모든 사람이 언제 어디서나 전 세계에서 데이터 또는 모델에 액세스할 수 있습니다. 3DEXPERIECE 플랫폼에는 유용한 생산성 및 관리 앱도 많이 포함되어 있습니다.

예를 들어, 프로젝트 플래너는 작업을 구성하고, 마감일을 설정하고, 진행 상황을 추적하는 좋은 방법입니다. 3D Markup 앱을 사용하면 노트북, 태블릿 또는 스마트폰과 같은 모든 장치에서 모델을 보고 탐색하고 메모할 수 있습니다.

브라우저 내에서 실행되는 SOLIDWORKS xDesign이라는 별도의 클라우드 기반 3D 모델러도 있습니다. Solidworks와 함께 사용하거나 단독으로 사용할 수 있으며 언제 어디서나 모든 장치에서 모델링에 적합합니다.

따라서 이와 같은 교육 콘텐츠를 후원해 주신 Solidworks에 큰 감사를 드립니다. SOLIDWORKS와 3DEXPERIENCE 플랫폼이 귀하에게 적합한지 알고 싶다면 아래 링크를 확인하십시오.

내 특별 링크:www.solidworks.com/HTMTryNow

에서 3DEXPERIENCE를 무료로 사용해 보세요.

3DEXPERIENCE SOLIDWORKS에 대해 자세히 알아보기: www.solidworks.com/HTMLearnMore

자, 이제 모델로 돌아가 어떻게 이 디자인을 생각해 냈는지 설명하겠습니다. 로봇에 대한 나의 목표는 대부분의 부품을 3D로 인쇄하는 것이었습니다. 따라서 여기에서 보는 모든 것은 더 작은 인쇄 베드가 있는 3D 프린터에서도 3D 인쇄할 수 있습니다. GT2 풀리도 3D로 인쇄할 수 있습니다. 파라메트릭 디자인을 사용하여 만들었습니다. 그래서 필요한 경우 크기를 쉽게 변경할 수 있습니다. 톱니 수만 변경하면 도르래를 적절한 크기로 만들기 위해 모든 치수가 자동으로 업데이트됩니다.

첫 번째 조인트의 경우 20:1의 감속비를 가지고 있으며 이러한 맞춤형 풀리를 사용하여 2단계로 달성했습니다. 내가 여기서 사용하는 두 개의 GT2 벨트는 200mm와 300mm 길이의 폐쇄 루프입니다. 로봇 관절은 2개의 스러스트 베어링과 1개의 레이디얼 베어링으로 ​​구성됩니다.

두 번째 조인트의 경우 동일한 방법으로 달성된 16:1 감소 비율이 있고, 세 번째 조인트의 경우 1단계 감소만으로 4:1 감소 비율이 있습니다. 조인트는 속이 비어 있어 모터와 마이크로 스위치의 와이어를 통과시키는 데 사용할 수 있습니다. 각 벨트에는 장력을 위해 아이들러 풀리를 부착할 수 있는 슬롯이 있습니다.

로봇 그리퍼는 MG996R 서보 모터에 의해 구동되며 다양한 그립 크기를 얻기 위해 그리퍼 끝을 쉽게 변경할 수 있습니다. 로봇의 Z축은 8mm 리드 나사로 구동되며 전체 암 어셈블리는 4개의 10mm 부드러운 로드와 선형 볼 베어링에서 미끄러집니다. 로봇의 높이는 매끄러운 막대의 길이에 따라 달라지며, 이 경우에는 40cm입니다. 이 구성에 맞으려면 리드 나사가 2cm 더 짧아야 하며 그렇지 않은 경우 스페이서 너트를 사용하여 Z 모터를 2cm 올릴 수 있습니다.

이 3D 모델을 찾아 다운로드할 수 있을 뿐만 아니라 Thangs의 브라우저에서 탐색할 수 있습니다.

Thangs에서 어셈블리 3D 모델을 다운로드하십시오.

3D 인쇄용 STL 파일:

로봇 부품 3D 프린팅

좋습니다. 이제 부품을 3D 프린팅하여 계속 진행할 수 있습니다. 모든 부품을 인쇄하기 위해 Creality CR-10 3D 프린터를 사용했습니다. 저렴한 가격에 정말 훌륭한 3D 프린터입니다. 앞서 언급했듯이 부품은 Ender3와 같은 더 작은 3D 프린터에도 맞도록 설계되었습니다.

대부분의 부품에 PLA+ 재료, 파란색 재료를 사용했으며 풀리와 그리퍼에는 일반 PLA를 사용했습니다. 모든 부품을 60mm/s 인쇄 속도로 인쇄하는 데 약 120시간이 걸렸습니다. 베이스는 약 32시간이 소요되는 인쇄에 가장 큰 부분이었습니다. 하지만 인쇄 속도를 높이면 확실히 부품을 더 빨리 인쇄할 수 있습니다.

참조:초보자와 제작자를 위한 최고의 3D 프린터[2021 업데이트]

다음은 3D 프린팅된 모든 부품입니다.

슬라이싱 소프트웨어에서 -0.1mm의 수평 확장을 활성화하여 모든 것을 인쇄했다는 간단한 참고 사항입니다. 이를 통해 부품의 치수가 더 정확하고 베어링, 로드 및 볼트와 같은 다른 기계 부품과 더 잘 맞습니다.

로봇 조립

다음은 이 Arduino 기반 SCARA 로봇을 조립하는 데 필요한 구성 요소 목록입니다. 전자 부품 목록은 아래 기사의 회로도 섹션에서 찾을 수 있습니다.

이 프로젝트에 필요한 볼트 크기는 다음과 같습니다.

우리는 기초로 조립을 시작합니다. 먼저 내부 직경이 35mm이고 외부 직경이 47mm인 레이디얼 볼 베어링을 삽입합니다.

그런 다음 내부 직경이 40mm이고 외부 직경이 60mm인 첫 번째 스러스트 베어링이 사용됩니다. 이 베어링은 풀리와 베이스 사이에 위치합니다.

베이스의 반대쪽에는 조인트 커플러와 함께 동일한 크기의 다른 스러스트 베어링을 사용합니다.

그런 다음 길이가 55mm인 M4 볼트 4개를 사용하여 풀리와 상부를 결합할 수 있습니다. 여기에 자동 잠금 너트를 사용하고 적절하게 조여야 조인트가 견고하면서도 자유롭게 회전할 수 있습니다.

다음으로 중간 풀리를 설치해야 합니다. 이 풀리는 300mm GT2 벨트가 있는 조인트 풀리와 쌍을 이룹니다. 이 풀리를 설치하기 위해 2개의 608 볼 베어링을 사용합니다. 하나는 베이스의 상단에, 다른 하나는 하단에 있습니다. 그런 다음 45mm M8 볼트, 와셔 및 자동 잠금 너트를 사용하여 풀리를 제자리에 고정할 수 있습니다.

다음으로 이 조인트용 스테퍼 모터를 설치해야 합니다. 스테퍼는 200mm 벨트가 있는 중간 풀리와 쌍을 이룹니다. 베이스에 고정하려면 M3 볼트 4개가 필요합니다.

볼트를 조이기 전에 벨트를 최대한 늘려야 합니다. 중간 도르래의 M8 볼트를 바닥에 있는 머리로 교체하여 베이스 안에 들어갈 수 있도록 했습니다.

이때 벨트가 충분히 조여졌는지 확인해야 합니다. 그렇지 않은 경우 아이들러 풀리를 사용하여 더 잘 조일 수 있습니다. 여기에서는 35mm M5 볼트와 너트를 사용하여 조임 풀리를 만들고 있습니다.

벨트 양쪽 슬롯에 부착할 수 있어 원하는 만큼 벨트를 조일 수 있습니다. 양쪽 벨트를 모두 조여주었어요. 이로써 첫 번째 조인트가 완성되었습니다.

이 조인트에 마이크로 스위치를 설치하는 작업을 계속했습니다. 제자리에 고정하기 전에 와이어를 납땜했습니다. 나중에 하기에는 약간 빡빡하기 때문입니다. 마이크로 스위치를 제자리에 고정하려면 20mm M3 볼트와 너트가 필요합니다.

조인트 커플러가 스위치를 너무 닫아서 스위치를 고정하는 데 하나의 볼트만 사용하게 되었습니다. 다른 구멍에는 더 짧은 볼트를 삽입하고 아래쪽에 붙였습니다. 그래야 스위치가 충분히 안전하고 제대로 작동할 수 있습니다.

자, 이제 Z축 조립을 시작할 수 있습니다. 먼저 조인트 커플러 위에 Z축 하단 플레이트 부분을 고정해야 합니다.

그 위에 부드러운 막대를 위한 4개의 클램프를 고정할 수 있습니다. 그런 다음 매끄러운 막대를 제자리에 삽입할 수 있습니다. 그들은 단단히 맞고 조인트 커플러 부분까지 내려 가야합니다. M4 볼트와 너트로 클램프로 막대를 조일 수 있습니다.

이 시점에서 리드 스크류용 베어링을 삽입해야 합니다. 이 섹션을 마치려면 모든 것을 숨기고 로봇을 더 깔끔하게 보이게 하는 간단한 덮개를 밀어 넣으면 됩니다.

다음으로 로봇의 첫 번째 팔 조립으로 넘어갈 수 있습니다. 팔은 볼트로 결합된 두 부분으로 만들어집니다. 첫 번째 부분은 매끄러운 막대를 통해 미끄러질 선형 베어링을 설치해야 하는 곳입니다. 그것들을 제자리에 삽입하는 것은 아주 꽉 끼기 때문에 약간 어려울 수 있습니다.

실제로 이것은 프린터가 부품을 얼마나 정확하게 인쇄할 수 있는지에 달려 있습니다. 따라서 부품을 인쇄할 때 수평 확장 기능을 사용하고 프린터에 맞게 조정하는 것이 좋습니다. 제 경우에는 베어링 2개를 끝까지 장착할 수 없었지만 큰 문제는 아니었습니다.

자, 이제 팔의 두 부분을 함께 연결할 수 있습니다. 이를 위해 4개의 25mm M5 볼트를 사용합니다.

다음으로 두 번째 스테퍼 모터를 설치할 수 있습니다. 여기에서는 20개의 톱니가 있는 3D 인쇄된 GT2 도르래를 사용합니다. 앞서 언급한 파라메트릭 디자인을 사용하여 이 도르래를 만들었고 꽤 잘 작동합니다. 여기서도 리드 나사 너트를 제자리에 고정해야 합니다.

다음으로 두 번째 조인트용 벨트와 풀리를 설치할 수 있습니다. 여기에 400mm 길이의 벨트 하나와 길이 300mm의 벨트 하나가 필요합니다. 설치 절차는 첫 번째 조인트에서 설명한 것과 거의 같습니다.

여기서 두 번째 조인트와 세 번째 조인트의 경우 실제로 첫 번째 조인트에 비해 더 작은 베어링을 사용합니다. 레이디얼 볼 베어링은 내경 30mm, 외경 42mm, 스러스트 베어링은 내경 35mm, 외경 52mm입니다.

두 번째 조인트 커플러를 설치하기 전에 육각 슬롯에 6개의 20mm M4 볼트를 삽입해야 합니다.

그들은 두 번째 팔을 관절에 부착하는 역할을 합니다. 필요한 경우 벨트 장력을 위해 앞서 아이들러 풀리에서 설명한 것과 동일한 방법을 사용할 수 있습니다. 마지막으로 두 번째 마이크로 스위치를 제자리에 고정하고 암 1번 조립을 완료했습니다.

두 번째 암을 조인트 커플러에 계속 부착했습니다. 여기서 우리는 이전에 설치한 조인트 커플러의 볼트를 사용하여 두 번째 암의 상부를 고정합니다.

이 시점에서 나는 관절에 얼마나 많은 백래시가 있었는지 테스트하고 싶었습니다. 물론 벨트로 인해 약간의 반발이 있을 것으로 예상했지만 실제로는 조인트의 두 부분 사이에 더 많은 유격이 있었습니다. 나는 문제가 볼트가 가는 구멍이 볼트 자체보다 약간 더 크다는 것을 알아차렸습니다. 이 문제를 해결하기 위해서는 볼트와 구멍 사이를 더 단단하게 끼워야 합니다.

그래서 제 경우에는 4.5mm 드릴로 구멍을 넓히고 M4볼트 대신 M5볼트를 사용하여 조인트의 두 부분을 함께 고정했습니다. 그러나 구멍이 3.5mm이고 M4 볼트를 사용하여 이 두 부품을 결합할 수 있도록 3D 모델을 업데이트했습니다. 나는 또한 첫 번째 관절로 돌아가서 같은 작업을 수행했습니다. 이제 우리가 벨트에서 얻는 작은 반발을 제외하고 관절의 유격이 거의 사라졌습니다.

자, 이제 두 번째 암 조립을 계속할 수 있습니다. 여기에 먼저 세 번째 조인트용 스테퍼 모터를 설치해야 합니다.

이 경우에는 암을 조금 더 가볍게 하기 위해 더 작은 스테퍼 모터를 사용하고 있습니다. 그래도 NEMA 17 스테퍼 모터이지만 길이가 24cm 더 짧습니다.

여기서도 400mm 벨트로 단일 단계 감소만 사용한다는 점을 제외하고 세 번째 조인트에 대한 벨트와 풀리를 설치하는 동일한 절차가 있습니다. 다음으로, 이 암의 하부를 상부에 부착하기 전에 모터와 마이크로 스위치를 연결하고 두 번째 조인트를 통해 와이어를 통과시켜야 합니다.

이 시점에서 엔드 이펙터용 와이어도 삽입해야 합니다. 제 경우에는 3선이 필요한 그리퍼용 서보 모터를 구동하는 데 사용할 스테퍼 모터의 4선 케이블을 삽입했습니다.

다음으로, 하부를 고정하는 역할을 하는 상부 암의 슬롯에 M4 너트를 삽입해야 합니다.

그것들을 병합하기 직전에 와이어가 움직이는 부품에서 멀어지도록 해당 후크 아래로 와이어를 통과시켜야 합니다.

두 번째 조인트에서 나오는 와이어는 실제로 풀리의 너트에 걸릴 수 있으므로 너트에서 와이어를 고정하기 위해 간단한 와이어 홀더를 만들었습니다.

움직이는 부품과의 접촉을 피하기 위해 와이어가 암의 측면을 통과하도록 배열해야 합니다. 마지막으로 첫 번째 암의 덮개를 삽입할 수 있습니다.

커버는 스냅핏 조인트로 암에 고정됩니다. 이렇게 하면 로봇팔 조립이 완성됩니다.

이제 이 전체 어셈블리를 Z축 로드에 삽입할 수 있습니다.

그런 다음 막대의 상단을 고정할 Z축 상판을 준비해야 합니다. 여기에서 먼저 Z축용 마이크로 스위치를 설치하고 플레이트에 클램프용을 부착할 수 있습니다.

상판을 제자리에 놓기 전에 먼저 클램프, 볼트 및 마이크로 스위치를 숨기기 위해 아래와 같은 간단한 덮개를 삽입했습니다. 그런 다음 클램프를 사용하여 상단 플레이트를 막대에 삽입하고 조일 수 있습니다.

다음으로 리드 나사를 제자리에 삽입해야 합니다.

제가 가지고 있는 것이 조금 더 길어서 금속 손톱을 사용하여 38cm로 자릅니다. 다음으로 네 번째 스테퍼 모터를 제자리에 부착할 수 있습니다. 여기서 모터를 리드 나사에 연결하기 위해 5mm ~ 8mm 샤프트 커플러를 사용해야 합니다.

마지막으로 커버를 통해 전선을 통과시키고 두 개의 볼트를 사용하여 상단 플레이트에 고정할 수 있습니다.

자, 다음으로 케이블 관리를 할 수 있습니다. 전선을 정리하고 지저분한 것을 정리하기 위해 케이블 슬리브를 사용했습니다. 그 목적으로 집타이도 사용했습니다.

케이블 슬리브에 전선을 넣기 전에 잘못 연결하지 않도록 각 전선에 표시를 하는 것이 좋습니다.

이제 로봇의 엔드 이펙터를 만드는 일만 남았습니다. 우리는 실제로 모든 종류의 엔드 이펙터를 만들어 로봇에 부착할 수 있습니다. MG996R 서보 모터로 구동되는 간단한 그리퍼를 만들기로 했습니다. 그리퍼는 양쪽이 미끄러지는 2개의 6mm 막대를 기반으로 합니다.

두 개의 슬라이딩 측면은 서보 혼, 일부 3D 인쇄 링크 및 M3 볼트 및 너트로 서보에 연결됩니다. 그리퍼 어셈블리 전체에 M3 볼트와 너트를 사용했습니다. 웹사이트 기사에서 이 프로젝트에 필요한 볼트와 너트의 전체 목록을 실제로 찾을 수 있습니다. 볼트와 너트를 고정하는 공간이 상당히 협소하여 부품을 조립하는데 신경이 좀 필요합니다.

하지만 이 디자인의 좋은 점은 그리퍼 끝을 쉽게 변경할 수 있다는 것입니다. 그들은 더 넓거나 더 좁을 수 있거나 특정 모양을 가질 수 있습니다. M4 볼트와 너트를 사용하여 그리퍼를 로봇 팔에 부착할 수 있습니다.

마지막으로 이전에 설치한 와이어에 서보 모터를 연결할 수 있습니다.

이제 SCARA 로봇 팔이 완전히 조립되었습니다. 이제 이 프로젝트의 전자 부품을 연결하는 일만 남았습니다.

SCARA 로봇 회로도

따라서 CNC 실드 및 4개의 A4988 스테퍼 드라이브와 함께 Arduino UNO 보드를 사용할 것입니다.

로봇이고 더 복잡해 보이지만 이 프로젝트에 필요한 모든 전자 제품입니다. Arduino UNO 대신에 RAMPS 3D 프린터 컨트롤러 보드와 함께 Arduino MEGA를 사용할 수도 있습니다.

그럼에도 불구하고 로봇 바닥에 쉽게 부착할 수 있는 Arduino UNO용 케이스를 3D 프린팅했습니다. 스테퍼를 구동하기 위해 1/4 단계 해상도를 사용할 것이므로 적절한 핀에 일부 점퍼를 배치했습니다. 이제 스테퍼 모터와 마이크로 스위치를 CNC 실드에 연결할 수 있습니다.

다음은 이 SCARA 로봇의 회로도와 모든 것이 연결되어야 하는 방법입니다.

아래 링크에서 이 프로젝트에 필요한 구성 요소를 얻을 수 있습니다.

로봇에 전원을 공급하려면 최소 4A를 공급할 수 있는 12V 전원 공급 장치가 필요하지만 12V 6A 전원 공급 장치를 제안합니다. 물론 이것은 스테퍼 드라이버의 현재 제한이 어떻게 설정되어 있느냐에 따라 달라지므로 가능한 한 가장 낮은 수준으로 설정하는 것이 좋습니다.

결국 나는 드라이브 방열판을 자유롭게 두려고 하면서 케이스의 모든 전선을 짜내고 덮개를 추가했습니다.

조립 완료

이제 SCARA 로봇이 완성되었고 이제 우리가 해야 할 일은 베이스를 무언가에 고정하는 것입니다. 이를 위해 20mm 눈금 나무 조각을 사용합니다. 로봇 베이스의 바닥면에는 고정용으로 사용할 수 있는 12개의 구멍이 있습니다. 그래서 로봇 베이스의 도면을 프린트해서 나무에 구멍을 뚫는 데 사용했습니다.

바닥면에서 나는 평평한 머리 볼트를 사용하여 나무 표면과 플래시되도록 그들을 접시에 담았습니다. 베이스 슬롯에 M4 너트를 삽입하고 나무 베이스를 로봇 베이스에 고정했습니다.

이제 이상적으로는 로봇을 제자리에 고정하기 위해 테이블에 볼트로 고정하거나 간단히 클램프를 사용하는 것이 좋습니다.

이제 SCARA 로봇이 완전히 완성되었습니다. 하지만 이 비디오에 남은 것은 로봇이 어떻게 작동하는지 살펴보는 것입니다.

참조:스마트폰 제어 기능이 있는 DIY Arduino 로봇 암

SCARA 로봇 작동 방식

로봇을 제어하는 ​​방법은 위치와 방향의 두 가지가 있는데, 순운동학 또는 역운동학을 사용하는 것입니다.

순운동학은 주어진 관절 각도에서 엔드 이펙터의 위치와 방향을 찾아야 할 때 사용됩니다.

반면에 역기구학은 엔드 이펙터의 주어진 위치에 대한 관절 각도를 찾아야 할 때 사용됩니다. 이 방법은 로봇이 특정 위치 또는 특정 X, Y 및 Z 좌표에 도구를 배치하기를 원하는 대부분의 시간에 로봇에 더 적합합니다.

역운동학으로 주어진 좌표에 따라 관절 각도를 계산할 수 있습니다.

순운동학 및 역운동학 모두에 사용할 방정식은 삼각법 규칙과 공식에서 가져옵니다.

SCARA 로봇 프로그래밍 – Arduino 및 코드 처리

기사 하단에서 Arduino와 처리 코드를 모두 찾을 수 있습니다.

다음은 Processing 개발 환경에서 작성된 코드에서 방정식이 어떻게 보이는지 보여줍니다.

// FORWARD KINEMATICS
void forwardKinematics() {
  float theta1F = theta1 * PI / 180;   // degrees to radians
  float theta2F = theta2 * PI / 180;
  xP = round(L1 * cos(theta1F) + L2 * cos(theta1F + theta2F));
  yP = round(L1 * sin(theta1F) + L2 * sin(theta1F + theta2F));
}Code language: Arduino (arduino)

따라서 순운동학을 사용하여 로봇 두 팔, ta1 및 ta2의 설정된 관절 각도와 길이 L1 및 L2에 따라 엔드 이펙터의 X 및 Y 값을 계산합니다.

반면에 역운동학에서는 주어진 위치 또는 X 및 Y 좌표에 따라 관절 각도, ta2 및 ta1을 계산합니다.

/ 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" 문으로 관절 각도를 약간 조정합니다. 로봇의 이 구성을 위해 우리는 실제로 단 두 개의 링크로 역운동학을 계산하고 있습니다. 제가 "파이"라고 부르는 세 번째 각도는 그리퍼의 방향을 설정하는 데 사용됩니다.

그래픽 사용자 인터페이스는 Processing IDE용 controlP5 라이브러리를 사용하여 만들어졌습니다. 이 라이브러리를 사용하면 버튼, 슬라이더, 텍스트 필드 등을 쉽게 만들 수 있습니다.

예를 들어 왼쪽에 있는 슬라이더를 사용하여 관절 각도를 제어하고 텍스트 필드를 사용하여 로봇이 이동할 위치를 입력할 수 있습니다. 프로그램에서 수행하는 각 작업으로 직렬 포트를 통해 Arduino 보드에 데이터를 보냅니다.

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)

이 모든 데이터는 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 라이브러리를 사용했습니다. 이것은 동시에 여러 스테퍼를 제어하기 위한 훌륭한 라이브러리이지만, 이와 같이 로봇을 제어하는 ​​데에는 몇 가지 제한이 있습니다. 여러 스테퍼를 제어할 때 라이브러리는 로봇의 원활한 작동에 중요한 가속 및 감속을 구현할 수 없습니다.

stepper1.moveTo(stepper1Position);
  stepper2.moveTo(stepper2Position);
  stepper3.moveTo(stepper3Position);
  stepper4.moveTo(stepper4Position);

  while (stepper1.currentPosition() != stepper1Position || stepper2.currentPosition() != stepper2Position || stepper3.currentPosition() != stepper3Position || stepper4.currentPosition() != stepper4Position) {
    stepper1.run();
    stepper2.run();
    stepper3.run();
    stepper4.run();
  }Code language: Arduino (arduino)

I still managed to implement acceleration and deceleration with the library, but they are not as smooth as I wanted to be.

Here are full Arduino and Processing codes for this Arduino SCARA robot project:

Wrap up

So finally, once we upload the code to the Arduino, we can run the processing program, connect the power and the scara robot will start moving to its home position.

From there on, we can do whatever we want the it. We can play around manually or set it to work automatically. Of course, we can attach any kind of end-effector and make cool stuff with it. For example, we can even attach a 3D printer hot end to the robot and so make the robot a 3D printer, or attach a laser head and make it a laser cutter. I do plan try these two ideas, so make sure you subscribe to my channel so you don’t miss them in some of my future videos.

Before this video ends, I would like to give you few more notes about this project. I found the robot to be not as rigid as I expected.

I guess the problem is that almost the entire SCARA robot, the Z-axis and the arms are supported only by the first joint. The whole weight and the inertial forces generated when moving, can make quite a stress to base where the first joint is located, and as it’s just a plastic it tends to bend a little bit. Also, these belts are not backlash free so we reduce the robot rigidity with that too. However, I think the overall project is good enough so you to learn how SCARA robots work, and gives you the courage to build one for yourself.

Feel free to ask any question in the comments section below and check my Arduino Projects Collection.


제조공정

  1. 레고 EV3 해킹:자신만의 물체 센서 "눈" 만들기
  2. Arduino 및 Raspberry Pi로 인터넷 제어 비디오 스트리밍 로봇 구축
  3. 백서:로봇 잠재력을 찾는 방법
  4. 로봇의 제왕 Sauron을 만드는 방법
  5. Arduino 에너지 모니터 및 데이터 로거를 구축하는 방법
  6. IR 리모콘 해킹 방법
  7. 궁극적인 가이드:올바른 SCARA 로봇을 선택하는 방법
  8. Littlearm 2C:3D 인쇄 Arduino 로봇 팔 제작
  9. Arduino 기반 자동 문 열림을 만드는 방법
  10. 7단계로 자동화 로드맵을 구축하는 방법