🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    [Solved] Core2 Vibration Motor doesn't seem to work

    Cores
    2
    5
    9.3k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • V
      veryalien
      last edited by veryalien

      I've tried both the core2 arduino library and UIFlow/micropython, but I cannot get the vibration motor to vibrate on my core2.
      I know it's connected to pin '3' on the axp192. But I haven't been able to make it vibrate with code like setLDOEnable(3, 1), a short delay and then, setLDOEnable(3, 0).
      It seems to be dead.
      Turning the power LED off and on with the axp192 works ok.
      I've seen one working vibration video demo on the internet but without any code.
      I don't know what else to try, are there any working examples for arduino/UIFlow?

      1 Reply Last reply Reply Quote 0
      • felmueF
        felmue
        last edited by felmue

        Hello @veryalien

        In APX192::begin() the voltages for LDO2 and LDO3 are set. However there seems to be a typo in function SetLDOVoltage(). AXP_ADDR (= 0x34) is used as register number instead of 0x28 as first parameter to Write1Byte().

        Incorrect:

        void AXP192::SetLDOVoltage(uint8_t number, uint16_t voltage)
        {
            voltage = (voltage > 3300) ? 15 : (voltage / 100) - 18;
            switch (number)
            {
            //uint8_t reg, data;
            case 2:
                Write1Byte(AXP_ADDR, (Read8bit(0x28) & 0X0F) | (voltage << 4));
                break;
            case 3:
                Write1Byte(AXP_ADDR, (Read8bit(0x28) & 0XF0) | voltage);
                break;
            }
        }
        

        Correct:

        void AXP192::SetLDOVoltage(uint8_t number, uint16_t voltage)
        {
            voltage = (voltage > 3300) ? 15 : (voltage / 100) - 18;
            switch (number)
            {
            //uint8_t reg, data;
            case 2:
                Write1Byte(0x28, (Read8bit(0x28) & 0X0F) | (voltage << 4));
                break;
            case 3:
                Write1Byte(0x28, (Read8bit(0x28) & 0XF0) | voltage);
                break;
            }
        }
        

        Cheers
        Felix

        GPIO translation table M5Stack / M5Core2
        Information about various M5Stack products.
        Code examples

        V 1 Reply Last reply Reply Quote 0
        • V
          veryalien @felmue
          last edited by veryalien

          @felmue Thanks! Looking at the code you are right, I'll try overriding it later.

          That was obviously VERY well tested code........

          1 Reply Last reply Reply Quote 0
          • V
            veryalien
            last edited by veryalien

            I changed the Arduino core2 library code and........ it still didn't work?!

            Yes, I made sure that the library was really being recompiled correctly!

            Still nothing, vibration motor dead?

            I just had a random thought, "What if the motor is physically stuck?!".
            So I tapped my core2 hard on the table a couple of times, and...... it works!!!

            So I actually had a double failure, software and hardware.

            By the way, I tried again exactly the same UIFlow/micropython firmware with "Set vibration enable True" and now it works (so there is no problem in the micropython code)..... most of the time.

            Unfortunately the motor does seem to get stuck sometimes and needs a tap to get it rotate properly. That's annoying, but it's not dead.

            Perhaps the default setting of 2 volts is not really enough to get the motor to always move?

            1 Reply Last reply Reply Quote 0
            • felmueF
              felmue
              last edited by felmue

              Hello @veryalien

              Sorry to hear about your troubles.

              I looked into the factory test program today and got it to compile and running after enabling PSRAM, the above mentioned fix in SetLDOVoltage() and some cleanup of the old Wire vs Wire1 fight that seems to come back every now and then. I wished the developers could make up their mind and always use Wire for internal I2C devices. Oh well.

              The factory test code does something interesting regarding vibration motor voltage. During the startup sequence it is first set to 2 volts, then the motor is quickly turned on and off again and then later on it is set to 3.3 volts (not sure why though). When testing the vibration motor from within the settings menu the latter voltage is used.

              https://github.com/m5stack/M5-ProductExampleCodes/tree/master/Core/M5Core2/Arduino/Core2_Factory_test

              Cheers
              Felix

              GPIO translation table M5Stack / M5Core2
              Information about various M5Stack products.
              Code examples

              1 Reply Last reply Reply Quote 0
              • First post
                Last post