-
首先建立一个名为
的主程序。
< br>
//
,玩转智能小车主程序
#include
导入舵机库
#include
导入
NwePing
库
//
对照系统配线方案依次指定各
I/O
const int ENA = 3
//
左电机
PWM
const int IN1 =
4 //
左电机正
const
int IN2 = 5 //
左电机负
const int ENB = 6
//
右电机
PWM
const
int IN3 = 7 //
右电机正
const int IN4 = 8
//
右电机负
const int
trigger = 9
//
定义超声波传感器发射脚为
D9
const int echo = 10
//
定义传感器接收脚为
D10
const int max_read = 300;
//
设定传感器最大探测距离。
int no_good = 35; //*
设定
35cm
警戒距离。
int read_ahead;
//
实际距离读数。
Servo
sensorStation; //
设定传感器平台。
NewPing sensor(trigger, echo,
max_read); //
设定传感器引脚和最大读数
//
系统初始化
void setup()
{
(9600);
//
启用串行监视器可以给调试带来极大便利
(11); //
把
D11
分配给舵机
pinMode(ENA,
OUTPUT); //
依次设定各
I/O
属性
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB,
OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
(90); //
舵机复位至
90
p>
°
delay(6000); //
上电等待
6s
后进入主循环
}
//
主程序
void loop()
{
read_ahead =
readDistance(); //
调用
readDist
ance()
函数读出前方距离
n(
n(read_ahead);
//
串行监视器显示机器人前方距离
if (read_ahead < no_good)
//
如果前方距离小于警戒值
{
fastStop();
//
就令机器人紧急刹车
waTch();
//
然后左右查看,分析得出最佳路线
goForward(); //*
此处调用看似多余,但可以
确保机器人高速运转下动作的连贯性
}
else
goForward(); //
否则就一直向前行驶
}
主程序用到了两个库,
Servo
库是
IDE
自带的,
NwePing
库是第三方库,
需要下载安装。
接下来建立一个名为
的标签。
//
,机动模块。
//
刹车
void fastStop()
{
n(
串行
监视器显示机器人状态为
STOP
(停止)
//
左电机急停(注:
L298N
和<
/p>
L293D
均带有刹车功能,在使能成立的条件下,同时向两
p>
相写入高电平可令电机急停,详见芯片手册)
digitalWrite(ENA, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
//
右电机急停
digitalWrite(ENB, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
}
//
前进
void goForward()
{
n(
串行
监视器显示机器人状态为
FORW
ARD
(前进)
//
左电机逆时针旋转
analogWrite(ENA,106); //
左电机
PWM
,可微调这个数值使小车左右两
侧车轮转速相等,右
电机同理
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//
右电机顺时针旋转
analogWrite(ENB,118);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
//
原地左转
void turnLeft()
{
n(
串行
监视器显示机器人状态为
LEFT
(向左转)
< br>
//
左电机正转
analogWrite(ENA,106);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
//
右电机正转
analogWrite(ENB,59); //*
微调这个数值,
使转弯时内侧车轮起主导作用。
相当于让小车向后
打一把轮再拐弯。右转同理
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay (205);
//*
延迟,数值以毫秒为单位,调节此值可使机器人动作连贯
}
//
原地右转
void turnRight()
{
n(
串行
监视器显示机器人状态为
RIGHT
(向右转)
//
左电机反转
analogWrite(ENA,53);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//
右电机反转
analogWrite(ENB,118);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay (205);
//*
调节此值可使机器人动作连贯
}
//
原地掉头(暂时用不到)
void turnAround()
{
n(
18
0
//
串行监视器显示机器人状态为
T
URN
180
(原地顺时针旋转
18
0
°)
//
左电机反转
analogWrite(ENA,106);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//
右电机反转
analogWrite(ENB,118);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay (500); //*
}
//
,测距模块
int readDistance()
{
delay(30); //
p>
声波发送间隔
30ms
,大约每秒探测
p>
33
次。受系统所限,此值不可小于
29m
s
int cm = () /
US_ROUNDTRIP_CM; //
把
Ping
值(
μ
s
)转换为
p>
cm
return(cm);
//readDistance()
返回的数值是
cm
}
最后
是驱动云台扫描并分析左右两侧距离的
模块。
< br>
//
,查看模块
void waTch()
{
//
测量右前方距离。
//*
注
意舵机旋转方向,
SG5010
为逆时针旋转
< br>
(20); //*
p>
舵机右转至
20
°。调节此值会影响传感器
扫描区域,夹角越小,
机器人转弯越谨慎
delay(1200); //
延迟
1.2s
待舵机稳定
int
read_right = readDistance(); //
调用
readDistance()
函数读出右前方距离
(
n(read_right);
//(90); //*
舵机复位至
90
度。
廉价舵机大角度旋转会产生抖
动,
要加上这
两行以求读数准确。
//delay (500);
//
延迟
0.5s
//
测量左前方距离
(160); //
舵机左转至
160
°
delay(1200); //
延迟
1.2s
待舵机稳定。
int
read_left = readDistance();
//
调用函数读出距离左前方距离。
(
n(read_left);
(90);
//
这一行确保只要小车处于行驶状态,传感器就面向正前方
delay (500); //
延迟
0.5s
。
//
分析得出最佳行进路线。
if (read_right > read_left)
//
如果右前方距离比较大
{
turnRight();
//
就向右转
,
}
else
turnLeft(); //
否则就向左转
//
此处也可以加入另一层逻辑
p>
:
如果左右两侧读数相等就调用
turnA
round()
原地掉头。但
实际上触发的几率不大。
}
// I
2
C
液晶测试程序,
Arduino
版本
1
.5.6-r2
,
LiquidCrystal_I2C
库版本
2.0
#include
#include
导入
I
2
C
液晶库
LiquidCrystal_I2C
lcd(0x27,16,2); //
设定
I
2
C
地址及液晶屏参数
void setup()
{
(); //
始化液晶屏
ght();
(
开始打印信息
sor(3,1); //
设定显示位置,第
3
列,第
< br>1
行
(
}
void loop()
{
}
//
前进
void goForward()
{
n(
串行
监视器显示机器人状态为
FORW
ARD
(前进)
//
左电机逆时针旋转
int val1 = analogRead(A0);
//
手动调整左电机转速。电位器两端分别接至
+5V
和
GND
,
中心抽头接
至
A0
int
leftSpeed = map(val1,0,1023,0,255);
//
把读数映射为
PWM
analogWrite(ENA,leftSpeed);
//
写入速度。下面的右电机同理
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//
右电机顺时针旋转
int val2 = analogRead(A1);
int
rightSpeed = map(val2,0,1023,0,255);
analogWrite(ENB,rightSpeed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
//
,红外测距模块
// trigge
r
脚沿用
D9
,
echo
脚换成
A3
int
readDistance()
{
digitalWrite(trigger,HIGH);
//
点亮红外发射管
delayMicroseconds(200); //<
/p>
给接收管留出
200
μ
< br>s
响应时间
IRvalue=analogRead(echo);
//
读取自然光和红外线下反射值的总和
digitalWrite(trigger,LOW);
//
关闭红外发射管以读取自然光下的反射值
delayMicroseconds(200); //
留出
200
μ
s
响
应时间
IRvalue=IRvalue-analogRead(echo);
//
刨除自然光得出实际值(红外发射管产生的部
分)
return map(IRvalue,120,930,30,0); //
用
map()
函数把读数转换为距离
}
代码
1
:
HC-
SR04
超声波传感器典型代码
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);//
发送
10
μ
s
的高电平触发信号
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
distance = pulseIn(EchoPin,
HIGH)*340/60/2; //
检测脉冲宽度即为超声波往返时间
代码
2
:简
易超声波测距代码
const int TrigPin =
2;
const int EchoPin = 3; /
/
设定
SR04
连接的
Arduino
引脚
float distance;
void setup() {
//
初始化串口通信及连接
SR04
的引脚
(9600);
pinMode(TrigPin, OUTPUT);
//
要检测引脚上输入的脉冲宽度,需要先设置为输入状态
pinMode(EchoPin, INPUT);
n(
}
void loop() {
//<
/p>
产生一个
10
μ
s
的高脉冲去触发
TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
//
检测脉冲宽度,并计算出距离
distance = pulseIn(EchoPin, HIGH)
/58.00;
(distance);
(
n();
delay(1000);
}
代码
3
:具有温度补偿的超声波测距代码
#include
#include
< br>//
设定
SR04
连接的
Arduino
引脚
const int TrigPin = 2;
const int EchoPin = 3;
float distance;
float
temperature_value;
#define
ONE_WIRE_BUS 4
OneWire
oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
//
初始化串口通信及连接
SR04<
/p>
的引脚
(9600);
pinMode(TrigPin, OUTPUT);
//
要检测引脚上输入的脉冲宽度,
需要先设置为输入状态
pinMode(EchoPin, INPUT);
();
}
void loop()
{
p>
//
产生一个
10
μ
s
的高脉冲去触发
TrigPin
tTemperatures();
-
-
-
-
-
-
-
-
-
上一篇:医学检查相关参数简介(精)
下一篇:呼吸机比较主要大品牌