Uncategorized

Building a 6DOF Joystick: Master/Slave test

RSP Master & Slave

Following from my earlier post I got all six servos converted. Now I have two Rotary Stewart Platforms next to each other on my desk. From the outside they look pretty similar. Inside I’ve converted one set of servos by removing the PCB inside and leaving the potentiometer.

servo to sensor 1

servo to sensor 2

servo to sensor 3

servo to sensor 4

servo to sensor 5

servo to sensor 6

servo to sensor 7

servo to sensor 8

servo to sensor 9

I also removed one gear so that the potentiometers could turn freely. I call this one the Master and it’s going to be my joystick.

I read the sensors with this code.

[code language=”c”]void setup() {
Serial.begin(9600);
Serial.println("START");
}

void loop() {
int i;
for(i=0;i<6;++i) {
Serial.print(analogRead(A0+i));
Serial.print(‘\t’);
}
Serial.print(‘\n’);
delay(100);
}[/code]

When I read from the six sensors I get values like this.

[code language=”c”]379 416 488 600 396 632
269 320 355 708 347 654
273 294 309 756 348 631
338 326 311 770 348 595
396 370 381 740 348 581
445 418 580 580 380 598
428 417 644 525 471 562
429 408 532 608 540 486
410 394 394 694 543 446
447 415 349 725 497 456
424 408 276 821 372 570
357 379 352 776 320 675
224 294 438 705 321 721
93 183 337 787 321 710
131 165 244 859 320 685
297 248 163 930 320 618
351 302 177 926 320 617
364 335 332 814 321 648
359 351 553 623 360 672
306 324 609 584 434 641
306 316 589 592 532 538
319 317 501 654 531 530
429 381 484 662 531 486
500 444 581 595 535 473
580 513 711 478 655 362
609 554 738 450 707 305
619 581 747 447 707 292
618 594 744 452 707 287
604 596 729 474 708 302
592 590 722 477 706 313
588 584 728 478 708 316
589 580 727 478 706 328
589 567 725 479 708 329
590 554 727 478 706 328
588 554 728 479 708 329
589 563 727 478 706 328[/code]

Then I convert those values to PWM signals and send them back out to the second set of servos, the Slave. The physical relationship is 1:1. The wiring is slightly backwards – the pin numbers run the other way on the far side of the Arduino so I put servo 1 in digital pin 7, servo 2 in pin 8, and so on.

I’m finding as I test this that the inputs and the outputs don’t match 100%. They’re very close but in some cases input moves 90 degrees and the matching output only moves 75. A configurable scale (*k) and constant (+c) adjustment for each input should take care of that.

Tonight I read How to make an UNO appear as a joystick to your computer and Wednesday I will give it a shot. With a little luck I can get this working and play Kerbal Space Program better. I have never successfully achieved an Orbital Rendezvous and it fills me with horrible, horrible nerd shame. I’m also going to 3D print a grip so it feels more like a traditional joystick. Minecraft and Descent are also good candidate games. Animatronics, too.

Mondays are supposed to be improve the site day but for the next two days I’m shipping orders, 3D printing, and getting ready to show off the Makelangelo at Grandview Elementary right here in Vancouver.

Uncategorized

Rotary Stewart Platform Code Update, May 22 2013

Get v4.

– added RSP_Listen
– added RSP_MasterSlave
– updated RSPv1 to change pins for Arduino MEGAs
– updated Center to match pin config of other sketches

RSP_Listen is a new sketch that listens to the potentiometers from your Rotary Stewart Platform (RSP) joystick and displays them on screen.

RSP_MasterSlave uses a single Arduino to connect a RSP joystick to an RSP. When you move the joystick the slave mimics your movements. Great for animatronics.

Uncategorized

Building a 6DOF Joystick: Chopping up servos

I want to provide a more concrete reason to get a Rotary Stewart Platform. So I figure the best way is to make a 6DOF joystick like this:

The method is pretty straightforward: build two stewart platforms. use one as the “input” and one as the “output”. Then take away the output, read the numbers from the input and report them to a PC as if it was a Human Interface Device (HID). Windows and OSX would recognize it. Then I would talk the Minecraft guys into providing support.

The first step is already half done: Rotary Stewart Platform is available now, if you want one. I asked Jonny Poole of InnerbreedFX how he built his and he said to open the servos, remove the circuit, and use the potentiometer already inside as a sensor.

.. and there it sat for about three weeks because I was completely stumped. The servo pot was returning garbage. I removed it completely from the servo, put it in a breadboard, and ran every combination of test I could think of. The multimeter returned sensible voltage on the middle pin when I put 5v across the other two and twisted the dial. but when I plugged it into an arduino with the following script:

[code language=”c”]void setup() {
Serial.begin(9600);
Serial.println("START");
}

void loop() {
Serial.println(analogRead(A0));
delay(100);
}[/code]

the numbers were all over the place. As I slowly turned the dial it would sometimes jump to 1023, sometimes to 0.

In the end I gave up and got another. Within about 2 minutes I had sensible numbers. In case you were wondering, sensible numbers look like this:

[code language=”c”]START
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
25
73
75
75
75
75
75
85
96
146
208
254
308
369
433
486
543
606
668
727
772
800
809
808
808
810
813
824
883
954
1006
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1006
960
916
862
807
749
681
616
561
499
436
372
317
258
193
141
99
52
4
0
0
0
0
0
0
0
0
0
0
0
0
0
0
8
37
75
119
160
205
260
308
350
397
470
551
622
693
766
827
878
928
967
997
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1010
991
973
966
964
959
929
911
911
911
911
911
911
911
911
911
911
911
911
912
911
911
911
911
911
910
911
910
911[/code]

Next up I’ll convert five more and then connect two stewart platforms together.

Uncategorized

Vancouver Robotics Club, April 2013

Always great stuff at the Vancouver Robotics Club. Next month is RC vehicles. I hope my HOG drive is ready by then. I’m already getting ready for the Vancouver Maker Fair 2013. Have you got your tickets?

PWM class

Bob gives a short class on PWM signals and how they work with servos.

IMG_2852

Christian has been building his first robot. It’s up and running around, which is huge step. Christian and his dad show up every month and always have smart questions.

Liz & Jonathan

Liz & Jonathan are make me a little envious. They can talk robots all day, every day.  Between them they have enough great ideas to keep 6 people busy for a long, long time.

great box, bad robot

Liz & Jonathan own a lot of robots of various sorts. So many that they brought one of their custom robots in this box that was “just lying around”.

crawlbot?

Crafting together a crawling robot.  The parts required a bit of massaging – and by “massaing” I mean “drilling out the holes until they fit”.

adapter on pan/tilt detail

At the VRC meeting I used my 3D printer to print a piece I designed the day before, and then when I got home installed it on the pan/tilt head I’ve been working on.  It’s the one below the big gear that holds the motor and small gear in place.

adapter on pan/tilt

Here’s a wide shot so you can see it better.  The two gears on the top left are from a Greg’s Hinged Accessible Extruder. The one in the bottom center I designed myself.

Miscellaneous

Debugging a DIY Segway at the Vancouver Hack Space

Al's Segway device

Al first contacted me by email.  Apparently someone has been telling him that I’m the go-to guy for anything Arduino.  He is not wrong. Sit right here and I’ll tell you about how we went to work on this machine and how far we got in an evening.

Segway PT drives by sensing the way you tilt your body.  The brain of the robot can sense which way is up and which way you lean.  It does this with a gyroscope.  This model also has an Dead Man’s Switch for safety: you have to hold the button down to make it go, meaning it can’t make any escape attempts.  In order to test the parts early on there’s also a knob to make the robot turn and a knob to make the robot go forward and back.  In theory you could drive this model without the robot brain, but that’s not as cool.

Al did what anyone would do.  He carefully assembled the entire machine by following the steps in the manual, copied the code into the Arduino line by line, and when it was ready flipped the switch.  One wheel started to turn right away and the other did nothing – and nobody was holding down the Dead Man’s switch!

To attack this problem efficiently we made a plan: if we know the fundamentals work then we can test higher-up stuff.  First we have to check the mechanical and electrical connections match the diagram.  Second, we have to check that the inputs work and the Arduino can “hear” them.   Third, test that the brain can make the motors go the right way.  Fourth, we know we have an input > brain > motors connection.  The last step then is teaching the brain how to balance.

We disconnected the motors and then Al got out a sharpie and some masking tape.  I gently pulled on a wire at the top of the steering controls and when the other end at the Arduino moved, he put a piece of tape on and labelled it.  We did that through all the wires, which took about 20 minutes.  You can see a ‘T’ (for turn) on a piece of tape next to Al’s index finger.

Al, being very clever, had drawn a schematic of how the wiring should be done.  We took out all the wires from the red breadboard shield, effectively disconnecting all the controls.  The breadboard has the gyroscope chip mounted in the center for easy connecting to the Arduino.  The breadboard and the Arduino click together like a LEGO sandwich.  Then we used the traced Dead Man’s wire and reconnected it to the pin in the schematic and went poking in the code.  About 40 minutes later we had the light on the top of the breadboard turning on when the Dead Man’s Switch was pushed, and turning off when it was released.  This was an excellent sign!  We didn’t stop for high fives, there was a long way to go.

The next step was to get the knobs and the button all working at once.  To do this I wanted to display on a screen the position of the knobs and the on/off of the button all at once.  The best way I know to debug an Arduino is the Serial interface.  In the code we have a value called steeringPot and another called gainPot.  I wanted to be sure that when the steering knob is turned that only analogRead(steeringPot); would return a changing number between 0 and 1023.  I also wanted analogRead(gainPot) to do work the same when the forward/back knob was turned.  I told the Arduino,

Serial.print(analogRead(steeringPot));  Serial.print('\t');
Serial.print(analogRead(gainPot));  Serial.print('\t');
Serial.print(deadManSwitchState);  Serial.print('\n');

…This is where we hit the biggest bug of the night.  We had the code reporting

1023   1023   1

over and over, no matter what we did to the knobs.  We retested everything.  The always resourceful Simon joined in with a multimeter and tested that the electrical signal from the knob potentiometers was rising and falling as the knob was turned.  It’s his hand in the left of the photo when we tried removing the breadboard to see if it was somehow the problem.  Everything seemed to be working, and yet the Arduino was deaf.  For nearly and hours various people took a crack at it.  In the end, it was a function I’d never used before called analogReference(INTERNAL); that was the culprit.  Nobody caught that the AREF wire in the schematic was missing; the one in the board was removed because it wasn’t in the schematic; and the Arduino was waiting for voltages it would never get.  We removed the line and suddenly we were getting numbers that made sense.

By then it was 11pm and time to go home.  Al promised to work on connecting the 6DOF sensor over the week.  If he does we’ll take another crack at it Tuesday night and you can read all about it here Wednesday afternoon.

I should probably mention along the way John cleaned a 1000 watt amplifier and started putting together the Solidworks computer; Miriam got her Makerbot Cupcake 3D printer moving; Jack was laser cutting; and there were at least 9 other people with as many projects going on that I didn’t even get to talk to.  Come on down and check it out sometime, it’s really something.