Skip to content

Commit bf8a6ab

Browse files
committed
First commit of servo_motor_reset_degree() and servo_motor_rotate_by_degree() API
1 parent bc86e96 commit bf8a6ab

File tree

3 files changed

+136
-24
lines changed

3 files changed

+136
-24
lines changed

neopia/neosoco.py

Lines changed: 122 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,46 @@ class Neosoco(Robot):
243243
'0': 0
244244
}
245245

246+
_SERVO_MOTOR_DEGREE_CVT = {
247+
'180': 180,
248+
'175': 175,
249+
'170': 170,
250+
'165': 165,
251+
'160': 160,
252+
'155': 155,
253+
'150': 150,
254+
'145': 145,
255+
'140': 140,
256+
'135': 135,
257+
'130': 130,
258+
'125': 125,
259+
'120': 120,
260+
'115': 115,
261+
'110': 110,
262+
'105': 105,
263+
'100': 100,
264+
'95': 95,
265+
'90': 90,
266+
'85': 85,
267+
'80': 80,
268+
'75': 75,
269+
'70': 70,
270+
'65': 65,
271+
'60': 60,
272+
'55': 55,
273+
'50': 50,
274+
'45': 45,
275+
'40': 40,
276+
'35': 35,
277+
'30': 30,
278+
'25': 25,
279+
'20': 20,
280+
'15': 15,
281+
'10': 10,
282+
'5': 5,
283+
'0': 0
284+
}
285+
246286
_MOTOR_DIR = {
247287
'forward': 16,
248288
'backward': 32
@@ -252,6 +292,14 @@ class Neosoco(Robot):
252292
'forward': 192,
253293
'backward': 208
254294
}
295+
296+
_SERVO_MOTOR_DIR_FOR_DEG = {
297+
'forward': 188,
298+
'backward': 189
299+
}
300+
301+
_SERVO_MOTOR_STOP = 254
302+
_SERVO_MOTOR_RESET_DEG = 186
255303

256304
_robots = {}
257305

@@ -522,6 +570,20 @@ def motor_rotate(self, motor='both', direction='forward', speed='100'):
522570
else:
523571
raise TypeError
524572

573+
def _write_to_output_port(self, port, out_val):
574+
if port.lower() == 'out1':
575+
self.write(Neosoco.OUTPUT_1, out_val)
576+
elif port.lower() == 'out2':
577+
self.write(Neosoco.OUTPUT_2, out_val)
578+
elif port.lower() == 'out3':
579+
self.write(Neosoco.OUTPUT_3, out_val)
580+
elif port.lower() == 'all':
581+
self.write(Neosoco.OUTPUT_1, out_val)
582+
self.write(Neosoco.OUTPUT_2, out_val)
583+
self.write(Neosoco.OUTPUT_3, out_val)
584+
else:
585+
raise ValueError('Wrong value of out port')
586+
525587
def servo_motor_rotate(self, port='out1', direction='forward', speed='100'):
526588
if isinstance(port, str) and isinstance(direction, str) and isinstance(speed, str):
527589
if speed == 'in1' or speed == 'in2' or speed == 'in3' :
@@ -539,24 +601,69 @@ def servo_motor_rotate(self, port='out1', direction='forward', speed='100'):
539601
else:
540602
raise ValueError('Wrong value of direction')
541603

542-
outValue = direction + speed
543-
if outValue == direction:
544-
outValue = 254
604+
out_val = direction + speed
605+
if out_val == direction: # Speed is 0
606+
out_val = self._SERVO_MOTOR_STOP
607+
else:
608+
out_val = out_val - 1
609+
610+
self._write_to_output_port(port, out_val)
611+
else:
612+
raise TypeError
613+
614+
def servo_motor_reset_degree(self, port='out1'):
615+
if isinstance(port, str):
616+
self._write_to_output_port(port, self._SERVO_MOTOR_RESET_DEG)
617+
Runner.wait(100)
618+
self._write_to_output_port(port, 1) # Set where the motor is to 1 degree
619+
Runner.wait(100)
620+
else:
621+
raise TypeError
622+
623+
def servo_motor_rotate_by_degree(self, port='out1', direction='forward', speed='100', degree='90'):
624+
if isinstance(port, str) and isinstance(direction, str) and \
625+
isinstance(speed, str) and isinstance(degree, str):
626+
if direction.lower() =='forward':
627+
direction = self._SERVO_MOTOR_DIR_FOR_DEG['forward']
628+
elif direction.lower() =='backward':
629+
direction = self._SERVO_MOTOR_DIR_FOR_DEG['backward']
630+
else:
631+
raise ValueError('Wrong value of direction')
632+
633+
if speed.lower() =='in1':
634+
speed = self.read(Neosoco.INPUT_1)
635+
elif speed.lower() =='in2':
636+
speed = self.read(Neosoco.INPUT_2)
637+
elif port.lower() =='in3':
638+
speed = self.read(Neosoco.INPUT_3)
639+
elif speed in self._SERVO_MOTOR_PERCENT_CVT.keys():
640+
speed = self._SERVO_MOTOR_PERCENT_CVT[speed]
545641
else:
546-
outValue = outValue - 1
642+
raise ValueError('Wrong value of speed')
643+
speed = max(speed, 0)
644+
speed = min(speed, 100)
645+
speed = math.ceil(speed / 10) + 240 # range of speed is 240 ~ 250
547646

548-
if port.lower() == 'out1':
549-
self.write(Neosoco.OUTPUT_1, outValue)
550-
elif port.lower() == 'out2':
551-
self.write(Neosoco.OUTPUT_2, outValue)
552-
elif port.lower() == 'out3':
553-
self.write(Neosoco.OUTPUT_3, outValue)
554-
elif port.lower() == 'all':
555-
self.write(Neosoco.OUTPUT_1, outValue)
556-
self.write(Neosoco.OUTPUT_2, outValue)
557-
self.write(Neosoco.OUTPUT_3, outValue)
647+
if degree.lower() =='in1':
648+
degree = self.read(Neosoco.INPUT_1)
649+
elif port.lower() =='in2':
650+
degree = self.read(Neosoco.INPUT_2)
651+
elif port.lower() =='in3':
652+
degree = self.read(Neosoco.INPUT_3)
653+
elif degree in self._SERVO_MOTOR_DEGREE_CVT.keys():
654+
degree = self._SERVO_MOTOR_DEGREE_CVT[degree]
558655
else:
559-
raise ValueError('Wrong value of out port')
656+
raise ValueError('Wrong value of degree')
657+
degree = max(degree, 0)
658+
degree = min(degree, 180) # max of degree is 180
659+
degree = degree + 1
660+
661+
self._write_to_output_port(port, direction)
662+
Runner.wait(100)
663+
self._write_to_output_port(port, speed)
664+
Runner.wait(100)
665+
self._write_to_output_port(port, degree)
666+
Runner.wait(100)
560667
else:
561668
raise TypeError
562669

neopia/neosoco_neobot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import threading
2121

2222
from neopia.runner import Runner
23-
from neopia.util import Util
2423
from neopia.model import DeviceType
2524
from neopia.model import DataType
2625
from neopia.model import Neobot
@@ -206,6 +205,7 @@ def _encode_motoring_packet(self, address):
206205
return result
207206

208207
def _decode_sensory_packet(self, packet):
208+
# packet[0]~[1] is StartBytes
209209
self._input_1_device._put(packet[2])
210210
self._input_2_device._put(packet[3])
211211
self._input_3_device._put(packet[4])

test.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,16 @@
7979

8080
# Servo Motor
8181
# case 11) Rotate servo motor forth and back with speed 50% during 5s and stop
82-
n.servo_motor_rotate('out2', 'forward', '50')
83-
wait(2000)
84-
n.servo_motor_rotate('out2', 'forward', '0')
85-
wait(1000)
86-
n.servo_motor_rotate('out2', 'backward', '50')
87-
wait(2000)
88-
n.servo_motor_rotate('out2', 'forward', '0')
89-
wait(1000)
82+
# n.servo_motor_rotate('out2', 'forward', '50')
83+
# wait(2000)
84+
# n.servo_motor_rotate('out2', 'forward', '0')
85+
# wait(1000)
86+
# n.servo_motor_rotate('out2', 'backward', '50')
87+
# wait(2000)
88+
# n.servo_motor_rotate('out2', 'forward', '0')
89+
# wait(1000)
90+
91+
# case 12) Rotate servo motor forward by 120 degrees at 50% speed within 3 seconds
92+
n.servo_motor_reset_degree('out1')
93+
n.servo_motor_rotate_by_degree('out1', 'forward', '50', '120')
94+
wait(3000)

0 commit comments

Comments
 (0)