جدول المحتويات:

روفر المتحكم فيه عبر الويب: 14 خطوة (مع صور)
روفر المتحكم فيه عبر الويب: 14 خطوة (مع صور)

فيديو: روفر المتحكم فيه عبر الويب: 14 خطوة (مع صور)

فيديو: روفر المتحكم فيه عبر الويب: 14 خطوة (مع صور)
فيديو: طريقة ضبط اعدادات شاشات الاندرويدعند تركيبها على الجمس وتشغيل(تحكم دركسون/اشارات الابواب والحساسات) 2024, شهر نوفمبر
Anonim
روفر يتحكم فيه الويب
روفر يتحكم فيه الويب
روفر يتحكم فيه الويب
روفر يتحكم فيه الويب

بناء الروبوتات واللعب بها هو سعادتي الرئيسية في الحياة. يلعب الآخرون الجولف أو التزلج ، لكنني أقوم ببناء الروبوتات (بما أنني لا أستطيع لعب الجولف أو التزلج:-). أجده مريحًا وممتعًا! لتحقيق معظم برامج الروبوت الخاصة بي ، أستخدم مجموعات الهيكل. يساعدني استخدام المجموعات على القيام بما أحب القيام به أكثر ، البرامج والإلكترونيات ، كما أنه يصنع هيكلًا أفضل لنفسي.

في Instructable ، سننظر في ما يتطلبه الأمر لإنشاء عربة جوالة بسيطة ولكنها قوية يتم التحكم فيها عبر Wifi / الويب. الهيكل المستخدم هو Actobotics Gooseneck. لقد اخترته لحجمه وقدرته على التوسع والتكلفة ولكن يمكنك استخدام أي هيكل آخر من اختيارك.

بالنسبة لمشروع مثل هذا ، سنحتاج إلى جهاز كمبيوتر فردي صلب جيد ، وبالنسبة لهذا الروبوت اخترت استخدام Raspberry Pi (RPI) وهو كمبيوتر يعمل بنظام Linux. يمنحنا RPI (و Linux) الكثير من خيارات الترميز وسيتم استخدام Python في جانب الترميز. بالنسبة لواجهة الويب ، أستخدم Flask ، وهو إطار ويب خفيف الوزن لـ Python.

لقيادة المحركات ، اخترت RoboClaw 2x5a. يسمح بالاتصال التسلسلي البسيط لقيادته ويعمل بشكل جيد مع RPI والمحركات الموجودة على Gooseneck.

أخيرًا ، تحتوي على كاميرا ويب لتعليقات الفيديو من نوع POV لقيادتها عن بُعد. سأغطي كل موضوع بمزيد من التفصيل لاحقًا.

الخطوة 1: الأجهزة المطلوبة

الأجهزة المطلوبة
الأجهزة المطلوبة
الأجهزة المطلوبة
الأجهزة المطلوبة
الأجهزة المطلوبة
الأجهزة المطلوبة
الأجهزة المطلوبة
الأجهزة المطلوبة
  • هيكل Actobotics Gooesneck أو بديل مناسب من اختيارك
  • Raspberry Pi من اختيارك (أو استنساخ) - يتم استخدام نموذج RPI B في هذا الروبوت ، ولكن أي من منافذ USB على الأقل سيعمل
  • لوحة مؤازرة قياسية B x1
  • 90 درجة زاوية قناة واحدة قوس x1
  • سائق محرك RoboClaw 2x5a
  • S3003 أو أجهزة ذات حجم قياسي مماثل
  • لوح توصيل صغير أو لوح توصيل صغير
  • أنثى إلى أنثى أسلاك العبور
  • ذكر لأنثى أسلاك العبور
  • كاميرا الويب (اختياري) - أستخدم Logitech C110 ، وهنا قائمة بالكاميرات المدعومة لـ RPI
  • مصدر طاقة 5v-6v لطاقة مؤازرة
  • بطارية 7.2 فولت - 11.1 فولت لتشغيل محرك الدفع
  • 5 فولت 2600 مللي أمبير (أو أعلى) بنك طاقة USB لـ RPI
  • محول واي فاي USB

في الروبوت الخاص بي ، أستخدم عجلات مقاس 4 بوصات لأجعلها أكثر بقليل من All-Terrain-Indoor. بالنسبة لهذا الخيار ، ستحتاج إلى:

  • عجلة الخدمة الشاقة 4 بوصة × 2.5 بوصة
  • صرة برغي مجموعة التجويف 4 مم (0.770 بوصة) × 2

الخطوة 2: تجميع الهيكل

تجميع الهيكل
تجميع الهيكل
تجميع الهيكل
تجميع الهيكل
تجميع الهيكل
تجميع الهيكل

قم أولاً بتجميع الهيكل باتباع الإرشادات المرفقة مع الهيكل أو الفيديو. بعد الانتهاء يجب أن يكون لديك شيء مثل الصورة. ملاحظة: عند تجميع جزء العنق ، ما عليك سوى ترك قوس التركيب مغلقًا.

في الروبوت الخاص بي ، اخترت استبدال العجلات التي يأتي معها الهيكل بعجلات 4 بوصة شديدة التحمل. وهذا اختياري ولا حاجة إليه إلا إذا كنت تريد أن تفعل الشيء نفسه.

الخطوة الثالثة: تركيب الإلكترونيات

تركيب الإلكترونيات
تركيب الإلكترونيات
تركيب الإلكترونيات
تركيب الإلكترونيات
تركيب الإلكترونيات
تركيب الإلكترونيات

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

الخطوة 4: إضافة كاميرا الويب

إضافة كاميرا الويب
إضافة كاميرا الويب
إضافة كاميرا الويب
إضافة كاميرا الويب
إضافة كاميرا الويب
إضافة كاميرا الويب

خذ قوس 90 درجة ومحور مؤازر خفيف الوزن وأربعة (4) من مسامير 0.3125 بوصة لهذه الخطوة:

  • خذ محور المؤازرة وضعه على جانب واحد من الحامل وقم بتثبيته مع المسامير اللولبية 0.225 بوصة كما في الصورة
  • بعد ذلك ، قم بتركيب المؤازرة في قوس المؤازرة
  • قم بإرفاق قوس 90 درجة مع قرن المؤازرة بالعمود الفقري المؤازر واستخدم المسمار البوق الذي يأتي مع المؤازرة لربطها معًا
  • الآن قم بتركيب المؤازرة في قوس على الجزء العلوي من عنق الأوز مع البراغي المتبقية
  • قم بتركيب الكاميرا برباطات مضغوطة أو شريط مزدوج الجوانب على حامل 90 درجة

استخدم الصور كدليل إذا لزم الأمر.

الخطوة 5: توصيل الأسلاك بالكامل

توصيل كل شيء
توصيل كل شيء
توصيل كل شيء
توصيل كل شيء
توصيل كل شيء
توصيل كل شيء
توصيل كل شيء
توصيل كل شيء

الأسلاك مضيق إلى حد ما إلى الأمام لهذا الروبوت.

المحركات:

يؤدي اللحام على كلا المحركين إذا لم تكن قد قمت بذلك بالفعل

مع مواجهة الروبوتات الأمامية (النهاية برقبة الإوزة) بعيدًا عنك:

  • قم بتوصيل أسلاك المحرك الموجودة على المحرك الأيسر بالقناة M1A و M1B
  • قم بتوصيل أسلاك المحرك الموجودة على المحرك الأيمن بالقناة M2A و M2B

اتصالات الأرض (GND):

  • قم بتوصيل دبوس أرضي واحد على RoboClaw بلوحة العبور الأرضية. خط الدبوس الأرضي على RoboClaw هو الأقرب إلى المركز (انظر الصورة)
  • قم بتوصيل رقم التعريف الشخصي 6 على RPI بلوحة العبور. انظر الموافقة المسبقة عن علم رأس RPI لتخصيصات دبوس.
  • قم بتوصيل GND من حزمة بطارية المؤازرة بأحد المسامير الموجودة على لوحة العبور.
  • قم بتشغيل سلك توصيل من لوحة العبور إلى سلك GND المؤازر.

RPI إلى RoboClaw:

قم بتوصيل دبوس RPI GPIO14 TXD بدبوس RoboClaw S1

قوة:

  • قم بتوصيل سلك POS من بطارية المؤازرة بسلك نقاط البيع المؤازرة
  • قم بتوصيل سلك POS من بطارية المحرك بنقطة البيع (+) لمحطة إدخال طاقة محرك RoboClaw. سنترك محطة GND غير متصلة في الوقت الحالي.

الخطوة 6: إعداد RPI

إعداد RPI
إعداد RPI

أفترض أن المستخدم هنا يعرف بعضًا عن Linux و RPI. أنا لا أغطي كيفية الإعداد أو الاتصال بواحد. إذا كنت بحاجة إلى مساعدة في ذلك ، فاستخدم الصفحات أدناه.

للحصول على إعداد RPI الخاص بك ، ألق نظرة على الصفحات التالية:

  • إعداد RPI الأساسي
  • دليل البدء السريع RPI
  • نقابة إعداد NOOBS

بالنسبة لصفحات القفز العامة ، تعد صفحة RPI الرئيسية وصفحات eLinux أماكن رائعة للبدء.

انظر هذا الرابط لإعداد RPI العام لشبكة Wifi.

إذا كنت تخطط لاستخدام نوع من الكاميرا أو كاميرا الويب على الروبوت ، فقم بإلقاء نظرة على هذه الصفحات للحصول على الملفات الأساسية المطلوبة.

  • إعداد كاميرا RPI
  • إعداد كاميرا eLinix RPI

دفق الفيديو:

هناك عدة طرق لتشغيل دفق الفيديو على RPI ، لكن الطريقة التي أفضلها هي استخدام Motion.

لتثبيته على RPI الخاص بك ، قم بتشغيل: sudo apt-get install motion

يذهب هذا الأمر إلى إعداده للبث أيضًا.

الخطوة 7: تكوين منفذ RPI التسلسلي

سنحتاج إلى تعطيل وضع وحدة تحكم Linux لاستخدام RX و TX لأننا نريد التحدث إلى وحدة التحكم في محرك RoboClaw من هذا المنفذ. للقيام بذلك ، يمكنك استخدام هذه الطريقة أو هذه الأداة. الخيار لك في الطريقة لأن كلاهما يفعل نفس الشيء في النهاية.

الخطوة الثامنة: تثبيت وحدات بايثون

ستحتاج إلى تثبيت python على RPI بالإضافة إلى نقطة تثبيت حزمة python.

لتثبيت النقطة ، قم بما يلي:

  1. sudo apt-get install python-setuptools
  2. sudo easy_install pip

ثم:

  1. قارورة تثبيت sudo pip
  2. sudo pip تثبيت pyserial
  3. تثبيت sudo pip RPIO

ستكون هذه هي جميع الوحدات المطلوبة لتشغيل الكود.

الخطوة 9: إعداد RoboClaw

لدي رمز الروبوت الذي يتحدث إلى RoboClaw في الوضع التسلسلي القياسي عند 19200 باود.

لتعيين RoboClaw لهذا ، قم بما يلي:

  1. اضغط على زر "MODE" الموجود على RoboClaw
  2. اضغط على زر الضبط حتى يومض مؤشر LED 5 (خمس) مرات بين فترات التأخير
  3. اضغط على زر "LIPO" للتخزين
  4. بعد ذلك ، اضغط على الزر "SET" حتى يومض مؤشر LED ثلاث (ثلاث) مرات بين فترات التأخير
  5. اضغط على زر LIPO للتخزين

هذا كل شيء لإعداد وحدة التحكم في المحرك. راجع ملف pdf المرتبط أعلاه لمزيد من المعلومات إذا لزم الأمر.

الخطوة العاشرة: تثبيت برنامج Rover / الملفات

قم بتنزيل ونسخ ملف rover.zip إلى RPI في دليل مستخدم pi.

إذا كنت تستخدم Linux أو Mac ، فيمكنك استخدام "scp" للقيام بذلك:

scp ~ / location / of / the / file / rover.zip pi @ your_rpi_ip: / ~

بالنسبة لنظام التشغيل Windows ، يمكنك تنزيل واستخدام pscp ثم القيام بما يلي:

pscp /location/of/the/file/rover.zip pi @ your_rpi_ip: / ~

بمجرد نسخ ملف zipfile إلى RPI ، قم بتسجيل الدخول إليه باعتبارك مستخدم pi.

شغّل الآن:

قم بفك ضغط rover.zip

سيؤدي هذا إلى فك ضغط الملفات إلى مجلد باسم "rover" ويحتوي على ما يلي ضمن هذا المجلد:

  • restrover.py (رمز بيثون للروبوت)
  • ثابت (يحتفظ بملفات الصور للأزرار الموجودة في صفحة التحكم)
  • القوالب (تحتوي على ملف index.htlm ، صفحة التحكم على الويب)

إذا كنت تستخدم كاميرا ويب ، فقم بتعديل الخط بالقرب من الجزء السفلي من ملف index.html في مجلد القالب. غيّر عنوان URL في سطر IFRAME لمطابقة عنوان URL الخاص بـ src لدفق الفيديو.

الخطوة 11: بدء تشغيل الروبوت

بدء بوت أب
بدء بوت أب

قم بتوصيل طاقة USB بـ RPI.

لبدء رمز الروبوت ، قم بتسجيل الدخول باعتبارك مستخدم pi وقم بتشغيل:

  • روفر cd
  • sudo python restrover.py

إذا كان كل شيء على ما يرام ، يجب أن ترى شاشة مشابهة للصورة في هذه الخطوة

إذا رأيت أي أخطاء أو مشكلات ، فسيتعين عليك إصلاحها قبل المضي قدمًا.

الآن ، قم بتوصيل سلك GND (-) بطرف NEG (-) على مدخل طاقة محرك RoboClaw.

الخطوة 12: الوصول إلى صفحة التحكم في الروبوت

الوصول إلى صفحة التحكم في البوت
الوصول إلى صفحة التحكم في البوت
الوصول إلى صفحة التحكم في البوت
الوصول إلى صفحة التحكم في البوت

بعد تشغيل نص python الخاص بالروبوت ، قم بتشغيل RoboClaw ثم انتقل إلى عنوان IP الخاص بـ RPI مثل:

your_rpi_ip

يجب أن ترى صفحة التحكم في الويب منبثقة كما في الصور. إذا لم يكن الأمر كذلك ، فتحقق من محطة إخراج RPI وابحث عن أي أخطاء وقم بتصحيحها.

بمجرد وصولك إلى الصفحة ، تكون جاهزًا للتحكم في الروبوت.

سيبدأ الروبوت في إعداد "Med run" وبسرعة متوسطة.

يمكن التحكم في الروبوت عبر الأزرار الموجودة على الصفحة أو عن طريق المفاتيح الموجودة على لوحة المفاتيح.

المفاتيح هي:

  • ث - إلى الأمام
  • ض - عكس / للخلف
  • أ - يسار طويل
  • ق - منعطف طويل لليمين
  • ف - انعطاف يسار قصير
  • هـ - انعطاف يمين قصير
  • 1 - عموم الكاميرا اليسرى
  • 2 - عموم الكاميرا اليمنى
  • 3 - عموم اليسار الكامل
  • 4 - عموم يمين كامل
  • / - الكاميرا الرئيسية / المركزية
  • ح - وقف / إيقاف الروبوت

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

يجب أن تكون بقية الضوابط والتحكم بها تفسيرية.

الخطوة 13: كود Python / Flask

يستخدم هذا الروبوت Python وإطار عمل Flask للويب. يمكنك معرفة المزيد عن Flask هنا إذا كنت مهتمًا.

الاختلاف الكبير بين تطبيق Flask ونص Python العادي هو فئة / طريقة @ app.route المستخدمة في معالجة URI. بخلاف ذلك ، تعتبر لغة Python طبيعية إلى حد كبير في معظم الأحيان.

#! / usr / bin / env python

# # Wifi / Web مدفوعة Rover # # كتب بواسطة Scott Beasley - 2015 # # يستخدم RPIO و pyserial و Flask # استيراد تسلسل وقت الاستيراد من RPIO استيراد PWM من flask import Flask ، render_template ، طلب التطبيق = Flask (_name_ ، static_url_path = ") # اتصل بمنفذ الاتصال للتحدث إلى وحدة التحكم في محرك Roboclaw حاول: # قم بتغيير معدل البث بالباود هنا إذا كان مختلفًا عن 19200 roboclaw = serial. Serial ('/ dev / ttyAMA0'، 19200) باستثناء IOError: print ("منفذ الاتصال ليس وجدت ") sys.exit (0) # متغيرات السرعة والتحكم في القيادة last_direction = -1 speed_offset = 84 turn_tm_offset = 0.166 run_time = 0.750 # وضع محايد مؤازر (منزلي) servo_pos = 1250 servo = PWM. Servo () servo.set_servo (18 ، servo_pos) # توقف قليلاً عن تسوية وقت النوم. (3) # # معالجات URI - تتم جميع إجراءات صفحة البوت هنا # # أرسل صفحة التحكم في الروبوتات (الصفحة الرئيسية) @ app.route ("/") def index (): return render_template ('index.html'، name = None) @ app.route ("/ forward") def forward (): global last_direction، run_ti أنا أطبع "Forward" go_forward () last_direction = 0 # sleep 100ms + run_time time.sleep (0.100 + run_time) # إذا لم يكن الأمر مستمرًا ، فقم بالتوقف بعد التأخير إذا كان وقت التشغيل> 0: last_direction = -1 توقف () إرجاع "موافق" @ app.route ("/ backward") def backward (): last_direction العام ، run_time print "Backward" go_backward () last_direction = 1 # sleep 100ms + run_time time.sleep (0.100 + run_time) # إذا لم يكن الأمر مستمرًا ، فقم بالتوقف بعد التأخير if run_time> 0: last_direction = -1 halt () إرجاع "ok" @ app.route ("/ left") def left (): global last_direction ، turn_tm_offset print "Left" go_left () last_direction = -1 # sleep @ 1 / 2 ثانية time.sleep (0.500 - turn_tm_offset) # stop halt () time.sleep (0.100) إرجاع "ok" @ app.route ("/ right") def right (): global last_direction ، turn_tm_offset print "Right" go_right () # sleep @ 1/2 second time.sleep (0.500 - turn_tm_offset) last_direction = -1 # stop halt () time.sleep (0.100) إرجاع "ok" @ app.route ("/ ltforward") def ltforward (): global last_direction، turn_t m_offset print "Left forward turn" go_left () # sleep @ 1/8 second time.sle (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop halt () time.sleep (0.100) إرجاع "ok"app.route ("/ rtforward") def rtforward (): last_direction العام ، turn_tm_offset print "Right forward turn" go_right () # sleep @ 1/8 second time.sleep (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop halt () time.sleep (0.100) إرجاع "ok" @ app.route ("/ stop") def stop (): global last_direction print "Stop" halt () last_direction = -1 # sleep 100ms time.sleep (0.100)) إرجاع "ok" @ app.route ("/ panlt") def panlf (): servo_pos العام طباعة "Panlt" servo_pos - = 100 إذا servo_pos 2500: servo_pos = 2500 servo.set_servo (18، servo_pos) # سكون 150 مللي ثانية. sleep (0.150) إرجاع "ok" @ app.route ("/ home") def home (): servo_pos العام طباعة "Home" servo_pos = 1250 servo.set_servo (18، servo_pos) # سكون 150 مللي ثانية time.sleep (0.150) عودة "ok" @ app.route ("/ panfull_lt") def panfull_lt (): servo_pos print "Pan full l eft "servo_pos = 500 servo.set_servo (18، servo_pos) # sleep 150ms time.sleep (0.150) إرجاع" ok "@ app.route (" / panfull_rt ") def panfull_rt (): servo_pos print العمومية" Pan full right "servo_pos = 2500 servo.set_servo (18، servo_pos) # sleep 150ms time.sleep (0.150) إرجاع "ok" @ app.route ("/ speed_low") def speed_low (): global speed_offset، last_direction، turn_tm_offset speed_offset = 42 turn_tm_offset = 0.001 # تحديث الاتجاه الحالي للحصول على سرعة جديدة إذا كان last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) إرجاع "ok" @ app.route ("/ speed_mid") def speed_mid (): global speed_offset، last_direction، turn_tm_offset speed_offset = 84 turn_tm_offset = 0.166 # قم بتحديث الاتجاه الحالي للحصول على سرعة جديدة إذا كان last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) إرجاع "ok" @ app.route ("/ speed_hi") def speed_hi (): global speed_offset، last_direction، turn_tm_offset speed_offset = 126 tur n_tm_offset = 0.332 # تحديث الاتجاه الحالي للحصول على سرعة جديدة إذا كان last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) إرجاع "ok" @ app.route ("/ مستمر ") def مستمر (): وقت التشغيل العام print" Continuous run "run_time = 0 # sleep 100ms time.sleep (0.100) إرجاع" ok "@ app.route (" / mid_run ") def mid_run (): run_time global print" منتصف تشغيل "run_time = 0.750 halt () # sleep 100ms time.sleep (0.100) إرجاع" ok "@ app.route (" / short_time ") def short_time (): run_time العام طباعة" Short run "run_time = 0.300 halt () # sleep 100ms time.sleep (0.100) إرجاع "موافق" # # وظائف محرك المحرك # def go_forward (): speed_offset الشاملة if speed_offset! = 42: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (128 + speed_offset)) else: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (255 - speed_offset)) def go_backward (): global speed_offset if speed_offset! = 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.wri te (chr (255 - speed_offset)) else: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (128 + speed_offset)) def go_left (): global speed_offset if speed_offset! = 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) else: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) def go_right (): global speed_offset if speed_offset! = 42: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) else: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) def halt (): roboclaw.write (chr (0)) if _name_ == "_main_": app.run (المضيف = '0.0.0.0' ، المنفذ = 80 ، التصحيح = صحيح)

إذا كنت لا تريد أو تحتاج إلى معلومات تصحيح الأخطاء من Flask ، فاضبط التصحيح على "خطأ" في سطر app.run.

إذا _name_ == "_main_":

app.run (المضيف = '0.0.0.0' ، المنفذ = 80 ، التصحيح = خطأ)

يمكنك أيضًا تغيير المنفذ الذي يستمع إليه خادم Flask http هنا أيضًا.

الخطوة 14: استخدام أجهزة أخرى

إذا كنت ترغب في استخدام أجهزة أخرى ، مثل نوع آخر من SBC (كمبيوتر لوحة واحدة) ، فستواجه مشكلات قليلة في تشغيل Python و Flask على لوحات أخرى مثل Beagle Bone و PCDuino وما إلى ذلك … سيتعين عليك تغيير الكود لمطابقة GPIO تخطيط واستخدام قدرات القيادة المؤازرة للوحة الجديدة.

لاستخدام برنامج تشغيل محرك من نوع آخر ، تحتاج فقط إلى تعديل وظائف go_forward ، و go_backward ، و go_left ، و go_right ، والتوقف لفعل ما يحتاجه سائق المحرك البديل لجعل المحرك يقوم بهذه الوظيفة المحددة.

موصى به: