Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Asi (Anansi) Roboter-Begleiter

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
SG90 Micro-Servomotor
× 1
MAX7219 rotes LED-Punktmatrix-Anzeigemodul
× 1
4xAA Batteriehalter
ein Lithium-Ionen-Akku mit 3,7 200 mAh funktioniert auch
× 1
Schrauben
× 1
Klare Kunststoff-Acryl-Badebombenformschalen
× 1
Adafruit Trinket - Mini-Mikrocontroller - 5V-Logik
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)
Heißklebepistole (generisch)

Über dieses Projekt

Geschichte

Dieses Projekt sollte ursprünglich ein Xpider von Thingiverse sein. Dann sage ich Archimedes von Alex Glow. Es hat mich umgehauen. Ich wollte so sehr eins. Also begann ich, an einem eigenen Roboter-Begleiter zu arbeiten. Ich dachte, ich bin kein Eulentyp, und ich wollte, dass mein Vertrauter etwas Besonderes ist. Dann erinnerte ich mich an die afrikanische Geschichte von Anansi, der Spinne, dem Trickster und dem Gott der Geschichten. Ich beschloss, den Bot mit der Idee einer Geschichte zu entwickeln, und so war Asi geboren (es ist eigentlich Asi_v4, v1-3 waren Prototypen).

Montage

Das ursprüngliche Design war ein Xpider, aber ich habe eine Menge Dinge bearbeitet, indem ich viele Dinge aus der Tür heraus bearbeitet und wisst ihr gebastelt. Dies sind die meisten Teile, die Sie drucken müssen.

Der Zusammenbau ist ziemlich selbsterklärend, aber hier sind trotzdem ein paar Bilder.

Für die Elektronik können Sie diese meist oben oder unten am Kopf anbringen (Ihre Wahl), aber das Servo muss so angebracht werden. Stellen Sie bitte sicher, dass die Ausrüstung darauf ist.

Asi wird von zwei Mikrocontrollern gesteuert, einem Trinket und einem Arduino Nano. Das Trinket steuert die Bewegung des Auges, dank des Servos dreht es sich in zufälligen Abständen hin und her. Der Arduino Nano kontrolliert das Auge. Es ist auch zufällig, wie er sich umsieht, und normalerweise nehmen die Leute an, dass er sie ansieht.

Beachten Sie, dass ich sie auf zwei kleinen Steckbrettern habe, die mit 4x AA-Batterien verkettet sind. (Sie können auch einen Lithium-Ionen-Akku 3,7 200mAh verwenden. Mit dem Li-On-Akku hatte ich aus irgendeinem Grund Zeiten, in denen es nicht funktionierte, also würde ich zwei separate Lithium-Akkus verwenden und sie an den gleichen Ein-Aus-Schalter anschließen also beginnt alles auf einmal.)

Der Kopf ist nur eine Weihnachtskugel, die ich in den Ferien bekommen habe. Ich trat einen Schritt zurück und besprühte es leicht mit schwarzer Sprühfarbe. Dann nimm etwas Heißkleber und klebe ihn auf das Halsstück von Asi und BOOM da ist der Kopf!

Zu guter Letzt, wie ich es trage. Ich nahm einfach etwas Ankerdraht und spannte ihn durch die Löcher im unteren Teil von Asi und wickelte sie auf meine Schultertasche meines Rucksacks.

Code

  • Asi-Auge
  • Asi Hals mit Schmuckstück
Asi Eye Arduino
der Code für Asi eye
#include  //Wir müssen immer die LedControl-Bibliothek einbinden#include "LedControl.h"/* LetControl-Objekt erstellen, Pin-Verbindungen definieren Wir haben 2 MAX72XX für Augen. */#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-Matrix um 180 degbool drehen rotationMatrix1 =false; // 1 Matrix um 180 Grad drehen // Augapfel ohne Pupille definieren byte eyeBall[8]={ B00111100, B01111110, B11111111, B11111111, B11111111, B11111111, B01111110, B00111100};byte eyePupil =B11100111;// speichert den aktuellen Zustand von LEDsbyte eyeCurrent[8];int currentX;int currentY;int cntLoop =0;int cntEffect =0;// Min- und Max-Positionen#define MIN -2#define MAX 2// Delays#define DELAY_BLINK 40// jeden Effekt ausführen # der Schleifeniterationen, 0 zum Deaktivieren #define EFFECT_ITERATION 4/* Arduino-Setup*/void setup () { // MAX72XX ist beim Start im Energiesparmodus, wir müssen einen Weckruf ausführen lc.shutdown(0,false); lc.shutdown(1,false); // setze die Helligkeit auf niedrig lc.setIntensity(0,1); lc.setIntensity(1,1); // beide Module löschen lc.clearDisplay(0); lc.clearDisplay(1); // LED-Test // vertikale Linie Byte b =B10000000; für (int c=0; c<=7; c++) { für (int r=0; r<=7; r++) { setRow(0, r, b); setRow(1, r, b); } b =b>> 1; Verzögerung (50); } // volles Modul b =B11111111; für (int r=0; r<=7; r++) { setRow(0, r, b); setRow(1, r, b); } Verzögerung (500); // beide Module löschen lc.clearDisplay(0); lc.clearDisplay(1); Verzögerung (500); // zufälliger Seed randomSeed (analogRead (0)); // Augen zentrieren, verrücktes Blinken displayEyes (0, 0); Verzögerung (2000); blinkEyes (wahr, falsch); blinkEyes(falsch, wahr); delay (1000);}/* Arduino loop*/void loop () {// an zufällige Position bewegen, zufällige Zeit warten moveEyes (random (MIN, MAX + 1), random (MIN, MAX + 1), 50); Verzögerung (zufällig (5, 7) * 500); // Blinkzeit? if (zufällig (0, 5) ==0) { Verzögerung (500); blinkEyes(); Verzögerung (500); } // Effektzeit? if (EFFECT_ITERATION> 0) { cntLoop++; if (cntLoop ==EFFECT_ITERATION) { cntLoop =0; if (cntEffect> 6) cntEffect =0; switch(cntEffect) { case 0:// Augen kreuzen crossEyes(); Verzögerung (1000); brechen; Fall 1:// Rundspin roundSpin(2); Verzögerung (1000); brechen; Fall 2:// verrückter Spin crazySpin(2); Verzögerung (1000); brechen; Fall 3:// Meth-Augen methEyes(); Verzögerung (1000); brechen; Fall 4:// faules Auge lazyEye(); Verzögerung (1000); brechen; Fall 5:// verrückt blinken blinkEyes (wahr, falsch); blinkEyes(falsch, wahr); Verzögerung (1000); brechen; Fall 6:// Glühen glowEyes(3); Verzögerung (1000); brechen; Vorgabe:Pause; } cntEffect++; } }}/* Diese Methode blinkt mit beiden Augen*/void blinkEyes(){ blinkEyes(true, true);}/* Diese Methode blinkt die Augen gemäß den angegebenen Parametern*/void blinkEyes(boolean blinkLeft, boolean blinkRight){ // blink ? if (!blinkLeft &&!blinkRight) return; // Augenlider schließen für (int i=0; i<=3; i++) { if (blinkLeft) { setRow (0, i, 0); setRow(0, 7-i, 0); aufrechtzuerhalten. Wenn (blinkRight) { setRow (1, i, 0); setRow(1, 7-i, 0); } Verzögerung (DELAY_BLINK); } // Augenlider öffnen für (int i=3; i>=0; i--) { if (blinkLeft) { setRow (0, i, eyeCurrent[i]); setRow(0, 7-i, eyeCurrent[7-i]); aufrechtzuerhalten. Wenn (blinkRight) { setRow (1, i, eyeCurrent [i]); setRow(1, 7-i, eyeCurrent[7-i]); } Verzögerung (DELAY_BLINK); }}/* Diese Methode bewegt die Augen in die Mittelposition und bewegt sich dann horizontal mit Umbruch um die Kanten.*/void crazySpin(int times){ if (times ==0) return; moveEyes(0, 0, 50); Verzögerung (500); Bytezeile =eyePupil; for (int t=0; t> 1; Reihe =Reihe | B10000000; setRow(0, 3, Reihe); setRow(1, 3, Reihe); setRow(0, 4, Reihe); setRow(1, 4, Reihe); Verzögerung (50); if (t ==0) Verzögerung((5-i)*10); // Verzögerung beim ersten Scrollen erhöhen (Beschleunigungseffekt)} // von R zur Mitte drehen für (int i=0; i<5; i++) { row =row>> 1; if (i>=2) Reihe =Reihe | B10000000; setRow(0, 3, Reihe); setRow(1, 3, Reihe); setRow(0, 4, Reihe); setRow(1, 4, Reihe); Verzögerung (50); if (t ==(mal – 1)) Verzögerung ((i+1)*10); // Verzögerung beim letzten Scrollen erhöhen (Verlangsamungseffekt)}}}}/* Diese Methode kreuzt die Augen*/void crossEyes () { moveEyes (0, 0, 50); Verzögerung (500); Byte PupilleR =AugePupille; Byte PupilleL =AugePupille; // Pupillen zusammenschieben für (int i=0; i<2; i++) { PupilleR =PupilleR>> 1; SchülerR =SchülerR | B10000000; PupilleL =PupilleL <<1; SchülerL =SchülerL | B1; setRow(0, 3, PupilleR); setRow(1, 3, PupilleL); setRow(0, 4, PupilleR); setRow(1, 4, PupilleL); Verzögerung (100); } Verzögerung (2000); // Pupillen zurück in die Mitte bewegen für (int i=0; i<2; i++) { PupilleR =PupilleR <<1; SchülerR =SchülerR | B1; PupilleL =PupilleL>> 1; SchülerL =SchülerL | B10000000; setRow(0, 3, PupilleR); setRow(1, 3, PupilleL); setRow(0, 4, PupilleR); setRow(1, 4, PupilleL); Verzögerung (100); }}/* Diese Methode zeigt den Augapfel mit Pupillenversatz um X-, Y-Werte von der Mittelposition an. Gültiger X- und Y-Bereich ist [MIN,MAX] Beide LED-Module zeigen identische Augen*/void displayEyes(int offsetX, int offsetY) {// sicherstellen, dass die Offsets in gültigen Bereichen liegen offsetX =getValidValue(offsetX); offsetY =getValidValue(offsetY); // Indizes für Pupillenreihen berechnen (offset Y ausführen) int row1 =3 - offsetY; int row2 =4 - offsetY; // Pupillenzeilenbyte definieren Pupillenzeile =eyePupil; // Offset X ausführen // Bitverschiebung und neues Bit mit 1 auffüllen if (offsetX> 0) { for (int i=1; i<=offsetX; i++) { PupilleRow =PupilleRow>> 1; SchülerReihe =SchülerReihe | B10000000; aufrechtzuerhalten. SchülerReihe =SchülerReihe | B1; aufrechtzuerhalten. Byte Pupillenzeile2 =Pupillenzeile &eyeBall[Zeile2]; // Anzeige auf LCD-Matrix, Update auf eyeCurrent for(int r=0; r<8; r++) { if (r ==row1) { setRow (0, r, pupilRow1); setRow(1, r, SchülerRow1); eyeCurrent[r] =PupilleRow1; aufrechtzuerhalten. Sonst if (r ==row2) { setRow (0, r, PupilleRow2); setRow(1, r, SchülerRow2); eyeCurrent[r] =PupilleRow2; aufrechtzuerhalten. Sonst { setRow (0, r, eyeBall [r]); setRow(1, r, eyeBall[r]); eyeCurrent[r] =eyeBall[r]; } } // aktuelles X und Y aktualisieren currentX =offsetX; currentY =offsetY;}/* Diese Methode korrigiert den angegebenen Koordinatenwert*/int getValidValue(int value){ if (value> MAX) return MAX; sonst if (Wert =1; i--) {lc.setIntensity (0, i); lc.setIntensity(1,i); Verzögerung (25); } Verzögerung (150); }}/* Diese Methode bewegt die Augen in die Mitte, nach außen und dann zurück in die Mitte*/void methEyes(){ moveEyes(0, 0, 50); Verzögerung (500); Byte PupilleR =AugePupille; Byte PupilleL =AugePupille; // Pupillen herausbewegen für (int i=0; i<2; i++) { PupilleR =PupilleR <<1; SchülerR =SchülerR | B1; PupilleL =PupilleL>> 1; SchülerL =SchülerL | B10000000; setRow(0, 3, PupilleR); setRow(1, 3, PupilleL); setRow(0, 4, PupilleR); setRow(1, 4, PupilleL); Verzögerung (100); } Verzögerung (2000); // Pupillen zurück in die Mitte bewegen für (int i=0; i<2; i++) { PupilleR =PupilleR>> 1; SchülerR =SchülerR | B10000000; PupilleL =PupilleL <<1; SchülerL =SchülerL | B1; setRow(0, 3, PupilleR); setRow(1, 3, PupilleL); setRow(0, 4, PupilleR); setRow(1, 4, PupilleL); Verzögerung (100); }}/* Diese Methode bewegt beide Augen von der aktuellen Position zur neuen Position*/void moveEyes(int newX, int newY, int stepDelay){ // aktuelle Position als Startposition setzen int startX =currentX; int startY =currentY; // Ungültige neue XY-Werte korrigieren newX =getValidValue(newX); newY =getValidValue(newY); // Schritte auswerten int stepsX =abs(currentX - newX); int stepsY =abs(currentY - newY); // muss mindestens eine Position ändern if ((stepsX ==0) &&(stepsY ==0)) return; // Bewegungsrichtung auswerten, # der Schritte, Änderung pro X Y-Schritt, Bewegung ausführen int dirX =(newX>=currentX) ? 1:-1; int dirY =(newY>=currentY) ? 1:-1; int Schritte =(SchritteX> SchritteY) ? SchritteX :SchritteY; 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); Verzögerung (SchrittVerzögerung); }}/* Diese Methode senkt und hebt nur die rechte Pupille*/void lazyEye(){ moveEyes(0, 1, 50); Verzögerung (500); // linke Pupille langsam senken für (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); Verzögerung (150); } Verzögerung (1000); // linke Pupille schnell anheben für (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]); Verzögerung (25); } }/* Diese Methode dreht die Pupillen im Uhrzeigersinn*/void roundSpin(int times){ if (times ==0) return; moveEyes(2, 0, 50); Verzögerung (500); for (int i=0; i 
Asi Hals mit Schmuck Arduino
Dies ist, was ich verwende, um sicherzustellen, dass sich der Asi-Hals hin und her bewegt
 // Servoparameter. Pin MUSS 1 oder 4 auf einem Schmuckstück sein. Die Servoposition // wird in rohen Timer-/Counter-Ticks angegeben (1 Tick =0,128 Millisekunden). // Das Timing der Servoimpulse beträgt normalerweise 1-2 ms, kann jedoch zwischen den // Servos leicht variieren, daher müssen Sie diese Grenzen möglicherweise anpassen entspricht Ihrer Realität.#define SERVO_PIN 4 // Pins 1 oder 4 werden auf Trinket unterstützt#define SERVO_MIN 4 // ~1 ms Impuls#define SERVO_MAX 26 // ~2 ms Impuls Adafruit_TiCoServo Servo; void setup (void) {#if (F_CPU ==16000000L) // 16 MHz Trinket erfordert die Einstellung der Vorskalierung für das korrekte Timing. // Dies MUSS VOR servo.attach () erfolgen! clock_prescale_set(clock_div_1);#endif servo.attach(SERVO_PIN); pinMode (LED_PIN, AUSGANG); digitalWrite(LED_PIN, HIGH);} uint32_t lastLookTime =0; // Zeitpunkt der letzten Kopfdrehung void loop (void) { unsigned long t =millis (); // Aktuelle Zeit // Wenn mehr als 1/2 Sekunde seit der letzten Kopfdrehung vergangen ist... if((t - lastLookTime)> 500) { if(random(10) ==0) { // Es gibt eine 1- in-10 Chance... // ...den Kopf zufällig in eine neue Richtung zu bewegen:servo.write(random(SERVO_MIN, SERVO_MAX)); lastLookTime =t; // Speichere die Wendezeit für zukünftige Referenzen } } // Unabhängig von der Wendeprüfung, if(random(10) ==0) { // es besteht eine 1-in-10-Chance... // .. .von einem "Augenblinzeln":digitalWrite(LED_PIN, LOW); // Die LED schaltet sich aus Verzögerung (zufällig (50, 250)); // für nur einen kurzen zufälligen Moment digitalWrite (LED_PIN, HIGH); // dann wieder EIN} delay (100); // Wiederhole loop() ungefähr 10 Mal/Sekunde}

Kundenspezifische Teile und Gehäuse

das eigentliche Bein-Endstückvergessen, das Wendegetriebe für das Servo hinzuzufügen, ich habe normalerweise ausgedruckt und die Servo-Befestigung in die Mitte geschraubt, dann schrauben Sie es auf das Servo das geht mit der Schraubedas Getriebeservo, mit dem sich der Asi-Kopf dreht, würde empfehlen, ein Servostück zu verwenden und es in die Mitte zu legen Hals

Schaltpläne

die Schaltung, die ich für Asi Neck verwendet habe diese sind die, die ich verwendet habe, um Asi zu starten. Sie können sie in Reihe schalten, um beide von kleinen Leiterplatten mit Strom zu versorgen

Herstellungsprozess

  1. So erstellen Sie eine Arduino+Raspberry Pi-Roboterplattform
  2. Raspberry Pi CD-Box-Roboter
  3. PiCy – Der kleine Roboter mit Raspberry Pi-Antrieb!
  4. Rollender Alarmroboter
  5. Baue einen Minecraft-Creeper-Roboter
  6. Archimedes:Die KI-Roboter-Eule
  7. Offener CV-Roboter
  8. ROS-Roboter
  9. Einfacher Pi-Roboter
  10. Was ist ein Getränkeroboter?