в состоянии покоя при подключении к 5 В вот такие результаты строк Serial.print(gyroX); Serial.print("\t"); и Serial.print(accX); Serial.print("\t"); без использования резистеров дополнительных
так если плата рассчитана на питание 5В зачем на нее 3.3В подавать. после стабилизатора напряжение будет еще ниже, ниже номинального. а если так то чему удивлятся что значения разные. хотя очень похоже. может и не разные)) шума много. ты трясь или это шум в состоянии покоя?
должно быть. кому нужны эти непонятные цифры? посмотри проекты контроллеров для квадрокоптеров. там где используется такой чип. они должны по идее переводить в нормальные цифры
Я думаю что не легко найти перевод в g потому что сами знания не так важны, нужны которые значения с которыми можно работать. Сравнивать там . но сейчас поищу
В сообщении 88 есть код который ты помог на прерываниях сделать а получится ли такой же для новых акселерометров? И можно ли при крутить тот таймер который мы сделали для просчета времени?
Привет!! Как вывести с гироскопа на шаговый мотор ? При условии Х - в одну строну вращение а Х + в другую. Когда гироскоп выдает сигнал -10 , к примеру ,а потом +10.
Постараюсь... Значит так , Один гироскоп закреплен на раме в горизонтальном положении и если он наклонется в право то сразу же шаговый мотор должен выровнять в вертикальное положение. Если наклоняется в лево то также но в другую сторону мотор вкл и выравниват опять в вертикальное положение. Шаговый мотор с редуктором 1 : 60.
уж не такой мотор? если да он не справится с тем что ты хочешь. так для макета первоначального пойдет, но не для установки на велосипеде чтобы крутить твой огромный гироскоп
ты путаешь теплое с мягким. тебе нужно определится при каких углах на гироскопе нужно что то делать. а потом добавить условия если такой или такой угол то сделать то то, например включить светодиод или управлять мотором
откуда твой гироскоп может знать что ты хочешь зажечь светодиод. он только измеряет углы и отдает данные. а для чего они тебе и что ты с ними будешь дальше делать его мало колышет
Значит гироскоп задает угол то мотор должен работать до тех пор пока гиросокп не станет вертикально. Или гореть светодиод до тех пор пока также не станет вертикально гироскоп.
давай по другому. преставь гироскоп это часы. а ты это ардуина. часы показывают время, и оно ничего не значит само по себе. оно имеет значение для тебя. и ты по ним например каждый час поливаешь цветы (бред но неважно)
с часами что то происходит в момент полива? они решаеют когда поливать? нет. они показывают сколько время. а то что нужно поливать каждый час, как поливать и сколько решаешь ты
у тебя есть условия если время равно час, два и далее то поливать, иначе (другое время) то не поливать
При наклоне шаговый вкл и выравнивает до тех пор пока не станет на гиросокопе 0. Если наклоняется и гироскоп паказывает минус 10 ил 20 невашно должен вкл шаговый и работать до тех пор пока не станет 0. А если +10ил 20 то также но в другую строну вращение мотора пока не станет на гироскопе 0 и шаговик должен выкл. при 0.
я разобрался. при выставленном значении в 2G необходимо делить на 16384 согласно даташиту с.13 п. 6.2.
так же необходимо калибровать когда поставим датчик на место.
остлось теперь поменять в коде с прерываниями ардуин акселерометры. но пока что это сверхсложная задача. так как с тем то проще было: подклчил библиотеку и вывел значения а тут и фильтрация и еще гироскоп везде.
SergeiNSK помигай светодиодом, кнопочками побалуйся. потом шаговым мотором. то я объясняю, но какой смысл если ты программировать не умеешь. за тебя писать я не буду
я объединил старый код с миганием лампочками и фотостартом и таймером и фильтром калмана. в том ли месте я воткнул таймер ? так как это очень важно, что б синхронно и он верно отмерял время после каждого измерения.
#include <Wire.h>
#include "Kalman.h" // Source: https://github.com/TKJElectronics/KalmanFilter
#define RESTRICT_PITCH // Comment out to restrict roll to ±90deg instead - please read: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf
Kalman kalmanX; // Create the Kalman instances
Kalman kalmanY;
/* IMU Data */
double accX, accY, accZ;
double gyroX, gyroY, gyroZ;
int16_t tempRaw;
/* данные для ведущей ардуино. начальное положение: маятник закрывает свет при
начале его движения свет попадает на ЧЭ и программа начинает счет */
int prer = 11;
int rec=0;
int led=12;
int disp=13;
int i=0;
unsigned long time;
double gyroXangle, gyroYangle; // Angle calculate using the gyro only
double compAngleX, compAngleY; // Calculated angle using a complementary filter
double kalAngleX, kalAngleY; // Calculated angle using a Kalman filter
uint32_t timer;
uint8_t i2cData[14]; // Buffer for I2C data
void setup() {
Serial.begin(115200);
Wire.begin();
/* для прерываний от ведущей к ведомой */
pinMode(prer, OUTPUT);
pinMode(led, OUTPUT);
pinMode(disp, OUTPUT);
/* до этого момента */
TWBR = ((F_CPU / 400000L) - 16) / 2; // Set I2C frequency to 400kHz
i2cData[0] = 7; // Set the sample rate to 1000Hz - 8kHz/(7+1) = 1000Hz
i2cData[1] = 0x00; // Disable FSYNC and set 260 Hz Acc filtering, 256 Hz Gyro filtering, 8 KHz sampling
i2cData[2] = 0x00; // Set Gyro Full Scale Range to ±250deg/s
i2cData[3] = 0x00; // Set Accelerometer Full Scale Range to ±2g
while (i2cWrite(0x19, i2cData, 4, false)); // Write to all four registers at once
while (i2cWrite(0x6B, 0x01, true)); // PLL with X axis gyroscope reference and disable sleep mode
while (i2cRead(0x75, i2cData, 1));
if (i2cData[0] != 0x68) { // Read "WHO_AM_I" register
Serial.print(F("Error reading sensor"));
while (1);
}
delay(100); // Wait for sensor to stabilize
/* Set kalman and gyro starting angle */
while (i2cRead(0x3B, i2cData, 6));
accX = (i2cData[0] << 8) | i2cData[1];
accY = (i2cData[2] << 8) | i2cData[3];
accZ = (i2cData[4] << 8) | i2cData[5];
// Source: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf eq. 25 and eq. 26
// atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2
// It is then converted from radians to degrees
#ifdef RESTRICT_PITCH // Eq. 25 and 26
double roll = atan2(accY, accZ) * RAD_TO_DEG;
double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;
#else // Eq. 28 and 29
double roll = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;
double pitch = atan2(-accX, accZ) * RAD_TO_DEG;
#endif
kalmanX.setAngle(roll); // Set starting angle
kalmanY.setAngle(pitch);
gyroXangle = roll;
gyroYangle = pitch;
compAngleX = roll;
compAngleY = pitch;
timer = micros();
}
void loop()
{
time = micros();
digitalWrite(led,HIGH);
if (analogRead(rec)>800)
{
digitalWrite(disp,HIGH);
while(i<400)
{
//digitalWrite(prer, HIGH);
delay(5);
//digitalWrite(prer, LOW);
/* Update all the values */
while (i2cRead(0x3B, i2cData, 14));
accX = ((i2cData[0] << 8) | i2cData[1]) + 2000.0; // You might need to adjust these zeroes values depending on your accelerometer
accY = ((i2cData[2] << 8) | i2cData[3]) + 3319.84;
accZ = ((i2cData[4] << 8) | i2cData[5]) + 664.48;
tempRaw = (i2cData[6] << 8) | i2cData[7];
gyroX = (i2cData[8] << 8) | i2cData[9];
gyroY = (i2cData[10] << 8) | i2cData[11];
gyroZ = (i2cData[12] << 8) | i2cData[13];
double dt = (double)(micros() - timer) / 1000000; // Calculate delta time
timer = micros();
// Source: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf eq. 25 and eq. 26
// atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2
// It is then converted from radians to degrees
#ifdef RESTRICT_PITCH // Eq. 25 and 26
double roll = atan2(accY, accZ) * RAD_TO_DEG;
double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;
#else // Eq. 28 and 29
double roll = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;
double pitch = atan2(-accX, accZ) * RAD_TO_DEG;
#endif
double gyroXrate = gyroX / 131.0; // Convert to deg/s
double gyroYrate = gyroY / 131.0; // Convert to deg/s
#ifdef RESTRICT_PITCH
// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degrees
if ((roll < -90 && kalAngleX > 90) || (roll > 90 && kalAngleX < -90)) {
kalmanX.setAngle(roll);
compAngleX = roll;
kalAngleX = roll;
gyroXangle = roll;
} else
kalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filter
if (abs(kalAngleX) > 90)
gyroYrate = -gyroYrate; // Invert rate, so it fits the restriced accelerometer reading
kalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt);
#else
// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degrees
if ((pitch < -90 && kalAngleY > 90) || (pitch > 90 && kalAngleY < -90)) {
kalmanY.setAngle(pitch);
compAngleY = pitch;
kalAngleY = pitch;
gyroYangle = pitch;
} else
kalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt); // Calculate the angle using a Kalman filter
if (abs(kalAngleY) > 90)
gyroXrate = -gyroXrate; // Invert rate, so it fits the restriced accelerometer reading
kalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filter
#endif
gyroXangle += gyroXrate * dt; // Calculate gyro angle without any filter
gyroYangle += gyroYrate * dt;
//gyroXangle += kalmanX.getRate() * dt; // Calculate gyro angle using the unbiased rate
//gyroYangle += kalmanY.getRate() * dt;
compAngleX = 0.93 * (compAngleX + gyroXrate * dt) + 0.07 * roll; // Calculate the angle using a Complimentary filter
compAngleY = 0.93 * (compAngleY + gyroYrate * dt) + 0.07 * pitch;
// Reset the gyro angle when it has drifted too much
if (gyroXangle < -180 || gyroXangle > 180)
gyroXangle = kalAngleX;
if (gyroYangle < -180 || gyroYangle > 180)
gyroYangle = kalAngleY;
/* Print Data */
#if 1 // Set to 1 to activate
Serial.print(accX); Serial.print("\t");
Serial.println(micros()-time);
// Serial.print(accY); Serial.print("\t");
// Serial.print(accZ); Serial.print("\t");
//
// Serial.print(gyroX); Serial.print("\t");
// Serial.print(gyroY); Serial.print("\t");
// Serial.print(gyroZ); Serial.print("\t");
Serial.print("\t");
#endif
Serial.print("\r\n");
// delay(2);
//}
//delay(5);
i++;
}}
//}
else
{
digitalWrite(disp,LOW);
}
}
//}
первая цифра это ускорение из которого нужно вычесть 2000(приблизительно, надо калибровать) и поделить на 16384. датчик лежит на столе. а вторая это время правда не ясно какое именно =)
то, что разные показания с акселерометров - это пока не страшно - я еще не калибровал.
но вроде место размещения таймеров одно и тоже: сразу после лупа и вывод после вывода показания, но время различается кардинально, почему? может ли влиять тот факт, что второй процессор ровно в два раза слабее?
а с синхронностью пока не ясно, работают ли они синхронно, как это определить наверняка?
в состоянии покоя при подключении к 5 В вот такие результаты строк Serial.print(gyroX); Serial.print("\t"); и Serial.print(accX); Serial.print("\t"); без использования резистеров дополнительных
так если плата рассчитана на питание 5В зачем на нее 3.3В подавать. после стабилизатора напряжение будет еще ниже, ниже номинального. а если так то чему удивлятся что значения разные. хотя очень похоже. может и не разные)) шума много. ты трясь или это шум в состоянии покоя?
это шум в состоянии покоя! придавил акселерометр к столу что б не дергался.
вот результаты со скетча который на сайте arduino.cc называется MPU6050_DMP6
в начале, по 3-ем осям:
и вот последний скетч оттуда же откуда и предидущий, но назван MPU6050_raw
как пересчитывать не нашел?
нет, просмотрел весь даташит но там не обнаружил и в нете на страницах с этими скетчами ничего такого не скакзано (
должно быть. кому нужны эти непонятные цифры? посмотри проекты контроллеров для квадрокоптеров. там где используется такой чип. они должны по идее переводить в нормальные цифры
Я думаю что не легко найти перевод в g потому что сами знания не так важны, нужны которые значения с которыми можно работать. Сравнивать там . но сейчас поищу
В сообщении 88 есть код который ты помог на прерываниях сделать а получится ли такой же для новых акселерометров? И можно ли при крутить тот таймер который мы сделали для просчета времени?
а почему бы и нет. вроде ничего не противоречит. но лучше также сначала узнать сколько времени занимает 1 измерение
Привет!! Как вывести с гироскопа на шаговый мотор ? При условии Х - в одну строну вращение а Х + в другую. Когда гироскоп выдает сигнал -10 , к примеру ,а потом +10.
данные с гироскопа по которым ты можешь делать вывод о положении научился получать?
шаговым мотором управлять уже умеешь?
Данные толь на мониторе вижу как меняется , а как навыход вывести беспонятия.
Как прописать , указать на вывод сигнал с гироскопа?
определись сначала с числами при которых нужно поворачивать
а про мотор чего молчишь
Шаговый пока в тишине , заканчиваю драйвера на него паять.
самодельный? ну дело твое
Вот этот код отлично работает, а дальше что и как ..............ну нуб я нуб...
Нет не самодельный, а вот этот http://amperka.ru/product/troyka-stepper-motor-driver но он слаб я ставить буду оптразвязку на 3120 http://www.chipdip.ru/product/hcpl-3120/ оптике и полевики с Н мостом. Если пробьет то спалит оптику 3120а ардуинка целая будет.
или сразу с ардуинки на оптику или на драйвер Тройку. Сейчас мненужно указать на выход на пин с гироскопа.
слабоватый драйвер
а вообще ты не читаешь что я тебе пишу. опиши принцип как должно работать. с числами. без кода
Постараюсь... Значит так , Один гироскоп закреплен на раме в горизонтальном положении и если он наклонется в право то сразу же шаговый мотор должен выровнять в вертикальное положение. Если наклоняется в лево то также но в другую сторону мотор вкл и выравниват опять в вертикальное положение. Шаговый мотор с редуктором 1 : 60.
уж не такой мотор? если да он не справится с тем что ты хочешь. так для макета первоначального пойдет, но не для установки на велосипеде чтобы крутить твой огромный гироскоп
А потом с датчика скорости с направлением сниматься должен сигнал и изменять данные с датчика гироскопа. Ну это потом.
Не нетакой, мой на видео побольше с червячным редуктором.
http://elcom-vostok.ru/3Dпринтеры-комплектующие/шаговые-двигатели/STP-42D2130.html
ну это другое дело. драйвер слабоват для такого мотора. купи лучше сразу нормальный. стоит 100р за шт
100 р русскими ?? Ссылку скинь.....
Да и спасибо .
русскими. но это в китае
121 если точнее. но там еще перемычки нужно допаивать для установки шага. хотя если не поставить вроде будет полный шаг. надо уточнять
http://ru.aliexpress.com/item/Free-shipping-3D-Printer-StepStick-DRV8825-Stepper-Motor-Drive-Carrier-Reprap-4-layer-PCB-RAMPS/32244234357.html
http://ru.aliexpress.com/item/A3967-EasyDriver-Stepper-Motor-Driver-Board-Pin-Header-For-Arduino-Hot-Sale/32299377547.html
http://ru.aliexpress.com/item/A4988-Stepper-Motor-Driver-Module-Reprap-Stepper-Driver-Board-High-Quality-Motor-Accessories/32296014196.html
выбери по току подходящий. первый самый мощный насколько помню
по названиям можешь искать поблизости
только сейчас увидел что ты такую фигню купил за 990 рублей)))
http://www.aliexpress.com/snapshot/6537835225.html?orderId=66255950762128
Я такой набор купил вот жду уже почти месяц. Там такие есть драйвера.
правильно сделал
Как вывести сигнал с гиросокпа , к примеру на пины с светодиодами.
Светодиоды я поставлю куда скажет на любой выход.
ты путаешь теплое с мягким. тебе нужно определится при каких углах на гироскопе нужно что то делать. а потом добавить условия если такой или такой угол то сделать то то, например включить светодиод или управлять мотором
откуда твой гироскоп может знать что ты хочешь зажечь светодиод. он только измеряет углы и отдает данные. а для чего они тебе и что ты с ними будешь дальше делать его мало колышет
Значит гироскоп задает угол то мотор должен работать до тех пор пока гиросокп не станет вертикально. Или гореть светодиод до тех пор пока также не станет вертикально гироскоп.
Я так думаю .......... или туплю
С тобой общаюсь быстрее учусь , чем по книжкам.
гироскоп говорит в каком положении велосипед. и все. а ты говоришь ардуине крутить шаговик пока не станет такой то угол велосипеда
Да верно. Я хочу не только скопировать чейто код но и понять его что да как уж шибко интересно.
да пожалуйста. бери железку. гугли разбирайся экспериментируй. тогда будешь разбираться. теория без практики/экспериментов бесполезна
Там все коды уже законченные а мне б хотябы на выводы вывести сигнал.
какой сигнал на выводы вывести? градусы чтоли?
давай по другому. преставь гироскоп это часы. а ты это ардуина. часы показывают время, и оно ничего не значит само по себе. оно имеет значение для тебя. и ты по ним например каждый час поливаешь цветы (бред но неважно)
с часами что то происходит в момент полива? они решаеют когда поливать? нет. они показывают сколько время. а то что нужно поливать каждый час, как поливать и сколько решаешь ты
у тебя есть условия если время равно час, два и далее то поливать, иначе (другое время) то не поливать
Привет!!
При наклоне шаговый вкл и выравнивает до тех пор пока не станет на гиросокопе 0. Если наклоняется и гироскоп паказывает минус 10 ил 20 невашно должен вкл шаговый и работать до тех пор пока не станет 0. А если +10ил 20 то также но в другую строну вращение мотора пока не станет на гироскопе 0 и шаговик должен выкл. при 0.
При малейшем наклоне чтобы шаоговик срабатывал.
Может перейдем на страничку с моим агрегатом?
я разобрался. при выставленном значении в 2G необходимо делить на 16384 согласно даташиту с.13 п. 6.2.
так же необходимо калибровать когда поставим датчик на место.
остлось теперь поменять в коде с прерываниями ардуин акселерометры. но пока что это сверхсложная задача. так как с тем то проще было: подклчил библиотеку и вывел значения а тут и фильтрация и еще гироскоп везде.
Никита выложи свой код.
SergeiNSK помигай светодиодом, кнопочками побалуйся. потом шаговым мотором. то я объясняю, но какой смысл если ты программировать не умеешь. за тебя писать я не буду
Спасибо добрый человек.
Помигал , отдельно и шаговый включил. А как соеденить сигнал с гирокопа на шаговый тут я не знаю.
Будем искать кто сможет обьяснить 0 проблем.
Время потеряного жалко.
я тебе объяснил и не раз. ты не понимаешь
Забудь. Все отлично.
я объединил старый код с миганием лампочками и фотостартом и таймером и фильтром калмана. в том ли месте я воткнул таймер ? так как это очень важно, что б синхронно и он верно отмерял время после каждого измерения.
вот результаты с монитора:
первая цифра это ускорение из которого нужно вычесть 2000(приблизительно, надо калибровать) и поделить на 16384. датчик лежит на столе. а вторая это время правда не ясно какое именно =)
и так: я хотел бы подвести итог дня:
1) ссылка на код для ардуины с фотостартомhttp://pastebin.com/bAGaNZvG
2) для ведомой, на прерываниях http://pastebin.com/K0iMbki4
то, что разные показания с акселерометров - это пока не страшно - я еще не калибровал.
но вроде место размещения таймеров одно и тоже: сразу после лупа и вывод после вывода показания, но время различается кардинально, почему? может ли влиять тот факт, что второй процессор ровно в два раза слабее?
а с синхронностью пока не ясно, работают ли они синхронно, как это определить наверняка?