Arudio项目实战——003 TracKingTheCar(循迹小车)
Cblock源码
![在这里插入图片描述](https://img-blog.csdnimg.cn/979a20e1baea43e4ae9ebb1d561ce130.png)
Cblock转Arduino源代码
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MeMCore.h>
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
void move(int direction, int speed)
{
int leftSpeed = 0;
int rightSpeed = 0;
if(direction == 1){
leftSpeed = speed;
rightSpeed = speed;
}else if(direction == 2){
leftSpeed = -speed;
rightSpeed = -speed;
}else if(direction == 3){
leftSpeed = -speed;
rightSpeed = speed;
}else if(direction == 4){
leftSpeed = speed;
rightSpeed = -speed;
}
motor_9.run((9)==M1?-(leftSpeed):(leftSpeed));
motor_10.run((10)==M1?-(rightSpeed):(rightSpeed));
}
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
double speed;
double temp;
MeLineFollower linefollower_2(2);
void setup(){
pinMode(A7,INPUT);
while(!((0^(analogRead(A7)>10?0:1))))
{
_loop();
}
speed = 90;
}
void loop(){
temp = linefollower_2.readSensors();
if(((temp)==(0))){
move(2,speed);
}else{
if(((temp)==(1))){
move(4,speed);
}else{
if(((temp)==(2))){
move(3,speed);
}else{
move(1,speed);
}
}
}
_loop();
}
void _delay(float seconds){
long endTime = millis() + seconds * 1000;
while(millis() < endTime)_loop();
}
void _loop(){
}
代码解释
这段代码是使用 Me-motor 线跟踪模块来控制电机的代码。
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MeMCore.h>
这几行是包含了常用库的头文件,Arduino.h 为核心库,Wire.h 和 SoftwareSerial.h 为通信库,MeMCore.h 是 Me-motor 模块的库。
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
这两行代码定义了 MeDCMotor 类对象 motor_9 和 motor_10 ,分别代表编号为 9 和 10 的直流电机
void move(int direction, int speed)
{
int leftSpeed = 0;
int rightSpeed = 0;
if(direction == 1){
leftSpeed = speed;
rightSpeed = speed;
}else if(direction == 2){
leftSpeed = -speed;
rightSpeed = -speed;
}else if(direction == 3){
leftSpeed = -speed;
rightSpeed = speed;
}else if(direction == 4){
leftSpeed = speed;
rightSpeed = -speed;
}
motor_9.run((9)==M1?-(leftSpeed):(leftSpeed));
motor_10.run((10)==M1?-(rightSpeed):(rightSpeed));
}
这段代码是定义了一个函数 move() ,用来控制两个电机的运动。参数 direction 是移动方向,取值为 1 2 3 4,分别表示前进,后退,左转,右转。参数 speed 是运动速度,取值范围是 -255 ~ 255。
double speed;
double temp;
MeLineFollower linefollower_2(2);
这三行代码定义了 speed 、 temp 变量和线跟踪模块对象 linefollower_2
pinMode(A7,INPUT);
while(!((0^(analogRead(A7)>10?0:1))))
{
_loop();
}
speed = 90;
这段代码是在setup函数里的,其中 pinMode(A7, INPUT) 用来设置 A7 口为输入模式,while(!((0^(analogRead(A7)>10?0:1)))) 循环判断A7口读取到的电压值是否大于10,如果是则继续循环,如果不是退出循环。 然后通过设置speed变量来设置电机的运动速度。
temp = linefollower_2.readSensors();
if(((temp)==(0))){
move(2,speed);
}else{
if(((temp)==(1))){
move(4,speed);
}else{
if(((temp)==(2))){
move(3,speed);
}else{
move(1,speed);
}
}
}
loop函数里的这段代码是线跟踪模块的核心代码,通过linefollower_2.readSensors()来读取线跟踪模块的状态。根据读取到的状态调用move函数来控制电机的移动方向和速度。
- 如果读取到的状态为0,就调用move(2, speed)来使电机向后运动。
- 如果读取到的状态为1,就调用move(4,speed)来使电机向左运动。
- 如果读取到的状态为2,就调用move(3, speed)来使电机向右运动。
- 如果读取到的状态为其他,就调用move(1, speed)来使电机向前运动。
最后调用 _loop() 函数在循环中做一些其他事情。
代码优化
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MeMCore.h>
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
void move(int direction, int speed)
{
int leftSpeed = 0;
int rightSpeed = 0;
if(direction == 1){
leftSpeed = speed;
rightSpeed = speed;
}else if(direction == 2){
leftSpeed = -speed;
rightSpeed = -speed;
}else if(direction == 3){
leftSpeed = -speed;
rightSpeed = speed;
}else if(direction == 4){
leftSpeed = speed;
rightSpeed = -speed;
}
motor_9.run((9)==M1?-(leftSpeed):(leftSpeed));
motor_10.run((10)==M1?-(rightSpeed):(rightSpeed));
}
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
double speed;
double temp;
MeLineFollower linefollower_2(2);
void setup(){
pinMode(A7,INPUT);
while(!((0^(analogRead(A7)>10?0:1))));
speed = 90;
}
void loop(){
temp = linefollower_2.readSensors();
if(((temp)==(0))){
move(2,speed);
}else{
if(((temp)==(1))){
move(4,speed);
}else{
if(((temp)==(2))){
move(3,speed);
}else{
move(1,speed);
}
}
}
}
优化解释
首先,通过引用库文件来包含必要的驱动,这些库文件将为接下来的代码提供支持。具体地,代码中包含了Arduino.h,Wire.h,SoftwareSerial.h和MeMCore.h这四个库文件。
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MeMCore.h>
定义两个电机的编号分别为9和10,通过MeDCMotor这个类定义这两个电机对象。
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
定义一个函数,move() 函数用来控制电机的运动。
void move(int direction, int speed)
{
int leftSpeed = 0;
int rightSpeed = 0;
if(direction == 1){
leftSpeed = speed;
rightSpeed = speed;
}else if(direction == 2){
leftSpeed = -speed;
rightSpeed = -speed;
}else if(direction == 3){
leftSpeed = -speed;
rightSpeed = speed;
}else if(direction == 4){
leftSpeed = speed;
rightSpeed = -speed;
}
motor_9.run((9)==M1?-(leftSpeed):(leftSpeed));
motor_10.run((10)==M1?-(rightSpeed):(rightSpeed));
}
其中 direction 是一个参数,用来指示电机移动的方向,speed 是另一个参数,用来指示电机移动的速度。
设置线缘传感器编号为2,用来读取传感器值,MeLineFollower是线缘传感器类
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
double speed;
double temp;
MeLineFollower linefollower_2(2);