A quick and dirty vehicle entry/start sketch for Arduino
-
That's certainly an interesting idea you've got there!
So the reader unit would be inside the gear knob and car usage would be 'allowed' when the ring is present on the knob?
For mine because there is still the chance that you can switch off the car by accident I intend to place the reader in an out of the way position where I won't normally be putting my hands. I'm looking at possibly having two reader units, one on the door at the handle position and one up on the dashboard.
Though the reader units and the arduino modules are cheap enough that I could simply go with two of those, one complete unit for the door and one for the vehicle ignition. -
The gear knob reader juste allow the start of the car, a button are use for the starter.
But for more security i will use the ODB2 connexion for know the RPM of the car so you could stop the car only if it is in the stop state.
And off course, i use bistate relay for don't stop the car in case of a electronic problem.Why don't use a MSP430 chip ? it's compatible with the PN532 and the RC522 arduino library with energia. It's the cheapest solution and a ultra low power technology :)
You can make a wake-up button in the handle and use a little battery too (less wire so easier to connect). -
Interesting, I'll have to look into that one!
-
Ok, I finally got around to doing something more with my NFC Ring car starter. This is just a short proof of concept video showing the changing states via an RGB LED. I'll work on re-writing the code next so that I can do a little more with just a single ring inlay, and close the relay for the starter motor properly - at the moment as it's set up it pulses, I'll alter it so that a single inlay can change mode (on/off) and then start the engine when held.
-
Here are some pictures, including the ugliness of my wiring. :-)
-
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.