पिछली श्रृंखला में:
भाग 1भाग २खैर, क्या सभी ने पहले से ही स्पेयर पार्ट्स और इकट्ठे रोबोट का आदेश दिया है? यह रोबोट को पुनर्जीवित करने का समय है।
आज हम सॉफ्टवेयर का विश्लेषण करेंगे।
मेरे द्वारा प्रदान किया जाने वाला विकल्प
यथासंभव सरल है । उससे अद्वितीय क्षमताओं की अपेक्षा न करें। उसका काम सिर्फ काम
पर जाना है । दोष सहिष्णुता, सुचारू नियंत्रण और अतिरिक्त कार्य - यह रचनात्मकता की गुंजाइश है, जिसे मैं सभी को छोड़ देता हूं, ताकि इस आनंद से वंचित न हो। कोड बहुत सरल है और इसलिए इष्टतम से बहुत दूर है और सुरक्षित नहीं है और आम तौर पर सुंदर नहीं है। यदि इसमें सुधार के लिए सुझाव हैं - अपने स्वयं के विकल्प प्रदान करें, सीधे कोड के टुकड़े बताएं कि यह क्यों और क्यों बेहतर होगा।
जो कुछ खराब तरीके से किया गया है, उसकी अप्रत्यक्ष आलोचना करने की खास जरूरत नहीं है :) मुझे कमियों के बारे में पहले से ही पता है। लेकिन अगर कुछ स्पष्ट नहीं है, तो पूछें, मैं समझाऊंगा।
तो चलिए!
हम कार्य को सरल चरणों में विभाजित करते हैं:
ऑनबोर्ड कंट्रोलर- आगे / रिवर्स और कॉर्नरिंग के लिए कैटरपिलर मोटर्स को नियंत्रित करना
- कैमरा सर्वो नियंत्रण
- ब्लूटूथ के माध्यम से प्राप्त करना और गति कमांड को निष्पादित करना और कैमरा सर्वो को नियंत्रित करना
पीसी / लैपटॉप- आंदोलन की दिशा निर्धारित करने के लिए मोटर्स की गति की गणना
- ब्लूटूथ के माध्यम से नियंत्रण पैकेट स्थानांतरित करें
- आसान नियंत्रण के लिए जॉयस्टिक कनेक्शन
आगे / रिवर्स और कॉर्नरिंग के लिए कैटरपिलर मोटर्स को नियंत्रित करना
चूंकि हम रेडी-मेड मोटरशील्ड का उपयोग करते हैं और न ही एच-ब्रिज या एल 293 डी / एल 298 एन का उपयोग करते हैं, इसलिए विशेष रूप से आविष्कार करने के लिए कुछ भी जटिल नहीं है। हम AFMotor लाइब्रेरी का उपयोग करेंगे। यदि आपके पास एक मोटरशील्ड वी 3 है और आपको एसपीआई बस की आवश्यकता है, तो
संशोधित संस्करण लें ।
मैं आमतौर पर अंग्रेजी में टिप्पणियां लिखता हूं, क्योंकि यह सरल और छोटी है।
मोटर्स को नियंत्रित करने के लिए चर घोषित करें। दाईं मोटर 4 पोर्ट से जुड़ी है, और बाईं मोटर 3 पोर्ट से।
AF_DCMotor rMotor(4);
दी गई दिशा और गति के आधार पर, हम मोटर्स को घुमाने के लिए (बाएं मोटर के लिए) आदेश देते हैं:
switch (lDirection){ case 0: lMotor.run(RELEASE); break; case 1: lMotor.run(FORWARD); lMotor.setSpeed(lSpeed); break; case 2: lMotor.run(BACKWARD); lMotor.setSpeed(lSpeed); break; }
सही इंजन के लिए समान:
switch (rDirection){ case 0: rMotor.run(RELEASE); break; case 1: rMotor.run(FORWARD); rMotor.setSpeed(rSpeed); break; case 2: rMotor.run(BACKWARD); rMotor.setSpeed(rSpeed); break; }
lDirection (या rDirection) मान लेता है:
0 - मोटर बंद करो
1 - आगे घुमाव
2 - रोटेशन वापस।
कैमरा सर्वो नियंत्रण
सर्वोस को नियंत्रित करने के लिए, हम दो ऑब्जेक्ट्स पैनसेर्वो (कैमरे के रोटेशन के लिए जिम्मेदार) और टिल्टसर्वो (झुकाव के लिए जिम्मेदार) की घोषणा करते हैं। चूंकि इमदादी यांत्रिक है और तुरंत घूमती नहीं है, हम रोटेशन कमांड को काम करने के लिए ड्राइव द्वारा आवश्यक देरी के लिए एक चर पेश करते हैं (15 एमएस पर्याप्त है)
Servo panServo, tiltServo; long interval = 15; // interval at which to control servo long previousMillis = 0; unsigned long currentMillis;
पिछली बार और मेमोली का उपयोग तब किया जाता है जब इमदादी चालू होता है। हम जांचते हैं - यदि अंतिम आदेश के बाद से 15 एमएस पास नहीं हुआ है, तो सर्वो को कमांड करना बेकार है - यह अभी भी व्यस्त है।
कैमरा के रोटेशन के लिए जिम्मेदार टुकड़ा:
//Rotate camera currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if (lastPan!=pan) panServo.write(pan); // tell pan servo to go to position if (lastTilt!=tilt) tiltServo.write(tilt); // tell tilt servo to go to position lastPan=pan; lastTilt=tilt; }
ब्लूटूथ के माध्यम से प्राप्त करना और गति कमांड को निष्पादित करना और कैमरा सर्वो को नियंत्रित करना
Arduino के दृष्टिकोण से ब्लूटूथ मॉड्यूल केवल एक धारावाहिक (UART) पोर्ट है।
इसलिए, हम यह जांचने के लिए एक चक्र में पूछताछ करेंगे कि क्या कंप्यूटर से कुछ आया है। यदि बफर में कुछ पाया जाता है, तो हम स्ट्रीम में पैकेट की शुरुआत की तलाश कर रहे हैं - $ FF बाइट (सर्वो की स्थिति और 255 मोटर की गति व्यावहारिक रूप से बेकार है - नौकर पहले से ही समाप्त हो जाते हैं, और 250-255 की गति भिन्न नहीं होती है, इसलिए यह मान स्ट्रीम में अत्यंत उच्च होगा। शायद ही कभी और यह हमें पैकेज की शुरुआत को पकड़ने की अनुमति देगा, हम एल्गोरिथ्म को जटिल करके विश्वसनीयता बढ़ा सकते हैं, लेकिन यह हमारे लिए काफी पर्याप्त है)।
हेडर पाए जाने के बाद, हम एक बाइट स्वीकार करते हैं जिसमें इंजन की दिशा प्रति इंजन 2 बिट्स में एन्कोडेड होती है। तब हम इंजन की गति - 1 बाइट प्रति इंजन (lSpeed, rSpeed) और कैमरा सर्वो (पैन, झुकाव) की स्थिति को पढ़ते हैं।
if (Serial.available()>0) { Header=Serial.read(); //If header found then get and process Cmd if (Header==255){ while(Serial.available()<5){}; Direction=Serial.read(); lSpeed=Serial.read(); rSpeed=Serial.read(); pan=Serial.read(); tilt=Serial.read();
अगला, हम दाएं और बाएं इंजन के लिए दिशाओं को उजागर करते हैं
lDirection=Direction & 0x03; rDirection=(Direction & 0x0C) >> 2;
और यदि अंतिम कमांड प्राप्त होने के बाद से दिशा या गति बदल गई है, तो इंजन की गति निर्धारित करें और कैमरा घुमाएं।
यह पूरा मुख्य कार्य चक्र है:
void loop() { if (Serial.available()>0) { Header=Serial.read(); //If header found then get and process Cmd if (Header==255){ while(Serial.available()<5){}; Direction=Serial.read(); lSpeed=Serial.read(); rSpeed=Serial.read(); pan=Serial.read(); tilt=Serial.read(); lDirection=Direction & 0x03; rDirection=(Direction & 0x0C) >> 2; //Left if ((lastlDir!=lDirection) or (lastlSpeed!=lSpeed)){ switch (lDirection){ case 0: lMotor.run(RELEASE); break; case 1: lMotor.run(FORWARD); lMotor.setSpeed(lSpeed); break; case 2: lMotor.run(BACKWARD); lMotor.setSpeed(lSpeed); break; } lastlDir=lDirection; lastlSpeed=lSpeed; } //Right if ((lastrDir!=rDirection) or (lastrSpeed!=rSpeed)){ switch (rDirection){ case 0: rMotor.run(RELEASE); break; case 1: rMotor.run(FORWARD); rMotor.setSpeed(rSpeed); break; case 2: rMotor.run(BACKWARD); rMotor.setSpeed(rSpeed); break; } lastrDir=rDirection; lastrSpeed=rSpeed; } //Rotate camera currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if (lastPan!=pan) panServo.write(pan); // tell pan servo to go to position if (lastTilt!=tilt) tiltServo.write(tilt); // tell tilt servo to go to position lastPan=pan; lastTilt=tilt; } } } }
जैसा कि आप देख सकते हैं, यह लगभग कहीं भी आसान है :)
आप Google कोड में
प्रोजेक्ट पेज से
स्केच डाउनलोड कर सकते हैं।
हमने कमांड निष्पादित करने के लिए चेसिस सिखाया। अब हमें यह जानने की जरूरत है कि उन्हें कैसे भेजा जाए।
जो लोग डेल्फी को स्थापित करने के लिए प्रोग्रामिंग या अनिच्छुक समझने के लिए बहुत आलसी हैं वे एक
संकलित संस्करण डाउनलोड कर सकते हैं

(लॉजिटेक एक्सट्रीम 3 डी प्रो जॉयस्टिक या चाइनीज इजीटच गेमपैड के साथ काम करता है)।


बाकी हम आगे बढ़ते हैं :)
हमें आवश्यकता होगी:
- डेल्फी 2010 (आप डेल्फी 7 कर सकते हैं, आपको बस प्रोजेक्ट फ़ाइल में कुछ पंक्तियों को ठीक करने की आवश्यकता है)
- खुले ComPort लाइब्रेरी से TComPort घटक (मेरे पास 4.11s स्थापित हैं)
- घटक TjvHIDDevice, JEDI VCL से TjvHIDDeviceController। मैं v3.38 का उपयोग करता हूं, आप नए सिरे से डाउनलोड कर सकते हैं। पूरा डाल दो, हाथ आ गया
दिशा निर्धारित करने के लिए मोटर्स की गति की गणना
आगे और पीछे की ओर बढ़ने से कठिनाइयां नहीं होती हैं - बस एक ही बाएं और दाएं मोटर की गति और एक ही दिशा निर्धारित करें।
गति में बदलाव के लिए, हम स्टीयर की अवधारणा को पेश करते हैं - प्रत्यक्ष आंदोलन से विचलन का मूल्य। इंजन की गति की गणना आगे और पीछे जाने के लिए की जाती है:
if Speed>0 then begin //Forward //Left/Right turn lSpeed:=Speed-Steer; rSpeed:=Speed+Steer; if lSpeed<0 then lSpeed:=0; if rSpeed<0 then rSpeed:=0; if lSpeed>MaxSpeed then lSpeed:=MaxSpeed; if rSpeed>MaxSpeed then rSpeed:=MaxSpeed; end else begin //Backward //Left/Right turn lSpeed:=Speed+Steer; rSpeed:=Speed-Steer; if lSpeed>0 then lSpeed:=0; if rSpeed>0 then rSpeed:=0; if lSpeed<(-MaxSpeed) then lSpeed:=-MaxSpeed; if rSpeed<(-MaxSpeed) then rSpeed:=-MaxSpeed; end;
यही है, बाएं इंजन की गति से आगे बढ़ने पर, हम विचलन को घटाते हैं, हम दाईं ओर की गति को जोड़ते हैं। यह पटरियों में से एक को ब्रेक करने के प्रभाव को दिखाता है और चेसिस पूरी तरह से बिना रुके आसानी से मुड़ जाता है। जब पीछे की ओर बढ़ते हैं, तो संकेत बस बदलते हैं।
खैर, हम जांचते हैं कि क्या गति अधिकतम स्वीकार्य मूल्यों से अधिक है। विशेष रूप से, यह उन लोगों के लिए उपयोगी है जिनके पास वोल्टेज के साथ मोटर चालित हैं, जितना उन्हें चाहिए - बस अधिकतम गति को सीमित करें और मोटर्स बरकरार रहेंगे।
प्रबंधन के उदाहरण:
आगे बढ़ें - दोनों मोटर्स की दिशा "1" है, गति समान है
वापस जाने के लिए - दोनों मोटर्स की दिशा "2" है, गति समान है
बाएं / दाएं के लिए आंदोलन में मुड़ने
के लिए, हम दिशा को एक ही सेट करते हैं, गति भिन्न होती है। ओर मुड़ता है, जिसकी गति कम है।
स्थान पर मुड़ने के लिए - गति समान है, मोटर्स की दिशा अलग है - यह केंद्र के चारों ओर घूमेगा।
दोनों मोटर्स के लिए
रोक - दिशा "0"
ब्लूटूथ के माध्यम से नियंत्रण पैकेट स्थानांतरित करें
पीसी में ब्लूटूथ मॉड्यूल जोड़ने पर, 2 वर्चुअल COM पोर्ट बनते हैं - एक इनबाउंड, एक आउटबाउंड।
रोबोट से कनेक्ट करने के लिए, आपको बस आउटगोइंग पोर्ट को खोलना होगा। आप ब्लूटूथ सेटिंग्स में या ब्रूट फोर्स विधि से बंदरगाहों की सूची में निर्दिष्ट कर सकते हैं - जब सही एक से जुड़ा होता है, तो कार्यक्रम शपथ नहीं होगा और मॉड्यूल पर एलईडी चमकती बंद हो जाती है - कनेक्शन स्थापित होता है, हम मान सकते हैं कि हम सीधे रोबोट से जुड़े हुए हैं।
procedure TfTank.bConnectClick(Sender: TObject); begin if Tank.Connected then begin Tank.Disconnect; bConnect.Caption:='Connect'; end else begin Tank.Port:=cbPort.Text; Tank.Connect; bConnect.Caption:='Disconnect'; MessageBeep(MB_ICONINFORMATION); end; end;
सुविधा के लिए, मैंने TRCTank नामक एक छोटा वर्ग लिखा, जो रोबोट के साथ संचार से संबंधित सभी क्रियाओं को लागू करता है।
TRCTank=class private fPort:string; ComPort:TComPort; Cmd, lastCmd:TControlPacket; fConnected:Boolean; function isConnected: boolean; protected public constructor Create; destructor Destroy;override; procedure Connect; procedure Disconnect; procedure SendCommand(lDir,left, rDir, right, pan, tilt:Byte); property Port:string read fPort write fPort; property Connected:boolean read isConnected; end;
कनेक्ट करें और डिस्कनेक्ट करें अनिवार्य रूप से बस पोर्ट खोलें / बंद करें और वर्तमान स्थिति की जांच करें ताकि खुले पोर्ट को खोलने या बंद करने की कोशिश न करें।
रोबोट को कमांड भेजने के लिए, हम हेडर बनाते हैं जिसे रोबोट पकड़ लेगा (हमारे पास कोड 255 के साथ एक बाइट है)। और फिर हम आदेशों को इस क्रम में लिखते हैं कि रोबोट उनके लिए इंतजार कर रहा है। यह ऐसी संरचना को दर्शाता है
TControlPacket=record Header, Direction, lSpeed, //left motor speed rSpeed :Byte;//right motor speed pan, tilt :Byte; //Camera pan & tilt end;
कमांड भेजने के कार्य में, उल्लेख के लायक एकमात्र चीज 2 बाइट्स के ऑफसेट के साथ एक बाइट में दोनों इंजनों के लिए निर्देशों की पैकिंग है। शेष स्पष्ट है।
procedure TRCTank.SendCommand; begin if not fConnected then Exit; Cmd.Header:=255; Cmd.Direction:=lDir + rDir shl 2; Cmd.lSpeed:=left; Cmd.rSpeed:=right; Cmd.pan:=pan; Cmd.tilt:=tilt; if (lastCmd.Direction=Cmd.Direction) and (lastCmd.lSpeed=Cmd.lSpeed) and (lastCmd.rSpeed=Cmd.rSpeed) and (lastCmd.pan=Cmd.pan) and (lastCmd.tilt=Cmd.tilt) then Exit; ComPort.Write(cmd, SizeOf(cmd)); lastCmd:=Cmd; end;
आसान नियंत्रण के लिए जॉयस्टिक कनेक्शन
दुर्भाग्य से, एचआईडी उपकरणों के साथ काम करने पर बहुत अधिक दस्तावेज नहीं हैं जो इंटरनेट पर समझदार हैं। नतीजतन, मैं पुराने कोडों के एक समूह से गुज़रा जो मिडी पोर्ट के माध्यम से काम करने के लिए भेजते हैं या जॉयस्टिक को 2 कुल्हाड़ियों और 4 बटन वाले उपकरण के रूप में मानते हैं। यह विकल्प मुझे पसंद नहीं आया। TjvJoystick घटक पर कहीं भी कोई जानकारी नहीं थी, इसलिए मैं दुर्घटना से उस पर ठोकर खाई। यह एक अफ़सोस की बात है, इस बिंदु पर मैंने पहले से ही अपना घटक लिखा है :) इसलिए यदि आप इसे जानने के लिए बहुत आलसी नहीं हैं, तो आप जेईडीआई वीसीएल से तैयार घटक का उपयोग कर सकते हैं।
मैं HID डिवाइस के साथ सीधे काम करता हूं और बाइट द्वारा रिपोर्ट का विश्लेषण करता हूं। लेकिन सभी जॉयस्टिक कुल्हाड़ी उपलब्ध हैं (EasyTouch उनमें से 4 हैं) और सभी बटन (मेरे जॉयस्टिक की 10-12)।
यह इस तरह से काम करता है: फॉर्म पर TjvHIDDeviceController घटक का उपयोग करके, हम सिस्टम में छिपाई उपकरणों की एक सूची प्राप्त करते हैं और इसे कॉम्बो बॉक्स में आउटपुट करते हैं। हम चयनित डिवाइस को SelectJoystickByID (VID, PID: Word) कहकर TRjoystick वर्ग की एक वस्तु को देते हैं; (वेंडरॉइड और प्रोडिड द्वारा चयनित - आप उन्हें देख सकते हैं, उदाहरण के लिए, सिस्टम के डिवाइस मैनेजर में)।
TRjoystick वर्ग एक चेकआउट करता है, जोस्टिक से रिपोर्ट प्राप्त करने में सक्षम होता है, मूल्यों को डिक्रिप्ट करता है, बटन और कुल्हाड़ियों के गुणों को सेट करता है, और हैंडलर प्रक्रिया को कॉल करता है। हमारे कार्यक्रम में, हैंडलर इस तरह दिखता है:
procedure TfTank.OnJoyData; var Hat:THatPosition; CenterCamera:Boolean; begin Hat:=hCenter; CenterCamera:=False; //Easy touch joystick if (joyPID=6) and (joyVID=121) then begin scrPitch.Position:=TREasyTouchJoystick(Joy).rZ; scrAileron.Position:=TREasyTouchJoystick(Joy).Z; scrRudder.Position:=TREasyTouchJoystick(Joy).X; scrThrottle.Position:=TREasyTouchJoystick(Joy).Y; cbFire.Checked:=TREasyTouchJoystick(Joy).Btn1; cbAltFire.Checked:=TREasyTouchJoystick(Joy).Btn10; Hat:=TREasyTouchJoystick(Joy).Hat; CenterCamera:=TREasyTouchJoystick(Joy).Btn2; Speed:=Round(((TREasyTouchJoystick(Joy).rZ)-127)*2); Steer:=Round((TREasyTouchJoystick(Joy).Z)-127)*2; end; //Logitech Extreme 3D Pro if (joyPID=49685) and (joyVID=1133) then begin scrPitch.Position:=TRLogitechExtreme(Joy).Pitch; scrAileron.Position:=TRLogitechExtreme(Joy).Aileron; scrRudder.Position:=TRLogitechExtreme(Joy).Rudder; scrThrottle.Position:=TRLogitechExtreme(Joy).Throttle; cbFire.Checked:=TRLogitechExtreme(Joy).Btn1; cbAltFire.Checked:=TRLogitechExtreme(Joy).Btn2; Hat:=TRLogitechExtreme(Joy).Hat; CenterCamera:=TRLogitechExtreme(Joy).Btn1; Speed:=(TRLogitechExtreme(Joy).Pitch div 8)-255; //4096 to -256..256 Steer:=(TRLogitechExtreme(Joy).Aileron div 4)-127; //1024 to -127..128 end; ApplyDeadZone(Speed,DeadX); ApplyDeadZone(Steer,DeadY); if Speed>MaxSpeed then Speed:=MaxSpeed; if Speed<-MaxSpeed then Speed:=-MaxSpeed; if Speed>0 then begin //Forward //Left/Right turn lSpeed:=Speed-Steer; rSpeed:=Speed+Steer; if lSpeed<0 then lSpeed:=0; if rSpeed<0 then rSpeed:=0; if lSpeed>MaxSpeed then lSpeed:=MaxSpeed; if rSpeed>MaxSpeed then rSpeed:=MaxSpeed; end else begin //Backward //Left/Right turn lSpeed:=Speed+Steer; rSpeed:=Speed-Steer; if lSpeed>0 then lSpeed:=0; if rSpeed>0 then rSpeed:=0; if lSpeed<(-MaxSpeed) then lSpeed:=-MaxSpeed; if rSpeed<(-MaxSpeed) then rSpeed:=-MaxSpeed; end; scrLeft.Position:=-lSpeed; scrRight.Position:=-rSpeed; if (cbAltFire.Checked) and (bConnect.Caption='Connect') then bConnect.OnClick(Self); case Hat of hUp: Inc(Tilt); hUpRight:begin Inc(Tilt);Dec(pan); end; hRight: Dec(pan); hRightDown: begin Dec(Pan); Dec(tilt); end; hDown: Dec(Tilt); hLeftDown: begin Inc(pan);Dec(tilt); end; hLeft: Inc(pan); hLeftUp: begin Inc(pan);Inc(tilt); end; hCenter: if CenterCamera then begin pan:=panCenter; tilt:=tiltCenter; end; end; //Limit Pan&Tilt range if pan<minPan then pan:=minPan; if tilt<minTilt then tilt:=minTilt; if pan>maxPan then pan:=maxPan; if tilt>maxTilt then tilt:=maxTilt; //Show info lJoy.Caption:='S:'+IntToStr(Speed)+' D:'+InttoStr(Steer)+' L:'+InttoStr(lSpeed)+' R:'+InttoStr(rSpeed); lhat.Caption:=THatPosString[Integer(Hat)]; //Show camera position on sliders scrPan.Position:=pan; scrTilt.Position:=tilt; //Send command to tank Command2Tank; end;
सबसे पहले, हम कुल्हाड़ियों के निर्देशांक के कच्चे मान को गति सीमा -256..256 और दिशा -127.1.128 देते हैं।
चूंकि, कम गति पर रैखिक नियंत्रण के साथ, मोटर्स में रोबोट को जगह से स्थानांतरित करने की ताकत नहीं है, हम छोटे मृत क्षेत्रों (अनुभव से) का परिचय देते हैं - यह केवल एक निश्चित गति मूल्य से आगे बढ़ेगा। (ApplyDeadZone (स्पीड, डेडएक्स); ApplyDeadZone (Steer, DeadY);)
पतवार को ध्यान में रखने के बाद, हम जांचते हैं कि गति सीमा से बाहर नहीं हुई, हम स्लाइडर्स के साथ फॉर्म पर मोटर्स की गति दिखाते हैं।
फिर, टोपी की स्थिति के आधार पर, हम कैमरे की दिशा बदलते हैं या इसे केंद्र में रखते हैं, हम सीमाओं की भी जांच करते हैं (डिजिटल नियंत्रण सीमाओं तक पहुँचने से पहले आमतौर पर सर्वो आराम करते हैं)। स्लाइडर्स की एक और जोड़ी पर कैमरे की स्थिति प्रदर्शित करें, गति प्रदर्शित करें और टैंक को एक कमांड भेजें।
procedure TfTank.Command2Tank; begin lDir:=0; rDir:=0; //prepare rDir, lDir data based on tracks speed case lSpeed of 0:lDir:=0; //stop 1..255: lDir:=1; //forward -255..-1:lDir:=2; //backward end; case rSpeed of 0:rDir:=0; //stop 1..255: rDir:=1; //forward -255..-1:rDir:=2; //backward end; Tank.SendCommand(lDir,Abs(lSpeed),rDir,Abs(rSpeed), pan, tilt); end;
कोड में विभिन्न प्रयोग हैं, टुकड़े जो चयनित पोर्ट और जॉयस्टिक को बचाने के लिए जिम्मेदार हैं, कैमरे के नियंत्रण और केंद्र की सीमाओं को बचाने और लोड करने के लिए हैं, जॉयस्टिक द्वारा नियंत्रण वापस नहीं करना संभव है, लेकिन सीधे गति और दिशा स्लाइडर को खींचना। लेकिन यह प्रबंधन के मुख्य कार्य की चिंता नहीं करता है। आप जैसे चाहें कोड का उपयोग कर सकते हैं, यदि आप चाहें तो "बोलगेनोस" की व्यवस्था भी कर सकते हैं :)
आप
आरटी आरसी टैंक के
स्रोतों को प्रोजेक्ट वेबसाइट पर Google कोड में डाउनलोड कर सकते हैं।
मैंने पहले व्यक्ति से नियंत्रण प्रक्रिया को हटाने की कोशिश की, लेकिन कैमरे के साथ स्क्रीन को शूट करना एक कृतघ्न कार्य है, यह औसत दर्जे का नहीं था। लेकिन सामान्य अर्थ स्पष्ट है।
पुनश्च इस समय चेसिस को फिर से काम करने के लिए उतारा गया है, इसलिए मैं हार्डवेयर पर कोड में किसी भी बदलाव को जल्दी से नहीं देख सकता। लेकिन डाउनलोड के लिए उपलब्ध संस्करण पूरी तरह कार्यात्मक है, जैसा कि वीडियो में देखा गया है।