arduino小车详细制作教程

电子说

1.3w人已加入

描述

第一次做,很粗糙,都是模块的组合,变速箱用的是模型小车的,最大的难点在于变速箱和马达齿轮的配合因为完全是不配套的两样东西,视频中小车也有走外的迹象,配合是主要问题,两块亚克力板的孔没有打好,在安装上还是有瑕疵

智能小车接线

Arduino

第一刀开启arduino智能小车DIY的第一步

重要的电机驱动扩展板到了

最初的设想想加个散热扇

这边用到了接口扩展板

舵机到货,有点小贵,金属齿的

搭建中,,,

程序DEBUG中

完成图

变速箱和马达

为了使用大扭力电机,改变了原有变速箱的安装方式

代码部分

//超声波智能避障车程序(ARDUINO)

#include

int pinI1=5;//定义I1接口(I1-I4是l298N扩展模块上的电机输出接口)

int pinI2=4;//定义I2接口

int pinI3=7;//定义I3接口

int pinI4=6;//定义I4接口

int inputPin = A1; // 定義超音波信號接收腳位(插错的后果,读值为0,舵机不停地转头)

int outputPin =A0; // 定義超音波信號發射腳位

int Fspeedd = 0; // 前速

int Rspeedd = 0; // 右速

int Lspeedd = 0; // 左速

int directionn = 0; // 前=8 後=2 左=4 右=6

Servo myservo; // 設 myservo

int delay_time = 250; // 伺服馬達轉向後的穩定時間

int Fgo = 8; // 前進

int Rgo = 6; // 右轉

int Lgo = 4; // 左轉

int Bgo = 2; // 倒車

void setup()

{

Serial.begin(9600); // 定義馬達輸出腳位

pinMode(pinI1,OUTPUT);

pinMode(pinI2,OUTPUT);

pinMode(pinI3,OUTPUT);

pinMode(pinI4,OUTPUT);

pinMode(inputPin, INPUT); // 定義超音波輸入腳位

pinMode(outputPin, OUTPUT); // 定義超音波輸出腳位

myservo.attach(9); // 定義伺服馬達輸出第9腳位(PWM)

}

void advance(int a) // 前進

{

digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转

digitalWrite(pinI3,HIGH);

digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转

digitalWrite(pinI2,HIGH);

delay(a * 100);

}

void turnR(int b) //右轉(雙輪)

{

digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转

digitalWrite(pinI3,LOW);

digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转

digitalWrite(pinI2,HIGH);

delay(b * 100);

}

void turnL(int c) //左轉(雙輪)

{

digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转

digitalWrite(pinI3,HIGH);

digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转

digitalWrite(pinI2,LOW);

delay(c * 100);

}

void stopp(int d) //停止

{

digitalWrite(pinI4,HIGH);//使直流电机(右)刹车

digitalWrite(pinI3,HIGH);

digitalWrite(pinI1,HIGH);//使直流电机(左)刹车

digitalWrite(pinI2,HIGH);

delay(d * 100);

}

void back(int e) //後退

{

digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转

digitalWrite(pinI3,LOW);

digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转

digitalWrite(pinI2,LOW);

delay(e * 100);

}

void detection() //測量3個角度(0.90.179)

{

int delay_time = 250; // 伺服馬達轉向後的穩定時間

ask_pin_F(); // 讀取前方距離

if(Fspeedd 《 10) // 假如前方距離小於10公分

{

stopp(1); // 清除輸出資料

back(2); // 後退 0.2秒

}

if(Fspeedd 《 25) // 假如前方距離小於25公分

{

stopp(1); // 清除輸出資料

ask_pin_L(); // 讀取左方距離

delay(delay_time); // 等待伺服馬達穩定

ask_pin_R(); // 讀取右方距離

delay(delay_time); // 等待伺服馬達穩定

if(Lspeedd 》 Rspeedd) //假如 左邊距離大於右邊距離

{

directionn = Rgo; //向右走

}

if(Lspeedd 《= Rspeedd) //假如 左邊距離小於或等於右邊距離

{

directionn = Lgo; //向左走

}

if (Lspeedd 《 10 && Rspeedd 《 10) //假如 左邊距離和右邊距離皆小於10公分

{

directionn = Bgo; //向後走

}

}

else //加如前方不小於(大於)25公分

{

directionn = Fgo; //向前走

}

}

void ask_pin_F() // 量出前方距離

{

myservo.write(90);

digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs

delayMicroseconds(2);

digitalWrite(outputPin, HIGH); // 讓超聲波發射高電壓10μs,這裡至少是10μs

delayMicroseconds(10);

digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓

float Fdistance = pulseIn(inputPin, HIGH); // 讀差相差時間

Fdistance= Fdistance/5.8/10; // 將時間轉為距離距离(單位:公分)

Serial.print(“F distance:”); //輸出距離(單位:公分)

Serial.println(Fdistance); //顯示距離

Fspeedd = Fdistance; // 將距離 讀入Fspeedd(前速)

}

void ask_pin_L() // 量出左邊距離

{

myservo.write(5);

delay(delay_time);

digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs

delayMicroseconds(2);

digitalWrite(outputPin, HIGH); // 讓超聲波發射高電壓10μs,這裡至少是10μs

delayMicroseconds(10);

digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓

float Ldistance = pulseIn(inputPin, HIGH); // 讀差相差時間

Ldistance= Ldistance/5.8/10; // 將時間轉為距離距离(單位:公分)

Serial.print(“L distance:”); //輸出距離(單位:公分)

Serial.println(Ldistance); //顯示距離

Lspeedd = Ldistance; // 將距離 讀入Lspeedd(左速)

}

void ask_pin_R() // 量出右邊距離

{

myservo.write(177);

delay(delay_time);

digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs

delayMicroseconds(2);

digitalWrite(outputPin, HIGH); // 讓超聲波發射高電壓10μs,這裡至少是10μs

delayMicroseconds(10);

digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓

float Rdistance = pulseIn(inputPin, HIGH); // 讀差相差時間

Rdistance= Rdistance/5.8/10; // 將時間轉為距離距离(單位:公分)

Serial.print(“R distance:”); //輸出距離(單位:公分)

Serial.println(Rdistance); //顯示距離

Rspeedd = Rdistance; // 將距離 讀入Rspeedd(右速)

}

void loop()

{

myservo.write(90); //讓伺服馬達回歸 預備位置 準備下一次的測量

detection(); //測量角度 並且判斷要往哪一方向移動

if(directionn == 2) //假如directionn(方向) = 2(倒車)

{

back(8); // 倒退(車)

turnL(2); //些微向左方移動(防止卡在死巷裡)

Serial.print(“ Reverse ”); //顯示方向(倒退)

}

if(directionn == 6) //假如directionn(方向) = 6(右轉)

{

back(1);

turnR(6); // 右轉

Serial.print(“ Right ”); //顯示方向(左轉)

}

if(directionn == 4) //假如directionn(方向) = 4(左轉)

{

back(1);

turnL(6); // 左轉

Serial.print(“ Left ”); //顯示方向(右轉)

}

if(directionn == 8) //假如directionn(方向) = 8(前進)

{

advance(8); // 正常前進

Serial.print(“ Advance ”); //顯示方向(前進)

Serial.print(“ ”);

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分