針對馬達控制我們主要需要修改兩部分:
驅動部分,使其可以支援同時控制4個馬達
pid調速部分,試驗表明,雖然是一樣的型號的馬達,但是給相同的pwm值,馬達的轉速也不一樣,所以我們需要分別對4個馬達進行pid調速
1.馬達驅動
1.1. duall298pmotorshield4wd.**件的修改
增加了4個馬達對應的pwm和方向控制的pin引腳定義,和4個馬達速度的設定函式
#ifndef duall298pmotorshield4wd_h
#define duall298pmotorshield4wd_h
#include
class duall298pmotorshield4wd
;#endif
1.2. duall298pmotorshield4wd.cpp檔案的修改
主要是針對4個馬達速度設定函式的實現,邏輯都是一樣的,這裡只擷取乙個馬達的**,**的邏輯請看**注釋
// set speed for motor 4, speed is a number betwenn -400 and 400
void duall298pmotorshield4wd::setm4speed(int speed)
if (speed > 255) // 限定最大速度為255
speed = 255;
if (reverse) //反轉狀態下
else //正向轉動狀態下
}
在setspeeds函式中分別呼叫4個馬達的速度設定函式。
// set speed for motor 1, 2, 3, 4
void duall298pmotorshield4wd::setspeeds(int m1speed, int m2speed, int m3speed, int m4speed)
duall298pmotorshield4wd.h和duall298pmotorshield4wd.cpp修改完成後,在arduino 的library目錄下新建乙個名為dual-l298p-motor-shield-master-4wd的目錄,將兩個檔案放到此資料夾下
現在我們開啟android ide的library就可以看到我們剛才新增的庫
1.1.3 motor_driver.h的修改
增加4驅馬達控制的函式setmotorspeeds,引數為4個馬達的速度
void initmotorcontroller();
void setmotorspeed(int i, int spd);
#ifdef l298p
void setmotorspeeds(int leftspeed, int rightspeed);
#endif
#ifdef l298p_4wd
void setmotorspeeds(int leftspeed_1, int leftspeed_2, int rightspeed_1, int rightspeed_2);
#endif
1.1.4 motor_driver.ino的修改
#ifdef l298p_4wd
// a convenience function for setting both motor speeds
void setmotorspeeds(int leftspeed_1, int leftspeed_2, int rightspeed_1, int rightspeed_2)
#endif
#else
#error a motor driver must be selected!
#endif
2.pid控制
pid控制都在diff_controller.**件中定義修改
新增兩個在4驅模式下的pid控制變數
#ifdef l298p_4wd
setpointinfo leftpid_h, rightpid_h;
#endif
新增兩個在4驅模式下的pid控制引數
#ifdef l298p_4wd
int left_h_kp=kp;
int left_h_kd=kd;
int left_h_ki=ki;
int left_h_ko=ko;
int right_h_kp=kp;
int right_h_kd=kd;
int right_h_ki=ki;
int right_h_ko=ko;
#endif
新增兩個在4驅模式下的pid控制函式
#ifdef l298p_4wd
/* pid routine to compute the next motor commands */
void dorightpid_h(setpointinfo * p)
#endif
...#ifdef l298p_4wd
/* pid routine to compute the next motor commands */
void doleftpid_h(setpointinfo * p)
#endif
修改readpidin函式,增加在4驅模式下,pidin的讀取
long readpidin(int i) else if (i == right)
#ifdef l298p_4wd
else if (i== right_h)else
#endif
return pidin;
}
修改readpidout函式,增加在4驅模式下,pidout的讀取
long readpidout(int i) else if (i == right)
#ifdef l298p_4wd
else if (i == right_h)else
#endif
return pidout;
}
修改updatepid函式,增加在4驅模式下馬達pid控制的呼叫
void updatepid()
/* compute pid update for each motor */
dorightpid(&rightpid);
doleftpid(&leftpid);
#ifdef l298p_4wd
dorightpid_h(&rightpid_h);
doleftpid_h(&leftpid_h);
#endif
/* set the motor speeds accordingly */
#ifdef l298p
setmotorspeeds(leftpid.output, rightpid.output);
#endif
#ifdef l298p_4wd
setmotorspeeds(leftpid.output,leftpid_h.output, rightpid.output,rightpid_h.output);
#endif
}
ROS機械人Diego 1 製作總結
1.底盤 diego1 所使用的底盤,總的來說滿足一般機器小車的要求,但也有些不足之處 a.動力不足 最大速度只能在0.2m s,這個是pid輸出已經是最大值255了。b.穩定性不足 因為需要使用pid對兩個電機進行調速,但即使這次調好了,可以走直線,關掉電源,重新開啟,可能就又走不了直線了。c.通...
現代笑話14
爸爸是球 王老先生70大壽,兒女都來祝賀。在席上王老先生致辭 爸爸好像乙個球,當他的使用價值最高時,兒女們你爭我奪,此時是籃球 退休以後,兒女們你推過來,我推過去,此時是排球 到年高體衰時,行動不 便時,兒女們我一腳,你一腳,踢來踢去,此時是足球。這時,他的兒女們忙說 爸爸,您是橄欖球,我們就是摔得...
14 安全加固
一.賬號安全 1.賬號鎖定 passwd l scu passwd u scu 本質 在 etc shadow密碼列前增加 口令策略 vi etc login.defs pass max days 90 密碼最長使用天數 pass min days 0 pass warn age 7 密碼到期提前預...