オムニホイールの制御
ArduinoUNOで3輪オムニホイールを制御してみました。オムニホイールは是非RobotShop@Home https://athome-robots.com でご購入を!(最近停滞気味なので製作頑張ります)
と言っても、ArduinoUNOのanalogWrite関数はポートによってPWM周波数が異なるので、走らせていると誤差が出てくると思います。UNOはPWMポートが6つしかなく,かつ5番と6番ピンのみPWM周波数が他と異なりますのでMEGAやDUEを使うことをお勧めします。(ソフトウェア上で自分でPWM周波数を変えることもできますが、自分で調べてください)
ちなみにテストしたモータードライバはL298NとDRV8871です。
モーターの接続方向によって正しく動かない場合がありますので、逆回転している場合はモーターへの配線を入れ替えるか、ソフトウェア上で回転の向きを変えてあげてください。
ソフトウェアを完全に理解できれば、4輪などに応用するのも簡単なので是非頑張ってみてください。
#define PI 3.141592653
/*プロトタイプ宣言*/
void motor(float deg,float power,float mod);
/************************************************/
/*初期設定*/
/***********************************************/
void setup(){
//右前モーター
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
//後ろモーター
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
//左前モーター
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
/***********************************************/
/*本文*/
/***********************************************/
void loop(){
//モーターを動かす
//(進みたい方向,パワー(0to100,0のときブレーキ),向きの修正(-1to1))
motor(90,100,0);//右に進む
}
/*********************************************/
/*関数名:motor(flaot deg,float power,float mod)*/
/*引数:(進みたい角度,パワー(0to100)0のときブレーキ,向き修正(回転)(-1to1)*/
/*戻り値:無し*/
/*概要:モーターを動かして,任意の方向に移動する*/
/*********************************************/
void motor(float deg,float power,float mod){
float Motor[3];
float Max[2];
if(power == 0){//パワーが0のとき
Motor[0] = 255 * mod;
Motor[1] = 255 * mod;
Motor[2] = 255 * mod;
}
else{
Motor[0] = sin((deg-60)*PI/180) + mod;
Motor[1] = sin((deg-180)*PI/180) + mod;
Motor[2] = sin((deg-300)*PI/180) + mod;
if(Motor[0] > 1){
Motor[0] = 1;
}
else if(Motor[0] < -1){
Motor[0] = -1;
}
if(Motor[1] > 1){
Motor[1] = 1;
}
else if(Motor[1] < -1){
Motor[1] = -1;
}
if(Motor[2] > 1){
Motor[2] = 1;
}
else if(Motor[2] < -1){
Motor[2] = -1;
}
if(fabs(Motor[0]) >= fabs(Motor[1])){//モータパワー最大値計算
Max[0] = fabs(Motor[0]);
}
else{
Max[0] = fabs(Motor[1]);
}
if(fabs(Motor[2]) >= Max[0]){
Max[1] = fabs(Motor[2]);
}
else{
Max[1] = Max[0];//最大値
}
//最大値変換
Motor[0] = (255*power*(Motor[0]/Max[1]))/100;
Motor[1] = (255*power*(Motor[1]/Max[1]))/100;
Motor[2] = (255*power*(Motor[2]/Max[1]))/100;
}
//右前モーター
if(Motor[0] > 0){//正回転
analogWrite(3,(int)Motor[0]);//キャスト変換してPWM値を代入
analogWrite(5,0);
}
else if(Motor[0] == 0){//ブレーキ
analogWrite(3,255);
analogWrite(5,255);
}
else{//負回転
analogWrite(3,0);
analogWrite(5,(int) -1*Motor[0]);//キャスト変換してPWM値を代入
}
//後ろモーター
if(Motor[1] > 0){//正回転
analogWrite(6,(int)Motor[1]);//キャスト変換してPWM値を代入
analogWrite(9,0);
}
else if(Motor[1] == 0){//ブレーキ
analogWrite(6,255);
analogWrite(9,255);
}
else{//負回転
analogWrite(6,0);
analogWrite(9,(int) -1*Motor[1]);//キャスト変換してPWM値を代入
}
//左前モーター
if(Motor[2] > 0){//正回転
analogWrite(10,(int)Motor[2]);//キャスト変換してPWM値を代入
analogWrite(11,0);
}
else if(Motor[2] == 0){//ブレーキ
analogWrite(10,255);
analogWrite(11,255);
}
else{//負回転
analogWrite(10,0);
analogWrite(11,(int) -1*Motor[2]);//キャスト変換してPWM値を代入
}
}