Automatic Secret Library Door




I've always wanted to have a secret bookshelf door. Who wouldn't? So when I finished my attic, I had the chance to construct a custom bookshelf door that opens and closes by sliding into a space behind the wall, revealing my home office.

But I wanted to go farther than that - I wanted it to automatically activate itself via a secret book or using a special secret knock code. This instructable shows you how I did it. With some modification, you can use the same supplies to make a bookcase swing open and closed like a door.

Time: This project took me months.

Skill level: I'm an experienced woodworker, a novice Arduino programmer, experienced hardware hacker. Moderate to advanced skill level project.

Materials needed:

1. Arduino Uno R3

2. Sainsmart 2 Relay board for Arduino

3. YWrobot piezo electric microphone for Arduino

4. Soldering iron

5. Wire cutters and strippers

6. Microswitch (momentary NO/NC)

7. Book you can cut into

8. Various bits of wire, electrical tape, heat shrink tubing, cable organizers

9. Altoids tin

10. Small wood screws

11. Hobby Horse springs

12. 2" fixed caster wheels (6)

13. 1 X 12 wood for bookcase

14. 3/4" bolt

15. Firgelli heavy duty linear actuator

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Build the False Wall

The challenge was to build an entrance to the far end of the attic, which was triangular. A chimney created a central obstacle and would require the entrance to be on either the right or left. In the first photo, the chimney has been enclosed in sheetrock. With plans for a TV in the middle, both bookcases would be triangular in shape and wouldn't easily swing in or out. The bookcase needed to slide towards the center to reveal the door.

The second photo shows the opening created for the bookcase to slide into.

Step 2: Build the Bookcase

The bookcase is constructed from standard 1 X 12 from the local Home Depot. The bottom shelf is raised to hide the rollers that allow the bookcase to slide. Four straight rollers (two inches, I think) carry the weight and are bolted to the bottom of the bookcase.

I didn't want it to be obvious that the bookcase slides, so I used washers to adjust the wheels so that there was a very slight amount of clearance with the floor. The floor is Pergo laminate, smooth and slick and very low friction. Given that you could load a lot of books into the bookcase, I wanted to make sure it would still move smoothly even with a few hundred pounds of weight on it. I cut a piece of Pergo the width of the distance between the rollers and attached it to the floor so the rollers straddle it. This creates a guide that keeps the bookcase on track when being opened or closed but is low enough not to trip over when stepping through the doorway.

The bookcase is opened and closed using a linear acutator, so I needed some sort of connection to the actuator. The solution was very simple. A horizontal piece of wood sticks out one side of the bookcase like a wagon tongue and connects to the actuator with a bolt.

Safety was a high priority since I figured small children may find the bookcase fascinating. The linear acuator is capable of moving 250 pounds, and I didn't want a small child's hand or body being caught with that kind of force. I rigged two large springs to the tongue that pushes and pulls the bookcase so there is no 'hard' connection between the actuator and the bookcase. You could still get caught in it, but it won't crush you and you can get your hand or body free if necessary. The springs connect to heavy duty eyelets that screw into the main tongue.

The tongue of the bookcase overlays a wooden trolley that connects to the actuator mechanism. The trolley has a hole drilled in it and the tongue has a matching hole drilled as well. A bolt is passed through both to connect them. Knowing that it is not a matter of if, but when, the door fails to open or the power is out and traps the occupant inside, I used a trailer pin that is easily removed, allowing the bookcase to be manually opened. There are also other ways out of the room including a fire ladder and removable wall bookcases on rollers that allow you to climb through to the other room in the case of an emergency.

To keep the bookcase from wobbling when operating, I installed a wooden track, or blade at the top and bracketed it with castors to guide it when opening or closing.

Step 3: Hacking the Linear Actuator

The linear actuator is a Firgelli Automation 40" length track linear actuator capable of a 200 pound force. I'm guessing, but figured if it took more than 200 pounds of force to slide a bookcase on roller, something was seriously wrong.

As you can see from the picture, the actuator is a small motor connected to a gearbox that drives a long rod that is threaded. The rod is encased in the silver aluminum housing and a block rides back and forth on the track and is threaded onto the rod somehow. Think of a nut on a bolt with the block being the nut. It rides back and forth on the track when the bolt (rod) spins. Simple.

The system comes with a manual pushbutton device that uses a 5 pin DIN plug to connect to the motor. Push one button and it moves one way, push the other and it moves the other way.

I took this controller apart and using a voltmeter, figured out which wires went to which button and which pins on the DIN plug. The circuit is simple and requires two momentary contact switches that have normally opened and normally closed positions (NO and NC). When you press a button, it flip flops the voltage from +24 to -24 and the controller inside the motor moves it accordingly. Although it does not appear in these instructions, I spent a LOT of time ensuring I understood how this worked before cutting it apart and hacking into it with my Arduino because the actuator costs about $250 and I didn't want to buy a new one.

I figured an Arduino Uno R3 mega would be a good device to control the door, along with a 2 relay board from sainsmart that had NO and NC positions and a YWrobot piezo electric microphone to listen for secret knocks.

The actuator has limit switches at both ends of the track that automatically stop it even if you keep pressing the button. However, these switches are not adjustable. That is, you can't move the stop point to, say, 10" from the end of the track. If you watch the movie, the 40" travel is more than necessary to open the door. I only needed it to open the door far enough to get to the edge of the bookcase trim, which is fixed in a frame around the sliding part of the bookcase -perhaps 34". In addition, the actuator is a little slow so you don't really want to wait for the bookcase to open, then slide unnecessarily far into the opening before reversing it to close the door.

I figured I could program the Arduino to substitute for the limit switches. First, because the door travels to the far end of the track to close, I simply programmed the Arduino to close the door for longer than it should take. The travel to close it is about 18 seconds, so I activate it for 25 seconds to make sure it gets to the end. When the door is commanded to open, it runs for 18 seconds - just long enough to clear the door opening but not run to the end of the track. If the relay gets stuck, it will simply open the door too far and the limit switches will stop it.

If you watch the video, you'll see that there is no hardware switch to allow you to exit the room. The secret knock is the only way out. If the microphone fails, you'll have to disconnect the bolt and open the door manually. So, I'm adding a "Press to exit" pushbutton that will be mounted on the wall just inside the doorway so the room occupant can command the door to open or close. I'll wire it in series with the secret book switch (which is in the Normally Closed position when stowed). That way, I have an emergency stop and reverse button on both sides of the bookcase.

Step 4: The Arduino Circuit and Software

The requirement for the program was simple:

1. If a secret book (with an embedded microswitch) was pulled, open (or close) the door.

2. If a secret knock pattern is detected, open (or close) the door.

I'd never worked with or programmed an Arduino before, but I did know how to program and found the Arduino to be super easy to work with. It came with tons of short, easy to understand examples that did the exact things I wanted - operate relays and listen to microphones. By experimenting in bits, first with getting the system to just open and close the correct relays, then getting it to listen to knocks, I was able to incrementally build a custom program that operated the door.

Secret book activation

Getting the Arduino to operate the door was easy. I wired a momentary contact microswitch to the Arduino that is in the Normally Closed position when the weight of the book is on it. When you tip the book back, the weight comes off the switch and opens the circuit. The Arduino detects this and checks a door state variable to see if the door is open or closed. This triggers the code to operate the correct relay to open or close the door.

The main loop of the code checks just two things - what is the state of the push button and is that state the same as it was the last time it was checked? If it is, then the book has not been activated, so listen for a knock. If a knock is heard, branch off to a function to listen for more knocks to see if they match the secret code.

Knock detection

For the secret knock code, I am forever indebted to Grathio labs for an instructable for how to build a secret knock detecting lock out of an Arduino. Using the code posted, I was able to re-use the secret knock detection algorithm without having to create one on my own. I owe you guys a beer! The most challenging part of reusing the code was to insert it in my program. I didn't include a programming switch to allow me to change the knock code for simplicity reasons. So, I used the part of their code that listened to knocks, output the values to the serial monitor and then hardcoded them into the program. Not flexible, I understand, but I wanted something simple and straightforward.


I wanted to add safety features so the door could be suddenly stopped and reversed if necessary. If you use the book to activate the door and fail to return the book to it's stowed position within 3 seconds, the door stops. Also, if you pull the book again after 3 seconds, the door will stop. If you pull the book one more time, the door will reverse.

I thought someone besides me might play with the door and accidentally get caught in it. I figured the most likely thing someone would do if they pulled the book and the door started opening unintentionally would be to pull the book again hoping to stop the door. That's what happens.

By requiring the book to be returned to the stowed position within 3 seconds, the person that pulls the book is required to let go of it, meaning their hand is free of the book itself. The bookcase takes 18 seconds to open, so there's plenty of time to get your hand out of the way. I'm mindful that relying on software for safety is a bad idea, so the opening for the bookcase is wider than the bookcase itself. I'm pretty sure a hand could be easily pulled out just by pushing the bookcase backward (into the room) even if the bookcase closed fully. The springs would exert pressure on the hand but I doubt enough to break or trap it permanently. On the room side, the opening is also wide enough to pull a hand out.

Exit push button for room occupant

Since publishing this instructable, I added an exit pushbutton to allow the room occupant to exit easily. Without the exit pushbutton, the only way to close or open the door from the room side is by using the secret knock. I found the push button on eBay for about $20. It is a momentary contact button that has both normally closed and normally open (NC/NO) pins on it. I wired it in series with the bookcase pushbutton. That way activating either button causes the door to operate.

Since pushing the button causes the door to stop, and pushing it again causes the door to reverse, the button is useful when entering and exiting the room. You don't have to wait for the bookcase to fully open or close before reversing it with the button. You cannot interrupt the door opening or closing sequence using the knock, so the button saves a bit of time.

The button will light if you supply it with 24 volts but I don't plan on lighting it up. I'd have to wire up a separate power supply and run the cable to the light and it's not worth it. The button is quite visible and says "Push to Exit" on it. That is sufficient.

Connecting the relay board and microphone

The actual connections for the components are detailed in the software comments but here they are:

1. Relay board: Relay 1 connects to Pin 7 on Arduino. Relay 2 connects to Pin 8. Connect relay board also to the ground and 5v on Arduino.

2. Microphone: Connect to ground, 5v, and OUT pin to analog A0 (zero) pin on Arduino.

3. Book microswitch: Connect common and Normally Closed to digital pin 2 and ground. Doesn't matter which connects to pin 2 or ground.

4. The relays have to be connected to the cable that goes to the DIN plug for the linear actuator. After figuring out how the handheld controller that came with the actuator worked, I bought a duplicate cable with a DIN plug on it so I could preserve the manual controller and have it as a backup in case the Arduino fails.

**Note: the wire colors I show may not be the same if you try to duplicate this!!!! If you wire the controller incorrectly, you will likely burn out your motor controller on your expensive linear actuator!!! You should INDEPENDENTLY confirm this works for YOUR actuator. DO NOT SIMPLY blindly follow this picture***

5. Using the identical DIN cable I bought, I cut the cable to the DIN plug and separated and stripped the wires.

6. I soldered extension wires to the DIN plug wire pins shown in the diagram in step 4 to extend them to the relay board. I used heat shrink tubing (available at Radio Shack) over each soldered wire to keep them from shorting together. I used a small tube for individual wires, shrunk it, then used larger tubing to fit all of the wires inside and heat shrunk that to secure them together. I labeled each extended wire with a piece of tape so I knew which pin on the DIN plug it went to. I triple checked this by continuity testing them using my multimeter.

7. I connected each wire to the output side of the relay board as shown in the diagram, above. I also had to use a jumper wire from the normally open (NO) on relay 1 to the NO on relay 2 and the NC on relay 1 to the normally closed (NC) on relay 2 to duplicate the circuit that the handheld controller had inside it. These connections are screw terminal, so it was easy to connect them.

8. On the input side of the relay board, I ran connectors from the GND and 5V on the Arduino to the GND and 5V on the relay board. I connected the IN1 on the relay board to digital pin 7 on the Arduino and IN2 on the relay board to digital pin 8 on the Arduino.

That's all of the electrical work I had to do. I am in the process of adding one more pushbutton switch inside the room so the occupant can open the bookcase by pushing a button. I will wire that in series with the secret book button. Since that circuit is normally closed (NC), I'll use the NC terminals on the push button I add. When I push it, the circuit will open, the Arduino will detect it, and the bookcase will either open or close, as appropriate. (This is how the secret book button works now.

The code works great and I've included it here but you use it at your own risk. I am not a professional programmer and I take no responsibility for any use you may apply it to.

One odd issue with it is that the very first time after starting the program on the Arduino when you pull the book, nothing happens. The second time, it works perfectly and works perfectly after that. I'm sure there's logic in the loop that's causing that but it's too minor to run down. It only happens the very first time the program executes. Feel free to fix it and post the solution if it bothers you.

Step 5: Installation

After installation, I found that I hadn't allowed enough time for the door to open completely so I added a few more seconds and tweaked it to get it right. The Arduino is so simple to reprogram and remembers the program even when the power goes out, ideal for this application.

So far, the results have been good. In early testing, I had the knock sensor trigger the relays to open the door when I had a loud radio station playing and the DJ was talking. Fortunately, the software has a threshold adjustment and I turned it up quite a bit. That means you have to knock firmly, but so far I haven't had the door open unintentionally. The real test will be when we've had a few movie nights with the surround sound turned up.

Most people won't be able to build their own custom enclosure like I did, but the same techniques could be used to operate a hidden swinging bookcase door. There are a number of plans on the web that show how to build one of these and a smaller linear actuator could be attached to enable the door to be opened and closed by the actuator.

I'm really pleased with the results and unless you know the bookcase slides, you can't tell. If somebody told you there was a secret door and you went looking for it, you'd be able to figure it out, but I'm not concerned with that. This was simply for fun and definitely was a blast to assemble!

Be the First to Share


    • Instrument Contest

      Instrument Contest
    • Make it Glow Contest

      Make it Glow Contest
    • STEM Contest

      STEM Contest

    63 Discussions


    3 years ago

    I'm having a problem with the door opening and closing timing.. My actuator seems a little slower than yours and 18000 ms only opens about 10-12 inches. I increased the doorOpenTime and doorCloseTime to 30000 ms and it does open/close for 30 seconds. However still not enough.. I need about 45-50 seconds.

    The problem is when I update the open and close commands to anything past 30000 the actuator runs until the end. Not entirely problematic except the 'door opening complete' or 'door closing complete' never triggers and I am stuck in the loop and can't close the door without manually resetting the arduino board.

    Any suggestions? I did not wire buttons for emergency stop or a book trigger, I am using the knock sensor only.

    3 replies

    Reply 3 years ago

    There is a lot of code in the open and close loop that handles being interrupted. I'd take all of that out and just use delay(xx) to have the program wait for awhile before continuing and stopping the open or close routine where xx is the amount of time for the program to sleep.

    The likely issue is where it compares the end time to the door open time. Just strip all that stuff out and do something like:

    digitalWrite(relayOpenPin, HIGH); //operate the door relay

    delay(xx); //xx is how long to wait

    digitalWrite(relayOpenPin, LOW);

    Put the opposite code in the routine to close the door.

    I'll point out that you have no emergency stop mechanism now so make sure you have some give in the system to keep it from trapping something that gets stuck in there. I had a videogame box that stuck out and got trapped. I used the book to reverse the opening and got it out.


    Reply 3 years ago

    Did you ever add code to program your own knock? That's my next step..


    Reply 3 years ago

    That worked!! I will probably be adding the emergency stop and open later, I don't have the parts at the moment. I modified the code as follows. Thanks!

    //*************************** relay1Operate - Close the door *****************************

    void relay1Operate() {

    digitalWrite(relayClosePin, LOW); //intiates the door closing

    Serial.println("Closing door.");


    digitalWrite(relayClosePin, HIGH); //stops closing the door by opening the relay

    lastButtonState = buttonState; //keeps door from triggering when it returns to the main loop

    Serial.println("Door closing is finished");


    //************************** relay2Operate - Open the door ******************************

    void relay2Operate() {

    digitalWrite(relayOpenPin, LOW);

    Serial.println("Opening door.");


    digitalWrite(relayOpenPin, HIGH);

    lastButtonState = buttonState; //keeps door from triggering when it returns to the main loop

    Serial.println("Door opening finished");



    Excellent detailed instructions on everything! This is a top notch instructable! One question out of curiosity: I'm assuming you need a building permit to do this work (probably) If so, does the secret door end up being documented in the plans or assesments of your house? Or is it really a secret?

    5 replies

    Reply 4 years ago on Introduction

    This of course depends on your local codes.

    But at least for Ontario internal walls do not require a building permit, and I suspect most of the states is like that.


    Reply 4 years ago on Introduction

    It's a secret and I don't want to spoil the fun, however some cities may require you to inform your local fire station that you have a hidden room in the unlikely event of a fire, gas leak, meteor strike etc. Also your homeowners insurance would probably like to know as well, there might not be coverage for damage if the fire department did not know of the secret room. Other than that WAY COOL.


    Reply 3 years ago

    I was going to say the same thing: even if the LAW doesn't require you to tell your fire department about a secret room, it's wise to do so anyway. Firefighters have far too many horror stories already about frightened youngsters or mentally-handicapped adults whose instinctive response to something scary like a fire is to HIDE! If your local firefighters know where someone might be hiding (or unconscious due to smoke inhalation) then that person's more likely to be rescued in time.

    Also, is there an emergency "power's out" manual-opening method that works from the OUTSIDE (e.g.: to rescue someone inside who, for whatever reason, can't use the inside bolt-removal method)?


    Reply 3 years ago

    It's possible to access the room but not open the door from the outside. You can pull a bookcase on roller out of the wall, crawl in and then access the room through another bookcase on rollers. However, that's not a time sensitive emergency technique and anyone besides me wouldn't know it.

    Of course, if it's a serious concern for someone, just leave the bolt out and open and close it manually.

    AmyCat59Consider My Solution

    Reply 3 years ago

    Ah, but since the bookcase rolls back INTO the hidden room, any marks on the floor left by the casters won't show from the outside when the door's closed. Sorry, Inspector Clouseau! :-)


    3 years ago

    Does it have a stopping system? I mean what if for some reason you get stuck on the middle? Would it crush/hurt you? I know it is slow but what if?

    1 reply

    Reply 3 years ago

    No, it does not. However, the mechanism is connected to the actuator using rocking horse springs. This provides quite a bit of 'give' and won't crush you, but it probably will injure you. Recently I opened it and some video game cartridges got caught as it opened. The springs gave enough to keep from damaging the cartridge or the mechanism but I wouldn't want my hand in there.

    It would be a nice addition to include an ammeter sensor that would stop and reverse the door if it spiked. I don't have small children or pets, but it would be safer.


    4 years ago on Introduction

    For everyday use, I would suggest putting a button (or an audio pickup if you prefer to knock) at your desk for opening the door from inside. That way it will already be on it's way to being open before you reach it, thereby easing some of the wait time to open when exiting. Likewise, a hidden button, or whatever, at the other end of the hall will do the same thing for going in. Better than standing and waiting every single time. Keeping the current methods, as well, for impressing guests, of course.


    4 years ago on Step 5

    What happens when there is a power outage? How do you get out of your secret office?