ArduinoUNOを使用したイカゲーム人形のビルド
コンポーネントと消耗品
> ![]() |
| × | 2 | |||
![]() |
| × | 1 | |||
![]() | >
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
必要なツールとマシン
> ![]() |
|
アプリとオンラインサービス
> ![]() |
|
このプロジェクトについて
完全に機能するイカゲーム人形を作りました。彼女はあなたと一緒に赤-光-緑-光のゲームをします。回転する頭と色のついた目で完成し、彼女は話します!彼女は超音波と動きの検出を使用して、あなたが勝つか負けるかを判断します。しかし、心配しないでください。負けた場合、彼女はもう一度プレイするかどうかを尋ねるだけです。
ビデオを見て、あなたの考えを教えてください。
Arduino UNOのすべてのピンを使用しました!これまでやったことがないので、これは私にとっての成果でした。このプロジェクトの構築には3週間かかり、1週間は完全に印刷に専念しました。この人形を印刷するのに6日かかりました。ビルドに1週間、ビデオの編集にもう1週間。
ELEGOOがビデオを作ったら無料のUNOキットを送ってくれたので、人形を作りました。これか脱出部屋を建てるかのどちらかでした。彼らがこのプロジェクトを選んだことをうれしく思います。とても素敵に見えて、たくさんの人を忍び寄るのは楽しいビルドだったので、人々がそれを楽しんでくれることを願っています。しかし、もっと重要なことは、それが機能することです。
これが、このビルドに使用するすべてのパーツです。
<図>
1.印刷を開始します
印刷には時間がかかります。人形全体を印刷するのに6日かかりました。また、塗装量を減らすために、別の色のフィラメントを使用しました。
私はthingiverse.comで見つけたモデルをリミックスし、中央をくり抜いて、電子機器用のアクセスホールを追加しました。また、サーボとウルトラソニックを取り付けるためのチェストプレートを変更しました。
<図>


2.絵が好きな人はいない
ペイントする時間です。これには一般的なスプレーペイントを使用しました。人形の頭の内側(目を覆い隠す)をペイントして、目のLEDが顔全体を輝かせないようにしました。これはあなたが探している効果かもしれませんが。目だけを輝かせたかった。
<図>



3.磁石は引き付けますが、スティックのり
人形の手足をすべて取り付ける1つの方法は、磁石をプラスチックに溶かすことです。これは、彼女を分解できるようにしたい場合です。もし私がこのプロジェクトをもう一度やるなら、私はおそらく彼女にすべての手足を接着するでしょう。私が今見ているように、必要に応じて保管用の小さな箱に収まることができることを除けば、磁石を使用する利点はほとんどありません。この時点で付けてはいけないのは頭だけです。
<図>
4.目にやさしい
最も簡単なステップである目から始めます。目には3色のLEDを使用しました。ご存知のように、RGBカラーを組み合わせて、基本的な任意のカラーを取得できます。一次色と二次色にこだわったので、信号をPWMする必要はありませんでした。しかし、あなたがそれを探しているなら、あなたはそうすることができます。
最も長いピンは地面で、ピン2になります。
写真のように、アース以外の各リードに220オームの抵抗を使用してLEDを接続します。
取り付けには、LEDを目の中心にできるだけ近づけて、裏側に熱接着しました。首から下半身に入るのに十分な長さのワイヤーを使用してください。
<図>



5.LCDメニュー
次に簡単なコンポーネントは16x2LCDスクリーンです。 LCD画面はI2Cアダプターと一緒に使用する必要があります。それはあなたの生活をはるかに楽にし、IOカウントを6から2に減らします。これが接続されると、LCDは「イカゲームへようこそ!」で起動するはずです。ディスプレイ上。
取り付けは厚さ1mmの円を印刷しました。ヒートガンで人形に成形できるように薄くします。これは、彼女の背中の輪郭を理解するよりもはるかに簡単です(少なくとも私にとっては)。ディスプレイとディスプレイマウントを本体に固定するために、裏側にナット付きのディスプレイ用ネジ付きインサートを取り付けました。
<図>

6.フクロウの頭だけが180度回転します
サーボが難しかったのは、サーボライブラリを使わないことが主な理由です。奇妙に聞こえるかもしれませんが、4桁のディスプレイの更新にはtimer1を使用する必要があり、サーボライブラリもこれを使用しています。幸いなことに、サーボは0度または180度のいずれかであり、これを非常に簡単にするための間にはありません。
Timer1は.5ms間隔、2000hzに設定されています。サーボ周期は20msです。 0度では、ピンは2カウントの間ハイで、残りの期間はローである必要があります。 180度の場合、ピンは4カウントの間は高く、残りの時間は低くする必要があります。
サーボ用のチェストプレートには素敵なマウントがあります。あなたはそれを所定の位置にねじ込むか、またはそれを所定の位置に接着することができます。サーボをチェストプレートに固定するためにエポキシを使用しました。これは、チェストプレートに強度を追加し、損傷を防ぐことができるためです。
<図>


7.コウモリのように聞こえます
次に、超音波距離モジュールを取り付けます。私はこれを250msごとに更新しています。また、チェストプレートへの取り付け位置も良好です。このモジュールには2本のワイヤーしかありません。
胸板に超音波を取り付けるためにエポキシを使用しました。
<図>


8.紐が付いていません
リモコンのIRセンサーは、ゲームプレイを制御する場合にのみ必要です。これは楽しいだろうと思いましたが、実際にはこのモードを使用しないでください。自動ゲームプレイは十分に楽しいです。
人形の髪の毛のクリップの中にIRセンサーを取り付けることにしました。あなたは明らかにそれをどこかに置くことを選ぶことができます。私はそれを隠そうとしていましたが、IRが頭を向けたときにリモートが常に見えるとは限らず、センサーが反対側にあるため、より良い場所があるかもしれません。
<図>

9.時々
次に、タイマー表示を設定します。これは、4桁のディスプレイでは大変な作業です。 ELEGOOからの接続図を含めます。ゲームプレイは最大5分なので、最上位桁の使用も削除しました。ただし、IOピンが使用可能な場合は、それを保持することにします。一度にアクティブにできるのは1桁のみであるため、表示を更新するには、LEDを非常にすばやく循環させる必要があります。これが、カメラを通して見たときにちらつくように見える理由です。ちらつきが見えないほど速い2msのリフレッシュレートを使用しました。 5msで、周辺視野のディスプレイを見るとちらつきが見え始めます。さらに、シフトレジスタ74HC595が必要になります。
ディスプレイの取り付けは面白くありません。ディスプレイを彼女のベルトに統合するのが最善だと思いました。イカゲームのオリジナルの人形にはもちろんベルトがありませんが、このディスプレイを彼女に表示するには犠牲を払う必要がありました。このルートも選択する場合は、ディスプレイと同じサイズの正方形をマスクしてから、Dremelで切り取ります。次に、エポキシパテを使用して、ディスプレイに段階的なトランジションを追加しました。しかし、これは必要ありませんでした、私はそれがこのように良く見えると思っただけです。
74HC595をプロトタイプのシールドに取り付けました。そうしないと、ワイヤーがいたるところに行き渡ってしまいます。別の解決策は、より少ないピンでより便利な通信を行う別のタイマーディスプレイを使用することです。
<図>


10.あなたが動くのを見ました
人感センサーは奇妙な小さな男です。これは、赤外線を使用して動きを検出します。私が学んだことの1つは、このセンサーがウォームアップするのに時間がかかるということです。起動時にウォームアップするのに1分かかります。そのため、人形の起動時間は1分です。このモジュールのもう1つの厄介な点は、動きの検出を更新できる最速が約5秒であることです。最後の煩わしさは、このセンサーの感度です。感度を完全に下げても、それでも最小の動きを見ることができ、時にはそれが何について話しているのかさえわからない動きを見ることができます。これらの「誤検知」を防ぐために、私はセンサーを馬の目隠しボックスの中に取り付けました。ボックスには、モーションディテクタが外を見ることができる小さな穴(7mm)があります。ボーナスとして、これにより、この巨大なセンサーを人形の外側に取り付ける必要がなくなります。モーションセンサーには、フィードバック、モーションの有無にかかわらず、バイナリワイヤが1本しかありません。
センサーを取り付けるために、馬の目隠しを印刷して人形の内側に接着しました。次に、体に穴を開けました。モーションセンサーを固定するために、ブラインドボックスにネジ付きインサートを使用しました。
<図>


11.ボタンを押さないでください
最後に、ボタンを押します。追加のI / Oピンがある場合は、これらの各ピンをデジタル入力に接続する方が簡単です。しかし、私はUNOにとってこのような贅沢はありませんでした。代わりに、アナログ入力を使用して抵抗値を読み取り、どのボタンが押されているかを判断する必要がありました。私が使用した値は、1K、2K、および5Kでした。次に、アナログ入力をローに引き下げるために220オームの抵抗を使用しました。そうしないと、フロートしてランダムなボタンが押されます。
LCDと同じ取り付けプレートにボタンを取り付けました。これは簡単ではありませんでしたが、私にはもっと良い方法がありませんでした。これらのボタンにワイヤーをはんだ付けしてから、プラスチックに開けられた小さな穴にワイヤーを通すと、患者をテストできます。
<図>

12.今聞こえますか?
最後のステップで、おそらく最も重要なのはサウンドモジュールです。これはUNOのシリアルポートを使用するため、TxピンとRxピンに1Kオームの抵抗を追加する必要があります。そうしないと、この接続が確立された後、UNOのプログラミングがブロックされます。さらに、「ビジー」ピンを使用して、サウンドがすでに再生されていることをUNOが認識できるようにする必要があります。 MP3を連続して再生する場合、これは非常に重要です。
プロトタイプのシールドにMP3プレーヤーモジュールを取り付けました。このシールドは、UNOに差し込むだけなので、このような取り付けコンポーネントを非常に便利にします。このモジュールには8オームのスピーカーが必要で、出力は3Wです。スピーカーは人形のベースに接着されただけです。スピーカーの下に小さな穴を開けて、音が良くなるようにしました。
<図>

13.UNOをマウントします
UNOをプラットフォームに取り付け、プロトタイプシールドをUNOに接続します。すべてのワイヤーにラベルを付けていることを確認してください。そうでない場合は、ワイヤーのいずれかが今どこに行くのかわからない可能性があります。少し交渉すれば、すべてのワイヤーを接続した状態で、人形の中にマウントされたUNOを入れることができます。
プラットフォームを人形の底に取り付けるために、ネジ付きインサートを使用しました。
<図>

14.テスト修正テスト
これは、デバッグの帽子をかぶるときです。ソフトウェアがGitHubで動作していることがわかるので、少なくともデバッグする必要が1つ少なくなります。しかし、疑問がある場合はとにかく先に進んで、見つけた更新を私に送ってください。
<図>
15.遊ぼう
彼女をテストしてゲームをする時間です。ゲームのプログラム方法は次のとおりです。
起動時に、彼女は頭を前に向けます。
モーションセンサーの起動には1分かかります。そのため、起動時にタイマーがあります。途中で彼女はくすくす笑い、頭を振り返ります。次に、準備ができたらアナウンスします。
ゲームをリモートに設定しているかどうかに応じて、彼女はさまざまなことを言います。自動モードでは、彼女はあなたに再生ボタンを押すように頼みます。私の場合、これは右端のボタンです。リモートモードでは、準備ができたら電源ボタンを押すように求められます。次に、再生ボタンを押して、赤色のライトまたは緑色のライトに切り替えます。
準備ができたら、移動ボタンを押すと、10秒以内に配置されます。通常、近くにいる誰かがこのボタンを押します。
その後、ゲームが始まります。彼女は緑色の光から始めます。緑色のライトの場合、勝利をトリガーするには50cm以内に入る必要があります。あなたが100cm以内にいる場合、彼女はあなたが近づいていることを示していると言います。緑色のライトはソナーのみを使用しています。
赤色光の場合、モーションセンサーと距離センサーが使用されています。モーションセンサーがトリップするのに十分な距離を移動するか、10cm以上前方に移動すると、ゲームが失われます。また、時間がなくなるとゲームを失うことになります。彼女は、残り5秒で時間がほとんどなくなったことを思い出させます。
最後のクールな機能は、彼女が赤信号のために韓国語の声でも話すことです。これはメニュー機能です。左端のボタンを押してメニュー項目を切り替え、中央のボタンを押して項目オプションを切り替えます。
16.ビデオを見る
このビデオの編集には長い時間がかかりました。編集だけでおそらく30時間あります。しかし、それを作るのは楽しかったです。良かったし面白いと思いますが、自分で見てほしいです。ご意見やご不明な点がございましたら、お気軽にお問い合わせください。
https://youtu.be/jd_4a4x3uCw
ありがとう!
コード
- イカゲーム人形のスケッチ
イカゲーム人形のスケッチ C / C ++
これにより、すべてのセンサーとゲームロジックが制御されます。/// CodeMakesItGo 2021年12月#include#include #include #include # include #include #include / * -----(アナログピン)----- * /#define BUTTONS_IN A0#define SONAR_TRIG_PIN A1#define SONAR_ECHO_PIN A2 #define MOTION_IN A3 / * -----(デジタルピン)----- * /#define LED_BLUE 13#define LED_GREEN 12#define LED_RED 11#define SEGMENT_DATA 10 // DS#define SEGMENT_CLOCK 9 // SHCP#define SEGMENT_LATCH 8 // STCP#define SEGMENT_1_OUT 7#define SEGMENT_2_OUT 6#define SEGMENT_3_OUT 5#define IR_DIGITAL_IN 4 // IR Remote#define SERVO_OUT 3#define DFPLAYER_BUSY_IN 2 / * -----(構成)----- * / #define TIMER_FREQUENCY 2000#define TIMER_MATCH(int)(((16E + 6)/(TIMER_FREQUENCY * 64.0))-1)#define TIMER_2MS((TIMER_FREQUENCY / 1000)* 2)#define VOLUME 30 // 0-30#define BETTER_HURRY_S 5 //残り5秒でクリップを再生します#defineWIN_PROXI MITY_CM 50 //勝者のcm距離#defineCLOSE_PROXIMITY_CM 100 //勝者に近い距離#define GREEN_LIGHT_MS 3000 //緑色のライトの場合は3秒#defineRED_LIGHT_MS 5000 //緑色のライトの場合は5秒#defineWAIT_FOR_STOP_MOTION_MS 5000 //モーション検出が停止するのを待つ5秒/ * -----(グローバル変数)----- * / static unsigned int timer_1000ms =0; static unsigned int timer_2ms =0; static unsigned char digit =0; // 4セグメントの桁displaystaticint countDown =60; // startupstaticで1分間のカウントダウンを開始しますconstint sonarVariance =10; //この静的boolよりも大きい場合は動きを検出しますgameInPlay =false; static bool faceTree =false; static bool remotePlay =false; // 0、1、2、3、4、5、6、7、8、9、A、B 、C、D、E、F、NULLconst unsigned char numbers [] ={0x3f、0x06、0x5b、0x4f、0x66、0x6d、0x7d、0x07、0x7f、0x6f、0x77、0x7c、0x39、0x5e、0x79、0x71、0x }; const char * MenuItems [] ={"Language"、 "Play Time"、 "Play Type"}; typedef enum {LANGUAGE、PLAYTIME、PLAYTYPE、MENUITEM_COUNT} MenuItemTypes; const char * Languages [] ={"English"、 "Korean"}; typedef enum {ENGLISH、KOREAN、LANUAGE_COUNT} LanguageTypes; static int language =0; const char * PlayTime [] ={"300"、 "240"、 "180"、 "120"、 "60"、 "30"、 "15"}; typedef enum {PT300、PT240、PT180、PT120、PT60、PT30、PT15、PLAYTIME_COUNT} PlayTimeTypes; const int playTimes [] ={300、240、180、120、60、30、15 }; static int playTime =0; const char * PlayType [] ={"Auto"、 "Remote"}; typedef enum {AUTO、REMOTE、PLAYTYPE_COUN T} PlayTypeTypes; static int playType =0; typedef enum {BLACK、RED、GREEN、BLUE、WHITE、YELLOW、PURPLE} EyeColors; EyeColors eyeColor =BLACK; typedef enum {WARMUP、WAIT、READY、GREENLIGHT、REDLIGHT、WIN、LOSE } GameStates; static GameStates gameState =WARMUP; / * -----(クラスオブジェクト)----- * / FireTimer task_50ms; FireTimer task_250ms; DFPlayerMini_Fast dfPlayer; SR04 sonar =SR04(SONAR_ECHO_PIN、SONAR_TRIG_PIN); IRrecv irRecv(IR_DIGITAL_IN ); decode_results irResults; LiquidCrystal_I2C lcdDisplay(0x27、16、2); // 16x2LCDディスプレイ/ * -----(関数)----- * / void translateIR()//受信したIRコードに基づいてアクションを実行します{switch(irResults.value){case 0xFFA25D:Serial.println( "パワー"); if(gameState ==WAIT){gameInPlay =true; } 壊す;ケース0xFFE21D:Serial.println( "FUNC / STOP");壊す;ケース0xFF629D:Serial.println( "VOL +");壊す;ケース0xFF22DD:Serial.println( "FAST BACK");壊す;ケース0xFF02FD:Serial.println( "PAUSE"); remotePlay =!remotePlay;壊す;ケース0xFFC23D:Serial.println( "FAST FORWARD");壊す;ケース0xFFE01F:Serial.println( "DOWN");壊す;ケース0xFFA857:Serial.println( "VOL-");壊す;ケース0xFF906F:Serial.println( "UP");壊す;ケース0xFF9867:Serial.println( "EQ");壊す;ケース0xFFB04F:Serial.println( "ST / REPT");壊す;ケース0xFF6897:Serial.println( "0");壊す;ケース0xFF30CF:Serial.println( "1");壊す;ケース0xFF18E7:Serial.println( "2");壊す;ケース0xFF7A85:Serial.println( "3");壊す;ケース0xFF10EF:Serial.println( "4");壊す;ケース0xFF38C7:Serial.println( "5");壊す;ケース0xFF5AA5:Serial.println( "6");壊す;ケース0xFF42BD:Serial.println( "7");壊す;ケース0xFF4AB5:Serial.println( "8");壊す;ケース0xFF52AD:Serial.println( "9");壊す;ケース0xFFFFFFFF:Serial.println( "REPEAT");壊す;デフォルト:Serial.println( "その他のボタン"); }} bool isPlayingSound(){return(digitalRead(DFPLAYER_BUSY_IN)==LOW);} void updateTimeDisplay(unsigned char digit、unsigned char num){digitalWrite(SEGMENT_LATCH、LOW); shiftOut(SEGMENT_DATA、SEGMENT_CLOCK、MSBFIRST、numbers [num]); //アクティブLOWdigitalWrite(SEGMENT_1_OUT、digit ==1?LOW:HIGH); digitalWrite(SEGMENT_2_OUT、digit ==2?LOW:HIGH); digitalWrite(SEGMENT_3_OUT、digit ==3?LOW:HIGH); digitalWrite(SEGMENT_LATCH、HIGH);} void updateServoPosition(){static intservoPulseCount =0; static bool lastPosition =false; //期間の開始時にのみ新しい値を取得するif(servoPulseCount ==0)lastPosition =faceTree; if(!lastPosition)// 180度{digitalWrite(SERVO_OUT、servoPulseCount <5?HIGH:LOW); } else // 0度{digitalWrite(SERVO_OUT、servoPulseCount <1?HIGH:LOW); } servoPulseCount =(servoPulseCount + 1)%40; // 20ミリ秒の期間} void updateMenuDisplay(const int button){static int menuItem =0; static int menuOption =0;スイッチ(ボタン){ケース1:menuItem =(menuItem + 1)%MENUITEM_COUNT; if(menuItem ==LANGUAGE){menuOption =言語; } else if(menuItem ==PLAYTIME){menuOption =playTime; } else if(menuItem ==PLAYTYPE){menuOption =playType; } else {menuOption =0; } 壊す;ケース2:if(menuItem ==LANGUAGE){menuOption =(menuOption + 1)%LANUAGE_COUNT;言語=menuOption; } else if(menuItem ==PLAYTIME){menuOption =(menuOption + 1)%PLAYTIME_COUNT; playTime =menuOption; } else if(menuItem ==PLAYTYPE){menuOption =(menuOption + 1)%PLAYTYPE_COUNT; playType =menuOption; } else {menuOption =0; } 壊す;ケース3:if(gameState ==WAIT){gameInPlay =true; } if(gameState ==GREENLIGHT || gameState ==REDLIGHT){gameInPlay =false; }デフォルト:break; } if(menuOption!=-1){lcdDisplay.clear(); lcdDisplay.setCursor(0、0); lcdDisplay.print(MenuItems [menuItem]); lcdDisplay.setCursor(0、1); if(menuItem ==LANGUAGE){lcdDisplay.print(Languages [menuOption]); } else if(menuItem ==PLAYTIME){lcdDisplay.print(PlayTime [menuOption]); } else if(menuItem ==PLAYTYPE){lcdDisplay.print(PlayType [menuOption]); } else {lcdDisplay.print( "不明なオプション"); }} else {menuItem =0; menuOption =0; }} void handleButtons(){static int buttonPressed =0; int値=analogRead(BUTTONS_IN); if(value <600)//ボタンが解放されました{if(buttonPressed!=0)updateMenuDisplay(buttonPressed); buttonPressed =0;戻る; } else if(value <700){Serial.println( "button 1"); buttonPressed =1; } else if(value <900){Serial.println( "button 2"); buttonPressed =2; } else if(value <1000){Serial.println( "button 3"); buttonPressed =3; } else {Serial.println(value); buttonPressed =0; }} static int lastSonarValue =0; void handleSonar(){int value =sonar.Distance(); if(value> lastSonarValue + sonarVariance || value 30000 || sequence ==0){internalTimer =millis(); if(playType ==AUTO){//準備ができたら移動ボタンを押すSerial.println( "準備ができたら移動ボタンを押す"); dfPlayer.playFolder(1、5); } else {Serial.println( "準備ができたらリモートの電源ボタンを押してください"); dfPlayer.playFolder(1、6); } //目は青いeyeColor =BLUE; //プレイヤーと向き合うfaceTree =false; gameInPlay =false;シーケンス++; }} else if(gameState ==READY){currentTimer =millis(); if(sequence ==0){//位置を取得し、ゲームは10秒で開始しますSerial.println( "位置を取得します。"); dfPlayer.playFolder(1、7); countDown =10; //目は緑色ですeyeColor =WHITE; //プレイヤーと向き合うfaceTree =false;シーケンス++; internalTimer =millis(); } else if(sequence ==1){if(playType ==REMOTE){if(remotePlay)sequence ++; } else sequence ++; } else if(sequence ==2){// 0秒で、ここに行きます! if(countDown ==0){countDown =playTimes [playTime]; Serial.print( "再生時間は"に設定されています); Serial.println(countDown); Serial.println( "Here we go!"); dfPlayer.playFolder(1、8); gameState =GREENLIGHT;シーケンス=0; }}} else if(gameState ==GREENLIGHT){currentTimer =millis(); if(sequence ==0){//目は緑色ですeyeColor =GREEN; //グリーンライトを再生しますSerial.println( "Green Light!"); dfPlayer.playFolder(1、9);シーケンス++; } else if(sequence ==1){//モーターサウンドを再生するdfPlayer.playFolder(1、19); //木に面しているfaceTree =true;シーケンス++; internalTimer =millis(); } else if(sequence ==2){// 3秒待つかリモートになるまで//赤信号に切り替えるif(playType ==AUTO &¤tTimer --internalTimer> GREEN_LIGHT_MS){sequence =0; gameState =REDLIGHT; } else if(playType ==REMOTE &&remotePlay ==false){シーケンス=0; gameState =REDLIGHT; } else {//勝者のボタンまたは距離を探すif(gameInPlay ==false || lastSonarValue WAIT_FOR_STOP_MOTION_MS){internalTimer =millis();シーケンス++; Serial.println( "セトリング完了"); } Serial.println( "解決するのを待っています"); } else if(sequence ==3){// 5秒後に緑色に戻るif(playType ==AUTO &¤tTimer --internalTimer> RED_LIGHT_MS){sequence =0; gameState =GREENLIGHT; } else if(playType ==REMOTE &&remotePlay ==true){シーケンス=0; gameState =GREENLIGHT; } else {//赤信号の間はボタンを押すことができません//動きを検出します//距離の変化を検出しますif(gameInPlay ==false || lastMotion ==1 || lastSonarValue プロジェクトファイル
このビルドのすべてのファイルhttps://github.com/CodeMakesItGo/SquidGamesDoll
回路図
これが私がすべてのコンポーネントをUNOに接続した方法です。 
プロジェクトリポジトリ
このビルドのすべてのファイルはここに保存されます。 https://github.com/CodeMakesItGo/SquidGamesDoll製造プロセス