I’m an engineer at heart (and at work). Engineers have a tendency to try to optimize the things they touch—at a base level, this is simply a drive to make things work better. My wife and I have long joked about how I try to optimize everything and try to create systems in my life to both simplify things and make things more efficient. But jokes aside, I think that, when pursued intentionally and driven by core values, optimization is a worthwhile undertaking.
In subsequent posts, I’m going to attempt to document the various things I’m currently working to optimize in my life, including personal finance, digital interaction, daily routines, pool care, beer brewing, and more. This post serves more as an introduction to the overall topic of optimization.
Why Optimize?
The first question that optimization begs is, of course, why bother optimizing in the first place? Aren’t things going pretty well as they are? I would argue that they are not. As humans, we have an unfortunate tendency to fall into patterns without very much forethought. Whatever patterns we are already following in our lives, there is a very high chance that they are not operating very efficiently at all. Humans seem to collect habits, both good and bad, as a kind of default behavior, rather than as a carefully designed approach to life: this presents a very ripe opportunity for optimization.
What to Optimize?
If we are to approach the challenge of optimizing our lives, we first need to determine what to optimize. Not everything is a good candidate for optimization, but I think most, if not all, areas of one’s life are worth examining to see how efficient they are.
I want to take a moment to talk about efficiency. A lot of times, efficiency is used to mean purely an increase in productivity and profits—doing more in less time. But in this more holistic context from which I’m approaching general optimization, I mean efficiency in the sense that my time spent throughout the day is directed towards things that I value, rather than frivolous pursuits that are not aligned with my values. So, when deciding what to optimize, it’s helpful to start with a list of values around which to base your life.
Once you have a list of values, I think the best things to start optimizing are the obvious candidates in your day-to-day life that are completely misaligned with your values: if you value reading books, but you spend your free time playing video games instead of reading, that’s a misalignment that needs to be addressed.
After the obvious candidates, the rest of your day (and even your night) can be examined to see what tweaks can be made to bring all areas of your life more in line with your values.
When to Optimize?
The agile methodology has a lot of traction in the software industry because of its iterative approach to software development. Boiled down, the idea is to continually review and reassess throughout the process to ensure alignment with goals and to course-correct before going too far down the wrong path.
In a similar vein, my approach to life optimizations is not a one-and-done deal, where I jump head-first into the Most Optimal Approach, but rather an iterative process where small improvements can be made continually over time, gradually bringing my life more in line with my values, one area and one tweak at a time.
Additionally, a good time to look for inefficiencies is when adding or changing something in your life—by taking a proactive approach when entering a new season in life, you can avoid some (not all) of the human tendency for poor habit formation and get yourself on the road to more efficient, value-aligned behaviors from the get-go.
“The cost of a thing is the amount of what I will call life which is required to be exchanged for it, immediately or in the long run.”
For Christmas 2021, I was gifted an inclinometer to install in my 4Runner. It was an inexpensive model from Amazon, and in true fashion, I couldn’t help but disassemble it and make it my own. I made a few changes, starting with how it mounts.
The inclinometer, modded and mountedThe inclinometer at night, matching the rest of the green LED dash lights
Custom Mount
The inclinometer came with a flat mounting plate with an adhesive backing, but the dashboard in my ’92 4Runner doesn’t have a nice flat spot that would work where I could see it from the driver seat. Since I was in the process of installing some RAM Mount tracks, I decided to convert the inclinometer to work with the RAM Mount system instead.
The original flat mounting plate
Thankfully, the original mounting plate just snaps off the back, leaving a nice flat surface to work with. Using the RAM base as a template, I marked and drilled 2 holes for the screws.
Holes drilled and parts laid out
Note that I mounted it slightly off-center to leave room for the square hole, which is a notch for the wires to hook on inside. The offset also worked out well for positioning it in the vehicle, moving it slightly further away from my phone mount.
The new RAM base installed
A couple of additional pieces are necessary to mount this on a RAM track: a T-track ball mount and a double socket arm
LED Lighting
The single factory incandescent bulb wasn’t cutting it for me since it didn’t match the other green LED dash lights I had put in place. Fortunately, it was pretty easy to replace the bulb with a strip of green LEDs with a soldering iron. The bulb was mounted to a board with the power supply wires soldered to it. I could reuse the board for the LED strip, so I desoldered the wires and bulb.
Desoldering the wires and incandescent bulb from the board
Then I soldered the wires to the LED strip, peeled off the protective backing, and stuck it to the board.
The LED strip attached to the board with wires soldered to it.
Then it was just a matter of reinstalling the board in the inclinometer like it was before.
The board reinstalled with the LED strip
To get power to the inclinometer, I drilled an extra hole in the dash inside the RAM mount track where I could feed the wire. Then, I actually disassembled a T5 LED bulb (size 74 factory bulb) and soldered a couple of lead wires on it so that I could easily plug it into a factory dash bulb location. Since my Midland MXT115 GMRS radio is now where the ashtray used to live, the ash tray bulb socket wasn’t being used, making it the perfect candidate to tie into and keep tucked behind the radio.
Modified T5 LED bulb with lead wiresThe inclinometer illuminated with the green LED strip
Cost
The inclinometer was free to me, but RAM Mount parts aren’t terribly cheap. However, they’re such a great product, this was one of those “buy once, cry once” situations in my book. That said, see if you can buy them on eBay with free shipping since RAM Mount charges a lot for shipping!
Last weekend, we attended Rendezvous in the Ozarks for the second year in a row. It was rainy the first couple of days, so we brought along a 10’ x 10’ canopy to give us cover between our ground tent and the back of the 4Runner. But man! that thing is heavy and bulky.
So when we got back from camping, I started looking into alternatives. There are lighter-weight canopies out there, and also a really cool product called the MoonShade, which is basically a fancy lightweight vehicle awning. But I’m overlanding on a budget, and $325 is a bit steep for an awning. Enter the DIY Poor Man’s MoonShade.
The basic concept consists of a tarp with one side affixed to the vehicle and the opposite side supported by 2 poles. Since I want this to come off the back of the 4Runner, and it’s pretty narrow, I also need a strut to hold the tarp out wider than the 4Runner, similar to the MoonShade’s solution. I also want to run guy lines from the corners to help keep it taut.
Fiberglass tent pole repair kit with crimped ferrules. That last part is important because it allows the pole to insert into the tarp grommets.
2-4 Tent stakes
2 Carabiners (optional)
X ft of paracord
The nice thing about fully adjustable tent poles is that you can set up one slightly taller than the other, or both shorter than the vehicle, to create a slope to shed rain.
The tent pole repair kit was the key piece to this puzzle for me. I was having trouble finding a double-ended tent pole with 2 pins for the grommets like the MoonShade has, and was seriously considering fabricating something myself until I stumbled across this kit with enough poles and pieces to make exactly what I needed.
Build
The main thing that needed to be built was the strut. I assembled the tent pole pieces and laid them out on the 8’ side of the tarp, with the pin end in one of the grommets, and set the other pin end in the opposite grommet to see where to cut the last tent pole section, marking it with a pencil.
Measuring to cut the fiberglass tent pole
Then I cut the tent pole section with a hacksaw, sanded the cut end, and fully assembled the tent pole with the provided shock cord. I tied the shock cord after the pin ends so the whole assembly is contained, and melted the ends of the shock cord to keep it from fraying.
Shock cord tied after the pin endThe completed strut
I also needed a way to affix the strut to my vehicle. MoonShade offers a variety of attachment methods, but since I have a roof rack, I kept it simple and used a couple of tarp ball bungees to hold the strut to the roof rack. In my case, the tarp grommets lined up pretty close to the sides of my roof rack, so I loop the ball bungees through those as well to hold everything together.
Ball bungee in the background holding the strut and tarp to the roof rack
The last piece is the guy lines. I measured out paracord with enough length to tie taut-line hitches for adjustability and tied them permanently to all 4 corners of the tarp. On the vehicle side, I actually attached these to my roof rack with carabiners, but they’re long enough I could stake them to the ground instead.
Guy lines attached to the roof rack
The far side is supported by the telescoping tarp poles and held taut with guy lines staked to the ground.
The Poor Man’s MoonShade
I need to play around with tensioning to make sure water doesn’t pool in the center, but overall, I’m really happy with this build. It’s easier to set up with 2 people, but I can tear it down by myself in just a couple of minutes, which is a lot faster than my 10’ x 10’ pop-up canopy!
When I swapped a 3.4 engine and ECU into my 4Runner, the donor vehicle had an automatic transmission, and the ECU expected to see signals from the automatic transmission solenoids. Without those signals, it would illuminate the check engine light, masking any real issues I may need to investigate. To avoid that, the signals can be spoofed or simulated using resistors. All that’s needed is a little wiring and soldering.
Supplies
(3) 15 ohm power resistor, rated for 25W or higher
(1) 5 ohm power resistor, rated for 50W or higher
18-20 AWG wire
Project box or mounting surface
Tools
Wire cutters/strippers
Soldering iron and solder
Pinout
A 3rd gen 4runner auto ECU will have 5 pins for the Electronically Controlled Transmission (ECT) Solenoid. In a 2002 4runner, these pins are as follows:
SL (Connector E9 Pin 1, LG)
S1 (Connector E9 Pin 3, P-L)
S2 (Connector E9 Pin 2, L-W)
SLT+ (Connector E11 Pin 5, R-Y)
SLT- (Connector E11 Pin 11, Y-B)
Diagram for 2002 4Runner with automatic transmission
The SL, S1, and S2 wires all go through the solenoids to ground. The SLT+ wire goes through the solenoid and back to the ECU to the SLT- pin.
You will need to look at the Electronic Wiring Diagram (EWD) for your 3.4 engine’s model year and confirm the ECU pin locations and wire colors because they vary by year.
Theory
Each solenoid has a range of resistance and voltage that the computer expects to see.
The SL, No. 1, and No. 2 solenoids all have a resistance of 11–15 ohms, and range in voltage from < 1.5 V to 9–14 V, depending on which gear the auto transmission is currently in. Using the formula I = V / R, we can therefore calculate the maximum wattage as 14 V / 11 ohms = 17.8 W. To be safe, I rounded this up to be able to dissipate at least 25 W of power.
The SLT solenoid has a resistance of 5.0–5.6 ohms, and pulses between < 1.5 V and 10–12 V when the engine is idling. Consequently, we can calculate the maximum wattage as 12 V / 5 ohms = 28.8 W. I rounded this up to safely dissipate at least 50 W of power.
Based on this information, we can use 3 power resistors rated for 15 ohms and 25 W to spoof the SL, No. 1, and No. 2 solenoids, and we can use 1 power resistor rated for 5 ohms and 50 W to spoof the SLT solenoid.
Build
Essentially all that needs to be done is soldering wires to the resistors and then connecting the wires to the ECU and ground accordingly.
The wires to the ECU connectors should ideally be joined with a lineman splice to the connector wires and then soldered. This will create a very strong connection to avoid signal interruption to the ECU. Optionally, instead of a direct splice, the wires can be crimped and soldered to terminals or a multi-pin connector so that the simulator can be easily removed from the ECU.
Prototype of the simulator. Notice how the brown ground wires are chained together at the bottom. The wire nuts are very temporary and shouldn’t be used long-term!
There are 2 options for the ground wire coming from 3 of the resistors:
Run it directly to a bolt on the chassis for a direct ground
Splice it into the ground wire coming from the ECU
I opted for option 2 to keep everything ECU-related contained and not have another ground point to worry about.
Testing
Once everything is wired up and the simulator is connected to the ECU and properly grounded, then the ECU should no longer through a Diagnostic Trouble Code (DTC) related to the automatic transmission solenoids. You may need an OBD-II port connected to your ECU to verify this, but if this was the only issue causing the check engine light to illuminate, then the check engine light should no longer be on!
Cost
This was a pretty cheap fix. I only needed to buy the power resistors, and was able to use wires and hardware I already had on hand.
15 ohm power resistors: $15.60
5 ohm power resistor: $7.70
Scrap wires: free
Wood mounting plate: free
Wire nuts: free
Total cost: $23.30
I’m planning to revisit this mod in the near future to tidy it up and move it to the engine bay. The resistors still get pretty toasty, so I’ve slipped the whole assembly into an old coffee can that sits on the passenger floorboard for now so my wife doesn’t burn her foot!
One of the (few) flaws of the 2nd gen 4runner, in my opinion, is the lack of a drip rail above the rear window. Even if the rear of the vehicle is under cover (such as my Poor Man’s MoonShade), if the rear window is open, rain on the roof will run straight into the cargo area!
I should be able to open the rear window under cover without getting rain in the back!
I spent several hours trying to find someone else who had solved this problem before, and maybe my Google-fu is getting rusty, but I was surprised that I couldn’t find anyone else doing something about this!
I think the ideal long-term solution would be to weld a proper drip rail above the window, but I don’t have a welder, and I’m not prepared to strip and repaint. Maybe someday…
What I did find, though, was a product called RV rain gutter, which is essentially J-channel rubber molding that can be applied above windows and doors on an RV to solve this same problem.
Old toothbrush (for pressing the gutter into place)
Build
This build was really straightforward, and I basically just followed the instructions that came with the RV gutter. I cleaned the area to which I was going to apply the gutter, then rubbed it down with isopropyl alcohol and quickly dried it to get it extra clean and ready to accept the 3M adhesive strip. Then I laid out masking tape right below where I was going to put the channel.
Masking tape as a guide for the drip rail
I have a window wiper assembly above my rear window, so I didn’t have a lot of room to work with, and basically mounted the drip rail immediately above the wiper. I ran the channel around the corners on either side towards the windows, where there’s a vent that handles drainage already. This gets the rain completely out of the way of the rear window and allows it to drain down the sides of the vehicle.
Look ma, no water in the back!
I tested it out by pouring a jug of water on the roof and watching it run down with the rear window open. I was very pleased that no water made it into the cargo area!
Cost
The only thing I had to buy for this project was the RV gutter itself, which was $14.74. Cheap, easy, and effective!
I’m just getting into more serious home automation and playing around with Home Assistant, and while I don’t have very many smart devices yet, I do have a cheap WiFi LED controller by Magic Home. When I first got it, I used the companion app, which was terrible, and I hated having to have separate apps for everything. As I dove into configuring Home Assistant (HA), I decided to see if there was a way to magic that controller work with HA—and it turns out, there is!
By flashing ESPHome firmware onto the controller, it becomes immediately discoverable by HA and no longer requires a separate app to manage. Now, it’s still a WiFi controller, and I don’t like the idea of saturating my WiFi network with smart devices, but I already have it so I decided to make it work.
Prep the controller for flashing
The first thing I needed to do was prep the controller to be flashed. I popped open the plastic enclosure, and identified the chip as an ESP8285, which is a version of the classic ESP8266 with 1MB of flash memory built in. This was good news and meant I should be able to flash my own firmware on it.
Magic Home WiFi LED controller opened up
On the back of the controller were several solder pads. After scouring tutorials online, I determined the ones that I needed for this project were labeled TXD, RXD, IO0, and GND. I went ahead and soldered solid-core wire leads to each of these pads.
Leads soldered onto the Magic Home LED controller
Use an Arduino as a serial converter
Next, I needed something that could talk to the controller. You can use a USB-to-UART or USB-to-TTL cable to do this, but I didn’t have one on hand. What I do have is an Arduino Uno that doesn’t get much love, and it turns out to be a pretty simple task to turn an Arduino into a serial converter.
The Arduino has TX (transmit) and RX (receive) pins. Normally, any communication would need to go through the Arduino’s ATmega328P chip, which would involve writing a sketch and uploading it to the Arduino. However, there’s another option: you can jumper the Arduino’s RESET pin to GND (ground) and bypass the chip completely, giving you direct access to the Arduino’s USB-to-TTL converter and thus TX and RX pins over USB.
The Arduino wiring is pretty simple here. I used a breadboard to lay things out really cleanly.
JumperRESET to GND.
Run a wire from GND to the negative rail on the breadboard.
Run a wire from TX to a terminal strip on the breadboard.
Run a wire from RX to another terminal strip on the breadboard.
Run a wire from the negative rail to a 3rd terminal strip on the breadboard.
Run a second wire from the negative rail to a 4th terminal strip on the breadboard.
Arduino connected to the Magic Home LED controller
This may be a bit excessive with the breadboard, but it made it really easy to connect the leads from the controller, especially as I played around with it to get it working correctly.
A note on TX and RX serial connections
Normally, when connecting serial devices together, the TX pin of one device is connected to the RX pin of the other. This is so when the first device transmits (TX), the other device receives (RX) that transmission.
However, for this project, since I’m accessing the Arduino’s built-in USB-to-TTL converter directly instead of going through the ATmega328P chip with a sketch, I needed to connect the TX pin on the Arduino to the TXD pin on the controller instead of the RXD pin, and likewise the RX pin on the Arduino to the RXD pin.
This is because the Arduino pins are labelled from the perspective of the ATmega328P chip: a serial message would be received on the Arduino’s RX pin, which in turn is mapped to the USB-to-TTL converter’s TX pin, as in normal serial communication. Same for transmitting: the Arduino’s TX pin is mapped to the converter’s RX pin. Since we’re bypassing the ATmega328P chip completely, the Arduino’s RX pin is effectively the converter’s TX pin.
Normal operation with ATmega328P chip
USB-to-TTL converter
ATmega328P chip
Serial device
RXD
TX
RX
TXD
RX
TX
Bypass operation
USB-to-TTL converter
Arduino board
LED controller
RXD
“TX”
TXD
TXD
“RX”
RXD
Connect LED controller to Arduino
With the clean breadboard layout, it’s now a simple task to connect the LED controller to the Arduino via the breadboard. Effectively, the pins map like so:
Arduino board
LED controller
TX
TXD
RX
RXD
GND
GND
GND
IO0
The LED controller’s IO0 pin needs to be grounded for the controller to boot in “flash mode” to allow us to flash the firmware.
A note on voltages
The Arduino operates on 5V, while the LED controller operates on 3.3V. I read several tutorials that strongly recommended stepping down the voltage sent to the TXD pin on the controller from 5V to ~3.3V, but I was unable to communicate with the controller when using a voltage divider circuit. The only way I was able to make it work was using a direct connection with the full 5V. If you do this, continue at your own risk! It could damage the controller.
Build the custom firmware
To create the firmware, I used ESPHome through Home Assistant. Once ESPHome was installed as a Supervisor Add-On in HA, I went to Supervisor → Dashboard → ESPHome → Open web UI and clicked the + button to add a new “node”.
I gave it a name and WiFi information so it could connect to my home network, and selected ESP8266 as the ESP device.
Once the node is created, I clicked Edit to edit the YAML. It should already have the basics, and I only needed to add the following snippet at the end to be able to control the LED strip. Note that my controller and strip are only for single-color LEDs; you can set this up for RGB LEDs too with a little more configuration. ESPHome has lots of documentation.
# Define the light component
light:
- platform: monochromatic
name: "Monitor Backlight"
output: output_component1
# Define the output to control the LEDs
output:
- platform: esp8266_pwm
id: output_component1
pin: GPIO12
The real key piece in that snippet is the last line: pin: GPIO12. This tells the firmware to use IO pin 12 to control the LED strip, which I managed to find documented here. There are other Magic Home models on that site as well. For RGB LEDs, for example, you would need to control 3 pins.
Once I edited the YAML, I clicked Save and then Install. Since I’m manually flashing the firmware over USB, I selected Manual download, which compiles and downloads a .bin (binary) file with custom firmware generated from the YAML.
Flash the firmware to the controller
All the pieces are coming together now! The last step is to actually flash the new custom firmware onto the LED controller. Start with everything disconnected from power. Plug the USB cable into the Arduino and computer. Then, plug the LED controller into its power source. With the IO0 pin grounded, it should boot up in flash mode and be ready to receive the firmware.
I used esptool.py to flash the firmware. It’s developed by Espressif, the same company that makes the ESP8266 chip. I’m on a Mac, so I used these steps to install and run it using Terminal.
The documentation states that the flash should be erased before writing in order for it to be successful. However, I didn’t find that to be the case. I was able to write only without erasing, and it ran successfully.
The --port /dev/tty.usbmodem14101 options specifies which serial port to use. The value should match what you found by running ls /dev/tty.usb* in the previous step.
The -fm dout option tells it to use the “dual output” flash mode. There are other modes described here which I did not try, but this mode worked for me.
The 0x00000 option tells it to write the firmware starting at the very first memory address.
The monitor-backlight.bin is the name of the firmware file that was compiled and downloaded by ESPHome. I ran this command from the same folder the file was in, but you may need to provide a path to the file here rather than just the filename.
If everything works successfully, you should see output similar to this:
esptool.py v3.1
Serial port /dev/tty.usbmodem14101
Connecting...
Failed to get PID of a device on /dev/tty.usbmodem14101, using standard reset sequence.
.
Detecting chip type... ESP8266
Chip is ESP8285N08
Features: WiFi, Embedded Flash
Crystal is 26MHz
MAC: d8:f1:5b:a2:9c:9a
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00065fff...
Compressed 417792 bytes to 290846...
Wrote 417792 bytes (290846 compressed) at 0x00000000 in 25.3 seconds (effective 132.2 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
Test the controller
After a successful flash, disconnect the LED controller from power, disconnect the Arduino, and remove the LED controller leads from the breadboard. Connect the controller to power again and to the LED strip.
If the firmware was configured properly, you should be able to go to Supervisor → Dashboard → ESPHome → Open web UI and see the device come online in a few seconds automatically
Magic Home LED controller connected to ESPHome in Home Assistant
That’s it! The LED controller is now available to be added as an integration in Home Assistant, and then a card can be added to the dashboard to control it. I used a button card to turn it on and off, and I added automations to turn it on and off and set it to different brightnesses.
Recently, the rear window on my 2nd gen 4Runner started intermittently not rolling down. Pretty soon, it was intermittently working and usually didn’t work at all. When it worked, it worked great, but when it didn’t, nothing happened, so I knew it wasn’t the window motor. Since I could hear the rear window relay click when I turned the key in the tailgate, I suspected the contacts had worn out and the relays needed to be replaced.
(If you’re diagnosing rear window issues, 4Crawler has a great troubleshooting page that I found really helpful. It’s geared toward 1st gen 4runners, but most of it is applicable to 2nd gens as well.)
I had actually already replaced the rear window relays about 3 years ago, but I used some cheap Chinese relays from Amazon that weren’t built to last. This time I ordered 4 Panasonic relays from DigiKey. They’re a drop-in replacement for the original relays and are rated for 10A instead of 6A so they should last quite a bit longer.
2 relays removed, 2 of the cheap Chinese relays in blue, and the 2 original larger relays at the bottom (never replaced).
This is a cheap fix to a common problem. I only paid $12.66 for these high-quality relays from DigiKey, half of which was shipping, and I already had all the tools. If you have to buy a soldering iron, solder, and flux, you might spend $30 or $40 total.
Accessing the Relay Box
The first problem was that my window was rolled up, and I needed to open the tailgate to get to the relay box. To solve this, I ran jumper cables from the battery into the cargo area, popped off the tailgate panel inside, and used some alligator clip jumpers from the jumper cables to the pins on the rear window motor plug to roll the window down. Kind of a pain, but it worked!
With the tailgate open, I pulled off the trim along the bottom edge of the cargo area, and then pulled back the driver side quarter panel trim, just enough to access the bolts holding the relay box to the body. The relay box unplugs from the connector and then there are 3 enclosure pieces that pop off in order to slide the circuit board out.
You can see the quarter panel trim pulled back to access the relay box.
Replacing the Relays
Once I had the circuit board free, I warmed up my solder sucker, dabbed a little flux on the joints, and proceeded to remove the solder from the old relays.
You’ll notice on the circuit board that the relays are labeled. By examining the wiring diagram and doing some probing on the circuit board, I worked out the following:
RY3 is the window up relay
RY4 is the window down relay
RY5 and RY6 appear to be for the rear washer
RY1 and RY2 appear to be for the rear wiper
I went ahead and replaced RY3, RY4, RY5, and RY6 since they were all the same cheap relays I had replaced before. If you’re only having problems with the window itself, you can probably get away with just replacing RY3 and RY4.
I highly recommend a solder sucker, desoldering iron, wick, or braid to remove the old relays. It’s not necessary, but it makes the process a lot faster and cleaner. Flux isn’t necessary either, but it helps.
With the solder removed, the old relays should pop out pretty easily with a little wiggling.
Old relays removed from the circuit board using my solder sucker.
The new relays fit snugly in the holes, so I didn’t end up needing a third hand. I had to re-tin my soldering iron but then I was able to quickly solder the pins to the board.
Be sure to use proper technique when soldering on the circuit board, since it is easy to damage the board. Make sure the soldering iron is clean and properly tinned first. Then get a bit of solder on the end of the iron, hold the relay pin in place, and touch the soldering iron to both the pad on the board and the pin. The solder should flow onto both the pad and the pin to make a solid connection. Let it cool without moving the pin, then move onto the next pin.
New relays installed on the circuit board.
With the new rear window relays installed, reinstall the relay box and test out the rear window. If the relays were the problem as they were on mine, it should be working like new now!
Switch Mod
While I had the circuit board out, I took the opportunity to do the switch mod that allows me to roll down the rear window using the switch in the center console without having the key in the ignition. Since using the key in the tailgate doesn’t require the ignition switch, it’s simply a matter of jumping the pins used for the tailgate switch to the pins used for the console switch.
For the 2nd gen 4runner, the following pins are jumped:
I chose to jump the pins on the top of the circuit board by soldering some copper wire across the connector leads, but it was pretty tricky to solder pin 17 this way. Alternatively, you could jump the pins on the bottom of the circuit board where the connector isn’t in the way.
This mod worked great and really makes it easier to access the back without using my key at all. It also sets me up to install a future mod: an additional rear window switch located in the cargo area, so I can easily roll down the rear window if I’m sleeping in the back.
Bonus: Tailgate Access
As an aside, once you have your rear window working, if you need to roll it up to access the guts of the tailgate while it’s open, you can disconnect the 2 rear window lock switches located on either side of the tailgate, and then roll the window up with the switch. This is handy for accessing the key switch in the tailgate from the inside. Careful not to roll it up too far, though!
Driver side rear window lock switch disconnectedPassenger side rear window lock switch disconnected
After poring over service manuals and forums, I believe I’ve finally pieced together what should be a functional EVAP system for my 3.4 swap using the components that I’ve gathered. I came up with 2 options: one using the 3rd-gen 1998 charcoal canister, and one using the original 2nd-gen 1992 charcoal canister.
General Approach
Overall, the goal is to build a system that satisfies the ECU’s EVAP-related inputs so it doesn’t throw any codes.
In both scenarios, I made use of following parts:
2002 ECU
2002 VSV for EVAP
2002 VSV for CCV (Canister Closed Valve)
1999 VSV for VPS (Vapor Pressure Sensor)
1999 VPS (Vapor Pressure Sensor)
The wiring is the same between the two systems, and the hose and vacuum lines are virtually the same as well. The primary difference between the two is the canister used, and how the VSV for CCV is hooked up (or not hooked up).
The biggest challenge to actually piecing this together will be adding connectors for the VSV for VPS and VPS, since I don’t currently have those on my wiring harness. I’ll either need to source replacement connectors from the right year (preferable) or just use terminals on the pins (not as clean).
Using the 1998 Charcoal Canister
Diagram with 1998 box-style charcoal canister showing wiring, hose routing, and air/vapor flow.
With the 1998 box-style charcoal canister, the setup is essentially the same as a typical 1996-2000 EVAP system. The primary difference is the addition of the VSV for CCV off of the 2002 harness, which my ECU expects to see.
The two tees in the fuel vapor lines shown in the diagram are actually integrated into the EVAP canister itself, so there won’t be any tee fittings to install.
Using the 1992 Charcoal Canister
Diagram with 1992 cylinder-style charcoal canister showing wiring, hose routing, and air/vapor flow.
With the smaller 1992 cylinder-style charcoal canister, the system is mostly the same, but there isn’t a dedicated fresh air intake on the older canister, so the VSV for CCV can’t be hooked up. It will still be plugged into the ECU, but the hoses on the VSV will either be capped or removed completely, depending on what the ECU likes best. At least one person said it doesn’t have to be hooked up at all, but I like to avoid unused plugs if possible.
Additionally, the tees in the vapor lines shown in the diagram will actually require tee fittings since they are not integral in the older style canister.
Several of the parts I need are now packed in a box as we’re about to move across the country, so it may take me a bit to actually get around to installing the EVAP system for my 3.4 swap. Plenty of time to decide which option to go with, though!
When I did the 3.4 engine swap in my 4Runner, I didn’t pull over the EVAP system from the donor vehicle, so I’ve been running without one for a few months now. My donor vehicle for the swap, a 2002 4Runner, had the newer style EVAP system located back by the fuel tank, something I didn’t want on my ’92. Since then, I’ve acquired the older style 3rd gen EVAP canister and VSVs (Vacuum Switching Valves), and I still have the original ’92 canister, and I’m trying to piece together Frankenstein’s EVAP system from all these parts to work with my swap.
Parts
Here’s what I have to work with:
2002 engine wiring harness
2002 VSV for EVAP
2002 VSV for CCV (Canister Closed Valve)
1999 VPS (Vapor Pressure Sensor)
1999 VSV for EVAP
1998 EVAP canister (larger box style)
1998 VSV for VPS (Vapor Pressure Sensor)
1992 EVAP canister (smaller cylindrical style)
1999 VPS (left) and VSV for EVAP
I saw a few places reference the “VSV for EVAP” part as the “Canister Purge Solenoid,” which may come in handy when looking for replacement parts.
2002 VSV for EVAP (top left) and VSV for CCV (top middle), with hoses
Process
First, I had to figure out what plugs I had available on the 2002 engine harness to work with. Using the 2002 wiring diagram, I was able to locate the plugs for the VSV for EVAP and the VSV for CCV.
2002 engine harness plugs for the VSV for CCV (left, background) and VSV for EVAP (right, foreground)
However, the other 2 plugs were part of the body wiring harness on the donor car which I did not keep, so I’ll need to do some extra wiring work to hook up the VPS and VSV for VPS.
Check out Part 2 as I map all of this out and figure out how to hook it up so my 3.4 swap can have a working EVAP system!
I recently installed a CB radio in my 4Runner. It turns out that certain smaller CB radios, like the Uniden PRO520XL that I used, fit perfectly in the ashtray location. I put together a short video on how I did the install, and I’ve included a few extra details below.
I’m actually running a 4′ antenna, not a 5′ like I said in the video. I also forgot to mention that you’ll probably need a right-angle connector for the antenna on the back of the CB (you can see it when I’m test-fitting the radio) in order to fit inside the dash. Mine is right up against the back with the right-angle connector and there wouldn’t have been enough room without it.
Be sure to tune your antenna before you use the radio! The video below has great instructions on how to tune your antenna. For tuning, I used the following additional parts: