BasicMicroUK - Forums

www.basicmicro.co.uk
It is currently Sun Apr 22, 2018 5:12 pm

All times are UTC [ DST ]




Post new topic Reply to topic  [ 8 posts ] 
Author Message
 Post subject: Programming BAP28 with Powerpod
PostPosted: Wed Jun 08, 2011 6:20 pm 
Offline
New User

Joined: Wed Jun 08, 2011 5:00 pm
Posts: 3
I am having difficulty programming my Basic Atom PRO 28 using Basic Studio and Powerpod. Apparently Powerpod does not work with Basic Micro Studio. So can anyone give me any suggestions


Top
 Profile  
 
 Post subject: Re: Programming BAP28 with Powerpod
PostPosted: Wed Jun 08, 2011 6:34 pm 
Offline
Site Admin
User avatar

Joined: Thu Mar 01, 2001 7:00 pm
Posts: 1316
Location: Temecula, CA
PowerPod creates a basic file. Post the file it creates and I can show you the differences. PowerPod hasn't been updated in several years, but you can update the files it uses with the changes your self once I've show you. Then you'll be able to use power pod to create the basic files without having to make the changes everytime.

_________________
Tech Support
Basic Micro - Robotic Technology Evolved


Top
 Profile  
 
 Post subject: Re: Programming BAP28 with Powerpod
PostPosted: Wed Jun 08, 2011 6:38 pm 
Offline
Master

Joined: Tue Nov 21, 2006 5:34 pm
Posts: 662
Hi I am KurtE on Lynxmotion forums...

As I said up on that forum, I hooked up my Bap28 and downloaded the current version of powerpod, used Studio to program the Bap28 and it worked. I did change which IO pin I used to talk between the BAP28 and the SSC-32, but that was not required. I could have simply moved the wire down.

So if it is not working on your Hex, would help to see pictures of the actual hookup, that shows which IO pins are connected where. Likewise which jumpers are in place. As I mention up there this morning the values shown for the PS2 test looked like it was valid. If you move the jumpers or the like do the values change?

Earlier you mentioned that when you press keys you hear beeps, so it sounds like that maybe the PS2 part is working. So next thing you need to do is to verify your communication with the SSC-32. That is you have a wire properly connected between the BB2 and the SSC-32, with a ground wire and a signal wire. Also How are the servos powered on the SSC-32? Do you have separate power for VS1/VS2/VL on the SSC-32 or do you just have 1 power source. If you are for example using a 9V battery for VL and a 6V battery for VS1/VS2, do you have the VS1=VS2 jumper in place and have you removed the VS=VS1 jumper?

Powerpod is configured to communicate with the SSC-32 at the baud rate of 38400. Have you configured the 2 jumpers on the SSC-32 for the appropriate baud rate? (First jumper set, second one removed).

Did you earlier type connecting the SSC-32 directly up to a PC and use simply like LynxTerm to talk to it. I believe this is one of the steps in the tutorials, that has you find the zero points. Did you do this and did it work correctly? Knowing that you performed this step would help to eliminate several issues, like are the servos plugged in correctly and you have some power going to them.

Again I verified that Powerpod works with Studio. So now we simply need to debug your setup.

Kurt


Top
 Profile  
 
 Post subject: Re: Programming BAP28 with Powerpod
PostPosted: Wed Jun 08, 2011 7:29 pm 
Offline
New User

Joined: Wed Jun 08, 2011 5:00 pm
Posts: 3
Hiya Kurt and Nathan. I do not have a digital camera but will get one tomorrow. I have done everything to the letter in the tutorials and as you have suggested in your last post but will do it again from scratch and let you know what happens.

Nathan here is the basic program:

;
; Use Basic Micro ATOM PRO IDE 08.0.1.7
; *** not suitable for IDE 02.2.1.1 (there's a specific version for this IDE)
; *** not suitable for IDE 05.3.0.0 (there's a specific version for this IDE)
; Use Basic Atom PRO 28

;************************************************
;*** Basic Atom with SSC-32 and PS2 DualShock ***
;----------------- 1.44 3DOF-C ------------------
;--------------- PS2 Controller -----------------
;-------------- Round Body (H3-R) ---------------
;********** Bot Board Buzzer support ************
;***** Little Gripper / Pan & Tilt support ******
;**************** Deck support ******************
;************************************************
;** Programmer: Laurent Gay, lynxrios@yahoo.fr **
;************************************************
;
; let's say that the 2 switches holes of the H3/H3R is the 'rear' of the robot
;
; *** using 3 'right' legs and 3 'left' legs ***
; put the SSC-32 card with the PC serial port looking to 'Front' (opposite to H3R switches)
;
; 3 right legs connections :
; Rear Right leg : Hip Horizontal : pin 0, Hip Vertical : pin 1, Knee : pin 2
; Middle Right leg : Hip Horizontal : pin 4, Hip Vertical : pin 5, Knee : pin 6
; Front Right leg : Hip Horizontal : pin 8, Hip Vertical : pin 9, Knee : pin 10
;
; 3 left legs connections :
; Rear Left leg : Hip Horizontal : pin 16, Hip Vertical : pin 17, Knee : pin 18
; Middle Left leg : Hip Horizontal : pin 20, Hip Vertical : pin 21, Knee : pin 22
; Front Left leg : Hip Horizontal : pin 24, Hip Vertical : pin 25, Knee : pin 26
;
; Default mode :
; Move the robot (2 axis translation) with the right joystick
; Turn with the left joystick X axis
; move Up/Down body with the left joystick Y axis
; lock/unlock the height with the left joystick push button (L3)
;
; Body move mode :
; Push 'select' button to activate this mode (push 'select' again to return to default mode)
; move the body horizontally (2 axis translation) with the right joystick
; the left joystick push button (L3) has a new function now, it selects between 4 control modes for the left joystick:
; 1)- (by default) move the body vertically + rotate around the vertical axis
; 2)- (push L3 to activate) move the body vertically + roll
; 3)- (push L3 again to activate) pitch + rotate around the vertical axis
; 4)- (push L3 again to activate) pitch + roll the body
; pushing L3 again will return to mode 1 (cycling)
;
; go to standby position with the 'Triangle' button, press again to go to walk position
; Attack posture with the 'Cross' button (*** only possible if legs are not moving ***)
; All = 1500 posture with the 'Circle' button (*** only possible if legs are not moving ***)
; Learning to fly posture with the 'Square' button (uh ? nutty ?...it CAN fly...) (*** only possible if legs are not moving ***)
; Change the legs 'up' position with the digital Up/Down buttons
;
; Change the gait speed with digital right/left buttons
;
; Presets buttons (only with 'Default' mode):
; - R1 => Tall grass
; - L1 => Tile floor
; - R2 => Body low
; - L2 => Default preset
;
; Little Gripper support on Pin 29 (Left/Right) and 30 (Open/Close) (only in 'Body move' mode)
; - R1 => Open
; - L1 => Close
; - R2 => Rotate Right
; - L2 => Rotate Left
;
; Deck support on Pin 31 (panning servo)
; allow to handle a deck (for camera, sensors, lights)
; the panning servo will follow the direction it walk
; Additional tilt servo support for 180° Deck on pin 28 (Round body only)
; When using a 180° deck + 2 GP2D12 back to back on a tilt servo
; the tilt servo will incline the 'usable' GP2D12 (looking the walking direction) to floor
; when walking at low speed, the angle increase (looking near)
; when walking at full speed, the angle is close to horizontal (looking far)
; when going opposite direction, the angle is mirrored to vertical,
; making the opposite GP2D12 looking near or far
;
; Start button toggles between the 'knee angle shift' and 'normal' mode
;
; R3 button (right joystick push button) : Horn
;
; you may have to push the Analog Button on a MadCatz Wireless controller (if in sleep mode)
;
;************************************************
;
;
;--------------------------------------------------------------------
;-------------Constants
;PS2 Controller / BotBoard II (PS2 controller => pin 12, 13, 14, 15)
DAT con P12
CMD con P13
SEL con P14
CLK con P15
;*** SSC-32 card communication on pin 8 ***
SSC32 con p8

DeadZone con 28
PadMode con $79

;Deck
Deck_PulseMin con 600
Deck_PulseMax con 2400

;Little Gripper
LGripLR_PulseMin con 750
LGripLR_PulseMax con 2250
LGripOC_PulseMin con 750
LGripOC_PulseMax con 2250

;Legs
HipH_AngleMin con 21 ;30°
HipH_AngleMax con 107 ;150°
HipH_PulseMin con 910
HipH_PulseMax con 2090

HipV_AngleMin con 25 ;35°
HipV_AngleMax con 103 ;145°
HipV_PulseMin con 960
HipV_PulseMax con 2040

Knee_AngleMin con 36 ;50°
Knee_AngleMax con 107 ;150°
Knee_PulseMin con 1107
Knee_PulseMax con 2090

;****************************************************
; 3DOF-A Leg Dimensions (TibiaAngle constant = 0)
;HipV_HipH con 38 ;1.50" = 38mm (1.50 * 25.4)
;Femur_Length con 57 ;2.25" = 57mm (2.25 * 25.4)
;Tibia_Length con 124 ;4.875" = 124mm (4.875 * 25.4)

; 3DOF-B Leg Dimensions (TibiaAngle constant = 0)
;HipV_HipH con 29 ;1.14" = 29mm (1.14 * 25.4)
;Femur_Length con 57 ;2.25" = 57mm (2.25 * 25.4)
;Tibia_Length con 108 ;4.25" = 108mm (4.25 * 25.4)

; 3DOF-C Leg Dimensions (TibiaAngle constant = 20)
;HipV_HipH con 29 ;1.14" = 29mm (1.14 * 25.4)
;Femur_Length con 57 ;2.25" = 57mm (2.25 * 25.4)
;Tibia_Length con 141 ;5.55" = 141mm (5.55 * 25.4)

; 3DOF-(Old) Leg Dimensions (TibiaAngle constant = 0)
;HipV_HipH con 32 ;1.25" = 32mm (1.25 * 25.4)
;Femur_Length con 70 ;2.75" = 70mm (2.75 * 25.4)
;Tibia_Length con 108 ;4.25" = 108mm (4.25 * 25.4)
;****************************************************

; 3DOF-C Leg Dimensions (TibiaAngle constant = 20)
HipV_HipH con 29 ;1.14" = 29mm (1.14 * 25.4)
Femur_Length con 57 ;2.25" = 57mm (2.25 * 25.4)
Tibia_Length con 141 ;5.55" = 141mm (5.55 * 25.4)

LegUpShiftMin con 30
LegUpShiftMax con 70
KneeShiftPulse con 200 ;range is 0 to 255 (activated by pushing start button, affect the legs when up)
TibiaAngle con 0 ;range is -20 (interior) to 20 (exterior), 0 is vertical, this is 'all time' tibia angle

;ACos
ArcCos Bytetable 64,64,63,63,63,62,62,62,61,61,61,60,60,60,59,59,|
59,59,58,58,58,57,57,57,56,56,56,55,55,55,54,54,|
54,53,53,53,52,52,52,51,51,51,50,50,50,49,49,49,|
48,48,48,47,47,46,46,46,45,45,45,44,44,44,43,43,|
42,42,42,41,41,41,40,40,39,39,39,38,38,37,37,37,|
36,36,35,35,35,34,34,33,33,32,32,31,31,31,30,30,|
29,29,28,28,27,27,26,25,25,24,24,23,23,22,21,21,|
20,19,19,18,17,16,15,15,14,13,11,10,09,07,05,00

; Don't use ByteTable instead, it takes too much memory
RRHH con "0" ;Rear Right leg : Hip Horizontal : pin 0
RRHH2 con "0"
RRHV con "0" ;Rear Right leg : Hip Vertical : pin 1
RRHV2 con "1"
RRK con "0" ;Rear Right leg : Knee : pin 2
RRK2 con "2"

MRHH con "0" ;Middle Right leg : Hip Horizontal : pin 4
MRHH2 con "4"
MRHV con "0" ;Middle Right leg : Hip Vertical : pin 5
MRHV2 con "5"
MRK con "0" ;Middle Right leg : Knee : pin 6
MRK2 con "6"

FRHH con "0" ;Front Right leg : Hip Horizontal : pin 8
FRHH2 con "8"
FRHV con "0" ;Front Right leg : Hip Vertical : pin 9
FRHV2 con "9"
FRK con "1" ;Front Right leg : Knee : pin 10
FRK2 con "0"

RLHH con "1" ;Rear Left leg : Hip Horizontal : pin 16
RLHH2 con "6"
RLHV con "1" ;Rear Left leg : Hip Vertical : pin 17
RLHV2 con "7"
RLK con "1" ;Rear Left leg : Knee : pin 18
RLK2 con "8"

MLHH con "2" ;Middle Left leg : Hip Horizontal : pin 20
MLHH2 con "0"
MLHV con "2" ;Middle Left leg : Hip Vertical : pin 21
MLHV2 con "1"
MLK con "2" ;Middle Left leg : Knee : pin 22
MLK2 con "2"

FLHH con "2" ;Front Left leg : Hip Horizontal : pin 24
FLHH2 con "4"
FLHV con "2" ;Front Left leg : Hip Vertical : pin 25
FLHV2 con "5"
FLK con "2" ;Front Left leg : Knee : pin 26
FLK2 con "6"

;Little Gripper Pin
LGripLR Con "2" ;Little Gripper Left/Right : pin 29
LGripLR2 Con "9"
LGripOC Con "3" ;Little Gripper Open/close : pin 30
LGripOC2 Con "0"

; Deck Pin
DeckP Con "3" ;Deck Panning servo : pin 31
DeckP2 Con "1"

; Additional Tilt servo for 180° Deck
DeckTilt Con "2"
DeckTilt2 Con "8"

;--------------------------------------------------------------------
;-------------Variables
Index var Byte
DualShock var Byte(7)
DS2Mode var Byte
LastButton var Byte(2)
Steps var Byte
FlipFlap var Bit
FlagOff var Bit
MovesDelay var Sbyte
HeightAdjust var Bit

HeightShift var Sbyte(6)
KneeShift var Byte(7)

Steering var Sbyte
Height var Sbyte
LastHeight var Sbyte
HeightLimit var Byte
XSpeed var Sbyte
YSpeed var Sbyte
Roll var Sbyte
Pitch var Sbyte
Rotate var Sbyte(6)
DCoord var Byte
DAngle var Byte
NbSteps var Byte
GaitSpeed var Byte
GaitSpeedTmp var Byte
StepFlag var Byte

TmpXPos var Long
TmpYPos var Long
TmpZPos var Long
TmpDistance var Long
TmpSEW var Word
TmpSEWSEW var Long
TmpCos var Long
TmpAngle var Sbyte

XPos var Sword(6)
YPos var Sword(6)
ZPos var Sword(6)
XPos2 var Sword(6)
YPos2 var Sword(6)
ZPos2 var Sword(6)
Distance var Sword

HipH_Angle var Sbyte
HipV_Angle var Sword
Knee_Angle var Sword

HipH_Pulse var Word(6)
HipV_Pulse var Word(6)
Knee_Pulse var Word(6)

LittleGripOCPulse var Word
LittleGripLRPulse var Word
Deck_Pulse var Word
DeckTilt_Pulse var Word

LegUpShift var Byte
GaitKind var Bit
Freeze var Bit
Tripod var Bit
LockLegs var Bit
LeftStickMode var Byte

;--------------------------------------------------------------------
;***************
;*** Program ***
;***************

;-------------Init
clear

high CLK

LastButton(0) = 255
LastButton(1) = 255

LittleGripOCPulse = 1500
LittleGripLRPulse = 1500

HeightLimit = 25 - ABS(TibiaAngle / 2)

pause 500

;-------------Init SSC-32 with pulse offsets
serout SSC32,i38400,["#", |
RRHH,RRHH2,"po0 #",RRHV,RRHV2,"po0 #",RRK,RRK2,"po0 #", |
MRHH,MRHH2,"po0 #",MRHV,MRHV2,"po0 #",MRK,MRK2,"po0 #", |
FRHH,FRHH2,"po0 #",FRHV,FRHV2,"po0 #",FRK,FRK2,"po0 #", |
RLHH,RLHH2,"po0 #",RLHV,RLHV2,"po0 #",RLK,RLK2,"po0 #", |
MLHH,MLHH2,"po0 #",MLHV,MLHV2,"po0 #",MLK,MLK2,"po0 #", |
FLHH,FLHH2,"po0 #",FLHV,FLHV2,"po0 #",FLK,FLK2,"po0",13]

;SSC-32 -> H3 engine
gosub H3Init
Sound 9,[100\4235, 200\4435]
;--------------------------------------------------------------------
;-------------Main loop
main

;Ps2Query
low SEL
shiftout CMD,CLK,FASTLSBPRE,[$1\8]
shiftin DAT,CLK,FASTLSBPOST,[DS2Mode\8]
high SEL
pause 1

low SEL
shiftout CMD,CLK,FASTLSBPRE,[$1\8,$42\8]
shiftin DAT,CLK,FASTLSBPOST,[DualShock(0)\8, DualShock(1)\8, DualShock(2)\8, DualShock(3)\8, |
DualShock(4)\8, DualShock(5)\8, DualShock(6)\8]
high SEL
pause 1

if DS2Mode <> PadMode then
low SEL
shiftout CMD,CLK,FASTLSBPRE,[$1\8,$43\8,$0\8,$1\8,$0\8] ;CONFIG_MODE_ENTER
high SEL
pause 1

low SEL
shiftout CMD,CLK,FASTLSBPRE,[$01\8,$44\8,$00\8,$01\8,$03\8,$00\8,$00\8,$00\8,$00\8] ;SET_MODE_AND_LOCK
high SEL
pause 1

;low SEL
;shiftout CMD,CLK,FASTLSBPRE,[$01\8,$4D\8,$00\8,$00\8,$01\8,$FF\8,$FF\8,$FF\8,$FF\8] ;VIBRATION_ENABLE
;high SEL
;pause 1

low SEL
shiftout CMD,CLK,FASTLSBPRE,[$01\8,$4F\8,$00\8,$FF\8,$FF\8,$03\8,$00\8,$00\8,$00\8] ;SET_DS2_NATIVE_MODE
high SEL
pause 1

low SEL
shiftout CMD,CLK,FASTLSBPRE,[$01\8,$43\8,$00\8,$00\8,$5A\8,$5A\8,$5A\8,$5A\8,$5A\8] ;CONFIG_MODE_EXIT_DS2_NATIVE
high SEL
pause 1

low SEL
shiftout CMD,CLK,FASTLSBPRE,[$01\8,$43\8,$00\8,$00\8,$00\8,$00\8,$00\8,$00\8,$00\8] ;CONFIG_MODE_EXIT
high SEL
pause 288

goto main
endif

;**********************************************************************
; R1-L1-R2-L2 presets code
;
; to change Body Height (range is -25 (body up) to 25 (body down)) :
;Height = 10 ; for example
;
; to change Leg Up Shift (range is 20 (close to floor) to 70 (about 2.5 inches from floor))
;LegUpShift = 30 ; for example
;
; to change Gait Speed (range is 3 (fast) to 20 (very slow))
;GaitSpeed = 4 ; for example

If LockLegs then NoPresets
if (DualShock(2).bit3 = 0) and LastButton(1).bit3 then ;R1 Button test
Height = -25 ; tall grass
LegUpShift = 70
GaitSpeed = 10
elseif (DualShock(2).bit2 = 0) and LastButton(1).bit2 ;L1 Button test
Height = 5 ; tile floor
LegUpShift = 30
GaitSpeed = 3
elseif (DualShock(2).bit1 = 0) and LastButton(1).bit1 ;R2 Button test
Height = 25 ; Body low
LegUpShift = 35
GaitSpeed = 4
elseif (DualShock(2).bit0 = 0) and LastButton(1).bit0 ;L2 Button test
Height = 0 ; Default preset
LegUpShift = 35
GaitSpeed = 4
else
goto NoPresets
endif

HeightAdjust = 0
LegUpShift = (LegUpShift max LegUpShiftMax) min LegUpShiftMin
GaitKind = LegUpShift > 45
GaitSpeedTmp = GaitSpeed max 20
MovesDelay = 8
NoPresets
;**********************************************************************

if (DualShock(2).bit4 = 0) and LastButton(1).bit4 then ;Triangle Button test
FlagOff = FlagOff ^ 1
if FlagOff then
gosub All1500
Gosub InitPos
pause 144
for Index = 0 to 31
serout SSC32,i38400,["#",DEC Index,"P0"]
next
serout SSC32,i38400,[13]
else
gosub H3Init
endif
endif

if FlagOff then
pause 144
goto OffEnd
endif

if (MovesDelay <= 0) or LockLegs then
if (DualShock(2).bit5 = 0) and LastButton(1).bit5 then ;Circle Button test
gosub All1500
endif

if (DualShock(2).bit6 = 0) and LastButton(1).bit6 then ;Cross Button test
gosub All1500
;Attack posture
serout SSC32,i38400,["#",MRHH,MRHH2,"P1800#",MRHV,MRHV2,"P1700#",MRK,MRK2,"P1700#", |
MLHH,MLHH2,"P1200#",MLHV,MLHV2,"P1300#",MLK,MLK2,"P1300T288",13]
pause 288
serout SSC32,i38400,["#",MRHV,MRHV2,"P1500#",MRK,MRK2,"P1500#",MLHV,MLHV2,"P1500#", |
MLK,MLK2,"P1500T288",13]
pause 288
serout SSC32,i38400,["#",RRHV,RRHV2,"P1800#",RRK,RRK2,"P1800#",MRHV,MRHV2,"P1400#", |
MRK,MRK2,"P1400#",FRHH,FRHH2,"P1800#",FRHV,FRHV2,"P2100#",RLHV,RLHV2,"P1200#", |
RLK,RLK2,"P1200#",MLHV,MLHV2,"P1600#",MLK,MLK2,"P1600#",FLHH,FLHH2,"P1200#", |
FLHV,FLHV2,"P900T288",13]
pause 288
for Index = 1 to 10
serout SSC32,i38400,["#",FRHV,FRHV2,"P2000#",FRK,FRK2,"P1600#",FLHV,FLHV2,"P900#", |
FLK,FLK2,"P1600T144",13]
pause 144
serout SSC32,i38400,["#",FRHV,FRHV2,"P2100#",FRK,FRK2,"P1400#",FLHV,FLHV2,"P1000#", |
FLK,FLK2,"P1400T144",13]
pause 144
next
serout SSC32,i38400,["#",FRHH,FRHH2,"P1500#",FRK,FRK2,"P1500#",FLHH,FLHH2,"P1500#", |
FLHV,FLHV2,"P900#",FLK,FLK2,"P1500T288",13]
pause 288
serout SSC32,i38400,["#",RRHV,RRHV2,"P1500#",RRK,RRK2,"P1500#",MRHV,MRHV2,"P1500#", |
MRK,MRK2,"P1500#",FRHV,FRHV2,"P1500#",MLHV,MLHV2,"P1500#",MLK,MLK2,"P1500#", |
FLHV,FLHV2,"P1500#",RLHV,RLHV2,"P1500#",RLK,RLK2,"P1500T576",13]
pause 576
serout SSC32,i38400,["#",MRHH,MRHH2,"P1500#",MRHV,MRHV2,"P1700#",MRK,MRK2,"P1700#", |
MLHH,MLHH2,"P1500#",MLHV,MLHV2,"P1300#",MLK,MLK2,"P1300T288",13]
pause 288
serout SSC32,i38400,["#",MRHV,MRHV2,"P1500#",MRK,MRK2,"P1500#",MLHV,MLHV2,"P1500#", |
MLK,MLK2,"P1500T288",13]
pause 288
endif

if (DualShock(2).bit7 = 0) and LastButton(1).bit7 then ;Square Button test
gosub All1500
;Learning to fly posture (uh ? nutty ?...it CAN fly...)
for Index = 1 to 4
serout SSC32,i38400,["#",MRHV,MRHV2,"P1900#",MRK,MRK2,"P1800#",MLHV,MLHV2,"P1100#", |
MLK,MLK2,"P1200T288",13]
serout SSC32,i38400,["#",RRHV,RRHV2,"P1600#",RRK,RRK2,"P1600#",FRHV,FRHV2,"P1600#", |
FRK,FRK2,"P1600#",RLHV,RLHV2,"P1400#",RLK,RLK2,"P1400#",FLHV,FLHV2,"P1400#", |
FLK,FLK2,"P1400T576",13]
pause 288
serout SSC32,i38400,["#",MRK,MRK2,"P1200#",MLK,MLK2,"P1800T288",13]
pause 288
serout SSC32,i38400,["#",RRHV,RRHV2,"P1400#",RRK,RRK2,"P1400#",MRHV,MRHV2,"P1500#", |
FRHV,FRHV2,"P1400#",FRK,FRK2,"P1400#",RLHV,RLHV2,"P1600#",RLK,RLK2,"P1600#", |
MLHV,MLHV2,"P1500#",FLHV,FLHV2,"P1600#",FLK,FLK2,"P1600T576",13]
pause 576
next
serout SSC32,i38400,["#",MRHV,MRHV2,"P1800#",MRK,MRK2,"P1800#",MLHV,MLHV2,"P1200#", |
MLK,MLK2,"P1200T288",13]
pause 288
gosub All1500
endif
endif

if (DualShock(1).bit0 = 0) and LastButton(0).bit0 then ;Select Button test
LockLegs = LockLegs ^ 1
Sound 9,[100\(2000 + LockLegs * 1000)]
gosub FlatBody
endif

if (DualShock(1).bit3 = 0) and LastButton(0).bit3 then ;Start Button test
KneeShift(6) = KneeShift(6) ^ KneeShiftPulse
Sound 9,[100\(800 + KneeShift(6))]
endif

if (DualShock(1).bit1 = 0) and LastButton(0).bit1 then ;L3 Button test
if LockLegs then
LeftStickMode = (LeftStickMode + 1) & 3
gosub FlatBody
else
HeightAdjust = HeightAdjust ^ 1
endif
Sound 9,[100\3500]
endif

if (DualShock(1).bit2 = 0) and LastButton(0).bit2 then ;R3 Button test (Horn)
Sound 9,[800\392, 600\370, 200\0, 800\330, 600\294, 200\0, 300\330, 100\0, 300\330]
endif

if DualShock(1).bit4 = 0 then ;Up Button test
LegUpShift = (LegUpShift + 1) max LegUpShiftMax
elseif DualShock(1).bit6 = 0 ;Down Button test
LegUpShift = (LegUpShift - 1) min LegUpShiftMin
else
goto NoSound
endif

GaitKind = LegUpShift > 45
Sound 9,[20\(LegUpShift * 10 + 400 + GaitKind * 200)]
MovesDelay = 8
NoSound

if (DualShock(1).bit5 = 0) and LastButton(0).bit5 then ;Right Button test
GaitSpeedTmp = (GaitSpeedTmp + 1) max 20
elseif (DualShock(1).bit7 = 0) and LastButton(0).bit7 ;Left Button test
GaitSpeedTmp = (GaitSpeedTmp - 1) min 3
else
goto NoSound1
endif
Sound 9,[20\(50-GaitSpeedTmp) * 35 + 400]
MovesDelay = 8
NoSound1

GaitSpeed = GaitSpeedTmp min (3 + GaitKind)

for Index = 3 to 6
if DualShock(Index) > (128 + DeadZone) then
DualShock(Index) = DualShock(Index) - DeadZone/2
elseif DualShock(Index) < (128 - DeadZone)
DualShock(Index) = DualShock(Index) + DeadZone/2
else
DualShock(Index) = 128
endif
next

YSpeed = DualShock(3) - 128 ; Right Stick Horizontal

XSpeed = DualShock(4) - 128 ; Right Stick Vertical

Steering = DualShock(5) - 128 ; Left Stick Horizontal

StepFlag = (GaitSpeedTmp - 2) max 3
if HeightAdjust or LockLegs then
Height = LastHeight + (((DualShock(6) - 128) / 5) - LastHeight) / StepFlag; Left Stick Vertical
endif

Height = (Height Max HeightLimit) min - HeightLimit

;H3
if Steering or (Height <> LastHeight) or YSpeed or XSpeed or LockLegs then
MovesDelay = 8
endif

if MovesDelay > 0 then
LastHeight = Height
DCoord = SQR(XSpeed * XSpeed + YSpeed * YSpeed)
TmpCos = XSpeed * 127 / DCoord
gosub ACos
DAngle = TmpAngle
if YSpeed > 0 then
DAngle = 256 - DAngle
endif

DCoord = DCoord max (128 - ABS(Height) - ABS(TibiaAngle * 2))

; 180° Deck Code
if (Dangle < 64 or Dangle > 191) and (DCoord > 0) then
DeckTilt_Pulse = 1680 - Dcoord
else
DeckTilt_Pulse = 1380 + Dcoord
endif
Deck_Pulse = ((Deck_PulseMax - Deck_PulseMin) * ((DAngle + 64 ) & $7F)) / 127 + Deck_PulseMin

; 360° Deck Code
;Deck_Pulse = ((Deck_PulseMax - Deck_PulseMin) * DAngle) / 255 + Deck_PulseMin

Steps = Steps + 1
if Steps > NbSteps then
Steps = 1
FlipFlap = FlipFlap ^ 1
NbSteps = GaitSpeed
endif

if LockLegs then
if LeftStickMode > 0 then ;Body roll and pitch
if (leftStickMode & 1) then
Roll = Roll + (Steering - Roll) / StepFlag
Steering = 0
else
Roll = 0
endif

if (leftStickMode & 2) then
Pitch = Pitch + (Height - Pitch) / StepFlag
Height = 0
else
Pitch = 0
endif

HeightShift(0) = Roll/10
HeightShift(2) = HeightShift(0)
HeightShift(3) = -HeightShift(0)
HeightShift(5) = HeightShift(3)

HeightShift(0) = ((HeightShift(0) + Pitch) max HeightLimit) min -HeightLimit
HeightShift(3) = -HeightShift(0)
HeightShift(2) = ((HeightShift(2) - Pitch) max HeightLimit) min -HeightLimit
HeightShift(5) = -HeightShift(2)

HeightShift(1) = HeightShift(0) + HeightShift(2)
HeightShift(4) = HeightShift(3) + HeightShift(5)
endif
LittleGripOCPulse = ((LittleGripOCPulse + (DualShock(2).bit3 * 50) - (DualShock(2).bit2 * 50)) |
min LGripOC_PulseMin) max LGripOC_PulseMax
LittleGripLRPulse = ((LittleGripLRPulse + (DualShock(2).bit1 * 50) - (DualShock(2).bit0 * 50)) |
min LGripLR_PulseMin) max LGripLR_PulseMax
GaitSpeedTmp = StepFlag + 2
else
StepFlag = NbSteps - Steps + 1
endif

for Index = 0 to 5
XPos2(Index) = -(DCoord * SIN(DAngle + (Index * 43 + 21) + 64) / 300) ; 43 => 60 degrees
ZPos2(Index) = -(DCoord * SIN(DAngle + (Index * 43 + 21)) / 300) ; 43 => 60 degrees
next

Tripod = FlipFlap
gosub AorB_Down

Freeze = Steps < (NbSteps - GaitKind)
Tripod = FlipFlap ^ 1
gosub AorB_Up

for Index = 0 to 5

;Distance and HipH_Angle with XZ
Distance = SQR((XPos(Index) * XPos(Index) + ZPos(Index) * ZPos(Index)) / 4) * 2
TmpCos = ZPos(Index) * 127 / Distance

Distance = Distance + TibiaAngle ; Tibia angle for special legs (3DOF-C)

Gosub ACos
HipH_Angle = (TmpAngle max HipH_AngleMax) min HipH_AngleMin
;----------

;Set Angle
TmpXPos = XPos(Index) * 127
TmpYPos = (YPos(Index) * 127) max 0
TmpZPos = ZPos(Index) * 127
TmpDistance = ((Distance - HipV_HipH) * 127) min 0

TmpSEWSEW = (TmpYPos * TmpYPos + TmpDistance * TmpDistance) / 16129
TmpSEW = SQR(TmpSEWSEW)

TmpCos = (Femur_Length * Femur_Length + Tibia_Length * Tibia_Length - TmpSEWSEW)
TmpCos = TmpCos * 127 / (2 * Femur_Length * Tibia_Length)
gosub ACos
Knee_Angle = (TmpAngle max Knee_AngleMax) min Knee_AngleMin

TmpCos = -TmpYPos / TmpSew
gosub ACos
HipV_Angle = TmpAngle

TmpCos = (Femur_Length * Femur_Length - Tibia_Length * Tibia_Length + TmpSEWSEW)
TmpCos = TmpCos * 127 / (2 * Femur_Length * TmpSEW)
gosub ACos
HipV_Angle = ((TmpAngle + HipV_Angle) max HipV_AngleMax) min HipV_AngleMin
;----------

HipH_Angle = HipH_Angle + Rotate(Index)

HipH_Pulse(Index) = (((HipH_PulseMax - HipH_PulseMin) * (HipH_Angle - HipH_AngleMin) |
/ (HipH_AngleMax - HipH_AngleMin) + HipH_PulseMin) max HipH_PulseMax) min HipH_PulseMin

HipV_Pulse(Index) = (((HipV_PulseMax - HipV_PulseMin) * (HipV_Angle - HipV_AngleMin) |
/ (HipV_AngleMax - HipV_AngleMin) + HipV_PulseMin) max HipV_PulseMax) min HipV_PulseMin

Knee_Pulse(Index) = (((Knee_PulseMax - Knee_PulseMin) * (Knee_Angle - Knee_AngleMin) |
/ (Knee_AngleMax - Knee_AngleMin) + Knee_PulseMin) max Knee_PulseMax) min Knee_PulseMin
Knee_Pulse(Index) = 3000 - Knee_Pulse(Index) - KneeShift(Index) * 2
next

serout SSC32,i38400,["#",RRHH,RRHH2,"P",DEC HipH_Pulse(0),"#",RRHV,RRHV2,"P",DEC HipV_Pulse(0), |
"#",RRK,RRK2,"P",DEC Knee_Pulse(0),"#",FRHH,FRHH2,"P",DEC HipH_Pulse(2), |
"#",FRHV,FRHV2,"P",DEC HipV_Pulse(2),"#",FRK,FRK2,"P",DEC Knee_Pulse(2), |
"#",MLHH,MLHH2,"P",DEC HipH_Pulse(4),"#",MLHV,MLHV2,"P",DEC 3000 - HipV_Pulse(4), |
"#",MLK,MLK2,"P",DEC 3000 - Knee_Pulse(4),"#",MRHH,MRHH2,"P",DEC HipH_Pulse(1), |
"#",MRHV,MRHV2,"P",DEC HipV_Pulse(1),"#",MRK,MRK2,"P",DEC Knee_Pulse(1), |
"#",RLHH,RLHH2,"P",DEC HipH_Pulse(5),"#",RLHV,RLHV2,"P",DEC 3000 - HipV_Pulse(5), |
"#",RLK,RLK2,"P",DEC 3000 - Knee_Pulse(5),"#",FLHH,FLHH2,"P",DEC HipH_Pulse(3), |
"#",FLHV,FLHV2,"P",DEC 3000 - HipV_Pulse(3),"#",FLK,FLK2,"P",DEC 3000 - Knee_Pulse(3), |
"#",DeckP,DeckP2,"P",DEC Deck_Pulse,"#",DeckTilt,DeckTilt2,"P",DEC DeckTilt_Pulse, |
"#",LGripOC,LGripOC2,"P",DEC LittleGripOCPulse,"#",LGripLR,LGripLR2,"P",DEC LittleGripLRPulse,"T190",13]
pause 100
else
pause 144
if MovesDelay < -17 then
MovesDelay = (NbSteps - GaitKind) - Steps + 1
EndIf
endif
MovesDelay = MovesDelay - 1
OffEnd
LastButton(0) = DualShock(1)
LastButton(1) = DualShock(2)

goto main

;--------------------------------------------------------------------
;-------------Sub H3 Init
H3Init
LockLegs = 0
NbSteps = 4
GaitSpeedTmp = NbSteps
LegUpShift = 35

for Index = 0 to 5
XPos(Index) = HipV_HipH + Femur_Length
YPos(Index) = - Tibia_Length
ZPos(Index) = 0
next

Gosub InitPos
MovesDelay = 8
; then All1500

;-------------Sub All1500
All1500
HeightAdjust = 1
height = 0
LastHeight = 0

for Index = 0 to 27 ;preserve servo 28 (Deck Tilt),29 and 30 (Little Gripper),31 (Deck)
serout SSC32,i38400,["#",DEC Index,"P1500"]
next
serout SSC32,i38400,["T576",13]

pause 576

Steps = NbSteps
; then Flat Body

;-------------Sub Flat Body
FlatBody
Roll = 0
Pitch = 0
for Index = 0 to 5
HeightShift(Index) = 0
next

return

;-------------Sub InitPos
InitPos
serout SSC32,i38400,["#",RRHV,RRHV2,"P2100#",RRK,RRK2,"P1800#",MRHV,MRHV2,"P2100#",MRK,MRK2,"P1800#", |
FRHV,FRHV2,"P2100#",FRK,FRK2,"P1800#",RLHV,RLHV2,"P900#",RLK,RLK2,"P1200#",MLHV,MLHV2,"P900#", |
MLK,MLK2,"P1200#",FLHV,FLHV2,"P900#",FLK,FLK2,"P1200T1152",13]
pause 576
serout SSC32,i38400,["#",RRHH,RRHH2,"P1500#",MRHH,MRHH2,"P1500#",FRHH,FRHH2,"P1500#", |
RLHH,RLHH2,"P1500#",MLHH,MLHH2,"P1500#",FLHH,FLHH2,"P1500T576",13]
pause 576

return

;-------------Sub Arc Cosinus
ACos
TmpCos = (TmpCos max 127) min -127
if TmpCos < 0 then
TmpAngle = 128 - ArcCos(-TmpCos)
else
TmpAngle = ArcCos(TmpCos)
endif

return

;-------------Tripod 'A' (tripod = 0) or 'B' (Tripod = 1) Down
AorB_Down
for Index = 0 + Tripod to 4 + Tripod Step 2
KneeShift(Index) = 0
Rotate(Index) = Rotate(Index) + (Steering/5 - Rotate(Index))/StepFlag
YPos(Index) = -Tibia_Length + Height + HeightShift(Index)
XPos(Index) = XPos(Index) + (XPos2(Index) - (XPos(Index) - (HipV_HipH + Femur_Length)))/StepFlag
ZPos(Index) = ZPos(Index) + (ZPos2(Index) - ZPos(Index))/StepFlag
next

return

;-------------Tripod 'A' (tripod = 0) or 'B' (Tripod = 1) Up
AorB_Up
if LockLegs then AorB_Down ;Goto sub AorB_Down and return directly from it to main loop

if (Steps = NbSteps) and GaitKind then
StepFlag = NbSteps
goto AorB_Down ;Goto sub AorB_Down and return directly from it to main loop
else
StepFlag = StepFlag - GaitKind - 1
endif

for Index = 0 + Tripod to 4 + Tripod Step 2
if (Steps > 1) and (Steps < (NbSteps - GaitKind - 1)) then
KneeShift(Index) = KneeShift(6)
else
KneeShift(Index) = 0
endif
Rotate(Index) = Rotate(Index) + (-Steering/5 - Rotate(Index))/StepFlag
YPos(Index) = -Tibia_Length + Height + (LegUpShift * Freeze)
XPos(Index) = XPos(Index) + (-XPos2(Index) - (XPos(Index) - (HipV_HipH + Femur_Length)))/StepFlag
ZPos(Index) = ZPos(Index) + (-ZPos2(Index) - ZPos(Index))/StepFlag
next

return

;--------------------------------------------------------------------


Top
 Profile  
 
 Post subject: Re: Programming BAP28 with Powerpod
PostPosted: Thu Jun 09, 2011 7:28 pm 
Offline
Site Admin
User avatar

Joined: Thu Mar 01, 2001 7:00 pm
Posts: 1316
Location: Temecula, CA
Like Kurt said, it looks like the code generated is valid. When you ran through the setup tutorial were you able to calibrate the servo positions? If so, we can remove servos as the problem. When you start up the program do the servos do anything when you try to move (eg go crazy, twitch, any movement at all)? If they do move even a little bit then the ps2 is connecting and sending commands that are being received (though not necessarily correctly). If the robot does nothing at all then the ps2 may not be connecting. Is the second LED on the PS2 receiver blinking or solid?

_________________
Tech Support
Basic Micro - Robotic Technology Evolved


Top
 Profile  
 
 Post subject: Re: Programming BAP28 with Powerpod
PostPosted: Thu Jun 09, 2011 8:36 pm 
Offline
Master

Joined: Tue Nov 21, 2006 5:34 pm
Posts: 662
Hi Nathan,

I solved it on the Lynxmotion site. He was using a Sony PS2 controller which appears like the timings were not working to enter into command mode to get to mode 0x79 instead it was left in 0x73. But since the program does not use the extra data anyway, I gave him a quick patch, which simply checked that the high nibble of the mode byte was a 7 (Analog) and that got him up and running.

Kurt


Top
 Profile  
 
 Post subject: Re: Programming BAP28 with Powerpod
PostPosted: Fri Jun 10, 2011 5:37 pm 
Offline
Site Admin
User avatar

Joined: Thu Mar 01, 2001 7:00 pm
Posts: 1316
Location: Temecula, CA
IIRC with the Sony controllers you need longer than 1ms pauses between config commands.

_________________
Tech Support
Basic Micro - Robotic Technology Evolved


Top
 Profile  
 
 Post subject: Re: Programming BAP28 with Powerpod
PostPosted: Fri Jun 10, 2011 9:51 pm 
Offline
New User

Joined: Wed Jun 08, 2011 5:00 pm
Posts: 3
Hiya Nathan

Just to say thanks for making an effort. Much appreciated. As Kurt said, he fixed my problem with an ammendment to one line of the Basic program. So all is fine and the hexapod will be on show at my Faculty Opening which will be attended by Professor Brian Cox this Thursday. I am sure the robot will impress them. My students are already impressed and are playingand learning from it right now. I have told them what a wonderful tool this Forum is. Hopefully they will become experts like yourself and Kurt. Take care


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC [ DST ]


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group

phpBB SEO