q601564446 发表于 2013-4-29 20:20:07

【LSL学习笔记1】无硬件基础,最简单小车

首先我是学软件的,所以关于电路的一概不知道,电学都还停留在高中阶段。突然有天发现了arduino,发现可以利用我熟悉的编程来实现对硬件的控制,即果断决定买来学习。然而对于外围设备怎么办呢,又卜会焊电路板,还好有现成的模块可以使用。
废话卜多说了。

物料单:
无传感器版本
1.arduinouno开发板               一块                     48~70
2.小车套件                                 一套                     35
3.L298N模块                              一块                      8
4.杜邦线若干                              一大把                  6

一下是推荐的传感器(有了传感器这样小车就可以变得更智能)
1.HC-SR04超声波传感器               一块                     7                           自动蔽障小车
2.HC-06蓝牙从机模块                   一块                     30                         手机无线控制
3.MPU-6050模块                           一块                     18                         做好3轮车后,结合该模块可做2轮平衡小车
4.可充电的锂电池                        一块                     没买过                  本人用的是4颗南孚电池,太奢侈了,用完了又得买的

javascript:;
来些图片吧
javascript:;
javascript:;
javascript:;
javascript:;
javascript:;


// 左轮控制口
int In1 = 8;
int In2 = 9;
//int EnA = 3;(待添加)

// 右轮控制口
int In3 = 10;
int In4 = 11;
//int EnB = ;(待添加)

//蓝牙数据传输口(3.3V)
const int pinRx = 0;
const int pinTx = 1;
//运行控制
int dir;
//运行速度
//int speeds;//待开发

//超声波传感器端口(5V)
const int TrigPin = 2;
const int EchoPin = 3;
//距离值
float cm;
//当达到distance值时,小车停止,改变运行方向
float distance = 15.00;
//是否有障碍物
boolean barrier = false;

//void b_foward(){};      //前进
//void b_back(){};          //后退
//void b_left(){};          //左拐弯
//void b_right(){};         //右拐弯
//void b_stop(){};          //停车
//void b_distance(){};      //测障碍物距离
//boolean b_change_dir(){};   //前方是否有障碍物

void setup() {

Serial.begin(9600);//设置波特率

//左轮端口模式设置
pinMode(In1, OUTPUT);
pinMode(In2, OUTPUT);
//右轮端口模式设置
pinMode(In3, OUTPUT);
pinMode(In4, OUTPUT);

//左轮端口模式设置初始化
digitalWrite(In1, LOW);
digitalWrite(In2, LOW);
//右轮端口模式设置初始化
digitalWrite(In3, LOW);
digitalWrite(In4, LOW);

//蓝牙数据传输口模式设置
pinMode(pinTx, OUTPUT);
pinMode(pinRx, INPUT);

//超声波传感器端口模式设置
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}

void loop() {

//拥有轮训控制结构(蓝牙控制,测超声波自动避障...)

//串口控制版(蓝牙,无线模块)
//int dir = Serial.read();    //从串口读取接受到的控制信息
//
//switch(dir)
//{
//   case 'l':
//      b_left();
//      break;
//   case 'r':
//      b_right();
//      break;
//   case 'f':
//      b_foward();
//      break;
//   case 'b':
//      b_back();
//      break;
//   default:
//      b_stop();
//}

//测超声波自动避障版(无舵机,定向避障)
b_distance();         //测障碍物距离
barrier = b_change_dir();   //前方是否有障碍物
if(barrier)
    b_back();          //前进
else{
    b_left();            //左转
    b_distance();      //测障碍物距离
}

//无传感器版
//      b_left();
//      b_right();
//      b_foward();
//      b_back();
//      b_stop();

}
   
void b_foward()    //前进
{
      digitalWrite(In1, LOW);
      digitalWrite(In2, HIGH);
      digitalWrite(In3, LOW);
      digitalWrite(In4, HIGH);
      Serial.println("b_foward!");
      delay(500);
}
void b_back()   //后退
{
      digitalWrite(In1, HIGH);
      digitalWrite(In2, LOW);
      digitalWrite(In3, HIGH);
      digitalWrite(In4, LOW);
      Serial.println("b_back!");
      delay(500);
}
void b_left()      //左拐弯
{
      digitalWrite(In1, HIGH);
      digitalWrite(In2, LOW);
      digitalWrite(In3, LOW);
      digitalWrite(In4, HIGH);
      Serial.println("b_left!");
      delay(1000);
}
void b_right()   //右拐弯
{
      digitalWrite(In1, LOW);
      digitalWrite(In2, HIGH);
      digitalWrite(In3, HIGH);
      digitalWrite(In4, LOW);
      Serial.println("b_right!");
      delay(2000);
}
void b_stop()      //停车
{
      digitalWrite(In1, LOW);
      digitalWrite(In2, LOW);
      digitalWrite(In3, LOW);
      digitalWrite(In4, LOW);
      Serial.println("b_stop!");
      delay(1000);
}

void b_distance()   //测障碍物距离
{
digitalWrite(TrigPin, LOW);         //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

cm = pulseIn(EchoPin, HIGH) / 58.0;   //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0;       //保留两位小数
}

boolean b_change_dir()    //前方是否有障碍物
{
if(0 < (cm-distance))
    return false;
return true;
}






代码里面有很多的版本,只要把卜用的注释,用的取消注释就好了。



作为学软件的人,把我使用模块的经验分享下。
L298N
javascript:;
因为驱动电机电流太大所以我们不能直接将电机的两个引线接到arduino板子上的两个数字脚上(假如可以的话,我举个例子:马达分别接数字脚6和7,6脚给高电平,7脚给低电平,马达就会转;6脚给低电平,7脚给高电平,马达就会反转,这样控制马达理解了吗?)。现在L298我们可以理解它就是一个桥梁,使arduino的驱动能力增加了。要使L298工作起来,必须供电(废话)。现在我们用个12V-9V的电源的正负分别接到“+12V供电”和“供电GND”。还要特别注意要与arduino共地!共地就是arduino的GND连接到“供电GND”,通道A、B使能那个跳帽不用拔掉。现在我们把数字脚6、7分别接到IN1,IN2,马达接线接到“输出A”。现在6脚给高电平,7脚给低电平,马达就会转;6脚给低电平,7脚给高电平,马达就会反转。我的L298就是这样驱动起来的。





推荐几个我觉得有意思的小制作吧!现在都处于我的想法阶段,东西都准备好了,我慢慢开发,主要还是能通过arduino来获取数据,我可以来开发PC机上软件了。

1.光立方。应为arduino端口的限制所以做个4*4*4的还是可以的。
2.四旋翼。在做好了2轮平衡小车的基础上,再去试着做
3.环境采集器。把和换进有关的传感器接好,然后通过SD卡模块将数据储存下来,通过PC机软件将数据图形化显示

后面我还会来发帖的,将成果分享下下。

q601564446 发表于 2013-4-29 20:21:45

一楼自己坐

ranqingfa 发表于 2013-4-29 21:07:12

三个轮啊,要MPU干嘛

caodingguang 发表于 2013-4-29 21:35:29

L298一定要用9V~12V供电的吗?5V不行吗?

q601564446 发表于 2013-4-29 22:23:42

ranqingfa 发表于 2013-4-29 21:07 static/image/common/back.gif
三个轮啊,要MPU干嘛

拆掉万向轮,做平衡两轮

q601564446 发表于 2013-4-29 22:24:47

caodingguang 发表于 2013-4-29 21:35 static/image/common/back.gif
L298一定要用9V~12V供电的吗?5V不行吗?

看你要带动的电机要多少V呗,我的小车套件电机是6V的

软件-蹄飞 发表于 2013-4-29 22:36:05

嗯,5V是逻辑电压,9V~12V是供给电机的电压

咯小3虽 发表于 2013-5-4 15:36:25

:handshake学习.

情谊永恒1992 发表于 2013-7-15 19:54:56

楼主,我刚接触小车,想做一个利用APC220的遥控小车,在电源供电问题上没想明白,电池电源是连在哪的?是给arduino供电,然后再从+5V引脚接出去给L298N,还是说电池电源连在L298N上,再从L298N的+5V输出给arduino供电?望解答,谢谢!~~~~

想飞的猫 发表于 2013-9-14 17:29:36

情谊永恒1992 发表于 2013-7-15 19:54 static/image/common/back.gif
楼主,我刚接触小车,想做一个利用APC220的遥控小车,在电源供电问题上没想明白,电池电源是连在哪的?是给 ...

你要分别接到两块板的,L298N的5V是指输入端,从这端输入的电压不经三端稳压块。

んDemon_Allenひ 发表于 2014-4-18 09:56:55

请问杜邦线用什么规格的?
页: [1]
查看完整版本: 【LSL学习笔记1】无硬件基础,最简单小车