กลับไปหน้ารวมไฟล์
using-iot-to-remotely-control-a-robotic-arm-d70a8e.md

Introduction

สิ่งที่พี่อยากลองทำมากๆ เลยคือการออกแบบแขนกลขึ้นมาเองตั้งแต่ต้นเลย ถึงแม้จะมีดีไซน์ Open-source ให้เลือกใช้เพียบ แต่พี่ว่ามันต้องมันส์แน่ถ้าพี่ออกแบบ สร้าง และเขียนโปรแกรมเองทั้งหมด (และมันก็เป็นอย่างนั้นจริงๆ)

พี่จะเล่าทั้งเรื่องการออกแบบและการเขียนโปรแกรม แต่จะเน้นไปที่ฝั่งโปรแกรมมากกว่า เพราะมันไม่ได้แค่สั่งมุม [Servo](https://s.shopee.co.th/7fUgFAWSki) ธรรมดาๆ

นี่คือลิงก์วิดีโอโปรเจกต์สุดท้ายของพี่ - https://www.mathworks.com/videos/how-to-control-a-robotic-arm-from-a-remote-location-using-iot-1538564659095.html.

พี่ใช้ Simulink ในการเขียนโปรแกรมให้ [Arduino](https://s.shopee.co.th/7fUgFAWSki) MKR1000 ซึ่งเป็น MCU ที่คุมแขนกล จากนั้นก็เพิ่มความสามารถให้สั่งงานแขนกลจากที่ไหนก็ได้ผ่าน ThingSpeak ซึ่งเป็นแพลตฟอร์ม IoT Open-source ที่ทำงานร่วมกับ MATLAB

Hardware Needed

  • 15” x 20” 1/8-inch plywood
  • Arduino MKR1000
  • 5x GS9025MG servo
  • 2.1mm breadboard friendly DC barrel jack
  • 6 V DC barrel jack power supply
  • Jumper wires
  • 3x 2n2222a Transistors
  • 10x M2 nuts
  • 10x M2 x 10 screws
  • 40x M3 nuts
  • 40x M3 x 25 screws

Software used

  • MATLAB
  • Simulink
  • MATLAB Support package for Arduino hardware
  • Simulink Support package for Arduino hardware
  • MATLAB Support package for ThingSpeak

Design

พี่อยากให้ชิ้นส่วนราคาถูก เลยออกแบบมาให้ใช้กับ Servo ระดับ Hobby โดยเฉพาะรุ่น GS-9025MG นี่ทำให้ขนาดและน้ำหนักสุดท้ายถูกจำกัด เพราะ Micro Servo พวกนี้มีแรงบิดไม่มากนัก เลยยกแขนที่หนักๆ ไม่ได้

ตอนแรกพี่ลองใช้ไม้อัดหนา 1/4 นิ้ว มันหนักเกินไปสำหรับ Servo พี่เลยลดความยาวแขนลงและเปลี่ยนมาใช้ไม้อัดหนา 1/8 นิ้ว ปัญหาการควบคุม Servo ก็หายไป พี่ออกแบบด้วย Fusion 360 แล้วเซฟไฟล์เป็น .dxf ไปตัดด้วยเลเซอร์

อีกเรื่องคือ การใช้ไฟ DC จากปลั๊กผนังมันจำเป็นมาก เพราะถ้าใช้แบตเตอรี่ มันกินกระแสสูงมากและแบตหมดเร็วมาก

เรื่องการควบคุมมอเตอร์ Arduino MKR1000 มี PWM pin อยู่ 4 ขา แต่พี่ต้องการ 5 ขาเพื่อควบคุม Servo 5 ตัว พี่เลยต้องใช้ความคิดสร้างสรรค์หน่อย โดยใช้ PWM pin หนึ่งขาควบคุม Servo สองตัว และใช้ Digital pin หนึ่งขาเป็นสวิตช์สลับระหว่าง Servo สองตัวนั้น เพื่อควบคุมทีละตัว

นี่คือวงจรที่ว่ามา:

นี่คือการต่อสาย Servo เข้ากับ Arduino:

Programming

การเขียนโปรแกรมมีสองส่วน ส่วนแรกคือช่วง Prototyping ที่พี่ประกอบแขนกลและสั่ง Servo ให้ขยับไปตำแหน่งต่างๆ ได้ ส่วนที่สองคือช่วง Precise Control ที่พี่สามารถสั่งตำแหน่งให้ Servo ได้ผ่าน ThingSpeak

Prototyping

พี่ใช้ Slider และ Constant blocks ในการสั่ง Servo บน Arduino ให้ขยับไปมุมต่างๆ พี่ใช้โมเดลนี้เพื่อหาค่าความคลาดเคลื่อนระหว่างมุมที่สั่งกับมุมจริงของแขน รวมถึงช่วงมุมที่ Servo แต่ละตัวสามารถขยับได้

บล็อกที่มีรูปเฟืองคือ PWM write blocks สำหรับสั่ง Servo ไปยังมุมระหว่าง 0 ถึง 180 องศา

พี่ใช้ Inverse Kinematics สำหรับแขนกลที่เคลื่อนที่ในระนาบ 2D เพื่อคำนวณหามุมที่จำเป็นต้องใช้ในการขยับแขนไปยังพิกัด X, Y ที่ต้องการ พี่พบว่าลิงก์นี้อธิบาย Kinematics ได้ค่อนข้างดี: https://appliedgo.net/roboticarm/

Precise Control

ถึงแม้โมเดลนี้จะดูซับซ้อนกว่าโมเดลก่อนหน้า แต่ Logic หลักยังเหมือนเดิม บล็อก Output ยังคงเป็น Servo write blocks ที่มีเฟือง ส่วนบล็อก Input ตอนนี้ไม่ใช่ Slider หรือ Constant แล้ว แต่เป็นข้อมูลที่อ่านมาจาก Channel บน ThingSpeak พี่จะอธิบายเรื่อง ThingSpeak ละเอียดอีกทีด้านล่าง Input คือตำแหน่ง X และ Y ของแขน ซึ่งจะถูกแปลงเป็นมุมที่ต้องสั่งให้แขน โดยใช้ MATLAB function block ชื่อ loc2angles ส่วน angles2loc block ที่อยู่ด้านบนสุดของโมเดล เป็นแค่ตัว Monitor ระบบเพื่อให้แน่ใจว่ามุม Servo ที่คำนวณได้นั้นแปลผลเป็นตำแหน่ง Input ที่ถูกต้อง โดยใช้ Forward Kinematics อีกเครื่องมือเจ๋งๆ จาก Simulink ที่พี่ใช้ในโปรเจกต์นี้คือ External Mode มันทำให้พี่ Monitor ระบบได้ขณะที่โปรแกรมกำลังรันอยู่บน Arduino เลย

บล็อกที่มีรูปเมฆสีเทาคือ ThingSpeak read block ที่มีอยู่ใน Simulink support package for Arduino พี่แค่ใส่ Channel ID, หมายเลข Data field ที่ต้องการอ่าน และ API read key มันก็จะส่งข้อมูลจาก Channel และ Field นั้นออกมา ไม่ต้องกังวลถ้ายังไม่คุ้นกับคำศัพท์พวกนี้ เดี๋ยวพี่จะอธิบายละเอียดให้ฟัง

Using ThingSpeak: Creating and Using a Channel

1. ไปที่ https://thingspeak.com/

2. คลิก ‘sign in’ ที่มุมขวาบน แล้วล็อกอินด้วยบัญชี MathWorks ฟรีของคุณ

3. ในหน้า Dashboard คลิก ‘New Channel’

4. กรอกข้อมูลตามด้านล่าง ข้อมูลที่แสดงคือทั้งหมดที่ต้องกรอก

5. คลิก ‘Save channel’ ด้านล่าง

6. ตอนนี้คุณก็สร้าง ThingSpeak channel เสร็จแล้ว

7. ใน MATLAB command window หรือใช้ MATLAB mobile app คุณสามารถใส่คำสั่งที่หน้าตาประมาณนี้ได้: thingSpeakWrite(chID, [0.6963.94 -12 0 0], 'WriteKey', APIKEY, 'Fields', [1 2 3 4 5]);

คำสั่งนี้จะเขียนข้อมูลใหม่ลงใน Fields ที่ระบุใน ThingSpeak channel คุณสามารถเปลี่ยนค่าใน Argument ที่สองของฟังก์ชันเพื่อเปลี่ยนค่าของ Field ที่สอดคล้องกันได้ หลังจากเปลี่ยนค่าแล้ว ข้อมูลใน Channel ควรเป็นแบบนี้:

Running the Model

เมื่อตั้งค่า ThingSpeak channel เสร็จแล้ว คุณสามารถรันโมเดลบน Arduino ในโหมด External Mode หรือ Deploy ลง Hardware เลยก็ได้ ใน Simulink model ให้ไปที่ ‘Model Configuration Parameters’ โดยคลิกที่เฟืองเล็กๆ ในแถบเมนูด้านบน เลือก ‘Hardware implementation’ และตรวจสอบให้แน่ใจว่า ‘Hardware Board’ คือ Arduino MKR 1000 ใต้หัวข้อ ‘Target Hardware Resources’ ในแท็บเดียวกัน คลิกที่ WiFi properties แล้วกรอกข้อมูล WiFi credentials เพื่อเชื่อมต่อเครือข่าย

คลิกปุ่ม Run สีเขียวเพื่อรันโมเดลในโหมด External หรือคลิกปุ่ม Deploy สีฟ้าเพื่อ Deploy ลง Hardware

เมื่อโมเดลเริ่มรันแล้ว คุณสามารถเขียนข้อมูลใหม่ลงใน Fields ของ ThingSpeak channel จาก MATLAB หรือ MATLAB mobile บนมือถือ แล้วดูแขนกลของคุณขยับตามได้เลย!

Code

https://www.mathworks.com/matlabcentral/fileexchange/68880-controlling-a-robotic-arm-from-anywhere-using-iot

ข้อมูล Frontmatter ดั้งเดิม

title: "Using IoT to Remotely Control a Robotic Arm"
description: "Controlling a robotic arm to pick up and drop objects is difficult enough, without IoT it would be near impossible to do this remotely."
author: "MadhuGovindarajan"
category: "Motors & Robotics"
tags:
  - "matlab"
  - "arduino"
  - "simulink"
views: 10803
likes: 5
price: 299
difficulty: "Intermediate"
components:
  - "1x Arduino MKR1000"
  - "1x Laser cutter (generic)"
tools: []
apps:
  - "1x Arduino IDE"
  - "1x MATLAB"
downloadableFiles: []
documentationLinks: []
passwordHash: "6ba633ae3464f55ef484efe8a2ab0099d1f8065204143420c4eb0323a76c328f"
encryptedPayload: "U2FsdGVkX1/XvfsmYG7TcWpjKPbfTyFifq9K+VcGngpw4mFaji1KY/51jLETGOoIT9afbispPIyJYO3IgBLnRWdaHraHL7UCjIY/Co29hSU="
seoDescription: "Learn how to use IoT for remote control of a Robotic Arm to pick and place objects efficiently."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/using-iot-to-remotely-control-a-robotic-arm-d70a8e_cover.jpg"
lang: "th"