source: rc/puzzlebox_brainstorms_rc.py @ 5

Last change on this file since 5 was 5, checked in by sc, 12 years ago

rc:

  • modified to use configuration module

server:

  • test_drive function added

configuration:

  • initial checkin

client:

  • initial checkin
  • Property svn:executable set to *
File size: 6.9 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Remote Control
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# Portions of this code have been previously
9# released under the GNU Pulic License (GPL) version 2
10# and is Copyright Steven M. Castellotti (2010)
11# For more information please refer to http://www.gnu.org/copyleft/gpl.html
12#
13# Last Update: 2010.01.28
14#
15#####################################################################
16
17import sys, time
18import serial
19import jaraco.nxt
20import jaraco.nxt.messages
21import puzzlebox_brainstorms_configuration as configuration
22
23#####################################################################
24# Globals
25#####################################################################
26
27DEBUG = 2
28
29BLUETOOTH_DEVICE = configuration.BLUETOOTH_DEVICE
30MOTORS_MOUNTED_BACKWARDS = configuration.MOTORS_MOUNTED_BACKWARDS
31MOTOR_PORT_RIGHT = configuration.MOTOR_PORT_RIGHT
32MOTOR_PORT_LEFT = configuration.MOTOR_PORT_LEFT
33
34#####################################################################
35# Classes
36#####################################################################
37
38class puzzlebox_brainstorms_rc:
39       
40        def __init__(self, device=BLUETOOTH_DEVICE, DEBUG=DEBUG):
41               
42                self.DEBUG = DEBUG
43               
44                self.device = device
45               
46                self.connection = None
47       
48       
49        ##################################################################
50       
51        def connect_to_nxt(self, device):
52               
53                connection = jaraco.nxt.Connection(self.device)
54               
55                if self.DEBUG > 1:
56                        battery_voltage = self.get_battery_voltage(connection)
57                        print "Battery voltage:",
58                        print battery_voltage
59               
60               
61                return(connection)
62       
63       
64        ##################################################################
65       
66        def connect_to_port(self, device_port):
67       
68                if isinstance(device_port, basestring):
69                        port = getattr(jaraco.nxt.messages.OutputPort, device_port)
70               
71                assert port in jaraco.nxt.messages.OutputPort.values()
72               
73                return(port)
74       
75       
76        ##################################################################
77       
78        def get_battery_voltage(self, connection):
79               
80                cmd = jaraco.nxt.messages.GetBatteryLevel()
81                connection.send(cmd)
82               
83                response = connection.receive()
84                voltage = response.get_voltage()
85               
86                return(voltage)
87       
88       
89        ##################################################################
90       
91        def cycle_motor(self, connection, motor_port='a'):
92               
93                "Turn the motor one direction, then the other, then stop it"
94               
95                port = self.connect_to_port(motor_port)
96                cmd = jaraco.nxt.messages.SetOutputState(port, \
97                                                         motor_on=True, \
98                                                         set_power=60, \
99                                   run_state=jaraco.nxt.messages.RunState.running)
100                connection.send(cmd)
101               
102                time.sleep(2)
103               
104                cmd = jaraco.nxt.messages.SetOutputState(port, \
105                                                         motor_on=True, \
106                                                         set_power=-60, \
107                                   run_state=jaraco.nxt.messages.RunState.running)
108                connection.send(cmd)
109               
110                time.sleep(2)
111               
112                cmd = jaraco.nxt.messages.SetOutputState(port)
113                connection.send(cmd)
114       
115       
116        ##################################################################
117       
118        def drive(self, connection, left_power, right_power, duration):
119               
120                "Operate both motors, each at certain power, for a certain duration"
121               
122                left_motor = self.connect_to_port(MOTOR_PORT_LEFT)
123                right_motor = self.connect_to_port(MOTOR_PORT_RIGHT)
124               
125               
126                # If motors are mounted on the robot in reverse then all
127                # power settings need to be reversed
128                if MOTORS_MOUNTED_BACKWARDS:
129                        left_power = -left_power
130                        right_power = -right_power
131               
132                # Issue operation settings to both motors
133                cmd = jaraco.nxt.messages.SetOutputState(left_motor, \
134                                                                                                                          motor_on=True, \
135                                                                                                                          set_power=left_power, \
136                                                                 run_state=jaraco.nxt.messages.RunState.running)
137                connection.send(cmd)
138               
139                cmd = jaraco.nxt.messages.SetOutputState(right_motor, \
140                                                                                                                          motor_on=True, \
141                                                                                                                          set_power=right_power, \
142                                                                 run_state=jaraco.nxt.messages.RunState.running)
143                connection.send(cmd)
144               
145                # Continue operating motors while control program pauses
146                time.sleep(duration)
147               
148                # Issue command to stop both motors
149                cmd = jaraco.nxt.messages.SetOutputState(left_motor)
150                connection.send(cmd)
151                cmd = jaraco.nxt.messages.SetOutputState(right_motor)
152                connection.send(cmd)
153       
154       
155        ##################################################################
156       
157        def drive_forward(self, connection, power=80, duration=3):
158               
159                "Drive the robot forward at a certain speed for a certain duration"
160               
161                self.drive(connection, power, power, duration)
162       
163       
164        ##################################################################
165       
166        def turn_in_reverse(self, connection, power=80, duration=3):
167               
168                "Turn the robot clockwise while backing up at a"
169                " certain speed for a certain duration"
170               
171                left_power = -(power/3)
172                right_power = -power
173               
174                self.drive(connection, left_power, right_power, duration)
175       
176       
177        ##################################################################
178       
179        def turn_left(self, connection, power=80, duration=3):
180               
181                "Turn the robot counter-clockwise at a"
182                " certain speed for a certain duration"
183               
184                left_power = -(power/2)
185                right_power = power
186               
187                self.drive(connection, left_power, right_power, duration)
188       
189       
190        ##################################################################
191       
192        def turn_right(self, connection, power=80, duration=3):
193               
194                "Turn the robot counter-clockwise at a"
195                " certain speed for a certain duration"
196               
197                left_power = power
198                right_power = -power
199               
200                self.drive(connection, left_power, right_power, duration)
201       
202       
203        ##################################################################
204       
205        def test_drive(self, connection):
206               
207                #self.cycle_motor(self.connection, motor_port='a')
208               
209                self.drive_forward(self.connection, power=100, duration=3)
210               
211                # half turn in reverse
212                self.turn_in_reverse(self.connection, power=100, duration=2)
213               
214                self.drive_forward(self.connection, power=80, duration=2)
215               
216                # quarter turn left
217                self.turn_left(self.connection, power=80, duration=2)
218               
219                self.drive_forward(self.connection, power=80, duration=1)
220               
221                # half turn right
222                self.turn_right(self.connection, power=80, duration=2)
223               
224                self.drive_forward(self.connection, power=80, duration=1)
225       
226       
227        ##################################################################
228       
229        def run(self):
230               
231                self.connection = self.connect_to_nxt(self.device)
232               
233                self.test_drive(self.connection)
234               
235                self.connection.close()
236
237
238#####################################################################
239# Functions
240#####################################################################
241
242
243#####################################################################
244# Main
245#####################################################################
246
247if __name__ == '__main__':
248       
249        # Collect default settings and command line parameters
250        device = BLUETOOTH_DEVICE
251       
252        for each in sys.argv:
253               
254                if each.startswith("--device="):
255                        device = each[ len("--device="): ]
256       
257       
258        rc = puzzlebox_brainstorms_rc(device=device, DEBUG=DEBUG)
259       
260        rc.run()
261
Note: See TracBrowser for help on using the repository browser.