سلام
تشکر از توضیحات کاملتون!!
یه سوال دارم
چجوری میتونم با این سنسور یه رله را کنترل کنم؟
میخام وقتی زاویه محور z به اندازه 90 درجه چرخید...رله روشن بشه.
برای تعادل روبات نیاز دارم
لطفا راهنمایی بفرمایید
نمایش نسخه قابل چاپ
سلام
تشکر از توضیحات کاملتون!!
یه سوال دارم
چجوری میتونم با این سنسور یه رله را کنترل کنم؟
میخام وقتی زاویه محور z به اندازه 90 درجه چرخید...رله روشن بشه.
برای تعادل روبات نیاز دارم
لطفا راهنمایی بفرمایید
البته...تشکر
اینم لینک سنسور
http://shop.aftabrayaneh.com/Sensors...ter_GY521.html
اینم لینک آردوینویی که استفاده میکنم
http://shop.aftabrayaneh.com/Arduino...H340G_UNO.html
اول برو این لینک رو بخون
Arduino with MPU6050 and angle calculation – HobbyLogs
تا بتونی زاویه بگیری از سنسورت
اینو انجام بده بیا
بازم تشکر
خوندم...
کدها را اجرا کردم...
این خروجی ها را گرفتم
فایل پیوست 1914
:cool: درواقع من دارم یه روبات کروی شکل با مکانیزم ژیروسکوپیک میسازم.... برای حفظ تعادلش به جایرو نیاز دارم!
اگه دوس داشتین از اینستاگرامم ببینید...
https://www.instagram.com/farshad_g.o.d
خب حالا اون متغیر ی که توش پارمتر زاویه نسبت به محور z رو ریخته پیدا کن . چجوری؟
کنسولت رو بازکن
اول جایروت یه جایی قرار بده که سه تا صفر بگیری یعنی کالیبره اول
ببین در راستای zجایرو رو 90 درجه بگردون
ببین کدوم تغیرت میشه 90
همون متغیر میشه متغیر مورد نظر ما که باید روش کار کنیم
این کار رو هم انجام بده
بله... ممنون از آموزشتون
کالیبره کردم...
فایل پیوست 1919
90درجه در راستای z چرخوندم...یکی از محورا تغییر کرد!
فایل پیوست 1920
:) لطفا روش پاک کردن حافظه آردوینو هم بفرمایید!!..تشکر
مممم
خوبه
حالا پیدا کن این کدوم متغیره
وقتی پیداش کردی این if رو بنویس:
کد:if(zdirection==90) digitalWrite (relaypin,LOW);
else digitalWrite (relaypin,HIGH);
من توی این شرطی که نوشتم فرض کردم اسم متغیری که توش زاویه در راستای Z هست zdirection هست شما باید جایگزین کنی
relaypin پین دیجیتالی هست که شما رله رو بهش وصل کردی
بسته به این که رله ای که خریدی 0 فعال باشه یا 1 فعال اون پین رو HIGH و LOW می کنی
الان توی این کد من رله صفرفعاله
مررسی...خیلی لطف کردین!!
چک کردم
اسم اون متغیر accel_y_scalled بود! زاویه را به صفر تغییر دادم! کد را زیر همون متغیر نوشتم... فقط خطا داد:confused:
if(accel_y_scalled==0) digitalWrite (relaypin,LOW);
else digitalWrite (relaypin,HIGH);
فایل پیوست 1922
لطفا روش پاک کردن حافظه آردوینو هم بفرمایید!! حافظه آردوینوی من پر شده...نمیدونم چجوری خالیش کنم:confused::confused:
آیا relaypin رو جایی تعریف کردی؟
مثلا بگی
در این حالت رله رو به پایه دیجیتال شماره 3 باید وصل کنی.کد:int relaypin=3;
منظورت از پاک کردن حافظه چیه ؟
اگه منورت حافظه فلشه که هر بار که کد آپلود میکنی خودش رفرشش می کنه
اگه کدت سنگین شده اونجاهایی رو که نیاز نداری پاک کن
ممنون!! درسته...یادم نبود پایه را تعریف کنم;)
کد درسته...آپلود هم میشه! فقط وقتی زاویه را به صفر میرسونم رله روشن نمیشه!.......
این لینک رله منه ماژول رله 5 ولت دوکاناله
من با این رله کار نکردم ولی به نظرن باید active low باشه
ببین یه تستی کن
الان این باید 4 تا پین داشته باشه دیکه مگه نه ؟ (چون دو کانالس )
یکیش که vcc
یکیش که گراند
دوتاش مربوط به رله هاست
پایه های vcc و گراند رو نصب کن
حالا یه سیم بزن به یکی از پای های فعال سازی رله هات
اون یکی سر سیمت که آزاده رو یه بار بزن به گراند یه بار به VCC
ببین با کدومش رله رو روشن میکنه
خبر بده
با گراند روشن میشه!
خیلی ممنوم...وقت شما هم گرفتم
نمیدونم مشکل چیه؟؟چندمرتبه تست کردم
حتی ولتاژ خروجی پایه 3دیجیتال هم چک کردم...درسته 5ولت
شماره پایه هم تغییردادم...بازم رله روشن نشد
حتی کد هم بصورت if(accel_y_scalled<90 عوض کردم.... تا زاویه های کمتر از 90درجه جواب بده.... ولی رله روشن نمیشه!
:confused:با جایرو چجوری میتونم سروو را کنترل کنم؟؟ که مثلا وقتی زاویه کمتر از 90 میشه...حرکت کنه!
مرسی
من این قسمت را اضافه کردم
int relaypin=3;
if(accel_y_scalled<90) digitalWrite (relaypin,LOW);
else digitalWrite (relaypin,HIGH);
اینم کد:
نقل قول:
/* Author = helscream (Omer Ikram ul Haq)
Last edit date = 2014-10-08
Website: Arduino with MPU6050 and angle calculation – HobbyLogs
Location: Pakistan
Ver: 0.1 beta --- Start
Ver: 0.2 beta --- Bug fixed for calculating "angle_y_accel" and "angle_x_accel" in "Gyro_header.ino" file
*/
#include <Wire.h>
#include "gyro_accel.h"
// Defining constants
#define dt 20 // time difference in milli seconds
#define rad2degree 57.3 // Radian to degree conversion
#define Filter_gain 0.95 // e.g. angle = angle_gyro*Filter_gain + angle_accel*(1-Filter_gain)
// ************************************************** *******************
// Global Variables
// ************************************************** *******************
unsigned long t=0; // Time Variables
float angle_x_gyro=0,angle_y_gyro=0,angle_z_gyro=0,angle _x_accel=0,angle_y_accel=0,angle_z_accel=0,angle_x =0,angle_y=0,angle_z=0;
// ************************************************** *******************
// Main Code
void setup(){
Serial.begin(115200);
Wire.begin();
MPU6050_ResetWake();
MPU6050_SetGains(0,1);// Setting the lows scale
MPU6050_SetDLPF(0); // Setting the DLPF to inf Bandwidth for calibration
MPU6050_OffsetCal();
MPU6050_SetDLPF(6); // Setting the DLPF to lowest Bandwidth
Serial.print("gyro_x_scalled");
Serial.print("\tgyro_y_scalled");
Serial.print("\tgyro_z_scalled");
Serial.print("\taccel_x_scalled");
Serial.print("\taccel_y_scalled");
Serial.print("\taccel_z_scalled");
Serial.print("\tangle_x_gyro");
Serial.print("\tangle_y_gyro");
Serial.print("\tangle_z_gyro");
Serial.print("\tangle_x_accel");
Serial.print("\tangle_y_accel");
Serial.print("\tangle_z_accel");
Serial.print("\tangle_x");
Serial.print("\tangle_y");
Serial.print("\tangle_z");
Serial.println("\tLoad");
t=millis();
}
void loop(){
t=millis();
MPU6050_ReadData();
angle_x_gyro = (gyro_x_scalled*((float)dt/1000)+angle_x);
angle_y_gyro = (gyro_y_scalled*((float)dt/1000)+angle_y);
int relaypin=3;
if(accel_y_scalled<90) digitalWrite (relaypin,LOW);
else digitalWrite (relaypin,HIGH);
angle_z_gyro = (gyro_z_scalled*((float)dt/1000)+angle_z);
angle_z_accel = atan(accel_z_scalled/(sqrt(accel_y_scalled*accel_y_scalled+accel_x_scal led*accel_x_scalled)))*(float)rad2degree;
angle_y_accel = -atan(accel_y_scalled/(sqrt(accel_y_scalled*accel_y_scalled+accel_z_scal led*accel_z_scalled)))*(float)rad2degree;
angle_x_accel = atan(accel_x_scalled/(sqrt(accel_x_scalled*accel_x_scalled+accel_z_scal led*accel_z_scalled)))*(float)rad2degree;
angle_x = Filter_gain*angle_x_gyro+(1-Filter_gain)*angle_x_accel;
angle_y = Filter_gain*angle_y_gyro+(1-Filter_gain)*angle_y_accel;
angle_z = Filter_gain*angle_z_gyro+(1-Filter_gain)*angle_z_accel;
Serial.print(gyro_x_scalled);
Serial.print("\t");
Serial.print(gyro_y_scalled);
Serial.print("\t");
Serial.print(gyro_z_scalled);
Serial.print("\t");
Serial.print(accel_x_scalled);
Serial.print("\t");
Serial.print(accel_y_scalled);
Serial.print("\t");
Serial.print(accel_z_scalled);
Serial.print("\t");
Serial.print(angle_x_gyro);
Serial.print("\t");
Serial.print(angle_y_gyro);
Serial.print("\t");
Serial.print(angle_z_gyro);
Serial.print("\t");
Serial.print(angle_x_accel);
Serial.print("\t");
Serial.print(angle_y_accel);
Serial.print("\t");
Serial.print(angle_z_accel);
Serial.print("\t");
Serial.print(angle_x);
Serial.print("\t");
Serial.print(angle_y);
Serial.print("\t");
Serial.print(angle_z);
Serial.print("\t");
Serial.println(((float)(millis()-t)/(float)dt)*100);
while((millis()-t) < dt){ // Making sure the cycle time is equal to dt
// Do nothing
}
}
اینو تست کن :
کد:
/* Author = helscream (Omer Ikram ul Haq)
Last edit date = 2014-10-08
Website: Arduino with MPU6050 and angle calculation – HobbyLogs
Location: Pakistan
Ver: 0.1 beta --- Start
Ver: 0.2 beta --- Bug fixed for calculating "angle_y_accel" and "angle_x_accel" in "Gyro_header.ino" file
*/
#include <Wire.h>
#include "gyro_accel.h"
// Defining constants
#define dt 20 // time difference in milli seconds
#define rad2degree 57.3 // Radian to degree conversion
#define Filter_gain 0.95 // e.g. angle = angle_gyro*Filter_gain + angle_accel*(1-Filter_gain)
// ************************************************** *******************
// Global Variables
// ************************************************** *******************
unsigned long t = 0; // Time Variables
float angle_x_gyro = 0, angle_y_gyro = 0, angle_z_gyro = 0, angle _x_accel = 0, angle_y_accel = 0, angle_z_accel = 0, angle_x = 0, angle_y = 0, angle_z = 0;
// ************************************************** *******************
// Main Code
void setup() {
Serial.begin(115200);
Wire.begin();
MPU6050_ResetWake();
MPU6050_SetGains(0, 1); // Setting the lows scale
MPU6050_SetDLPF(0); // Setting the DLPF to inf Bandwidth for calibration
MPU6050_OffsetCal();
MPU6050_SetDLPF(6); // Setting the DLPF to lowest Bandwidth
Serial.print("gyro_x_scalled");
Serial.print("\tgyro_y_scalled");
Serial.print("\tgyro_z_scalled");
Serial.print("\taccel_x_scalled");
Serial.print("\taccel_y_scalled");
Serial.print("\taccel_z_scalled");
Serial.print("\tangle_x_gyro");
Serial.print("\tangle_y_gyro");
Serial.print("\tangle_z_gyro");
Serial.print("\tangle_x_accel");
Serial.print("\tangle_y_accel");
Serial.print("\tangle_z_accel");
Serial.print("\tangle_x");
Serial.print("\tangle_y");
Serial.print("\tangle_z");
Serial.println("\tLoad");
t = millis();
}
void loop() {
int relaypin = 3;
t = millis();
MPU6050_ReadData();
angle_x_gyro = (gyro_x_scalled * ((float)dt / 1000) + angle_x);
angle_y_gyro = (gyro_y_scalled * ((float)dt / 1000) + angle_y);
if (angle_y_gyro < 90) digitalWrite (relaypin, LOW);
else digitalWrite (relaypin, HIGH);
angle_z_gyro = (gyro_z_scalled * ((float)dt / 1000) + angle_z);
angle_z_accel = atan(accel_z_scalled / (sqrt(accel_y_scalled * accel_y_scalled + accel_x_scal led * accel_x_scalled))) * (float)rad2degree;
angle_y_accel = -atan(accel_y_scalled / (sqrt(accel_y_scalled * accel_y_scalled + accel_z_scal led * accel_z_scalled))) * (float)rad2degree;
angle_x_accel = atan(accel_x_scalled / (sqrt(accel_x_scalled * accel_x_scalled + accel_z_scal led * accel_z_scalled))) * (float)rad2degree;
angle_x = Filter_gain * angle_x_gyro + (1 - Filter_gain) * angle_x_accel;
angle_y = Filter_gain * angle_y_gyro + (1 - Filter_gain) * angle_y_accel;
angle_z = Filter_gain * angle_z_gyro + (1 - Filter_gain) * angle_z_accel;
Serial.print(gyro_x_scalled);
Serial.print("\t");
Serial.print(gyro_y_scalled);
Serial.print("\t");
Serial.print(gyro_z_scalled);
Serial.print("\t");
Serial.print(accel_x_scalled);
Serial.print("\t");
Serial.print(accel_y_scalled);
Serial.print("\t");
Serial.print(accel_z_scalled);
Serial.print("\t");
Serial.print(angle_x_gyro);
Serial.print("\t");
Serial.print(angle_y_gyro);
Serial.print("\t");
Serial.print(angle_z_gyro);
Serial.print("\t");
Serial.print(angle_x_accel);
Serial.print("\t");
Serial.print(angle_y_accel);
Serial.print("\t");
Serial.print(angle_z_accel);
Serial.print("\t");
Serial.print(angle_x);
Serial.print("\t");
Serial.print(angle_y);
Serial.print("\t");
Serial.print(angle_z);
Serial.print("\t");
Serial.println(((float)(millis() - t) / (float)dt) * 100);
while ((millis() - t) < dt) { // Making sure the cycle time is equal to dt
// Do nothing
}
}
تست کردم....
این خطا را داد
Arduino: 1.6.6 Hourly Build 2015/10/22 05:42 (Windows 7), Board: "Arduino/Genuino Uno"
F:\My circuits\gyro\omega-gyroXXX\omega-gyroXXX.ino:13:24: fatal error: gyro_accel.h: No such file or directory
#include "gyro_accel.h"
^
compilation terminated.
exit status 1
Error compiling.
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
مرسی...:)
کتابخونه را استفاده کردم...فقط بازم خطا داد!
Arduino: 1.6.6 Hourly Build 2015/10/22 05:42 (Windows 7), Board: "Arduino/Genuino Uno"
In file included from F:\My circuits\!!!!!!!!!!!! ط¢ط±ط¯غŒظ†ظˆ\ط³ظپط§ط±ط´ط§ طھ ط®ط±غŒط¯\gy-521 mpu6050 example code\MPU6050_Arduino-master\Ver_0_1b\Gyro_header\farshad268\farshad268. ino:13:0:
sketch\gyro_accel.h:1:19: warning: extra tokens at end of #ifndef directive [enabled by default]
#ifndef gyro_accel.h
^
sketch\gyro_accel.h:2:21: warning: ISO C99 requires whitespace after the macro name [enabled by default]
#define gyro_accel.h
^
farshad268:22: error: expected initializer before '_x_accel'
F:\My circuits\!!!!!!!!!!!! ط¢ط±ط¯غŒظ†ظˆ\ط³ظپط§ط±ط´ط§ طھ ط®ط±غŒط¯\gy-521 mpu6050 example code\MPU6050_Arduino-master\Ver_0_1b\Gyro_header\farshad268\farshad268. ino: In function 'void loop()':
farshad268:59: error: 'angle_x' was not declared in this scope
farshad268:60: error: 'angle_y' was not declared in this scope
farshad268:66: error: 'angle_z' was not declared in this scope
farshad268:69: error: 'angle_z_accel' was not declared in this scope
farshad268:69: error: 'accel_x_scal' was not declared in this scope
farshad268:70: error: 'angle_y_accel' was not declared in this scope
farshad268:70: error: 'accel_z_scal' was not declared in this scope
farshad268:71: error: 'angle_x_accel' was not declared in this scope
exit status 1
expected initializer before '_x_accel'
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
راستش منم چیز زیادی از آردوینو نمیدونم:confused:...این تخصص شماست:cool:
اینم کتابخونه...
#ifndef gyro_accel.h
#define gyro_accel.h
extern int accel_x_OC, accel_y_OC, accel_z_OC, gyro_x_OC ,gyro_y_OC, gyro_z_OC; // offset variables
extern float temp_scalled,accel_x_scalled,accel_y_scalled,accel _z_scalled,gyro_x_scalled,gyro_y_scalled,gyro_z_sc alled; //Scalled Data varaibles
void MPU6050_ReadData();
void MPU6050_ResetWake();
void MPU6050_SetDLPF(int BW);
void MPU6050_SetGains(int gyro,int accel);
void MPU6050_OffsetCal();
#endif
/* Author = helscream (Omer Ikram ul Haq)
Last edit date = 2014-06-22
Website: Arduino with MPU6050 and angle calculation – HobbyLogs
Location: Pakistan
Ver: 0.1 beta --- Start
*/
من این فایل را گرفتم https://codeload.github.com/helscrea...ino/zip/master
از این پوشه استفاده کردم
Ver_0_1b/Gyro_header
خیلی ممنونم
ولی من چیزی از برنامه نویسی نمیدونم:(
یعنی هیچ مثال مشابهی نیست که بتونه با تغییر زاویه رله را روشن کنه یا سروو را کنترل کنه>؟
یه سوال هم درمورد سروو داشتم...
من سروو 180 درجه را به رسیور رادیوکنترل وصل کردم..ولی کمتر از 180درجه میچرخه!!.... آیا مربوط به تنظیمات رادیو میشه؟...چیکار کنم تا 180درجه بچرخه؟
تشکر
ببین سرووهای 180 معمولا دقیقا 180 نیستن
معمولا صد و هفتاد و خورده ای می زنن
حالا
قراره برای سنسورمون کد آردوینو پیدا کنیم
مدل سنسور ما GY_521 هست درسته ؟
برای سرچ می نویسیم GY_521 Arduino
یه عالمه لینک از کد و سیم بندی برامون میاره
مثلا یکیش اینه
Arduino Modules - 6-Assige Gyroscoop + Versnellingsmeter ITG/MPU (GY-521)
زبون صفحه نمیدونم کجاییه با google chrome بازش کن و صفحه رو ترجمه کن
سیم بندی رو رعایت کن
کد رو همراه با کتابخونه هاش آپلود کن و بیا
مرسی
کتابخونه را آپلود کردم... ولی برنامه آپلود نمیشه!
لطفا راهنمایی کنید....
اینم خطای این برنامه
Arduino: 1.6.6 Hourly Build 2015/10/22 05:42 (Windows 7), Board: "Arduino/Genuino Uno"
In file included from F:\My circuits\!!!!!!!!!!!! ط¢ط±ط¯غŒظ†ظˆ\ط³ظپط§ط±ط´ط§ طھ ط®ط±غŒط¯\gy-521 mpu6050 example code\New268\farshad\farshad.ino:2:0:
C:\Users\farshad\Documents\Arduino\libraries\MPU60 50/MPU6050.h:40:20: fatal error: I2Cdev.h: No such file or directory
#include "I2Cdev.h"
^
compilation terminated.
exit status 1
Error compiling.
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
سلام دوستان
مرسی بابت این تایپک بسیار عالی
من چند روزه دارم دنبال یه منبع درست برای این ماژول میگردم
من برنامه پست اول تاپیک رو ریختم و این نتایجش هست:
الان چندتا سوال داشتم
اول اینکه چطور میتونم این ماژول رو کالیبره کنم؟ آیا اصلا این کار لازمه؟ توی تاپیک های خارجی یه چیزایی دیدم ولی هیچکدوم عمل نکرد
دوم اینکه چجوری این مقادیر رو بر حسب درجه بدست بیارم؟
سوم اینکه چرا مقادیر خروجی سنسور اینقدر نوسان داره؟
ممنونم
سلام
این چرا اینقدر کدهای برنامه نویسیش زیاد و پیچیده هست
من فقط محور y رو برام اندازه گیری کنه کافیه
میشه یه کد خلاصه در حد یک محور قرار بدید
ممنون
یک لینک معتبر برای کتابخانه لطف می کنید
همچنین یک فایل کامپایل شده لطفا
سرگیجه گرفتم از بس گشتم