Stap 4: OBD-II-gegevens
OBD-II-gegevens is vrij netjes en er is veel geschreven over het uit op het internet. Dus, als het is iets wat die u in geinteresseerd bent ga dan wat te lezen. Het is de moeite waard. Hier zijn enkele opvallende punten:
- Er zijn eigenlijk verschillende specs geïmplementeerd die vallen onder de omgangstaal paraplu van OBD-II. Het koele deel is dat u niet hoeft te weten over deze allermeest naar de tijd als moderne lezers van de OBD-II en adapters zal postuur zulks uiterlijk voor u.
- Er is ook daar CANbusdata (meestal bereikbaar via de OBD-II-poort, en vaak via andere fysieke interfaces). De ongelukkige deel is veel van de specificaties voor die zijn merkgebonden (of opzettelijk zonder papieren). Voor meer informatie over dat ga hier:
- Niet alle auto's zal alle van de "standaard" OBD-II PIDs steunen. Zij zullen de meeste steunen. Bijvoorbeeld mijn auto olietemperatuur niet doorgegeven tenzij u het een BLIKJE stuurt volgorde. Een is een koptekst en een is de query (of in CANBUS taalgebruik het is meer als een abonnement in sommige opzichten).
Fysieke aansluiting is vrij eenvoudig. De OBD-II-apparaat aansluit op de OBD-II-poort van uw auto, die meestal ergens onder het dashboard aan de bestuurderszijde ligt.
Wat ik heb gedaan voor dit deel is het gebruik van de python-OBD-bibliotheek te grijpen sommige standaardgegevens van de OBD-II en voor gemakkelijk IoT stijl consumptie als JSON worden blootgesteld. De opslagplaats voor dit hier: https://github.com/brendanwhitfield/python-OBD . U kunt het echter installeren via pip met a:pip install obd
. Bredan van documentatie is eigenlijk best goed. Er zijn verschillende vorken van dit zo goed, die enkele interessante dingen doen. Met name deze: https://github.com/Pbartek/pyobd-pi is interessant omdat het zich richt op het met de raspberry pi wordt gebruikt.
Je moet om de OBD-II-gegevens naar uw Edison een fysische interface. Een usb interface zal werken, maar voor het gemak gebruik ik een bluetooth een. Als u een USB-interface zul je minder te doen en de verklaring in mijn code hebt gekozen: connection = obd.OBD('/dev/rfcomm0')
moet waarschijnlijk lezen connection = obd.OBD()
of het gedeelte tussen de haakjes moet verwijzen naar de linux serial device dat uw usb-apparaat.
Voor degenen met behulp van een bluetooth-apparaat is dit wat ik moest doen. Het is wellicht om te proberen een paar andere dingen te krijgen om te functioneren. Bluetooth installatie lijkt te zijn een ding van de finiky in linux nog steeds en ik ben niet zeker waarom.
- Begin bluetooth https://software.intel.com/en-us/articles/intel-e... volledige bluetooth documentatie is hier beschikbaar: https://software.intel.com/en-us/articles/intel-e...
- Toevoegen van een agent - de docs niet zeggen wat dit betekent - in feite zijn er vooraf ingestelde namen, maar ik kon niet achterhalen wat ze bedoeld. Ik geplakt met degene die ze in de documentatie gebruikt en het lijkt te werken.
- Paar (gebruik bluez controle util te stellen zoals in de hierboven genoemde documentatie.
- Voer
rfcomm bind rfcomm0
dit dat bluetooth-verbinding wordt gebonden aan de linux apparaat/dev/rfcomm0. Als je in mijn codegedeelte dat dit wat ik noem kijkt is bij het opzetten van de OBD-II-verbinding. - Als u wilt uitvoeren van een script dat dit bij het opstarten doet volgt u de aanwijzingen hier: https://communities.intel.com/message/292186#2921... Hoewel ik op-en-off succes met dit heb gehad. De bluetooth koppeling moet voortbestaan te opnieuw opstarten.
De OBD-II-gegevens is dan bereikbaar via verschillende contexten van het web in het hoofdprogramma van kolf die hen als de JSON-gegevens die vervolgens kunnen worden gebruikt door IoT-diensten zoals vrijboord zal blootstellen.
#OBD II data using pyobdimport obd from obd import OBDCommand from obd.utils import unhex #call this from the main program...because we only want to do it once def setupOBD(): connection = obd.OBD('/dev/rfcomm0') counter = 0 #while not(connection.is_connected() or counter < 20): # connection = obd.OBD('/dev/rfcomm0') # counter = counter + 1 #return (connection)
def rpm(connection): response = connection.query(obd.commands.RPM) return response.value
def engine_load(connection): response = connection.query(obd.commands.ENGINE_LOAD) return response.value
def coolant_temp(connection): response = connection.query(obd.commands.COOLANT_TEMP) return response.value
def intake_pressure(connection): response = connection.query(obd.commands.INTAKE_PRESSURE) return response.value
def speed(connection): response = connection.query(obd.commands.SPEED) return response.value
def timing_advance(connection): response = connection.query(obd.commands.TIMING_ADVANCE) return response.value
def intake_temp(connection): response = connection.query(obd.commands.INTAKE_TEMP) return response.value
def throttle_pos(connection): response = connection.query(obd.commands.THROTTLE_POS) return response.value
def voltage(connection): response = connection.query(obd.commands[1][42]) readyresponse = unhex(response) return readyresponse #needs to be tested with a real car...not sure if this will work