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)
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.
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 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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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!
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
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
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)
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.
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.
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: