هذا هو تاريخ موجز لإنشاء روبوت مستقل تحت الماء من قبل مدير متوسط للغاية. الهدف الحالي هو إنشاء خريطة حديثة لممر نهر موسكو. عند البحث ، لا توجد مشكلة في العثور على مثل هذه الخريطة ، ولكن أهميتها تثير السؤال. قاع النهر يتغير باستمرار. يحدث تآكل ضفاف النهر وتتغير خريطة القناة. هذه العمليات ملحوظة بشكل خاص ، نظرًا لتغذية ثلج نهر موسكو (61 ٪) والأرضية (27 ٪) والمطر (12 ٪). الهدف النهائي هو إنشاء روبوت متعدد الوظائف تحت الماء لدراسة أعماق البحار. تتم دراسة المحيطات ، التي تغطي 2/3 من سطح الأرض ، بنسبة 5٪ فقط. لإنشاء روبوت مستقل ، تحتاج إلى "طيار آلي" بسيط.كيفية جعل طيار آلي سهل وبأسعار معقولة لمشاريع DIY والإبحار عليه على طول نهر موسكو؟
نهر موسكو هو الممر المائي الرئيسي لمدينة موسكو ، ويبلغ طوله داخل المدينة 80 كم. يتراوح عرض النهر داخل المدينة من 120 إلى 200 متر ، من أضيق جزء بالقرب من الكرملين إلى أوسع قرب لوجنيكي. من المقبول عمومًا أن معدل تدفق النهر 0.5 م / ث. ظروف مواتية تماما لاختبار الروبوت.قد يكون صنع قارب أكثر كفاءة وأسهل ، ولكن مهمة صنع روبوت تحت الماء تبدو أكثر إثارة للاهتمام.البناء
روبوت غواصة لاستكشاف مياه نهر موسكو.
الترتيب التقريبي للعناصر التي رأيتها على النحو التالي.
تثبيت محرك التجميع
، توجيه القيادة
المؤازرة ، عمق التوجيه المؤازر
، كمزحة ، يمكنني القول أنني أستعد لمسابقة X-Prize .يبقى لتوفير 2000 دولار. :)
The registration deadline is 30 June, 2016 (11:59 PM UTC/4:59 PM PST). The registration fee is $2,000.00 USD.
الهدف هو تطوير روبوت مستقل تحت الماء ، وليس ROV . (مركبة تعمل تحت الماء عن بعد).الجزء الإلكتروني ليس صعبًا وجودةالتصميم هي Arduino nano + L293D + Bluetooth + 3 servo + Power bank (شكر خاص إلى المتجر عبر الإنترنت الذي تم بيعه بسعر 3 سنتات). متصل بشكل منفصل بهاتف Power Bank الذكي Samsung Galaxy S3 للحفاظ على الشحن. الهاتف الذكي يتواصل مع Arduino عبر البلوتوث.برامج الإدارة
"نحن نلتقي بمصيرنا على الطريق الذي اخترنا أن نتركه منه"
جان دي لافونتينحاولت دائمًا تجنب البرمجة على Android. عندما أصبح من الممكن تطوير تطبيق خفيف الوزن مع القدرة على التعرف على Android أثناء العمل ، استسلمت.لكن الوقت قد حان! في الواقع ، توقف عن إهدار المال على لوحات تحمل اسم اردوينو. كل ما تحتاجه موجود بالفعل في الهواتف الذكية القديمة. في متناول اليد كان Samsung Galaxy S3 وقليلاً من السحر.بصفتي مهووسًا لائقًا ، سألت سؤالًا عن محمصة الخبز . ربما سألت بجد. ربما سؤال سيئ الصياغة. وبدا على الأرجح أن هذا لم يكن سؤالاً. ولكن رداً على ذلك ، لم أحصل على ما توقعته.ياندكس لي في الخليج! جميع الطلبات "Android GPS" و "Programming Android GPS" وما إلى ذلك أعطت إجابات لم تعمل بالتأكيد على Android Studio.ما يريحني كان العثور على SL4A. اتضح أنه يمكنك إنشاء نموذج أولي وبرمجة على Android باستخدام Python. إنهم يسيطرون ، بعد كل شيء ، حتى على الصواريخ .SL4A بيثون
إذا كان لديك هاتف يعمل بنظام Android ، ولكن لديك واحد. أنت مهووس ، لست من محبي الفاكهة السكرية.نقوم بتثبيت اختيار برنامج للتعرف على رموز QR .لاستخدام SL4A ، يجب تثبيت التطبيق على هاتفك.
مترجم Python هنا.
أو QPython3 من الممكنكتابة البرامج على الهاتف ، ولكن لا يمكنك تسميتها .هناك مخرج:
http://habrahabr.ru/post/134184/, 9999 Android- (, 46136):
$ adb forward tcp:9999 tcp:46136
:
$ AP_PORT=9999
android.py Python', , , , . helloWorld Android- Python:
>>>import android
>>>droid = android.Android()
>>>droid.makeToast(«Hello, world!»)
android, droid, API Android'a. «Hello, World!» .
, API, SL4A.
بناء مسار. اختيار نقطة
باستخدام Yandex.maps أو Google.maps ، حدد النقاط في وسط النهر. هذا طريق وعرة. للاختبارات والإعداد ، أستخدم نسخة مقطوعة من النقاط.[55.671110 ، 37.686625] ، [55.668448 ، 37.675467] ، [55.660847 ، 37.671776] ، [55.654649 ، 37.671175]كيفية إنشاء طيار آلي سهل وبأسعار معقولة لمشاريع DIY من هاتف andoid و 70 سطرًا من التعليمات البرمجية؟

كود الطيار الآليimport math,android,time
coordmas = [[55.671110, 37.686625],[55.668448, 37.675467],[55.660847, 37.671776],[55.654649, 37.671175]]
droid = android.Android()
droid.startSensingTimed(1,200)
droid.startLocating(5000, 30)
def getgps():
locs = droid.getLastKnownLocation()
gpspos = locs.result["gps"]
return gpspos
def distazim(llat1,llong1,llat2,llong2):
rad=6372795
lat1=llat1*math.pi/180.
lat2=llat2*math.pi/180.
long1=llong1*math.pi/180.
long2=llong2*math.pi/180.
cl1=math.cos(lat1)
cl2=math.cos(lat2)
sl1=math.sin(lat1)
sl2=math.sin(lat2)
delta=long2-long1
cdelta=math.cos(delta)
sdelta=math.sin(delta)
y=math.sqrt(math.pow(cl2*sdelta,2)+math.pow(cl1*sl2-sl1*cl2*cdelta,2))
x=sl1*sl2+cl1*cl2*cdelta
ad=math.atan2(y,x)
dist=ad*rad
x=(cl1*sl2)-(sl1*cl2*cdelta)
y=sdelta*cl2
z=math.degrees(math.atan(-y/x))
if(x<0):
z=z+180.
z2=(z+180.)%360.-180.
z2=-math.radians(z2)
anglerad2=z2-((2*math.pi)*math.floor((z2/(2*math.pi))))
angledeg=(anglerad2*180.)/math.pi
return [dist,angledeg]
def servoangle(azdiff):
if azdiff>10 or azdiff<-10:
deg=azdiff
if deg>90:
deg=90
if deg<-90:
deg=-90
return deg
gpspos=getgps()
oldlat = gpspos["latitude"]
oldlon = gpspos["longitude"]
for c in range(len(coordmas)):
curcoord=coordmas[c]
targetlat=curcoord[0]
targetlon=curcoord[1]
darange=11;
while darange>10:
gpspos=getgps()
curlat = gpspos["latitude"]
curlon = gpspos["longitude"]
time.sleep(0.5)
da=distazim(curlat,curlon,targetlat,targetlon)
darange = da[0]
dazimut = round(da[1])
pol=droid.sensorsReadOrientation()
pol2=pol.result
turn = round(pol2[0])
turn = (-turn) *180/ 3.2
azdiff=turn-dazimut
deg=servoangle(azdiff)
oldlat = curlat
oldlon = curlon
كود مع التعليقاتimport math,android,time
coordmas = [[55.671110, 37.686625],[55.668448, 37.675467],[55.660847, 37.671776],[55.654649, 37.671175]]
droid = android.Android()
droid.startSensingTimed(1,200)
droid.startLocating(5000, 30)
def getgps():
locs = droid.getLastKnownLocation()
gpspos = locs.result["gps"]
return gpspos
def distazim(llat1,llong1,llat2,llong2):
rad=6372795
lat1=llat1*math.pi/180.
lat2=llat2*math.pi/180.
long1=llong1*math.pi/180.
long2=llong2*math.pi/180.
cl1=math.cos(lat1)
cl2=math.cos(lat2)
sl1=math.sin(lat1)
sl2=math.sin(lat2)
delta=long2-long1
cdelta=math.cos(delta)
sdelta=math.sin(delta)
y=math.sqrt(math.pow(cl2*sdelta,2)+math.pow(cl1*sl2-sl1*cl2*cdelta,2))
x=sl1*sl2+cl1*cl2*cdelta
ad=math.atan2(y,x)
dist=ad*rad
x=(cl1*sl2)-(sl1*cl2*cdelta)
y=sdelta*cl2
z=math.degrees(math.atan(-y/x))
if(x<0):
z=z+180.
z2=(z+180.)%360.-180.
z2=-math.radians(z2)
anglerad2=z2-((2*math.pi)*math.floor((z2/(2*math.pi))))
angledeg=(anglerad2*180.)/math.pi
return [dist,angledeg]
def servoangle(azdiff):
if azdiff>10 or azdiff<-10:
deg=azdiff
if deg>90:
deg=90
if deg<-90:
deg=-90
return deg
gpspos=getgps()
oldlat = gpspos["latitude"]
oldlon = gpspos["longitude"]
for c in range(len(coordmas)):
curcoord=coordmas[c]
targetlat=curcoord[0]
targetlon=curcoord[1]
darange=11;
while darange>10:
gpspos=getgps()
curlat = gpspos["latitude"]
curlon = gpspos["longitude"]
time.sleep(0.5)
da=distazim(curlat,curlon,targetlat,targetlon)
darange = da[0]
dazimut = round(da[1])
pol=droid.sensorsReadOrientation()
pol2=pol.result
turn = round(pol2[0])
turn = (-turn) *180/ 3.2
azdiff=turn-dazimut
deg=servoangle(azdiff)
oldlat = curlat
oldlon = curlon
بايثون للروبوت. الميزات التي كنت أبحث عنها لفترة طويلة:
droid.batteryStartMonitoring() — o .
droid.batteryStopMonitoring()
droid.batteryGetHealth() — (1-, 2-, 3 — , 4 — , 5 — , 6 — )
droid.batteryGetStatus() — (1 — , 2 — , 3 — , 4 — , 5 — )
droid.batteryGetTechnology()
droid.readBatteryData() — .
droid.batteryGetTemperature()
droid.batteryGetVoltage()
droid.batteryGetLevel()
Bluetooth:
droid.checkBluetoothState() — Bluetooth
droid.toggleBluetoothState() — True , False
droid.bluetoothAccept() —
droid.bluetoothActiveConnections() — ,
droid.bluetoothGetConnectedDeviceName()
droid.bluetoothMakeDiscoverable() —
droid.bluetoothStop()
Wi-Fi:
droid.checkWifiState() — Wi-Fi
droid.toggleWifiState() — True , False
droid.wifiStartScan()
droid.wifiGetScanResults()
droid.wifiGetConnectionInfo()
:
droid.checkAirplaneMode() — « »
droid.checkRingerSilentMode() —
droid.checkScreenOn() —
droid.toggleRingerSilentMode() —
droid.toggleAirplaneMode()
droid.toggleVibrateMode()
:
droid.getMaxMediaVolume()
droid.getMaxRingerVolume()
droid.getMediaVolume()
droid.getRingerVolume()
droid.getScreenBrightness()
droid.getScreenTimeout()
droid.getVibrateMode()
:
droid.setMediaVolume()
droid.setRingerVolume()
droid.setScreenBrightness()
droid.setScreenTimeOut()
الخطط:- تكوين إرسال بيانات Bluetooth إلى اردوينو.
- الحصول على بيانات العمق من اردوينو. سأقيس العمق باستخدام جهاز استشعار بالموجات فوق الصوتية.
- إرسال بيانات حول الموقع الحالي وقياسات العمق إلى الخادم.
- . , . .
- , ,
ملاحظة: لماذا قررت كتابة منشور قبل إطلاق الروبوت؟ أريد أن أجد أشخاصًا متشابهين في التفكير. إذا كان لديك رغبة - هل الروبوت الخاص بك. مناسبة رائعة للتجمع في عطلات مايو في رحلة مائية على نهر موسكو على الروبوتات! لجميع الأسئلة يمكنك أن تكتب لي VK . الرجاء إعادة النشر ، ربما يرغب أحد أصدقائك في المشاركة في ماراثون أكوا.دعني أذكرك: ستقاممسابقة جزازات العشب الآلية في سكولكوفو في 3 يونيو. يمكن لأي شخص تجربة يده على الروبوتات. بعد نتائج المسابقة ، نريد تحديد فريق لبدء التشغيل. سنقوم بعمل أول آلة حفر روبوتية تجارية روسية. جوائز وهدايا قيمة لجميع المشاركين.