I have built a self balancing robot using raspberry pi 3b+. I am not able to reduce the response time. Hence, the robot doesn't balance properly. I am using MPU 6050, 150rpm 12V DC motor. I checked mpu 6050 and the motors individually and they seem to be working fine. The code also works. But, since the response time is more, the robot falls to the ground. Please tell me what is wrong with my code. CODE: import sys import time import RPi.GPIO as GPIO import smbus import math mode=GPIO.getmode() print(mode) #GPIO.cleanup() print("Start") Forward1=38 Backward1=37 Forward2=36 Backward2=35 sleeptime=0.1 # Power management registers power_mgmt_1 = 0x6b power_mgmt_2 = 0x6c bus = smbus.SMBus(1) # or bus = smbus.SMBus(1) for Revision 2 boards address = 0x68 # This is the address value read via the i2cdetect command #motor pins initialization GPIO.setmode(GPIO.BOARD) GPIO.setup(Forward1, GPIO.OUT) GPIO.setup(Backward1, GPIO.OUT) GPIO.setup(Forward2, GPIO.OUT) GPIO.setup(Backward2, GPIO.OUT) #motor forward def forward(x): GPIO.output(Forward1, GPIO.HIGH) GPIO.output(Forward2, GPIO.HIGH) print("Moving Forward") time.sleep(x) GPIO.output(Forward1, GPIO.LOW) GPIO.output(Forward2, GPIO.LOW) #motor reverse def reverse(x): GPIO.output(Backward1, GPIO.HIGH) GPIO.output(Backward2, GPIO.HIGH) print("Moving Backward") time.sleep(x) GPIO.output(Backward1, GPIO.LOW) GPIO.output(Backward2, GPIO.LOW) # mpu6050 read def read_byte(adr): return bus.read_byte_data(address, adr) def read_word(adr): high = bus.read_byte_data(address, adr) low = bus.read_byte_data(address, adr+1) val = (high << 8) + low return val def read_word_2c(adr): val = read_word(adr) if (val >= 0x8000): return -((65535 - val) + 1) else: return val def dist(a,b): return math.sqrt((a*a)+(b*b)) def get_y_rotation(x,y,z): radians = math.atan2(x, dist(y,z)) return -math.degrees(radians) def get_x_rotation(x,y,z): radians = math.atan2(y, dist(x,z)) return math.degrees(radians) def get_direction(): # Now wake the 6050 up as it starts in sleep mode bus.write_byte_data(address, power_mgmt_1, 0) print("gyro data") print("---------") gyro_xout = read_word_2c(0x43) gyro_yout = read_word_2c(0x45) gyro_zout = read_word_2c(0x47) print("gyro_xout: ", gyro_xout, " scaled: ", (gyro_xout / 131)) print("gyro_yout: ", gyro_yout, " scaled: ", (gyro_yout / 131)) print("gyro_zout: ", gyro_zout, " scaled: ", (gyro_zout / 131)) print("") print("accelerometer data") print("------------------") accel_xout = read_word_2c(0x3b) accel_yout = read_word_2c(0x3d) accel_zout = read_word_2c(0x3f) accel_xout_scaled = accel_xout / 16384.0 accel_yout_scaled = accel_yout / 16384.0 accel_zout_scaled = accel_zout / 16384.0 #print("accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled) #print("accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled) #print("accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled) print("x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)) print("y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)) return get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled) # while loop begins margin = 7 try: while (1): dir = get_direction() if(dir < -margin): print("move forward") forward(sleeptime) elif(dir > margin): print("move reverse") reverse(sleeptime) except: print("Some error") GPIO.cleanup()