魔方陣ロボット


 

 


プロジェクトの起源

このプロジェクトの発端は、ある日、兵士Bがルービックキューブを会社に持ち込んで上司に見つかってしまったことでした。 「ルービックキューブを回せるなら、ルービックキューブロボットを作るのも楽勝だぞ!」上司はそう言い、兵士Bはこのプロジェクトの責任者に任命されました。

機能説明

このプロジェクトでは、86Duino One86Duino Enjoy、そしてMaixduinoを使用して、マジックキューブロボットを実装します。

材料の準備

  1. 86Duino 1台
  2. Maixduino 1台
  3. RoBoard RS-1270サーボ 8個
  4. OV2640 カメラモジュール
  5. マジックキューブ 1個(このプロジェクトではWild Goose Magic Cubeを使用)
  6. 2.4インチTFT LCDスクリーン(オプション)
  7. WS2812 LEDライトバー(LED 18個付き)
  8. 7.2Vバッテリー
  9. 3Dプリンター
  10. ネジ、ナット、ワイヤー

ハードウェアセットアップ

このプロジェクト構成は、OTVINTA のルービックキューブロボットを参考にしており、必要な印刷材料の STL ファイルは以下のとおりです。 カバーパーツの STL ダウンロード 光の問題が後の色認識に影響を与えるのを避けるため、カバーパーツは白または黒の材料で印刷することをお勧めします。

ロボットの詳細な組み立て手順については、OTVINTA の Web サイトを参照してください。グリッパーを取り付ける前に、グリッパーのモーター位置を 1100us に初期化し、グリッパーを垂直に設置する必要があります。さらに、ラックを制御するモーターを2100usに初期化し、スライダーをロボット本体の端に合わせる必要があります(図を参照)。

— サーボ初期化プログラム —

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include <Servo86.h> // Using the Servo86 library

   

Servo myservo1; // Initialize Servo Object

   

void setup()

{

  // Set Servo pin to 21

  myservo1.attach(21);

  

  //Send out a 1100us PWM signal to initialize the servo to 1100us

  myservo1.write(1100);

}

  

void loop() {} 

86DuinoとMaixduinoを固定するための棚の組み立て方を以下に示します。組み立ては下から上に向かって行います。

まず、図に示すように、ロボット下部のモーター位置にplate_holderパーツを固定し、ネジを締めます。その上にplate_bottomパーツを置きます。

次に、2つのjoint1パーツとjoint2パーツをplate_bottomの四隅に固定します。取り付け方向が写真と一致しているかどうかに特に注意し、4つのpillar_shortsを接続します。

pillar_shortsに4つのjoint3パーツを取り付け、plate_86duinoパーツを取り付けて86Duinoを固定します。パーツのネジ穴の位置と86Duinoの向きを照らし合わせてください。86Duinoの緑色の電源端子台が写真の右側を向き、RCサーボコネクタが写真の左側を向くようにすることをお勧めします。次に、サーボとLEDライトストリップを接続し、4つのpillarsを接続します。パーツを取り付け、配線がplate_86duinoの左右に配置され、カメラの映像が遮られないように注意してください。

柱にjoint1、joint2、joint4、join5を取り付け、plate_maixduinoを取り付けます。向きが写真と一致しているかどうかも確認してください。

arm_left、arm_right、Maixduinoを固定し、LEDライトストリップを2本のアームの溝に沿って貼り付けます。次に、OV2640カメラをplate_maixduinoに埋め込み、Maixduinoのピンを86Duinoに接続します。plate_maixduinoには配線を通すための穴が2つあります。

カバーを上に置き、位置を合わせてカバーロックをカバーに貼り付け、最後にロボットにロックします。

次に、下図のように回路接続方法を説明します。 86DuinoとMaixduinoは同じ電源を共有しているため、86Duinoは7.2Vバッテリーで駆動できます。LEDライトストリップとモーターは瞬間的に大きな電流を発生する可能性があるため、電源側の電流が少なくとも10Aに達することを確認してください。

環境設定

Maixduino の環境設定については、詳細な説明が掲載されている MaixPy 教育ウェブサイトを参照してください。

プログラム説明

Maixduino は、Python 3 のほとんどの構文と openMV ライブラリをサポートする Micropython をサポートしています。このプロジェクトでは、Micropython を使用してマジックキューブの色を識別し、86Duino を使用してマジックキューブの解を計算し、モーターを制御します。プログラムの流れは次のとおりです。

— マジックキューブの中心位置を特定 —

機械設計上、マジックキューブの位置は固定されていますが、実際の設置では、マジックキューブがカメラの中心を向くことができない誤差が避けられません。この関数 findCubeCenter() により、マジックキューブは中心キューブの位置を一定の誤差内で補正できます。

— 露出補正 —

色認識を行うには、カメラがどのような光源下でも同一の色情報で撮影できる必要があります。 LEDライトバーの光源を固定するためにトップカバーを追加するだけでなく、露出補正もここで実行され、exposure_compensation()関数は4つの赤い爪の明るさに基づいてカメラの露出時間を自動的に補正します。

— 立方体の6面のHSV色情報収集 —

6面の画像を撮影した後、各マス目の色情報の最頻値をそのマス目を表す色として取得し、その色情報をHSV色空間に転送して色識別を行います。HSVは色の色相、彩度、明度を表します。

— 色識別 —

白(および黒)は他の色とは異なる次元にあるため、まず識別する必要があります。ここでは彩度を基準にソートし、最も彩度が低い9つのマス目を白として識別します。残りの色は色相を基準にソートし、識別を行います。最後に、識別結果を86Duinoに送り返し、マジックキューブを解くプロセスを計算します。

— マジックキューブの動きを表す記号 —

マジックキューブには、U(上)、D(下)、L(左)、R(右)、F(前)、B(後)の6つの方向があります。すべての方向は、それぞれの方向に向かって時計回りに90度回転させた時が正方向となります。したがって、以下の6つの移動シンボルは、以下の回転モードを表します。

U
D
L
R
F
B

時計回りに回転できるなら、反時計回りにも回転できます。プライム記号 (‘) は、反時計回りに90度回転することを表します。

U'
D'
L'
R'
F'
B'

さらに、180度の回転を表す数値2を定義します。

U2
D2
L2
R2
F2
B2

ルービックキューブの解法は、上記の回転方法を組み合わせたものです。上記の命令を turning() 関数に渡すことで、ロボットにルービックキューブを回転させることができます。この機構には、それぞれU、D、R、Lを回転させることができる4つの爪しかないため、FとBを回転させたい場合、プログラムはまずルービックキューブ全体を上下に回転させ、FまたはBの動作がUになるようにします。

—神の数—

任意のランダムなパズルに対して、アルゴリズムが特定のステップ数未満で確実に解を見つけられる場合、このアルゴリズムは「神のアルゴリズム」と呼ばれ、パズルを解くためのステップ数は「神の数」と呼ばれます。2010年、ルービックキューブの「神の数」は20であることが研究者によって証明されました。現在「神のアルゴリズム」として知られているのは、コシエンバアルゴリズム(2フェーズアルゴリズムとも呼ばれます)です。アルゴリズムの詳細な手順については、Cube Explorerを参照してください。ここでは詳細は割愛します。このプロジェクトでは、作者Muodovが実装したコシエンバアルゴリズムを使用しています。作者は、ルービックキューブロボット Meccano Rubik's Shrine も自作しました。

— モーターパラメータ調整 —

マジックキューブの動くシンボルがそれぞれ正常に回転するように、以下のパラメータを調整します。 1. DELAY_TIME: モーターの回転待ち時間 (ms) 2. CLAMP_UPPER_BOUND: グリッパーが90度回転するPWM位置 ld;">3. CLAMP_LOWER_BOUND: グリッパーが0度(つまり初期化位置)に移動したときのPWM位置 4. SLIDE_UPPER_BOUND: スライダーがロボットの端(つまり初期化位置)に移動したときのPWM位置 5. UD_SLIDE_LOWER_BOUND: 上下のスライダーがクランプマジックキューブに移動したときのPWM位置 6. RL_SLIDE_LOWER_BOUND: 左右のスライダーがクランプマジックキューブに移動したときのPWM位置

 const int DELAY_TIME = 200; const int CLAMP_UPPER_BOUND = 2100; const int CLAMP_LOWER_BOUND = 1100; const int SLIDE_UPPER_BOUND = 2100; const int UD_SLIDE_LOWER_BOUND = 965; const int RL_SLIDE_LOWER_BOUND = 760; 

個々のモーターにまだわずかな誤差がある場合は、setOffset() 関数を使用して微調整できます。

結果表示

— デモビデオ —

関連情報

[1] このプロジェクト GitHub [2] このプロジェクト STL構造ファイル [3] OTVINTA ウェブサイト [4] ルービックキューブロボットの作者 Muodov 氏の GitHub [5] マジックキューブアルゴリズム 参考資料ウェブサイト


 

手作り遊園地ホームページ

86Duinoリファレンスのテキストは、クリエイティブ・コモンズ 表示-継承 3.0 ライセンス に基づいてライセンスされています。リファレンス内のコードサンプルはパブリックドメインとして公開されています。