roboclaw.py
Go to the documentation of this file.
1 import random
2 import serial
3 import struct
4 import time
5 
6 class Roboclaw:
7  'Roboclaw Interface Class'
8 
9  def __init__(self, comport, rate, timeout=0.01, retries=3):
10  self.comport = comport
11  self.rate = rate
12  self.timeout = timeout
13  self._trystimeout = retries
14  self._crc = 0
15 
16  #Command Enums
17  class Cmd():
18  M1FORWARD = 0
19  M1BACKWARD = 1
20  SETMINMB = 2
21  SETMAXMB = 3
22  M2FORWARD = 4
23  M2BACKWARD = 5
24  M17BIT = 6
25  M27BIT = 7
26  MIXEDFORWARD = 8
27  MIXEDBACKWARD = 9
28  MIXEDRIGHT = 10
29  MIXEDLEFT = 11
30  MIXEDFB = 12
31  MIXEDLR = 13
32  GETM1ENC = 16
33  GETM2ENC = 17
34  GETM1SPEED = 18
35  GETM2SPEED = 19
36  RESETENC = 20
37  GETVERSION = 21
38  SETM1ENCCOUNT = 22
39  SETM2ENCCOUNT = 23
40  GETMBATT = 24
41  GETLBATT = 25
42  SETMINLB = 26
43  SETMAXLB = 27
44  SETM1PID = 28
45  SETM2PID = 29
46  GETM1ISPEED = 30
47  GETM2ISPEED = 31
48  M1DUTY = 32
49  M2DUTY = 33
50  MIXEDDUTY = 34
51  M1SPEED = 35
52  M2SPEED = 36
53  MIXEDSPEED = 37
54  M1SPEEDACCEL = 38
55  M2SPEEDACCEL = 39
56  MIXEDSPEEDACCEL = 40
57  M1SPEEDDIST = 41
58  M2SPEEDDIST = 42
59  MIXEDSPEEDDIST = 43
60  M1SPEEDACCELDIST = 44
61  M2SPEEDACCELDIST = 45
62  MIXEDSPEEDACCELDIST = 46
63  GETBUFFERS = 47
64  GETPWMS = 48
65  GETCURRENTS = 49
66  MIXEDSPEED2ACCEL = 50
67  MIXEDSPEED2ACCELDIST = 51
68  M1DUTYACCEL = 52
69  M2DUTYACCEL = 53
70  MIXEDDUTYACCEL = 54
71  READM1PID = 55
72  READM2PID = 56
73  SETMAINVOLTAGES = 57
74  SETLOGICVOLTAGES = 58
75  GETMINMAXMAINVOLTAGES = 59
76  GETMINMAXLOGICVOLTAGES = 60
77  SETM1POSPID = 61
78  SETM2POSPID = 62
79  READM1POSPID = 63
80  READM2POSPID = 64
81  M1SPEEDACCELDECCELPOS = 65
82  M2SPEEDACCELDECCELPOS = 66
83  MIXEDSPEEDACCELDECCELPOS = 67
84  SETM1DEFAULTACCEL = 68
85  SETM2DEFAULTACCEL = 69
86  SETPINFUNCTIONS = 74
87  GETPINFUNCTIONS = 75
88  SETDEADBAND = 76
89  GETDEADBAND = 77
90  RESTOREDEFAULTS = 80
91  GETTEMP = 82
92  GETTEMP2 = 83
93  GETERROR = 90
94  GETENCODERMODE = 91
95  SETM1ENCODERMODE = 92
96  SETM2ENCODERMODE = 93
97  WRITENVM = 94
98  READNVM = 95
99  SETCONFIG = 98
100  GETCONFIG = 99
101  SETM1MAXCURRENT = 133
102  SETM2MAXCURRENT = 134
103  GETM1MAXCURRENT = 135
104  GETM2MAXCURRENT = 136
105  SETPWMMODE = 148
106  GETPWMMODE = 149
107  READEEPROM = 252
108  WRITEEEPROM = 253
109  FLAGBOOTLOADER = 255
110 
111  #Private Functions
112  def crc_clear(self):
113  self._crc = 0
114  return
115 
116  def crc_update(self,data):
117  self._crc = self._crc ^ (data << 8)
118  for bit in range(0, 8):
119  if (self._crc&0x8000) == 0x8000:
120  self._crc = ((self._crc << 1) ^ 0x1021)
121  else:
122  self._crc = self._crc << 1
123  return
124 
125  def _sendcommand(self,address,command):
126  self.crc_clear()
127  self.crc_update(address)
128  self._port.write(chr(address))
129  self.crc_update(command)
130  self._port.write(chr(command))
131  return
132 
133  def _readchecksumword(self):
134  data = self._port.read(2)
135  if len(data)==2:
136  crc = (ord(data[0])<<8) | ord(data[1])
137  return (1,crc)
138  return (0,0)
139 
140  def _readbyte(self):
141  data = self._port.read(1)
142  if len(data):
143  val = ord(data)
144  self.crc_update(val)
145  return (1,val)
146  return (0,0)
147 
148  def _readword(self):
149  val1 = self._readbyte()
150  if val1[0]:
151  val2 = self._readbyte()
152  if val2[0]:
153  return (1,val1[1]<<8|val2[1])
154  return (0,0)
155 
156  def _readlong(self):
157  val1 = self._readbyte()
158  if val1[0]:
159  val2 = self._readbyte()
160  if val2[0]:
161  val3 = self._readbyte()
162  if val3[0]:
163  val4 = self._readbyte()
164  if val4[0]:
165  return (1,val1[1]<<24|val2[1]<<16|val3[1]<<8|val4[1])
166  return (0,0)
167 
168  def _readslong(self):
169  val = self._readlong()
170  if val[0]:
171  if val[1]&0x80000000:
172  return (val[0],val[1]-0x100000000)
173  return (val[0],val[1])
174  return (0,0)
175 
176  def _writebyte(self,val):
177  self.crc_update(val&0xFF)
178  self._port.write(chr(val&0xFF))
179 
180  def _writesbyte(self,val):
181  self._writebyte(val)
182 
183  def _writeword(self,val):
184  self._writebyte((val>>8)&0xFF)
185  self._writebyte(val&0xFF)
186 
187  def _writesword(self,val):
188  self._writeword(val)
189 
190  def _writelong(self,val):
191  self._writebyte((val>>24)&0xFF)
192  self._writebyte((val>>16)&0xFF)
193  self._writebyte((val>>8)&0xFF)
194  self._writebyte(val&0xFF)
195 
196  def _writeslong(self,val):
197  self._writelong(val)
198 
199  def _read1(self,address,cmd):
200  trys = self._trystimeout
201  while 1:
202  self._port.flushInput()
203  self._sendcommand(address,cmd)
204  val1 = self._readbyte()
205  if val1[0]:
206  crc = self._readchecksumword()
207  if crc[0]:
208  if self._crc&0xFFFF!=crc[1]&0xFFFF:
209  return (0,0)
210  return (1,val1[1])
211  trys-=1
212  if trys==0:
213  break
214  return (0,0)
215 
216  def _read2(self,address,cmd):
217  trys = self._trystimeout
218  while 1:
219  self._port.flushInput()
220  self._sendcommand(address,cmd)
221  val1 = self._readword()
222  if val1[0]:
223  crc = self._readchecksumword()
224  if crc[0]:
225  if self._crc&0xFFFF!=crc[1]&0xFFFF:
226  return (0,0)
227  return (1,val1[1])
228  trys-=1
229  if trys==0:
230  break
231  return (0,0)
232 
233  def _read4(self,address,cmd):
234  trys = self._trystimeout
235  while 1:
236  self._port.flushInput()
237  self._sendcommand(address,cmd)
238  val1 = self._readlong()
239  if val1[0]:
240  crc = self._readchecksumword()
241  if crc[0]:
242  if self._crc&0xFFFF!=crc[1]&0xFFFF:
243  return (0,0)
244  return (1,val1[1])
245  trys-=1
246  if trys==0:
247  break
248  return (0,0)
249 
250  def _read4_1(self,address,cmd):
251  trys = self._trystimeout
252  while 1:
253  self._port.flushInput()
254  self._sendcommand(address,cmd)
255  val1 = self._readslong()
256  if val1[0]:
257  val2 = self._readbyte()
258  if val2[0]:
259  crc = self._readchecksumword()
260  if crc[0]:
261  if self._crc&0xFFFF!=crc[1]&0xFFFF:
262  return (0,0)
263  return (1,val1[1],val2[1])
264  trys-=1
265  if trys==0:
266  break
267  return (0,0)
268 
269  def _read_n(self,address,cmd,args):
270  trys = self._trystimeout
271  while 1:
272  self._port.flushInput()
273  trys-=1
274  if trys==0:
275  break
276  failed=False
277  self._sendcommand(address,cmd)
278  data = [1,]
279  for i in range(0,args):
280  val = self._readlong()
281  if val[0]==0:
282  failed=True
283  break
284  data.append(val[1])
285  if failed:
286  continue
287  crc = self._readchecksumword()
288  if crc[0]:
289  if self._crc&0xFFFF==crc[1]&0xFFFF:
290  return (data);
291  return (0,0,0,0,0)
292 
293  def _writechecksum(self):
294  self._writeword(self._crc&0xFFFF)
295  val = self._readbyte()
296  if(len(val)>0):
297  if val[0]:
298  return True
299  return False
300 
301  def _write0(self,address,cmd):
302  trys=self._trystimeout
303  while trys:
304  self._sendcommand(address,cmd)
305  if self._writechecksum():
306  return True
307  trys=trys-1
308  return False
309 
310  def _write1(self,address,cmd,val):
311  trys=self._trystimeout
312  while trys:
313  self._sendcommand(address,cmd)
314  self._writebyte(val)
315  if self._writechecksum():
316  return True
317  trys=trys-1
318  return False
319 
320  def _write11(self,address,cmd,val1,val2):
321  trys=self._trystimeout
322  while trys:
323  self._sendcommand(address,cmd)
324  self._writebyte(val1)
325  self._writebyte(val2)
326  if self._writechecksum():
327  return True
328  trys=trys-1
329  return False
330 
331  def _write111(self,address,cmd,val1,val2,val3):
332  trys=self._trystimeout
333  while trys:
334  self._sendcommand(address,cmd)
335  self._writebyte(val1)
336  self._writebyte(val2)
337  self._writebyte(val3)
338  if self._writechecksum():
339  return True
340  trys=trys-1
341  return False
342 
343  def _write2(self,address,cmd,val):
344  trys=self._trystimeout
345  while trys:
346  self._sendcommand(address,cmd)
347  self._writeword(val)
348  if self._writechecksum():
349  return True
350  trys=trys-1
351  return False
352 
353  def _writeS2(self,address,cmd,val):
354  trys=self._trystimeout
355  while trys:
356  self._sendcommand(address,cmd)
357  self._writesword(val)
358  if self._writechecksum():
359  return True
360  trys=trys-1
361  return False
362 
363  def _write22(self,address,cmd,val1,val2):
364  trys=self._trystimeout
365  while trys:
366  self._sendcommand(address,cmd)
367  self._writeword(val1)
368  self._writeword(val2)
369  if self._writechecksum():
370  return True
371  trys=trys-1
372  return False
373 
374  def _writeS22(self,address,cmd,val1,val2):
375  trys=self._trystimeout
376  while trys:
377  self._sendcommand(address,cmd)
378  self._writesword(val1)
379  self._writeword(val2)
380  if self._writechecksum():
381  return True
382  trys=trys-1
383  return False
384 
385  def _writeS2S2(self,address,cmd,val1,val2):
386  trys=self._trystimeout
387  while trys:
388  self._sendcommand(address,cmd)
389  self._writesword(val1)
390  self._writesword(val2)
391  if self._writechecksum():
392  return True
393  trys=trys-1
394  return False
395 
396  def _writeS24(self,address,cmd,val1,val2):
397  trys=self._trystimeout
398  while trys:
399  self._sendcommand(address,cmd)
400  self._writesword(val1)
401  self._writelong(val2)
402  if self._writechecksum():
403  return True
404  trys=trys-1
405  return False
406 
407  def _writeS24S24(self,address,cmd,val1,val2,val3,val4):
408  trys=self._trystimeout
409  while trys:
410  self._sendcommand(address,cmd)
411  self._writesword(val1)
412  self._writelong(val2)
413  self._writesword(val3)
414  self._writelong(val4)
415  if self._writechecksum():
416  return True
417  trys=trys-1
418  return False
419 
420  def _write4(self,address,cmd,val):
421  trys=self._trystimeout
422  while trys:
423  self._sendcommand(address,cmd)
424  self._writelong(val)
425  if self._writechecksum():
426  return True
427  trys=trys-1
428  return False
429 
430  def _writeS4(self,address,cmd,val):
431  trys=self._trystimeout
432  while trys:
433  self._sendcommand(address,cmd)
434  self._writeslong(val)
435  if self._writechecksum():
436  return True
437  trys=trys-1
438  return False
439 
440  def _write44(self,address,cmd,val1,val2):
441  trys=self._trystimeout
442  while trys:
443  self._sendcommand(address,cmd)
444  self._writelong(val1)
445  self._writelong(val2)
446  if self._writechecksum():
447  return True
448  trys=trys-1
449  return False
450 
451  def _write4S4(self,address,cmd,val1,val2):
452  trys=self._trystimeout
453  while trys:
454  self._sendcommand(address,cmd)
455  self._writelong(val1)
456  self._writeslong(val2)
457  if self._writechecksum():
458  return True
459  trys=trys-1
460  return False
461 
462  def _writeS4S4(self,address,cmd,val1,val2):
463  trys=self._trystimeout
464  while trys:
465  self._sendcommand(address,cmd)
466  self._writeslong(val1)
467  self._writeslong(val2)
468  if self._writechecksum():
469  return True
470  trys=trys-1
471  return False
472 
473  def _write441(self,address,cmd,val1,val2,val3):
474  trys=self._trystimeout
475  while trys:
476  self._sendcommand(address,cmd)
477  self._writelong(val1)
478  self._writelong(val2)
479  self._writebyte(val3)
480  if self._writechecksum():
481  return True
482  trys=trys-1
483  return False
484 
485  def _writeS441(self,address,cmd,val1,val2,val3):
486  trys=self._trystimeout
487  while trys:
488  self._sendcommand(address,cmd)
489  self._writeslong(val1)
490  self._writelong(val2)
491  self._writebyte(val3)
492  if self._writechecksum():
493  return True
494  trys=trys-1
495  return False
496 
497  def _write4S4S4(self,address,cmd,val1,val2,val3):
498  trys=self._trystimeout
499  while trys:
500  self._sendcommand(address,cmd)
501  self._writelong(val1)
502  self._writeslong(val2)
503  self._writeslong(val3)
504  if self._writechecksum():
505  return True
506  trys=trys-1
507  return False
508 
509  def _write4S441(self,address,cmd,val1,val2,val3,val4):
510  trys=self._trystimeout
511  while trys:
512  self._sendcommand(address,cmd)
513  self._writelong(val1)
514  self._writeslong(val2)
515  self._writelong(val3)
516  self._writebyte(val4)
517  if self._writechecksum():
518  return True
519  trys=trys-1
520  return False
521 
522  def _write4444(self,address,cmd,val1,val2,val3,val4):
523  trys=self._trystimeout
524  while trys:
525  self._sendcommand(address,cmd)
526  self._writelong(val1)
527  self._writelong(val2)
528  self._writelong(val3)
529  self._writelong(val4)
530  if self._writechecksum():
531  return True
532  trys=trys-1
533  return False
534 
535  def _write4S44S4(self,address,cmd,val1,val2,val3,val4):
536  trys=self._trystimeout
537  while trys:
538  self._sendcommand(address,cmd)
539  self._writelong(val1)
540  self._writeslong(val2)
541  self._writelong(val3)
542  self._writeslong(val4)
543  if self._writechecksum():
544  return True
545  trys=trys-1
546  return False
547 
548  def _write44441(self,address,cmd,val1,val2,val3,val4,val5):
549  trys=self._trystimeout
550  while trys:
551  self._sendcommand(address,cmd)
552  self._writelong(val1)
553  self._writelong(val2)
554  self._writelong(val3)
555  self._writelong(val4)
556  self._writebyte(val5)
557  if self._writechecksum():
558  return True
559  trys=trys-1
560  return False
561 
562  def _writeS44S441(self,address,cmd,val1,val2,val3,val4,val5):
563  trys=self._trystimeout
564  while trys:
565  self._sendcommand(address,cmd)
566  self._writeslong(val1)
567  self._writelong(val2)
568  self._writeslong(val3)
569  self._writelong(val4)
570  self._writebyte(val5)
571  if self._writechecksum():
572  return True
573  trys=trys-1
574  return False
575 
576  def _write4S44S441(self,address,cmd,val1,val2,val3,val4,val5,val6):
577  trys=self._trystimeout
578  while trys:
579  self._sendcommand(address,cmd)
580  self._writelong(val1)
581  self._writeslong(val2)
582  self._writelong(val3)
583  self._writeslong(val4)
584  self._writelong(val5)
585  self._writebyte(val6)
586  if self._writechecksum():
587  return True
588  trys=trys-1
589  return False
590 
591  def _write4S444S441(self,address,cmd,val1,val2,val3,val4,val5,val6,val7):
592  trys=self._trystimeout
593  while trys:
594  self._sendcommand(self,address,cmd)
595  self._writelong(val1)
596  self._writeslong(val2)
597  self._writelong(val3)
598  self._writelong(val4)
599  self._writeslong(val5)
600  self._writelong(val6)
601  self._writebyte(val7)
602  if self._writechecksum():
603  return True
604  trys=trys-1
605  return False
606 
607  def _write4444444(self,address,cmd,val1,val2,val3,val4,val5,val6,val7):
608  trys=self._trystimeout
609  while trys:
610  self._sendcommand(address,cmd)
611  self._writelong(val1)
612  self._writelong(val2)
613  self._writelong(val3)
614  self._writelong(val4)
615  self._writelong(val5)
616  self._writelong(val6)
617  self._writelong(val7)
618  if self._writechecksum():
619  return True
620  trys=trys-1
621  return False
622 
623  def _write444444441(self,address,cmd,val1,val2,val3,val4,val5,val6,val7,val8,val9):
624  trys=self._trystimeout
625  while trys:
626  self._sendcommand(address,cmd)
627  self._writelong(val1)
628  self._writelong(val2)
629  self._writelong(val3)
630  self._writelong(val4)
631  self._writelong(val5)
632  self._writelong(val6)
633  self._writelong(val7)
634  self._writelong(val8)
635  self._writebyte(val9)
636  if self._writechecksum():
637  return True
638  trys=trys-1
639  return False
640 
641  #User accessible functions
642  def SendRandomData(self,cnt):
643  for i in range(0,cnt):
644  byte = random.getrandbits(8)
645  self._port.write(chr(byte))
646  return
647 
648  def ForwardM1(self,address,val):
649  return self._write1(address,self.Cmd.M1FORWARD,val)
650 
651  def BackwardM1(self,address,val):
652  return self._write1(address,self.Cmd.M1BACKWARD,val)
653 
654  def SetMinVoltageMainBattery(self,address,val):
655  return self._write1(address,self.Cmd.SETMINMB,val)
656 
657  def SetMaxVoltageMainBattery(self,address,val):
658  return self._write1(address,self.Cmd.SETMAXMB,val)
659 
660  def ForwardM2(self,address,val):
661  return self._write1(address,self.Cmd.M2FORWARD,val)
662 
663  def BackwardM2(self,address,val):
664  return self._write1(address,self.Cmd.M2BACKWARD,val)
665 
666  def ForwardBackwardM1(self,address,val):
667  return self._write1(address,self.Cmd.M17BIT,val)
668 
669  def ForwardBackwardM2(self,address,val):
670  return self._write1(address,self.Cmd.M27BIT,val)
671 
672  def ForwardMixed(self,address,val):
673  return self._write1(address,self.Cmd.MIXEDFORWARD,val)
674 
675  def BackwardMixed(self,address,val):
676  return self._write1(address,self.Cmd.MIXEDBACKWARD,val)
677 
678  def TurnRightMixed(self,address,val):
679  return self._write1(address,self.Cmd.MIXEDRIGHT,val)
680 
681  def TurnLeftMixed(self,address,val):
682  return self._write1(address,self.Cmd.MIXEDLEFT,val)
683 
684  def ForwardBackwardMixed(self,address,val):
685  return self._write1(address,self.Cmd.MIXEDFB,val)
686 
687  def LeftRightMixed(self,address,val):
688  return self._write1(address,self.Cmd.MIXEDLR,val)
689 
690  def ReadEncM1(self,address):
691  return self._read4_1(address,self.Cmd.GETM1ENC)
692 
693  def ReadEncM2(self,address):
694  return self._read4_1(address,self.Cmd.GETM2ENC)
695 
696  def ReadSpeedM1(self,address):
697  return self._read4_1(address,self.Cmd.GETM1SPEED)
698 
699  def ReadSpeedM2(self,address):
700  return self._read4_1(address,self.Cmd.GETM2SPEED)
701 
702  def ResetEncoders(self,address):
703  return self._write0(address,self.Cmd.RESETENC)
704 
705  def ReadVersion(self,address):
706  trys=self._trystimeout
707  while 1:
708  self._port.flushInput()
709  self._sendcommand(address,self.Cmd.GETVERSION)
710  str = ""
711  passed = True
712  for i in range(0,48):
713  data = self._port.read(1)
714  if len(data):
715  val = ord(data)
716  self.crc_update(val)
717  if(val==0):
718  break
719  str+=data[0]
720  else:
721  passed = False
722  break
723  if passed:
724  crc = self._readchecksumword()
725  if crc[0]:
726  if self._crc&0xFFFF==crc[1]&0xFFFF:
727  return (1,str)
728  else:
729  time.sleep(0.01)
730  trys-=1
731  if trys==0:
732  break
733  return (0,0)
734 
735  def SetEncM1(self,address,cnt):
736  return self._write4(address,self.Cmd.SETM1ENCCOUNT,cnt)
737 
738  def SetEncM2(self,address,cnt):
739  return self._write4(address,self.Cmd.SETM2ENCCOUNT,cnt)
740 
741  def ReadMainBatteryVoltage(self,address):
742  return self._read2(address,self.Cmd.GETMBATT)
743 
744  def ReadLogicBatteryVoltage(self,address,):
745  return self._read2(address,self.Cmd.GETLBATT)
746 
747  def SetMinVoltageLogicBattery(self,address,val):
748  return self._write1(address,self.Cmd.SETMINLB,val)
749 
750  def SetMaxVoltageLogicBattery(self,address,val):
751  return self._write1(address,self.Cmd.SETMAXLB,val)
752 
753  def SetM1VelocityPID(self,address,p,i,d,qpps):
754  return self._write4444(address,self.Cmd.SETM1PID,long(d*65536),long(p*65536),long(i*65536),qpps)
755 
756  def SetM2VelocityPID(self,address,p,i,d,qpps):
757  return self._write4444(address,self.Cmd.SETM2PID,long(d*65536),long(p*65536),long(i*65536),qpps)
758 
759  def ReadISpeedM1(self,address):
760  return self._read4_1(address,self.Cmd.GETM1ISPEED)
761 
762  def ReadISpeedM2(self,address):
763  return self._read4_1(address,self.Cmd.GETM2ISPEED)
764 
765  def DutyM1(self,address,val):
766  return self._writeS2(address,self.Cmd.M1DUTY,val)
767 
768  def DutyM2(self,address,val):
769  return self._writeS2(address,self.Cmd.M2DUTY,val)
770 
771  def DutyM1M2(self,address,m1,m2):
772  return self._writeS2S2(address,self.Cmd.MIXEDDUTY,m1,m2)
773 
774  def SpeedM1(self,address,val):
775  return self._writeS4(address,self.Cmd.M1SPEED,val)
776 
777  def SpeedM2(self,address,val):
778  return self._writeS4(address,self.Cmd.M2SPEED,val)
779 
780  def SpeedM1M2(self,address,m1,m2):
781  return self._writeS4S4(address,self.Cmd.MIXEDSPEED,m1,m2)
782 
783  def SpeedAccelM1(self,address,accel,speed):
784  return self._write4S4(address,self.Cmd.M1SPEEDACCEL,accel,speed)
785 
786  def SpeedAccelM2(self,address,accel,speed):
787  return self._write4S4(address,self.Cmd.M2SPEEDACCEL,accel,speed)
788 
789  def SpeedAccelM1M2(self,address,accel,speed1,speed2):
790  return self._write4S4S4(address,self.Cmd.MIXEDSPEEDACCEL,accel,speed1,speed2)
791 
792  def SpeedDistanceM1(self,address,speed,distance,buffer):
793  return self._writeS441(address,self.Cmd.M1SPEEDDIST,speed,distance,buffer)
794 
795  def SpeedDistanceM2(self,address,speed,distance,buffer):
796  return self._writeS441(address,self.Cmd.M2SPEEDDIST,speed,distance,buffer)
797 
798  def SpeedDistanceM1M2(self,address,speed1,distance1,speed2,distance2,buffer):
799  return self._writeS44S441(address,self.Cmd.MIXEDSPEEDDIST,speed1,distance1,speed2,distance2,buffer)
800 
801  def SpeedAccelDistanceM1(self,address,accel,speed,distance,buffer):
802  return self._write4S441(address,self.Cmd.M1SPEEDACCELDIST,accel,speed,distance,buffer)
803 
804  def SpeedAccelDistanceM2(self,address,accel,speed,distance,buffer):
805  return self._write4S441(address,self.Cmd.M2SPEEDACCELDIST,accel,speed,distance,buffer)
806 
807  def SpeedAccelDistanceM1M2(self,address,accel,speed1,distance1,speed2,distance2,buffer):
808  return self._write4S44S441(address,self.Cmd.MIXEDSPEEDACCELDIST,accel,speed1,distance1,speed2,distance2,buffer)
809 
810  def ReadBuffers(self,address):
811  val = self._read2(address,self.Cmd.GETBUFFERS)
812  if val[0]:
813  return (1,val[1]>>8,val[1]&0xFF)
814  return (0,0,0)
815 
816  def ReadPWMs(self,address):
817  val = self._read4(address,self.Cmd.GETPWMS)
818  if val[0]:
819  pwm1 = val[1]>>16
820  pwm2 = val[1]&0xFFFF
821  if pwm1&0x8000:
822  pwm1-=0x10000
823  if pwm2&0x8000:
824  pwm2-=0x10000
825  return (1,pwm1,pwm2)
826  return (0,0,0)
827 
828  def ReadCurrents(self,address):
829  val = self._read4(address,self.Cmd.GETCURRENTS)
830  if val[0]:
831  cur1 = val[1]>>16
832  cur2 = val[1]&0xFFFF
833  if cur1&0x8000:
834  cur1-=0x10000
835  if cur2&0x8000:
836  cur2-=0x10000
837  return (1,cur1,cur2)
838  return (0,0,0)
839 
840  def SpeedAccelM1M2_2(self,address,accel1,speed1,accel2,speed2):
841  return self._write4S44S4(address,self.Cmd.MIXEDSPEED2ACCEL,accel1,speed1,accel2,speed2)
842 
843  def SpeedAccelDistanceM1M2_2(self,address,accel1,speed1,distance1,accel2,speed2,distance2,buffer):
844  return self._write4S444S441(address,self.Cmd.MIXEDSPEED2ACCELDIST,accel1,speed1,distance1,accel2,speed2,distance2,buffer)
845 
846  def DutyAccelM1(self,address,accel,duty):
847  return self._writeS24(address,self.Cmd.M1DUTYACCEL,duty,accel)
848 
849  def DutyAccelM2(self,address,accel,duty):
850  return self._writeS24(address,self.Cmd.M2DUTYACCEL,duty,accel)
851 
852  def DutyAccelM1M2(self,address,accel1,duty1,accel2,duty2):
853  return self._writeS24S24(address,self.Cmd.MIXEDDUTYACCEL,duty1,accel1,duty2,accel2)
854 
855  def ReadM1VelocityPID(self,address):
856  data = self._read_n(address,self.Cmd.READM1PID,4)
857  if data[0]:
858  data[1]/=65536.0
859  data[2]/=65536.0
860  data[3]/=65536.0
861  return data
862  return (0,0,0,0,0)
863 
864  def ReadM2VelocityPID(self,address):
865  data = self._read_n(address,self.Cmd.READM2PID,4)
866  if data[0]:
867  data[1]/=65536.0
868  data[2]/=65536.0
869  data[3]/=65536.0
870  return data
871  return (0,0,0,0,0)
872 
873  def SetMainVoltages(self,address,min, max):
874  return self._write22(address,self.Cmd.SETMAINVOLTAGES,min,max)
875 
876  def SetLogicVoltages(self,address,min, max):
877  return self._write22(address,self.Cmd.SETLOGICVOLTAGES,min,max)
878 
879  def ReadMinMaxMainVoltages(self,address):
880  val = self._read4(address,self.Cmd.GETMINMAXMAINVOLTAGES)
881  if val[0]:
882  min = val[1]>>16
883  max = val[1]&0xFFFF
884  return (1,min,max)
885  return (0,0,0)
886 
887  def ReadMinMaxLogicVoltages(self,address):
888  val = self._read4(address,self.Cmd.GETMINMAXLOGICVOLTAGES)
889  if val[0]:
890  min = val[1]>>16
891  max = val[1]&0xFFFF
892  return (1,min,max)
893  return (0,0,0)
894 
895  def SetM1PositionPID(self,address,kp,ki,kd,kimax,deadzone,min,max):
896  return self._write4444444(address,self.Cmd.SETM1POSPID,long(kd*1024),long(kp*1024),long(ki*1024),kimax,deadzone,min,max)
897 
898  def SetM2PositionPID(self,address,kp,ki,kd,kimax,deadzone,min,max):
899  return self._write4444444(address,self.Cmd.SETM2POSPID,long(kd*1024),long(kp*1024),long(ki*1024),kimax,deadzone,min,max)
900 
901  def ReadM1PositionPID(self,address):
902  data = self._read_n(address,self.Cmd.READM1POSPID,7)
903  if data[0]:
904  data[1]/=1024.0
905  data[2]/=1024.0
906  data[3]/=1024.0
907  return data
908  return (0,0,0,0,0,0,0,0)
909 
910  def ReadM2PositionPID(self,address):
911  data = self._read_n(address,self.Cmd.READM2POSPID,7)
912  if data[0]:
913  data[1]/=1024.0
914  data[2]/=1024.0
915  data[3]/=1024.0
916  return data
917  return (0,0,0,0,0,0,0,0)
918 
919  def SpeedAccelDeccelPositionM1(self,address,accel,speed,deccel,position,buffer):
920  return self._write44441(address,self.Cmd.M1SPEEDACCELDECCELPOS,accel,speed,deccel,position,buffer)
921 
922  def SpeedAccelDeccelPositionM2(self,address,accel,speed,deccel,position,buffer):
923  return self._write44441(address,self.Cmd.M2SPEEDACCELDECCELPOS,accel,speed,deccel,position,buffer)
924 
925  def SpeedAccelDeccelPositionM1M2(self,address,accel1,speed1,deccel1,position1,accel2,speed2,deccel2,position2,buffer):
926  return self._write444444441(address,self.Cmd.MIXEDSPEEDACCELDECCELPOS,accel1,speed1,deccel1,position1,accel2,speed2,deccel2,position2,buffer)
927 
928  def SetM1DefaultAccel(self,address,accel):
929  return self._write4(address,self.Cmd.SETM1DEFAULTACCEL,accel)
930 
931  def SetM2DefaultAccel(self,address,accel):
932  return self._write4(address,self.Cmd.SETM2DEFAULTACCEL,accel)
933 
934  def SetPinFunctions(self,address,S3mode,S4mode,S5mode):
935  return self._write111(address,self.Cmd.SETPINFUNCTIONS,S3mode,S4mode,S5mode)
936 
937  def ReadPinFunctions(self,address):
938  trys = self._trystimeout
939  while 1:
940  self._sendcommand(address,self.Cmd.GETPINFUNCTIONS)
941  val1 = self._readbyte()
942  if val1[0]:
943  val2 = self._readbyte()
944  if val1[0]:
945  val3 = self._readbyte()
946  if val1[0]:
947  crc = self._readchecksumword()
948  if crc[0]:
949  if self._crc&0xFFFF!=crc[1]&0xFFFF:
950  return (0,0)
951  return (1,val1[1],val2[1],val3[1])
952  trys-=1
953  if trys==0:
954  break
955  return (0,0)
956 
957  def SetDeadBand(self,address,min,max):
958  return self._write11(address,self.Cmd.SETDEADBAND,min,max)
959 
960  def GetDeadBand(self,address):
961  val = self._read2(address,self.Cmd.GETDEADBAND)
962  if val[0]:
963  return (1,val[1]>>8,val[1]&0xFF)
964  return (0,0,0)
965 
966  #Warning(TTL Serial): Baudrate will change if not already set to 38400. Communications will be lost
967  def RestoreDefaults(self,address):
968  return self._write0(address,self.Cmd.RESTOREDEFAULTS)
969 
970  def ReadTemp(self,address):
971  return self._read2(address,self.Cmd.GETTEMP)
972 
973  def ReadTemp2(self,address):
974  return self._read2(address,self.Cmd.GETTEMP2)
975 
976  def ReadError(self,address):
977  return self._read4(address,self.Cmd.GETERROR)
978 
979  def ReadEncoderModes(self,address):
980  val = self._read2(address,self.Cmd.GETENCODERMODE)
981  if val[0]:
982  return (1,val[1]>>8,val[1]&0xFF)
983  return (0,0,0)
984 
985  def SetM1EncoderMode(self,address,mode):
986  return self._write1(address,self.Cmd.SETM1ENCODERMODE,mode)
987 
988  def SetM2EncoderMode(self,address,mode):
989  return self._write1(address,self.Cmd.SETM2ENCODERMODE,mode)
990 
991  #saves active settings to NVM
992  def WriteNVM(self,address):
993  return self._write4(address,self.Cmd.WRITENVM,0xE22EAB7A)
994 
995  #restores settings from NVM
996  #Warning(TTL Serial): If baudrate changes or the control mode changes communications will be lost
997  def ReadNVM(self,address):
998  return self._write0(address,self.Cmd.READNVM)
999 
1000  #Warning(TTL Serial): If control mode is changed from packet serial mode when setting config communications will be lost!
1001  #Warning(TTL Serial): If baudrate of packet serial mode is changed communications will be lost!
1002  def SetConfig(self,address,config):
1003  return self._write2(address,self.Cmd.SETCONFIG,config)
1004 
1005  def GetConfig(self,address):
1006  return self._read2(address,self.Cmd.GETCONFIG)
1007 
1008  def SetM1MaxCurrent(self,address,max):
1009  return self._write44(address,self.Cmd.SETM1MAXCURRENT,max,0)
1010 
1011  def SetM2MaxCurrent(self,address,max):
1012  return self._write44(address,self.Cmd.SETM2MAXCURRENT,max,0)
1013 
1014  def ReadM1MaxCurrent(self,address):
1015  data = self._read_n(address,self.Cmd.GETM1MAXCURRENT,2)
1016  if data[0]:
1017  return (1,data[1])
1018  return (0,0)
1019 
1020  def ReadM2MaxCurrent(self,address):
1021  data = self._read_n(address,self.Cmd.GETM2MAXCURRENT,2)
1022  if data[0]:
1023  return (1,data[1])
1024  return (0,0)
1025 
1026  def SetPWMMode(self,address,mode):
1027  return self._write1(address,self.Cmd.SETPWMMODE,mode)
1028 
1029  def ReadPWMMode(self,address):
1030  return self._read1(address,self.Cmd.GETPWMMODE)
1031 
1032  def ReadEeprom(self,address,ee_address):
1033  trys = self._trystimeout
1034  while 1:
1035  self._port.flushInput()
1036  self._sendcommand(address,self.Cmd.READEEPROM)
1037  self.crc_update(ee_address)
1038  self._port.write(chr(ee_address))
1039  val1 = self._readword()
1040  if val1[0]:
1041  crc = self._readchecksumword()
1042  if crc[0]:
1043  if self._crc&0xFFFF!=crc[1]&0xFFFF:
1044  return (0,0)
1045  return (1,val1[1])
1046  trys-=1
1047  if trys==0:
1048  break
1049  return (0,0)
1050 
1051  def WriteEeprom(self,address,ee_address,ee_word):
1052  retval = self._write111(address,self.Cmd.WRITEEEPROM,ee_address,ee_word>>8,ee_word&0xFF)
1053  if retval==True:
1054  trys = self._trystimeout
1055  while 1:
1056  self._port.flushInput()
1057  val1 = self._readbyte()
1058  if val1[0]:
1059  if val1[1]==0xaa:
1060  return True
1061  trys-=1
1062  if trys==0:
1063  break
1064  return False
1065 
1066  def Open(self):
1067  try:
1068  self._port = serial.Serial(port=self.comport, baudrate=self.rate, timeout=1, interCharTimeout=self.timeout)
1069  except:
1070  return 0
1071  return 1
1072 
def SpeedDistanceM1(self, address, speed, distance, buffer)
Definition: roboclaw.py:792
def SpeedDistanceM1M2(self, address, speed1, distance1, speed2, distance2, buffer)
Definition: roboclaw.py:798
def SetM1MaxCurrent(self, address, max)
Definition: roboclaw.py:1008
def _write444444441(self, address, cmd, val1, val2, val3, val4, val5, val6, val7, val8, val9)
Definition: roboclaw.py:623
def _writeS2S2(self, address, cmd, val1, val2)
Definition: roboclaw.py:385
def SpeedAccelM1M2_2(self, address, accel1, speed1, accel2, speed2)
Definition: roboclaw.py:840
def TurnLeftMixed(self, address, val)
Definition: roboclaw.py:681
def SpeedDistanceM2(self, address, speed, distance, buffer)
Definition: roboclaw.py:795
def _sendcommand(self, address, command)
Definition: roboclaw.py:125
def SetEncM1(self, address, cnt)
Definition: roboclaw.py:735
def ReadM1VelocityPID(self, address)
Definition: roboclaw.py:855
def SetM1PositionPID(self, address, kp, ki, kd, kimax, deadzone, min, max)
Definition: roboclaw.py:895
def _read4(self, address, cmd)
Definition: roboclaw.py:233
def _write1(self, address, cmd, val)
Definition: roboclaw.py:310
def ResetEncoders(self, address)
Definition: roboclaw.py:702
def _write22(self, address, cmd, val1, val2)
Definition: roboclaw.py:363
def ReadLogicBatteryVoltage(self, address)
Definition: roboclaw.py:744
def ReadEncoderModes(self, address)
Definition: roboclaw.py:979
def ReadMinMaxMainVoltages(self, address)
Definition: roboclaw.py:879
def SetM2MaxCurrent(self, address, max)
Definition: roboclaw.py:1011
def ForwardBackwardMixed(self, address, val)
Definition: roboclaw.py:684
def _read2(self, address, cmd)
Definition: roboclaw.py:216
def SetLogicVoltages(self, address, min, max)
Definition: roboclaw.py:876
def _writeS24S24(self, address, cmd, val1, val2, val3, val4)
Definition: roboclaw.py:407
def SpeedAccelM1M2(self, address, accel, speed1, speed2)
Definition: roboclaw.py:789
def DutyAccelM1M2(self, address, accel1, duty1, accel2, duty2)
Definition: roboclaw.py:852
def SetMaxVoltageLogicBattery(self, address, val)
Definition: roboclaw.py:750
def ForwardM2(self, address, val)
Definition: roboclaw.py:660
def SetM2EncoderMode(self, address, mode)
Definition: roboclaw.py:988
def GetConfig(self, address)
Definition: roboclaw.py:1005
def _write4444(self, address, cmd, val1, val2, val3, val4)
Definition: roboclaw.py:522
def BackwardM1(self, address, val)
Definition: roboclaw.py:651
def ReadSpeedM2(self, address)
Definition: roboclaw.py:699
def ReadEncM2(self, address)
Definition: roboclaw.py:693
def ReadEncM1(self, address)
Definition: roboclaw.py:690
def ReadM1PositionPID(self, address)
Definition: roboclaw.py:901
def ReadPinFunctions(self, address)
Definition: roboclaw.py:937
def SpeedAccelDistanceM1M2(self, address, accel, speed1, distance1, speed2, distance2, buffer)
Definition: roboclaw.py:807
def SetConfig(self, address, config)
Definition: roboclaw.py:1002
def ForwardMixed(self, address, val)
Definition: roboclaw.py:672
def SetM2PositionPID(self, address, kp, ki, kd, kimax, deadzone, min, max)
Definition: roboclaw.py:898
def SetPWMMode(self, address, mode)
Definition: roboclaw.py:1026
def WriteEeprom(self, address, ee_address, ee_word)
Definition: roboclaw.py:1051
def SetDeadBand(self, address, min, max)
Definition: roboclaw.py:957
def ReadBuffers(self, address)
Definition: roboclaw.py:810
def _write4S4S4(self, address, cmd, val1, val2, val3)
Definition: roboclaw.py:497
def _write44(self, address, cmd, val1, val2)
Definition: roboclaw.py:440
def ReadSpeedM1(self, address)
Definition: roboclaw.py:696
def SpeedAccelDistanceM1M2_2(self, address, accel1, speed1, distance1, accel2, speed2, distance2, buffer)
Definition: roboclaw.py:843
def DutyM2(self, address, val)
Definition: roboclaw.py:768
def ReadVersion(self, address)
Definition: roboclaw.py:705
def _write4S44S441(self, address, cmd, val1, val2, val3, val4, val5, val6)
Definition: roboclaw.py:576
def ForwardBackwardM1(self, address, val)
Definition: roboclaw.py:666
def SpeedAccelM1(self, address, accel, speed)
Definition: roboclaw.py:783
def ReadM2MaxCurrent(self, address)
Definition: roboclaw.py:1020
def SpeedAccelDeccelPositionM1(self, address, accel, speed, deccel, position, buffer)
Definition: roboclaw.py:919
def _write0(self, address, cmd)
Definition: roboclaw.py:301
def SetPinFunctions(self, address, S3mode, S4mode, S5mode)
Definition: roboclaw.py:934
def _write11(self, address, cmd, val1, val2)
Definition: roboclaw.py:320
def ReadEeprom(self, address, ee_address)
Definition: roboclaw.py:1032
def _writeS2(self, address, cmd, val)
Definition: roboclaw.py:353
def _read4_1(self, address, cmd)
Definition: roboclaw.py:250
def SetMainVoltages(self, address, min, max)
Definition: roboclaw.py:873
def SpeedAccelM2(self, address, accel, speed)
Definition: roboclaw.py:786
def SpeedAccelDistanceM1(self, address, accel, speed, distance, buffer)
Definition: roboclaw.py:801
def _write44441(self, address, cmd, val1, val2, val3, val4, val5)
Definition: roboclaw.py:548
def DutyM1M2(self, address, m1, m2)
Definition: roboclaw.py:771
def SpeedM1M2(self, address, m1, m2)
Definition: roboclaw.py:780
def ReadTemp2(self, address)
Definition: roboclaw.py:973
def DutyAccelM2(self, address, accel, duty)
Definition: roboclaw.py:849
def _write4S444S441(self, address, cmd, val1, val2, val3, val4, val5, val6, val7)
Definition: roboclaw.py:591
def ForwardBackwardM2(self, address, val)
Definition: roboclaw.py:669
def SetM1EncoderMode(self, address, mode)
Definition: roboclaw.py:985
def ReadM2PositionPID(self, address)
Definition: roboclaw.py:910
def RestoreDefaults(self, address)
Definition: roboclaw.py:967
def _write4444444(self, address, cmd, val1, val2, val3, val4, val5, val6, val7)
Definition: roboclaw.py:607
def ReadPWMMode(self, address)
Definition: roboclaw.py:1029
def SetM2VelocityPID(self, address, p, i, d, qpps)
Definition: roboclaw.py:756
def _read_n(self, address, cmd, args)
Definition: roboclaw.py:269
def __init__(self, comport, rate, timeout=0.01, retries=3)
Definition: roboclaw.py:9
def _write2(self, address, cmd, val)
Definition: roboclaw.py:343
def ReadMinMaxLogicVoltages(self, address)
Definition: roboclaw.py:887
def _writeS24(self, address, cmd, val1, val2)
Definition: roboclaw.py:396
def _read1(self, address, cmd)
Definition: roboclaw.py:199
def ReadM1MaxCurrent(self, address)
Definition: roboclaw.py:1014
def _writeS441(self, address, cmd, val1, val2, val3)
Definition: roboclaw.py:485
def DutyAccelM1(self, address, accel, duty)
Definition: roboclaw.py:846
def _writeS4S4(self, address, cmd, val1, val2)
Definition: roboclaw.py:462
def SpeedAccelDeccelPositionM1M2(self, address, accel1, speed1, deccel1, position1, accel2, speed2, deccel2, position2, buffer)
Definition: roboclaw.py:925
def ReadISpeedM1(self, address)
Definition: roboclaw.py:759
def ForwardM1(self, address, val)
Definition: roboclaw.py:648
def SpeedM1(self, address, val)
Definition: roboclaw.py:774
def SetEncM2(self, address, cnt)
Definition: roboclaw.py:738
def SetM2DefaultAccel(self, address, accel)
Definition: roboclaw.py:931
def BackwardM2(self, address, val)
Definition: roboclaw.py:663
def SetMinVoltageMainBattery(self, address, val)
Definition: roboclaw.py:654
def _write4(self, address, cmd, val)
Definition: roboclaw.py:420
def ReadPWMs(self, address)
Definition: roboclaw.py:816
def SetM1VelocityPID(self, address, p, i, d, qpps)
Definition: roboclaw.py:753
def ReadCurrents(self, address)
Definition: roboclaw.py:828
def ReadTemp(self, address)
Definition: roboclaw.py:970
def ReadNVM(self, address)
Definition: roboclaw.py:997
def _writeS44S441(self, address, cmd, val1, val2, val3, val4, val5)
Definition: roboclaw.py:562
def _write441(self, address, cmd, val1, val2, val3)
Definition: roboclaw.py:473
def _write4S44S4(self, address, cmd, val1, val2, val3, val4)
Definition: roboclaw.py:535
def TurnRightMixed(self, address, val)
Definition: roboclaw.py:678
def BackwardMixed(self, address, val)
Definition: roboclaw.py:675
def SpeedAccelDistanceM2(self, address, accel, speed, distance, buffer)
Definition: roboclaw.py:804
def SetMinVoltageLogicBattery(self, address, val)
Definition: roboclaw.py:747
def WriteNVM(self, address)
Definition: roboclaw.py:992
def ReadError(self, address)
Definition: roboclaw.py:976
def GetDeadBand(self, address)
Definition: roboclaw.py:960
def ReadISpeedM2(self, address)
Definition: roboclaw.py:762
def SpeedM2(self, address, val)
Definition: roboclaw.py:777
def _writeS4(self, address, cmd, val)
Definition: roboclaw.py:430
def SetM1DefaultAccel(self, address, accel)
Definition: roboclaw.py:928
def ReadMainBatteryVoltage(self, address)
Definition: roboclaw.py:741
def ReadM2VelocityPID(self, address)
Definition: roboclaw.py:864
def SetMaxVoltageMainBattery(self, address, val)
Definition: roboclaw.py:657
def DutyM1(self, address, val)
Definition: roboclaw.py:765
def LeftRightMixed(self, address, val)
Definition: roboclaw.py:687
def _writeS22(self, address, cmd, val1, val2)
Definition: roboclaw.py:374
def _write111(self, address, cmd, val1, val2, val3)
Definition: roboclaw.py:331
def SpeedAccelDeccelPositionM2(self, address, accel, speed, deccel, position, buffer)
Definition: roboclaw.py:922
def _write4S441(self, address, cmd, val1, val2, val3, val4)
Definition: roboclaw.py:509
def _write4S4(self, address, cmd, val1, val2)
Definition: roboclaw.py:451


rr_rover_zero_driver
Author(s):
autogenerated on Thu Sep 10 2020 03:38:42