配件列表:arduino mega(可以使用其它arduino開發闆代替),麥克納姆輪*4,紅外模塊*3 ,18650三元锂電池*2
成本分析:
設計靈感:
這台麥克納姆輪四驅車和其他很多作品一樣,是我2年前的作品,當時我正在學習機器控制與麥克納姆輪平向移動的原理。
麥克納姆輪是由輪毂和圍繞輪毂的輥子組成的,輥子是一種沒有動力的從動小滾輪,麥克納姆輪輥子軸線和輪毂軸線夾角是45度。它可以全方位移動,除了基本的前進、後退的方向,直角拐彎車頭都不用換,就算是原地360°旋轉也沒問題。
設計思路:
用網上買來的現成的亞克力材質的小車底盤,4個麥克納姆輪固定于上下兩片亞克力底盤之間改裝為四輪麥克納姆輪小車,使用L298N H橋模塊獨立驅動四輪,并使用Arduino Mega 2560驅動模塊。使用手機藍牙遙控。
制作過程:
使用螺絲固定電機、底盤,使用熱熔膠固定電機驅動模塊以及開發闆,在車頭部分裝上紅外避障模塊。車尾裝超聲波傳感器至于舵機上,車底也安裝了2個紅外傳感器用于尋迹。
測試結果:
由于選擇的麥克納姆輪直徑太小,導緻輥子間距太大,無法平滑運動,不能正常運轉。
改進方案:
1. 可以使用3D打印結構,以增加強度。
2. 定制PCB以減小整體體積。
3. 使用步進電機/無刷電機進行閉環控制。
4. 避障傳感器可更換成激光雷達或者使用視覺避障。
5. 旋轉直接更大質量更好的麥克納姆輪。
附:軟件代碼:
#include <Servo.h>
Servo mid_servo;
const int left1_pwm_pin = 3;
const int left2_pwm_pin = 4;
const int right1_pwm_pin = 5;
const int right2_pwm_pin = 6;
const int left1 = 53;
const int left2 = 52;
const int left3 = 51;
const int left4 = 50;
const int right1 = 49;
const int right2 = 48;
const int right3 = 47;
const int right4 = 46;
int left1_rate;
int left2_rate;
int right1_rate;
int right2_rate;
int left1_pwm = 123;
int left2_pwm = 123;
int right1_pwm = 123;
int right2_pwm = 123;
const int right_front_sensor = 23;
const int left_front_sensor = 22;
const int left_sensor = A2;
const int middle_sensor = A1;
const int right_sensor = A0;
const int up_pin = 31;
const int down_pin = 30;
const int left_pin = 29;
const int right_pin = 28;
const int mid_pin = 27;
const int set_pin = 26;
const int reset_pin = 25;
const int bluetooth_status_pin = 24;
void setup() {
pinMode(left1_pwm_pin, OUTPUT);
pinMode(left2_pwm_pin, OUTPUT);
pinMode(right1_pwm_pin, OUTPUT);
pinMode(right2_pwm_pin, OUTPUT);
pinMode(left1, OUTPUT);
pinMode(left2, OUTPUT);
pinMode(left3, OUTPUT);
pinMode(left4, OUTPUT);
pinMode(right1, OUTPUT);
pinMode(right2, OUTPUT);
pinMode(right3, OUTPUT);
pinMode(right4, OUTPUT);
pinMode(left_front_sensor, INPUT);
pinMode(right_front_sensor, INPUT);
pinMode(left_sensor, INPUT);
pinMode(middle_sensor, INPUT);
pinMode(right_sensor, INPUT);
pinMode(up_pin, INPUT);
pinMode(down_pin, INPUT);
pinMode(left_pin, INPUT);
pinMode(right_pin, INPUT);
pinMode(mid_pin, INPUT);
pinMode(set_pin, INPUT);
pinMode(reset_pin, INPUT);
pinMode(bluetooth_status_pin, INPUT);
mid_servo.attach(9);
}
void loop() {
int left_sensor_read = digitalRead(left_front_sensor);
int right_sensor_read = digitalRead(right_front_sensor);
int left1_pwm = 123;
int left2_pwm = 123;
int right1_pwm = 123;
int right2_pwm = 123;
if (left_sensor_read == 0 && right_sensor_read == 1) {
int left1_pwm = 150;
int left2_pwm = 123;
int right1_pwm = 150;
int right2_pwm = 123;
go_left8();
delay(1000);
}
else if (left_sensor_read == 1 && right_sensor_read == 0) {
int left1_pwm = 150;
int left2_pwm = 123;
int right1_pwm = 150;
int right2_pwm = 123;
go_right8();
delay(1000);
}
else if (left_sensor_read == 0 && right_sensor_read == 0){
back1();
delay(1000);
}
else{
forward1();
}
}
void forward1() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, HIGH);
digitalWrite(left2, LOW);
digitalWrite(left3, HIGH);
digitalWrite(left4, LOW);
digitalWrite(right1, HIGH);
digitalWrite(right2, LOW);
digitalWrite(right3, HIGH);
digitalWrite(right4, LOW);
}
void forward2() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, HIGH);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, HIGH);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void forward3() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, HIGH);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, HIGH);
digitalWrite(right4, LOW);
}
void back1() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, HIGH);
digitalWrite(left3, LOW);
digitalWrite(left4, HIGH);
digitalWrite(right1, LOW);
digitalWrite(right2, HIGH);
digitalWrite(right3, LOW);
digitalWrite(right4, HIGH);
}
void back2() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, HIGH);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, HIGH);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void back3() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, HIGH);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, HIGH);
}
void go_right1() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, HIGH);
digitalWrite(left2, LOW);
digitalWrite(left3, HIGH);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_right2() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, HIGH);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_right3() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, HIGH);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_right4() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, HIGH);
digitalWrite(right3, LOW);
digitalWrite(right4, HIGH);
}
void go_right5() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, HIGH);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_right6() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, HIGH);
}
void go_right7() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, HIGH);
digitalWrite(left2, LOW);
digitalWrite(left3, HIGH);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, HIGH);
digitalWrite(right3, LOW);
digitalWrite(right4, HIGH);
}
void go_right8() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, HIGH);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, HIGH);
digitalWrite(right1, LOW);
digitalWrite(right2, HIGH);
digitalWrite(right3, HIGH);
digitalWrite(right4, LOW);
}
void go_left1() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, HIGH);
digitalWrite(right2, LOW);
digitalWrite(right3, HIGH);
digitalWrite(right4, LOW);
}
void go_left2() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, HIGH);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_left3() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, HIGH);
digitalWrite(right4, LOW);
}
void go_left4() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, HIGH);
digitalWrite(left3, LOW);
digitalWrite(left4, HIGH);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_left5() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, HIGH);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_left6() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, HIGH);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void go_left7() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, HIGH);
digitalWrite(left3, LOW);
digitalWrite(left4, HIGH);
digitalWrite(right1, HIGH);
digitalWrite(right2, LOW);
digitalWrite(right3, HIGH);
digitalWrite(right4, LOW);
}
void go_left8() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, HIGH);
digitalWrite(left3, HIGH);
digitalWrite(left4, LOW);
digitalWrite(right1, HIGH);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, HIGH);
}
void stop_car() {
analogWrite(left1_pwm_pin, left1_pwm);
analogWrite(left2_pwm_pin, left2_pwm);
analogWrite(right1_pwm_pin, right1_pwm);
analogWrite(right2_pwm_pin, right2_pwm);
digitalWrite(left1, LOW);
digitalWrite(left2, LOW);
digitalWrite(left3, LOW);
digitalWrite(left4, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
digitalWrite(right3, LOW);
digitalWrite(right4, LOW);
}
void convert() {
int left1_pwm = abs(left1_rate);
int left2_pwm = abs(left2_rate);
int right1_pwm = abs(right1_rate);
int right2_pwm = abs(right2_rate);
}
void assure() {
if (left1_pwm < 0) {
left1_pwm = 0;
}
if (left2_pwm < 0) {
left2_pwm = 0;
}
if (right1_pwm < 0) {
right1_pwm = 0;
}
if (right2_pwm < 0) {
right2_pwm = 0;
}
if (left1_pwm > 255) {
left1_pwm = 255;
}
if (left2_pwm > 255) {
left2_pwm = 255;
}
if (right1_pwm > 255) {
right1_pwm = 255;
}
if (right2_pwm > 255) {
right2_pwm = 255;
}
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!