снятие показаний с 3х осного акселерометра

Тема в разделе "Arduino & Shields", создана пользователем Old_rocker, 31 янв 2014.

  1. Old_rocker

    Old_rocker Нуб

    Добрый час, камрады. не пинайте сильно, в этом я новичох.
    купиль стало быть платформу, и датчик MMA 7361. подключил, настроил.

    надо бы снять для начала показания егоные. снимаются, все 3 оси фиксированы.
    снимаю только с одной (провод один). при изменении положения датчика, то есть при придании ему пинка, значения на экране не изменяются.
    причины:
    1. проклада между креслом и компом
    2. не та программа (не вообще не та). была использована прога для калибровки
    3. датчик кердыкмана...

    скетч:

    /int dx=484;
    //int dy=532;
    //int dz=682;
    #include "Wire.h"
    #include "I2Cdev.h"
    #include "MPU6050.h"

    int dx=1023;
    int dy=532;
    int dz=682;
    void setup()
    {
    Serial.begin(9600);
    analogReference(EXTERNAL); //для увеличения точности используем внешний источник опорного напряжения
    }
    void loop()
    {
    int x, y, z; // переменные для хранения значений по осям
    x = analogRead(A0)+dx; // читаем положение по оси Х
    y = analogRead(A1)+dy; // читаем положение по оси Y
    z = analogRead(A2)+dz; // читаем положение по оси Z


    /*

    Serial.print("X:");
    Serial.print(x);
    Serial.print(" ");
    Serial.print("Y:");
    Serial.print(y);
    Serial.print(" ");
    Serial.print("Z:");
    Serial.print(z);*/
    Serial.println();
    delay (1000);
    }


    ну и самый главный вопрос, шо це таке? какая библиотека может помочь? не ленинская ли?;)))
    памагите пожалуйста.

    увы и ах, фото не могу скинуть с телефона на комп. не читает.
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    А этот внешний источник подключен?
     
  3. Old_rocker

    Old_rocker Нуб

    нет. подключен только датчик к платформе.
    это может сильно влиять?
     
  4. acos

    acos Официальный гик Администратор

    Поясню. Используется http://amperka.ru/product/triple-axis-accelerometer
    Удаляйте всё и ставьте вот это
    Код (Text):

    const int axisX = A0;
    const int axisY = A1;
    const int axisZ = A2;
    int pause = 10;  // тут можно поиграться

    int axisValueX = 0;
    int axisValueY = 0;
    int axisValueZ = 0;

    void setup() {
      // initialize serial communications at 9600 bps:
      Serial.begin(9600);
    }

    void loop() {
      // read the analog in value:
      axisValueX = analogRead(axisX);          
      axisValueY = analogRead(axisY);      
      axisValueZ = analogRead(axisZ);      
       
      // print the results to the serial monitor:
      Serial.print("X = " );                    
      Serial.print(axisValueX);  
      Serial.print("  ");
      Serial.print("Y = " );                    
      Serial.print(axisValueY);
      Serial.print("  ");
      Serial.print("Z = " );                    
      Serial.print(axisValueX);    
       
      Serial.println();

      // wait pause before the next loop
      // for the analog-to-digital converter to settle
      // after the last reading:
      delay(pause);                  
    }
     
  5. Old_rocker

    Old_rocker Нуб

    спасибо Вам огромное. числа несколько изменились. но все они бегут в строчку.
    как бы вывести в столбец и дать обозначения каждому?

    Serial.print("Z = " );
    Serial.print(axisValueX);

    тут не Z должно стоять?;)
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Экспериментируйте с функциями Serial.print()/Serial.println() и выводите как хочется.
     
  7. acos

    acos Официальный гик Администратор

    Да, Z.
    (в сторону): Инет у нас тут глючит что-то

    Serial.println() - вывод с переводом строки, Serial.print() - просто вывод.
    Ну вообще правильно всё Megakoteyka говорит)
    Вам не нужны никакие
    Код (Text):
    #include "Wire.h"
    #include "I2Cdev.h"
    #include "MPU6050.h"
     
    вы работаете только через аналоговые входы.

    Чтобы наделать красивых графиков и т.д, посмотрите в сторону Processing
    http://wiki.amperka.ru/видеоуроки:6-serial-и-processing

    Ну и вообще, сюда гляньте http://wiki.amperka.ru/
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Попробуйте убрать строку analogReference(EXTERNAL); и Ваш код тоже должен заработать.
    Постарайтесь разобраться в смысле каждой строки своего кода и обретете более глубокое понимание.
    А мы поможем, если что :)
     
  9. Old_rocker

    Old_rocker Нуб

    да, тут вдумчиво посмотрел на все:) и понял, что к датчику ващьпе не обращается программа.
    и тут меня как осенило:) программу то залить надо на платформу.
    залил, все заработало. одну ось читает. правда как-то вяло... 690 всего. дергаю датчик, чуть скачет, на пару значений.
    так и должно быть?
    спасибо вам большое:)

    датчик стоит на 1,5 g.
     
  10. acos

    acos Официальный гик Администратор

    а с каким кодом одну ось читает? А вы подключили все три провода к А0, А1, А2 ?
    Попробуйте убрать задержку вообще - delay () которая. Может считывание происходит в тот момент, когда уже вяло?) Или вяло дёргаете?) Ну и разница 690-512(космическая невесомость)))=178 - ИМХО, не маленькая.
     
  11. Old_rocker

    Old_rocker Нуб

    читает с Вашим кодом, который я дописал слегка.
    подключил только одну ось, так как один провод
    но выводит показания сразу трех осей. так и должно быть?
    в чем он меряет? 690, это же биты? я правильно понимаю?
     
  12. acos

    acos Официальный гик Администратор

    Так и должно быть) контроллер не знает, подключено к его ногам что-то или нет, он исполняет программу. А программа у нас вот такая:

    Код (Text):

    const int axisX = A0;
    // Контроллер, запомни — нога А0, на которой у тебя аналоговый вход, отныне
    // и во веки веков, зовется axisX

    const int axisY = A1;
    // A нога А1, на которой у тебя другой аналоговый вход, зовется axisY

    const int axisZ = A2;
    // В третий раз вышел старик к синему морю) Тут по аналогии

    int pause = 10;
    // тут можно поиграться. переменная, с говорящим названием "Пауза" равна 10.

    //Далее вводим ещё 3 переменных, которые нам потом понадобятся. Чтоб программисту понятней было.
    //Можно их и не инициализировать в данном случае. Ну пусть будет.

    int axisValueX = 0; // Вот горшок пустой
    int axisValueY = 0; // Он предмет простой
    int axisValueZ = 0; // Он ни-ку-да не денется

    void setup() {  // подготовка к экшену
      // initialize serial communications at 9600 bps:
      Serial.begin(9600); // Контроллер, проследи-ка
    //чтоб твой последовательный порт вещал (и принимал) данные
    // со скоростью 9600 бод
    }

    void loop() { // ЭКШЕН. Этот код будет повторятся ВЕЧНО.
    // пока ноги носят и питание подано.. и reset не нажат)

      // read the analog in value:

      axisValueX = analogRead(axisX);
    //Контроллер, читай из аналогового входа,
    //который мы назвали axisX, аналоговое значение,
    //в переменную axisValueX

      axisValueY = analogRead(axisY);     // То же самое для ноги А1
      axisValueZ = analogRead(axisZ);     // и для А2

      // print the results to the serial monitor:
      Serial.print("X = " );                
    // Контроллер, выдай ка в последовательный порт фразу "X = "

      Serial.print(axisValueX);
    // а после нее сразу выведи значение переменной, в которую мы считали
    // значение из аналогового порта А0

      Serial.print("  "); // а потом пробел туда же

      Serial.print("Y = " );  // а потом фразу "Y = "    

      Serial.print(axisValueY);
    // а после нее сразу выведи значение переменной, в которую мы считали
    // значение из аналогового порта А1

      Serial.print("  "); // а потом пробел туда же

      Serial.print("Z = " );   // а потом фразу "Z = "  

      Serial.print(axisValueZ);
    // а после нее сразу выведи значение переменной, в которую мы считали
    // значение из аналогового порта А2

      Serial.println(); // А после этого промолчи, но с переводом строки на новую строку

      // wait pause before the next loop
      // for the analog-to-digital converter to settle
      // after the last reading:

      delay(pause);
    //Всё, можно передохнуть. Длительности передышки
    //будет равна значению переменной
    // с говорящим названием "Пауза" (в микросекундах).
    //Можно паузу не делать вообще
    //и убрать эту строку

    }
    // возвращаемся к началу ЭКШЕНА, и делаем всё заново. и так каждый раз.
    //т.е. следующая строчка которую выполнит контроллер будет
    //axisValueX = analogRead(axisX);

     
    Короче контроллеру сказали читать значения с трёх ног, и выводить их. Он это и делает. Если подключена только одна нога, значит с остальных он что увидит, то и покажет. Скорее всего это будут помехи. Так как сопротивление аналоговых входов ооочень большое, то любой электромагнитный чих для неподкдюченных ног - это ОГОГО

    Читать это http://wiki.amperka.ru/сенсоры:аналоговые
    Смотреть это http://wiki.amperka.ru/видеоуроки:4-аналоговые-входы

    Это не долго, но снимет часть вопросов, прояснит картину.

    Датчик в невесомости выдаёт 512 по всем осям. Число 512 означает, что на аналоговые входы в этот момент попадает ровно половина напряжения источника опорного напряжения. Источник опорного напряжения у нас — это напряжение питания — 5 В. значит на вход попало 2,5 В.
    Если бы датчик выдал нам число 1023, это означало бы, что на него подано 5 вольт.
    Потому, что аналогово-цифровой преобразователь у нас 10-битный.
    0 — это 0 вольт.
    1 — это 5/1024 = 0,0048828125 вольт
    512 — это 0,0048828125*512 = 2,5 вольт
    690 — это 0,0048828125*690 = 3,369140625 вольт.

    Если датчик просто лежит горизонтально на планете Земля, это значит, что по оси Z он покажет ускорение свободного падения, точнее отклонение от невесомости (512) вниз. Не знаю сколько точно, но допустим, он показал 460. Значит 512-460 = 52. То есть, 1g = 52.
    Вот вдруг датчик показал 690. Значит ускорение в этот момент составило 690-512=178.
    1g у нас = 52, значит ускорение было 178/52= 3,4 g.

    Так как 690 больше 512, а в покое у нас было меньше 512 (460, для примера. Напоминаю, я не знаю сколько точно у нас там 1g - надо проверить), значит ускорение 690 было направлено в сторону от земли, а не к ней.

    Уф. Как-то так.
     
    Последнее редактирование: 1 фев 2014
    Megakoteyka нравится это.
  13. Old_rocker

    Old_rocker Нуб

    как мне вас благодарить, добрый люди? спасибо большое:)
    сегодня надеюсь купить еще датчик вибрации. по работе необходимо.
    вот куда залез аэродинамик)))
     
  14. acos

    acos Официальный гик Администратор

    Благодарить нас можно своим присутствием на форуме). Инженеры нам нужны) Например, когда кто-нибудь начнёт строить квадракоптер со встроенной кофеваркой, вы сможете очень помочь)
    Какой датчик вибрации присмотрели? Вот этот пьезоэлектрический? http://amperka.ru/product/piezo-vibration-sensor
    Кстати, обратили внимание на ссылку, что я выше приводил? «Смотреть это http://wiki.amperka.ru/видеоуроки:4-аналоговые-входы» Там как раз популярно рассказано о том, как вы можете для своей задачи выводить красивые графики) Правда это потребует немного кода на Java, но он будет аналогичен тому, что на видео
     
  15. Old_rocker

    Old_rocker Нуб

    да, я как раз две недели назад получил диплому по специальности "проектирование кофемашин со встроенным внедорожным приводом":))
    да, именно этот датчик присмотрел.
    есть в нем какие-то особенности?

    с уважением и благодарностью, Александр.
     
  16. acos

    acos Официальный гик Администратор

    ;)
    Да не должно быть особенностей никаких.

    Код станартный, точно такой же
    //Arduino Sample code
    void setup()
    {
    Serial.begin(9600); //
    }
    void loop()
    {
    int val;
    val=analogRead(0);//Connect the sensor to analog pin 0
    Serial.println(val,DEC);//
    delay(100);
    }
     
  17. dreadfull

    dreadfull Гик

    извините но по ссылкам ничего нет о построение графиков с помощью процессинга.
     
  18. rav_75

    rav_75 Гик

    Оно может как бы и да... Тут просто задали направление в сторону процессинга. ;) Посмотрите вот сюда, может подойдет.
     
  19. dreadfull

    dreadfull Гик

    ага. в принципе подходит, но есть пару вопросов.
    1. есть ссылка на пояснения к командам в ардуино(процессинге)? я вот нашел но там не все: http://arduino.ua/ru/prog/
    2. а процессинг никак не связан с скетчем от ардуино? ну в смыле никаких ссылок в процессинге нет на скетч?
     
  20. rav_75

    rav_75 Гик

    1. Да, конечно. Наиболее полное описание естественно http://arduino.cc/en/Reference/HomePage и http://processing.org/reference/ , но надо знать буржуйский язык.
    2. Нет. Получаем данные и что хотим, то и воротим. Можно вообще без ардуино.