Remote bil övervakning och spårning med Intel Edison (4 / 5 steg)
Steg 4: OBD-II-uppgifter
OBD-II-uppgifter är ganska snygg och det är en hel del skrivet på ut på internet. Så, om det är något du är intresserad vänligen gå göra några behandlingen. Det kommer att vara värt mödan. Här är några viktiga punkter:
- Det finns faktiskt flera specifikationer genomförs som faller under de talspråkliga OBD II. Den svala delen är du inte behöver veta om denna mest av tiden som moderna OBD-II läsare och adaptrar kommer att lista ut för dig.
- Det finns också CANBUS data ute (vanligtvis tillgänglig via OBD II-port och ofta via andra fysiska gränssnitt). Den olyckliga del är mycket av specifikationerna för som är egenutvecklade (eller medvetet papperslösa). För mer om det gå hit:
- Inte alla bilar kommer att stödja alla "standard" OBD II PID. De kommer att stödja de flesta. Till exempel min bil inte rapporterar oljetemperatur såvida du inte skickar det en kan sekvens. En är ett huvud och en är frågan (eller i CANBUS språkbruk är det mer som en prenumeration på vissa sätt).
Fysiska hookup är ganska enkel. Anslut enheten OBD II i OBD II-porten på din bil, som vanligtvis ligger någonstans under instrumentbrädan på förarsidan.
Vad jag har gjort för denna del är att använda python-OBD-biblioteket för att ta några standarddata OBD II och utsätta det som JSON för lätt IoT stil konsumtion. Databasen för detta finns här: https://github.com/brendanwhitfield/python-OBD . Dock kan du installera det via pip med a:pip install obd
. Bredans dokumentation är faktiskt ganska bra. Det finns flera gafflar av detta också, som gör några intressanta saker. Särskilt den här: https://github.com/Pbartek/pyobd-pi är intressant eftersom den fokuserar på som används med raspberry pi.
För att få OBD II-uppgifter till din Edison behöver du ett fysiskt gränssnitt. Ett USB-gränssnitt fungerar, men för enkelhetens skull använder jag en bluetooth en. Om du väljer ett USB-gränssnitt du kommer att ha mindre att göra och uttrycket i min kod: connection = obd.OBD('/dev/rfcomm0')
bör nog läsa connection = obd.OBD()
eller avsnittet inom parentes bör hänvisa till den linux seriella enhet som är USB-enheten.
För de som använder en bluetooth-enhet är vad jag hade att göra. Du kan behöva prova några andra saker för att få det att fungera ordentligt. Bluetooth setup verkar vara en finiky sak i linux fortfarande och jag vet inte varför.
- Starta bluetooth https://software.intel.com/en-us/articles/intel-e... full bluetooth dokumentation finns här: https://software.intel.com/en-us/articles/intel-e...
- Lägga till en agent - docs Säg inte vad detta betyder - i princip finns det förinställda namn, men jag kunde inte lista ut vad de menade. Jag fastnade med den som de används i dokumentationen och det verkar fungera.
- Par (användning bluez kontroll util till sätta den upp som i den dokumentation som anges ovan.
- Kör sedan
rfcomm bind rfcomm0
detta kommer att binda att bluetooth-anslutningen till linux device/dev/rfcomm0. Om du tittar i min koden Detta är vad jag kallar när du ställer in anslutningen OBD II. - Om du vill köra ett skript som gör detta vid start Följ anvisningarna här: https://communities.intel.com/message/292186#2921... Även om jag har haft på och av framgång med detta. Den bluetooth-ihopparningen ska överleva en omstart.
OBD II data är sedan kan nås via flera web sammanhang i kolven huvudprogrammet som kommer att exponera dem som JSON data som sedan kan användas av Sakernas Internet tjänster som fribord.
#OBD II data med pyobd
importera obd
importera OBDCommand från obd
från obd.utils importera unhex
#call detta från huvudsakligen program... eftersom vi bara vill göra det en gång
def setupOBD():
räknare = 0
#while not(connection.is_connected() eller räknare < 20):
#
# counter = räknare + 1
#return (anslutning)
def rpm(connection):
svar = connection.query(obd.commands.RPM)
återgå response.value
def engine_load(connection):
svar = connection.query(obd.commands.ENGINE_LOAD)
återgå response.value
def coolant_temp(connection):
svar = connection.query(obd.commands.COOLANT_TEMP)
återgå response.value
def intake_pressure(connection):
svar = connection.query(obd.commands.INTAKE_PRESSURE)
återgå response.value
def speed(connection):
svar = connection.query(obd.commands.SPEED)
återgå response.value
def timing_advance(connection):
svar = connection.query(obd.commands.TIMING_ADVANCE)
återgå response.value
def intake_temp(connection):
svar = connection.query(obd.commands.INTAKE_TEMP)
återgå response.value
def throttle_pos(connection):
svar = connection.query(obd.commands.THROTTLE_POS)
återgå response.value
def voltage(connection):
svar = connection.query(obd.commands[1][42])
readyresponse = unhex(response)
återgå readyresponse #needs testas med en riktig car...not säker på om detta kommer att fungera