You are on page 1of 38

Báo cáo môn học:

ROBOT CÔNG NGHIỆP


Gỉang viên hướng dẫn
Mục Lục
1.GIỚI THIỆU VỀ ROBOT 4 BẬC
2. PHẦN MỀM ARDUINO
3. PHẦN CỨNG
4. SƠ ĐỒ ĐẤU DÂY VÀ GIAO DIỆN ĐIỀU KHIỂN
5. THIẾT KẾ TRÊN SOLIDWORK
6. HÌNH ẢNH THỰC TẾ

1.GIỚI THIỆU VỀ ROBOT 4 BẬC:


Cấu Trúc Cơ Bản Của Robot Công Nghiệp. Mọi Robot Công
Nghiệp được cấu thành bởi các hệ thống sau: 
-TAY MÁY ( MANIPULATOR ): Là cơ cấu cơ khí gồm các
khâu, khớp. Chúng hình thành cánh tay để tạo các chuyển động
cơ bản, cổ tay tạo nên sự khéo léo, linh hoạt và bàn tay (end
effector) để trực tiếp hoàn thành các thao tác trên đối tượng.
-CƠ CẤU CHẤP HÀNH: Nó tạo chuyển động cho các khâu
của tay máy. Nguồn động lực của các cơ cấu chấp hành là động
cơ các loại: điện, thủy lực, khí nén hoặc kết hợp giữa chúng.
-HỆ THỐNG CẢM BIẾN: Gồm các sensor và thiết bị chuyển
đổi tín hiệu cần thiết khác. Các robot cần hệ thống sensor trong
để nhận biết trạng thái của bản thân các cơ cấu của robot và các
sensor ngoài để nhận biết trạng thái của môi trường.
Tổng Quan Về Robot 4 Bậc: Về cơ bản, một cánh tay robot 4
DOF được chế tạo với 4 trục servo bao gồm các phần dọc và
ngang. Các bộ phận này bao gồm servo cơ sở, servo vai, servo
tay và servo kẹp. Quá trình thiết kế bắt đầu bằng cách chế tạo
một dụng cụ cánh tay robot và sau đó sắp xếp thành một đơn vị
hoàn chỉnh.
Robot với cấu hình 4 bậc tự do RRRR, bao gồm : 
- Khớp đầu tiên là khớp xoay giúp cánh tay xoay sang hai bên; 
- Tiếp đó là 3 khớp xoay giúp cánh tay gập lên xuống để nâng hạ
vật và tay kẹp dùng để gắp vật.
 Ưu điểm: - Tầm với của robot lớn hơn so với robot 3
bậc tự do RRR. Do đó không gian làm việc lớn hơn,
phù hợp hơn với công việc.
- Với 4 bậc tự do robot linh
hoạt hơn trong việc di chuyển tiếp cận vật.
 Nhược điểm: - Thiết kế cơ khí phức tạp hơn so với
robot 3 bậc tự do RRR. 
- Điều khiển robot cũng phức tạp hơn.
-Lựa Chọn Phương Án:
+Ta lựa chọn phương án thiết kế là robot 4 bậc tự do RRRR. Vì
không gian làm việc lớn hơn, robot linh hoạt hơn và phù hợp với
yêu cầu của đề tài. 
+ Robot gồm 4 khâu ( 3 thanh truyền nồi giữa các khớp và tay
kẹp) và 4 khớp xoay
-Chọn Vật Liệu: Vật liệu làm robot chủ yếu là gỗ. 
-Chọn Động Cơ :
+ Cánh tay robot phải được điều khiển một cách chính xác nên
ta chon động cơ servo để điều khiển các khớp 
+Động cơ sử dụng nguồn 12V, DC 
+ Dòng khởi động của động cơ 1.3A. 
-Thiết Kế Thân Robot:
+ Khớp 1 ( Khớp đế )
Đây là khớp đế xoay của cánh tay, chủ yếu chịu lực uốn và nén. 
+ Khớp 2, 3, 4
Trục khớp này chủ yếu chịu lực cắt tại 2 vị trí nối với khâu tiếp
theo, sử dụng trục Ө10.
Truyền động cho khớp bằng động cơ servo.
+Tay kẹp 
Ứng dụng nguyên lý tay kẹp hình bình hành để có thể đóng mở
má kẹp song song, tiếp xúc tốt hơn với vật công tác. Truyền
động cho má kẹp đóng mở bằng.
2. PHẦN MỀM ARDUINO :
 Arduino IDE là một phần mềm mã nguồn mở chủ
yếu được sử dụng để viết và biên dịch mã vào module
Arduino.
Đây là một phần mềm Arduino chính thức, giúp cho việc biên
dịch mã trở nên dễ dàng mà ngay cả một người bình thường
không có kiến thức kỹ thuật cũng có thể làm được.
Nó có các phiên bản cho các hệ điều hành như MAC, Windows,
Linux và chạy trên nền tảng Java đi kèm với các chức năng và
lệnh có sẵn đóng vai trò quan trọng để gỡ lỗi, chỉnh sửa và biên
dịch mã trong môi trường.
Có rất nhiều các module Arduino như Arduino Uno, Arduino
Mega, Arduino Leonardo, Arduino Micro và nhiều module
khác.
Mỗi module chứa một bộ vi điều khiển trên bo mạch được lập
trình và chấp nhận thông tin dưới dạng mã.
Mã chính, còn được gọi là sketch, được tạo trên nền tảng IDE sẽ
tạo ra một file Hex, sau đó được chuyển và tải lên trong bộ điều
khiển trên bo.
Môi trường IDE chủ yếu chứa hai phần cơ bản: Trình chỉnh sửa
và Trình biên dịch, phần đầu sử dụng để viết mã được yêu cầu
và phần sau được sử dụng để biên dịch và tải mã lên module
Arduino.
Môi trường này hỗ trợ cả ngôn ngữ C và C ++
 Arduino IDE hoạt động :
Khi người dùng viết mã và biên dịch, IDE sẽ tạo file Hex cho
mã. File Hex là các file thập phân Hexa được Arduino hiểu và
sau đó được gửi đến bo mạch bằng cáp USB. Mỗi bo Arduino
đều được tích hợp một bộ vi điều khiển, bộ vi điều khiển sẽ
nhận file hex và chạy theo mã được viết.
 Code arduino :

#include <Servo.h>
Servo myservoa, myservob, myservoc, myservod;
int servoa2, servob2, servoc2, servod2; //vị trị hiện tại
int servoa1, servob1, servoc1, servod1; // vị trí trước đó
int servoa[50], servob[50], servoc[50],servod[50];
int speeddelay= 10;
int index=0;
String data ="";
void setup()
{
Serial.begin(9600);

myservoa.attach(3);
myservob.attach(5);
myservoc.attach(6);
myservod.attach(9);

servoa1=90;
servob1=0;
servoc1=120;
servod1=50;
myservoa.write(servoa1);
myservob.write(servob1);
myservoc.write( servoc1);
myservod.write(servod1);
}

void loop()
{
if (Serial.available()>0)
{
data = Serial.readString();

if (data.startsWith("sa"))
{
String dataIns= data.substring(2, data.length());
servoa1 = dataIns.toInt();
if (servoa2 < servoa1)
{
for (int i = servoa2; i < servoa1; i++)
{
myservoa.write(i);
delay(10);
}

}
else
{
if (servoa2 > servoa1)
{
for (int i = servoa2; i > servoa1; i--)
{
myservoa.write(i);
delay(10);
}
}
}
servoa2 = servoa1;
}
/////////////////////////////////////////////////////////////////////////////
/
if (data.startsWith("sb"))
{
String dataIns= data.substring(2, data.length());
servob1 = dataIns.toInt();
if (servob2 < servob1)
{
for (int i = servob2; i < servob1; i++)
{
myservob.write(i);
delay(10);
}
}
else
{
if (servob2 > servob1)
{
for (int i = servob2; i > servob1; i--)
{
myservob.write(i);
delay(10);
}
}
}
servob2 = servob1;
}
///////////////////////////////////////////////////////////////////////
if (data.startsWith("sc"))
{
String dataIns= data.substring(2, data.length());
servoc1 = dataIns.toInt();
if (servoc2 < servoc1)
{
for (int i = servoc2; i < servoc1; i++)
{
myservoc.write(i);
delay(10);
}

}
else
{
if (servoc2 > servoc1)
{
for (int i = servoc2; i > servoc1; i--)
{
myservoc.write(i);
delay(10);
}
}
}
servoc2 = servoc1;
}
/////////////////////////////////////////////////////
if (data.startsWith("sd"))
{
String dataIns= data.substring(2, data.length());
servod1 = dataIns.toInt();
if (servod2 < servod1)
{
for (int i = servod2; i < servod1; i++)
{
myservod.write(i);
delay(10);
}

}
else
{
if (servod2 > servod1)
{
for (int i = servod2; i > servod1; i--)
{
myservod.write(i);
delay(10);
}
}
}
servod2 = servod1;
}
if (data.startsWith("SAVE"))
{
servoa[index] = servoa2; // lưu vị trí vào một mảng
servob[index] = servob2;
servoc[index] = servoc2;
servod[index] = servod2;
index++;
}
if (data.startsWith("RUN")) {
runservo(); // Automatic mode - run the saved
steps
}
if ( data == "RESET") {
memset(servoa, 0, sizeof(servoa)); // Clear the array
data to 0
memset(servob, 0, sizeof(servob));
memset(servoc, 0, sizeof(servoc));
memset(servod, 0, sizeof(servod));

index = 0; // Index to 0
}
}
}
void runservo () {
while (data != "RESET") { // Run the steps over and
over again until "RESET" button is pressed
for (int i = 0; i <= index - 2; i++) { // Run through all
steps(index)
if (Serial.available() > 0) { // Check for
incomding data
data = Serial.readString();
if ( data == "PAUSE") { // If button
"PAUSE" is pressed
while (data != "RUN") { // Wait until
"RUN" is pressed again
if (Serial.available() > 0) {
data= Serial.readString();
if ( data == "RESET") {
break;
}
}
}
}
// If speed slider is changed
if (data.startsWith("ss")) {
String dataIns = data.substring(2, data.length());
speeddelay = dataIns.toInt(); // Change servo
speed (delay time)
}
}
// Servo 1
if (servoa[i] == servoa[i + 1]) {
}
if (servoa[i] > servoa[i + 1]) {
for ( int j = servoa[i]; j >= servoa[i + 1]; j--) {
myservoa.write(j);
delay(speeddelay);
}
}
if (servoa[i] < servoa[i + 1]) {
for ( int j = servoa[i]; j <= servoa[i + 1]; j++) {
myservoa.write(j);
delay(speeddelay);
}
}
// Servo 2
if (servob[i] == servob[i + 1]) {
}
if (servob[i] > servob[i + 1]) {
for ( int j = servob[i]; j >= servob[i + 1]; j--) {
myservob.write(j);
delay(speeddelay);
}
}
if (servob[i] < servob[i + 1]) {
for ( int j = servob[i]; j <= servob[i + 1]; j++) {
myservob.write(j);
delay(speeddelay);
}
}
// Servo 3
if (servoc[i] == servoc[i + 1]) {
}
if (servoc[i] > servoc[i + 1]) {
for ( int j = servoc[i]; j >= servoc[i + 1]; j--) {
myservoc.write(j);
delay(speeddelay);
}
}
if (servoc[i] < servoc[i + 1]) {
for ( int j = servoc[i]; j <= servoc[i + 1]; j++) {
myservoc.write(j);
delay(speeddelay);
}
}
// Servo 4
if (servod[i] == servod[i + 1]) {
}
if (servod[i] > servod[i + 1]) {
for ( int j = servod[i]; j >= servod[i + 1]; j--) {
myservod.write(j);
delay(speeddelay);
}
}
if (servod[i] < servod[i + 1]) {
for ( int j = servod[i]; j <= servod[i + 1]; j++) {
myservod.write(j);
delay(speeddelay);
}
}
}
}
}

3. PHẦN CỨNG :
-Gỗ
-Dây Jumper : Được sử dụng với Breadboard để kết nối các
module và linh kiện điện tử với nhau
-Bo mạch test (Breadboard): Dùng để cắm linh kiện
-Nút nhấn: Dùng để dạy lệnh cho cánh tay rôbôt
-Servo SG 90 :Cung cấp lực chuyển động cần thiết cho các thiết
bị máy móc khi vận hành
-Arduino Atemega 328 : Dùng để xử lý và điều khiển

Vi điều khiển ATmega328 họ 8bit


Điện áp hoạt 5V DC (chỉ được cấp qua
động cổng USB)
Tần số hoạt
16 MHz
động
Dòng tiêu thụ khoảng 30mA
Điện áp vào
7-12V DC
khuyên dùng
Điện áp vào giới
6-20V DC
hạn
Số chân Digital 14 (6 chân hardware PWM)
I/O
Số chân Analog 6 (độ phân giải 10bit)
Dòng tối đa trên
30 mA
mỗi chân I/O
Dòng ra tối đa
500 mA
(5V)
Dòng ra tối đa
50 mA
(3.3V)
32 KB (ATmega328) với
Bộ nhớ flash
0.5KB dùng bởi bootloader
4. SƠ ĐỒ ĐẤU DÂY VÀ GIAO DIỆN ĐIỀU KHIỂN
 Sơ đồ đấu dây:
 Giao diện điều khiển:
Code C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
using System.IO.Ports;// thêm vào để xài serialport
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
delegate void setTextCallback(string s);

public Form1()
{

InitializeComponent();

}
private void timer1_Tick(object sender, EventArgs e)
{
label11.Text = DateTime.Now.ToLongTimeString();

}
private void Form1_Load(object sender, EventArgs e)
{
Init_Port_Confs();

serialPort.ReadTimeout = 1000;
serialPort.Close();
DateTime time_d = DateTime.Now;// ngày tháng năm
hiện tại trong máy tính
label10.Text =
time_d.ToString("dd/MM/yyyy");//cập nhật thời gian ngày
tháng năm hiện tại vào label10
timer1.Start();
//timer2.Start();
label12.ForeColor = System.Drawing.Color.Red;
label12.Text = "Chưa Kết Nối";

private void Init_Port_Confs()


{
string[] str = SerialPort.GetPortNames(); //Quét
các cổng Serial đang hoạt động trên máy tính
if (str == null) // nếu không có cổng com nào
{
// MessageBox.Show("Không có COM tồn
tại!", "Error");
return;
}

foreach (string s in str)//mếu có serial thì ta


add tất cả vào comboboxCom
{
comboBoxCom.Items.Add(s);
}
comboBoxCom.SelectedIndex = 0;// chọn mặc định
serialcom đầu tiên mà phần mềm phát hiện được trên máy tính
để đưa vào comboBoxCom

string[] baudRate = { "2400", "4800", "9600",


"19200", "38400", "57600", "115200" };
foreach (string s in baudRate)//thêm tất cả các
phần tử trong mảng bauRate vào comboBoxBauRate
{
comboBoxBaudRate.Items.Add(s);
}
comboBoxBaudRate.SelectedIndex = 2;//chọn mặc
định tốc độ truyền BauRate 9600

private void ketnoi_Click(object sender, EventArgs


e)
{
if (!serialPort.IsOpen) // nếu cổng serialcom
chưa mở
{
try
{
if (comboBoxCom.SelectedIndex ==
-1)//kiểm tra cổng com đã chọn
{
MessageBox.Show(" Không thể mở cổng
COM", "Lỗi");
// MessageBox.Show("Không thể mở
cổng!", "Lỗi", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Hand, MessageBoxDefaultButton.Button2,
MessageBoxOptions.ServiceNotification);
return;
}

string strSerialName =
comboBoxCom.SelectedItem.ToString();
string strBaudRate =
comboBoxBaudRate.SelectedItem.ToString();

Int32 iBaudRate =
Convert.ToInt32(strBaudRate);// chuyển kiểu dữ liệu của
strBaudRate từ chuỗi sang số và gán cho biến mới iBaudRate

serialPort.PortName =
strSerialName;//tên của serial Com đã chọn
serialPort.BaudRate = iBaudRate;//tốc độ
BaudRate của serial Com đã chọn

serialPort.Open(); // mở cổng serial Com


comboBoxCom.Enabled = false;
comboBoxBaudRate.Enabled = false;

label12.ForeColor =
System.Drawing.Color.Blue;
label12.Text = "Đã kết nối";
ketnoi.Text = "Ngắt kết nối";//hiện chữ
"Ngắt kết nối" trên nút nhấn sau khi đã nhấn để mở Com nhận
dữ liệu từ arduino
ketnoi.BackColor =
System.Drawing.Color.Red;//màu cho nút Đóng COM
}
catch (System.Exception ex)// nếu trong Try
có lỗi thì catch sẽ giải quyết
{
MessageBox.Show("Error:" + ex.Message,
"Error");
return;
}
}
else // nếu com đang mở khi ta nhấn nút Ngắt kết
nối thì cổng Com sẽ đóng việc truyền dữ liệu
{

serialPort.Close(); // đóng cổng Com đã chọn

comboBoxCom.Enabled = true;
comboBoxBaudRate.Enabled = true;

// Button_Refresh.Enabled = true;// cho phép


nút Làm mới có tên truy cập: Button_Refresh hoạt động
//buttonexit.Enabled = true;
label12.ForeColor =
System.Drawing.Color.Red;
label12.Text = "Chưa Kết Nối";
ketnoi.Text = "Kết nối"; // hiện chữ "Kết
nối" trên nút nhấn sau khi đã nhấn để đóng Com
ketnoi.BackColor =
System.Drawing.Color.Lime;//Màu xanh lục cho nút Mở COM

}
}
private void Thoat_Click(object sender, EventArgs e)
{
DialogResult kq = MessageBox.Show("Bạn có chắc
chắn muốn thoát ?", "Điểu Khiển", MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (kq == DialogResult.Yes)
{
Application.Exit();
}
}

private void button1_Click(object sender, EventArgs


e)
{
if (serialPort.IsOpen)
{

if (textBox2.Text != String.Empty)
{
String khop1 = "sa"+ textBox2.Text ;
serialPort.Write(khop1);
}
else
{
MessageBox.Show("Chưa nhập giá trị",
"Error");
}

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void button2_Click(object sender, EventArgs


e)
{
if (serialPort.IsOpen)
{
if (textBox3.Text != String.Empty)
{
String khop2 = "sb" +textBox3.Text;
serialPort.Write(khop2);
}
else
{
MessageBox.Show("Chưa nhập giá trị",
"Error");
}

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void button3_Click(object sender, EventArgs


e)
{
if (serialPort.IsOpen)
{

if (textBox4.Text != String.Empty)
{
String khop3 = "sc" + textBox4.Text;
serialPort.Write(khop3);
}
else
{
MessageBox.Show("Chưa nhập giá trị",
"Error");
}

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}
private void button4_Click(object sender, EventArgs
e)
{
if (serialPort.IsOpen)
{

if (textBox5.Text != String.Empty)
{
String khop4 = "sd" + textBox5.Text;
serialPort.Write(khop4);
}
else
{
MessageBox.Show("Chưa nhập giá trị",
"Error");
}

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");

private void trackBar1_Scroll(object sender,


EventArgs e)
{
if (serialPort.IsOpen)
{
textBox6.Text = trackBar1.Value.ToString();
String khop1 = "sa" + textBox6.Text;
serialPort.Write(khop1);

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void trackBar2_Scroll(object sender,


EventArgs e)
{

if (serialPort.IsOpen)
{
textBox7.Text = trackBar2.Value.ToString();
String khop2 = "sb" + textBox7.Text;
serialPort.Write(khop2);

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");

private void trackBar3_Scroll(object sender,


EventArgs e)
{
if (serialPort.IsOpen)
{
textBox8.Text = trackBar3.Value.ToString();
String khop3 = "sc" + textBox8.Text;
serialPort.Write(khop3);

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void trackBar4_Scroll(object sender,


EventArgs e)
{
if (serialPort.IsOpen)
{
textBox9.Text = trackBar4.Value.ToString();
String khop4 = "sd" + textBox9.Text;
serialPort.Write(khop4);

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void save_Click(object sender, EventArgs e)


{
if (serialPort.IsOpen)
{

serialPort.Write("SAVE");
}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void run_Click(object sender, EventArgs e)


{
if (serialPort.IsOpen)
{

serialPort.Write("RUN");
}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void pause_Click(object sender, EventArgs e)


{
if (serialPort.IsOpen)
{

serialPort.Write("PAUSE");
}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void reset_Click(object sender, EventArgs e)


{
if (serialPort.IsOpen)
{

serialPort.Write("RESET");
}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

private void button5_Click(object sender, EventArgs


e)
{
if (serialPort.IsOpen)
{

if (textBox10.Text != String.Empty)
{
String speed = "ss" + textBox10.Text;
serialPort.Write(speed);
}
else
{
MessageBox.Show("Chưa nhập giá trị",
"Error");
}

}
else
MessageBox.Show("Chưa kết nối cổng COM",
"Error");
}

5. THIẾT KẾ TRÊN SOLIDWORK


6. HÌNH ẢNH THỰC TẾ

You might also like