مقدمة. كلمات ، يمكنك تخطي
مرحبا مرة أخرى! في هذه القصة ، أود أن أستمر في موضوع "بناء الروبوت" في المنزل ، وهذا نوع من
استمرار الوظيفة السابقة .
سأحذرك على الفور: لست خبيراً في هذه الصناعة ، فأنا أتعلم فقط ولأجل طويل "شعرت بالحرج" للتعبير عن أفكاري ووضع أشياء محلية الصنع هنا. لقد كنت أقرأ منشورات عن هبر منذ فترة طويلة ، وأحيانًا تتساءل عما يحدث في العالم! تقرأ منشورًا ، ولا تفهم من أين يعرف المؤلف! كيف يمكنك حتى معرفة هذا! في ضوء كل هذا ، اعتقدت أن عرضي "الخرقاء" لن يكون مثيراً لأي أحد ، لكن أكثر من 9 آلاف شخص شاهدوا القصة السابقة ، بالنسبة لي إنها بالتأكيد نجاح ، وأعتقد أن العديد من الناس مثلي هم "أناس عاديون" بدون شهادات من معهد ماساتشوستس للتكنولوجيا ، لذلك هذه المعلومات متاحة لهم. لذلك دعونا نذهب ...
تغيير الهيكل
كأساس لمشروعي ، أخذت "الخليقة" السابقة ، وهي تشوبوكابرا ، التي كانت ترتدي وتحت أداء الصوت الخفيف ، أجرت عطلة. لقد فعلت ذلك من أجل يوم واحد ومن خلال وسائل مرتجلة ، والتي يمكن تتبعها في مظهرها ، وكان الأداء ساخرة. بدا الأمر مثل هذا:
بادئ ذي بدء ، لقد قمت بإزالة كل شيء غير ضروري ، واشتريت جوانب من الألومنيوم وزوايا مثقبة لتصميم جديد.
أحببت حقًا أداء روبوت التواجد عن بُعد من شركة "Origibot" الأجنبية


له مظهر الزاهد عدة مزايا ، والحكم لنفسك ، والوزن ليست كبيرة ، وهذا هو في المقام الأول توفير الطاقة ، وبيئة العمل ، وتوفير طاقة البطارية ، محرك كهربائي أقل قوة. تخيل مثل هذا الموقف ، من الناحية الافتراضية ، لقد تقدمنا في ذلك الوقت ومشاكل التواصل ، إذا كان وزن الروبوت عدة عشرات من الكيلوغرامات ، فقد تكون النتائج قاتلة. الميزة الثانية لهذا النموذج هي أنني أعتبر القدرة على طي المتلاعب بين العجلات ، فمن الممكن رفع شيء ما عن الأرضية.
حسنا ، من وحي وتذهب! إعادة صنع "له" ، قرر تقسيم الإنتاج على مراحل:
- تصنيع قاعدة العجلات على أساس اثنين من عجلات القيادة والآخر دعم الخلفية.
- كتابة رسم للإدارة.
- تركيب كاميرا أو هاتف. تم اختيار ارتفاع الموضع استنادًا إلى ارتفاع الموقد في المطبخ حتى تتمكن من النظر إلى المقلاة ومعرفة ما تم طهيه من البرش.
- قم بتثبيت جهاز مؤازر على الكاميرا بحيث يمكنك النظر أسفل "الأرجل" والسقف. لم أكن عناء مع الحركة الأفقية ، يمكنك تحويل القاعدة.
- التثبيت على "المنتج" من التعامل مع قبضة.
بعد ذلك ، يجب أن يكون جهاز الاتصالات الرئيسي هو الهاتف ، فيما يتعلق بالمفهوم العام للروبوت ، في نسخة مثالية لم يتم تنفيذها بعد. يتم تثبيت Skype عليه ، والذي تم تكوينه لتلقي مكالمات الفيديو تلقائيًا ، وسيكون الهاتف أيضًا نقطة وصول لبطاقة تعتمد على وحدة ESP ، مما يتيح التحكم في مؤتمر الروبوت والفيديو. لماذا سكايب لماذا تأتي بشيء إذا كان لديك بالفعل خدمات تعمل بشكل مثالي وتغيير الجودة تلقائيًا ، حسب عرض النطاق الترددي للشبكة.
لم تكن هناك مشاكل مع العنصر الأول ، فالقاعدة جاهزة من المركبة السابقة ، وأزالت كل شيء غير ضروري ، وجهاز التوجيه TPlink MR3020 بهوائي بعيد محلي الصنع. في الخطاب السابق ، كانت هناك جدران "سميكة" ، كان علي المزرعة الجماعية ، والنتيجة هي + 9 ديسيبل. جاءت أوامر مراقبة حركة المرور إلى جهاز التوجيه ، البرامج الثابتة cyberWRT.
مع النقطة الثانية التي كانت أكثر إثارة للاهتمام ، مستواي في برمجة اردوينو "LED Blinker" ، وجدت رسمًا جاهزًا على الإنترنت ، وللأسف لا أتذكر المؤلف ، لم أفعل ذلك كثيرًا بنفسي باستخدام طريقة الوخز العلمي ، ويستخدمه أولئك الذين يفهمون النظرية بشكل سيئ. نظرًا لأن البرمجة بلغات منخفضة المستوى تعد غابة مظلمة بالنسبة لي ، فقد كان علي اختيار نظام أساسي يمكنني بناء لوحة التحكم الخاصة به. كان من الجوانب المهمة بالنسبة لي القدرة على التحكم في الروبوت من خلال خدمة سحابية ، لأن عنصر التحكم سيكون من "العناوين الرمادية". أصبحت خدمة Blynk مثل هذه المنصة ، وأنا لن أصف المزايا ، هناك الكثير من المعلومات على الشبكة. في الإصدار الأول ، استخدمت أداة التحكم في عصا التحكم للتحكم في الحركة ، يظهر الرمز أدناه:
#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(); }
بعد ذلك ، تثبيت كاميرا أو هاتف ، حاولت كليهما.

في الصورة ، يقف المنابر بشكل منفصل.
الآن حان الوقت للاختبار! انتهزت الفرصة لتقسيم الشاشة على الهاتف (متوفر في أحدث البرامج الثابتة لنظام أندرويد) ، الجزء العلوي من الفيديو ، التحكم السفلي. لبدء كل شيء في نفس الوقت قمت بتنزيل تطبيق "شاشات" من سوق Play وذهبت إلى ...
خلال "pokatushek" الأول ، تم الكشف عن أوجه القصور التالية ، والمحركات التي كانت تستخدم في الماضي الألماني لتدور شيئًا ما حول بعض الانجذاب ، لها مخرجات مختلفة نتيجة لخط مستقيم ، الحركة لا تعمل. في كل وقت يسحب فيه أحد الاتجاهات ، أجرى تعديلًا لحساب سرعة المحركات في الشفرة ، وساعد ، لكنه قرر إعادة الرمز إلى أزرار ، وهو أكثر ملاءمة بالنسبة لي ، وستكون الحركات في الشقة خطية في الغالب.
وأعقب ذلك المرحلة الأكثر استهلاكا للوقت ، كما اتضح ، أصبح من الواضح الآن لماذا لا يوجد لدى العديد من روبوتات الحضور عن بُعد في السوق مناور. منذ وقت ليس ببعيد ، عند دراسة هذه المسألة ، قرأت عن طرق حساب محركات الدوران التي لا تنقسم بالتساوي على طول محور الحمل ، تذكرت كيف جلست في المعهد في محاضرة حول الميكانيكا النظرية منذ خمسة عشر عامًا واخترت تفكيري للأنف: "لماذا أحتاج إلى مستقبل #Engineer - كهربائي" هذه حماقة ". حسنًا ، حسنًا ، كما يقولون: "الممارسة بدون نظرية عمياء". حوالي عشر مرات قمت بإصلاح المعالج ، وأحرقت العديد من الماكينات ، التي كان من المفترض أن ترفع الحمل الرئيسي.
إذا لاحظت صورة Origibot ، فهناك شيء فظيع هناك كقيادة ، في موقعه على الويب ، قرأت أن مناور قادر على رفع ما يصل إلى 1 كجم ، رائع!
إذا قمت بالتقديم على سبيل المثال محرك سيرفو بقوة 20 كجم / سم ، فيمكنك رفع حمولة 10 كجم على مسافة 2 سم ، وإذا كان وزن هذا الحمل موزع بشكل غير متساو على طول المحور وكان المحور حوالي متر ، ثم أقل من ذلك.
من الجيد أن كاميرا CCTV الدوارة القديمة كانت في متناول اليد ، لقد أخرجت منها محركين من السائر ، رائع! سيرفع محرك واحد المحور ، والثاني أستخدمه على ستارة أوتوماتيكية. لقد أردت منذ فترة طويلة إنشاء منزل ، ولكن في الوقت نفسه ، اكتشف كيف أعمل مع الدودة الخادعة! إذا جاز التعبير ، عصفورين بحجر واحد ، في وقت واحد. آها! نسيت "المشكلة" الرئيسية ، أن أقول أنه بالنسبة لمنتجي محلي الصنع ، استخدمت وحدة التحكم Wemos D1 R1 ، وهي تشبه Arduino Uno ، فقط يوجد wifi على متنها. بينما لم يكن هناك مناور ، كان هناك عدد كافٍ من المسامير على اللوحة ، يضاف محرك السائر ، للتحكم في اللفات التي تحتاجها بأربعة دبابيس ، من أين يمكنني الحصول عليها؟ اتضح أن دبابيس اللوحة هي دبابيس CES نفسها ، والتي توفر الاتصالات ، يتم تكرار دبابيس من 0 إلى 8. حسنًا ، كما يقولون: "الرأس السيئ لا يعطي يديك أي سلام!"
سعر الخطأ - نقل نتائج العمل إلى لوحة Wemos 2560 esp8266 ، هذا المنتدى هو Mega و Esp منتظم. لقد أخذته لأتمتة الدفيئة ، بالطبع لم يذهب على الفور ، ولم يرسم المخطط ، فقد خرجت الأخطاء. العثور على حل على الموقع:
community.alexgyver.ru/threads/robotdyn-mega-wifi-r3-connect-blynk.1270/#post-16746فيما يلي رسم تخطيطي للميغا التي تديرها الأزرار:
#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();
نتيجة لذلك ، كانت قوة الاسم الصيني أقل - 5 كجم / سم ، قررت تجربة الحزام:

انزلق الحزام على الرغم من الموتر المرفق بالأسطوانة (غير مصور). انقطعت فكرة جديدة عن الذهان العصبي والعصبي الناجم عن سلسلة من النكسات التقنية. من الضروري تقليل وزن الهيكل - للتخلي عن الماكينتين في نهاية المحور ، للحصول على درجات إضافية من الحرية وتقليل طول محور المعالج. (آمل أن يبقى الصمامات وهذا القرار مؤقت).

أيضًا على الصورة ، قمت بتثبيت مكبر صوت خارجي ، تم لحامه بالكاميرا ds-2cd2432f-iw بواسطة الشركة المصنعة Hikvizhn. بدا المتحدث بدوام كامل ضعيفًا.
الآن المظهر هو على النحو التالي.

النتائج
لدينا كاميرا على عجلات ، لماذا حتى الآن رفضت الهاتف. لا يعمل Skype بشكل صحيح في وضع متعدد النوافذ على هاتفي ، عند تقليل التحكم في صورة الفيديو إلى حجم إطار صغير ، وهو ليس مناسبًا للغاية عندما يتحرك الروبوت. لذلك ، توقفت أثناء استخدام الكاميرا ، ما زلت أستخدم الإصدار المدفوع من برنامج Tiny cam pro للوصول إلى الفيديو ، والوصول من أي مكان في العالم ، ويتم توصيل الكاميرا لاسلكيًا بجهاز توجيه يتم توجيه منافذها عليه ، ويتم استخدام خدمة اسم نطاق No-Ip. من الجيد أن المزود يقدم حتى الآن عنوان "أبيض". لماذا لا أستخدم Blynk لنقل الفيديو ، كما تسأل ، لأن هناك عنصر واجهة مستخدم قياسي لإرسال بروتوكول rtsp. أجب ، أريد استخدام وظيفة الكاميرا بأكملها ، وهي الاتصال ثنائي الاتجاه. حتى لو كان في شكل من الأشكال كما يتم توفيره بواسطة تطبيق يتم فيه استخدام برامج الترميز الصوتية التي تقلل إلى حد كبير من جودة الصوت. يعمل بروتوكول rtsp الأكثر أهمية في تطبيق Blynk مع تأخير بسيط ، وهو أمر بالغ الأهمية للسفر على آلية تزن 10 كجم.
التغذية ، موضوع مثير للاهتمام منفصل. لم يتم حل مشكلة محطة الشحن المستقلة ، لم يكن لديك الوقت. في الطراز السابق ، استخدمت بطاريات Li-ion ملحومة في أزواج على التوازي ، لزيادة الجهد إلى 12 فولت وزيادة السعة ، من خلال وحدة التحكم في الشحن. في هذا المشروع ، رفض الليثيوم ، انفجرت البطاريات بشكل رهيب من تجربة سيئة! يتم تثبيت بطارية الرصاص الحمضية 7A / h في الجزء الخلفي من الوحدة ، لتوزيع الحمل بشكل موحد عندما ترفع المناولة الحمل.تم توصيل محول DC الذي يقلل من الجهد من 5V إلى البطارية لتشغيل وحدة التحكم ومنطق سائقي محرك MonstrmotorShield ، واحد لكل عجلة ، لأن فقط أرضية السائق التي تعمل في كلتا اللوحتين ، وعلى الأرجح زواج المصنع ، لا يمكن أن تفكر في الأمر ، حسناً ، ألم تتخلص منه؟ .. ln298 مطلوب سائق سيارة حتى يعمل محركان من السائر.
من المشاكل التي لم يتم حلها بعد ، الشحن المستقل ، أريد أن أكررها هكذا
كما أنني لم أفهم تمامًا مكتبة AccelStepper ، إذا قمت بتزويد المحرك بالطاقة ، بعد انتهاء المعالج ، تظل الطاقة ، مما يزيد من طاقة تفريغ البطارية بحوالي 400 مللي أمبير ، وهو أمر غير اقتصادي ، تحتاج إلى الخروج بالمنطق عندما يكون المعالج في الوضع الأدنى ، يتم إيقاف تشغيل الطاقة. أرغب أيضًا في الحصول على ملاحظات حتى يأتي موضع الماكينات والديدان الخاطفة إلى Blynk عند تشغيل الروبوت. وبالطبع ، يجب أن تفصل البطارية الحمل عندما ينخفض التيار الكهربائي إلى 10.5 فولت ، مما سيمنع تدهورها السابق لأوانه. لا توجد وسيلة للتحكم من جهاز كمبيوتر. وبالطبع ، يحتاج الرمز إلى التحسين.
أولئك الذين لا يخافون من العديد من الكتب والقراءة حتى النهاية ، شكرا لك ، حظا سعيدا للجميع ، كل خير!
أخيرًا ، سنفعل القليل!