diff options
5 files changed, 638 insertions, 0 deletions
diff --git a/RetoolingForOpenSprints/NewClock/NewClock/NewClock.ino b/RetoolingForOpenSprints/NewClock/NewClock/NewClock.ino new file mode 100644 index 0000000..bb44efe --- /dev/null +++ b/RetoolingForOpenSprints/NewClock/NewClock/NewClock.ino @@ -0,0 +1,85 @@ + +/* + * ##### requires modified + * + * 5.9222222 steps per degree. + * too much error. + * + */ + +#include <Stepper.h> +#define MIN_MILLIS_PER_STEP 3 +#define STEPPER_STEPS 200 +#define STEPS_PER_REVOLUTION 2132 // for your motor +#define INBUFFERLENGTH 100 +char inbuffer[INBUFFERLENGTH]; +int bufferIndex; +int yellowGoal=0; +int blueGoal=0; +int yellowPosition=0; +int bluePosition=0; +int stepCount = 0; // number of steps the motor has taken +long int lastStepMillis; + +Stepper blue(STEPPER_STEPS, 8,9,10,11,1); +Stepper yellow(STEPPER_STEPS, 2,3,4,5,1); + +void setup() { + // initialize the serial port: + Serial.begin(115200); +} + +void loop() { + int target; + while (Serial.available()) { + // get the new byte: + char inChar = (char)Serial.read(); + // add it to the inputString: + if (bufferIndex<INBUFFERLENGTH) + inbuffer[bufferIndex++]=inChar; + if (inChar == '\n') { + inbuffer[bufferIndex]=0; + if ((inbuffer[0]=='d') && bufferIndex>3) { + target=atoi(inbuffer+3); + if (target>STEPS_PER_REVOLUTION)target=STEPS_PER_REVOLUTION; + if (inbuffer[1]=='1') { + blueGoal=target;//analogWrite(MOTOR1PWM,bike1speed); + Serial.println(inbuffer+3); + Serial.print("blueGoal="); Serial.println(blueGoal); + Serial.print("bluePosition="); Serial.println(bluePosition); + } else { + yellowGoal=target;//analogWrite(MOTOR2PWM,bike1speed); + } + } else if (inbuffer[0]=='v') { + Serial.println("RaceClock 0.1"); + Serial.flush(); + } else if (inbuffer[0]=='s') { + blueGoal=yellowGoal=STEPS_PER_REVOLUTION; + } + + bufferIndex=0; //reset input + + } + } + if ((millis()-lastStepMillis)>MIN_MILLIS_PER_STEP){ + if ((blueGoal>bluePosition) && (bluePosition<=STEPS_PER_REVOLUTION)){ + blue.step(-1); + bluePosition++; + } + + if ((yellowGoal>yellowPosition) && (yellowPosition<=STEPS_PER_REVOLUTION)) { + yellow.step(-1); + yellowPosition++; + } + lastStepMillis=millis(); + } + if ((bluePosition==STEPS_PER_REVOLUTION)&&(blueGoal==bluePosition)){ + blueGoal=bluePosition=0; + } + if ((yellowPosition==STEPS_PER_REVOLUTION)&&(yellowGoal==yellowPosition)){ + yellowGoal=yellowPosition=0; + } + +} + + diff --git a/RetoolingForOpenSprints/RaceInABox2/RaceInABox2/RaceInABox2.ino b/RetoolingForOpenSprints/RaceInABox2/RaceInABox2/RaceInABox2.ino new file mode 100644 index 0000000..06a3251 --- /dev/null +++ b/RetoolingForOpenSprints/RaceInABox2/RaceInABox2/RaceInABox2.ino @@ -0,0 +1,61 @@ +/* + RaceInABox + + */ +#define MOTOR1DIR 2 +#define MOTOR2DIR 4 +#define MOTOR1PWM 3 +#define MOTOR2PWM 5 +#define MOTOR1CLOCKWISE digitalWrite(MOTOR1DIR, HIGH); +#define MOTOR1COUNTERCLOCKWISE digitalWrite(MOTOR1DIR, LOW); +#define MOTOR2CLOCKWISE digitalWrite(MOTOR2DIR, HIGH); +#define MOTOR2COUNTERCLOCKWISE digitalWrite(MOTOR2DIR, LOW); +#define INBUFFERLENGTH 32 +char inbuffer[INBUFFERLENGTH]; + +void setup() { + Serial.begin(115200); + pinMode(MOTOR1DIR, OUTPUT); + pinMode(MOTOR2DIR, OUTPUT); + pinMode(MOTOR1PWM, OUTPUT); + pinMode(MOTOR2PWM, OUTPUT); + analogWrite(MOTOR1PWM, 0); + analogWrite(MOTOR2PWM, 0); + + MOTOR1CLOCKWISE; + MOTOR2CLOCKWISE; +} +bool isClockwise = true; +uint8_t bufferIndex=0; +uint8_t bike1speed; + +void loop() { + while (Serial.available()) { + // get the new byte: + char inChar = (char)Serial.read(); + // add it to the inputString: + if (bufferIndex<INBUFFERLENGTH) + inbuffer[bufferIndex++]=inChar; + // if the incoming character is a newline, set a flag + // so the main loop can do something about it: + if (inChar == '\n') { + inbuffer[bufferIndex]=0; + if ((inbuffer[0]=='b') && bufferIndex>3) { + bike1speed=(uint8_t) atoi(inbuffer+3); + if (inbuffer[1]=='1') { + analogWrite(MOTOR1PWM,bike1speed); + } else { + analogWrite(MOTOR2PWM,bike1speed); + } + } else if (inbuffer[0]=='v') { + Serial.println("RaceInABox 0.1"); + Serial.flush(); + } + + bufferIndex=0; //reset input + + } +} +} + + diff --git a/RetoolingForOpenSprints/basic_msg/basic_msg/basic_msg.ino b/RetoolingForOpenSprints/basic_msg/basic_msg/basic_msg.ino new file mode 100644 index 0000000..55d52c3 --- /dev/null +++ b/RetoolingForOpenSprints/basic_msg/basic_msg/basic_msg.ino @@ -0,0 +1,229 @@ +/* + * Arduino wiring: + * + * Digital pin Connected to + * ----------- ------------ + * 2 Sensor 0 + * 3 Sensor 1 + * 4 Sensor 2 + * 5 Sensor 3 + * + * 9 Racer0 Start LED anode, Stop LED cathode + * 10 Racer1 Start LED anode, Stop LED cathode + * 11 Racer2 Start LED anode, Stop LED cathode + * 12 Racer3 Start LED anode, Stop LED cathode + * + */ + +int statusLEDPin = 13; +long statusBlinkInterval = 250; +int lastStatusLEDValue = LOW; +long previousStatusBlinkMillis = 0; + +boolean raceStarted = false; +boolean raceStarting = false; +boolean mockMode = false; +unsigned long raceStartMillis; +unsigned long currentTimeMillis; + +int val = 0; + +int racer0GoLedPin = 9; +int racer1GoLedPin = 10; +int racer2GoLedPin = 11; +int racer3GoLedPin = 12; + +int sensorPins[4] = {2,3,4,5}; +int previoussensorValues[4] = {HIGH,HIGH,HIGH,HIGH}; +int values[4] = {0,0,0,0}; +unsigned long racerTicks[4] = {0,0,0,0}; +unsigned long racerFinishTimeMillis[4]; + +unsigned long lastCountDownMillis; +int lastCountDown; + +unsigned int charBuff[8]; +unsigned int charBuffLen = 0; +boolean isReceivingRaceLength = false; + +int raceLengthTicks = 20; +int previousFakeTickMillis = 0; + +int updateInterval = 250; +unsigned long lastUpdateMillis = 0; + +void setup() { + Serial.begin(115200); + pinMode(statusLEDPin, OUTPUT); + pinMode(racer0GoLedPin, OUTPUT); + pinMode(racer1GoLedPin, OUTPUT); + pinMode(racer2GoLedPin, OUTPUT); + pinMode(racer3GoLedPin, OUTPUT); + digitalWrite(racer0GoLedPin, LOW); + digitalWrite(racer1GoLedPin, LOW); + digitalWrite(racer2GoLedPin, LOW); + digitalWrite(racer3GoLedPin, LOW); + for(int i=0; i<=3; i++) + { + pinMode(sensorPins[i], INPUT); + digitalWrite(sensorPins[i], HIGH); + } + +} + +void blinkLED() { + if (millis() - previousStatusBlinkMillis > statusBlinkInterval) { + previousStatusBlinkMillis = millis(); + + lastStatusLEDValue = !lastStatusLEDValue; + + digitalWrite(statusLEDPin, lastStatusLEDValue); + } + +} + +void raceStart() { + raceStartMillis = millis(); +} + + +void checkSerial(){ + if(Serial.available()) { + val = Serial.read(); + if(isReceivingRaceLength) { + if(val != '\r') { + charBuff[charBuffLen] = val; + charBuffLen++; + } + else if(charBuffLen==2) { + // received all the parts of the distance. time to process the value we received. + // The maximum for 2 chars would be 65 535 ticks. + // For a 0.25m circumference roller, that would be 16384 meters = 10.1805456 miles. + raceLengthTicks = charBuff[1] * 256 + charBuff[0]; + isReceivingRaceLength = false; + Serial.print("OK "); + Serial.println(raceLengthTicks,DEC); + } + else { + Serial.println("ERROR receiving tick lengths"); + } + } + else { + if(val == 'l') { + charBuffLen = 0; + isReceivingRaceLength = true; + } + if(val == 'v') { + Serial.print("basic-1"); + } + if(val == 'g') { + for(int i=0; i<=3; i++) + { + racerTicks[i] = 0; + racerFinishTimeMillis[i] = 256*0; + } + + raceStarting = true; + raceStarted = false; + lastCountDown = 4; + lastCountDownMillis = millis(); + } + + else if(val == 'm') { + // toggle mock mode + mockMode = !mockMode; + } + + if(val == 's') { + raceStarted = false; + + digitalWrite(racer0GoLedPin,LOW); + digitalWrite(racer1GoLedPin,LOW); + digitalWrite(racer2GoLedPin,LOW); + digitalWrite(racer3GoLedPin,LOW); + } + } + } +} + +void printStatusUpdate() { + if(currentTimeMillis - lastUpdateMillis > updateInterval) { + lastUpdateMillis = currentTimeMillis; + for(int i=0; i<=3; i++) + { + Serial.print(i); + Serial.print(": "); + Serial.println(racerTicks[i], DEC); + } + Serial.print("t: "); + Serial.println(currentTimeMillis, DEC); + } +} + +void loop() { + blinkLED(); + + checkSerial(); + + + if (raceStarting) { + if((millis() - lastCountDownMillis) > 1000){ + lastCountDown -= 1; + lastCountDownMillis = millis(); + } + if(lastCountDown == 0) { + raceStart(); + raceStarting = false; + raceStarted = true; + + digitalWrite(racer0GoLedPin,HIGH); + digitalWrite(racer1GoLedPin,HIGH); + digitalWrite(racer2GoLedPin,HIGH); + digitalWrite(racer3GoLedPin,HIGH); + } + } + if (raceStarted) { + currentTimeMillis = millis() - raceStartMillis; + + for(int i=0; i<=3; i++) + { + if(!mockMode) { + values[i] = digitalRead(sensorPins[i]); + if(values[i] == HIGH && previoussensorValues[i] == LOW){ + racerTicks[i]++; + if(racerFinishTimeMillis[i] == 0 && racerTicks[i] >= raceLengthTicks) { + racerFinishTimeMillis[i] = currentTimeMillis; + Serial.print(i); + Serial.print("f: "); + Serial.println(racerFinishTimeMillis[i], DEC); + digitalWrite(racer0GoLedPin+i,LOW); + } + } + previoussensorValues[i] = values[i]; + } + else { + if(currentTimeMillis - lastUpdateMillis > updateInterval) { + racerTicks[i]+=(i+1); + if(racerFinishTimeMillis[i] == 0 && racerTicks[i] >= raceLengthTicks) { + racerFinishTimeMillis[i] = currentTimeMillis; + Serial.print(i); + Serial.print("f: "); + Serial.println(racerFinishTimeMillis[i], DEC); + digitalWrite(racer0GoLedPin+i,LOW); + } + } + } + } + } + + + if(racerFinishTimeMillis[0] != 0 && racerFinishTimeMillis[1] != 0 && racerFinishTimeMillis[2] != 0 && racerFinishTimeMillis[3] != 0){ + if(raceStarted) { + raceStarted = false; + printStatusUpdate(); + } + } else { + printStatusUpdate(); + } +} + diff --git a/RetoolingForOpenSprints/raceinabox/netsuck.py b/RetoolingForOpenSprints/raceinabox/netsuck.py new file mode 100644 index 0000000..98af13b --- /dev/null +++ b/RetoolingForOpenSprints/raceinabox/netsuck.py @@ -0,0 +1,77 @@ +"""-------------------------------------------------------------------------netsuck.py + DESCRIPTION: This code intercepts both sides of opensprints/goldsprintsfx + "conversation" to control a visual indication of progress using something + like a phsical clock or a race tree. + This makes it possible to not have a projector that costs more than your rollers. + It also makes it possible to do outdoor or mobile events. + + COPYRIGHT: (c) 2013 Donald Delmar Davis, Suspect Devices, All Rights Reserved. + This is free software released under modified BSD (details included in source). + + TECHNICAL: This is a basic combination of the client and server software from the + python in a nutshell book. It makes a lot of assumtions and should do a better + job of recovering when the pile of flash or the serial proxy crashes (which + happens). + It creates a server on 5331 (the only port gold sprints checks) and expects + to listen to serproxy on 5330 +""" +import socket +import re +isocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) +osocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) +isocket.connect(('localhost',5330)) +#isocket.setblocking(0) +isocket.settimeout(0.2) +print "Connected to serproxy" +osocket.bind(('',5331)) +osocket.listen(1) + +try: + while True: + connection,address=osocket.accept() + if not connection: break + print "Connected From", address + #connection.setblocking(0) + connection.settimeout(0.2) + while True: + try: + receivedData = connection.recv(8192) + except socket.error: + receivedData=None + if receivedData is not None: + #print ">"+re.escape(str(receivedData))+">"+str(len(receivedData)) + isocket.sendall(receivedData) + for chunk in receivedData.split('\x00'): + if len(chunk)>0 and chunk[0] == 's': + print "(RE)SET RACE !!!" + if len(receivedData)==0: + print "ISSUE WITH CLIENT" + + try: + sentData = isocket.recv(8192) + except socket.error: + sentData=None + if sentData is not None: + #print "<"+re.escape(str(sentData))+"<"+str(len(sentData)) + connection.sendall(sentData) + for chunk in sentData.split('\x00'): + #if len(chunk.rstrip('\r')): + # print "<",re.escape(chunk),len(chunk) + if len(chunk) > 4 and chunk[0]=='0' : + done1=int((float(chunk[3:])/1566.0) * 100.00) + print "Bike # 1 is ", str(done1), "percent done" + if len(chunk) > 4 and chunk[0]=='1' : + done1=int((float(chunk[3:])/1566.0) * 100.00) + print "Bike # 2 is ", str(done1), "percent done" + if len(sentData)==0: + print "ISSUE WITH SERPROXY" + try: + isocket.sendall("\rv\r\x00") + except socket.error: + isocket.close() + isocket.connect(('localhost',5330)) + break +finally: + connection.close() + osocket.close() + isocket.close() diff --git a/RetoolingForOpenSprints/raceinabox/raceInABox.py b/RetoolingForOpenSprints/raceinabox/raceInABox.py new file mode 100755 index 0000000..1c97694 --- /dev/null +++ b/RetoolingForOpenSprints/raceinabox/raceInABox.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python + +import wx +import wx.lib.buttons + +[wxID_FRAME1, wxID_FRAME1BLAH1, wxID_FRAME1BLAH2, wxID_FRAME1RACER1, + wxID_FRAME1RACER1SPEED, wxID_FRAME1RACER1STATUS, wxID_FRAME1RACER1STATUS, + wxID_FRAME1RACER2, wxID_FRAME1SLIDER2, wxID_FRAME1STARTBUTTON, + wxID_FRAME1STOPBUTTON, +] = [wx.NewId() for _init_ctrls in range(11)] + +class Frame1(wx.Frame): + + #def create(parent): + # return Frame1(parent) + + + def _init_sizers(self): + # generated method, don't edit + self.boxSizer0 = wx.BoxSizer(orient=wx.VERTICAL) + self.boxSizer1 = wx.BoxSizer(orient=wx.HORIZONTAL) + self.boxSizer0.AddSizer(self.boxSizer1) + + self.boxSizer2 = wx.BoxSizer(orient=wx.VERTICAL) + self.boxSizer1.AddSizer(self.boxSizer2,border=1,flag=wx.EXPAND) + + self.boxSizer2.AddWindow(self.racer1, 0, border=0, flag=0) + self.boxSizer2.AddWindow(self.racer1Speed, 0, border=0, flag=0) + self.boxSizer2.AddWindow(self.racer1Status, 0, border=0, flag=0) + self.boxSizer3 = wx.BoxSizer(orient=wx.VERTICAL) + self.boxSizer1.AddSizer(self.boxSizer3) + self.boxSizer3.AddWindow(self.racer2, 0, border=0, flag=0) + self.boxSizer3.AddWindow(self.racer2Speed, 0, border=0, flag=0) + self.boxSizer3.AddWindow(self.racer2Status, 0, border=0, flag=0) + self.boxSizer4 = wx.BoxSizer(orient=wx.HORIZONTAL) + self.boxSizer0.AddSizer(self.boxSizer4) + self.boxSizer4.AddWindow(self.startButton, 0, border=10, flag=wx.EXPAND|wx.ALL) + self.boxSizer4.AddWindow(self.stopButton, 0, border=10, flag=wx.EXPAND|wx.ALL) + self.SetAutoLayout(True) + self.SetSizer(self.boxSizer0) + self.Layout() + self.Fit() + + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=None, + pos=wx.Point(535, 23), size=wx.Size(960, 527), + style=wx.DEFAULT_FRAME_STYLE, title='Frame1') + self.panel=wx.Panel(self) + self.SetClientSize(wx.Size(960, 505)) + + self.racer1 = wx.StaticText(id=wxID_FRAME1RACER1, label=u'racer #1', + name=u'racer1', parent=self, pos=wx.Point(0, 0), size=wx.Size(57, + 17), style=0) + self.racer1.SetLabelText(u'racer #1') + + self.racer2 = wx.StaticText(id=wxID_FRAME1RACER2, label=u'racer #2', + name=u'racer2', parent=self, pos=wx.Point(0, 17), size=wx.Size(75, + 17), style=0) + + self.racer1Speed = wx.Slider(id=wxID_FRAME1RACER1SPEED, maxValue=100, + minValue=0, name=u'racer1Speed', parent=self, pos=wx.Point(0, 34), + size=wx.Size(21, 150), style=wx.SL_HORIZONTAL, value=0) + self.racer1Speed.SetLabel(u'') + self.racer1Speed.Bind(wx.EVT_SCROLL_THUMBRELEASE, + self.OnRacer1SpeedScrollThumbrelease) + self.racer1Speed.Bind(wx.EVT_SCROLL_PAGEDOWN, + self.OnRacer1SpeedScrollPagedown) + self.racer1Speed.Bind(wx.EVT_SCROLL_PAGEUP, + self.OnRacer1SpeedScrollPageup) + self.racer1Speed.Bind(wx.EVT_SCROLL_THUMBTRACK, + self.OnRacer1SpeedScrollThumbtrack) + self.racer1Speed.Bind(wx.EVT_KEY_UP, self.OnRacer1SpeedKeyUp) + self.racer1Speed.Bind(wx.EVT_KEY_DOWN, self.OnRacer1SpeedKeyDown) + + self.racer2Speed = wx.Slider(id=wxID_FRAME1SLIDER2, maxValue=100, + minValue=0, name='racer2Speed', parent=self, pos=wx.Point(0, 184), + size=wx.Size(21, 150), style=wx.SL_HORIZONTAL, value=14) + self.racer2Speed.SetLabel(u'') + self.racer2Speed.Bind(wx.EVT_SCROLL_THUMBRELEASE, + self.OnRacer2speedScrollThumbrelease) + self.racer2Speed.Bind(wx.EVT_SCROLL_THUMBTRACK, + self.OnRacer2speedScrollThumbtrack) + self.racer2Speed.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnRacer2speedScrollPagedown) + self.racer2Speed.Bind(wx.EVT_SCROLL_PAGEUP, self.OnRacer2speedScrollPageup) + self.racer2Speed.Bind(wx.EVT_KEY_UP, self.OnRacer2speedKeyUp) + self.racer2Speed.Bind(wx.EVT_KEY_DOWN, self.OnRacer2speedKeyDown) + + self.racer1Status = wx.Gauge(id=wxID_FRAME1RACER1STATUS, + name=u'racer1Status', parent=self, pos=wx.Point(0, 334), + range=100, size=wx.Size(200, 16), style=wx.GA_HORIZONTAL) + self.racer1Status.SetInitialSize(wx.Size(200, 16)) + self.racer1Status.SetToolTipString(u'racer1Status') + + self.racer2Status = wx.Gauge(id=wxID_FRAME1RACER1STATUS, + name=u'racer2Status', parent=self, pos=wx.Point(0, 350), + range=100, size=wx.Size(200, 16), style=wx.GA_HORIZONTAL) + self.racer2Status.SetInitialSize(wx.Size(200, 16)) + self.racer2Status.SetToolTipString(u'racer2Status') + + self.startButton = wx.lib.buttons.GenButton(id=wxID_FRAME1STARTBUTTON, + label=u'start', name=u'startButton', parent=self, pos=wx.Point(0, + 366), size=wx.Size(86, 27), style=0) + self.startButton.SetToolTipString(u'Start Button') + + self.stopButton = wx.lib.buttons.GenButton(id=wxID_FRAME1STOPBUTTON, + label=u'stop', name=u'stopButton', parent=self, pos=wx.Point(0, + 393), size=wx.Size(86, 27), style=0) + self.stopButton.SetLabelText(u'stopButton') + self.stopButton.SetHelpText(u'stop it!') + self.stopButton.SetToolTipString(u'Stop Button') + self.stopButton.Bind(wx.EVT_BUTTON, self.OnStopButtonButton, + id=wxID_FRAME1STOPBUTTON) + + self.blah1 = wx.StaticText(id=wxID_FRAME1BLAH1, label=u'blah', + name=u'blah1', parent=self, pos=wx.Point(0, 0), size=wx.Size(57, + 17), style=0) + self.blah1.SetLabelText(u'racer #1') + + self.blah2 = wx.StaticText(id=wxID_FRAME1BLAH2, label=u'blah', + name=u'blah2', parent=self, pos=wx.Point(0, 0), size=wx.Size(57, + 17), style=0) + self.blah2.SetLabelText(u'racer #1') + + self._init_sizers() + + def __init__(self, parent): + self._init_ctrls(parent) + + + def OnRacer1SpeedScrollThumbrelease(self, event): + + event.Skip() + + def OnRacer1SpeedScrollPagedown(self, event): + event.Skip() + + def OnRacer1SpeedScrollPageup(self, event): + event.Skip() + + def OnRacer1SpeedScrollThumbtrack(self, event): + event.Skip() + + def OnRacer1SpeedKeyUp(self, event): + event.Skip() + + def OnRacer1SpeedKeyDown(self, event): + event.Skip() + + def OnRacer2speedScrollThumbrelease(self, event): + event.Skip() + + def OnRacer2speedScrollThumbtrack(self, event): + event.Skip() + + def OnRacer2speedScrollPagedown(self, event): + event.Skip() + + def OnRacer2speedScrollPageup(self, event): + event.Skip() + + def OnRacer2speedKeyUp(self, event): + event.Skip() + + def OnRacer2speedKeyDown(self, event): + event.Skip() + + def OnStopButtonButton(self, event): + event.Skip() + +class MyApp(wx.App): + def OnInit(self): + self.main = Frame1(parent=self) + self.main.Show() + self.SetTopWindow(self.main) + return True + +def main(): + global application + application = MyApp(0) + application.MainLoop() + +if __name__ == '__main__': + main() + |
