學(xué)了arduino一段時間,抽了點時間把避障小車做了一下,現(xiàn)在把小車的制作過程在這里記錄一下,以便日后查閱。
首先說一下用到的材料:
1、小車底盤一套(淘寶淘的現(xiàn)成的,其實也可以自己做)
2、18650電池盒一個(可裝三節(jié)電池 12V)
3、超聲波模塊(HC-SR04)一個
4、紅外模塊(E18-D50NK)一個
5、紅外模塊(E18-D80NK)一個(之前只用了超聲波和D50模塊,結(jié)果效果不怎么好,又多買了一個紅外模塊,50跟80的區(qū)別貌似在于測量的最大距離不同)
6、L298N點擊驅(qū)動模塊一個
7、自制的arduino模塊一個(也可以用其它版本現(xiàn)成的arduino模塊)
8、無線藍(lán)牙模塊一個
用到的就是以上這些模塊,拼接完成后如下圖:
線路圖這里就不做說明了,大家可以看代碼的引腳定義接線,這里有幾點要特別說明一下
小車代碼支持兩種控制模式,見代碼
- //定義模式 1-手動模式 2-自動避障模式
- int MODE = 1;
手動模式可以使用手機(jī)連接藍(lán)牙設(shè)備進(jìn)行控制,這里提供一個控制軟件itead studio【點擊下載】,當(dāng)小車設(shè)置為自動模式時,小車會自動避障移動,可在軟件中將A和B分別設(shè)置為1和2,就可以任意切換小車模式了代碼如下:
- #include <SoftwareSerial.h>
- //定義電機(jī)控制引腳
- #define IN1 5
- #define IN2 6
- #define IN3 7
- #define IN4 8
- //定義電機(jī)PWM引腳
- #define speedPinA 9
- #define speedPinB 10
- //定義紅外測距模塊E18數(shù)據(jù)引腳
- #define E18D50Pin 3
- #define E18D80Pin 4
- //定義超聲波數(shù)據(jù)引腳
- const int TrigPin = 2;
- const int EchoPin = 11;
- //超聲波模塊測出的距離
- float distance = 0;
- //藍(lán)牙模塊接收的數(shù)據(jù)
- char rec= ' ';
- //定義模式 1-手動模式 2-自動避障模式
- int MODE = 1;
- //定義軟串口,數(shù)據(jù)測試用
- SoftwareSerial mySerial(12, 13); // RX, TX
- void setup()
- {
- //初始化串口
- Serial.begin(9600);
- mySerial.begin(4800);
- //初始化電機(jī)引腳
- _initmPin();
- //初始化超聲波引腳
- _initSR04Pin();
- //電機(jī)保持不動。
- _cStop();
- }
- void loop()
- {
- if(MODE==1){
- while(Serial.available()){
- rec=Serial.read();
- if(rec=='1'){
- MODE=1;
- }else if(rec=='2'){
- MODE=2;
- }
- if(MODE!=1)
- break;
- if(rec=='f'){
- _cForward();
- setFSpeed();
- }else if(rec=='b'){
- _cBack();
- setBSpeed();
- }else if(rec=='l'){
- _cLeft();
- setLSpeed();
- }else if(rec=='r'){
- _cRight();
- setRSpeed();
- }else{
- _cStop();
- }
- //設(shè)置電機(jī)轉(zhuǎn)速
- rec= ' ';
- }
- }
- if(MODE==2){
- if(Serial.available()){
- rec=Serial.read();
- if(rec=='1'){
- MODE=1;
- }
- else if(rec=='2'){
- MODE=2;
- }
- }
- _getDistance();
- mySerial.println(distance);
- if(distance>25.0&&digitalRead(E18D50Pin)==HIGH&&digitalRead(E18D80Pin)==HIGH){
- _cForward();
- setFSpeed();
- }else{
- _cRight();
- setRSpeed();
- }
- }
- //設(shè)置電機(jī)轉(zhuǎn)速
- rec= ' ';
- }
- //由于買的電機(jī)速度不同,這里用pwm的方式調(diào)了一下速
- void setFSpeed(){
- _mSetSpeed(speedPinA,65);
- _mSetSpeed(speedPinB,70);
- }
- void setLSpeed(){
- _mSetSpeed(speedPinA,47);
- _mSetSpeed(speedPinB,50);
- }
- void setRSpeed(){
- _mSetSpeed(speedPinA,47);
- _mSetSpeed(speedPinB,50);
- }
- void setBSpeed(){
- _mSetSpeed(speedPinA,69);
- _mSetSpeed(speedPinB,70);
- }
- //通過超聲波模塊獲取障礙物距離
- void _getDistance(){
- // 產(chǎn)生一個10us的高脈沖去觸發(fā)TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- // 檢測脈沖寬度,并計算出距離
- distance = pulseIn(EchoPin, HIGH) / 58.00;
- delay(100);
- }
- //初始化電機(jī)引腳
- void _initmPin(){
- pinMode(IN1,OUTPUT);
- pinMode(IN2,OUTPUT);
- pinMode(IN3,OUTPUT);
- pinMode(IN4,OUTPUT);
- pinMode(speedPinA,OUTPUT);
- pinMode(speedPinB,OUTPUT);
- }
- //初始化微波模塊引腳
- void _initSR04Pin(){
- pinMode(TrigPin,OUTPUT);
- pinMode(EchoPin,INPUT);
- }
- void _cForward()//小車向前移動
- {
- _mRight(IN1,IN2);
- _mRight(IN3,IN4);
- }
- void _cBack()//小車向后移動
- {
- _mLeft(IN1,IN2);
- _mLeft(IN3,IN4);
- }
- void _cStop()//小車停止
- {
- _mStop(IN1,IN2);
- _mStop(IN3,IN4);
- }
- void _cLeft()//小車向左旋轉(zhuǎn)
- {
- _mRight(IN1,IN2);
- _mLeft(IN3,IN4);
- }
- void _cRight()//小車向右旋轉(zhuǎn)
- {
- _mLeft(IN1,IN2);
- _mRight(IN3,IN4);
- }
- //
- void _mRight(int pin1,int pin2)//電機(jī)右轉(zhuǎn),電機(jī)到底是右轉(zhuǎn)還是左轉(zhuǎn)取決于電機(jī)端的接線和控制腳的順序
- {
- digitalWrite(pin1,HIGH);
- digitalWrite(pin2,LOW);
- }
- void _mLeft(int pin1,int pin2)//電機(jī)左轉(zhuǎn),電機(jī)到底是右轉(zhuǎn)還是左轉(zhuǎn)取決于電機(jī)端的接線和控制腳的順序
- {
- digitalWrite(pin1,LOW);
- digitalWrite(pin2,HIGH);
- }
- void _mStop(int pin1,int pin2)//電機(jī)停止
- {
- digitalWrite(pin1,HIGH);
- digitalWrite(pin2,HIGH);
- }
- void _mSetSpeed(int pinPWM,int SpeedValue)//控制電機(jī)速度
- {
- analogWrite(pinPWM,SpeedValue);
- }
歡迎加入QQ群:254267969,共同交流學(xué)習(xí)~~~~
聯(lián)系客服