標(biāo)題:
智能小車循跡加避障電路圖 源程序
[打印本頁]
作者:
780102636
時(shí)間:
2016-12-10 17:56
標(biāo)題:
智能小車循跡加避障電路圖 源程序
這個(gè)簡(jiǎn)單的避障小車使用超聲波進(jìn)行距離測(cè)量,根據(jù)測(cè)量距離決定小車行駛方向。對(duì)于避障做了簡(jiǎn)化處理,只要有障礙物就右轉(zhuǎn)。為了節(jié)省成本,只用了一個(gè)超聲波模塊,因此只能對(duì)正前方物體進(jìn)行避障。小車采用三輪結(jié)構(gòu),速度差進(jìn)行方向控制。
超聲波模塊使用的成品模塊,單片機(jī)使用一個(gè)最小系統(tǒng)板,底板上有L293D電機(jī)驅(qū)動(dòng)模塊?傮w組裝如下圖:
0.png
(369.1 KB, 下載次數(shù): 112)
下載附件
2017-1-7 16:54 上傳
避障小車原理圖.rar
(35.42 KB, 下載次數(shù): 95)
2017-1-7 16:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
避障小車源代碼.rar
(4.46 KB, 下載次數(shù): 44)
2017-1-7 16:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
部分源碼預(yù)覽:
/*
* motor.c
*
* Created on: 2011-3-3
* Author: Jason Jiang
* Home Page: www.ruixuedz.com.cn
* Email: ruixuedz@gmail.com
*/
#include "motor.h"
#include "uart.h"
MOTOR_STATE g_motor_state = MOTOR_STOP;
uchar g_count = 0;
uchar g_left_pwm = 0;
uchar g_right_pwm = 0;
void motor_init()
{
cli();
INPUT_DDR |= _BV(LEFT_INPUT1) | _BV(LEFT_INPUT2) | _BV(RIGHT_INPUT1) | _BV(
RIGHT_INPUT2);
ENABLE_DDR |= _BV(LEFT_ENABLE) | _BV(RIGHT_ENABLE);
INPUT_PORT &= ~(_BV(LEFT_INPUT1) | _BV(LEFT_INPUT2) | _BV(RIGHT_INPUT1)
| _BV(RIGHT_INPUT2));
ENABLE_PORT &= ~(_BV(LEFT_ENABLE) | _BV(RIGHT_ENABLE));
setSpeed(200, 200);
TCCR0 = 0x00; //停止定時(shí)器
TCNT0 = 0x38; //設(shè)置初始值
TIMSK |= 0x01;
TCCR0 = 0x02; //開動(dòng)定時(shí)器
sei();
}
void motor_rotate()
{
if (MOTOR_ROTATE == g_motor_state)
{
return;
}
steerMotor(ROTATE_RIGHT);
g_motor_state = MOTOR_ROTATE;
}
void motor_forward()
{
if (MOTOR_FORWARD == g_motor_state)
{
return;
}
steerMotor(MOVE_FORWARD);
g_motor_state = MOTOR_FORWARD;
}
void steerMotor(MOTOR_STEER_ENUM steer)
{
switch (steer)
{
case MOVE_FORWARD:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
break;
case TURN_LEFT:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor off
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
break;
case TURN_RIGHT:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor off
break;
case ROTATE_LEFT:
INPUT_PORT |= (1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor On Reverse
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
break;
case ROTATE_RIGHT:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
INPUT_PORT |= (1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor On Reverse
break;
case MOVE_BACKWARD:
INPUT_PORT |= (1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor On Reverse
INPUT_PORT |= (1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor On Reverse
break;
case FULL_STOP:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor off
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor off
break;
default:
break;
}
}
void setSpeed(uchar left_pwm, uchar right_pwm)
{
g_left_pwm = left_pwm;
g_right_pwm = right_pwm;
}
ISR(TIMER0_OVF_vect) //定時(shí)器溢出中斷程序
{
TCNT0 = 0x38; //從新調(diào)入初始值
g_count++; //每中斷一次加1
//printStr("int\n");
if (g_count < g_left_pwm) //判斷pwm1是不是改輸出高電平
{
ENABLE_PORT |= (1 << LEFT_ENABLE);
//printStr("l1\n");
}
else
{ //不是則輸出0
ENABLE_PORT &= ~(1 << LEFT_ENABLE);
//printStr("l0\n");
}
if (g_count < g_right_pwm)
{
ENABLE_PORT |= (1 << RIGHT_ENABLE);
//printStr("r1\n");
}
else
{
ENABLE_PORT &= ~(1 << RIGHT_ENABLE);
//printStr("r0\n");
}
}
復(fù)制代碼
作者:
瘋和尚
時(shí)間:
2018-4-9 18:31
很好,對(duì)我很有幫助
作者:
WKG_123456
時(shí)間:
2018-7-24 14:08
群主你好!在51黑內(nèi)在示教控制器方面資料嗎?謝謝!若有那個(gè)髙手知道,加我QQ:550220127聊!謝謝!!
作者:
飛飛....
時(shí)間:
2018-8-2 17:23
這用的是51單片機(jī)嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1