Подключение HMC5883L

Тема в разделе "Arduino & Shields", создана пользователем Artclonic, 3 мар 2018.

  1. Artclonic

    Artclonic Гик

    Исправил
     
    Последнее редактирование: 23 мар 2018
  2. Artclonic

    Artclonic Гик

    Новая ошибка при компиляции..

    HMC5883L:51: error: call of overloaded 'write(int)' is ambiguous
     
  3. Arduino_man

    Arduino_man Гик

    Какая строка кода?
     
  4. Artclonic

    Artclonic Гик

    Код (C++):
     myWire2.write(0x00); //start with register 3.
     
  5. Artclonic

    Artclonic Гик

    Вот полностью...
    Код (C++):
    Arduino: 1.8.5 (Windows 10), Плата:"Arduino/Genuino Uno"

    C:\Users\Киселев Антон\Desktop\ГУСЕНР?ЦА\СКЕТЧР?\HMC5883L\HMC5883L.ino: In function 'void loop()':

    HMC5883L:51: error: call of overloaded 'write(int)' is ambiguous

    C:\Users\Киселев Антон\Desktop\ГУСЕНР?ЦА\СКЕТЧР?\HMC5883L\HMC5883L.ino:51:21: note: candidates are:

    In file included from C:\Users\Киселев Антон\Desktop\ГУСЕНР?ЦА\СКЕТЧР?\HMC5883L\HMC5883L.ino:1:0:

    C:\Program Files (x86)\Arduino\libraries\SoftwareWire/SoftwareWire.h:52:11: note: uint8_t SoftwareWire::write(uint8_t)

       uint8_t write(uint8_t data);

               ^

    C:\Program Files (x86)\Arduino\libraries\SoftwareWire/SoftwareWire.h:54:11: note: uint8_t SoftwareWire::write(char*)

       uint8_t write(char* data);

               ^

    HMC5883L:70: error: call of overloaded 'write(int)' is ambiguous

    C:\Users\Киселев Антон\Desktop\ГУСЕНР?ЦА\СКЕТЧР?\HMC5883L\HMC5883L.ino:70:21: note: candidates are:

    In file included from C:\Users\Киселев Антон\Desktop\ГУСЕНР?ЦА\СКЕТЧР?\HMC5883L\HMC5883L.ino:1:0:

    C:\Program Files (x86)\Arduino\libraries\SoftwareWire/SoftwareWire.h:52:11: note: uint8_t SoftwareWire::write(uint8_t)

       uint8_t write(uint8_t data);

               ^

    C:\Program Files (x86)\Arduino\libraries\SoftwareWire/SoftwareWire.h:54:11: note: uint8_t SoftwareWire::write(char*)

       uint8_t write(char* data);

               ^

    exit status 1
    call of overloaded 'write(int)' is ambiguous

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    "Показать подробный вывод во время компиляции"
     
     
  6. Artclonic

    Artclonic Гик

    Наверное дело в библиотеке...
     
  7. mcureenab

    mcureenab Гуру

    так
    Код (C++):
    myWire2.write(0x00u); //start with register 3.
    или так
    Код (C++):
    myWire2.write((uint8_t)0x00); //start with register 3.
     
  8. Artclonic

    Artclonic Гик

    Несколько MPU 9250 можно подключить при помощи этой библиотеки #include <SoftwareWire.h>? А еще я прочитал, что MPU 9250 можно подключать через SPI - - это может поспособствовать подключениюнескольких модулей? Потому как я понял адрес у MPU 9250 тоже постоянный...
     
  9. mcureenab

    mcureenab Гуру

    С SPI проще много одинаковых устройств подключать. Выбор устройства происходит по сигналу CS
     
  10. Artclonic

    Artclonic Гик

    Дайте ссылочку на пример.... Где почитать... А я постараюсь освоить... С Вашей помощью (спасибо за терпение...) вроде получилось с HMC5883L...
     
  11. mcureenab

    mcureenab Гуру

    Да вот с хабра стырил:

    [​IMG]

    SPI Master это Ардуинка. SPI Slave это датчики. У каждого датчика есть вход SS или CS.
    Управляя напряжением на выходах SS1, SS2, SS3 (это любые цифровые пины на ардуинке), выбираем для общения ОДИН из датчиков и выполняем диалог.
     
  12. Artclonic

    Artclonic Гик

    Работает! Но выдает нули....
    В первом варианте
    Код (C++):
    myWire2.write(0x00u); //start with register 3.
    не компилируется...
     
  13. mcureenab

    mcureenab Гуру

    Проверь подключение и скетч в студию!
     
  14. Artclonic

    Artclonic Гик

    КРУТЯК!!!!! РАБОТАЕТ!!!! Я не хороший человек а А4, А5 подключил.... а надо к 4,5!!!!
    РАБОТАЕТ!!!!! УРА!!!!
     
  15. Artclonic

    Artclonic Гик

    Тут такое дело... у меня пока кнопок нет - я замыкаю проводком пин... А он (контакт) периодически сам срабатывает... или когда пальцем коснешся...
    Смысл следующий одна кнопка (при ее нажатии) выводятся показатели в порт. Вторая (при ее нажатии) выводится в порт слово "KNOPKA", а так же число, сколько нажатий таких было... Соответственно вторая кнопка сработает, когда первая не нажата... Если обе не нажаты... то ничего не происходит...
    Ну чего то не фурычит вторая кнопка...
    Код (C++):
    #include <SoftwareWire.h>
    #define addr 0x0D //I2C Address for The HMC5883

    SoftwareWire myWire1(4, 5); //4  sda and 5 scl
    SoftwareWire myWire2(6, 7); //6  sda and 7 scl
    const int knopka1=8; // кнопка №1
    const int knopka2=9; // кнопка №2
    int val=0;
    int ii;

    void setup() {

    pinMode(8, INPUT);
    pinMode(9, INPUT);
    Serial.begin(9600);

      myWire1.begin();
      myWire2.begin();

      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x01); // Set the Register
      myWire1.endTransmission();
      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x1D); // Set the Register
      myWire1.endTransmission();

      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x01); // Set the Register
      myWire2.endTransmission();
      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x1D); // Set the Register
      myWire2.endTransmission();


    }

    void loop() {

    if(digitalRead(knopka1)==HIGH) //проверка включена ли кнопка №1
    {
      //Начало первого блока кода для чтения 1 датчика
      int x1, y1, z1; //triple axis data
      //Tell the HMC what regist to begin writing data into

      myWire1.beginTransmission(addr);
      myWire1.write((uint8_t)0x00); //start with register 3.
      myWire1.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire1.requestFrom(addr, 6);
      if (6 <= myWire1.available()) {
        x1 = myWire1.read(); //MSB  x
        x1 |= myWire1.read() << 8; //LSB  x
        z1 = myWire1.read(); //MSB  z
        z1 |= myWire1.read() << 8; //LSB z
        y1 = myWire1.read(); //MSB y
        y1 |= myWire1.read() << 8; //LSB y
      }

      //Начало второго блока кода для чтения 2 датчика
      int x2, y2, z2; //triple axis data
      //Tell the HMC what regist to begin writing data into

      myWire2.beginTransmission(addr);
      myWire2.write((uint8_t)0x00); //start with register 3.
      myWire2.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire2.requestFrom(addr, 6);
      if (6 <= myWire2.available()) {
        x2 = myWire2.read(); //MSB  x
        x2 |= myWire2.read() << 8; //LSB  x
        z2 = myWire2.read(); //MSB  z
        z2 |= myWire2.read() << 8; //LSB z
        y2 = myWire2.read(); //MSB y
        y2 |= myWire2.read() << 8; //LSB y
      }

      // Печать в порт
     
    Serial.print("E");
    Serial.print(x1);
    Serial.print(",");
    Serial.print(y1);
    Serial.print(",");
    Serial.print(z1);
    Serial.print(",");

    Serial.print(x2);
    Serial.print(",");
    Serial.print(y2);
    Serial.print(",");
    Serial.print(z2);
    Serial.print("\n");

      delay(100);
    }
    else
    {
      if(digitalRead(knopka2)==HIGH)  // нажали кнопочку #2
          {{
            val++;  // прибавляем к переменной 1 при каждой смене цикла.    
          delay(200); //небольшая защита от "дребезга" контактов кнопки
          }
       
               {
            val=0; // обнулили переменную
          }    
          if(val>=5)
          {
           Serial.print("KNOPKA2");
           Serial.print(ii);
         
           // тут надо подумать как отразить номер репера
         
            val=0; // обнулили переменную
          }
          }
          else
    {  }
                   
        }
    }
     
     
    Последнее редактирование: 24 мар 2018
  16. mcureenab

    mcureenab Гуру

    Код (C++):
       
               {
            val=0; // обнулили переменную
          }  
          if(val>=5)  // тут val всегда == 0.
          {
     

    Здесь наверное слово else пропущено.


    Код (C++):
       }
        else // ????
               {
            val=0; // обнулили переменную
          }    
     
  17. Artclonic

    Artclonic Гик

    Не могу понять.... вот кусочек после первого else... Я не успеваю замкнуть на +5в (только перусь за изоляцию провода... как данные пошли печатать в порт... А второй контакт - вообще не работает... Голову сломал...
    Код (C++):
    else
    {
      if(digitalRead(knopka2)==HIGH)  // нажали кнопочку #2
          {
          {
          val++;  // прибавляем к переменной 1 при каждой смене цикла.    
          delay(200); //небольшая защита от "дребезга" контактов кнопки
          }
                 
          if(val>=5)
          {
           Serial.print("KNOPKA2");
           Serial.print(ii);
           }
                       
           else
           {
            val=0; // обнулили переменную
            }
           
          }
          else
           {
            val=0; // обнулили переменную
            }
         
          }
     
  18. mcureenab

    mcureenab Гуру

    Висящий провод ловит помехи.
    Поищите схемы подключения кнопки. Это или INPUT_PULLUP режим пина. Или внешний резистор притягивающий потенциал пина к GND.
     
  19. Artclonic

    Artclonic Гик

    С помехами вроде понял. А что в коде не так?
    pinMode(9, INPUT_PULLUP); - постоянно в порт данный фигачит... Как буд то кнопка нажата...ПОНЯЛ! ОН ИНВЕРТИРУЕТ!!!!
    Да! Настройки сделал! Теперь замыкать на GND надо и LOW выставить! Справился!
    После нажатия второй кнопки - молчание...
    Посмотрите код плиз...
     
    Последнее редактирование: 24 мар 2018
  20. Artclonic

    Artclonic Гик

    Еще раз переделал...Не работает вторая кнопка...И все тут...
    Код (C++):
    else
    {
      if(digitalRead(knopka2)==LOW)  // нажали кнопочку #2
          {    
          val++;  // прибавляем к переменной 1 при каждой смене цикла.    
          delay(200); //небольшая защита от "дребезга" контактов кнопки
                       
          if(val>=5)
          {
           Serial.print("KNOPKA2");
           Serial.print(val);
           }
                       
           else
           {
            val=0; // обнулили переменную
            }
         
          }
          else
           {
            val=0; // обнулили переменную
            }
       
          }