A quick and dirty vehicle entry/start sketch for Arduino
-
@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.
-
@Lokki good idea, just to be sure! what about the steering wheel lock issue? have you found a way to replace it with an aftermarket electric one? I really don't want to disable the lock pin in the ignition cylinder.
-
I haven't been able to sort that out yet, I'm either going to completely remove it forever because I don't particularly care whether it's there or not, or if I'm lucky I'll find an electronic one at a wrecking yard cheap, and retrofit that.
I've got gps tracking and remote shutdown+doorlock so the steering lock is an optional extra to me - I will try to achieve something there though, purely for you guys. ;-) -
@Lokki Sometimes when doing mechanical work, or for towing, it may be required to lock the steering wheel, or I would have thought to just shave the pin on the cylinder, or remove the disc, whichever I found in there. I really want to keep the key ignition process in tact as I need to have my Aztek valeted quite often. I had an interesting thought. And yes, many of my ideas seem strange. I was going to get a non chipped key made to have in case i lock myself out. The key should also be able to unlock the wheel, but won't engage the ignition. Then I planned on cutting the top down to leave enough to 3D print (I hope to have a printer finished soon) a cap that is low profile that also extends around the side flanks of the ignition cylinder. The parts that give you leverage when turning the key. But now I just realized that the key would have to click forward at least to the 'ON' position or the pin would re-engage the steering lock at what would most likely be a very inopportune time. I would have to try it when all is hooked up to see what the result would be. The point it that I could use it as I want to unlock the wheel and then when nI need to turn it over to someone else, I can pull the low profile key out and give them the real key. The low profile nature of the structure is to not make it so obvious that a key is there. they may not get anywhere, but I still would not have to deal with broken windows.
I also plan on making a cellphone as part of my setup, so I can use security software such as Airdroid to report GPS and such.
-
Yeah that would work. You only need to move it that one click out to come off the lock position and then you're golden.
As for locking the steering wheel, the lock tends to never be at a point where the wheels are naturally straight and always to be at a point where the wheel is slightly left or right of center. Anyone who tows or works on a vehicle in that way is a step beyond foolish in my opinion... Wheel chocks and wheel locks are pretty standard equipment in any sane work environment, locking the steering wheel simply isn't appropriate in any case I can think of.
Besides, there are still a lot of cars out there that never had and never will have a steering lock. There are no special things that need to be done to accommodate them!
It's purely an anti theft device, and as such your insurance provider may not like the removal of the steering lock. -
For gps tracking and remote shutdown I just use one of the cheap Chinese gps units with a prepaid sim card. It works pretty well! I may end up building my own unit at some point but the Chinese ones are so cheap it was easier to just buy and install that - it also has remote audio and a few other nice features.
-
@Lokki I was also thinking of when my mechanic did front end work. But the wheel didn't really need to be locked to keep the tires in an outward or inward position. Thanks for making me realize that. I may head down to NAPA tomorrow and look at a ignition cylinder to see just where the locking pin is for it. Hopefully it also has an easily removable cylinder. i saw where some had a tab on top that if you drilled an access hole just above, you could press down and pull the cylinder out without access inside the column.
I had planned on using an android phone and apps like tasker to make a few tasks remote by cellular. Like starting from phone when my vehicle is valeted and I want it warmed up or cooled down, but the standard remote won't work. Give me remote OBD readings also. Maybe incorporate it into the dash instead of hiding it so I can customize my dash display. double duty as an HUD? I have a shield that will connect the phone to my arduino project. The 1Sheeld. If there was a cheap enough phone that had NFC, I could have just used that instead of having to buy the NFC boards. Mount Phone in dash for nav, music, speed, etc. Flip up to start vehicle. Once I go hands on, something will work out. thanks for being the invaluable resource you are @Lokki !
-
Ah cool, that does sound good - a large phablet with a 3D printed fascia in the dash could work very well as media center and vehicle controller. That'd be an interesting thing to see pictures of!
And no worries, I love helping out with these things, especially when I'm getting shown new ways to look at something I've only ever seen a certain way. You're inadvertently making my other projects more interesting. ;-) -
@Lokki Yay! I'm helping too! :)
I seriously figured when I replace the factory double DIN head unit I would put in a single DIN stereo and use the space above for the tablet unit. A mechanical, automatic tray design would just be very cool. With some accent LEDs inside for effect.
I do make people think in new ways. In strange and unusual ways. -
That does sound very cool. The best part of this is its all achievable with arduinos and 3d printers now. The only limit is our imagination really!
-
Removal of steering lock and locking ignition barrel:
Shear bolts removed by drilling a hole and using an 'easy-out' screw:
This is the catch that actually locks your steering wheel:
Here is the actual ignition switch where it lives on the back of the locking barrel. I'm keeping this for the moment, it'll be hidden away out of sight.
Here is the switch removed from the barrel, yours may have more screws:
-
Finished for now, all mounted and the NFC reader where the key used to go. I'll print a black blank cover for it and it'll look like it's supposed to be that way!
-
Is it just me or did you break the key barrel slot? Lol. I could be nuts
-
nah, it's that teardrop shape to fit in the barrel plus lock button. Makes it a little more irritating to make a blank for, but never mind. It's behaved so far (I still haven't hooked up a 'run mode' sense of some kind to stop the occasional starter motor grind but it hasn't happened again yet.
-
So, I'm currently modifying my circuit to include seperately triggered LEDs to show which state the starter is in and an input to read whether the handbrake is on or off - if the handbrake is on then the starter will assume it's safe to crank the engine, if not then it skips the cranking step entirely.
Meanwhile I'll be able to see if the arduino has reset itself or not and choose whether to engage the handbrake when I stop and switch off or circumvent the starting phase by leaving it off and cycling through modes to stop.Sounds complicated but it makes sense to me, we'll see how it goes.
-
Version 3 of the car starter code, with state indicator LEDs and handbrake sense.
int triggerPin1 = 2; int triggerPin2 = 3; int triggerPin3 = 4; int indicatorPin1 = 5; int indicatorPin2 = 6; int indicatorPin3 = 7; int indicatorPin4 = 8; int handbrakePin1 = 9; int carRunState = 0; int handbrakeState = 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); pinMode(indicatorPin1, OUTPUT); pinMode(indicatorPin2, OUTPUT); pinMode(indicatorPin3, OUTPUT); pinMode(indicatorPin4, OUTPUT); pinMode(handbrakePin1, INPUT); 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 == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx"){ Serial.println("Key accepted!"); } if ((ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx") && (carRunState == 0)){ Serial.println("PERMISSION GRANTED, SYSTEMS ON"); digitalWrite(triggerPin3, HIGH); // sets latching relay trigger on for ignition mode in car to allow start digitalWrite(indicatorPin2, HIGH); //show state, second LED delay(200); // waits briefly digitalWrite(triggerPin3, LOW); // removes latching relay trigger carRunState = carRunState++; } else if ((ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx") && (carRunState == 1)){ handbrakeState = digitalRead(handbrakePin1); //check if handbrake is on or off if (handbrakeState = 0){//if handbrake is on then safe to crank car, if not then skip this mode entirely Serial.println("ENGINE CRANKING"); digitalWrite(triggerPin1, HIGH); // triggers output for engine starting digitalWrite(indicatorPin3, HIGH); //show state, third LED delay(2000); // waits for a second digitalWrite(triggerPin1, LOW); // removes triggered output Serial.println("ENGINE CRANKING COMPLETE"); } carRunState = carRunState++; } else if ((ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx" || ringUid == "xxxxxxxxxxxxxx") && (carRunState > 1)){ Serial.println("SYSTEM OFF, SLEEP TIME"); digitalWrite(triggerPin2, HIGH); // Trigger latching relay to reset for vehicle OFF digitalWrite(indicatorPin1, HIGH); //show state, LED1 on digitalWrite(indicatorPin2, LOW); //LED2 off digitalWrite(indicatorPin3, LOW); //LED3 off delay(200); // waits briefly digitalWrite(triggerPin2, LOW); // Removes latching relay reset trigger delay(3000); carRunState = 0; digitalWrite(indicatorPin1, LOW); //LED1 off } } }
-
Heh, well that didn't work consistently but as it turns out the reset problem was entirely due to where I was taking my power feed from in the first place. Running a power feed straight from the main battery line stopped the issue I was having with my starter resetting itself (which turned out to be every time I was using the brakes to stop, hence why I didn't notice when it was happening - I was busy each time).
I've commented out the handbrake sensing stuff and am just using it with the indicator lights to make sure it doesn't happen again and will test it like this for a while to see how it goes. -
I saw an integer listed as "carRunState", or something like that. What are you using to set this? A pin or, programming string being monitored from within the sketch? So far I have worked out an input pin for the brake state, a pin for the tach state to monitor engine on/off, and an output to bring the security bypass that is already in for the remote starter that tells the obd all is good. I am still learning arduino sketch's so I have more of a flow chart in mind now. For starting:
Sense ring-check brake state- if on > check engine state- off > accessory relay - pause for long hold then starter relay. Need to integrate tach level to appropriately gauge starter engage time. This is just of the top of my head though. -
Nevermind that last post. Just saw the other thread...