ProjectSRのアイコン画像
ProjectSR 2021年12月30日作成 (2021年12月30日更新)
製作品 製作品 閲覧数 2856
ProjectSR 2021年12月30日作成 (2021年12月30日更新) 製作品 製作品 閲覧数 2856

段差走行ロボット NUEMK-2

段差走行ロボット NUEMK-2

🔳知れる事

◇サブクローラ機構の解説
◇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); }

受信側(NUEMK-Ⅱ車体)
制御フロー
キャプションを入力できます

□コントローラプログラム

#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/ 板材
近所のホームセンター

2
ログインしてコメントを投稿する