نمایش نتایج: از 1 به 4 از 4
Like Tree4 لایک
  • 1 Post By
  • 1 Post By
  • 1 Post By کافه ربات
  • 1 Post By کافه ربات

موضوع: با استفاده از آردوینو ربات تعقیب خط بسازید. قسمت اول

Hybrid View

کافه ربات با استفاده از آردوینو ربات... 02-11-2016, 05:23 PM
کافه ربات با استفاده از آردوینو ربات... 02-22-2016, 04:03 PM
کافه ربات با استفاده از آردوینو ربات... 03-11-2016, 09:13 PM
کافه ربات با استفاده از آردوینو ربات... 03-11-2016, 09:17 PM
  1. #1
    Member
    تاریخ عضویت
    Aug 2015
    محل سکونت
    ایران
    نوشته ها
    56

    با استفاده از آردوینو ربات تعقیب خط بسازید. قسمت سوم

    با عرض سلام مجدد خدمت دوستان عزیز
    امروز قسمت سوم ساخت ربات تعقیب خط با استفاده از آردوینو رو براتون بزاریم.
    آموزش کامل ساخت این پروژه رو می تونید در سایت کافه ربات مشاهده کنید.

    آموزش ساخت ربات تعقیب خط با استفاده از آردوینو| پروژه آردوینو

    گام چهارم: آرایه سنسورها



    آرایه سنسورها به عنوان چشم های ربات عمل می کنند. هشت سنسور بر روی قسمت جلویی ربات وجود دارد که می تواند سیاه را از سفید تشخیص دهند. بر اساس اینکه کدامیک از سنسورها سیاه را می بیننند و کدامیک سفید را می بینند ، آردوینو می تواند مسیر ربات را بر روی خط پیدا کند. اگر ربات کاملا بر روی خط سیاه باقی بماند، در چرخش های 90 درجه نمی تواند راست را از چپ تشخیص دهد، به همین دلیل به گونه ای برنامه ریزی شده است که روی لبه خط باقی بماند.
    آرایه سنسور با استفاده از پیچ های #2-56 روی دو ورق آکریلیک سوار شده است. برای این قسمت فایل هایی ضمیمه شده است.
    پین های سنسور از 1 تا 8 شماره گذاری شده اند و باید به پین های آنالوگ متناظر روی آردوینو که از A0 تا A7 نام گذاری شده اند، متصل شوند. پین VCC به 5V و پین GND به زمین وصل می شود. دیاگرام کلی مدار در قسمت بعد شرح داده شده است.

    گام پنجم: دیاگرام مدار


    اتصال سنسورها در مقایسه با سیم پیچی دیاگرام که در بالا به آن اشاره شد، فرآیند ساده ای است. تمام سیم های قرمز نشان دهنده ی قدرت یا ولتاژ مثبت هستند، سیم های قرمز تیره ولتاژ پایین و قرمز روشن ولتاژ بالا را نشان می دهند.
    سوییچ 1 سیستم را روشن کرده و ولتاژ مورد نیاز را از بسته باتری که به پین خارجی سوییچ متصل است به پین مرکزی سوییچ رسانده و از آنجا به VCC In (پین 4) رگولاتور ولتاژ می برد.
    VCC-out (پین 1) بر روی رگولاتور، ولتاژ کمی را به بورد می فرستد تا ولتاژ بقیه مدار را تامین کند، در حالیکه بسته باتری تامین کننده ولتاژ برای زمین است. سوییچ 2 تعیین می کند که آیا ماشین در حالت خودکار است یا حالت دستی. ولتاژ این سوییچ از رگولاتور و زمین تامین می شود. پین مرکزی بر روی سوییچ 2 به پین D4 بر روی آردوینو نانو متصل می شود تا با مد ارتباط برقرار کند.
    کنترل کننده موتور با پین های 1 و 16 بورد تغذیه می شود. قدرت به پین 2 ارسال می شود و سیم های قدرت از موتور 1 و 2 متناظرا به پین 3 و 5 متصل می شوند. زمین هر موتور متناظرا به پین های 4 و 6 متصل می شوند. کنترل کننده موتور سیگنال خود را از پین های D9، D6 ، D5 و D3 آردوینو که متناظرا به پین های 11، 12، 13 و 14متصل شده اند، دریافت می کند.
    آردوینو بر اساس سیگنال هایی که از آرایه بورد (array board) دریافت کرده، دستوراتی را به کنترل کننده می دهد. هر LED مادون قرمز از طریق پین های آنالوگ یک سیگنال بازگشتی به آردوینو می فرستند. پین های 1، 2، 3، 4، 5، 6، 7 و 8 آرایه LED متناظرا به پین های A0، A1 ، A2 ، A3 ، A4 ، A5 ، A6 و A7 آنالوگ متصل می شوند.

    ادامه آموزش رو هفته ی آینده براتون خواهیم گذاشت.
    آموزش کامل ساخت پروژه رو میتونید در سایت کافه ربات مشاهده فرمایید.
    آموزش ساخت ربات تعقیب خط با استفاده از آردوینو| پروژه آردوینو
    لایک کردن
    کافه ربات | الهام بخش خلاقیت
    www.thecaferobot.com

  2. #2
    Member
    تاریخ عضویت
    Aug 2015
    محل سکونت
    ایران
    نوشته ها
    56

    با استفاده از آردوینو ربات تعقیب خط بسازید. قسمت چهارم

    با عرض سلام مجدد خدمت دوستان عزیز
    امروز قسمت چهارم و پایانی ساخت ربات تعقیب خط با استفاده از آردوینو رو براتون می زاریم.
    آموزش کامل ساخت این پروژه رو می تونید در سایت کافه ربات مشاهده کنید.

    آموزش ساخت ربات تعقیب خط با استفاده از آردوینو| پروژه آردوینو

    گام ششم: کد


    کد زیر در واقع با توجه به سنسورهای IR و خواندن مقادیر از آن ها به موتورها فرمان می دهد که با چه سرعتی حرکت کنند تا ربات به سمت دلخواه بچرخد. این ربات دارای 8 سنسور است. اگر فرض کنیم ربات همواره در یک طرف خط قرار دارد در این صورت در هر زمان ربات می تواند در یکی از 9 موقعیت از 0 تا 8 باشد که با توجه به اینکه کدامیک از سنسورها روشن هستند این موقعیت مشخص می شود. ما می خواهیم در هر زمان مرکز ربات روی لبه خط سیاه قرار گیرد بنابراین setpoint را روی عدد 4 تنظیم می کنیم که در واقع فاصله بین سنسور چهارم و پنجم می باشد. کنترلر PID به این صورت عمل می کند که یک مقدار مطلوب را در نظر گرفته و با توجه به مقدار فعلی و تفاوت آن با مقدار مطلوب، که آن را خطا می نامیم عملکرد مناسب را نشان می دهد.
    در این حالت خطا برابر است با تفاضل setpoint از موقعیت مکانی ربات. حال باید ثابت های KP و Kd را که به آن ها ثایت های تناسبی و مشتقی گفته می شود بیابیم.
    برای محاسبه ترم تناسبی کنترلر PID ، باید تفاضل PWM بیت دو موتور را بر واحد خطا تقسیم کرده و در در خود خطا ضرب نماییم. ترم مشتقی این کنترلر نیز با ضرب کردن ضریب مشتقی Kd در تغییرات خطا محاسبه می گردد.
    و سپس این دو ترم با هم جمع شده و فرمان کنترل را صادر می نمایند.
    کد نوشته شده در زیر این مراحل را انجام می دهد. این کد را کپی کرده و در نرم افزار آردوینوی خود پیست نمایید.

    #define NUM_SENSORS 8
    #define avgSpeed 255
    int leftWheelf=3;
    int leftWheelr = 5;
    int rightWheelf=6;
    int rightWheelr = 9;
    int setpoint=4, val;
    unsigned long lastTime=0, timeChange=0;
    int Sampletime=20, outMax=255, outMin=-255;
    float error,sumerr,lastError,output,ITerm,DTerm;
    float Kp=avgSpeed/4, Ki=0, Kd=.25*Kp;
    int pos;
    unsigned int sensor[]={A0,A1,A2,A3,A4,A5,A6,A7};
    unsigned int sensorValue[NUM_SENSORS];
    int threshold = 200;
    byte incomingByte;
    int bias=5;

    void setup() {
    Serial.begin(115200);
    pinMode(4,INPUT);

    }
    void loop() {
    // Serial.println(digitalRead(4));
    if (digitalRead(4)== true) {
    unsigned int Wsum=0;
    int sum=0;
    for (int i=0;i<NUM_SENSORS;i++) {
    sensorValue[i]=analogRead(sensor[i]);
    if (sensorValue[i] < threshold) sensorValue[i]=1;
    else sensorValue[i]=0;
    //Serial.print(i); Serial.print(": "); Serial.println(sensorValue[i]);
    //delay(250);
    }
    for (int i=0;i<NUM_SENSORS;i++) {
    sum=sensorValue[i]+sum;
    pos=sum;
    }

    // Serial.println(pos);
    //delay(100);
    timeChange = millis()-lastTime;
    if (timeChange >= Sampletime){
    pid(pos);
    }
    }

    else {
    if (Serial.available() > 0) {
    incomingByte = Serial.read();
    }
    if (incomingByte == 'w') {
    forward();
    }
    else if (incomingByte == 's') {
    reverse();
    }
    else if (incomingByte == 'd') {
    rightTurn();
    }
    else if (incomingByte == 'a') {
    leftTurn();
    }
    else {
    brake();
    }
    }
    }
    void pid (int val) {
    error=setpoint-val;
    ITerm+=(Ki*error);
    DTerm=Kd*(error-lastError)/(Sampletime/1000.0);
    lastError=error;
    if(ITerm > outMax) ITerm=outMax;
    else if (ITerm < outMin) ITerm=outMin;
    output=Kp*error+ITerm+DTerm;
    if (output>outMax) output=outMax;
    else if (output<outMin) output=outMin;
    lastTime=millis();
    Serial.println(val);
    if (output>0) {
    analogWrite(leftWheelf,avgSpeed);
    analogWrite(rightWheelf,avgSpeed);
    analogWrite(leftWheelr,abs(output));
    analogWrite(rightWheelr,0);
    }
    else if (output<0) {
    analogWrite(leftWheelf,avgSpeed);
    analogWrite(rightWheelf,avgSpeed);
    analogWrite(leftWheelr,0);
    analogWrite(rightWheelr,abs(output));
    }
    else {
    analogWrite(leftWheelf,avgSpeed);
    analogWrite(rightWheelf,avgSpeed);
    analogWrite(leftWheelr,0);
    analogWrite(rightWheelr,0);
    }
    }

    void forward() {
    analogWrite(leftWheelf, avgSpeed - bias);
    analogWrite(leftWheelr, 0);
    analogWrite(rightWheelr, 0);
    analogWrite(rightWheelf, avgSpeed);
    }
    void leftTurn() {
    analogWrite(leftWheelf,0);
    analogWrite(leftWheelr, 0);
    analogWrite(rightWheelr,0);
    analogWrite(rightWheelf, avgSpeed);
    }
    void rightTurn() {
    analogWrite(leftWheelf,avgSpeed);
    analogWrite(leftWheelr, 0);
    analogWrite(rightWheelr,0);
    analogWrite(rightWheelf, 0);
    }
    void reverse() {
    analogWrite(leftWheelf, 0);
    analogWrite(leftWheelr, avgSpeed-bias);
    analogWrite(rightWheelr, avgSpeed);
    analogWrite(rightWheelf, 0);
    }
    void brake() {
    analogWrite(leftWheelf, 0);
    analogWrite(leftWheelr, 0);
    analogWrite(rightWheelr, 0);
    analogWrite(rightWheelf, 0);
    }

    گام هفتم: کنترل از راه دور


    اگر دوست دارید ربات را به صورت دستی و از راه دور کنترل کنید، به یک آداپتور بلوتوث نیاز دارید.
    اگر GND را به زمین، Vin را به +5 ولت، Tx را به پین 0 روی آردوینو و Rx را به پین 1 روی آردوینو وصل کنید، می توانید کامپیوتر خود را با آردینو تان جفت کنید. این کار درست مانند یک ارتباط سریال است که می توانید از آن برای آپلود اسکریپ یا ارسال اطلاعات استفاده کنید. کد اسکریپ زیر به شما اجازه میدهد تا ربات را با استفاده از کلیدهای WASD کنترل کنید.

    // Click on the image to give it focus,
    // and then press any key.

    import processing.serial.*;

    int value = 0;
    String word = " ";
    String mode = " ";
    boolean auto = false;

    Serial myPort;


    void setup() {
    size(300, 90); // size always goes first!
    String portName = Serial.list() [0];
    myPort = new Serial(this, portName, 115200);
    }

    void draw() {

    background(0);

    myPort.write(key);

    if (auto) {
    mode = " AUTO ";
    word = " ";
    }
    else {
    mode = "MANUAL";
    }

    fill(255);
    textSize(40);
    textAlign(CENTER);
    text(mode, width/2, 40);
    textAlign(CENTER);
    text(word, width/2, 80);
    }

    void keyPressed() {
    if (key == ' ') {
    auto = !auto;
    }

    if (!auto) {
    if (key == 'w') {
    word = "FORWARD";
    }
    else if (key == 'd') {
    word = " RIGHT ";
    }
    else if (key == 'a') {
    word = " LEFT ";
    }
    else if (key == 's') {
    word = "REVERSE";
    }
    else {key = 'p';}
    }
    }

    void keyReleased() {
    key = 'p';
    }

    با آرزوی موفقیت دوستان

    کافه ربات | الهام بخش خلاقیت
    لایک کردن
    کافه ربات | الهام بخش خلاقیت
    www.thecaferobot.com

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO