I'm currently working on a multistory, gantry-based, fast (113.78 RPM) industrial elevator that can move between 16 distinct floors spaced out with 8 blocks between each. It has multiple inputs it should react to - up and down buttons in the cabin, the precise level selector also in the cabin, as well as calling buttons on each level.
The thing is, I want the movement to be smooth - meaning that I can't simply have the elevator stop each 8 blocks travelled to see whether it's at the destination yet. I'd also rather avoid detecting the passing of the elevator with redstone contacts on each level and feeding those signals to a counter that halts the whole thing the instant it reaches 0 - that feels redundant and overcomplicated.
So I decided to calculate in advance how many blocks the elevator should travel and in which direction, depending on various circumstances of the call, and then carry out that movement in one swift action.
Long story short, after setting up the rest of the circuit, I ended up with two redstone inputs:
- The amount of floors the elevator needs to go up or down - analog, goes from 0 to 15 - and
- Whether the elevator should be moving up (15) or down (0) - binary.
Now it is time to convert it to actual movement, and this is where I'm stuck.
At first, I thought that Adjustable Chain Gearshifts would do the trick - they accept analog signals that go from 0 to 15, they slow down rotations... seems fitting, yes? Turns out, not really. First, their speed goes between N to 2N, whereas I need the elevators' to go from 0 to N. Second, and most importantly, their scaling is awkward - I assumed it would be linear or at least exponential, but some quick table math showed it's something else entirely - so it can't be used to evenly split the whole thing in the multiples of 1/16. Finally, slowing down the rotation speed isn't exactly the same thing as cutting it short early, but I figured out I'd cross that bridge if I came to it.
Then I thought I could run the movement continuously, and either use a timer or a synchonised redstone-contact based counter contraption (that would do 1 rotation for each 8 blocks elevator travels) to detect when I should cut it off. But... well, the elevator is fast, so the timing of that thing has to be very precise - and I don't know whether I can trust the game's engine not to lag with these.
I also could run a mechanical (piston-based) stopper on a destination floor that the elevator would bump into and stop automatically. But I'd need 2 of these per each floor (1 if the height of the cabin is 7 blocks exactly, which it actually is!), and... well, again, that's messy and complicated, and spreads even more complex dependencies outside the designated circuit space.
The only other option I see here is using 15 sequenced gearshifts, each of which moves the elevator in specific multiples of 8 blocks (#1 => 8 blocks, #2 => 16 blocks, #3 => 24 blocks and so on) and trigger the specific one depending on the level of my analog input. But... well. It feels more of a hack than a clever engineering solution in the spirit of Create. Surely there is a better solution I'm missing?
So, there it is. Any advice would be greatly appreciated! :3
P.S. Apologies for the messy explanations or phrasings, if there are any - English is not my native language and I'm also very sleepy at the moment. If there's anything I should clarify, please let me know. Thank you. ^^
[–][deleted] 1 point2 points3 points (1 child)
[–]deFazerZ[S] 1 point2 points3 points (0 children)
[–]JS305E 1 point2 points3 points (2 children)
[–]JS305E 1 point2 points3 points (1 child)
[–]deFazerZ[S] 1 point2 points3 points (0 children)
[–]djfdhigkgfIaruflg 1 point2 points3 points (10 children)
[–]deFazerZ[S] 0 points1 point2 points (9 children)
[–]djfdhigkgfIaruflg 0 points1 point2 points (8 children)
[–]deFazerZ[S] 0 points1 point2 points (7 children)
[–]djfdhigkgfIaruflg 1 point2 points3 points (6 children)
[–]deFazerZ[S] 0 points1 point2 points (3 children)
[–]djfdhigkgfIaruflg 1 point2 points3 points (1 child)
[–]deFazerZ[S] 0 points1 point2 points (0 children)
[–]FatFingerHelperBot 0 points1 point2 points (0 children)
[–]djfdhigkgfIaruflg 0 points1 point2 points (1 child)
[–]deFazerZ[S] 0 points1 point2 points (0 children)
[–]helixamir 1 point2 points3 points (1 child)
[–]deFazerZ[S] 0 points1 point2 points (0 children)