工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Asi(Anansi)Robot Companion

コンポーネントと消耗品

>
Arduino Nano R3
× 1
SG90マイクロサーボモーター
× 1
MAX7219赤色LEDドットマトリックスディスプレイモジュール
× 1
4xAAバッテリーホルダー
リチウムイオン電池3.7 200mahasloも動作します
× 1
ネジ
× 1
透明なプラスチック製のアクリルバスボムモールドシェル
× 1
AdafruitTrinket-ミニマイクロコントローラー-5Vロジック
× 1

必要なツールとマシン

>
3Dプリンター(汎用)
ホットグルーガン(汎用)

このプロジェクトについて

ストーリー

このプロジェクトは元々、ThingiverseのXpiderになる予定でした。それから私はアレックスグローによるアルキメデスを言います。それは私の心を吹き飛ばしました。ひどいものが欲しかった。それで、私は自分のロボット仲間に取り組むようになりました。私はフクロウ型ではないと思ったので、使い魔を特別なものにしたかったのです。それから私はアナンシのアフリカの物語、蜘蛛、トリックスター、そして物語の神を思い出しました。ストーリーを考えてボットを設計することにしたので、Asiが誕生しました(実際にはAsi_v4、v1-3はプロトタイプでした)。

組み立て

元のデザインはXpiderでしたが、私はそれを一段と取り上げて、ドアの外で多くのことを編集しました。これらはあなたが印刷しなければならないほとんどの部分です。

組み立てはかなり自明ですが、とにかくここにいくつかの写真があります。

電子機器の場合、通常は頭の上部または下部に配置できますが(呼び出し)、サーボをそのように取り付ける必要があります。ギアが付いていることを確認してください。

Asiは、TrinketとArduinoNanoの2つのマイクロコントローラーによって制御されます。 Trinketは、ランダムな間隔で前後に回転するサーボのおかげで、目の動きを制御します。 ArduinoNanoは目を制御します。彼が周りを見回すときもランダムであり、通常、人々は彼がそれらを見ていると思い込んでいます。

注:単三電池4本でデイジーチェーン接続された2つの小さなブレッドボードにそれらがあります。 (リチウムイオン電池3.7 200mAhも使用できます。リオン電池では、何らかの理由で動作しないことがあるので、2つの別々のリチウム電池を使用して、同じオンオフスイッチに接続します。したがって、すべてが一度に始まります。)

頭は私が休暇中に手に入れたクリスマスの球体です。一歩下がって、黒いスプレーペイントを軽くスプレーしました。次に、ホットグルーを取り、それをAsiのネックピースに接着し、BOOMの頭があります!

最後に、私がそれをどのように着るか。アーマチュアワイヤーをいくつか取り出して、Asiの下部にある全体に通し、バックパックのショルダーパックに巻き付けました。

コード

  • アシアイ
  • 小物付きアシネック
Asi Eye Arduino
Asieyeのコード
 #include  //常にLedControlライブラリを含める必要があります#include "LedControl.h" / * LetControlオブジェクトを作成し、ピン接続を定義します。目の用に2つのMAX72XXがあります。 * /#define PIN_EYES_DIN 12#define PIN_EYES_CS 11#define PIN_EYES_CLK 10LedControl lc =LedControl(PIN_EYES_DIN、PIN_EYES_CLK、PIN_EYES_CS、2); // rotationbool rotateMatrix0 =false; // 0行列を180度回転しますrotateMatrix1 =false; // 1つのマトリックスを180度回転//瞳孔のない眼球を定義byteeyeBall [8] ={B00111100、B01111110、B11111111、B11111111、B11111111、B11111111、B01111110、B00111100}; byte eyePupil =B11100111; //の現在の状態を格納LEDbyte eyeCurrent [8]; int currentX; int currentY; int cntLoop =0; int cntEffect =0; //最小および最大位置#defineMIN-2#define MAX 2 // delays#define DELAY_BLINK 40 //毎回エフェクトを実行ループの繰り返し回数、無効にする場合は0#define EFFECT_ITERATION 4 / * Arduino setup * / void setup(){// MAX72XXは起動時に省電力モードになっているため、ウェイクアップ呼び出しlc.shutdown(0、false)を実行する必要があります; lc.shutdown(1、false); //明るさを低く設定しますlc.setIntensity(0,1); lc.setIntensity(1,1); //両方のモジュールをクリアしますlc.clearDisplay(0); lc.clearDisplay(1); // LEDテスト//垂直線バイトb =B10000000; for(int c =0; c <=7; c ++){for(int r =0; r <=7; r ++){setRow(0、r、b); setRow(1、r、b); } b =b>> 1; delay(50); } //完全なモジュールb =B11111111; for(int r =0; r <=7; r ++){setRow(0、r、b); setRow(1、r、b); } delay(500); //両方のモジュールをクリアしますlc.clearDisplay(0); lc.clearDisplay(1); delay(500); //ランダムシードrandomSeed(analogRead(0)); //中央の目、クレイジーブリンクdisplayEyes(0、0); delay(2000); flashEyes(true、false); flashEyes(false、true); delay(1000);} / * Arduinoループ* / voidloop(){//ランダムな位置に移動し、ランダムな時間待機moveEyes(random(MIN、MAX + 1)、random(MIN、MAX + 1)、50); delay(random(5、7)* 500); //点滅時間? if(random(0、5)==0){delay(500); flashEyes(); delay(500); } //効果時間? if(EFFECT_ITERATION> 0){cntLoop ++; if(cntLoop ==EFFECT_ITERATION){cntLoop =0; if(cntEffect> 6)cntEffect =0; switch(cntEffect){case 0://クロスアイcrossEyes(); delay(1000);壊す;ケース1://ラウンドスピンroundSpin(2); delay(1000);壊す;ケース2://クレイジースピンcrazySpin(2); delay(1000);壊す;ケース3://覚醒剤目methEyes(); delay(1000);壊す;ケース4://怠惰な目lazyEye(); delay(1000);壊す;ケース5://クレイジーブリンクblinkEyes(true、false); flashEyes(false、true); delay(1000);壊す;ケース6:// glow glowEyes(3); delay(1000);壊す;デフォルト:ブレーク; } cntEffect ++; }}} / *このメソッドは両目を点滅させます* / voidblinkEyes(){blinkEyes(true、true);} / *このメソッドは提供されたパラメーターに従って目を点滅させます* / voidblinkEyes(boolean flashLeft、boolean brightRight){//点滅? if(!blinkLeft &&!blinkRight)return; //まぶたを閉じるfor(int i =0; i <=3; i ++){if(blinkLeft){setRow(0、i、0); setRow(0、7-i、0); } if(blinkRight){setRow(1、i、0); setRow(1、7-i、0); } delay(DELAY_BLINK); } //まぶたを開くfor(int i =3; i> =0; i-){if(blinkLeft){setRow(0、i、eyeCurrent [i]); setRow(0、7-i、eyeCurrent [7-i]); } if(blinkRight){setRow(1、i、eyeCurrent [i]); setRow(1、7-i、eyeCurrent [7-i]); } delay(DELAY_BLINK); }} / *このメソッドは、目を中央の位置に移動してから、エッジをラップして水平に移動します。* / void crazySpin(int times){if(times ==0)return; moveEyes(0、0、50); delay(500);バイト行=eyePupil; for(int t =0; t > 1;行=行| B10000000; setRow(0、3、row); setRow(1、3、row); setRow(0、4、row); setRow(1、4、row); delay(50); if(t ==0)delay((5-i)* 10); // 1番目のスクロールの遅延を増やします(スピードアップ効果)} // Rから中央にスピンします(int i =0; i <5; i ++){row =row>> 1; if(i> =2)row =row | B10000000; setRow(0、3、row); setRow(1、3、row); setRow(0、4、row); setRow(1、4、row); delay(50); if(t ==(times-1))delay((i + 1)* 10); //最後のスクロールの遅延を増やします(スローダウン効果)}}} / *このメソッドは目を交差させます* / voidcrossEyes(){moveEyes(0、0、50); delay(500);バイトpupilR =eyePupil;バイト瞳孔L =eyePupil; //瞳孔を一緒に移動しますfor(int i =0; i <2; i ++){瞳孔R =瞳孔R>> 1;瞳孔R =瞳孔R | B10000000;瞳孔L =瞳孔L <<1;瞳孔L =瞳孔L | B1; setRow(0、3、pupilR); setRow(1、3、pupilL); setRow(0、4、pupilR); setRow(1、4、pupilL); delay(100); } delay(2000); //瞳孔を中心に戻しますfor(int i =0; i <2; i ++){瞳孔R =瞳孔R <<1;瞳孔R =瞳孔R | B1;瞳孔L =瞳孔L>> 1;瞳孔L =瞳孔L | B10000000; setRow(0、3、pupilR); setRow(1、3、pupilL); setRow(0、4、pupilR); setRow(1、4、pupilL); delay(100); }} / *このメソッドは、瞳孔が中心位置からX、Y値だけオフセットされた眼球を表示します。有効なXとYの範囲は[MIN、MAX]です。両方のLEDモジュールは同じ目を表示します* / voiddisplayEyes(int offsetX、int offsetY){//オフセットが有効な範囲内にあることを確認しますoffsetX =getValidValue(offsetX); offsetY =getValidValue(offsetY); //瞳孔行のインデックスを計算します(オフセットYを実行します)int row1 =3-offsetY; int row2 =4-offsetY; //瞳孔行バイトを定義するpupilRow =eyePupil; //オフセットXを実行します//ビットシフトし、新しいビットを1で埋めますif(offsetX> 0){for(int i =1; i <=offsetX; i ++){pupilRow =pupilRow>> 1;瞳孔列=瞳孔列| B10000000; }} else if(offsetX <0){for(int i =-1; i> =offsetX; i-){pupilRow =pupilRow <<1;瞳孔列=瞳孔列| B1; }} //瞳孔の行に1を含めることはできません。eyeBallのバイト数は0です。pupilRow1=pupilRow&eyeBall [row1];バイトpupilRow2 =pupilRow&eyeBall [row2]; // LCDマトリックスに表示し、eyeCurrentに更新for(int r =0; r <8; r ++){if(r ==row1){setRow(0、r、pupilRow1); setRow(1、r、pupilRow1); eyeCurrent [r] =pupilRow1; } else if(r ==row2){setRow(0、r、pupilRow2); setRow(1、r、pupilRow2); eyeCurrent [r] =pupilRow2; } else {setRow(0、r、eyeBall [r]); setRow(1、r、eyeBall [r]); eyeCurrent [r] =eyeBall [r]; }} //現在のXとYを更新currentX =offsetX; currentY =offsetY;} / *このメソッドは、提供された座標値を修正します* / int getValidValue(int value){if(value> MAX)return MAX; else if(value  =1; i-){lc.setIntensity(0、i); lc.setIntensity(1、i); delay(25); } delay(150); }} / *このメソッドは、目を中央に移動し、外側に移動してから中央に戻します* / void methEyes(){moveEyes(0、0、50); delay(500);バイトpupilR =eyePupil;バイト瞳孔L =eyePupil; //瞳孔を移動します(int i =0; i <2; i ++){瞳孔R =瞳孔R <<1;瞳孔R =瞳孔R | B1;瞳孔L =瞳孔L>> 1;瞳孔L =瞳孔L | B10000000; setRow(0、3、pupilR); setRow(1、3、pupilL); setRow(0、4、pupilR); setRow(1、4、pupilL); delay(100); } delay(2000); //瞳孔を中心に戻します(int i =0; i <2; i ++){瞳孔R =瞳孔R>> 1;瞳孔R =瞳孔R | B10000000;瞳孔L =瞳孔L <<1;瞳孔L =瞳孔L | B1; setRow(0、3、pupilR); setRow(1、3、pupilL); setRow(0、4、pupilR); setRow(1、4、pupilL); delay(100); }} / *このメソッドは、両目を現在の位置から新しい位置に移動します* / void moveEyes(int newX、int newY、int stepDelay){//現在の位置を開始位置として設定しますint startX =currentX; int startY =currentY; //無効な新しいXY値を修正しますnewX =getValidValue(newX); newY =getValidValue(newY); // evalステップintstepsX =abs(currentX --newX); int StepsY =abs(currentY --newY); //((stepsX ==0)&&(stepsY ==0))return;の場合、少なくとも1つの位置を変更する必要があります。 //移動方向の評価、ステップ数、X Yステップごとの変更、move int dirX =(newX> =currentX)? 1:-1; int dirY =(newY> =currentY)? 1:-1; int steps =(stepsX> stepsY)? StepsX:stepsY; int intX、intY; float changeX =(float)stepsX /(float)steps; float changeY =(float)stepsY /(float)steps; for(int i =1; i <=Steps; i ++){intX =startX + round(changeX * i * dirX); intY =startY + round(changeY * i * dirY); displayEyes(intX、intY); delay(stepDelay); }} / *このメソッドは右瞳孔のみを上下させます* / voidlazyEye(){moveEyes(0、1、50); delay(500); //左下の瞳孔をゆっくりと(int i =0; i <3; i ++){setRow(1、i + 2、eyeBall [i + 2]); setRow(1、i + 3、eyeBall [i + 3]&eyePupil); setRow(1、i + 4、eyeBall [i + 4]&eyePupil); delay(150); } delay(1000); //左瞳孔をすばやく上げるfor(int i =0; i <3; i ++){setRow(1、4-i、eyeBall [4-i]&eyePupil); setRow(1、5-i、eyeBall [5-i]&eyePupil); setRow(1、6-i、eyeBall [6-i]); delay(25); }} / *このメソッドは瞳孔を時計回りに回転させます* / voidroundSpin(int times){if(times ==0)return; moveEyes(2、0、50); delay(500); for(int i =0; i  
小物付きアシネック Arduino
これは、Asiネックが前後に移動することを確認するために使用するものです
 //サーボパラメータ。装身具のピンは1または4でなければなりません。サーボ位置//は生のタイマー/カウンターティック(1ティック=0.128ミリ秒)で指定されます。//サーボパルスのタイミングは通常1〜2ミリ秒ですが、サーボ間でわずかに異なる場合があるため、これらの制限を次のように調整する必要があります。現実に合わせてください。#defineSERVO_PIN 4 //ピン1または4はTrinketでサポートされています#defineSERVO_MIN 4 // 〜1 ms pulse#define SERVO_MAX 26 // 〜2msパルスAdafruit_TiCoServoサーボ; void setup(void){#if(F_CPU ==16000000L)// 16 MHz Trinketでは、正しいタイミングのためにプリスケールを設定する必要があります。 //これはservo.attach()の前に実行する必要があります! clock_prescale_set(clock_div_1);#endifservo.attach(SERVO_PIN); pinMode(LED_PIN、OUTPUT); digitalWrite(LED_PIN、HIGH);} uint32_t lastLookTime =0; //最後のヘッドターンの時間voidloop(void){unsigned long t =millis(); //現在の時刻//最後のヘッドターンから1/2秒以上経過した場合... if((t --lastLookTime)> 500){if(random(10)==0){// 1- in-10チャンス... // ...ヘッドを新しい方向にランダムに移動する:servo.write(random(SERVO_MIN、SERVO_MAX)); lastLookTime =t; //将来の参照のためにヘッドターン時間を保存します}} //ヘッドターンチェックとは無関係、if(random(10)==0){// 10分の1の確率があります... // .. 。「まばたき」の:digitalWrite(LED_PIN、LOW); // LEDがオフになりますdelay(random(50、250)); //ランダムな瞬間だけdigitalWrite(LED_PIN、HIGH); //その後オンに戻る} delay(100); // loop()を約10回/秒繰り返します} 

カスタムパーツとエンクロージャー

実際のレッグエンドピースはサーボ用のターナーギアを追加するのを忘れていました。私は通常、サーボアタッチメントを印刷して中央に取り付け、それをサーボにねじ込みます。 Asiヘッドを回転させるために使用されるギアサーボのネジと一緒に、サーボピースを使用して、asi GearAsiネックプレート用のサーボのAsitheホルダーの中央に置くことをお勧めします。これは、アクリル球が接着されている場所です。ネック

回路図

AsiNeckに使用した回路 これらは私がAsiを始めたときに使用したものです。それらをデイジーチェーン接続して、小さな回路基板から両方に電力を供給することができます

製造プロセス

  1. Arduino + RaspberryPiロボットプラットフォームの作り方
  2. ラズベリーパイCDボックスロボット
  3. PiCy –小さなラズベリーパイを搭載したロボット!
  4. ローリングアラームロボット
  5. Minecraftクリーパーロボットを作成する
  6. アルキメデス:AIロボットフクロウ
  7. Open CV Robot
  8. ROS Robot
  9. シンプルなパイロボット
  10. 飲料ロボットとは?
  11. ロボットとバッテリー製造:積極的なつながり