知れる事
◇サブクローラ機構の解説
◇Arduinio + XBeeの無線遠隔操縦
◇段差乗り上げのための,物理的な考え方←筆者の独自解釈もあります
概要・基本構成
基本構成は,
①メインシャフト上にメインクローラとサブクローラ用のスプロケットを用意
サブクローラ用駆動スプロケットは,メインシャフトに締め付けを行わない
②Arduinoがモータを制御
解説動画
ユーチューブ ニコニコ動画 にて 解説もしています.
ロボットがどのような動作をされるか見たい方は,ご参照ください.
PV
構成解説動画
ニコニコ動画
【PROJECT SR】段差走行ロボット NUEMK-2 構成解説編
通常のクローラーロボットは,スプロケットの半径以上の高さがある段差は上りにくいという事が
わかっています.
そのため,例えば戦車のように駆動スプロケットを転輪用スプロケットより高く配置したり,
ロボットに腕を装着して,段差乗り越えを行う等,多種多様な方法があります.
今回は,その段差手法の中で,サブクローラー機構を搭載して,段差乗り越えを行います.
このサブクローラ機構は,フリッパーアームという
アームに履帯を履かせて,履帯の向きを変えつつ
段差の角に履帯をひっかけて,車体を持ち上げ,段差を走行させるというものです.
構造
動画でも解説しておりますので,併せてご覧いただけると,より分かりやすいかと思います.
メインボディ外側
メインボディ内側
メインスプロケット用モータと,メインシャフトに
駆動・伝達用のスプロケットとチェインを装着.
メインシャフトに,メインスプロケットと駆動・伝達用スプロケットを,ネジで締め付けます
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
フリッパーアーム用ボス 前
フリッパーアーム用ボスにベアリングをはめ込みます.
フリッパーアーム用ボス 後
今度は,ボスにフリッパーアーム駆動・伝達用スプロケットを装着します.
メインフレーム外側
メインシャフト装着前の外側メインフレームです.
ここに,サブクローラ用シャフトとサブクローラ駆動用スプロケットを通します.
フリッパーアームボス装着
外側メインフレームに,メインシャフトを通した後,サブクローラ用ボスをメインシャフトに通します.
サブクローラ用ギアボックス
車体が30kgなので,フリッパーアームのトルクを上げるため,
メインスプロケット後方に,サブクローラ駆動用ギアボックスを配置.
サブクローラモータとかみ合わせて,ギア比を上げます(下側写真)
サブクローラギアボックス上側
フリッパーアーム用駆動スプロケット
ギアボックスと締結したシャフトを外側メインフレームに通して,
フリッパーアームスプロケットとチェインを装着します.
このチェインを装着するのが,なかなかやりにくい.
ボスとフリッパーアームフレーム装着
ボスとフリッパーアームをネジで締め付けます.
メインシャフトにフリッパーアーム用フレームを通し,スプロケット,履帯を装着した画像が↑になります.
最後に,カバーを装着して,止め輪をメインシャフトに装着すれば完成です.
使用モータ
NUEMK-Ⅰではタミヤギアドモータ540とギアボックスを利用しておりましたが,Mk-Ⅱでは重量が多くなって
いるため,ギアボックスがスパーギアボックスで,歯車1つに加わる荷重が高くなります.
そのため,歯が欠けてしまいました.(上図)
そこで,朱雀技研様で売られている,遊星ギアドモータを利用しました.(下図)
余談ですが,相撲ロボコンでもおなじみ,かわさきロボコンでも同じようなことがあるそうで,各チームで
工夫を凝らして大会に臨んでいるそうです.
回路図
MK-Ⅱ本体用の回路と,コントローラ用の回路図です.
NUEMK-Ⅱ回路図
NUEMK-Ⅱ回路図です.
Arduino用バッテリーは単3乾電池×4個用電池ボックス
モータドライバーはPololu24V21
モータ用バッテリーは報道用カメラバッテリーDUO190×4
コントローラ回路図
コントローラ回路図です.
Arduino用バッテリーは単3乾電池×4個用電池ボックス
タクトスイッチ4 ←サブクローラ回転指令用スイッチ
ジョイスティック メインクローラ回転方向,速度調整用
プログラム
□コントローラプログラム
int SendBuf[5];
int i;
//const int analogPin(0) = A0;
//const int analogPin(1) = A1;
int HDatain,VDatain,HDataout,VDataout;
int button2 =2;
int button3 =3;
int button4 =4;
int button5 =5;
int DirR;
int DirL;
int SubCDirUP_R_read;
int SubCDirDOWN_R_read;
int SubCDirUP_L_read;
int SubCDirDOWN_L_read;
int SubCDirR_out;
int SubCDirL_out;
int Duty,Duty1,Duty2;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(button2,INPUT);
pinMode(button3,INPUT);
pinMode(button4,INPUT);
pinMode(button5,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
VDatain = analogRead(A0);
VDataout = map(VDatain,0,1023,0,220);
HDatain = analogRead(A1);
HDataout = map(HDatain,0,1023,0,220);
SubCDirUP_R_read = digitalRead(button2);
SubCDirDOWN_R_read = digitalRead(button3);
SubCDirUP_L_read = digitalRead(button4);
SubCDirDOWN_L_read = digitalRead(button5);
//前進後退
if(VDataout>140){
if(HDataout>140){
DirL = 0;
DirR = 0;
Duty1 =VDataout;
Duty2 =HDataout;
}
else if(140>=HDataout && 100<HDataout){
DirL = 0;
DirR = 0;
Duty1 =(VDataout-110)*2;
Duty2 =(VDataout-110)*2;
}
else{
DirL = 0;
DirR = 0;
Duty1 =(200-HDataout);
Duty2 =VDataout;
}
}
else if(VDataout<=140 && VDataout>=125){
if(HDataout>140){
DirL = 1;
DirR = 0;
Duty1 =HDataout+15;
Duty2 =HDataout+15;
}
else if(HDataout<110){
DirL = 0;
DirR = 1;
Duty1 =(120-HDataout)*2;
Duty2 =(120-HDataout)*2;
}
else{
DirL = 2;
DirR = 2;
Duty1 =0;
Duty2 =0;
}
}
else if(125>VDataout && VDataout>=110){
if(HDataout>140){
DirL = 1;
DirR = 0;
Duty1 =(HDataout-120)*2+15;//(HDataout-120)*2
Duty2 =(HDataout-120)*2+15;//(HDataout-120)*2
}
else if(HDataout<110){
DirL = 0;
DirR = 1;
Duty1 =(110-HDataout)*2;
Duty2 =(110-HDataout)*2;
}
else{
DirL = 2;
DirR = 2;
Duty1 =0;
Duty2 =0;
}
}
else{
if(HDataout>150){
DirL = 1;
DirR = 1;
Duty1 =(HDataout-120)*2;
Duty2 =(120-VDataout)*2;
}
else if(150>=HDataout && HDataout>100){
DirL = 1;
DirR = 1;
Duty1 =(120-VDataout)*2;//(110-VDataout)*2
Duty2 =(120-VDataout)*2;//(110-VDataout)*2
}
else{
DirL = 2;
DirR = 2;
Duty1 =(120-HDataout)*2;
Duty2 =(120-VDataout)*2;
}
}
if(SubCDirUP_R_read==1 || SubCDirDOWN_R_read==1){ //サブクローラ1回転方向 Subcrawler1 rotate direction
if(SubCDirUP_R_read==1){
SubCDirR_out=1;
}
else{
SubCDirR_out=0;
}
}
else{
SubCDirR_out=2;
}
if(SubCDirUP_L_read==1 || SubCDirDOWN_L_read==1){ //サブクローラ2回転方向 Subcrawler2 rotate direction
if(SubCDirUP_L_read==1){
SubCDirL_out=1;
}
else{
SubCDirL_out=0;
}
}
else{
SubCDirL_out=2;
}
//SendBuf[0] = 0xFF;
//SendBuf[1] = 0xFF;
SendBuf[0] = DirL;
SendBuf[1] = Duty1;
SendBuf[2] = DirR;
SendBuf[3] = Duty2;
SendBuf[4] = SubCDirR_out;
SendBuf[5] = SubCDirL_out;
//SendBuf[4] = 0;
Serial.write(255);
Serial.write(255);
//Serial.print(255);
//Serial.println(255);
for(i=0;i<6;i++){
//Serial.println(SendBuf[i]);
Serial.write(SendBuf[i]);
}
Serial.write(0);
delay(200);
}
□コントローラプログラム
#define PIN_IN1 3 #define PIN_IN2 8 #define PIN_IN3 5 #define PIN_IN4 10 #define PIN_VREF1 6 #define PIN_VREF2 9 #define PIN_VREF3 4 #define PIN_VREF4 11 int RcvData=0; int RcvBuf[6];//配列数は送られてきたデータの数n カウント数はn-1 int MT_Rin=5; int MT_Lin=6; int MT_RoutSerial=0; int MT_LoutSerial=0; int MT_RoutSerial2=0; int MT_LoutSerial2=0; int MT_RSuboutSerial=0; int MT_LSuboutSerial=0; int i=0; int RcvState=0; //int RcvCountF=0; //int RcvCountS=0; int RcvC=0; int MT1D=0; int MT2D=0; int MT1S=0; int MT2S=0; int RcvCount=0; void setup() { Serial.begin(9600); // 9600bpsでシリアルポートを開く pinMode(PIN_IN1,OUTPUT); pinMode(PIN_IN2,OUTPUT); pinMode(PIN_IN3,OUTPUT); pinMode(PIN_IN4,OUTPUT); pinMode(PIN_VREF1,OUTPUT); pinMode(PIN_VREF2,OUTPUT); pinMode(PIN_VREF3,OUTPUT); pinMode(PIN_VREF4,OUTPUT); } void loop() { while(Serial.available() > 0){ RcvData=Serial.read(); //Serial.println(RcvData); //Serial.println(RcvState); switch(RcvState){ case 0: if(RcvData==255){ RcvState = 1; //Serial.print("RcvData1"); //Serial.println(RcvState); } break; case 1: if(RcvData==255){ RcvState = 2; //Serial.print(" RcvData2"); //Serial.println(RcvData); } else{ RcvState = 0; } break; case 2: RcvBuf[RcvCount]=RcvData; RcvCount++; if(RcvCount >=7){ RcvCount=0; RcvState = 3; //Serial.print(" RcvData*"); //Serial.println(RcvData); } break; case 3: MotorCnt(); RcvState=0; break; } } } void MotorCnt(){ //モータ1の制御 //digitalWrite(13, HIGH ); //delay(100); //digitalWrite(13, LOW ); //delay(100); //digitalwriteが先でanalogWriteが後!! if(RcvBuf[0]==0 || RcvBuf[0]==1){ if(RcvBuf[0] == 0){ MT_LoutSerial = RcvBuf[1]; //Serial.print("左前"); //Serial.print(MT_LoutSerial); digitalWrite(PIN_IN1,HIGH); analogWrite(PIN_VREF1,MT_LoutSerial); } else{ MT_LoutSerial = RcvBuf[1]; //Serial.print("左後"); //Serial.print(MT_LoutSerial); digitalWrite(PIN_IN1,LOW); analogWrite(PIN_VREF1,MT_LoutSerial); } if(RcvBuf[2] == 0){ MT_RoutSerial = RcvBuf[3]; //Serial.print("右前"); //Serial.println(MT_RoutSerial); digitalWrite(PIN_IN2,HIGH); analogWrite(PIN_VREF2,MT_RoutSerial); } else{ MT_RoutSerial = RcvBuf[3]; //Serial.print("右後"); //Serial.println(MT_RoutSerial); digitalWrite(PIN_IN2,LOW); analogWrite(PIN_VREF2,MT_RoutSerial); } } else{//MT_RoutSerial2とLoutSerial2は回転方向表示用変数 また,回転速度の表示を行うと,ジョイスティックが中立になっても,受信側の値が0にならないので,analogwrite(PWM出力)の値は強制的に0にしている //MT_RoutSerial2 = RcvBuf[0]; //MT_LoutSerial2 = RcvBuf[2]; //Serial.print("停止 "); //Serial.print("左回転方向"); //Serial.print(MT_LoutSerial2); //Serial.print("右回転方向"); //Serial.print(MT_RoutSerial2); //Serial.print("回転速度"); //Serial.print(MT_LoutSerial); //Serial.print(" "); //Serial.println(MT_RoutSerial); digitalWrite(PIN_IN1,LOW); digitalWrite(PIN_IN2,LOW); analogWrite(PIN_VREF1,0); analogWrite(PIN_VREF2,0); } if(RcvBuf[4]==1 || RcvBuf[4]==0){ if(RcvBuf[4] == 1){//ここから配列 ボタン入力の処理を描いてゆく digitalWrite(PIN_IN3,HIGH); analogWrite(PIN_VREF3,255); //Serial.print("サブクローラ右前"); //Serial.println(1); } else if(RcvBuf[4] == 0){ digitalWrite(PIN_IN3,LOW); analogWrite(PIN_VREF3,255); //Serial.print("サブクローラ右後"); //Serial.println(0); } } else{ digitalWrite(PIN_IN3,LOW); analogWrite(PIN_VREF3,0); //Serial.print("サブクローラ右無"); //Serial.println(2); } if(RcvBuf[5]==1 || RcvBuf[5]==0){ if(RcvBuf[5] == 1){ digitalWrite(PIN_IN4,HIGH); analogWrite(PIN_VREF4,255); //Serial.print("サブクローラ左前"); //Serial.println(1); } else if(RcvBuf[5] == 0){ digitalWrite(PIN_IN4,LOW); analogWrite(PIN_VREF4,255); //Serial.print("サブクローラ左後"); //Serial.println(0); } } else{ digitalWrite(PIN_IN4,LOW); analogWrite(PIN_VREF4,0); //Serial.print("サブクローラ左無"); //Serial.println(2); } //delay(200); }
参考文献
●サブクローラ機構構成
極樂地恭平 八島裕紀 小林滋 高森年 2012-03 レスキューロボットUMR2010走行系の設計と性能評価
http://www.kobe-kosen.ac.jp/activity/publication/kiyou/Kiyou11/Data/Vol50Paper017_022.pdf
Amon Tunwannarux, and Supanunt Tunwannarux The CEO Mission II, Rescue Robot with Multi-Joint Mechanical Arm World Academy of Science, Engineering and Technology
International Journal of Mechanical and Mechatronics Engineering
Vol:1, No:3, 2007 pp513 World Academy of Science, Engineering and Technology
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.192.9532&rep=rep1&type=pdf
●段差乗り越えの計算
西川 康博*,鈴木 悠矢 2017 年 3 月偏心車軸を特徴とした車輪機構の段差乗り越え性能
https://www.jstage.jst.go.jp/article/jjsde/52/3/52_2016.2694/_article/-char/ja/
西川 康博*,鈴木 悠矢 東京都立産業技術研究センター研究報告,第10号,2015年 段差乗り越えキャスターの開発
https://www.iri-tokyo.jp/uploaded/attachment/1175.pdf
ト ラ ク タ 重 量 の 車 輪 へ の 分 布 に つ い て(第1報) 農 業 機 械 学 会 誌 第25巻 第2号
https://www.jstage.jst.go.jp/article/jsam1937/25/2/25_2_67/_pdf
ト ラ ク タ 重 量 の 車 輪 へ の 分 布 に 関 す る 研 究(第2報)
https://www.jstage.jst.go.jp/article/jsam1937/25/3/25_3_141/_pdf
●戦車技術
大井上博等訳編 戦車工学
https://iss.ndl.go.jp/books/R100000039-I001492665-00
林磐男 著 タンクテクノロジーー戦車技術 1992/7/1 技術教育研究会
●物理参考文献
山本義隆 新物理入門 駿台文庫
多くの人が勘違い?「作用・反作用の法則」を理系ライターがわかりやすく解説
https://study-z.net/11273/2
●材料力学 回転支持
JSME テキストシリーズ 材料力学 pp63-64
●歯車解説
波多江茂樹著 機械解析の基礎 機構額から機構解析シミュレータまで
日刊工業新聞社pp23-26
機械要素を基礎から解説するサイト イチから学ぶ機械要素
https://www.keyence.co.jp/ss/products...
●慣性モーメント解説
慣性モーメントの設計計算 川北和明 藤智亮
技術計算書 1.等価慣性モーメント
https://gijyutsu-keisan.com/mech/engineer/mecdyn/eqphys/eqphys_1.php
MIKI PULLEY 変速機・減速機とは?その種類や構造
https://www.mikipulley.co.jp/JP/Catalog/Request/index.html
●電子工作
後閑哲也著 電子工作の素 技術評論社
鈴木美郎志著 Arduinoでロボット工作を楽しもう 秀和システム
朱雀技研 遊星ギヤボックスとスパーギヤボックスの特徴
https://note.suzakugiken.jp/gearbox-comparison-ref-a/
朱雀技研にてモータの購入もしました
材料仕入先
アルミフレーム NIC
Direct https://ssl.nic-direct.jp/ モータとモータドライバー
電子部品
朱雀技研 https://www.suzakugiken.jp/
秋月電子 https://akizukidenshi.com/catalog/top...
マルツパーツ https://www.marutsu.co.jp/
千石電商 https://www.sengoku.co.jp/ 板材
近所のホームセンター
投稿者の人気記事
-
ProjectSR
さんが
2021/12/30
に
編集
をしました。
(メッセージ: 初版)
-
ProjectSR
さんが
2021/12/30
に
編集
をしました。
(メッセージ: PVを追記)
ログインしてコメントを投稿する