T3

Using analogRead with ArduIMU v3

Hello,

I'm running arduIMU v.D and I cannot get the code to compile if I use either analogRead/Write features. I get the following:

core.a(wiring_analog.c.o):(.data.analog_reference+0x0): multiple definition of `analog_reference'
arduimu.cpp.o:(.data.analog_reference+0x0): first defined here

Something about the way arduimu works seems to break the analog features.It looks like I need to do some direct port manipulation to read analog pin 0-4 (the pins I desire to read). Does someone have some advice on an equivalent piece of code to directly replace:

         analogRead(A0);

The reason for me doing this is that I am attempting to make a motion-based transmitter for multicopters, pitch and roll controlled by motion, but I would still need to poll some pots for yaw and throttle.

Thanks,

Ted 

You need to be a member of diydrones to add comments!

Join diydrones

Email me when people reply –

Replies

  • This works for me.

    //Potentiometer Connections:
    //Wiper to A0
    //One End to ground, the other to 5v
    //LED blink rate controlled by Potentiometer
    void setup()
    {
    Serial.begin(38400); //Set Serial out baud rate
    pinMode(13, OUTPUT); //Yellow LED is output
    }

    void loop()
    {
    int value;
    value = analogRead(A0); //Get Analog Value 0 - 1024
    Serial.println(value); //Display on serial monitor

    digitalWrite(13, HIGH); //Yellow LED On
    delay(value); //Delay in milliseconds
    digitalWrite(13, LOW); //Yellow LED Off
    delay(value);
    }

    • T3

      are you also running arduimu code along with that? I can do it standalone, but not while arduimu code is running. I would assume the normal SDA and SCL pins (A4 and A5) are used up, but for some reason any call to analogwrite/read results in the above. There most be something buried in the code that I do not understand. 

      • If you are using this software version and using hardware version V3:

        // Version 1.9 Support for ArduIMU V3 Hardware with MPU6000 and HMC5883 magnetometer 

        Then you must have this statement uncommented:

        #define BOARD_VERSION 3     // 1 For  new V3

        The ArduIMU has 3 versions.  V1 and V2 used all analog channels to get analog values from the separate accel and gyros.  V3 uses the MPU-6000 3 axis accel & gyro which has internal A/Ds that do it for you, thus you have all the analog ports free. I suspect your code is initializing the A/Ds along with their interrupts and then trying to do so again.  I would suggest going into the code and blow away all the code in the #defines for V1 and V2.

        The link  below will show you what ports are being used in V3 and which are available for you use.  Currently I am using A0 - A3 with no problems.

        https://code.google.com/p/arduimu-v3-ahrs-improvements/source/brows...

        • T3

          Got it, Thanks! I went through and commented out all references to boards < 3 AND I commented out this section.

          /*
          volatile uint8_t MuxSel=0;
          volatile uint8_t analog_reference = DEFAULT;
          volatile uint16_t analog_buffer[8];
          volatile uint8_t analog_count[8];
          */

          I am now able to use analogRead/Write in my code. So I decided to go back to stock code and then just comment out what I show above and NOT comment out any of the defines for < board 3 and it compiles, which I suppose is expected. 

          I tried just wrapping that snippet of code up like this

          #if BOARD_VERSION < 3
          volatile uint8_t MuxSel=0;
          volatile uint8_t analog_reference = DEFAULT;
          volatile uint16_t analog_buffer[8];
          volatile uint8_t analog_count[8];
          #endif

          but when I set the board type 1 or 2 I get issues about declaring variables on compile (even without analogRead/Write in there). I suppose that is because it still compiles the "void Read_adc_raw(void)" despite not needing to. 

          So I have a very workable solution now considering I have board ver 3. Thank you very much Al Toma. You rock. 

          • You are welcome. You stated that you are making a motion-based transmitter for multicopters. Does that mean you are creating a hand held unit utilizing the IMU to output roll pitch which will be transmitted to your multicopter via an RF link like X-bee? Sounds do-able but I would think having several pots or even a 2-axis joystick on the same unit would be a little tricky to control - tilting the whole platform at the same time moving several pots on it seems a bit tricky. Good Luck!

            By the way, they don't sell V1 and V2 IMUs any more so you don't really need the code in you project.

  • T3

    Hmm, I am guessing that there is a fundamental issue I am not grasping. Are the analog pins already being used to read the onboard sensors? 

This reply was deleted.

Activity