(SKU:ROB0117)切诺基基础套件
目录 |
功能介绍
用超声波作为距离检测装置,舵机作为前方扫描器,实现一个可自动蔽障小车。
STEP1:组装小车
参照安装说明。
注意事项: 按照切诺基的安装说明组装小车,完成到第3步的时候,找到套件中的Romeo BLE板子的固定孔,将Romeo BLE固定到小车底板上。如下图所示。
完成组装后,先不要急着把上面的扩展板固定上去,接下去我们进行第二步调试电机。
STEP2:调试电机
使用贴士
如您是第一次使用Arduino的新手。请先尝试走一遍“新手村”任务。
新手任务1:安装Arduino驱动,点击驱动安装教程
新手任务2:下载Blink代码,点击Blink代码下载
1. 连接电机控制引脚
在STEP1中,我们已经把四个电机(马达)固定到底板上了,想让RoMeo BLE控制小车,还需要连接到控制器上。
注意控制板上的D4、D5、D6、D7要与小车底盘上对应的四根线连接好,如示意图中四根线
2. 下载电机调试代码
既然您已经会下载代码了,请下载电机调试代码。
int speedPin_M1 = 5; //M1 Speed Control int speedPin_M2 = 6; //M2 Speed Control int directionPin_M1 = 4; //M1 Direction Control int directionPin_M2 = 7; //M1 Direction Control void setup(){ } void loop(){ carAdvance(100,100); delay(1000); carBack(100,100); delay(1000); carTurnLeft(250,250); delay(1000); carTurnRight(250,250); delay(1000); } void carStop(){ // Motor Stop digitalWrite(speedPin_M2,0); digitalWrite(directionPin_M2,LOW); digitalWrite(speedPin_M1,0); digitalWrite(directionPin_M1,LOW); } void carAdvance(int leftSpeed,int rightSpeed){ //Move FORkward analogWrite (speedPin_M2,leftSpeed); //PWM Speed Control digitalWrite(directionPin_M2,LOW); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,HIGH); } void carBack(int leftSpeed,int rightSpeed){ //Move BACKrward analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M2,HIGH); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,LOW); } void carTurnLeft(int leftSpeed,int rightSpeed){ //Turn Left analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M2,HIGH); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,HIGH); } void carTurnRight(int leftSpeed,int rightSpeed){ //Turn Right analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M2,LOW); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,LOW); }
3. 装上电池
所需材料:DC母头 x 1
因为RoMeo BLE不带DC接口。
上电后发现小车前进1秒后退1秒左转1秒右转1秒即为安装正确,如果发现效果与代码不匹配,可以对代码做一下微调整,根据电机的连线情况,直到匹配为止,才进行下一步。
STEP3:安装上层板
1. 准备材料
2. 固定超声波位置
可以参看超声波扫描套件的安装手册
3. 固定舵机位置
注意超声波的头要凸出到固定板外
STEP4: 调试超声波和舵机
1. 硬件连接
安装超声波传感器和支架时,需要把超声波传感器按到底,探头需要露出。 |
2. 下载代码
下载代码之前需要安装Metro libray
如何加载库,可见链接
#include <Servo.h> #include <Metro.h> Metro measureDistance = Metro(50); Metro sweepServo = Metro(20); unsigned long actualDistance = 0; Servo myservo; // create servo object to control a servo int pos = 60; int sweepFlag = 1; int URPWM = 3; // PWM Output 0-25000US,Every 50US represent 1cm int URTRIG= 10; // PWM trigger pin uint8_t EnPwmCmd[4]={0x44,0x02,0xbb,0x01}; // distance measure command void setup(){ // Serial initialization myservo.attach(9); Serial.begin(9600); // Sets the baud rate to 9600 SensorSetup(); } void loop(){ if(measureDistance.check() == 1){ actualDistance = MeasureDistance(); // Serial.println(actualDistance); // delay(100); } if(sweepServo.check() == 1){ servoSweep(); } } void SensorSetup(){ pinMode(URTRIG,OUTPUT); // A low pull on pin COMP/TRIG digitalWrite(URTRIG,HIGH); // Set to HIGH pinMode(URPWM, INPUT); // Sending Enable PWM mode command for(int i=0;i<4;i++){ Serial.write(EnPwmCmd[i]); } } int MeasureDistance(){ // a low pull on pin COMP/TRIG triggering a sensor reading digitalWrite(URTRIG, LOW); digitalWrite(URTRIG, HIGH); // reading Pin PWM will output pulses unsigned long distance=pulseIn(URPWM,LOW); if(distance==50000){ // the reading is invalid. Serial.print("Invalid"); }else{ distance=distance/50; // every 50us low level stands for 1cm } return distance; } void servoSweep(){ if(sweepFlag ){ if(pos>=60 && pos<=120){ pos=pos+1; // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' } if(pos>119) sweepFlag = false; // assign the variable again }else { if(pos>=60 && pos<=120){ pos=pos-1; myservo.write(pos); } if(pos<61) sweepFlag = true; } }
3. 调试舵机位置
方法一:可重新安装舵盘
方法二:代码中角度做相应修改
STEP5: 整机调试
1. 固定上层板
2.下载整机调试代码
#include <Servo.h> #include <Metro.h> Metro measureDistance = Metro(50); Metro sweepServo = Metro(20); int speedPin_M1 = 5; //M1 Speed Control int speedPin_M2 = 6; //M2 Speed Control int directionPin_M1 = 4; //M1 Direction Control int directionPin_M2 = 7; //M1 Direction Control unsigned long actualDistance = 40; Servo myservo; // create servo object to control a servo int pos = 60; int sweepFlag = 1; int URPWM = 3; // PWM Output 0-25000US,Every 50US represent 1cm int URTRIG= 10; // PWM trigger pin uint8_t EnPwmCmd[4]={0x44,0x02,0xbb,0x01}; // distance measure command void setup(){ // Serial initialization myservo.attach(9); Serial.begin(9600); // Sets the baud rate to 9600 SensorSetup(); } void loop(){ if(measureDistance.check() == 1){ actualDistance = MeasureDistance(); // Serial.println(actualDistance); // delay(100); } if(sweepServo.check() == 1){ servoSweep(); } if(actualDistance <= 30){ myservo.write(90); if(pos>=90){ carBack(150,150); // Serial.println("carBack"); delay(300); carTurnRight(150,150); // Serial.println("carTurnRight"); delay(800); }else{ carBack(150,150); // Serial.println("carBack"); delay(300); carTurnLeft(150,150); // Serial.println("carTurnLeft"); delay(800); } }else{ carAdvance(150,150); // Serial.println("carAdvance"); delay(300); } } void SensorSetup(){ pinMode(URTRIG,OUTPUT); // A low pull on pin COMP/TRIG digitalWrite(URTRIG,HIGH); // Set to HIGH pinMode(URPWM, INPUT); // Sending Enable PWM mode command for(int i=0;i<4;i++){ Serial.write(EnPwmCmd[i]); } } int MeasureDistance(){ // a low pull on pin COMP/TRIG triggering a sensor reading digitalWrite(URTRIG, LOW); digitalWrite(URTRIG, HIGH); // reading Pin PWM will output pulses unsigned long distance=pulseIn(URPWM,LOW); if(distance==50000){ // the reading is invalid. Serial.print("Invalid"); }else{ distance=distance/50; // every 50us low level stands for 1cm } return distance; } void carStop(){ // Motor Stop digitalWrite(speedPin_M2,0); digitalWrite(directionPin_M2,LOW); digitalWrite(speedPin_M1,0); digitalWrite(directionPin_M1,LOW); } void carAdvance(int leftSpeed,int rightSpeed){ //Move FORkward analogWrite (speedPin_M2,leftSpeed); //PWM Speed Control digitalWrite(directionPin_M2,LOW); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,HIGH); } void carBack(int leftSpeed,int rightSpeed){ //Move BACKrward analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M2,HIGH); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,LOW); } void carTurnLeft(int leftSpeed,int rightSpeed){ //Turn Left analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M2,HIGH); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,HIGH); } void carTurnRight(int leftSpeed,int rightSpeed){ //Turn Right analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M2,LOW); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M1,LOW); } void servoSweep(){ if(sweepFlag){ if(pos>=60 && pos<=120){ pos=pos+5; // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' } if(pos>119) sweepFlag = false; // assign the variable again } else { if(pos>=60 && pos<=120){ pos=pos-5; myservo.write(pos); } if(pos<61) sweepFlag = true; } }
你的专属小车就此诞生!
常见问题
Q:小车装好之后不动
A:检查电源接线是否正确,电池需要为新电池,主控板中需要烧录整机调试代码.
Q:小车装好之后前面没障碍物却一直后退
A:检查超声波的接线,以及超声波模块安装是否到位(参考4.3小节的第一图)
更多问题欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。