Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Pendamping Robot Asi (Anansi)

Komponen dan persediaan

Arduino Nano R3
× 1
Motor servo mikro SG90
× 1
MAX7219 Modul Tampilan Dot Matrix LED Merah
× 1
tempat baterai 4xAA
baterai lithium ion 3,7 200mah juga berfungsi
× 1
sekrup
× 1
Kerang Cetakan Bom Mandi Akrilik Plastik Bening
× 1
Adafruit Trinket - Mikrokontroler Mini - Logika 5V
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)
Pistol lem panas (generik)

Tentang proyek ini

Cerita

Proyek ini awalnya akan menjadi Xpider, dari Thingiverse. Lalu saya katakan Archimedes oleh Alex Glow. Itu meniup pikiran saya. Aku sangat menginginkannya. Jadi, saya harus bekerja pada pendamping robot sendiri. Saya pikir saya bukan tipe burung hantu, dan saya ingin familiar saya menjadi spesial. Kemudian saya teringat cerita Afrika tentang Anansi si laba-laba, penipu dan dewa cerita. Saya memutuskan untuk mendesain bot dengan ide sebuah cerita, dan dengan demikian Asi lahir (sebenarnya Asi_v4, v1-3 adalah prototipe).

Perakitan

Desain aslinya adalah Xpider, tapi saya mengambilnya dengan mengedit banyak hal melalui banyak hal di luar pintu dan Anda tahu bermain-main. Ini adalah sebagian besar bagian yang harus Anda cetak.

Perakitan cukup jelas tetapi di sini ada beberapa foto.

Untuk elektronik, Anda biasanya dapat meletakkannya di bagian atas atau bawah kepala (panggilan Anda), tetapi servo harus dipasang sedemikian rupa. Pastikan perlengkapannya ada di sana.

Asi dikendalikan oleh dua mikrokontroler, Trinket dan Arduino Nano. Trinket mengontrol pergerakan mata, berkat servo, mata berputar bolak-balik secara acak. Arduino Nano mengontrol mata. Itu juga acak saat dia melihat sekeliling dan semacamnya, biasanya orang menganggap dia sedang melihat mereka.

Catatan, saya memilikinya di dua papan tempat memotong roti kecil yang dirantai daisy dengan baterai AA 4x. (Anda juga dapat menggunakan baterai lithium-ion 3,7 200mAh. Dengan baterai li-on, saya memiliki waktu untuk beberapa alasan di mana baterai tidak berfungsi, jadi saya akan menggunakan dua baterai lithium terpisah dan memasangnya ke sakelar hidup mati yang sama jadi semuanya dimulai sekaligus.)

Kepala hanyalah bola Natal yang saya dapatkan selama liburan. Saya mundur selangkah dan menyemprotnya ringan dengan cat semprot hitam. Kemudian ambil sedikit lem panas dan rekatkan ke bagian leher Asi dan BOOM ada kepalanya!

Terakhir, bagaimana saya memakainya. Saya hanya mengambil beberapa kawat angker dan mengikatnya melalui keseluruhan di bagian bawah Asi, dan membungkusnya di tas bahu ransel saya.

Kode

  • Asi Mata
  • Asi Leher dengan perhiasan kecil
Asi Eye Arduino
kode untuk Asi eye
#include //Kita selalu harus menyertakan library LedControl#include "LedControl.h"/* Buat objek LetControl, tentukan koneksi pin Kami memiliki 2 MAX72XX untuk mata. */#menentukan PIN_EYES_DIN 12#menentukan PIN_EYES_CS 11#menentukan PIN_EYES_CLK 10LedControl lc =LedControl(PIN_EYES_DIN, PIN_EYES_CLK, PIN_EYES_CS, 2);// rotationbool rotateMatrix0 =false; // putar 0 matriks sebesar 180 degbool rotateMatrix1 =false; // memutar 1 matriks sebesar 180 derajat// mendefinisikan bola mata tanpa pupil byte eyeBall[8]={ B00111100, B01111110, B111111111, B111111111, B11111111, B111111111, B01111110, B00111100};byte eyePupil =B11100111;// menyimpan status saat ini dari LEDsbyte eyeCurrent[8];int currentX;int currentY;int cntLoop =0;int cntEffect =0;// min dan posisi maks#define MIN -2#define MAX 2// delays#define DELAY_BLINK 40// melakukan efek setiap # dari iterasi loop, 0 untuk menonaktifkan#define EFFECT_ITERATION 4/* Arduino setup*/void setup() { // MAX72XX dalam mode hemat daya saat startup, kita harus melakukan wakeup call lc.shutdown(0,false); lc.shutdown(1,salah); // atur kecerahan ke rendah lc.setIntensity(0,1); lc.setIntensity(1,1); // hapus kedua modul lc.clearDisplay(0); lc.clearDisplay(1); // tes LED // garis vertikal byte b =B10000000; untuk (int c=0; c<=7; c++) { untuk (int r=0; r<=7; r++) { setRow(0, r, b); setRow(1, r, b); } b =b>> 1; penundaan (50); } // modul lengkap b =B11111111; for (int r=0; r<=7; r++) { setRow(0, r, b); setRow(1, r, b); } penundaan (500); // hapus kedua modul lc.clearDisplay(0); lc.clearDisplay(1); penundaan (500); // benih acak randomSeed(analogRead(0)); // mata tengah, tampilan kedipan gilaEyes(0, 0); penundaan(2000); blinkEyes(benar, salah); blinkEyes(salah, benar); delay(1000);}/* Arduino loop*/void loop() { // pindah ke posisi acak, tunggu waktu acak moveEyes(random(MIN, MAX + 1), random(MIN, MAX + 1), 50); tunda(acak(5, 7) * 500); // waktu berkedip? if (random(0, 5) ==0) { delay(500); berkedipMata(); penundaan (500); } // efek waktu? if (EFFECT_ITERATION> 0) { cntLoop++; if (cntLoop ==EFFECT_ITERATION) { cntLoop =0; if (cntEffect> 6) cntEffect =0; switch(cntEffect) { kasus 0:// cross eyes crossEyes(); penundaan (1000); merusak; case 1:// putaran putaran putaran Putaran(2); penundaan (1000); merusak; kasus 2:// putaran gila crazySpin(2); penundaan (1000); merusak; kasus 3:// mata sabu methEyes(); penundaan (1000); merusak; kasus 4:// mata malas mata malas(); penundaan (1000); merusak; case 5:// crazy blink blinkEyes(benar, salah); blinkEyes(salah, benar); penundaan (1000); merusak; case 6:// glow glowEyes(3); penundaan (1000); merusak; default:istirahat; } cntEffect++; } }}/* Metode ini mengedipkan kedua mata*/void blinkEyes(){ blinkEyes(true, true);}/* Metode ini mengedipkan mata sesuai parameter yang disediakan*/void blinkEyes(boolean blinkLeft, boolean blinkRight){ // blink ? if (!blinkLeft &&!blinkRight) kembali; // tutup kelopak mata untuk (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); } penundaan(DELAY_BLINK); } // membuka kelopak mata untuk (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, mataCurrent[7-i]); } penundaan(DELAY_BLINK); }}/* Metode ini menggerakkan mata ke posisi tengah, lalu bergerak horizontal dengan membungkus tepi.*/void crazySpin(int times){ if (times ==0) return; moveEyes(0, 0, 50); penundaan (500); byte baris =eyePupil; for (int t=0; t> 1; baris =baris | B10000000; setRow(0, 3, baris); setRow(1, 3, baris); setRow(0, 4, baris); setRow(1, 4, baris); penundaan (50); jika (t ==0) delay((5-i)*10); // menambah delay pada scroll pertama (efek mempercepat) } // berputar dari R ke pusat untuk (int i=0; i<5; i++) { row =row>> 1; jika (i>=2) baris =baris | B10000000; setRow(0, 3, baris); setRow(1, 3, baris); setRow(0, 4, baris); setRow(1, 4, baris); penundaan (50); if (t ==(kali-1)) delay((i+1)*10); // meningkatkan delay pada scroll terakhir (efek slow down) } }}/* Metode ini melintasi mata*/void crossEyes(){ moveEyes(0, 0, 50); penundaan (500); byte pupilR =mataPupil; byte pupilL =mataPupil; // menggerakkan pupil bersama untuk (int i=0; i<2; i++) { pupilR =pupilR>> 1; muridR =muridR | B10000000; muridL =muridL <<1; muridL =muridL | B1; setRow(0, 3, pupilR); setRow(1, 3, pupilL); setRow(0, 4, pupilR); setRow(1, 4, pupilL); penundaan(100); } penundaan(2000); // pindahkan pupil kembali ke tengah untuk (int i=0; i<2; i++) { pupilR =pupilR <<1; muridR =muridR | B1; pupilL =pupilL>> 1; muridL =muridL | B10000000; setRow(0, 3, pupilR); setRow(1, 3, pupilL); setRow(0, 4, pupilR); setRow(1, 4, pupilL); penundaan(100); }}/* Metode ini menampilkan bola mata dengan pupil diimbangi dengan nilai X, Y dari posisi tengah. Rentang X dan Y yang valid adalah [MIN,MAX] Kedua modul LED akan menunjukkan mata yang sama*/void displayEyes(int offsetX, int offsetY) { // pastikan offset berada dalam rentang yang valid offsetX =getValidValue(offsetX); offsetY =getValidValue(offsetY); // menghitung indeks untuk baris murid (melakukan offset Y) int row1 =3 - offsetY; int baris2 =4 - offsetY; // mendefinisikan baris pupil byte pupilRow =eyePupil; // melakukan offset X // menggeser bit dan mengisi bit baru dengan 1 if (offsetX> 0) { for (int i=1; i<=offsetX; i++) { pupilRow =pupilRow>> 1; muridRow =muridRow | B10000000; } } else if (offsetX <0) { for (int i=-1; i>=offsetX; i--) { pupilRow =pupilRow <<1; muridRow =muridRow | B1; } } // baris pupil tidak boleh memiliki 1s di mana eyeBall memiliki 0s byte pupilRow1 =pupilRow &eyeBall[row1]; byte pupilRow2 =pupilRow &eyeBall[row2]; // tampilkan pada matriks LCD, perbarui ke eyeCurrent for(int r=0; r<8; r++) { if (r ==row1) { setRow(0, r, pupilRow1); setRow(1, r, pupilRow1); mataCurrent[r] =pupilRow1; } else if (r ==row2) { setRow(0, r, pupilRow2); setRow(1, r, pupilRow2); mataCurrent[r] =pupilRow2; } else { setRow(0, r, bola mata[r]); setRow(1, r, bola mata[r]); eyeCurrent[r] =eyeBall[r]; } } // perbarui X saat ini dan Y saat iniX =offsetX; currentY =offsetY;}/* Metode ini mengoreksi nilai koordinat yang diberikan*/int getValidValue(int value){ if (value> MAX) return MAX; lain jika (nilai =1; i--) { lc.setIntensity(0,i); lc.setIntensity(1,i); penundaan (25); } penundaan(150); }}/* Metode ini menggerakkan mata ke tengah, keluar dan kemudian kembali ke tengah*/void methEyes(){ moveEyes(0, 0, 50); penundaan (500); byte pupilR =mataPupil; byte pupilL =mataPupil; // pindahkan pupil keluar untuk (int i=0; i<2; i++) { pupilR =pupilR <<1; muridR =muridR | B1; pupilL =pupilL>> 1; muridL =muridL | B10000000; setRow(0, 3, pupilR); setRow(1, 3, pupilL); setRow(0, 4, pupilR); setRow(1, 4, pupilL); penundaan(100); } penundaan(2000); // pindahkan pupil kembali ke tengah for (int i=0; i<2; i++) { pupilR =pupilR>> 1; muridR =muridR | B10000000; muridL =muridL <<1; muridL =muridL | B1; setRow(0, 3, pupilR); setRow(1, 3, pupilL); setRow(0, 4, pupilR); setRow(1, 4, pupilL); penundaan(100); }}/* Metode ini menggerakkan kedua mata dari posisi sekarang ke posisi baru*/void moveEyes(int newX, int newY, int stepDelay){ // setel posisi sekarang sebagai posisi awal int startX =currentX; int mulaiY =saat iniY; // perbaiki nilai X Y baru yang tidak valid newX =getValidValue(newX); baruY =getValidValue(baruY); // langkah evaluasi int langkahX =abs(saat iniX - baruX); int langkahY =abs(saat iniY - baruY); // perlu mengubah setidaknya satu posisi jika ((langkahX ==0) &&(langkahY ==0)) kembali; // evaluasi arah gerakan, # langkah, perubahan per langkah X Y, lakukan gerakan int dirX =(newX>=currentX) ? 1 :-1; int dirY =(baruY>=saat iniY) ? 1 :-1; int langkah =(langkahX> langkahY) ? langkahX :langkahY; int intX, intY; float changeX =(float)stepsX / (float)steps; float changeY =(float)stepsY / (float)langkah; for (int i=1; i<=langkah; i++) { intX =startX + round(changeX * i * dirX); intY =startY + putaran(ubahY * i * dirY); displayEyes(intX, intY); penundaan(langkahTunda); }}/* Metode ini hanya menurunkan dan menaikkan pupil kanan*/void lazyEye(){ moveEyes(0, 1, 50); penundaan (500); // pupil kiri bawah perlahan for (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); penundaan(150); } penundaan(1000); // menaikkan pupil kiri dengan cepat 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]); penundaan (25); } }/* Metode ini memutar pupil searah jarum jam*/void roundSpin(int times){ if (kali ==0) return; moveEyes(2, 0, 50); penundaan (500); for (int i=0; i 
Asi Leher dengan perhiasan Arduino
ini yang saya gunakan untuk memastikan leher Asi bergerak maju mundur
 // Parameter servo. Pin HARUS 1 atau 4 di Trinket. Posisi servo// ditentukan dalam tick timer/counter mentah (1 tick =0,128 milidetik).// Waktu pulsa servo biasanya 1-2 ms, tetapi dapat sedikit berbeda di antara// servos, jadi Anda mungkin perlu mengubah batas ini untuk cocokkan dengan kenyataan Anda.#define SERVO_PIN 4 // Pin 1 atau 4 didukung pada 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) // Trinket 16 MHz memerlukan pengaturan skala awal untuk pengaturan waktu yang benar. // Ini HARUS dilakukan SEBELUM servo.attach()! clock_prescale_set(clock_div_1);#endif servo.attach(SERVO_PIN); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH);} uint32_t lastLookTime =0; // Waktu putaran terakhir void loop(void) { unsigned long t =millis(); // Waktu saat ini // Jika lebih dari 1/2 detik telah berlalu sejak putaran kepala terakhir... if((t - lastLookTime)> 500) { if(random(10) ==0) { // Ada 1- dalam-10 kesempatan... // ...menggerakkan kepala secara acak ke arah yang baru:servo.write(random(SERVO_MIN, SERVO_MAX)); waktuterlihat terakhir =t; // Simpan waktu head-turn untuk referensi di masa mendatang } } // Tidak terkait dengan head-turn check, if(random(10) ==0) { // ada peluang 1-in-10... // .. .dari "kedipan mata":digitalWrite(LED_PIN, LOW); // LED mati tunda(random(50, 250)); // untuk sesaat acak digitalWrite(LED_PIN, HIGH); // lalu kembali ON } delay(100); // Ulangi loop() sekitar 10 kali/detik}

Suku cadang dan penutup khusus

bagian ujung kaki yang sebenarnya lupa menambahkan gigi turner untuk servo, saya biasanya mencetak dan memasang lampiran servo ke tengah kemudian sekrup di servo badan asithe bagian bawah paha ke asileg joint sekrup yang saya gunakan untuk bergabung kaki asi mur yang sesuai dengan sekrup, servo gigi yang digunakan untuk memutar kepala Asi, akan merekomendasikan menggunakan potongan servo dan meletakkannya di tengah bagian tengah Asipemegang servo untuk pelat leher asi GearAsi, di sinilah bola akrilik direkatkan ke leher

Skema

sirkuit yang saya gunakan untuk Asi Neck inilah yang saya gunakan untuk memulai Asi. Anda dapat membuat rantai daisy untuk memberi daya pada keduanya dari papan sirkuit kecil

Proses manufaktur

  1. Cara Membuat Platform Robot Arduino+Raspberry Pi
  2. Robot Kotak CD Raspberry Pi
  3. PiCy – Robot Kecil Bertenaga Raspberry Pi!
  4. Robot Alarm Bergulir
  5. Membuat Robot Creeper Minecraft
  6. Archimedes:AI Robot Owl
  7. Buka CV Robot
  8. Robot ROS
  9. Robot Pi Sederhana
  10. Apa itu Robot Minuman?