جدول المحتويات:
- الخطوة 1: اجمع المواد الخاصة بك
- الخطوة 2: قم بتنزيل Roomba Toolboxes لـ MATLAB
- الخطوة 3: قم بالاتصال بجهاز Roomba الخاص بك
- الخطوة 4: اختر كيف تريد التحكم في جهاز Roomba الخاص بك
- الخطوة 5: قيادة جهاز Roomba الخاص بك
فيديو: تحويل جهاز Roomba الخاص بك إلى مركبة Mars Rover: 5 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:36
الخطوة 1: اجمع المواد الخاصة بك
لإكمال هذا المشروع ، ستحتاج إلى جمع المواد التالية:
1 روبوت رومبا
1 مجموعة Raspberry Pi Kit
1 كاميرا فيديو
الوصول إلى MATLAB
الخطوة 2: قم بتنزيل Roomba Toolboxes لـ MATLAB
قم بتشغيل التعليمات البرمجية التالية لتثبيت مربعات الأدوات اللازمة لإكمال هذا المشروع.
غرفة وظيفة
clc.
قائمة٪ من الملفات المراد تثبيتها
files = {'roomba.m'، 'roombaSim.m'، 'roombaSimGUI.m'، 'roombaSimGUI.fig'} ؛
٪ موقع للتثبيت منه
الخيارات = خيارات الويب ('CertificateFilename'، ') ؛ ٪ أخبره بتجاهل متطلبات الشهادة
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/' ؛
dlgTitle = 'تثبيت / تحديث Roomba'؛
٪ عرض الغرض والحصول على تأكيد
موجه = {
سيقوم هذا البرنامج بتنزيل ملفات EF 230 Roomba هذه:
''
strjoin (الملفات ، )
''
"إلى هذا المجلد:"
''
قرص مضغوط
''
'هل تريد الاستمرار؟"
};
زمارة؛
yn = Questdlg (موجه ، …
dlgTitle ، …
"نعم" ، "لا" ، "نعم") ؛
إذا كان ~ strcmp (yn ، "نعم") ، فارجع ؛ نهاية
٪ الحصول على قائمة الملفات الموجودة
Current_files = files (cellfun (exist، files)> 0) ؛
إذا كان ~ فارغًا (الملفات الموجودة)
٪ تأكد من أنه لا بأس حقًا لاستبدالها
موجه = {'أنت تستبدل هذه الملفات:'
''
strjoin (الملفات الموجودة ، )
''
"موافق ليحل محل؟"
};
زمارة؛
yn = Questdlg (موجه ، …
dlgTitle ، …
"نعم" ، "لا" ، "نعم") ؛
إذا كان ~ strcmp (yn ، "نعم") ، فارجع ؛ نهاية
نهاية
٪ تنزيل الملفات
cnt = 0 ؛
بالنسبة إلى i = 1: الطول (الملفات)
f = الملفات {i} ؛
disp (['Downloading' f]) ؛
محاولة
url = [الخادم f] ؛
حفظ الويب (f ، url ، خيارات) ؛ أضاف٪ خيارات لتجنب الأخطاء الأمنية
cnt = cnt + 1 ؛
يمسك
disp (['خطأ في التنزيل' f]) ؛
dummy = [f '.html'] ؛
إذا كان موجودًا (وهمي ، "ملف") == 2
حذف (وهمي)
نهاية
نهاية
نهاية
إذا كان cnt == طول (ملفات)
msg = "تم التثبيت بنجاح" ؛
waitfor (msgbox (msg، dlgTitle)) ؛
آخر
msg = 'خطأ في التثبيت - راجع نافذة الأوامر للحصول على التفاصيل' ؛
waitfor (errordlg (msg، dlgTitle)) ؛
نهاية
نهاية٪ roomba تثبيت
الخطوة 3: قم بالاتصال بجهاز Roomba الخاص بك
حان الوقت الآن للاتصال بـ Roomba الخاص بك باستخدام WiFi. باستخدام إصبعين ، اضغط على زري Dock و Spot في نفس الوقت لتشغيل جهاز Roomba أو إعادة تعيينه. بعد ذلك ، قم بتشغيل الكود r = roomba (# of Roomba الخاص بك) في نافذة أوامر MATLAB للاتصال بالروبوت الخاص بك. بمجرد تنفيذ هذا الأمر ، يجب أن يكون جهاز Roomba جاهزًا للعمل.
الخطوة 4: اختر كيف تريد التحكم في جهاز Roomba الخاص بك
هناك طريقتان يمكنك من خلالهما التحكم في جهاز Roomba الخاص بك: بشكل مستقل أو باستخدام هاتف ذكي كوحدة تحكم.
إذا اخترت قيادة Roomba بشكل مستقل ، فستحتاج إلى استخدام المستشعرات الثلاثة المدمجة: مستشعرات المنحدرات ، وأجهزة استشعار الصدمات ، وأجهزة استشعار الضوء.
من أجل استخدام الهاتف الذكي ، تحتاج أولاً إلى توصيل هاتفك الذكي بجهاز الكمبيوتر الخاص بك باتباع الخطوات أدناه.
ملاحظة: يجب أن يكون جهاز الكمبيوتر والهاتف الذكي على نفس شبكة WiFi للاتصال بشكل صحيح!
1. قم بتنزيل تطبيق MATLAB من متجر التطبيقات على جهازك.
2. اكتب "connector on" في نافذة الأوامر الخاصة بك وقم بتعيين كلمة مرور يجب إدخالها في كلا الجهازين.
3. بعد القيام بذلك ، ستعطيك MATLAB عنوان IP لجهاز الكمبيوتر الخاص بك. تحتاج إلى الانتقال إلى صفحة الإعدادات في تطبيق MATLAB على هاتفك الذكي وإضافة جهاز كمبيوتر باستخدام عنوان IP المحدد وكلمة المرور التي أدخلتها سابقًا.
4. في نافذة الأوامر على جهاز الكمبيوتر الخاص بك ، اكتب الرمز m = mobiledev وسيؤدي ذلك إلى تهيئة هاتفك الذكي كوحدة تحكم في Roomba.
5. يجب أن يكون جهاز الكمبيوتر والهاتف الذكي جاهزين للعمل الآن.
الخطوة 5: قيادة جهاز Roomba الخاص بك
الآن بعد أن أصبح لديك جميع الأدوات اللازمة لإنشاء Mars Rover الخاص بك ، فأنت جاهز لإنشاء الكود الخاص بك. لقد أرفقنا مثالًا للرمز أدناه لكل من القيادة الذاتية والقيادة التي يتحكم فيها الهاتف الذكي.
القيادة الذاتية
الوظيفة Explore_modified (r)
٪ وسيطات الإدخال: كائن roomba واحد ، r
٪ وسيطات الإخراج: لا شيء
٪وصف:
تستخدم دالة٪ حلقة أثناء لانهائية للسماح بالاستقلالية
٪ استكشاف محيط الروبوت.
%
يوفر٪ funciton أيضًا إرشادات إلى غرفة Roomba حول ما يجب القيام به
٪ الحالات التالية: تفقد العجلة (العجلات) الاتصال بالأرض ، و
تم اكتشاف كائن٪ أمام الروبوت أو على أحد جانبيه ، و a
٪ تم الكشف عن انخفاض مفاجئ أمام الروبوت أو على أحد جانبيه.
%
تتضمن التعليمات النموذجية٪ أوامر حركة تهدف إلى التعظيم
٪ استكشاف أو تجنب اكتشاف خطر وأوامر للتواصل
النسبة المئوية للمعلومات المتعلقة باكتشافات الروبوتات (الصور) والموضع (الرسم البياني) ،
٪ والدولة (تحذير تقطعت بهم السبل) مع المستخدم عبر matlab و / أو البريد الإلكتروني. العديد من
تمت إضافة٪ من الأوامر الصوتية للاستمتاع.
٪ قدرات إعداد البريد الإلكتروني
mail = '[email protected]' ؛
كلمة المرور = 'EF230Roomba' ؛
setpref ("الإنترنت" ، "SMTP_Server" ، "smtp.gmail.com") ؛
setpref ("الإنترنت" ، "البريد الإلكتروني" ، البريد) ؛
setpref ("الإنترنت" ، "SMTP_Username" ، البريد) ؛
setpref ("الإنترنت" ، "SMTP_Password" ، كلمة المرور) ؛
props = java.lang. System.getProperties ؛
props.setProperty ('mail.smtp.starttls.enable'، 'true') ؛
props.setProperty ('mail.smtp.auth'، 'true') ؛
props.setProperty ('mail.smtp.socketFactory.class'، 'javax.net.ssl. SSLSocketFactory') ؛
props.setProperty ('mail.smtp.socketFactory.port'، '465') ؛
٪ r = roomba (19)
r.beep ('G2 ^^ ، G2 ^^ ، G2 ^^ ، G2 ^^ ، A2 ^^ ، A2 ^^ ، G1 ^^ ، E1 ^^ ، C2 ^^ ، C2 ^^ ، C1 ^^ ، C1 ^^ ، D1 ^^ ، C1 ^^ ، D2 ^^ ، E4 ^^ ، G2 ^^ ، G2 ^^ ، G2 ^^ ، G2 ^^ ، A2 ^^ ، A2 ^^ ، G1 ^^ ، E1 ^^ ، C2 ^^ ، C2 ^^ ، C2 ^^ ، E1 ^^ ، E1 ^^ ، E1 ^^ ، D1 ^^ ، C4 ^^ ') ؛
الخامس =.1 ؛
انعكاس_البيانات = 2700 ؛ ٪ تعيين القيمة المرجعية لأجهزة استشعار المنحدرات
lightBumper_datum = 200 ؛ ٪ تعيين القيمة المرجعية لأجهزة استشعار المصد الضوئي
نقاط البيع = [0 ، 0] ؛ متغير٪ لتخزين الموقع مع تهيئة مرجع البيانات
زاوية = 0 ؛ ٪ تعيين الزاوية المرجعية
netangle = 0 ؛ ٪ صافي زاوية الإزاحة
أنا = 2 ؛ مكرر النسبة المئوية لإضافة صفوف لوضع متغير التخزين
Dist = 0 ؛
r.setDriveVelocity (v ، v) ؛ ٪ بدء roomba المضي قدمًا
احيانا صحيح
كليف = r.getCliffSensors ؛
نتوء = r.getBumpers ؛
الضوء = r.getLightBumpers ؛
RandAngle = randi ([20، 60]، 1) ؛ ٪ يولد زاوية عشوائية واحدة بين 20 و 60 درجة. تستخدم لمنع الروبوت من التعثر في حلقة
٪ ماذا تفعل إذا فقدت عجلة أو أكثر ملامستها للأرض:
٪ إيقاف الحركة ، إرسال بريد إلكتروني تحذيري به صورة من المناطق المحيطة ،
٪ واسأل المستخدم ما إذا كان يجب المتابعة أو انتظار المساعدة
إذا كان Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
r.beep ('F # 1 ^^ ، C1 ^^ ، F # 1 ^^ ، C1 ^^ ، F # 1 ^^ ، C1 ^^ ، F # 1 ^^ ، C1 ^^ ، F # 1 ^^ ، C1 ^^ ، F # 1 ^^ ، C1 ^^ ، F # 1 ^^ ، C1 ^^ ، F # 1 ^^ ، C1 ^^ ')
img = r.getImage ؛
imwrite (img، 'stuck.png')؛
%--------------------------
imfile = 'stuck.png' ؛
الموقف = سافيبوس (نقاط البيع) ؛
%---------------------------
sendmail (mail، 'HELP!'، 'أنا عالق على منحدر!'، {imfile، position})
list = {'Continue'، 'Stop'} ؛
idx = menu ("ماذا أفعل؟" ، قائمة) ؛
إذا معرف == 2
استراحة
نهاية
٪ ما يجب فعله إذا تم اكتشاف كائن أمام الروبوت:
٪ توقف ، تراجع ، التقاط صورة ، تنبيه مستخدم الاكتشاف
٪ عبر البريد الإلكتروني ، أدر 90 درجة ، واستمر في الاستكشاف
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r.stop.
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
المسافة r.move (- 125) ؛
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
r.beep ('A1 ^، A1 ^، A4 ^، A2 ^، G2 ^، G2 ^، G4 ^، Bb2 ^، Bb2 ^، Bb3.5 ^، G1 ^، A8 ^')
img = r.getImage ؛
imwrite (img، 'FrontBump.png')
%--------------------------
imfile = 'FrontBump.png' ؛
الموقف = سافيبوس (نقاط البيع) ؛
%---------------------------
sendmail (mail، 'Alert!'، 'I found something!'، {imfile، position})
الزاوية = 90 ؛
netangle = netangle + زاوية ؛
ص زاوية الدوران (زاوية) ؛
r.setDriveVelocity (v ، v) ؛
٪ ما يجب فعله إذا تم اكتشاف كائن على يسار الروبوت:
٪ توقف ، استدر نحو الكائن ، نسخ احتياطي ، التقاط صورة ، تنبيه
٪ مستخدم الاكتشاف عبر البريد الإلكتروني ، أدر 90 درجة واستمر في الاستكشاف
elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1
r.stop.
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
الزاوية = 30 ؛
netangle = netangle + زاوية ؛
ص زاوية الدوران (زاوية) ؛
المسافة r.move (- 125) ؛
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
r.beep ('A4 ^ ، A4 ^ ، G1 ^ ، E1 ^ ، C3.5 ^ ، C2 ^^ ، C1 ^ ، C1 ^ ، C2 ^ ، D2 ^ ، D2 ^ ، E8 ^')
img = r.getImage ؛
imwrite (img، 'LeftBump.png')
%--------------------------
imfile = 'LeftBump.png' ؛
الموقف = سافيبوس (نقاط البيع) ؛
%---------------------------
sendmail (mail، 'Alert!'، 'I found something!'، {imfile، position})
زاوية = -90 ؛
netangle = netangle + زاوية ؛
ص زاوية الدوران (زاوية) ؛
r.setDriveVelocity (v ، v) ؛
٪ ما يجب فعله إذا تم اكتشاف كائن على يمين الروبوت:
٪ توقف ، استدر نحو الكائن ، نسخ احتياطي ، التقاط صورة ، تنبيه
٪ مستخدم الاكتشاف عبر البريد الإلكتروني ، أدر 90 درجة واستمر في الاستكشاف
elseif Light.right> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r.stop.
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
زاوية = -30 ؛
netangle = netangle + زاوية ؛
ص زاوية الدوران (زاوية) ؛
المسافة r.move (- 125) ؛
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
وقفة (1.5) ؛
r.beep ('C1 ^ ، C1 ^ ، C2 ^ ، D2 ^ ، D2 ^ ، C8 ^')
img = r.getImage ؛
imwrite (img، 'RightBump.png')
%--------------------------
imfile = 'RightBump.png' ؛
الموقف = سافيبوس (نقاط البيع) ؛
%---------------------------
sendmail (mail، 'Alert!'، 'لقد وجدت شيئًا!'، {imfile، position}) ؛
الزاوية = 90 ؛
netangle = netangle + زاوية ؛
ص زاوية الدوران (زاوية) ؛
r.setDriveVelocity (v ، v) ؛
٪ ماذا تفعل إذا تم الكشف عن جرف على يسار الروبوت:
٪ توقف ، تحرك للخلف ، انعطف يمينًا ، تابع الاستكشاف
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r.stop.
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
المسافة r.move (- 125) ؛
Dist = r.getDistance ؛
pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = pos (i-1، 2) + dist * cosd (netangle) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
زاوية = زاوية الراند.
netangle = netangle + زاوية ؛
ص زاوية الدوران (زاوية) ؛
r.setDriveVelocity (v ، v) ؛
٪ ماذا تفعل إذا تم الكشف عن جرف على يمين الروبوت:
٪ توقف ، تحرك للخلف ، انعطف يسارًا ، تابع الاستكشاف
elseif Cliff.right <reflect_datum || Cliff.right الجبهة <reflect_datum
r.stop.
Dist = r.getDistance ؛
pos (i ، 1) = dist * sind (زاوية) ؛ ٪ الحصول على إحداثيات س
pos (i، 2) = dist * cosd (زاوية) ؛ ٪ الحصول على إحداثيات ص
أنا = أنا + 1 ؛
المسافة r.move (- 125) ؛
زاوية = RandAngle ؛
netangle = netangle + زاوية ؛
ص زاوية الدوران (زاوية) ؛
r.setDriveVelocity (v ، v) ؛
نهاية
نهاية
تحكم الهاتف الذكي
الخيارات = {'Autonomous'، 'Manual Control'}
موجه = قائمة ("كيف تريد التحكم في العربة الجوالة؟" ، الخيارات)
م = mobiledev
ص = رومبا (19)
إذا موجه == 1
اكتشف (ص)
آخر
احيانا صحيح
وقفة (.5)
PhoneData = m. Orientation ؛
Azi = PhoneData (1) ،
الملعب = بيانات الهاتف (2) ؛
الجانب = بيانات الهاتف (3) ؛
إذا كان الجانب> 130 || الجانب <-130٪ إذا تم قلب الهاتف ووجهه لأسفل ، فقم بإيقاف غرفة Roomba واخرج من الحلقة
r.stop
r.beep ("C ، C ، C ، C")
استراحة
elseif Side> 25 && Side <40٪ إذا تم تدوير الهاتف بشكل جانبي بين 25 و 40 درجة ، انعطف يسارًا بمقدار 5 درجات
r.turnAngle (-5) ؛
elseif Side> 40٪ إذا تم تدوير الهاتف بشكل جانبي أكثر من 40 درجة ، انعطف يسارًا 45 درجة
ص زاوية الدوران (-45)
elseif Side-40٪ إذا تم تدوير الهاتف بشكل جانبي بين -25 و -40 درجة ، اتجه يمينًا بمقدار 5 درجات
ص زاوية الدوران (5) ؛
elseif Side <-40٪ إذا كان الهاتف مقلوبًا بشكل جانبي أقل من -40 درجة اتجه يسارًا 45 درجة
ص زاوية الدوران (45)
نهاية
٪ إذا تم حمل الهاتف بالقرب من عمودي ، التقط صورة وقم برسمها
إذا كان الملعب <-60 && image <= 9
r.beep
img = r.getImage ؛
حبكة فرعية (3 ، 3 ، صورة)
imshow (IMG)
نهاية
٪ تتحرك للأمام والخلف بناءً على الاتجاه الأمامي والخلفي
إذا كانت الملعب> 15 && Pitch <35٪ إذا كان الملعب بين 15 و 35 درجة يتحرك للأمام مسافة قصيرة
٪ الحصول على بيانات المصد الخفيف قبل التحرك
litBump = r.getLightBumpers ،
إذا كان litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500٪ إذا كان هناك شيء ما أمام غرفة Roomba وسيضرب إذا تحرك للأمام يصدر ضوضاء وعرض رسالة
r.beep ('C ^^، F # ^، C ^^، F # ^')
آخر٪ تحرك
r.moveDistance (.03) ؛
٪ الحصول على بيانات الوفير بعد التحرك
نتوء = r.getBumpers ؛
إذا كان Bump.right == 1 || Bump.left == 1 || Bump.front == 1
r.beep ("A، C، E")
المسافة (- 01)
نهاية
٪ الحصول على بيانات مستشعر الجرف
كليف = r.getCliffSensors ؛
إذا كان Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff. Refront> 1500 || Cliff.right> 1500٪ إذا تسبب شيء ما في تشغيل مستشعر الجرف ، فقم بالتعامل معه على أنه حمم بركانية وقم بعمل نسخة احتياطية
r.beep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C')
المسافة r.move (- 031)
نهاية
نهاية
elseif درجة الصوت> 35٪ إذا كانت النغمة أكبر من 35 درجة تحرك للأمام مسافة أطول
٪ الحصول على بيانات المصد الخفيف قبل التحرك
litBump = r.getLightBumpers ،
إذا كان litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15٪ إذا كان هناك شيء ما أمام غرفة roomba وسيضرب إذا تحرك للأمام يصدر ضوضاء وعرض رسالة
r.beep ('C ^^، F # ^، C ^^، F # ^')
آخر٪ تحرك
المسافة (.3)
٪ الحصول على بيانات الوفير بعد التحرك
نتوء = r.getBumpers ؛
إذا كان Bump.right == 1 || Bump.left == 1 || Bump.front == 1٪ إذا اصطدمت بشيء ما ، فتحدث ضوضاء ، وعرض الرسالة ، والنسخ الاحتياطي
r.beep ("A، C، E")
المسافة (- 01)
نهاية
٪ الحصول على بيانات مستشعر الجرف بعد التحرك
كليف = r.getCliffSensors ؛
إذا كان Cliff.left> 1500 || Cliff.leftFront> 1500 || كليف اليمين الأمامي> 1500 || Cliff.right> 1500٪ إذا تسبب شيء ما في تشغيل جهاز استشعار الجرف ، فقم بالتعامل معه على أنه حمم بركانية وقم بعمل نسخة احتياطية
r.beep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C')
المسافة (- 31)
نهاية
نهاية
elseif الملعب - 35٪ إذا كان الملعب بين -15 و -35 درجة يتحرك للخلف مسافة قصيرة
r.moveDistance (-. 03) ؛
٪ الحصول على بيانات مستشعر الجرف بعد التحرك
كليف = r.getCliffSensors ؛
إذا كان Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff. Refront> 1500 || Cliff.right> 1500٪ إذا تسبب شيء ما في تشغيل مستشعر الجرف ، فقم بالتعامل معه على أنه حمم بركانية وقم بعمل نسخة احتياطية
r.beep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C')
المسافة r.move (.04)
نهاية
elseif درجة الصوت -60٪ إذا كان الملعب بين -35 و -60 درجة تحرك للخلف مسافة أطول
المسافة (-.3)
٪ الحصول على بيانات مستشعر الجرف بعد التحرك
كليف = r.getCliffSensors ؛
إذا كان Cliff.left> 1500 || Cliff.leftFront> 1500 || كليف اليمين الأمامي> 1500 || Cliff.right> 1500٪ إذا تسبب شيء ما في تشغيل مستشعر الجرف ، فقم بالتعامل معه على أنه حمم بركانية وقم بعمل نسخة احتياطية
r.beep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C، C ^^، C، C ^^، C')
المسافة (.31)
نهاية
نهاية
نهاية
نهاية
موصى به:
كيفية تحويل جهاز كمبيوتر أو كمبيوتر محمول قديم / تالف إلى صندوق وسائط: 9 خطوات
كيفية تحويل الكمبيوتر الشخصي أو الكمبيوتر المحمول القديم / التالف إلى صندوق وسائط: في عالم تتقدم فيه التكنولوجيا بأسرع مما نحن عليه الآن ، تصبح أجهزتنا الإلكترونية المحببة عفا عليها الزمن بسرعة. ربما طرقت قططك المحببة جهاز الكمبيوتر المحمول الخاص بك على الطاولة وتحطمت الشاشة. أو ربما تريد صندوق وسائط لتلفزيون ذكي
كيفية تحويل Raspberry Pi الخاص بك إلى بوابة وصول عن بعد: 6 خطوات
كيف تحول Raspberry Pi إلى بوابة وصول عن بعد: مرحبًا يا رفاق! في ضوء الأحداث الجارية مؤخرًا ، عمل فريقنا في remote.it بجد في تبادل الأفكار لجعل العمل عن بُعد غير مؤلم ويمكن الوصول إليه. لقد توصلنا إلى remote.itPi SD Card Image ، وهي بطاقة SD يمكنك وضعها في
قم بتحويل جهاز التحكم عن بعد IR الخاص بك إلى جهاز التحكم عن بعد RF: 9 خطوات (بالصور)
قم بتحويل جهاز التحكم عن بعد IR الخاص بك إلى جهاز التحكم عن بعد RF: في Instructable اليوم ، سأوضح لك كيف يمكنك استخدام وحدة RF العامة بدون وحدة تحكم دقيقة والتي ستقودنا في النهاية إلى بناء مشروع حيث يمكنك تحويل IR Remote لأي جهاز إلى RF بعيد. الميزة الرئيسية لتحويل
احصل على ألبوم من جهاز iPod الخاص بك إلى جهاز iTunes الخاص بك: 5 خطوات
احصل على ألبوم من Ipod الخاص بك إلى iTunes الخاص بك!: لقد لاحظت أن الكثير من الناس لديهم فكرة أنه يتعين عليك تنزيل برنامج جديد بالكامل ، أو البحث في أسماء الملفات المشفرة ، للحصول على الموسيقى الموجودة في جهاز iPod الخاص بك ووضعها في جهاز الكمبيوتر الخاص بك ، إنه في الواقع سهل جدًا ، ويمكنك حتى العثور على ألبو معين
تحويل مشغل MP3 الخاص بي إلى منفذ USB مباشر وبطارية قابلة للاستبدال: 3 خطوات
تحويل مشغل MP3 الخاص بي إلى منفذ USB مباشر وبطارية قابلة للاستبدال: سأوضح لك في هذا الدليل كيفية تحويل i-pod shuffle إلى منفذ USB مباشر (باستخدام مشغل mp3 إلى الكمبيوتر دون استخدام محول) وإلى استبدل البطارية المدمجة ببطارية الهاتف المحمول والهاتف المحمول ب