• Login
    • Search
    • [[global:header.recent]]
    • [[global:header.tags]]
    • [[global:header.popular]]
    • [[global:header.groups]]
    • [[global:header.search]]

    A quick and dirty vehicle entry/start sketch for Arduino

    Ideas for using NFC Rings
    6
    48
    59868
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Lokki
      Lokki Community Helper last edited by

      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. ;-)

      LoganFive 1 Reply Last reply Reply Quote 0
      • LoganFive
        LoganFive @Lokki last edited by LoganFive

        @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.

        1 Reply Last reply Reply Quote 1
        • Lokki
          Lokki Community Helper last edited by

          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!

          1 Reply Last reply Reply Quote 1
          • Lokki
            Lokki Community Helper last edited by

            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:

            1 Reply Last reply Reply Quote 0
            • Lokki
              Lokki Community Helper last edited by

              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!

              1 Reply Last reply Reply Quote 1
              • M
                MarkGabb last edited by

                Is it just me or did you break the key barrel slot? Lol. I could be nuts

                1 Reply Last reply Reply Quote 0
                • Lokki
                  Lokki Community Helper last edited by

                  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.

                  1 Reply Last reply Reply Quote 0
                  • Lokki
                    Lokki Community Helper last edited by

                    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.

                    1 Reply Last reply Reply Quote 1
                    • Lokki
                      Lokki Community Helper last edited by Lokki

                      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
                        }
                        }
                      }
                      
                      1 Reply Last reply Reply Quote 1
                      • Lokki
                        Lokki Community Helper last edited by

                        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.

                        1 Reply Last reply Reply Quote 0
                        • LoganFive
                          LoganFive last edited by LoganFive

                          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.

                          1 Reply Last reply Reply Quote 0
                          • LoganFive
                            LoganFive last edited by

                            Nevermind that last post. Just saw the other thread...

                            1 Reply Last reply Reply Quote 0
                            • Lokki
                              Lokki Community Helper last edited by

                              Carrunstate is just an arbitrary counter for which mode the arduino should be in. Handbrake state is the only input that's of any importance in that sketch - but wasn't working properly. Possibly my code is crap.

                              1 Reply Last reply Reply Quote 1
                              • First post
                                Last post