måndag 25 februari 2008

Om omborddatorn

För de intresserade finns här att läsa den programvara som båten kör på omborddatorn. Koden är bara ett utkast, den går att optimera avsevärt. Istället för signaler från en GPS-mottagare använder sig båten än så länge av ett antal förinställda kommandon som talar om roderposition och hastighet. Vid en given signal från fjärrkontrollen tar omborddatorn över och utför kommandona i sekvens. När den gått igenom dessa lämnar den tillbaka kontrollen till fjärrkontrollen. Är man inte nöjd med hur båten beter sig kan man avbryta den förprogrammerade rutten, manuellt köra in till stranden, och där uppdatera instruktionerna genom att koppla in en laptop till seriellporten i båtens förarkabin.

' {$STAMP BS2e}
' {$PBASIC 2.5}

roder VAR Word
roder2 VAR Word
roder3 VAR Word
fetcha VAR Word
motor VAR Word
motor2 VAR Word
rekna VAR Word
inte VAR Word
ful VAR Word
tid VAR Word
servopos VAR Word
motorpos VAR Word

DATA 1, 3, 1, 50, 3, 50, 50

manual:
HIGH 3
LOW 4

DO
roder3=roder2
roder2 = (roder - 530) / 10
motor2 = (motor - 530) / 10
IF motor2 < 1 THEN motor2 = 1
IF roder2 > 100 THEN roder2 = 1
PULSIN 0, 1, roder
PULSIN 2, 1, motor
PULSOUT 14, roder
PULSOUT 15, motor
IF motor2 > 0 AND motor2 <> (roder3-5) THEN rekna = rekna +1
IF roder2 > (roder3+5) OR roder2 < (roder3-5) THEN rekna = 0
IF motor > 600 THEN rekna = 0
IF rekna > 100 THEN
HIGH 4
HIGH 3
PULSIN 1, 1, fetcha
IF fetcha > 850 THEN
rekna = 0
GOTO stampen
ENDIF
ENDIF
IF rekna < 100 THEN
HIGH 3
LOW 4
ENDIF

LOOP

stampen:
HIGH 4
LOW 3
DO
FOR inte = 1 TO 500 STEP 3
READ inte, tid
READ inte+1, servopos
READ inte+2, motorpos
IF tid = 0 AND servopos = 0 AND motorpos = 0 THEN
tid = 1
servopos = 20
motorpos = 0
GOTO manual
ENDIF
GOSUB skicka
NEXT

LOOP

skicka:
FOR rekna = 0 TO tid
FOR ful = 1 TO 50
PULSOUT 14, (servopos*10)+530
PULSOUT 15, (motorpos*10)+530
PAUSE 20
NEXT
GOSUB decartes
IF rekna = tid THEN RETURN
NEXT
RETURN

decartes:
roder3=roder2
motor2 = (motor - 530) / 10
roder2 = (roder - 530) / 10
IF motor2 < 1 THEN motor2 = 1
IF roder2 > 100 THEN roder2 = 1
PULSIN 0, 1, roder
PULSIN 2, 1, motor
IF motor2 > 500 THEN motor2 = 1
IF motor2 > 5 THEN GOTO manual
IF roder > 100 THEN
IF roder3>(roder2+5) OR roder3<(roder2-5) THEN GOTO manual
ENDIF

RETURN

Inga kommentarer: