Tải bản đầy đủ
3 Phương hướng phát triển để tài

3 Phương hướng phát triển để tài

Tải bản đầy đủ

-

Lắp thêm các camera và hệ thống xử lí ảnh tăng tốc độ xử lí và độ linh hoạt

-

của robot.
Tích hợp thêm các hệ thống cảm biến góc, encoder, tiệm cận, v.v.
Phát triển robot bằng tay sang bán tự động.

67

KẾT LUẬN
Sau một thời gian nhóm đã nghiên cứu, thiết kế, chế tạo thành công Robot đánh
cầu lông thỏa mãn yêu cầu của đề tài. Robot hoàn toàn có thể di chuyển linh hoạt đa
hướng phát và đỡ cầu. Thêm vào đó, robot cũng đã vượt qua vòng loại robocon
miền Bắc để tham dự vòng chung kết toàn quốc tại Cần Thơ trong tháng 5 năm
2015.
Tuy nhiên để áp dụng nó và thực tiễn trong huấn luyện và luyện tập thì robot
cần phải phát triển rất nhiều. Đây là một sản phẩm cơ điện tử hay, có ích trong lĩnh
vực thể dục, thể thao, và đòi hỏi rất nhiều công nghệ cấu hình trong robot. Chính vì
vậy. Nhóm rất mong nó có thể phát triển hơn và đước áp dụng rộng rãi trong cuộc
sống và là nguồn cảm hứng để sáng tạo nên các sản phẩm hay, hữu dụng hơn sau
này.
Cuối cùng chúng em xin chân thành cảm ơn nhà trường cùng khoa Cơ khí đã
đồng ý và cung cấp cơ sở vật chất cho nhóm thực hiện đề tài, cảm ơn thầy Nguyễn
Văn Trường cùng các thầy giáo trong khoa đã rất tận tình giúp đỡ, chỉ bảo chúng
em trong suốt thời gian làm đồ án.

68

TÀI LIỆU THAM KHẢO
[1] Phạm Đăng Phước. Robot công nghiệp. NXB khoa học xã hội, 2007.
[2]Cooke, A. Sports Engineering. 2002
[3] Badminton playing robot (tài liệu trên internet)
[4] Trần Hữu Quế. Vẽ kĩ thuật cơ khí tập 1, 2. NXB giáo dục, 2005.
[5] Nguyễn Văn Lẫm, Nguyễn Trọng Hiệp. Thiết kế chi tiết máy.
[6] Trịnh Chất, Lê Văn Uyển. Tính toán thiết kế hệ dẫn động cơ khí tập 1, 2.
[7] Heslder P. Oliveira, Armando J. Sousa, A.Paulo Moreira, Paulo J. Costa.
Modeling and Assessing of omni - directional robots with three and four wheels.
Universidade do Porto Portugal.
[8] Các trang wed điện tử:
+ codientu.org
+ arm.vn
+ dientuvietnam.net
+ datasheet.com
+ http://www.astropt.org/2015/01/17/descoberto-robot
+
http://citinews.net/khoa-hoc/robot-choi-cau-long-cung-con-nguoiZYCRFDI/

69

PHỤ LỤC
CODE Lập trình điều khiển
/*********************************************************************
* @file IME_2015
* @author Manual_Robot
* @version V1.0.0
*********************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"
//#include
#include
/* Private typedef -----------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
#define tien
#define lui

0
1

void PeriphClk_config(void); //Function to initiate peripheral clocks
void Timer3_config(void); //Configure timer 3
void SPI_config(void); //Configure SPI1
unsigned char Data[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char PS2_InitialPoll[5] = {0x01, 0x42, 0x00, 0x00, 0x00};
void delay_us(int delay_time);
unsigned char
L1,R1,L2,R2,L,R,Start,Select,Up,Down,Left,Right,X,Tron,Vuong,Tamgiac;
void PS2_send(unsigned char commands[], unsigned char data[], int length);
void Test_PS2(void);
void test_analog(unsigned char commands[], unsigned char data[], int length);
unsigned int speed=8000;
70

char dem=0;
void GPIO_config(void);
void EXT_Timer6(void);
void EXT_Timer7(void);
void delay_ms(u32 nTime);
void delay(u32 nTime);
void PWM_Config(void);
void run_DC0(long int toc_do,char chieu);
void run_DC1(long int toc_do,char chieu);
void run_DC2(long int toc_do,char chieu);
void run_DC3(long int toc_do,char chieu);
/* Private macro -------------------------------------------------------------*/
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
int main(void)
{
PeriphClk_config();
GPIO_config();
Timer3_config();
SPI_config();
EXT_Timer6();
PWM_Config();
GPIO_SetBits(GPIOB,GPIO_Pin_13);//Tat he thong ong khi khoi dong
GPIO_SetBits(GPIOB,GPIO_Pin_12);
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
GPIO_SetBits(GPIOD,GPIO_Pin_8);
71

GPIO_SetBits(GPIOD,GPIO_Pin_9);
while (1)
{
Test_PS2();
}
}
//PA5 - SPI1_SCLK clk
//PA4 - SPI1_NSS
//PA6 - SPI1_MISO data
//PA7 - SPI1_MOSI command
//PA3 - CS (GPIO) att
void PS2_send(unsigned char commands[], unsigned char data[], int length)
{
int i = 0;
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //set CS pin low to select PS2
delay_us(50); //15us delay before sending commands
for(i = 0; i < length; i = i + 1)
{
while(SPI_I2S_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET){}
delay_us(70);
SPI_I2S_SendData(SPI1, commands[i]);
delay_us(70);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET){}
delay_us(70);
data[i] = SPI_I2S_ReceiveData(SPI1);
delay_us(70); //15us delay before sending next command
}
GPIO_SetBits(GPIOA, GPIO_Pin_3); //set CS pin high to deselect PS2
Select = Data[3]&0x01;
L = (Data[3]&0x02)/2;
R = (Data[3]&0x04)/4;
Start = (Data[3]&0x08)/8;
72

Up = (Data[3]&0x10)/16;
Right = (Data[3]&0x20)/32;
Down = (Data[3]&0x40)/64;
Left = (Data[3]&0x80)/128;
L2 = (Data[4]&0x01);
R2 = (Data[4]&0x02)/2;
L1 = (Data[4]&0x04)/4;
R1 = (Data[4]&0x08)/8;
Tamgiac = (Data[4]&0x10)/16;
Tron = (Data[4]&0x20)/32;
X = (Data[4]&0x40)/64;
Vuong = (Data[4]&0x80)/128;
}
void delay_us(int delay_time)
{
//can delay to a max of 60000us or 60ms
int time = TIM3->CNT; //get initial time
while ((TIM3->CNT - time) < delay_time);
}
void PeriphClk_config(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC|
RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOB, ENABLE);
//APB1 clock runs at SystemCoreClock/APB1_Prescaler = 64/2 = 32MHz
//Max speed of APB1 clock is 42Mhz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//APB2 clock runs at SystemCoreClock/8 = 8MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
}
void Timer3_config(void)
{
73

//Tim3Clk = 2* PCLK1
//PCLK1 = (HCLK)/(APB1 Prescaler) = SystemCoreClock/2
//Get the APB1 Prescaler from system_stm32f4xx.c
//Tim3Clk = SystemCoreCLock
//CONFIGURE TIMER3 CHANNEL 3 as timer only
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
uint16_t PrescalerValue = (uint16_t) ((SystemCoreClock) / 1000000) - 1;
TIM_TimeBaseStructure.TIM_Period = 60000; //final frequency = clock frequency/
(prescalervalue * tim_period)
//count from 0-60000 at 1Mhz
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_Cmd(TIM3, ENABLE); //enable timer TIM3
}
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOA|
RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOB, ENABLE);
//DIR for DC motor
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|
GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14| GPIO_Pin_13 ;
74

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12 ;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//=========================Xilanh=============================//
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14|
GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11
;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//=======================Read
Sensor===================================//
//Configure pins associated with SPI for PSII
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure); //configure CS pin
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
75

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); //sclk
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); //MISO
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); //MOSI
GPIO_SetBits(GPIOA, GPIO_Pin_3); //set CS high to deselect PS2
}
void SPI_config(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_I2S_DeInit(SPI1);
// if you want to incease lengh of wire you must incease Prescaler in SPI
SPI_InitStructure.SPI_BaudRatePrescaler =
SPI_BaudRatePrescaler_128; //8MHz/64 = 125000kHz
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //sample on second edge (falling)
of clock
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //clock high when idle
SPI_InitStructure.SPI_CRCPolynomial = 0;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //send 8 bits at a time
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //full duplex
communication
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; //least significant bit first
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
void Test_PS2(void)
{
PS2_send(PS2_InitialPoll, Data,5);
76

Data[3] = ~Data[3];
//

if(Select==0)

//

{}

//

else if(L==0)

//
//

{}
else if(R==0)

//
//

{}
else if(Start==0)

//
//

{}
else
if(Up==0)
{
run_DC0(0,lui);
run_DC1(0,lui);
run_DC2(0,tien);
run_DC3(0,tien);
}
else if(Right==0)
{
run_DC0(0,lui);
run_DC1(0,tien);
run_DC2(0,tien);
run_DC3(0,lui);
}
else if(Down==0)
{
run_DC0(0,tien);
run_DC1(0,tien);
run_DC2(0,lui);
run_DC3(0,lui);
}
else if(Left==0)
77