Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Asi (Anansi) Robot Companion

Componenten en benodigdheden

Arduino Nano R3
× 1
SG90 Micro-servomotor
× 1
MAX7219 Rode LED Dot Matrix Display Module
× 1
4xAA-batterijhouder
een lithium-ionbatterij van 3,7 200 mAh werkt ook
× 1
schroeven
× 1
Doorzichtige kunststof acryl badbomvorm schelpen
× 1
Adafruit Trinket - Mini Microcontroller - 5V Logica
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Hot lijmpistool (algemeen)

Over dit project

Verhaal

Dit project zou oorspronkelijk een Xpider zijn, van Thingiverse. Dan zeg ik Archimedes van Alex Glow. Het verbaasde me. Ik wilde er zo graag een. Dus ik moest aan mijn eigen robotcompagnon werken. Ik dacht dat ik geen uilentype was, en ik wilde dat mijn bekende speciaal was. Toen herinnerde ik me het Afrikaanse verhaal van Anansi de spin, bedrieger en god van de verhalen. Ik besloot de bot te ontwerpen met het idee van een verhaal, en zo werd Asi geboren (het is eigenlijk Asi_v4, v1-3 waren prototypes).

Montage

Het originele ontwerp was een Xpider, maar ik nam het een tandje bij het bewerken van een heleboel dingen door een groot deel van de deur uit en je weet wel sleutelen. Dit zijn de meeste onderdelen die u moet afdrukken.

De montage spreekt voor zich, maar hier zijn toch enkele foto's.

Voor de elektronica kun je ze meestal in de boven- of onderkant van de kop plaatsen (jouw oproep), maar de servo moet als zodanig worden bevestigd. Zorg ervoor dat de uitrusting erop zit.

Asi wordt bestuurd door twee microcontrollers, een Trinket en een Arduino Nano. De Trinket regelt de beweging van het oog, dankzij de servo draait het met willekeurige tussenpozen heen en weer. De Arduino Nano bestuurt het oog. Het is ook willekeurig als hij om zich heen kijkt en dergelijke, meestal gaan mensen ervan uit dat hij naar hen kijkt.

Let op, ik heb ze op twee kleine breadboards die in serie zijn geschakeld met 4x AA-batterijen. (Je kunt ook een lithium-ionbatterij van 3.7 200mAh gebruiken. Met de li-on-batterij heb ik om de een of andere reden tijden gehad dat het niet zou werken, dus ik zou twee afzonderlijke lithiumbatterijen gebruiken en ze aan dezelfde aan-uitschakelaar bevestigen dus alles begint tegelijk.)

Het hoofd is gewoon een kerstbol die ik tijdens de vakantie heb gekregen. Ik deed een stap achteruit en bespoten het licht met zwarte spuitverf. Neem dan wat hete lijm en lijm deze op het nekstuk van Asi en BOOM daar is het hoofd!

Als laatste, hoe ik het draag. Ik nam gewoon wat ankerdraad en spande het door de gaten aan de onderkant van Asi, en wikkelde ze op mijn schoudertas van mijn rugzak.

Code

  • Asi-oog
  • Asi nek met snuisterij
Asi Eye Arduino
de code voor Asi eye
#include //We moeten altijd de LedControl-bibliotheek opnemen#include "LedControl.h"/* Maak LetControl-object, definieer pin-verbindingen We hebben 2 MAX72XX voor ogen. */#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);// rotatiebool rotaryMatrix0 =false; // roteer 0 matrix met 180 degbool roteerMatrix1 =false; // draai 1 matrix 180 graden// definieer oogbal zonder pupil byte eyeBall [8]={ B00111100, B01111110, B111111, B11111111, B1111111, B1111111, B01111110, B00111100};byte eyePupil =B11100111;// slaat huidige status op van LEDsbyte eyeCurrent[8];int currentX;int currentY;int cntLoop =0;int cntEffect =0;// min en max posities#define MIN -2#define MAX 2// delays#define DELAY_BLINK 40// voer elke # lus-iteraties, 0 om uit te schakelen#define EFFECT_ITERATION 4/* Arduino setup*/void setup() { // MAX72XX staat in de energiebesparende modus bij het opstarten, we moeten een wake-up call doen lc.shutdown(0,false); lc.shutdown(1,false); // stel de helderheid in op laag lc.setIntensity(0,1); lc.setIntensity(1,1); // wis beide modules lc.clearDisplay(0); lc.clearDisplay(1); // LED-test // verticale lijnbyte b =B10000000; for (int c=0; c<=7; c++) { for (int r=0; r<=7; r++) { setRow(0, r, b); setRij(1, r, b); } b =b>> 1; vertraging (50); } // volledige module b =B11111111; for (int r=0; r<=7; r++) { setRow(0, r, b); setRij(1, r, b); } vertraging (500); // wis beide modules lc.clearDisplay(0); lc.clearDisplay(1); vertraging (500); // willekeurig zaad randomSeed (analogRead (0)); // middelste ogen, gekke knipperweergaveEyes(0, 0); vertraging (2000); blinkEyes (waar, onwaar); blinkEyes (false, true); delay(1000);}/* Arduino loop*/void loop() {// verplaats naar willekeurige positie, wacht willekeurige tijd moveEyes (willekeurig (MIN, MAX + 1), willekeurig (MIN, MAX + 1), 50); vertraging (willekeurig (5, 7) * 500); // knippertijd? if (willekeurig (0, 5) ==0) { vertraging (500); blinkEyes(); vertraging (500); } // effecttijd? if (EFFECT_ITERATION> 0) { cntLoop++; if (cntLoop ==EFFECT_ITERATION) { cntLoop =0; als (cntEffect> 6) cntEffect =0; switch(cntEffect) { case 0:// cross eyes crossEyes(); vertraging (1000); pauze; geval 1:// ronde spin roundSpin(2); vertraging (1000); pauze; geval 2:// crazy spin crazySpin(2); vertraging (1000); pauze; geval 3:// meth-ogen methEyes(); vertraging (1000); pauze; geval 4:// lui oog lazyEye(); vertraging (1000); pauze; geval 5:// gek knipperen blinkEyes (waar, onwaar); blinkEyes (false, true); vertraging (1000); pauze; geval 6:// glow glowEyes (3); vertraging (1000); pauze; standaard:pauze; } cntEffect++; } }}/* Deze methode knippert met beide ogen*/void blinkEyes(){ blinkEyes(true, true);}/* Deze methode knippert met de ogen volgens de opgegeven parameters*/void blinkEyes(boolean blinkLeft, boolean blinkRight){ // blink ? if (!blinkLeft &&!blinkRight) return; // sluit de oogleden voor (int i=0; i<=3; i++) {if (blinkLeft) { setRow(0, i, 0); setRij(0, 7-i, 0); } if (blinkRight) { setRow(1, i, 0); setRij (1, 7-i, 0); } vertraging (DELAY_BLINK); } // open oogleden voor (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]); } vertraging (DELAY_BLINK); }}/* Met deze methode worden de ogen naar de middenpositie verplaatst en vervolgens horizontaal verplaatst met wikkeling rond de randen.*/void crazySpin(int times){ if (times ==0) return; moveEyes(0, 0, 50); vertraging (500); byterij =eyePupil; for (int t=0; t> 1; rij =rij | B10000000; setRow(0, 3, rij); setRow(1, 3, rij); setRow(0, 4, rij); setRow (1, 4, rij); vertraging (50); if (t ==0) vertraging((5-i)*10); // verhoog de vertraging bij het eerste scrollen (versnelt effect)} // draai van R naar het midden voor (int i=0; i<5; i++) { rij =rij>> 1; if (i>=2) rij =rij | B10000000; setRow(0, 3, rij); setRow(1, 3, rij); setRow(0, 4, rij); setRow (1, 4, rij); vertraging (50); if (t ==(times-1)) vertraging((i+1)*10); // verhoog de vertraging bij het laatste scrollen (vertragingseffect) } }}/* Deze methode kruist de ogen*/void crossEyes(){ moveEyes(0, 0, 50); vertraging (500); byte pupilR =eyePupil; byte pupilL =eyePupil; // verplaats leerlingen samen voor (int i=0; i<2; i++) { pupilR =pupilR>> 1; pupilR =pupilR | B10000000; pupilL =pupilL <<1; pupilL =pupilL | B1; setRow (0, 3, pupilR); setRow(1, 3, pupilL); setRow (0, 4, pupilR); setRow(1, 4, pupilL); vertraging (100); } vertraging (2000); // verplaats leerlingen terug naar het midden voor (int i=0; i<2; i++) { pupilR =pupilR <<1; pupilR =pupilR | B1; pupilL =pupilL>> 1; pupilL =pupilL | B10000000; setRow (0, 3, pupilR); setRow(1, 3, pupilL); setRow (0, 4, pupilR); setRow(1, 4, pupilL); vertraging (100); }}/* Bij deze methode wordt de oogbol weergegeven met de pupil verschoven met X, Y-waarden vanaf de middenpositie. Geldig X- en Y-bereik is [MIN, MAX] Beide LED-modules zullen identieke ogen tonen * / void displayEyes (int offsetX, int offsetY) { // zorg ervoor dat offsets in geldige bereiken zijn offsetX =getValidValue (offsetX); offsetY =getValidValue(offsetY); // bereken indexen voor pupilrijen (voer offset Y uit) int row1 =3 - offsetY; int rij2 =4 - offsetY; // definieer pupilrijbyte pupilRow =eyePupil; // voer offset X uit // bit shift en vul nieuwe bit in met 1 if (offsetX> 0) { for (int i=1; i<=offsetX; i++) { pupilRow =pupilRow>> 1; pupilRij =pupilRij | B10000000; } } else if (offsetX <0) { for (int i=-1; i>=offsetX; i--) { pupilRow =pupilRij <<1; pupilRij =pupilRij | B1; } } // pupilrij mag geen 1s hebben waar eyeBall 0s byte heeft pupilRow1 =pupilRow &eyeBall[rij1]; byte pupilRow2 =pupilRij &eyeBall[rij2]; // weergave op LCD-matrix, update naar eyeCurrent for(int r=0; r<8; r++) {if (r ==row1) { setRow(0, r, pupilRow1); setRow(1, r, pupilRij1); eyeCurrent[r] =pupilRij1; } else if (r ==row2) { setRow(0, r, pupilRow2); setRow(1, r, pupilRij2); eyeCurrent[r] =pupilRij2; } else { setRow(0, r, eyeBall[r]); setRow(1, r, eyeBall[r]); eyeCurrent[r] =eyeBall[r]; } } // update huidige X en Y currentX =offsetX; currentY =offsetY;}/* Deze methode corrigeert de opgegeven coördinaatwaarde*/int getValidValue(int value){ if (value> MAX) return MAX; anders als (waarde =1; i--) { lc.setIntensity(0,i); lc.setIntensity(1,i); vertraging(25); } vertraging(150); }}/* Deze methode verplaatst de ogen naar het midden, naar buiten en dan terug naar het midden*/void methEyes(){ moveEyes(0, 0, 50); vertraging (500); byte pupilR =eyePupil; byte pupilL =eyePupil; // verplaats leerlingen voor (int i=0; i<2; i++) { pupilR =pupilR <<1; pupilR =pupilR | B1; pupilL =pupilL>> 1; pupilL =pupilL | B10000000; setRow (0, 3, pupilR); setRow(1, 3, pupilL); setRow (0, 4, pupilR); setRow(1, 4, pupilL); vertraging (100); } vertraging (2000); // verplaats leerlingen terug naar het midden voor (int i=0; i<2; i++) { pupilR =pupilR>> 1; pupilR =pupilR | B10000000; pupilL =pupilL <<1; pupilL =pupilL | B1; setRow (0, 3, pupilR); setRow(1, 3, pupilL); setRow (0, 4, pupilR); setRow(1, 4, pupilL); vertraging (100); }}/* Deze methode verplaatst beide ogen van de huidige positie naar de nieuwe positie*/void moveEyes(int newX, int newY, int stepDelay){ // stel de huidige positie in als startpositie int startX =currentX; int startY =huidigeY; // repareer ongeldige nieuwe X Y-waarden newX =getValidValue (newX); newY =getValidValue(newY); // eval stappen int stepsX =abs (currentX - newX); int stappenY =abs(huidigeY - nieuweY); // moet ten minste één positie wijzigen if ((stepsX ==0) &&(stepsY ==0)) return; // evalueer de bewegingsrichting, # stappen, verander per X Y stap, voer move int dirX =(newX>=currentX) uit? 1 :-1; int dirY =(newY>=huidigY) ? 1 :-1; int stappen =(stappenX> stappenY) ? stappenX :stappenY; 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 + ronde (changeY * i * dirY); displayEyes(intX, intY); vertraging (stapvertraging); }}/* Deze methode verlaagt en verhoogt alleen de rechter pupil*/void lazyEye(){ moveEyes(0, 1, 50); vertraging (500); // linker pupil langzaam voor (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); vertraging (150); } vertraging (1000); // verhoog de linker pupil snel voor (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]); vertraging(25); } }/* Deze methode draait de leerlingen met de klok mee*/void roundSpin(int times){ if (times ==0) return; moveEyes(2, 0, 50); vertraging (500); for (int i=0; i 
Asi Hals met snuisterij Arduino
dit is wat ik gebruik om ervoor te zorgen dat de Asi-nek heen en weer beweegt
 // Servoparameters. Pin MOET 1 of 4 zijn op een snuisterij. Servopositie// wordt gespecificeerd in onbewerkte timer-/tellertikken (1 vinkje =0,128 milliseconden).// De servopulstiming is doorgaans 1-2 ms, maar kan enigszins variëren tussen// servo's, dus het kan zijn dat u deze limieten moet aanpassen om match uw realiteit.#define SERVO_PIN 4 // Pins 1 of 4 worden ondersteund op Trinket#define SERVO_MIN 4 // ~1 ms pulse#define SERVO_MAX 26 // ~2 ms pulse Adafruit_TiCoServo servo; void setup (void) {#if (F_CPU ==16000000L) // 16 MHz Trinket vereist instelling van de voorschaal voor de juiste timing. // Dit MOET gedaan worden VOORDAT servo.attach()! clock_prescale_set(clock_div_1);#endif servo.attach(SERVO_PIN); pinMode (LED_PIN, UITGANG); digitalWrite (LED_PIN, HOOG);} uint32_t lastLookTime =0; // Tijdstip van de laatste keer dat het hoofd draait, void loop (void) { unsigned long t =millis (); // Huidige tijd // Als er meer dan 1/2 seconde is verstreken sinds de laatste keer dat je hoofd draait... if((t - lastLookTime)> 500) { if(random (10) ==0) { // Er is een 1- in-10 kans... // ...om het hoofd willekeurig in een nieuwe richting te bewegen:servo.write(random(SERVO_MIN, SERVO_MAX)); lastLookTime =t; // Bewaar de head-turn-tijd voor toekomstig gebruik } } // Niet gerelateerd aan head-turn check, if(random(10) ==0) { // er is een kans van 1 op 10... // .. .van een "oog knipperen":digitalWrite(LED_PIN, LOW); // De LED schakelt vertraging uit (willekeurig (50, 250)); // voor slechts een kort willekeurig moment digitalWrite (LED_PIN, HIGH); // dan weer AAN} vertraging (100); // Herhaal loop() ongeveer 10 keer/seconde}

Aangepaste onderdelen en behuizingen

het eigenlijke stuk van het beenuiteinde vergat het draaiwiel voor de servo toe te voegen, ik heb het meestal uitgeprint en de servo-bevestiging in het midden gepast en vervolgens op de servo het lichaam van Asithe onderkant van Asithe dijstuk aan Asileg-gewricht de schroef die ik gebruik om Asi-poten aan te sluitenDe moer die hoort bij de schroef, de versnellingsservo die wordt gebruikt om Asi hoofd te laten draaien, zou aanraden om een ​​servostuk te gebruiken en het in het midden van de asi te plaatsen. De houder van de servo voor asi GearAsi nekplaat, dit is waar de acrylbol is gelijmd nek

Schema's

het circuit dat ik gebruikte voor Asi Neck dit zijn degenen die ik gebruikte om Asi op weg te helpen. je kunt ze doorlussen om ze allebei van stroom te voorzien vanaf kleine printplaten

Productieproces

  1. Hoe maak je een Arduino+Raspberry Pi-robotplatform
  2. Raspberry Pi CD Box Robot
  3. PiCy – De kleine Raspberry Pi-aangedreven robot!
  4. Rollende alarmrobot
  5. Maak een Minecraft Creeper Robot
  6. Archimedes:The AI ​​Robot Owl
  7. Open CV Robot
  8. ROS Robot
  9. Simple Pi Robot
  10. Wat is een drankrobot?
  11. Robots en batterijproductie:een positieve verbinding