Entri. Lirik, Anda bisa melewati
Halo lagi! Dalam cerita ini, saya ingin melanjutkan topik "robot building" rumah, ini adalah semacam
kelanjutan dari posting sebelumnya .
Saya akan segera memperingatkan Anda: Saya bukan ahli dalam industri ini, saya baru belajar dan untuk waktu yang lama saya "malu" untuk mengekspresikan pikiran saya dan menata barang-barang buatan sendiri di sini. Saya telah membaca publikasi tentang Habr sejak lama, terkadang Anda bertanya-tanya apa yang sedang terjadi di dunia! Anda membaca pos, Anda tidak mengerti dari mana penulis tahu! Bagaimana Anda bisa mengetahui hal ini! Mengingat semua ini, saya berpikir bahwa presentasi "ceroboh" saya tidak akan menarik bagi siapa pun, tetapi lebih dari 9k orang menonton cerita sebelumnya, bagi saya itu pasti sukses, saya pikir banyak orang seperti saya adalah "orang biasa" tanpa ijazah dari Massachusetts Institute of Technology , jadi info ini lebih mudah diakses oleh mereka. Jadi ayo pergi ...
Perubahan struktur
Sebagai dasar dari proyek saya, saya mengambil "kreasi" sebelumnya, sebuah chupocabra, yang didandani dan di bawah penampilan yang ringan, melakukan liburan. Saya melakukannya demi satu hari dan dari cara improvisasi, yang dapat ditelusuri dalam penampilannya, pertunjukan itu menyindir. Itu terlihat seperti ini:
Pertama-tama, saya menghapus semua yang tidak perlu, membeli profil aluminium dan sudut berlubang untuk desain baru.
Saya sangat menyukai kinerja robot telepresence dari perusahaan asing "Origibot"


Penampilan pertapaannya memiliki beberapa keunggulan, nilai sendiri, beratnya tidak besar, ini terutama menghemat daya, ergonomi, menghemat daya baterai, penggerak listrik yang kurang kuat. Bayangkan situasi ini, secara hipotetis, kita maju terus dan pada saat itu masalah komunikasi, jika berat robot beberapa puluh kilogram, konsekuensinya bisa fatal. Keuntungan kedua dari bentuk ini saya menganggap kemampuan untuk melipat manipulator di antara roda, adalah mungkin untuk mengangkat sesuatu dari lantai.
Oh well, terinspirasi dan pergi! Membentuk ulang "miliknya", ia memutuskan untuk membagi produksi secara bertahap:
- Pembuatan wheelbase berdasarkan pada dua roda penggerak dan satu pendukung belakang.
- Menulis sketsa untuk manajemen.
- Memasang kamera atau telepon. Ketinggian penempatan dipilih berdasarkan ketinggian kompor di dapur sehingga Anda bisa melihat ke dalam panci dan melihat dari mana borsch dimasak.
- Memasang servo pada kamera sehingga Anda dapat melihat di bawah "kaki" dan langit-langit. Saya tidak repot dengan gerakan horizontal, Anda bisa membalikkan pangkalan.
- Instalasi pada "produk" dari manipulator dengan pegangan.
Komisioning lebih lanjut, sehubungan dengan konsep umum robot, dalam kasus ideal yang belum diimplementasikan, perangkat telekomunikasi utama adalah telepon. Skype diinstal di atasnya, yang dikonfigurasi untuk menerima panggilan video secara otomatis, dan telepon juga akan menjadi titik akses untuk kartu yang didasarkan pada modul ESP, ini akan memungkinkan untuk mengontrol robot dan konferensi video. Mengapa skype Mengapa menemukan sesuatu jika Anda sudah memiliki layanan yang bekerja dengan sempurna dan mengubah kualitas secara otomatis, tergantung pada bandwidth jaringan.
Tidak ada masalah dengan item pertama, pangkalan sudah siap dari kerajinan sebelumnya, menghapus semuanya berlebihan, router TPlink MR3020 dengan antena jarak jauh buatan sendiri. Dalam pidato sebelumnya ada dinding "tebal", saya harus bertani kolektif, hasilnya +9db. Perintah kontrol lalu lintas datang ke router, firmware cyberWRT.
Poin kedua lebih menarik, level saya dalam pemrograman arduino "LED Blinker", saya menemukan sketsa yang siap di Internet, sayangnya saya tidak ingat penulisnya, saya tidak melakukan banyak hal untuk diri saya sendiri menggunakan metode poke ilmiah, ini digunakan oleh mereka yang kurang memahami teori. Karena pemrograman dalam bahasa tingkat yang lebih rendah adalah hutan gelap bagi saya, saya harus memilih platform di mana saya dapat membangun panel kontrol saya sendiri. Aspek penting bagi saya adalah kemampuan untuk mengendalikan robot melalui layanan cloud, karena kontrol akan berasal dari "alamat abu-abu". Layanan Blynk telah menjadi platform seperti itu, saya tidak akan menjelaskan kelebihannya, ada banyak informasi di jaringan. Di versi pertama, saya menggunakan widget joystick untuk mengontrol pergerakan, kode ditunjukkan di bawah ini:
#define BLYNK_PRINT Serial #include <ESP8266_Lib.h> #include <BlynkSimpleShieldEsp8266.h> #include <AccelStepper.h> #include <Servo.h> #include <SimpleTimer.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "****"; // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "****"; char pass[] = "****"; #define EspSerial Serial3 #define ESP8266_BAUD 115200 ESP8266 wifi(&EspSerial); BlynkTimer timer; Servo servo; Servo servo2; // These are used to set the direction of the bridge driver. #define ENB 5 //ENB monstr motor shield 5 6 #define MOTORB_1 4 //IN3 #define MOTORB_2 9 //IN4 #define MOTORA_1 8 //IN1 #define MOTORA_2 7 //IN2 #define ENA 6 //ENA int motor_right_speed = 0; int motor_left_speed = 0; AccelStepper Stepper1(4, 10, 11, 12, 13); //4 , int steeps = 192; // , , // SETUP void setup() { Serial.begin(9600); delay(10); EspSerial.begin(ESP8266_BAUD); delay(10); // Connect Blynk Blynk.begin(auth, wifi, ssid, pass); Blynk.connect(); // Configure pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); digitalWrite(ENA,LOW); digitalWrite(ENB,LOW); Stepper1.setMaxSpeed(10000); // (/) Stepper1.setAcceleration(10000); // (/^2) servo.attach(1); servo2.attach(3); servo2.write(55); timer.setInterval(500L, StopServo); // Start serial communication } BLYNK_WRITE(V1) / , , / { if (param.asInt() == 1) { servo.attach(1); servo.write(165); // High gear timer.setTimeout(500L, StopServo); } else { servo.attach(1); servo.write(115); // Low gear timer.setTimeout(500L, StopServo); } } BLYNK_WRITE(V2) { servo2.write(param.asInt()); } void StopServo() / { servo.detach(); } // JOYSTICK BLYNK_WRITE(V0) { int nJoyY = param[0].asInt(); // read x-joystick int nJoyX = param[1].asInt(); // read y-joystick // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt : The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range: (0..+127) float fPivYLimit = 1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY >= 0) { // Forward nMotPremixL = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); nMotPremixR = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; } else { // Reverse nMotPremixL = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; nMotPremixR = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL = nMotPremixL * nJoyY/900.0; // nMotPremixR = nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed = nJoyX; fPivScale = (abs(nJoyY)>fPivYLimit)? 0.0 : (1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL = (1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR = (1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed)/ 1.1; motor_left_speed = nMotMixL; motor_right_speed = nMotMixR; if (motor_right_speed > 20) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else if (motor_right_speed < -20) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2, HIGH); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } if (motor_left_speed > 20) { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, HIGH); } else if (motor_left_speed < -20) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } analogWrite(ENB, abs(motor_left_speed)); analogWrite(ENA, abs(motor_right_speed)); } BLYNK_WRITE(V3) { // Motor Speed - Slider set with 0-100 and Send On Relese OFF int pinValue = param.asInt(); Stepper1.move(pinValue); } // MAIN CODE void loop() { Blynk.run(); timer.run(); Stepper1.run(); }
Selanjutnya, pemasangan kamera atau ponsel, saya coba keduanya.

Dalam foto, manipulator berdiri secara terpisah.
Sekarang saatnya untuk menguji! Saya mengambil kesempatan untuk membagi layar pada ponsel (tersedia dalam firmware android terbaru), bagian atas video, kontrol bawah. Untuk memulai semuanya pada saat yang sama saya mengunduh aplikasi Layar dari Play Market dan pergi ...
Selama "pokatushek" pertama, kekurangan berikut terungkap, mesin yang di masa lalu Jerman mereka, digunakan untuk memutar sesuatu pada beberapa daya tarik, memiliki output yang berbeda sebagai hasil dari garis lurus, gerakan tidak bekerja. Sepanjang waktu ia menarik di salah satu arah, membuat penyesuaian untuk menghitung kecepatan mesin dalam kode, itu membantu, tetapi memutuskan untuk membuat kembali kode menjadi tombol, itu lebih nyaman bagi saya, dan gerakan di apartemen sebagian besar akan linier.
Ini diikuti oleh tahap yang paling memakan waktu, ternyata, sekarang jelas mengapa banyak robot telepresence di pasaran tidak memiliki manipulator. Belum lama berselang, mempelajari studi masalah ini, saya membaca tentang metode untuk menghitung drive untuk rotasi yang tidak terdistribusi secara merata di sepanjang sumbu beban, saya ingat bagaimana lima belas tahun yang lalu saya duduk di sebuah kuliah di mekanika teoretis di institut dan mengambil hidung saya berpikir: "Mengapa saya membutuhkan masa depan # Engineer - tukang listrik # omong kosong ini. " Baiklah, seperti yang mereka katakan: "Praktek tanpa teori itu buta." Sekitar sepuluh kali saya redid manipulator, membakar beberapa servos, yang seharusnya mengangkat beban utama.
Jika Anda memperhatikan foto Origibot, ada sesuatu yang mengerikan di sana sebagai drive, di situs web mereka saya membaca bahwa manipulator mampu mengangkat hingga 1 kg, fantastis!
Jika kita menerapkan misalnya penggerak servo dengan kekuatan 20 kg / cm, maka pada jarak 2 cm, beban 10 kg dapat dinaikkan, dan jika berat beban ini didistribusikan secara tidak merata di sepanjang poros dan porosnya sekitar satu meter, maka bahkan kurang.
Bagus sekali bahwa kamera CCTV putar tua sudah dekat, saya mengeluarkan dua motor stepper dari itu, bagus! Satu mesin akan menaikkan poros, dan yang kedua saya gunakan pada tirai otomatis. Saya sudah lama ingin membuat rumah, tetapi pada saat yang sama mencari cara untuk bekerja dengan cacing tanduk! Jadi bisa dikatakan, dua burung dengan satu batu, sekaligus. Ya! "Masalah" utama sudah menunggu di depan, saya lupa mengatakan bahwa saya menggunakan pengontrol Wemos D1 R1 untuk produk buatan saya, tampilannya mirip dengan Arduino Uno, hanya ada wifi di dalamnya. Meskipun tidak ada manipulator, ada cukup pin di papan, motor stepper ditambahkan, untuk mengontrol belitan yang Anda butuhkan empat pin, di mana saya bisa mendapatkannya? Ternyata pin papan adalah pin CES itu sendiri, yang menyediakan komunikasi, pin dari 0 sampai 8 diulang lebih lanjut. Nah, seperti yang mereka katakan: "Kepala yang buruk tidak memberikan kedamaian di tangan Anda!"
Harga kesalahan - mentransfer hasil kerja ke papan Wemos 2560 esp8266, papan ini adalah Mega dan Esp biasa. Saya mengambilnya untuk otomatisasi rumah kaca, tentu saja itu tidak langsung, sketsa tidak dikompilasi, kesalahan terbang keluar. Menemukan solusi di situs:
community.alexgyver.ru/threads/robotdyn-mega-wifi-r3-connect-blynk.1270/#post-16746Di bawah ini adalah sketsa untuk Mega yang dioperasikan tombol:
#define BLYNK_PRINT Serial #include <ESP8266_Lib.h> #include <BlynkSimpleShieldEsp8266.h> #include <AccelStepper.h> #include <Servo.h> #include <SimpleTimer.h> #define EspSerial Serial3 #define ESP8266_BAUD 115200 ESP8266 wifi(&EspSerial); #define ENB 5 //ENB monstr motor shield 5 6 #define MOTORB_1 4 //IN3 #define MOTORB_2 9 //IN4 #define MOTORA_1 8 //IN1 #define MOTORA_2 7 //IN2 #define ENA 6 //ENA BlynkTimer timer; Servo servo; Servo servo2; AccelStepper Stepper1(4, 10, 11, 12, 13); //4 , char auth[] = "****"; char ssid[] = "****"; char pass[] = "****"; // SETUP void setup() { Serial.begin(9600); delay(10); EspSerial.begin(ESP8266_BAUD); delay(10); // Connect Blynk Blynk.begin(auth, wifi, ssid, pass); Blynk.connect(); // Configure pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); Stepper1.setMaxSpeed(100); // (/) Stepper1.setAcceleration(96); // (/^2) servo.attach(2); // servo.write(115); // servo2.attach(3); // servo2.write(55); // //timer.setInterval(500L, StopServo); // Start serial communication } BLYNK_WRITE(V6) { servo.write(param.asInt()); //timer.setTimeout(2500L, StopServo); } BLYNK_WRITE(V7) { servo2.write(param.asInt()); } //void StopServo() { // servo.detach(); //} BLYNK_WRITE(V8) { int pinValue = param.asInt(); Stepper1.move(pinValue); } BLYNK_WRITE(V4) { int speedL = param.asInt(); // . 1,13 analogWrite(ENA, speedL); analogWrite(ENB, speedL* 1.13); } / FORWARD BLYNK_WRITE(V0) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // RIGHT BLYNK_WRITE(V1) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // LEFT BLYNK_WRITE(V2) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // BACKWARD BLYNK_WRITE(V3) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // MAIN CODE void loop() { Blynk.run(); timer.run(); Stepper1.run();
Akibatnya, kekuatan kata benda Cina bahkan kurang - 5kg / cm, saya memutuskan untuk mencoba sabuk:

Sabuk tergelincir meskipun tensioner terpasang pada roller (Tidak ada foto). Psikosis yang luar biasa dan kegugupan yang disebabkan oleh serangkaian kemunduran teknis terganggu oleh ide baru. Adalah perlu untuk mengurangi berat struktur - untuk meninggalkan dua servos di ujung sumbu, untuk derajat kebebasan tambahan dan mengurangi panjang sumbu manipulator. (Saya harap sumbu akan tetap dan keputusan ini bersifat sementara).

Juga di foto, saya memasang speaker eksternal, yang disolder ke kamera ds-2cd2432f-iw oleh produsen Hikvizhn. Pembicara penuh waktu tampak lemah.
Sekarang penampilannya adalah sebagai berikut.

Ringkasan
Kami memiliki kamera di atas roda, mengapa sejauh ini saya menolak telepon. Skype tidak berfungsi dengan benar dalam mode multi-jendela di ponsel saya, ketika mengontrol gambar video diminimalkan ke ukuran jendela kecil, yang tidak terlalu nyaman ketika robot bergerak. Oleh karena itu, saya berhenti ketika berada di kamera, saya masih menggunakan versi berbayar dari program βTiny cam proβ untuk mengakses video, akses dari bagian mana pun di dunia, kamera terhubung secara nirkabel ke router tempat port-portnya diteruskan dan layanan nama domain No-Ip digunakan. Sangat bagus bahwa penyedia sejauh ini memberikan alamat "putih". Mengapa saya tidak menggunakan Blynk untuk transmisi video, Anda bertanya, karena ada widget standar untuk mentransmisikan protokol rtsp. Saya jawab, saya ingin menggunakan seluruh fungsionalitas kamera, yaitu komunikasi dua arah. Bahkan jika dalam bentuk seperti itu disediakan oleh aplikasi di mana codec audio digunakan yang sangat mengurangi kualitas suara. Protokol rtsp yang paling penting dalam aplikasi Blynk bekerja dengan sedikit penundaan, yang sangat penting untuk bepergian dengan mekanisme yang berbobot 10 kg.
Nutrisi, topik menarik yang terpisah. Masalah stasiun pengisian otonom belum terselesaikan, tidak punya waktu. Pada model sebelumnya, saya menggunakan baterai Li-ion yang disolder berpasangan secara paralel, untuk meningkatkan tegangan menjadi 12V dan meningkatkan kapasitas, bekerja melalui pengontrol muatan. Dalam proyek ini, ia menolak lithium, baterai meledak sangat dari pengalaman buruk! Baterai timbal-asam 7A / jam dipasang di bagian belakang unit, untuk distribusi beban yang seragam ketika manipulator mengangkat beban, konverter dc terhubung ke baterai, yang mengurangi tegangan 5V, untuk memberi daya pada pengontrol dan logika dua driver engine MonstrmotorShield, satu untuk setiap roda, karena hanya lantai pengemudi yang berfungsi di kedua papan, kemungkinan besar cacat pabrik, tidak dapat memberikan pikiran, ya, tidak bisakah saya membuangnya? .. Pengemudi motor tahun 1998 diperlukan untuk dua motor stepper untuk bekerja.
Dari masalah yang belum terselesaikan, pengisian otonom, saya ingin mengulanginya seperti ini
Saya juga tidak begitu mengerti perpustakaan AccelStepper, jika Anda menyuplai daya ke belitan motor, setelah manipulator selesai, daya tetap, yang meningkatkan arus pelepasan baterai sekitar 400mA, yang tidak ekonomis, Anda perlu membuat logika ketika manipulator berada di posisi yang lebih rendah, daya ke belitan dimatikan. Saya juga ingin umpan balik sehingga posisi servos dan stepworms datang ke Blynk ketika robot dihidupkan. Dan tentu saja, baterai harus memutuskan beban ketika tegangan turun ke 10.5V, yang akan mencegah degradasi prematurnya. Tidak ada cara untuk mengontrol dari komputer. Dan tentu saja, kode perlu dioptimalkan.
Mereka yang tidak takut pada banyak buku dan membaca sampai akhir, terima kasih, semoga sukses untuk semua orang, semua baik!
Akhirnya, kami akan melakukan sedikit!