A quick and dirty vehicle entry/start sketch for Arduino
-
Your ring or your reader work really fine, I have a PN532 reader from aliexpress (a clone for 14$) and the read is not effective (I have to rub the ring against the antenna to try to read). But maybe it's the ring tag.
What is the maximum current in your relay? I use a 30A relay because I don't know the instantaneous current to the contact closure, maybe you know that?
-
Hi @MrStein, the latching relay is 30v/3a for the contacts, it's triggering the vehicles relay switched ignition state so it should be fine for that. The momentary relay is 30v/5a, triggering the vehicle starter relay. It's bigger than the latching relay, but is the smallest had in my parts bin!
I have noticed that my Pn532 sometimes doesn't like to read one of my inlays and almost requires rubbing at times, but the other inlay works fine at a distance. -
This is awesome, keeping a close eye on this! :)
-
lol, thanks for the vote of confidence there!
I've modified the hardware side of things a little bit since I took those photos, adding a transistor to trigger the starter relay (the relay has a 12 volt coil and the arduino wasn't coping with that directly from an output) and a couple of filter capacitors for the regulator on the in and out sides to smooth things out a little, there were mild voltage fluctuations. Nothing major, but it's always a good idea to do that and keep things clean.
The starter output from D2 is now running through one side of the latching relay on to the trigger transistor for the momentary relay coil after I decided that the best way to lock out engine cranking was in hardware.
This way the starter can only be cranked once the vehicle ignition is switched on via the latching relay. D2 can still be triggered if software allows it, but it wont go any further than the latching relay if that relay is in the off state.
At the moment I'm investigating methods to trigger D2 and keep it high while the ring is present until the engine is running. This is getting a little trickier than I'd first planned and might end up needing an extra input from the vehicle to exit the engine cranking portion of the program when normal running is achieved.For those who are interested, in the main unit I'm using:
- Panasonic DS2E-SL2-DC5V latching relay
- LZ-12H-K momentary relay
- MPSA42 NPN transistor
- L7805CV regulator
- 10uF electrolytic capacitors, x2
- Microduino equivalent to Arduino Pro Mini 5V
- PN532 NFC board
This is basically all stuff that I had floating around in my parts bin for random projects, you can substitute for things you have as long as they're equivalent. The latching relay I bought for around $10 each from mouser, everything else is a leftover from something else! The Arduino portion of this could also be pretty much any arduino compatible board, I'm using the microduino because I had them and they were small and convenient. The Elechouse PN532 reader is in my opinion non-negotiable. They're the only board I've had real success with reading the rings, most others are far too picky and have trouble reading the rings.
Either way, this just shows that you can build something usable out of very little! Get cracking, people, there are projects waiting for you to build them!
-
Good job!
Don't forget some flyback diode (free wheel diode in french, I don't no how to say that in english ^^') for the discharge of the magnetic circuit of the inductance (relays). -
Oh yes, good catch @MrStein , I'll do that now. I had totally forgotten that one! (Usually it was me telling the apprentices to do that with relays!)
I usually refer to it as a clamping diode, flyback or free wheel diode is perfectly correct as well though. -
So, I've progressed a bit in the last 5 days - my code is still just as awful but I've got the prototype unit to the point where I've test installed it.
Following are some photos and a short video of the starter in action!First I removed the housing for the steering column and located the ignition barrel (I've done all this for other things previously)
Next look at the back of the barrel and find the wires coming out, this bundle is what you need to link into. I've hooked in after the connector into the main loom, I recommend you hook in before that though.
Tapping into the loom is fairly simple. This soldering is not my best, but it will hold for now. Upside down with a gas soldering iron in a cramped space is difficult.
Tape up the joins as you go, as neatly as possible. You really don't want to short out against other wires or metal parts of the car, it can cause all sorts of issues.
And here we are, this is the connector for the points I'm now going to be controlling from the car starter unit. The wire doesn't need to be excessively heavy because power is mostly switched via relays in this vehicle already.
-
And here is a short video of the starter in action!
-
so fricking awesome!! Have to get me one of these things sorted
-
Thanks @NFCringTom , I'm pretty pleased with how it's progressing! Next step will be to cut the prototype board down to make it a bit more manageable, house it in a plastic case and then decide where I'm going to put the actual unit!
Everyone should note that the steering lock is currently intact and so you still require the key in order to drive anywhere - I'm looking at options for removal, I'll see if I can retrofit an electric steering lock from something else and then remove the entire ignition barrel permanently.
On my other car this wont be an issue as it has never had a steering lock. -
I've got a minor code update, I've re-written it to reflect what it's actually doing and made it so that a single inlay can switch through all three states - on, cranking, off.
It's still extremely rough and ready and if anyone else wants to do it better then go for it, I'd welcome the input.int triggerPin1 = 2; int triggerPin2 = 3; int triggerPin3 = 4; int carRunState = 0; #include <Wire.h> #include <PN532_I2C.h> #include <PN532.h> PN532_I2C pn532i2c(Wire); PN532 nfc(pn532i2c); void setup(void) { pinMode(triggerPin1, OUTPUT); pinMode(triggerPin2, OUTPUT); pinMode(triggerPin3, OUTPUT); Serial.begin(115200); Serial.println("Hello! I'm a Car!"); nfc.begin(); uint32_t versiondata = nfc.getFirmwareVersion(); if (! versiondata) { Serial.print(versiondata); Serial.print("PN53x key scanner board not online"); while (1); // halt } // Got ok data, report state Serial.print("Reader Online, "); // Set the max number of retry attempts to read from a card // This prevents us from waiting forever for a card, which is // the default behaviour of the PN532. nfc.setPassiveActivationRetries(0xFF); // configure board to read NFC tags nfc.SAMConfig(); Serial.println("Waiting for a valid key"); } void loop(void) { String ringUid; boolean success; uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) // Wait for an ISO14443A type cards (NFC Ring, Mifare, etc.). When one is found // 'uid' will be populated with the UID, and uidLength will indicate // if the uid is 4 bytes (Mifare Classic) or 7 bytes (NFC Ring or Mifare Ultralight) success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength); if (success) { // Display some basic information about the card // Serial.print(" UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes"); Serial.print(" UID Value: "); for (uint8_t i = 0; i < uidLength; i++) { Serial.print(".."); Serial.print(uid[i], HEX); ringUid += String(uid[i], HEX); } Serial.println(ringUid + "\n"); if (ringUid == "4db5e2b62880" || ringUid == "48fc02b62880" || ringUid == "4c9232b62880"){ Serial.println("Key accepted!"); } if ((ringUid == "4db5e2b62880" || ringUid == "48fc02b62880" || ringUid == "4c9232b62880") && (carRunState == 0)){ Serial.println("PERMISSION GRANTED, SYSTEMS ON"); digitalWrite(triggerPin3, HIGH); // sets latching relay trigger on for ignition mode in car to allow start delay(200); // waits briefly digitalWrite(triggerPin3, LOW); // removes latching relay trigger carRunState = carRunState++; } else if ((ringUid == "4db5e2b62880" || ringUid == "48fc02b62880" ||ringUid == "4c9232b62880") && (carRunState == 1)){ Serial.println("ENGINE CRANKING"); digitalWrite(triggerPin1, HIGH); // triggers output for engine starting delay(2000); // waits for a second digitalWrite(triggerPin1, LOW); // removes triggered output Serial.println("ENGINE CRANKING COMPLETE"); carRunState = carRunState++; } else if ((ringUid == "4db5e2b62880" || ringUid == "48fc02b62880" ||ringUid == "4c9232b62880") && (carRunState > 1)){ Serial.println("SYSTEM OFF, SLEEP TIME"); digitalWrite(triggerPin2, HIGH); // Trigger latching relay to reset for vehicle OFF delay(200); // waits briefly digitalWrite(triggerPin2, LOW); // Removes latching relay reset trigger delay(3000); carRunState = 0; } } }
-
I've chopped down the prototyping board to make the thing a bit easier to manage. It could be a lot smaller, but I'll leave it as it is for now in case I want to change anything more. In it's current state I'm going to temporarily install it in the vehicle and use it for a few days before making some permanent modifications to the car including removal of the steering lock.
For those who are going to cry "But easier to steal now dude" I have a well hidden GPS locator/remote disable unit installed. It'll text me if it moves and I can shut it down then find it. -
Using a single inlay to switch modes, temporary installation in the car.
-
Okay, 8 days later I've decided that while it basically works it needs two additional features - something to act as an interlock to stop the ring reading at all while you're in full flight and something to tell the arduino that the engine is already running.
During my testing I've had the arduino reset itself a few times which puts it back to the start of the cycle and means that instead of switching off the car it attempts to re-engage the starter motor. Not full of cool when you do that in public.
I'm thinking I'll take a feed from somewhere on the back of the instrument panel, probably the tachometer, and use that as part of the if statement for engine cranking and for shutdown.
The other thing I will do is use the handbrake as a lock-out for the reader unit, so that the reader itself will only work when the handbrake is engaged.
With those two issues out of the way I should be ready to do the nasty and remove the original ignition and steering lock. I may replace the lock at a later date if I can get my hands on an electric one. -
@Lokki This is great work so far my friend! You have touched on 2 of the issues I have wrapping my head around. One was the steering lock. I really would like to bypass the key altogether. Along that line was one thing not mentioned yet. If your car has a chip in the key. How to bypass it. It seems like you could tell the system the key was in using the arduino. The third and major issue of proper maintaining of states when in drive mode. That one reason why I wanted to incorporate my remote starter for this as it already performs this function. (And also can be used for unlocking the doors) Same issues would be that it still need the key turned to on in order for you to put it into gear after using fob and to unlock wheel. I imagine this scenarios. From in the car place tag over reader. Short pause move to on. Long pause move to on then start. Arduino tells proper circuit key is in and unlocks wheel. May need an electronic steering wheel lock. As I see it 'on' (and 'off') coding would point to ignition just as you said, but 'start coding points to pins running relay and stater fob. Hence engine will only stop while gear is in park. That way you can still use 2nd remote fob to start car, but wheel will still remain locked and engine will stop if attempting to put into gear without tag. Adding a cheap cellphone and DTMF or IOIO board would allow remote from anywhere to start, unlock doors. Especially when you are out of range. If you had an OBD reader to your arduino, it could read the states of things like the tach as you mentioned doing to feedback engine state. Be useful for recording car variables and for tracking using phones GPS. It seems simple in my head as a block diagram.
-
Hi @LoganFive - you've pretty much hit the nail on the head there. All this would be greatly simplified when you're working with a car that has a current-style OBD port.
The vehicles I own tend to be on the older side of things, by choice. I have a 27 year old Skyline and a 44 year old Valiant, so the way I'm working at it is both more simplified and yet a little more difficult in some ways.
You may need to get an electrical diagram of your vehicle to see what exactly you need to do to get around that key of yours, you'll want to know whether it's the ignition barrel stopping the car being started or the computer stopping the car being started. Once you've got that sorted out you can go ahead and circumvent to your heart's content.If you wanted to you could use a navspark. They have onboard glonass/gps and are arduino compatible.
One note for anyone who is reading this though: If you perform any mods on your car, then it's on your own head. I expect this decision to be made with a full understanding of any and all ramifications.
I'm doing this because I understand what I'm altering and what I plan to alter as it's affected by both law and common sense. I take no responsibility for any lemming-like behaviour from anyone else, that's on your own heads! -
@Lokki I know what you mean on older cars. My '69 Torino GT was so much easier to work on in the engine compartment! A guy could get his hands in and work on just about anything without having to pull a bunch of crap out first!
-
@LoganFive yeah I hear that. The skyline is a little cramped but the old A body chrysler is brilliant for working on. I've got photos from my last rebuild where I'm standing in the engine bay beside the engine... do that in a modern car!
-
@Lokki On your issue of safety. I was thinking of how backup cameras use the reverse gear or reverse light to switch the screen to the vga input. This i thought could translate into running a line from the brake circuit to a pin on the arduino that would lockout the NFC reader unless the brake was engaged.
Also. I have my power regulator, plenty of dev boards, and just got my NFC boards in the mail. Some of the pieces came together quickly. Just gotta get to work.
-
I was thinking of using the switched earth line from the handbrake indicator to actually switch the power to the reader unit instead, to lock it out completely. That way absolutely nothing can go wrong.