Mulbin

Custom hardware / simpit repository. For people who take KSP a little too far.

Recommended Posts

That's one reason i highly recommend the pogo pins. they can move a few millimeters up and down, and don't drift side to side, and will always keep pressure on the surface. You can also make sure the PC board is clean, and that no oxidization or residue from the epoxy is covering any of the tracks. Another issue, is the spring contact might stay in the track because of the ring of epoxy glue, but it might be riding up the side of the epoxy and then falling back to the copper when it gets too far. Apart from some very creative track shaping, I'm not sure. If that's what's happening to make you lose contact, then you'll need steeper side walls to prevent that from happening.

You can see that the grooves on the tracks for this NASA slip ring are at least as deep as the wire is think, and the cross section is squared, not sloped.
 

Spoiler

fdai4_300.jpg


How hard would it be for your 3D printer to print concentric rings onto the surface of a PC board? Is there a way to command it to feed when not running? Is there a way to command it to pause at a point in the printing process? Heck, maybe there's a way to simply just do it, but if you drilled a ring of small holes around your PC board (between he traces), and secured the PC board to the printing surface of your 3D printer, could you basically come up with a way to print a ring of plastic between each trace, and manually feed the plastic at a few key spots so it fills holes in the board, to secure the plastic ring to the board? Do that between each and every track? Is that possible?

Again, my solution would simply be pogo pins though.

You could try earphone connectors too though. A stereo connector with microphone support typically has 4 conductors, and the plug can spin inside the socket. 

Edited by richfiles

Share this post


Link to post
Share on other sites

Hello. This question is for the moderators. What are the rules on posting items for sale or links to items that this thread in particular would be interested in?

Thanks!

Share this post


Link to post
Share on other sites
27 minutes ago, JOHNMKNIGHT said:

Hello. This question is for the moderators. What are the rules on posting items for sale or links to items that this thread in particular would be interested in?

Thanks!

Hi John, any such links to a product or service would need to be approved by Squad, try asking @Badie or @UomoCapra:)

Share this post


Link to post
Share on other sites

I don't think slip rings are needed though. if your design is something like the pic, where your two ball hemispheres are mounted to a *yaw* motor, which is glued to a central plate, which is mounted on the *pitch* motor, you could just run the wires from the *yaw* motor to the outside through the central disk and a hallow axis that would mount the central disk to the *pitch* motor?

 

W03PvbU.jpg

Sorry if I confused you :/

(Central disk is the rectangle inside the circle)

Edited by c4ooo

Share this post


Link to post
Share on other sites

pMDYlTv.jpgI dont think that would work because if the Pitch Motor rotates the cables will tangle up or how thats called in english. You cant rotate one side of a cable while holding the other side for more than a few rotations. I didnt do anything last weekend except for a list with the stuff I want to put on the panels qhich inst even completed yet. But next weekend we have 2 weeks vacation so ill try to use that time and do something.

Edited by Pvt. KASA

Share this post


Link to post
Share on other sites

@Pvt. KASA If you use thin cables, and make sure the pitch never rotates more than 360*, then i think it should be possible. Anyways, i may attempt a navball as a school project (i get funding for parts!), and will report how well it works :)

Also, "tangle" is correct :)

Share this post


Link to post
Share on other sites

Yes, if you dont rotate it too much it will work but i would like to make it (if possible), that it can rotate forever in one direction. BTW I think you can get more than 360* with very thin stranded wire.

How does it work at your school that you get money for Projects? I once participated in a competition with my school and I had to pay for the parts myself :/.

6 minutes ago, c4ooo said:

Also, "tangle" is correct :)

Google translate is awesome :D

Edited by Pvt. KASA

Share this post


Link to post
Share on other sites

Could you build kind of like a BB8?  Have the drive system inside the sphere and force it to stay in place via magnets. 

Share this post


Link to post
Share on other sites
1 hour ago, eberkain said:

Could you build kind of like a BB8?  Have the drive system inside the sphere and force it to stay in place via magnets. 

It should be possible, but I think it lacks the sensor feedback needed to make it work.

Share this post


Link to post
Share on other sites
18 minutes ago, Ragequit said:

It should be possible, but I think it lacks the sensor feedback needed to make it work.

Better yet, how about putting the drive wheels on the outside.  Basically build a cradle that would hold the sphere in place with surface bearings, and then have a drive wheel on each axis, but those would have to engage and disengage, but they would interrupt each other...   So, how about a single drive wheel on the back center.  If the drive wheel could rotate the sphere one direction, and then the drive wheel its self could be turned to change its relative angle on the sphere, then it should be able to move the sphere any direction, it would just be a matter of doing the math and figuring out a way to calibrate, and keep it calibrated. 

Share this post


Link to post
Share on other sites

That could theoretically work if there is enough friction between the rollers and the ball, but it would probably be more complex a design as posted above, and calibration would be very hard.

Edited by c4ooo

Share this post


Link to post
Share on other sites

In all honesty, it's not even hard to source slip rings. Ebay has them in 6 and 12 conductor versions for fairly reasonable prices. The magic of a navball is it's ability to continuously spin without hitting any mechanical limits. It's also the mechanical complexity that has led to the modern day "glass cockpit", where all the old traditionally mechanical instruments are now just LCD screens. I think it was @stibbons that made a nice little LCD based navball. For the three axis navballs that are required in space faring vessels, there is a requirement for both precision and accuracy. A BB8 style mechanism requires the ability to detect the absolute position of the ball, which almost guarantees the need to do visual processing, and to have a camera being able to see the ball. Having a rotating roller wheel could work, but you'd still need a pair of them, and they'd still require slip rings or else they would be limited to a restricted number of rotations before needing to reset. If they undergo a moment of reset, the ball's motion will hitch for a moment as the wheel flips. I've worked with the rotating magnetic fields of three phase sinusoidal drives and motors long enough to be able to visualize the rotation if the fields in relation to the inputs. When dealing with wheels and balls and circles and spheres and whatnot... It all comes down to sinusoidal patterns, when you graph it out. Anything that has a limited range of motion will abruptly have to stop at some point an backtrack. There's simply no avoiding it. Slip rings let the motion continue along the path it wants to take. It's truly as simple as that.

The Air Force and NASA had the mechanics of the navball down to a science, literally. As long as you can get the motors and encoders to physically fit inside the ball, it's not hard. If you counterbalance it, and you have room for the swinging motor, you can even have one of the motors NASA puts inside the ball on the outside The reason NASA puts two motors inside the ball is to keep the unit compact, balanced, and fast. A large diameter object takes more time to accelerate and decelerate than a tight, compact diameter object that keeps it's center of mass internal. While @Pvt. KASA has already made homemade slip rings, I can't stress enough how easy it is to just buy them. They are simply not even a hurdle or challenge to face. It's a little extra work to make them yourself, like he did, but they are absolutely not hard to source, nor are they overly expensive. If reducing things down to power and serial, something like a TRRS plug and jack could probably sufficient too.

The point is though, that trying to skip out on the slip rings simply makes no sense. Limiting the number of spins, forcing reset cycles, etc... It is literally not necessary. a 6 conductor slip ring is about $3-4 on ebay, and a 12 conductor slip ring is about $8. You can get 18 and even 24 conductor slip rings, but they are more expensive, closer to $15-25. With a little Machining or 3D printing, you can make the mechanical bits you need, use a purchased slip ring, plus your motors and encoders, and you'll have everything you need for a navball!

Edited by richfiles

Share this post


Link to post
Share on other sites

I Changed my plans and decided to contact the inner plate via a stereo audio connector and a 1 wire bus and the U clamp assembly via this Slip ring assembly: F5D7w4q.jpg

4 Rings are for the pitch Motor, 2 Electricity for both motors and one is the 1 wire bus.

I am now waiting for the Audio connectors to be delivered and thinking about how to realise the Bus. If you have any idea how to transmit 4 bits as often as possible per second over 1 wire, please Write it here! Thanks

Edited by Pvt. KASA

Share this post


Link to post
Share on other sites

@Pvt. KASA That is an EXCELLENT slip ring design! That's actually similar to ones I used to instal when assembling synchros at my old job. I... was not expecting you to go that style, or land on such an undeniably solid design! Excellent work! For additional noise tolerance, you can consider using multiple wipers to contact the rings.

I'd suggest providing power and ground, and then your data signal. Rather than trying to directly command the motors, I'd say, setup your index locally to your controller. Have a tiny micro, like a teensy or an Arduino pro mini or micro. You can just send a value to the microcontroller to represent the desired position of the axis being driven. The micro would then drive the motor in whatever way it needs to to get the motor to rotate that axis toward the goal. Every time the index is triggered, the micro should check if the motor step count matches when it expected the index. If it matches, then carry on. If it does not match, then it should reset the current position to match the index position, and allow the program to continue running the motor till expected position matches current and position. That accounts for any mis steps, and lets the micro on each axis update the ball position without any external guidance, save for just the coordinates. and the values for the desired navball position.

Share this post


Link to post
Share on other sites

Good idea! That would also simplify calibration. I could simply send a Signal to let the controller know I want the axis calibrated and the microcontroller does it on its own and i dont need to use extra cables for the photocell.

Tomorrow I will get the audio connector and I will order a progammer for the Attinys I have lying around.
EDIT:

I just got the Audio connectors and now i´m working on the middle plate but i am having some problems aligning the axis accurately.

Edited by Pvt. KASA

Share this post


Link to post
Share on other sites

I don't know about one wire interfaces, but all you need is the bandwidth to transmit the angular position for an axis at least once every or every other frame. If you miss a transmission, It's not the end of the world, as the next frame, the data will catch up. (frame being a reference to updates sent by KSP).

The general configuration is as follows:

[Main Microcontroller]
|
| (1 wire bus + power)
|
|-->[Roll Axis Micro]<--[Roll Index Photo Diode]
|                  '--->[Roll Motor]
|
v
[First Slip Ring]
|
|-->[Pitch Axis Micro]<--[Pitch Index Photo Diode]
|                   '--->[Pitch Motor]
|
v
[Second Slip Ring]
|
'-->[Yaw Axis Micro]<--[Yaw Index Photo Diode]
                  '--->[Yaw Motor]

You use a small micro for each axis controller. All each micro needs to do is have a position in memory where it expects the axis is, a position recieved over the 1 wire bus, and then it just has to step the motor int he right direction to make the expected ball position match the commanded ball position. Whenever it gets the index signal, it'll reset the expected ball position to a known value, and let the program drive the motor to update it. That way, the ball stays synchronized automatically, with each revolution. When it powers up, or you go to a new vessel or something like that, it should automatically spin the ball till it indexes, so it "learns" it's real position. The index should be measured going clockwise and counter clockwise, as you may get two different values depending on direction. The direction the motor is going should determine what index value expected motor position is reset to when the index is sensed. You still absolutely need to have the photo diodes though. You just don't need to send their state over the slip rings. Each of the three small micro controllers are a self contained axis driver.

The benefit of this design is you design the axis controls once, and just repeat it three times, the only coding difference being which packet of three each axis controller listens too. Each micro does its own motor control, its own index calibration, and reads only its own packet. It only requires 3 wires, period, for the whole system, if you're sticking with a 1-wire bus. This layout eliminates any motor leads going through slip rings. only power and data. Each small micro can be directly wired to each motor's driver.

Edited by richfiles

Share this post


Link to post
Share on other sites

I know this has absolutely nothing to do with KSP, or the instrument panel I'm building, but I think talking tools is probably still fair game. Given all the talk of what people have achieved with their 3D printers, the temptation to turn this into the X axis of a GIANT 3D printer is SO tempting...
iC8reS8.jpg
It's Yuge! :0.0:
It comes from one of these:
atlasunit_new.jpg?t=1492952631932&width=
It's an automated pipettor machine, and the lab where I work scrapped that assembly out, and I got it. I just need to install steppers and belts to it, and a bed, to make it into a functional single axis platform. Overall, It's 46 inches (116 cm) long and 28 inches (71 cm) deep. The linear mechanism is nearly 41 inches (104 cm) long, so accounting for end stop sensors, it would presumably allow a 20 inch (50 cm) bed to move 20 inches (50 cm) along the axis of travel... That's still an incredible amount of potential build volume, even if it's just one axis. The mounting points (where you'd attach the bed) are 23 inches (58 cm) on the inside edge, and 26 inches (66 cm) on the outside edge, so bed depth would be based on how you mounted it to the traveling linear mechanism. Honestly, it's probably easiest to mount on the inside.

If you have the Y axis feature a full enough travel span to cover the full bed depth, you could potentially have a build area of 20 x 23 inches (50 x 58 cm), plus whatever the Z height ends up adding for the overal volume! That's incredible, considering the build volume of most cheap 3D printers!

I'm trying to consider what would get me up and running the quickest and the cheapest (If i ever decide it's not good enough, I could always rebuild the Y and Z axes for something better). While I know they aren't as rigid as a fully framed mechanism, I've considered the "inverted L" shape mechanisms like what's on the Tronyx X1, but I have significant concerns about the stability of that if it's gotta extend out 23 inches (58 cm), vs the X1's 6 inches (15 cm). Having the two screw mechanism for the Z axis, and y on a belt, like is seen on some other Tronyx models seems to make a lot more sense. It seems like that would be far more rigid.

I simultaneously want to and don't want to know what this assembly cost... I got it for free! :confused:

Edited by richfiles

Share this post


Link to post
Share on other sites

A really big 3D printer has some problems...

I don't exactly know how these machine works but I could imagine that it could move around which is really bad. If it doesn't, that would be really awesome.

Another thing is the print time. Don't underestimate the time it takes to print large stuff with a 3D printer!

I am now waiting for my ISP Programmers and trying to align the central plate with the axis but I am not sure I will be able to get it accurate enough...

Share this post


Link to post
Share on other sites

Hi there again...

Im having some trouble with the 1-Wire connection. I bought a real Arduino Uno and I wanted to transmit Data over 1 wire between it and my Arduino Micro.

I need to transmit 12 bits. 2 for address (3 devices plus calibration command) and 10 for the position (ca. 1/3 degree resolution).

I worked on a protocol and sending works but I can't get it working that the receiving Arduino know when the signal starts.

I tried to have the line on High for 15 times one Bit takes (3ms) so I can just wait for a High, wait 2ms, check if it is still high.If it is, this is the beginning of a message. then I wait for the Line to go low. If it is, i wait 0.3ms so when i now check the value im in the middle of the first bit. then i save the value, wait 0.2ms for the next bit and so on until I got the last bit. Then I wait for the next High. Somehow, this doesn't work. Here is the code:

Transmitter:

#define oneWirePin 1

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

// the loop function runs over and over again forever
void loop() {
  sendData(1,1,93);

}



void sendData(boolean addr1, boolean addr2, int pos){
  digitalWrite(oneWirePin,HIGH);
  delayMicroseconds(3000);
  digitalWrite(oneWirePin,LOW);
  delayMicroseconds(200);
  //Begin transmission
  Serial.print("beginning transmission:\nAddress:\n");
  digitalWrite(oneWirePin,addr1);
  Serial.print(addr1);
  delayMicroseconds(200);
  digitalWrite(oneWirePin,addr2);
  Serial.print(addr2);
  delayMicroseconds(200);
  Serial.print("\nMessage:\n");
  
  for(int i=0; i<10; i++) {
    digitalWrite(oneWirePin,bitRead(pos,i));
    Serial.print(bitRead(pos,i));
    delayMicroseconds(200);
  }

  Serial.print("\ntransmission stopped\n\n");


  Serial.print("\n");
  delayMicroseconds(5000);
  
}
Receiver:

int output;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(oneWirePin, INPUT); //LED on Model A  or Pro
  pinMode(1, OUTPUT); //LED on Model A  or Pro
}

// the loop routine runs over and over again forever:
void loop() {
  //DigiKeyboard.sendKeyStroke(0);

  output=receiveData();
  //Serial.println(output);
  delay(100);

  
}

boolean addr1;
boolean addr2;
boolean bit1;
boolean bit2;
boolean bit3;
boolean bit4;
boolean bit5;
boolean bit6;
boolean bit7;
boolean bit8;
boolean bit9;
boolean bit10;


long receiveData(){
  
  long dataReceived = 0;

  
  while(digitalRead(oneWirePin) == LOW){
    delayMicroseconds(1);
  }
  //Wait for Data
  

  delayMicroseconds(3300);
    
    addr1 = digitalRead(oneWirePin);
    delayMicroseconds(200);
    
    addr2 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit1 = digitalRead(oneWirePin);
    delayMicroseconds(200);
    
    bit2 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit3 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit4 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit5 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit6 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit7 = digitalRead(oneWirePin);
    delayMicroseconds(200);
    
    bit8 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit9 = digitalRead(oneWirePin);
    delayMicroseconds(200);

    bit10 = digitalRead(oneWirePin);
    delayMicroseconds(200);


    dataReceived = bit1*1 + bit2*2 + bit3*4 + bit4*8 + bit5*16 + bit6*32 + bit7*64 + bit8*128 + bit9*256 + bit10*512; 
    Serial.print(bit1);
    Serial.print(bit2);
    Serial.print(bit3);
    Serial.print(bit4);
    Serial.print(bit5);
    Serial.print(bit6);
    Serial.print(bit7);
    Serial.print(bit8);
    Serial.print(bit9);
    Serial.print(bit10);
    Serial.print("\n");

    Serial.println(dataReceived);
    delayMicroseconds(2000);
    return dataReceived;
    
  }

Any tips?

Edited by Pvt. KASA

Share this post


Link to post
Share on other sites

I haven't tried using the OneWire interface myself but I recommend that you start by using another pin. Pin 13 is also used for the red LED and the fact that there is a LED and a resistor connected to it can really screw things up. Use a clean I/O pin.

Share this post


Link to post
Share on other sites

Oh this is not the "real" OneWire Interface, I tried to write one on my own.

I ordered a logic analyzer now and maybe I will look into the real OneWire interface now. I think I also spotted the mistake in my code, the code that tries to get the start of the message is flawed. if it begins to listen while a "low" bit is transmitted, it thinks the next high bit is the beginning of the message.

Share this post


Link to post
Share on other sites

I just found PulseIn on the Arduino Website. that looks like the thing I want. Just do a PulseIn, check if it is long so it is the Init Bit which is longer than the other, if it is do PulseIn and get the Individual Bits and if it isnt just continue listening if a long High comes along

I also managed to program my Attinys with the Arduino. I tried it a few years ago with an Arduino Micro and didnt get it to work but with the Uno, it worked first try :cool:. Maybe I will fuse them so I can use the Reset pin as an IO Pin, then I would have enough Io pins for the Axis driver. I could only reset the fuse with an High Voltage programmer but I dont need an Reset pin, do I? Why do you need a reset pin at all if you could just cut the power and restart the chip?

 

WOW! it looks like i did it!

 

Transmitter:

#define oneWirePin 9

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(oneWirePin, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  sendData(1,0,93);  //  < just a test message
  delay(16);
}



void sendData(boolean addr1, boolean addr2, int pos){

  //transmit the init Bit
  digitalWrite(oneWirePin,HIGH);
  delayMicroseconds(15000);
  digitalWrite(oneWirePin,LOW);

  //wait 1 ms until transmitting the message:
  delayMicroseconds(1000);

  //transmit address bits:
  digitalWrite(oneWirePin,addr1);
  delayMicroseconds(1000);
  digitalWrite(oneWirePin,addr2);
  delayMicroseconds(1000);
  
  //transmit the 10 position bits
  for(int i=0; i<10; i++) {
    digitalWrite(oneWirePin,bitRead(pos,i));
    delayMicroseconds(1000);
    Serial.print(bitRead(pos,i));
  }
  Serial.print("\n");
  digitalWrite(oneWirePin,LOW);
  
}

 

Receiver:

#define inputPin 2

// the setup function runs once when you press reset or power the board
void setup() {
  pinMode(inputPin,INPUT);
  Serial.begin(9600);
}

int pos;
int duration;
boolean noSignal;
boolean addr1;
boolean addr2;

// the loop function runs over and over again forever
void loop() {
  pos = getData();
  Serial.print("Position:   ");
  Serial.print(pos);
  Serial.print("\n");
  delay(15);
}
  
int getData(){

  noSignal = 1;
  while(noSignal == 1){
    //Serial.print("no signal\n");
    duration = pulseIn(inputPin, HIGH);
    noInterrupts();
    if(duration > 14500){
      Serial.print("startbit received\n");
      //Signal received
      delayMicroseconds(1400);
      addr1 = digitalRead(inputPin);
      Serial.print("Address:    ");
      Serial.print(addr1);
      delayMicroseconds(1000);
      addr2 = digitalRead(inputPin);
      Serial.print(addr2);
      Serial.print("\n");
      pos = 0;
      delayMicroseconds(1000);
      for(int i=0; i<10; i++) {
        //Dummy Function
        Serial.print(digitalRead(inputPin));
        delayMicroseconds(1000);
        pos = 55;
        
        
        
      }
      Serial.print("\n");
      //Serial.print(pos);
      interrupts();
      //signal received
      noSignal = 0;
      delayMicroseconds(500);
    }
    else{
      // No init Bit received, go back and try again
    }
  }
  return pos;
  
  
}

 

I just transmitted the 2 address bits (4 possibilities > 3 axis plus 1 calibrate) but implementing the other 10 bits should be really easy.

 

EDIT: It kinda works. Every 2nd transmission i get the right message but in the other messages I only get zeros for all bits.

Edited by Pvt. KASA

Share this post


Link to post
Share on other sites

Quick little update...

I have found a screen printing shop willing to source me the ink for my Radar Altimeter tape meter (to stamp numbers myself). Thing is... They actually appear to be both set up for, and willing to actually do a proper screen printing of the entire actual tape! They have a screen printing setup normally used for printing onto table cloths that can easily accommodate the tape's length, and can be vertically offset to support a shim that would prevent creasing the tape (since it's in a loop). Since I'll have a half window gap between the bottom of '0m' and the top of '>10000m', the tape can easily be printed in two separate passes. They'll only need to align the second printing with the first half, and all should be good... I also came up with a three pass option that prints a divider that is similar tot he end of tape markings on actual NASA tape meters. I'm gonna try to print that.

I'm using a scale split into three resolutions... 0 - 1000 is in 10 meter increments. 1100 - 3000 is in 100 meter increments. 3500 - >9999 is in 500 meter increments. I didn't wanna deal with trying to figure out a logarithmic scale, but I wanted better resolution for landing, so I did it in three distinct steps. Software will compensate for the steps.

Here's the thing... I don't know what I'll be quoted for the job yet, as I'd only be having them print the two tapes I have (one to use, and one so I'll have a spare)... Thing is, economy comes from quantity. If others are interested in tape meters though, I see no reason I couldn't have additional prints made for anyone interested in tape meters for their own builds. I could have them print it on vinyl sheets? undeveloped film reels? Film leader... I dunno.

long story short... I might potentially have a Radar Altimeter tape meter scale ready for manufacture with a professional printer... Just attach the roll to your own mechanism, however way you like.

So, is anyone actually interested in such a thing?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.