superbrew 0 Posted February 10, 2014 Share Posted February 10, 2014 I have been getting familiar with the Tiva Launchpad and I have started working with the MPU6050. After some help from this forum, I was able to get it up and running and thought I would share some of my results. I have a goal of building a self balancing robot, but I am trying to take tiny steps to get there. Here is a short video of my progress. I am still a long way off, but I am happy to be progressing. PS, is there a way to embed youtube videos? Quote Link to post Share on other sites
bluehash 1,581 Posted February 15, 2014 Share Posted February 15, 2014 Looks great for a first test! I went ahead and embedded your video. Select the third icon and then media. Quote Link to post Share on other sites
Mr.Cruz 0 Posted February 19, 2014 Share Posted February 19, 2014 Congrats on the progress! You might consider either running your refresh rate a bit higher, or using a better servo. Those smaller servos, in particular the one that was in the video, can be a bit jittery. Do you have any of your code online? I've been working on a Robotics Booster Pack, and it also has a MPU6050. I'm able to pull the raw angles from it, but have yet to get the DMP in the IMU to work. Can't wait until I can start working with Quaternions! Quote Link to post Share on other sites
superbrew 0 Posted February 19, 2014 Author Share Posted February 19, 2014 Thank you both for the replies. Congrats on the progress! You might consider either running your refresh rate a bit higher, or using a better servo. Those smaller servos, in particular the one that was in the video, can be a bit jittery. Do you have any of your code online? I've been working on a Robotics Booster Pack, and it also has a MPU6050. I'm able to pull the raw angles from it, but have yet to get the DMP in the IMU to work. Can't wait until I can start working with Quaternions! I am thinking it is the servo, it is just a $3 servo, so I was not expecting much. I raised the refresh rate and increased the resolution of the PWM, but the behavior did not change that much. I suspect a lot of that has to do with my filter for the angle and my PID controller. I do not have any code online. I am a beginner and my code most likely would not help you. I began by modifying the airmouse example, then added in a very simple complimentary filter for the angles. Then I added in the servo code, and a rudimentary PID controller. As I become more familiar with the Timer structure of these uC's I hope to imprive the filter and PID. Quote Link to post Share on other sites
pakoh 0 Posted March 1, 2014 Share Posted March 1, 2014 Wouldn't mind to take a look at that dirty code. Would you mind to share? I was trying to do something similar with mpu-9050 with no luck. Thank you Quote Link to post Share on other sites
superbrew 0 Posted March 2, 2014 Author Share Posted March 2, 2014 Here is the function I use to collect the data: uint32_t newTicks; float MotionMain(uint32_t ticks) { float gX, gY, gZ, aX, aY, aZ; float gyro_angle_x; static float oldAngle; volatile float dt; float alpha = 0.90; MPU6050DataRead(&g_sMPU6050Inst, MotionCallback, &g_sMPU6050Inst); MotionI2CWait(__FILE__, __LINE__); MPU6050DataGyroGetFloat(&g_sMPU6050Inst, &gX, &gY, &gZ); MPU6050DataAccelGetFloat(&g_sMPU6050Inst, &aX, &aY, &aZ); aX = ((atanf(aY/sqrtf(pow(aX,2)+pow(aZ,2))))*57.296) - g_faoffsetX; dt = (float)ticks/1000; gyro_angle_x = oldAngle + ((gX-g_fgoffsetX)*dt)*57.296; oldAngle = alpha*gyro_angle_x + (1-alpha)*aX; return oldAngle; } This is only for one axis, in this case X. Here is the PID routine, I think there is much room for improvement here: float PID(float setpoint, float input, float Kp, float Ki, float Kd) { static float oldError; float error = setpoint - input; static float I_err; static float D_err; if(input > -0.5 && input < 0.5) error = 0; I_err += oldError; D_err = error - oldError; oldError = error; return Kp*error + Ki*I_err + Kd*D_err; } And the main loop, this is messy and needs a lot of work: ticks = 0; oldticks = 0; // // Drop into the main loop. // oldticks = g_ui32SysTickCount; while(1) { angle = MotionMain(ticks); if(UARTPeek('\r') != -1) { UARTgets(command, sizeof(command)); sscanf(command, "%f,%f,%f", &Kp, &Ki, &Kd); } PIDangle = PID(0.0,angle, Kp, Ki, Kd); ui8Adjust = round((-PIDangle)); if(firstTime != 0) ROM_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_4, ui8Adjust * ui32Load / 1000); firstTime = 1; SysCtlDelay(SysCtlClockGet()/300); ticks = g_ui32SysTickCount - oldticks; oldticks = g_ui32SysTickCount; } This code gets 'lost' easily. If I exceed the travel of the servo or move too quickly it can get stuck at one extreme or the other. I think this project is beyond my level for the time being, so I have put it on hold to work my way up. Quote Link to post Share on other sites
pakoh 0 Posted March 4, 2014 Share Posted March 4, 2014 Thank you for sharing SuperBrew.... Do you think you are facing the same issue I had herewith the MPU-9150 present in the Sensorhub Boosterpack?: http://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/285768.aspx?pi297168=1 Quote Link to post Share on other sites
Mr.Cruz 0 Posted March 4, 2014 Share Posted March 4, 2014 Imo, it's definitely possible. It's a shame that the SensorHub code doesn't use the DMP in the MPU6050. I've been considering porting the FreeIMU or equivalent MPU6050 code to the Tiva/Stellaris Launchpad since I want to make use of the DMP (I want my Quaternions!), but don't have an eta for it (I want to implement an I2C Master ISR first). Quote Link to post Share on other sites
pakoh 0 Posted March 5, 2014 Share Posted March 5, 2014 Imo, it's definitely possible. It's a shame that the SensorHub code doesn't use the DMP in the MPU6050. I've been considering porting the FreeIMU or equivalent MPU6050 code to the Tiva/Stellaris Launchpad since I want to make use of the DMP (I want my Quaternions!), but don't have an eta for it (I want to implement an I2C Master ISR first). I do think the same, such a shame!! If you port the MPU6050 to the Launchpad, please, don't hesitate on sharing it here. I think it could have a lot of applications, and probably, the MPU6050 used with FreeIMU is way more consistent. Would also like to check that I2c Master ISR as well, I am using I2c with a DAC by writting directly the commands from the CPU. Thank you. Quote Link to post Share on other sites
superbrew 0 Posted March 6, 2014 Author Share Posted March 6, 2014 Not sure if this would help, but I use this firmware on my quadcopter, and I would say the yaw is stable on that. The board I am using in my quad uses an MPU6050 for the accel/gyro. Maybe digging through this will give you some ideas https://github.com/MegaPirateNG Quote Link to post Share on other sites
happysmile09 0 Posted July 5, 2014 Share Posted July 5, 2014 I am new to Tiva C, i wanna communicate TM4C123GH6PM to MPU 6050. But i have so many unclear points, 1. Which I2C mode should i use among 4 modes: – Master transmit – Master receive – Slave transmit – Slave receive 2. Do we have to configure the MPU 6050 module and what is the order should we do? Thanks Quote Link to post Share on other sites
Mr.Cruz 0 Posted July 6, 2014 Share Posted July 6, 2014 I do think the same, such a shame!! If you port the MPU6050 to the Launchpad, please, don't hesitate on sharing it here. I think it could have a lot of applications, and probably, the MPU6050 used with FreeIMU is way more consistent. Would also like to check that I2c Master ISR as well, I am using I2c with a DAC by writting directly the commands from the CPU. Thank you. @@pak, Unfortunately, I haven't had much luck porting the I2CDev implementation to the Tiva Launchpad. I tried porting it before the competition, but was constantly getting values that didn't make sense (the quaternion was not stable at all. Looked more like gibberish). I gave it another shot last night, but still no go. I've started looking into Invensense's library and am thinking I'll give that a shot instead. While I love the community around I2CDev, I trust the manufacturer to provide much better documentation and resources for the port. We'll see how that goes (might work on it this week). The I2C + ISR implementation was halted due to other things taking priority, and I don't think I'll be resuming work on it for the forseable future. I'll post a link to my work as soon as I've uploaded the code. @happysmile09: Your best bet at this moment would be to look at the Energia fork of the Arduino IDE and try using the I2CDev libraries with it. I would also suggest reading up on how I2C and the MPU6050 work. Quote Link to post Share on other sites
pakoh 0 Posted July 30, 2014 Share Posted July 30, 2014 @@pak, Unfortunately, I haven't had much luck porting the I2CDev implementation to the Tiva Launchpad. I tried porting it before the competition, but was constantly getting values that didn't make sense (the quaternion was not stable at all. Looked more like gibberish). I gave it another shot last night, but still no go. I've started looking into Invensense's library and am thinking I'll give that a shot instead. While I love the community around I2CDev, I trust the manufacturer to provide much better documentation and resources for the port. We'll see how that goes (might work on it this week). The I2C + ISR implementation was halted due to other things taking priority, and I don't think I'll be resuming work on it for the forseable future. I'll post a link to my work as soon as I've uploaded the code. Thank you MrCruz. I was playing again with MPU9150 without luck, but I already got two GY-521 boards, so I will test your code. Looking forward to hear from you on this topic. Regards Quote Link to post Share on other sites
GrumpyOldPizza 15 Posted July 31, 2014 Share Posted July 31, 2014 Here some quick and dirty I2C/MPU6050 files. I am using bare metal, so there is not a lot of overhead. The interrupt handler and the enable/priority assignment is done by the RTOS I am using, so it's missing here. The only other RTOS feature used is that the ISR wakes up the calling task (wai_flg/set_flg). I could read the data off the MPU6050 with 1kHz sample rate. Perhaps that will got you going quickly faster. - Thomas Thank you MrCruz. I was playing again with MPU9150 without luck, but I already got two GY-521 boards, so I will test your code. Looking forward to hear from you on this topic. Regards lm4f120_i2c.c lm4f120_i2c.h mpu6050.c mpu6050.h bluehash 1 Quote Link to post Share on other sites
pakoh 0 Posted September 1, 2014 Share Posted September 1, 2014 Here some quick and dirty I2C/MPU6050 files. I am using bare metal, so there is not a lot of overhead. The interrupt handler and the enable/priority assignment is done by the RTOS I am using, so it's missing here. The only other RTOS feature used is that the ISR wakes up the calling task (wai_flg/set_flg). I could read the data off the MPU6050 with 1kHz sample rate. Perhaps that will got you going quickly faster. - Thomas Thank you Thomas. I am using TIvaware under CCS6 (which is free for Stellaris/Tiva devices). What IDE did you use? Regards Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.