Shop OBEX P1 Docs P2 Docs Learn Events
6 legged 3DOF Spiderbot — Parallax Forums

6 legged 3DOF Spiderbot

Carol HazlettCarol Hazlett Posts: 312
edited 2012-12-23 17:11 in Robotics
This has been an overwhelming project for me. I've learned a lot by even attempting it and still have a ways to go! The body is built using the Minds-i building system (mymindsicom) with a BOE for brains and two Prop Servo Controllers for the legs and Pings. I have it doing some simple movements but haven't been able to program a decent looking gait yet. It is really a prototype yet as I am thinking of switching to a Propeller board for the brains. There is an incompatibility in voltage between the Prop Servo Controllers and the Propeller BOE I have to address first. That and I am still new to Spin. Here is some code I have written for the spider, and all suggestions and advice will be gladly welcomed.

' {$STAMP BS2}
' {$PBASIC 2.5}

ch      VAR   Byte
pw      VAR   Word
ra      VAR   Byte
twist   VAR   Byte

Sdat1   CON   14
Sdat2   CON   15
Baud    CON   396

FRHip   CON   10
FRKnee  CON   11
FRFoot  CON   5

MRHip   CON   8
MRKnee  CON   9
MRFoot  CON   4

RRHip   CON   6
RRKnee  CON   7
RRFoot  CON   3

FLHip   CON   4
FLKnee  CON   5
FLFoot  CON   2

MLHip   CON   2
MLKnee  CON   3
MLFoot  CON   1

RLHip   CON   0
RLKnee  CON   1
RLFoot  CON   0

Main:
  twist = 1
  GOSUB Stance
  GOSUB High_Stance
  FOR twist = 1 TO 3
    GOSUB Twist_Left
    GOSUB Twist_Right
  NEXT
  GOSUB Stance
  FOR twist = 1 TO 3
    GOSUB Twist_Left
    GOSUB Twist_Right
  next
  GOSUB Stance

END

Stance:
  '--------------Front left leg--------------------------------------------
  ra = 11
  pw = 780
  SEROUT Sdat1, Baud+$8000,["!SC", FLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1000
  SEROUT Sdat1, Baud+$8000,["!SC", FLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 550
  SEROUT Sdat2, Baud+$8000,["!SC", FLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '--------------Middle left leg-------------------------------------------
  ra = 11
  pw = 720
  SEROUT Sdat1, Baud+$8000,["!SC", MLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1000
  SEROUT Sdat1, Baud+$8000,["!SC", MLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 550
  SEROUT Sdat2, Baud+$8000,["!SC", MLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '--------------Rear left leg---------------------------------------------
  ra = 11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", RLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1000
  SEROUT Sdat1, Baud+$8000,["!SC", RLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 600
  SEROUT Sdat2, Baud+$8000,["!SC", RLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '---------------Front right leg------------------------------------------
  ra = 11
  pw = 720
  SEROUT Sdat1, Baud+$8000,["!SC", FRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 500
  SEROUT Sdat1, Baud+$8000,["!SC", FRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 850
  SEROUT Sdat2, Baud+$8000,["!SC", FRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '----------------Middle right leg---------------------------------------
  ra =11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", MRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 500
  SEROUT Sdat1, Baud+$8000,["!SC", MRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 930
  SEROUT Sdat2, Baud+$8000,["!SC", MRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '----------------Rear right leg------------------------------------------
  ra = 11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", RRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 500
  SEROUT Sdat1, Baud+$8000,["!SC", RRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 930
  SEROUT Sdat2, Baud+$8000,["!SC", RRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  RETURN

Twist_Right:
  ra = 10
  pw = 900
  SEROUT Sdat1, Baud+$8000,["!SC", FLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 850
  SEROUT Sdat1, Baud+$8000,["!SC", MLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 850
  SEROUT Sdat1, Baud+$8000,["!SC", RLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 800
  SEROUT Sdat1, Baud+$8000,["!SC", FRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 850
  SEROUT Sdat1, Baud+$8000,["!SC", MRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 850
  SEROUT Sdat1, Baud+$8000,["!SC", RRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  RETURN

Twist_Left:
  ra = 10
  pw = 650
  SEROUT Sdat1, Baud+$8000,["!SC", FLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 600
  SEROUT Sdat1, Baud+$8000,["!SC", MLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 600
  SEROUT Sdat1, Baud+$8000,["!SC", RLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 550
  SEROUT Sdat1, Baud+$8000,["!SC", FRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 600
  SEROUT Sdat1, Baud+$8000,["!SC", MRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 600
  SEROUT Sdat1, Baud+$8000,["!SC", RRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  RETURN

Lower_Body:
  '--------------Front left leg--------------------------------------------
  ra = 11
  pw = 780
  SEROUT Sdat1, Baud+$8000,["!SC", FLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 700
  SEROUT Sdat1, Baud+$8000,["!SC", FLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 300
  SEROUT Sdat2, Baud+$8000,["!SC", FLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '--------------Middle left leg-------------------------------------------
  ra = 11
  pw = 720
  SEROUT Sdat1, Baud+$8000,["!SC", MLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 700
  SEROUT Sdat1, Baud+$8000,["!SC", MLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 300
  SEROUT Sdat2, Baud+$8000,["!SC", MLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '--------------Rear left leg---------------------------------------------
  ra = 11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", RLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 700
  SEROUT Sdat1, Baud+$8000,["!SC", RLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 300
  SEROUT Sdat2, Baud+$8000,["!SC", RLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '---------------Front right leg------------------------------------------
  ra = 11
  pw = 700
  SEROUT Sdat1, Baud+$8000,["!SC", FRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 800
  SEROUT Sdat1, Baud+$8000,["!SC", FRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1200
  SEROUT Sdat2, Baud+$8000,["!SC", FRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '----------------Middle right leg---------------------------------------
  ra =11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", MRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 800
  SEROUT Sdat1, Baud+$8000,["!SC", MRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1200
  SEROUT Sdat2, Baud+$8000,["!SC", MRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '----------------Rear right leg------------------------------------------
  ra = 11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", RRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 800
  SEROUT Sdat1, Baud+$8000,["!SC", RRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1200
  SEROUT Sdat2, Baud+$8000,["!SC", RRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  RETURN

High_Stance:
    '--------------Front left leg--------------------------------------------
  ra = 11
  pw = 780
  SEROUT Sdat1, Baud+$8000,["!SC", FLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1200
  SEROUT Sdat1, Baud+$8000,["!SC", FLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 750
  SEROUT Sdat2, Baud+$8000,["!SC", FLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '--------------Middle left leg-------------------------------------------
  ra = 11
  pw = 720
  SEROUT Sdat1, Baud+$8000,["!SC", MLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1200
  SEROUT Sdat1, Baud+$8000,["!SC", MLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 750
  SEROUT Sdat2, Baud+$8000,["!SC", MLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '--------------Rear left leg---------------------------------------------
  ra = 11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", RLHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 1170
  SEROUT Sdat1, Baud+$8000,["!SC", RLKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 750
  SEROUT Sdat2, Baud+$8000,["!SC", RLFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '---------------Front right leg------------------------------------------
  ra = 11
  pw = 720
  SEROUT Sdat1, Baud+$8000,["!SC", FRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 300
  SEROUT Sdat1, Baud+$8000,["!SC", FRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 650
  SEROUT Sdat2, Baud+$8000,["!SC", FRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '----------------Middle right leg---------------------------------------
  ra =11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", MRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 300
  SEROUT Sdat1, Baud+$8000,["!SC", MRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 750
  SEROUT Sdat2, Baud+$8000,["!SC", MRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  '----------------Rear right leg------------------------------------------
  ra = 11
  pw = 750
  SEROUT Sdat1, Baud+$8000,["!SC", RRHip, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 320
  SEROUT Sdat1, Baud+$8000,["!SC", RRKnee, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  pw = 730
  SEROUT Sdat2, Baud+$8000,["!SC", RRFoot, ra, pw.LOWBYTE, pw.HIGHBYTE, CR]
  PAUSE 500
  RETURN

I haven't annotated this code yet. This was a little demo of the spider twisting his shoulders and moving his body up and down. You can see videos of this project as it progressed at facebook.com/Robothon or facebook.com/CarolLynnHazlett.
100_0476.jpg
100_0480.jpg
100_0505.jpg
1024 x 768 - 106K
1024 x 768 - 156K
1024 x 768 - 115K

Comments

  • prof_brainoprof_braino Posts: 4,313
    edited 2012-12-20 05:43
    Very cool!

    Will she she know when her feet are on the ground? For example, "stance" on an uneven surface?

    Have you worked out the algorithm for controlling the gait yet?
  • Carol HazlettCarol Hazlett Posts: 312
    edited 2012-12-20 20:29
    I am still working on the gait. The problem is not the vehicle it is my programming skills. But I am learning a lot! I can see where foot sensors would be cool. I believe Lynxmotion already does that in their robots. I could have bought a kit but decided to go for the design challenge of doing a robot myself from the ground up.
  • Duane DegnDuane Degn Posts: 10,588
    edited 2012-12-21 02:15
    This has been an overwhelming project for me. I've learned a lot by even attempting it and still have a ways to go! The body is built using the Minds-i building system (mymindsicom) with a BOE for brains and two Prop Servo Controllers for the legs and Pings. I have it doing some simple movements but haven't been able to program a decent looking gait yet. It is really a prototype yet as I am thinking of switching to a Propeller board for the brains.

    I'm working on my second hexapod right now. The programming is kind of mind boggling. While I'm trying to come up with code on my own for the fun of it, there is code available to control a hexapod with a Propeller.

    Even with your servo control boards, I think a hexapod is a bit much for a BS2 to try to control.
    There is an incompatibility in voltage between the Prop Servo Controllers and the Propeller BOE I have to address first.

    What incompatibility is this? Most 5V devices see the 3.3V output from a Propeller as logic high and the Propeller can receive 5V logic if a series resistor of 4.7K or more is used. I know the Scribbler 2's level shifters interfere with its ability to interface with a Ping, but I don't know if the PSC would have a problem communicating with a Ping or not.

    I'd think you could probably use one of your PSC boards as the main brain for your bot so you wouldn't even need to purchase another Propeller board to upgrade the brains of your hexapod. If you do want to use a third Propeller board there are several options. The PropBOE has lots of cool features that would likely come in handy with your robot. The main downside to the PropBOE is that many of the IO pins are used by the devices on the board so only 20 of the 32 IO pins are available to use to directly control servos. This wouldn't be a problem in your case since you have the PSC boards.

    I'm using a Propeller Proto board on my current hexapod, but I used a QuickStart board to control my popsicle stick hexapod.

    Whichever Propeller board you use, I doubt it would have a problem interfacing with your PSC boards.

    IIRC, you were planning on using the software that comes with the PSCs to program the positions of each servo as it walks. I'd think trying to assign a position to each servo as the robot walks would be exceedingly tedious. I think an equation that expresses the way you want the servos to move would be a lot easier (though far from easy).

    Ideally, you don't want the feet of the hexapod to slide on the ground as it walks. It should move its legs together in unison while keeping the feet from sliding on the ground. This generally requires inverse kinematics.

    Have you seen what Paul K's hexapods can do? I think they're amazing. Paul has posted his code for controlling hexapods so you wouldn't need to come up the the equations yourself.

    I just watched a few of your hexapod videos. I think the center positions of your servos are different than the way Paul and myself have ours centered. I think Paul's code would still work with your robot, but it might need to be modified a little.

    Your robot looks cool just standing there; I think it's going to be a lot of fun to see it walk.
  • Carol HazlettCarol Hazlett Posts: 312
    edited 2012-12-23 17:11
    I think I will check out all of your suggestions and see what fits best for me. I do have one simple gait that I did but it does not look very graceful, and walks much like the old 2DOF hexapods. So far the BS2 has seemed up to the job, but I agree that the propeller microcontroller is better. I am procrastinating about learning another new language in the middle of a project. My bad.
Sign In or Register to comment.