Page 1 of 1

set PID speed

Posted: Tue Oct 06, 2020 5:08 am
by fausto.tromba
I tried to set the PID speed with the method SetM1Velocity(address, p,i,d,qpps)
it looks like that p, i, d and qpps must be an integer otherwise there is the following error:

Code: Select all

pi@raspberrypi:~/Documents/MCP236_py3/TestPrograms $ python3 roboclawPIDspeedpy.py 
'MCP236 2x30A v1.1.8\n'
Traceback (most recent call last):
  File "roboclawPIDspeedpy.py", line 25, in <module>
    rc.SetM1VelocityPID(address,p,i,d,qpps)
  File "/home/pi/Documents/MCP236_py3/TestPrograms/roboclaw_3.py", line 765, in SetM1VelocityPID
    return self._write4444(address,self.Cmd.SETM1PID,d*65536,p*65536,i*65536,qpps)
  File "/home/pi/Documents/MCP236_py3/TestPrograms/roboclaw_3.py", line 534, in _write4444
    self._writelong(val1)
  File "/home/pi/Documents/MCP236_py3/TestPrograms/roboclaw_3.py", line 199, in _writelong
    self._writebyte((val>>24)&0xFF)
TypeError: unsupported operand type(s) for >>: 'float' and 'int'
at the page 65 of the user manual explain that for a value bigger than a byte, it must be broken.
In BasicMicroStudio is possible to set a pid with a floating point

Image

how can I do by serrial command?
Thanks in advance

Re: set PID speed

Posted: Fri Oct 16, 2020 8:08 am
by Basicmicro Support
QPPS is an integer. P,I and D can be any positive values.

Motion studio converts the real numbers in to the proper format for the SetPID commands.

Make sure you have the latest version of Motion Studio.

Re: set PID speed

Posted: Tue Oct 20, 2020 11:27 pm
by fausto.tromba
I was speaking about SetM1Velocity(address, p,i,d,qpps) python method.
it does not work, when I pass not an integer, but a float. For example p=7.2.
Ho can I set by serial port a float (P=7.2) ?

Re: set PID speed

Posted: Fri Oct 23, 2020 3:22 pm
by Basicmicro Support
The packet serial commands expect integer values. They are calculated as fixed point numbers. You have to do the math. For Velocity PID values they are 16:16 fixed point numbers so you have to multiply your 7.2 * 65536. Convert to an Integer and then give it to the SetM1VelocityPID command. For the SetM#PositionPID command they are 22:10 fixed point so multiply by 2048.

Re: set PID speed

Posted: Wed Nov 04, 2020 8:00 am
by fausto.tromba

Code: Select all

def line2int(line):
	line = line.strip()
	#print(line)
	l1,l2 = line.split(":=")
	return l2
	

def ReadFile():
	f=open("/home/pi/Documents/MCP236_py3/PRG/PIDs.txt")
	lines=f.readlines()
	f.close()
	mpPar = map(line2int,lines)
	prm = list(mpPar)
	
	P = float(prm[0])
	i_P = int(65536*P)
	
	I = float(prm[1])
	i_I = int(65536*I)
	
	D = float(prm[2])
	i_D = int(65536*D)
	Qpps = int(prm[3])
	i_Qpps = int(65536*Qpps)
	return (i_P,i_I,i_D,i_Qpps)
	



if __name__ == "__main__":
	rc = Roboclaw("/dev/ttyS0",38400)
	rc.Open()
	
	#Get version string
	address = 0x80
	version = rc.ReadVersion(address)
	if version[0]==False:
		print ("GETVERSION Failed")
	else:
		print (repr(version[1]))
	
	#Read file PIDs.txt
	p,i,d,qpps = ReadFile()
	print(p,i,d,qpps)
	rc.SetM1VelocityPID(address,p,i,d,qpps)
	time.sleep(2)
	M1speedPID = rc.ReadM1VelocityPID(address)
	print(M1speedPID)
'MCP236 2x30A v1.1.8\n'
441509 36620 0 372899840
[1, 32767.99998474121, 32767.99998474121, 0.0, 372899840]

I tried to set
P:=6.7369
I:=0.55878
D:=0
QPPS:=5690

converting it x 65536 I got:
P: 441509 I:36620 D:0 and QPPS:372899840
I set this values with method SetM1VelocityPID(address,p,i,d,qpps) BUT reading the PID i get
[1, 32767.99998474121, 32767.99998474121, 0.0, 372899840]

What is wrong?

Re: set PID speed

Posted: Thu Nov 05, 2020 11:44 pm
by fausto.tromba
shall I receive an answer? I have to insert this feature in the SW and I'm stocked on it.

Re: set PID speed

Posted: Tue Nov 17, 2020 6:29 pm
by Basicmicro Support
The problem is we are understaffed right now and very busy. The other problem is I did rush my last response.

Using the Roboclaw.py library you dont need to do the conversion. It is already done for you:

Here is the command in the Python library.
def SetM1VelocityPID(self,address,p,i,d,qpps):
return self._write4444(address,self.Cmd.SETM1PID,long(d*65536),long(p*65536),long(i*65536),qpps)

So P I and D are floating point numbers and qpps is an integer.

Im sorry I didnt have more time to understand your question better last time. Hopefully this covers the issue better.

P.S. For a test program remove the code to parse values from a file. Why over complicate a test program like that?