একটি ডিফারেনশিয়াল মোটর ড্রাইভ নিয়ন্ত্রণ করতে 2 অক্ষ এনালগ ইনপুট মিশ্রণের জন্য অ্যালগরিদম


9

আমি আমার ক্ষেত্রে ইউসি (এটিএমএগ 328 পি) ব্যবহার করে দ্বৈত ডিফারেনশনাল মোটর ড্রাইভ ("ট্যাঙ্কের মতো" ড্রাইভ) নিয়ন্ত্রণ করতে 2 এনালগ জোস্টস্টিক সিগন্যালগুলির (এক্স এন ওয়াই অক্ষ) সঠিক মিশ্রণটি কীভাবে প্রয়োগ করতে পারি সে সম্পর্কিত তথ্যের সন্ধান করছি, তবে একই ক্ষেত্রে প্রয়োগ করা উচিত এডিসি ইনপুট এবং পিডব্লিউএম আউটপুট সহ যে কোনও ইউসি):

আমার কাছে একটি এনালগ স্টিক রয়েছে যা 2 টি এনালগ মান দেয়:

(দিকনির্দেশ) এক্স: 0 থেকে 1023
(থ্রোটল) Y: 0 থেকে 1023

এখানে চিত্র বর্ণনা লিখুন

বিশ্রামের অবস্থানটি (দিকনির্দেশ এবং থ্রোটল নিরপেক্ষ) 512,512
থ্রটল ফরোয়ার্ড / দিক বাম 0,0
সম্পূর্ণ ফরোয়ার্ড-পূর্ণ ডান 1023,0
ইত্যাদি etc.

মোটরগুলি 2 টি এইচ-ব্রিজ ড্রাইভার, 2 টি পিডাব্লুএম পিনগুলি প্রতিটি (ফরোয়ার্ড, পশ্চাৎ) দ্বারা নিয়ন্ত্রিত হয়:
বাম মোটর: -255 থেকে 255
ডান মোটর: -255 থেকে 255
(ধনাত্মক মানগুলি PWM পিনকে এগিয়ে দেয়, নেতিবাচক সক্ষম বিপরীত করে তোলে) PWM পিন, 0 উভয় অক্ষম করে)

লক্ষ্যটি হ'ল জোস্টস্টিক অ্যানালগ সংকেতগুলি নিম্নলিখিত প্রতিক্রিয়া অর্জনের জন্য মিশ্রিত করুন:

ক) এগিয়ে থ্রোটল, দিক নিরপেক্ষ = যানবাহন এগিয়ে চলছে
খ) এগিয়ে থ্রোটল, দিক বাম = যানবাহন এগিয়ে এবং বাম দিকে ঘোরানো
) থ্রোটল নিরপেক্ষ, দিক বামে = যানবাহনে বাঁদিকে বাঁদিকে ডান মোটর পুরো এগিয়ে, বাম মোটর সম্পূর্ণ বিপরীত

... এবং একইভাবে অন্যান্য সংমিশ্রণের জন্য। অবশ্যই আউটপুটটি "অ্যানালগ" হওয়া উচিত, এটি উদাহরণস্বরূপ বিকল্প a থেকে খ) থেকে খ) পর্যন্ত ধীরে ধীরে স্থানান্তরিত হওয়া উচিত।

ধারণাটি হ'ল:

http://www.lynxmotion.com/images/html/build123.htm


(1) নোট করুন যে আমার মৌলিক অ্যালগরিদম যখন 'জোরে স্টিক' দেয় তখন গতি নিয়ন্ত্রণের অনুমতি দেয় যখন পুরো স্কেলের% দ্বারা বামে রেখে দেওয়া হয়। (২) এই প্রয়োজনীয়তা অবশ্যই এতক্ষণে অনেক বার পুনরায় সমাধান করা উচিত। মডেল সম্প্রদায়ের এর উত্তর থাকতে হবে। (৩) যদি গ্রাহক প্রতিক্রিয়া ব্যবহার করে কমান্ডগুলি ট্র্যাক বেগের মধ্যে অনুবাদ করে তবে যানবাহন স্থল শর্ত পরিবর্তনের মতোই আচরণ করবে। তবে কমান্ডগুলি মোটর পাওয়ার বা ড্রাইভ ভোল্টেজ ইত্যাদিতে অনুবাদ করা থাকলে গাড়ির পারফরম্যান্স স্থল শর্তের সাথে পরিবর্তিত হতে পারে। - সম্ভবত 91) এর চেয়ে ভাল।
রাসেল ম্যাকমাহন

রাসেল, আমি আনসারটির জন্য প্রচুর পরিমাণে গুগল করেছি এবং মোটামুটি নিয়ন্ত্রককে সরাসরি আরসি রিসিভারের সাথে সংযোগ করতে গিয়েছিলাম তবে ভিতরে থাকা অ্যালগরিদম সম্পর্কে খুব বেশি তথ্য পাইনি।
কামিল জাডোরা

শুভ দিন! রেনহো একটি কাজিন যিনি শিশু পক্ষাঘাতের চেষ্টা করছেন এবং হুইলচেয়ার নির্মাণ করেছেন তাদের প্রোগ্রামিং ভালভাবে কাজ করেছে, তবে আউটপুট ভোল্টেজ খুব কম! আমাকে সাহায্য কর! আমি একটি আরডুইনো ইউনো ব্যবহার করছি।

@ জনি ইলেক্ট্রনিক্স.স্ট্যাকেক্সচেঞ্জে স্বাগতম! এই সাইটটি কীভাবে কাজ করে তা জানতে দয়া করে জিজ্ঞাসিত প্রশ্নাগুলি দেখুন এবং যদি আপনার কাছে জিজ্ঞাসা করার কোনও প্রশ্ন থাকে তবে দয়া করে পৃষ্ঠার উপরের ডানদিকের কোণায় নির্দিষ্ট বোতামটি ব্যবহার করুন।
ক্লাবচিও

এটা কি কাজ করেছিল ???
রাসেল ম্যাকমাহন

উত্তর:


4

"যথাযথ" মিশ্রণ বিতর্কের জন্য উন্মুক্ত :-)।

একটি সমস্যা হ'ল কোনও পাত্রের খাঁটি সংকেতের আওতায় ট্র্যাকটি কীভাবে দ্রুত গতিতে চলেছে এবং অন্য পাত্রের সংকেত অন্তর্ভুক্ত করা হলে কী করা উচিত সে সম্পর্কে আপনাকে সিদ্ধান্ত নিতে হবে। উদাহরণস্বরূপ, আপনি যদি এফবিটিকে ধাক্কা দেন (ফরোয়ার্ড-ব্যাকওয়ার্ড পট পুরোপুরি এগিয়ে যায়, এবং যদি উভয় মোটরই পুরো গতিতে সামনের দিকে চালিত হয়, তবে সামান্য পরিমাণে এলআর (বাম-ডান) পাত্র যুক্ত হওয়ার সাথে আপনি কীভাবে মোকাবিলা করবেন To আবর্তন পান আপনার একটি ট্র্যাক দ্রুত গতিতে চলতে হবে অন্যদিকে। সুতরাং, আপনি যদি ইতিমধ্যে উভয় মোটরের সর্বাধিক ফরোয়ার্ড গতিতে চলছেন তবে ঘুরতে আপনাকে অবশ্যই একটি বা অন্য ট্র্যাকের গতি হ্রাস করতে হবে But তবে, আপনি যদি দাঁড়িয়ে থাকেন তবে আপনি একই ফলাফল অর্জন করতে এক বা অন্য ট্র্যাককে ত্বরান্বিত করত।

সুতরাং, সমস্ত যা বলেছিল, এটি আমার মাথা থেকে একটি সহজ অফ-দ্য কফ শুরু করার সমাধান যা ভাল শুরু বলে মনে হচ্ছে।

পটগুলি যান্ত্রিকভাবে স্বতন্ত্র থাকলে উভয় একই সাথে 100% এ থাকতে পারে।
যদি উভয়ই একটি জয়স্টিক টাইপের বিন্যাসে থাকে, যদি ইয়াক্সিস = 100% এবং জ্যাক্সিস = 0% থাকে তবে কিছু বি যুক্ত করলে সাধারণত এ কমে যায় তবে উপরের সত্য নয় যেখানে একটি জয়স্টিক তৈরি করা যেতে পারে তবে এগুলি অস্বাভাবিক।
ধরুন যে জোস্টস্টিকটি এমন এক ধরণের যা ওয়াই% বাড়িয়ে যখন এক্স = 100% এক্স হ্রাস করবে। অন্যান্য অনুমান করা যায়।

এফবি = সামনের পিছনের পাত্র কেন্দ্র শূন্য, পাত্রের এগিয়ে চলার জন্য Ve

এলআর = বাম ডান পাত্র। কেন্দ্র শূন্য। ডানদিকে পাত্রের জন্য Ve।

কে প্রাথমিকভাবে স্কেল ফ্যাক্টর ১।
কোনও ফলাফল যদি 100% ছাড়িয়ে যায় তবে কে এর ফলে = 100% কে সামঞ্জস্য করুন এবং অন্যান্য মোটরের জন্যও একই কে মান ব্যবহার করুন।

  • যেমন বাম মোটর ফলাফল = 125 এবং ডান মোটর ফলাফল = 80 তারপর।
    125 x 0.8 = 100 হিসাবে কে = 0.8 সেট করুন। তারপর।
    বাম = 125 x 0.8 = 100%। ডান = 80 x 0.8 = 64%।

তারপর:

  • বাম মোটর = কে এক্স (সামনের_ব্যাক + বাম_প্রকাশ)

  • ডান মোটর = কে এক্স (সামনের_ব্যাক - বাম_আর)

স্যানিটি পরীক্ষা:

  • LR = 0 (কেন্দ্রিক), এফবি = সম্পূর্ণ fwd -> উভয় মোটরই পুরো এগিয়ে চলে run

  • এলআর = পুরো বাম, এফবি = 0 ->
    বাম মোটর পুরো পিছনে চলে,
    ডান মোটর পুরো এগিয়ে চলে।
    যানবাহনটি এন্টি ক্লকওয়াসের দিকে ঘোরে।

  • এফবি 100%, Lr = 0% ছিল। ডান থেকে 10% এলআর যুক্ত করুন।
    এল = এফবি + এলআর = 100% - + 10% আর = এফবি-এলআর = 100% - - 10%

বৃহত্তম অক্ষ <100% হলে স্কেল = 100% পর্যন্ত।
তারপরে একই পরিমাণে অন্যান্য অক্ষকে স্কেল করুন।


আপনাকে ধন্যবাদ রাসেল - আমি এটি আমার মডেল সেটআপে প্রয়োগ করার চেষ্টা করব। বিটিডাব্লু, আমার জয়স্টিকটি বাম থেকে ডানে এবং অন্যদিকে অন্যদিকে প্যান করার সময় পুরোপুরি এগিয়ে রাখতে সক্ষম, এটি এর সাথে খুব সাদৃশ্য
কামিল

1
আমি বর্তমানে কর্মক্ষেত্রে একই সমস্যা সমাধান করার দায়িত্ব অর্পণ করেছি। আমার কাছে একটি উইআই নুনচুক 2-অক্ষ নিয়ামক রয়েছে এবং এটিতে 2 টি মোটর ঠিক যেমন প্রশ্নে বর্ণিত হয়েছে তা নিয়ন্ত্রণ করা দরকার। এখানে যুক্তি বুঝতে আমার কিছুটা সমস্যা হচ্ছে। কে 1 / কে 1 ঠিক কী বোঝায়? একটি ছোট হাতের এবং একটি বড় হাতের অক্ষর they এগুলি কি আলাদা? + Ve কি?
তাল

1
শীতল - স্পষ্টতার জন্য ধন্যবাদ। পাইথনে আমার এই লেখা দরকার ছিল, তাই যদি আমি সঠিকভাবে বুঝতে পারি তবে এটি করা উচিত: পেস্টবিন . com / এসডাব্লুডাকভিএলপি । দেখে মনে হচ্ছে আমি কিছু মিস করছি? আমার পরীক্ষার পরিবেশে কাজ করার জন্য মনে হচ্ছে - আমি এটি চূড়ান্ত মোটরগুলিতে অবশ্যই সংযুক্ত করতে হবে যা আমি নিশ্চিতভাবে জানতে ব্যবহার করব।
তাল

1
1) মোটর গতি PWM দ্বারা নিয়ন্ত্রিত হয়, যা কেবল 0 - 100 থেকে মান নেয়, এই কারণেই আমি সর্বোচ্চ মান হিসাবে 100 ব্যবহার করি। 2) স্কেলিংয়ের প্রয়োজন আছে কিনা তা অনুসন্ধান করার জন্য আমি স্ক্রিপ্টগুলি ব্যবহার করি (যেমন আপনি বলেছেন) এবং স্কেল_ ফ্যাক্টরটি পেতে। যদি আমি উদাহরণস্বরূপ 0.8 এর স্কেল ফ্যাক্টরটি দিয়ে শেষ করি এবং এটি নেতিবাচক সংখ্যায় ব্যবহার করি, -125 * 0.8 = -100। দিক বজায় রাখা হয়। আমি মনে করি এটি কার্যকর হয়, যদি না আমি কিছু মিস করি। আমি এখনও চূড়ান্ত মোটরগুলিতে চেষ্টা করার সুযোগ পাইনি - আমার বস মোটর সংযুক্ত একটি পরীক্ষা প্ল্যাটফর্ম তৈরি করবেন যা আমি পরীক্ষা করতে সক্ষম হব।
তাল

1
আমার কোডটি আসলে কাজ করবে কিনা তা সম্পর্কে নিশ্চিত ছিলাম না, তাই আমি পূর্বের পেস্টবিনের লিঙ্কটি এক সপ্তাহ পরে শেষ হওয়ার জন্য সেট করেছিলাম। যেহেতু এটি কাজ করছে বলে মনে হচ্ছে, কেউ যদি আবার সমস্যাটি দেখা দেয় তবে আরও কয়েকটি মন্তব্যের সাথে একটি স্থায়ী লিঙ্ক: পেস্টবিন . com / এইকিগুজে 1 কেপি । আমি এটিকে একটি উত্তরে রেখেছি, তবে দৃশ্যত আমার কাছে উত্তর পোস্ট করার মতো পর্যাপ্ত রেপ নেই। সমস্ত কোড রাসেল ম্যাকমোহনের উত্তরের উপর ভিত্তি করে - কৃতিত্ব তার কাছে যায় - ধন্যবাদ রাসেল।
তাল

5

এখানে এমন একটি সমাধান রয়েছে যাতে / অন্য শৃঙ্খলাগুলি জটিল হওয়ার প্রয়োজন হয় না, পুরো সামনে এগিয়ে যাওয়ার সময় বা জায়গায় ঘোরাফেরা করার সময় শক্তি হ্রাস করে না, এবং মসৃণ বক্ররেখা এবং স্পিনিংয়ের দিকে যাওয়ার থেকে সরানোর জন্য অনুমতি দেয়।

ধারণাটি সহজ। ধরে নিন (x, y) জোস্টস্টিক মানগুলি বর্গাকার বিমানে কার্টেসিয়ান স্থানাঙ্ক। এখন কল্পনা করুন একটি ছোট বর্গাকার বিমানটি এর ভিতরে 45º ঘুরেছে।

উদাহরণ বিমান

জয়স্টিকের স্থানাঙ্কগুলি আপনাকে বৃহত্তর স্কোয়ারে একটি বিন্দু দেয় এবং ছোট বর্গক্ষেত্রে একই পয়েন্টটি আপনাকে উচ্চতর মান দেয় values আপনাকে নতুন (x, y) মানগুলি ছোট বর্গাকার দিকে সীমাবদ্ধ করে কেবল একটি বর্গক্ষেত্র থেকে অন্য বর্গে স্থানাঙ্কগুলি রূপান্তর করতে হবে।

রূপান্তরটি করার অনেকগুলি উপায় রয়েছে। আমার প্রিয় পদ্ধতিটি হ'ল:

  1. প্রাথমিক (x, y) স্থানাঙ্কগুলিকে পোলার স্থানাঙ্কে রূপান্তর করুন।
  2. এগুলি 45 ডিগ্রি ঘোরান।
  3. পোলার স্থানাঙ্কগুলি কার্তেসিয়ানে ফিরে রূপান্তর করুন।
  4. নতুন স্থানাঙ্কগুলি -1.0 / + 1.0 এ পুনরায় বিক্রয় করুন।
  5. নতুন মানগুলিকে -1.0 / + 1.0 এ ক্লিক করুন।

এটি ধরে নিয়েছে প্রাথমিক (x, y) স্থানাঙ্কগুলি -1.0 / + 1.0 সীমার মধ্যে রয়েছে। অভ্যন্তরীণ বর্গক্ষেত্রের পার্শ্বটি সর্বদা সমান হবে l * sqrt(2)/2, সুতরাং চতুর্থ ধাপটি হ'ল মানগুলি দ্বারা গুণ করা sqrt(2)

পাইথন প্রয়োগের একটি উদাহরণ এখানে।

import math

def steering(x, y):
    # convert to polar
    r = math.hypot(x, y)
    t = math.atan2(y, x)

    # rotate by 45 degrees
    t += math.pi / 4

    # back to cartesian
    left = r * math.cos(t)
    right = r * math.sin(t)

    # rescale the new coords
    left = left * math.sqrt(2)
    right = right * math.sqrt(2)

    # clamp to -1/+1
    left = max(-1, min(left, 1))
    right = max(-1, min(right, 1))

    return left, right

আরও জটিল জটিল রূপান্তর পদ্ধতির সাথে এই পদ্ধতির আসল ধারণাটি এই নিবন্ধটি থেকে এসেছে ।


0

নীচে রসেল ম্যাকমাহন উত্তর দ্বারা বর্ণিত আলগোরিদিম প্রয়োগের মিশ্রণের উদাহরণ রয়েছে:

http://www.youtube.com/watch?v=sGpgWDIVsoE

//Atmega328p based Arduino code (should work withouth modifications with Atmega168/88), tested on RBBB Arduino clone by Modern Device:
const byte joysticYA = A0; //Analog Jostick Y axis
const byte joysticXA = A1; //Analog Jostick X axis

const byte controllerFA = 10; //PWM FORWARD PIN for OSMC Controller A (left motor)
const byte controllerRA = 9;  //PWM REVERSE PIN for OSMC Controller A (left motor)
const byte controllerFB = 6;  //PWM FORWARD PIN for OSMC Controller B (right motor)
const byte controllerRB = 5;  //PWM REVERSE PIN for OSMC Controller B (right motor)
const byte disablePin = 2; //OSMC disable, pull LOW to enable motor controller

int analogTmp = 0; //temporary variable to store 
int throttle, direction = 0; //throttle (Y axis) and direction (X axis) 

int leftMotor,leftMotorScaled = 0; //left Motor helper variables
float leftMotorScale = 0;

int rightMotor,rightMotorScaled = 0; //right Motor helper variables
float rightMotorScale = 0;

float maxMotorScale = 0; //holds the mixed output scaling factor

int deadZone = 10; //jostick dead zone 

void setup()  { 

  //initialization of pins  
  Serial.begin(19200);
  pinMode(controllerFA, OUTPUT);
  pinMode(controllerRA, OUTPUT);
  pinMode(controllerFB, OUTPUT);
  pinMode(controllerRB, OUTPUT);  

  pinMode(disablePin, OUTPUT);
  digitalWrite(disablePin, LOW);
} 

void loop()  { 
  //aquire the analog input for Y  and rescale the 0..1023 range to -255..255 range
  analogTmp = analogRead(joysticYA);
  throttle = (512-analogTmp)/2;

  delayMicroseconds(100);
  //...and  the same for X axis
  analogTmp = analogRead(joysticXA);
  direction = -(512-analogTmp)/2;

  //mix throttle and direction
  leftMotor = throttle+direction;
  rightMotor = throttle-direction;

  //print the initial mix results
  Serial.print("LIN:"); Serial.print( leftMotor, DEC);
  Serial.print(", RIN:"); Serial.print( rightMotor, DEC);

  //calculate the scale of the results in comparision base 8 bit PWM resolution
  leftMotorScale =  leftMotor/255.0;
  leftMotorScale = abs(leftMotorScale);
  rightMotorScale =  rightMotor/255.0;
  rightMotorScale = abs(rightMotorScale);

  Serial.print("| LSCALE:"); Serial.print( leftMotorScale,2);
  Serial.print(", RSCALE:"); Serial.print( rightMotorScale,2);

  //choose the max scale value if it is above 1
  maxMotorScale = max(leftMotorScale,rightMotorScale);
  maxMotorScale = max(1,maxMotorScale);

  //and apply it to the mixed values
  leftMotorScaled = constrain(leftMotor/maxMotorScale,-255,255);
  rightMotorScaled = constrain(rightMotor/maxMotorScale,-255,255);

  Serial.print("| LOUT:"); Serial.print( leftMotorScaled);
  Serial.print(", ROUT:"); Serial.print( rightMotorScaled);

  Serial.print(" |");

  //apply the results to appropriate uC PWM outputs for the LEFT motor:
  if(abs(leftMotorScaled)>deadZone)
  {

    if (leftMotorScaled > 0)
    {
      Serial.print("F");
      Serial.print(abs(leftMotorScaled),DEC);

      analogWrite(controllerRA,0);
      analogWrite(controllerFA,abs(leftMotorScaled));            
    }
    else 
    {
      Serial.print("R");
      Serial.print(abs(leftMotorScaled),DEC);

      analogWrite(controllerFA,0);
      analogWrite(controllerRA,abs(leftMotorScaled));  
    }
  }  
  else 
  {
  Serial.print("IDLE");
  analogWrite(controllerFA,0);
  analogWrite(controllerRA,0);
  } 

  //apply the results to appropriate uC PWM outputs for the RIGHT motor:  
  if(abs(rightMotorScaled)>deadZone)
  {

    if (rightMotorScaled > 0)
    {
      Serial.print("F");
      Serial.print(abs(rightMotorScaled),DEC);

      analogWrite(controllerRB,0);
      analogWrite(controllerFB,abs(rightMotorScaled));            
    }
    else 
    {
      Serial.print("R");
      Serial.print(abs(rightMotorScaled),DEC);

      analogWrite(controllerFB,0);
      analogWrite(controllerRB,abs(rightMotorScaled));  
    }
  }  
  else 
  {
  Serial.print("IDLE");
  analogWrite(controllerFB,0);
  analogWrite(controllerRB,0);
  } 

  Serial.println("");

  //To do: throttle change limiting, to avoid radical changes of direction for large DC motors

  delay(10);

}

আকর্ষণীয়, এই কোডটি দেখে মনে হচ্ছে এটি 2 পৃথক মোটর নিয়ামককে 2 এনালগ পিন খাচ্ছে feeding আমি কোডটি মানিয়ে নেওয়ার চেষ্টা করব এবং আমার সেটিংসের জন্য পরিবর্তন করব। আরডুইনো ইউনো + 1 সাবার্টুথ ড্রাইভার বোর্ড। 1 অ্যানালগ পিনএক্স (এক্স) পিনএ 1 (y) পড়ার এবং পিডাব্লুএম পিনের মান 10 এবং 3 সাবার্টুথের এস 1 এবং এস 2 এ যাওয়ার জন্য পাঠানো এবং পাস করা মানগুলিতে 1 জয়স্টিক। আমি মনে করি আমি নিকটেই আছি তবে কীভাবে সাবেরতোথ বোর্ডে ডিসপুইচ সেটআপ করবেন সে সম্পর্কে আমি বিভ্রান্তি বোধ করছি। আপাতত আমি অ্যানালগ ইনপুট পাওয়ার জন্য স্যুইচ সেটআপ দিয়ে টিট করছি, সুইচ 4 টি এখনও ডিফারেনশাল ড্রাইভের অবস্থানে রয়েছে তবে পরবর্তী পরীক্ষার জন্য এটিকে আবার স্বতন্ত্র মোডে রেখে দেব। আমি মনে করি এই উত্স

@ user20514 স্বাগতম ইলেক্ট্রনিক্স.স্ট্যাকেক্সচেঞ্জে! আপনি লক্ষ্য করতে পারেন যে এটি কোনও ফোরাম নয় বরং প্রশ্নোত্তর সাইট, সুতরাং উত্তরের স্থানটি আলোচনার জন্য নয়। আপনার যদি কিছু জিজ্ঞাসা করার জন্য কিছু থাকে বা নতুন প্রশ্ন জিজ্ঞাসা করতে নির্দ্বিধায় থাকুন, বা বিদ্যমান প্রশ্ন ও উত্তর সম্পর্কে (সত্যই) মন্তব্যে মন্তব্য ব্যবহার করুন।
ক্লাবচিও

1
@ কামিল - ভিডিওটি ব্যক্তিগত হিসাবে দেখানো হয়েছে। এটি এখনও উপলব্ধিযোগ্য? youtube.com/watch?v=sGpgWDIVsoE
রাসেল ম্যাকমাহন

@ রাসেলম্যাকমাহন পুনরায় সক্রিয় করেছেন :)
কামিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.