Well, finally I was let down by a lack of amps, the batteries I have just arent strong enough to move the limbs without at least doubling them. And I'll need to upgrade the regulators. Such is life...
I added a little bit of code to the Pi's monitor. The raw_input() function was going to be replaced by an open() and list() on a script containing mnemonics.
def injector():
global port,done,packet
print 'Starting input thread.'
joints=['anklex','ankley','knee','hipx','hipz']
cmds=['movs','movm','movf','movi']
syms=['s','m','f','i']
rngs=[15,10,5,1]
while not done:
cmd=-1
spd=-1
srv=-1
agl=-1
print '->',
i=raw_input('')
if i!='':
inp=i.split(' ')
if len(inp)==3:
srv=0
if inp[0] in cmds: cmd=cmds.index(inp[0])
if inp[1] in joints: srv=joints.index(inp[1])+1
try:
agl=int(inp[2])
except: agl=-1
if cmd>-1:
spd=rngs[syms.index(cmds[cmd][3])]
if cmd>-1 and srv>-1 and agl>-1 and spd>-1:
checksum=1+srv+agl+spd # int(i1)+int(i2)+int(i3)+int(i4)+int(i5)
chk2=(checksum & 65280)/256
chk1=(checksum & 255)
port.write(chr(chk1)+chr(chk2)+chr(1)+chr(srv)+chr(agl)+chr(spd)+chr(0))
sleep(1)
else: done=True
This would allow me to program motions for the servos, if they actually moved. They hum, but they just dont have the juice.
Closing existing port... Port not open Clearing buffers... Connected! Starting input thread. -> movm knee 255 Servo: 10 10 128 Move: 10 128 Move: 9 140 Move: 8 153 Move: 7 166 Move: 6 178 Move: 5 191 Move: 4 204 Move: 3 216 Move: 2 229 Move: 1 242 -> movm knee 128 Servo: 10 10 255 Move: 10 255 Move: 9 242 Move: 8 229 Move: 7 216 Move: 6 204 Move: 5 191 Move: 4 178 Move: 3 166 Move: 2 153 Move: 1 140 -> movm anklex 0 Move: 10 128 Move: 9 115 Move: 8 102 Move: 7 89 Move: 6 76 Move: 5 64 Move: 4 51 Move: 3 38 Move: 2 25 Move: 1 12 -> movm anklex 128 Move: 10 0 Move: 9 12 Move: 8 25 Move: 7 38 Move: 6 51 Move: 5 64 Move: 4 76 Move: 3 89 Move: 2 102 Move: 1 115 -> movm anklex 255 Move: 10 128 Move: 9 140 Move: 8 153 Move: 7 166 Move: 6 178 Move: 5 191 Move: 4 204 Move: 3 216 Move: 2 229 Move: 1 242 -> movi anklex 128 Move: 1 255 -> movi anklex 0 Move: 1 128 -> movs anklex 0 Move: 15 0
This is the above code interacting with a live processor controlling the servos. For now I have just defined the following instructions.
- MOVI - Move Instant; sets the servo angle to the destination in one step.
- MOVS, MOVM and MOVF - Move Slow, Medium, Fast; sets the servo to the position specified interpolating by decreasing numbers of steps.
- The servos are specified by name, AnkleX and AnkleY, Knee, HipY and HipZ, and angle is specified directly as an 8-bit number between 0 and 255.
These execute over time inside the Atmel without further instruction, freeing up the ports and main processor for the task of observing the sensors and interjecting to compensate. It isnt ideal, but it is a lot faster than trying to directly control the servos over those serial links.
I'm going to take a little break from this for a while. Or I will begin to dislike it... And I need to paint, and play my guitar some to chill out.
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.