100% found this document useful (1 vote)
89 views

Design of An IoT-based Vehicle State Monitoring System Using Raspberry Pi

The document proposes an IoT-based vehicle monitoring system using a Raspberry Pi. It consists of an OBD scan tool to collect vehicle data, a Raspberry Pi to transmit the data, and a cloud-based monitoring application. The OBD tool collects data from the vehicle and sends it to the Raspberry Pi. The Raspberry Pi then uploads the data to a cloud server using a cellular internet connection. The monitoring application allows users to access the live and historical vehicle data from the cloud.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
89 views

Design of An IoT-based Vehicle State Monitoring System Using Raspberry Pi

The document proposes an IoT-based vehicle monitoring system using a Raspberry Pi. It consists of an OBD scan tool to collect vehicle data, a Raspberry Pi to transmit the data, and a cloud-based monitoring application. The OBD tool collects data from the vehicle and sends it to the Raspberry Pi. The Raspberry Pi then uploads the data to a cloud server using a cellular internet connection. The monitoring application allows users to access the live and historical vehicle data from the cloud.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

Design of an IoT-based Vehicle State Monitoring

System Using Raspberry Pi


Ahmed BinMasoud Qi Cheng
School of Computing, Engineering and Mathematics School of Computing, Engineering and Mathematics
Western Sydney University Western Sydney University
Sydney, Australia Sydney, Australia
Email: [email protected] Email: [email protected]

Abstract—In this paper, an IoT-based vehicle an on-board Wi-Fi module. Benefits of Raspberry Pi can
monitoring system is designed and implemented. The be found in [2], when compared with other micro-
proposed design is comprised of three components: an controllers, such as Arduino.
OBD scan tool, a Raspberry Pi and a Cloud monitoring
application. The OBD scan tool collects vehicle information The work in [2] proposes a vehicle location tracking and
from the OBD-II port of the vehicle, and the Raspberry Pi safety monitoring system using a Raspberry Pi. In that
uploads them onto a cloud server using cellular internet system, GPS module, shock and gas sensors are
connection. The on-line data as well as the historical data suggested. Only a system diagram is proposed, but no
stored on a Cloud server are then accessed by the implementation details are provided. But an OBD tool is
monitoring application. The application can report data
both graphically and descriptively. An algorithm is also
not used.
proposed to detect faults in engine and cooling systems. In [3], a vehicle diagnostic system is proposed using an
OBD tool and a Raspberry Pi. In that system, a
Keywords—Raspberry Pi, OBD, IoT, Cloud server
Bluetooth dongle is used to connect to Bluetooth devices
I. INTRODUCTION (for an earlier version of Raspberry Pi). However, data is
not displayed on a Cloud server.
Over the past few years, the IoT has become a dominant
research topic, attracting the attention of scientists, The work in [4] implements a vehicle monitoring system
engineers, and entrepreneurs. One interesting application based on an OBD-II scan tool. In that system, an SYM32
of the IoT is vehicle monitoring. Recently, extensive MCU is used to control a WiFi module and receive data
amount of research has been conducted to enable on-line from an OBD scan tool and send data to devices
vehicle monitoring and driver behavior analysis [1]. wirelessly. In that system, data are displayed on
Bluetooth and WiFi devices.
The on-line monitoring systems enable access to a wide
range of information about the vehicle’s status such as: Authors of [5] use an OBD-II and GPS data to predict
diagnostic data, engine RPM, speed, location and driver behaviour, the result is transmitted through the
measurements from various sensors included in the internet, but there are no implementation details about
engine [2], [3], [4]. The availability of the present and result transmission.
past diagnostics information enables the automobile
In summary, in [2]-[5], no detailed implementation is
owners to ensure the safety of their own and their car
provided on Raspberry Pi and online data display. From
through a remote vehicle health monitoring system. Such
the experience of the first author as a final-year
a monitoring system can automatically detect issues and
undergraduate student, there is a real demand for
report them to car mechanics experts [15]. The Cloud-
implementation details. Those details can also benefit
based nature of this system enables remote access to the
practicing engineers.
data by using a smartphone or computer. This feature
makes it possible for a mechanic to check the engine and Hence, in this paper, a vehicle monitoring system is
power transmission system; while a vehicle is being proposed to include an OBD scan tool, a Raspberry Pi,
driven elsewhere. and online display on a Cloud server connected through
a cellular network, with sufficient implementation details
An on-board diagnostic (OBD) tool [8] is a
included.
microcontroller-controlled device to collect engine
parameters, receive GPS parameters of a vehicle, and The proposed system is comprised of three components:
send them other microcontroller-based devices (such as 1) an OBD scan tool, which is installed on the vehicle, 2)
smart phones, Bluetooth devices and computers) and a a Raspberry Pi 3B+ for data transmission and 3) an on-
Cloud server. line monitoring application which allows users to view
the parameters on their computer/mobile phones.
A cloud server is a website where data can be sent and
processed/displayed online in graphic and data formats. II. PROPOSED SYSTEM
In [6], the data is displayed in graphic format.
A. System Architecture
Raspberry Pi is a micro-computer running on a Linux
The schematic diagram of the proposed IoT-based
system. Raspberry Pi 4B is the latest version released in
vehicle monitoring system is shown in Fig. 1. The
June 2019, and it can communicate with the Internet via
system is comprised of an end device and a web-based
978-1-7281-6657-5/19/$31.00 ©2019 IEEE
user interface. The end-device, which is assembled sent to OBD, the value corresponding to the engine
inside the vehicle includes an ELM327 module and a speed will be returned. There are about 137 PIDs defined
Raspberry Pi 3B+ (RPi) board. The ELM327 module as per the OBD standard, revised in 2007. Not all PIDs
works as an interface between the OBD port of the are supported by all vehicles, similar to the modes
vehicle and the USB port of the RPi board. In order to (services).
read the status and measurement parameters from the
The RPi is connected to the OBD (through the
vehicle, the RPi sends a data request command to the
ELM327). It communicates to the ELM327 to obtain
ELM327. ELM327 then transfers the data request
vehicle parameters. In this paper, Python program is
message to the OBD port. Then, the OBD system of the
used to transmit the data collected from the OBD and
vehicle responds to the RPi request by transferring the
send them to a Cloud server [15].
requested data to the OBD Port. The data is forwarded to
the RPi through the ELM327 module. After some C. ELM327 OBD Scanning Tool
preprocessing, the RPi publishes the data on the Cloud.
The ELM327 is a microcontroller manufactured by a
On the other side, the user app fetches the data from the
company named ELM Electronics, and is specifically
Cloud and reports them to the user. In the following
designed to serve as an interface between an OBD and a
subsections, each of the system components is described
in great detail. computer. ELM327 works as a bridge allowing the OBD
(computer in the car) to communicate with a computer or
a hand-held device [10]. The ELM327 extracts the
protocol, presenting a straightforward interface capable
of being called through an UART, done by either a
computer program or any hand-held diagnostic tool. The
ELM327 is compatabible with the OBD-II system and it
can retreive data through USB, Bluetooth or Wi-Fi. A
number of SAE and ISO protocols are supported.
Among the three ways of connection, a cable connection
Fig. 1. Schematic diagram of the proposed system
through a USB port is more reliable and provides the
highest compatibility, whereas wireless Wi-Fi and
B. OBD-II PIDs and Modes
Bluetooth remove the hassle of a cable [6].
Regardless of the protocol used, there are 10 modes or
The ELM327 when connected to the OBD, can calculate
services of diagnostics for the OBD. The engine ECU of
engine load and read parameters such as engine RPM,
a vehicle may not suport all modes, but modern
fuel system status, speed of the vehicle, coolant
vehicles support more modes [7]. In our system, two
temperature, short and long term fuel trim, intake
modes are used and they are called Mode 1 and Mode 2.
manifold pressure, timing advance, air flow rate, intake
Mode 1 returns the typical values, correspponding to a air temperature.
few sensors measuring some parameters such as vehicle
speed, engine speed, information relating to oxygen In the ensuing discussions, the ELM327 will be omitted
sensors and the fuel/air mixture, engine teperature, both for brevity concern. But it should kept inmide that any
air and the coolant [8]. communication between the RPi and the OBD is realised
by the ELM327.
Mode 2 provides the instantaneous or freeze frame data
corresponding to a fault. Once a fault is detected, the
sensor data will be recorded from the moment of the
fault, and this recorded data may be called and returned
[9].
PIDs, which stands for parameter IDs, in OBD-II are
codes that are pre-defned and each assigned to a certain
parameter in a car that can be requested as a diagnostic
tool. The Raspberry Pi will request these codes, using
Python programming language, to request values of
parameters from ELM327, which is connected to the Fig. 2. OBD-II scanner: ELM 327 car diagnostic interface
OBD. scan tool

OBD-II PIDs are defined as per SAE standard J1979.


III. IMPLEMENTATION
Every single on-road vehicle in North America is to
support at least a number of the codes, mostly mandated A. Monitoring System
by the state because of emissions considerations. Certain The proposed system is implemented by developing a
car producers may include other PIDs that might be Python program and two Node-red sketches. The Python
specific to their cars. program is responsible for establishing communication
between the RPi and the OBD terminal, reading the
Each sensor, responsible for measuring a parameter, is parameters and storing them on a data-base. The Node-
assigned a certain PID number. According to the red sketches are required to publishing data on the Cloud
standard, for example, the engine speed is assigned PID and visualizing the parameters.
of 12. So, this means that when a request of PID 12 is
The proposed system contains the following steps: supported and which are not. In particular, if the nth digit
connection to the OBD terminal, detection of supported of PIDS_A is one, the parameter with ID equal to n is
parameters, reading those parameters, storing them in a supported. Otherwise, the corresponding parameter is not
csv file, readign the csv file, transmission to a Cloud supported. Similarly, PIDS_B and PIDS_C identify the
server, and graphic visulization. . supported PIDs in the range 32-63 and 64-96. As seen
from Fig. 3, the supported PIDs are read by using the
In the first step, the communication link between the RPi
command connection.query with argument
and OBD terminal, is initialized. Since not all parameters
obd.commands.PIDS_A. The subclass query is used to
are supported and the supported parameters may vary
send a data request to the OBD. The subclass commands
from one model to another, it is important to determine
include a list of all PIDs with their corresponding IDs.
the list of supported parameters. This is accomplished by
So, the argument (obd.commands.PIDS_A) generates the
reading registers PIDS_A, PIDS_B and PIDS_C and
corresponding PIDs for the parameter PIDS_A and then
associating the binary string in each register to the
the subclass query sends a data request message to read
associated PIDs. Then, the supported parameters are read
the corresponding parameters. The result is stored in
one by one and their PID and value are stored in a string.
“response1”. Similarly, the parameters PIDS_B and
The resulting string includes PIDs and value pairs
PIDS_C are stored in response2 and response3.
separated by semicolon. This string is then saved onto
Following, the values of the parameters PIDS_A,
the RPi SD card as a comma separated vector (CSV) file.
PIDS_B and PIDS_C, each of which is a 32 character
This file is then accessed by the Node-red sketch which
string, are concatenated into a single string called “sup”.
is executed on the RPi.
Therefore, sup is a 96 character string which identifies
The Node-red sketch reads the parameters from the file all of the supported PIDs.
and publishes them to a Cloud server by using MQTT
Two nested “for” loops are used for reading parameters.
protocol. On the Cloud server, a Node-red based
Inside the inner loop, two if statements are used. The
application receives the data. The Cloud Node-red
first if statement makes sure that the parameter with ID
application uses Node-red dashboard blocks to display
32 and 64 (PIDS_A and PIDS_B) are not read in the
the parameters on a graphical user interface.
loop. The second if statement checks whether a
B. Python Program parameter is supported or not by comparing the
The interconnection between vehicle’s OBD and the RPi corresponding character of the string “sup” with the
is implemented by means of a Python program [12]. The character “1”. If the parameter is supported, a data read
Python program sends data read requests to the vehicle query will be sent to the OBD and the response message
through the ELM327. The response message is then read will be stored in the parameter “response”. Then, the
by the program and the value of each parameter along parameter itself is extracted from the response message
with its index number is stored in a text file. by using the expression response.value and stored in a
string named st. Some of the parameters with a
In order to implement the OBD communication percentage are expressed in number format with several
protocols within Python, Python OBD package is used in
unused decimals. To enhance the representation, those
this project [13]. The package has been widely used in
unused decimals are removed by extracting the first four
different projects to enable reading data from OBD ports
characters of a parameter and removing the rest. This
of automobiles of various models and brands. The
way, the resulting number will be easier to read on the
package supports all of the communication protocols graphical user interface. Finally, the parameter id (i) and
used by OBD-II including CAN and ISO. The package the parameter value are concatenated with a larger string
was installed on the RPi by using the following
called st2.
command:
When the inner loop completes the reading of all
$ pip install obd
supported parameters, the string st2 will contain all of
The package features a few Python modules which the supported parameters along with their IDs separated
enable connection to the OBD, sending data queries and by “;“. The outer loop is responsible for repeating this
reading data. In order to read the OBD parameters and process. The outer loop can repeat indefinitely to refresh
store them in a text file, a Python program is developed, the parameters while the device is on. However, for test
as shown in Fig. 3. In the first and second lines of the purpose, the repetition time is limited to 200s here. Each
code, the OBD package and the time package are time the outer loop repeats, the text file “ob99.txt” is
imported. Then, the OBD logger is turned on to enable opened and filled with the new value of parameters
viewing the warning messages from the OBND package stored in st2. This process causes the old contents to be
during the connection phase. Afterwards, an OBD class deleted, so the file only includes the most recent values
named connection is created. at each instant of time. At the last line of the loop, a time
delay of 0.5 seconds is used to limit the maximum
Since only some of the OBD parameters are supported refresh rate to two times per second. In practice, the
by each vehicle, it is important to first identify the maximum refresh rate is once every 1-2 seconds due to
supported parameter IDs (PIDs). By standard, the list of the time delay of the ELM327.
supported PIDs is stored in three parameters: PIDS_A,
PIS_B, and PIDS_C. The parameter PIDS_A includes a
string which represents a 32 digit binary number. The 32
digits of PIDS_A identify which of the first 32 PIDs are
A web-based application is developed using Node-red,
as shown in Fig. 5. The Node-red sketch is comprised of
calculation blocks as well as graphical user interface
blocks. The function “Labels” defines the names of the
OBD parameters as a list according to the OBD standard.
The labels are added to the received message. The output
of the function Labels contains both the received data
and the parameter names. The text blocks access the
received data by reading each of the data in the csv file.
Furthermore, the label corresponding with each value is
extracted from the list of parameter names. The result is
a text box with the label of each parameter in the left and
its value in the right side.
The presented data transfer and display method is
particularly efficient in terms of internet traffic usage.
On the one hand, the Python program in the Raspberry
Pi outputs the IDs of OBD parameters and not their
name. On the other hand, the OBD parameters which are
not supported are not sent to the output at all. Therefore,
the volume of the transmitted data is minimal. On the
web-application side, the parameter IDs are converted to
parameter names, so that users can easily read them.
Apart from the text blocks, the graphical user interface
utilizes gauges to display the engine rpm and vehicle
speed. These gauges are shown on a separate tab along
with diagnostic trouble codes. Furthermore, one tab is
dedicated to displaying historic data of the engine
coolant temperature engine rpm and speed as time based
charts. The historic data are specifically useful for
Fig. 3. Python program for acquiring OBD parameters diagnostic purpose. For instance, if a diagnostic trouble
code has been sent at a specific time, it is possible to find
C. Node-red Sketches the cause and the place of the fault by examination of the
The output of the Python program is a text file which historical data both prior to and after the fault.
contains the OBD parameters in comma separated vector
(CSV) format. In order to send these parameters to a
Cloud server, a Node-red [14] sketch is designed for the
Raspberry Pi and another sketch is designed for the web-
application, which displays the OBD parameters in a
graphical interface.
The Node-red sketch on the RPi side is shown in Fig. 4.
In contrast with the conventional programming schemes
which are based on textual input, Node-red uses blocks.
The first block is a time stamp which triggers other Fig. 4. Node-red sketch of the Raspberry-Pi
blocks to perform their tasks at certain points of time.
Here, the timestamp is set to timer mode with period of
three seconds. This way, the OBD parameters are
uploaded to a Cloud server every three seconds. The
block getCPU acquires the CPU temperature and sends it
to its output as a message. The message payload contains
the CPU temperature. In order to observe the CPU
temperature, a debugger block is used. The debugger
extracts the message payload, which contains the CPU
temperature and displays the result in the debug tab of
Node-red. A file read block is used to read the contents
of the file obd99.txt, which contains the OBD
parameters. The output of the file read block is a string
of characters. The block csv is used to convert the string
to the CSV format which is recognizable by the other
Node-red blocks. Finally, the resulting message is
Fig. 5. Node-red sketch of the web-based application
transferred to the output.
D. Network Connection The performance of the system has been tested and is
The WPA supplicant and interfaces scripts must be demonstrated in this paper by means of the screenshots
modified for available cellular networks to be connected. of the web-based application while the car was on the
The WPA supplicant script provides the correct move. The OBD parameters are expressed in the
credentials for the RPi’s connection to those networks. application in the form of different web tabs, which are
The interfaces script, defines how to initiate a network at selectable from the top left part of the application. The
boot or manually and whether static or dynamic address screenshot of the first tab is shown in Fig. 5. It includes
is assigned. three modules: Engine RPM gauge, speed gauge and
diagnostic trouble codes. It can be seen that, the engine
In the WPA supplicant script, the following network is working at 1188 RPM and the vehicle speed is 68
credentials should be added: kilometers per hour. The list of diagnostic trouble codes
network={ is empty, which means that the car is operating without
ssid="Netgear" any issues.
key_mgmt=WPA-PSK Fig. 6 illustrates the second tab of the application. As can
psk=1dad119d7d9c1acf45457f96d8f7d0e93b95 be seen, this tab includes three charts: engine coolant
4953847e9e93c240a73b0ec74787 temperature, engine RPM and speed. The variations of
} each parameter are illustrated as a function of time for
The text after the psk command is the encrypted the interval 16:00 to 17:00. During the interval 16:00 to
password. 16:19, the vehicle was stationary, the engine rpm was
around 800. Then, the engine was turned off. At 16:40,
E. Proposed Diagnosis Algorithm the engine was turned on. During the interval 16:40 to
In order to detect minor faults within the fuel and 17:00, the accelerator was pushed and released several
cooling systems of the vehicle’s engine, a diagnosis times. Furthermore, the vehicle moved between 16:58
algorithm is presented in this section. One common issue and 17:00. It is observed that when the accelerator pedal
within the fuel system is to ensure that the fuel mixture was pushed, the engine coolant temperature rose up to
does not contain too much air (lean) or too much fuel 120 degrees but then fell to less than 100 degrees as the
(rich). The proposed diagnosis scheme examines the accelerator was released. Furthermore, during the time
recorded values of long term fuel trim (LTFT) and short interval that the vehicle was moving, the engine coolant
term fuel trim (STFT) to detect lean or rich fuel temperature was lower than the case when the vehicle
situations. In a healthy engine, STFT and LTFT usually was stationary, and the accelerator pedal was pushed.
change from -8% to 8%. By counting the number of This result can be justified by considering that the
samples at which the STFT or LTFT exceeds this range movement creates a natural airflow which can reduce the
and dividing the result over the total number of samples, engine coolant temperature.
the probability of lean or rich fuel mixture is determined.
If the calculated probability exceeds a threshold, the
algorithm will issue a lean or a rich fuel mixture fault.
The proposed algorithm also detects issues within the
cooling system by assessing the engine coolant
temperature records. Normally, the engine coolant
temperature should not exceed an upper limit. By
counting the number of samples at which the engine
coolant temperature exceeds that bound and dividing the
result on the total number of samples, the probability of
over-temperature is obtained. If the value of probability
exceeds a threshold, an over-temperature fault will be
issued.
IV. EXPERIMENTAL RESULTS
The system has been tested on an automobile in both
stop and driving modes. To that end, the device was
assembled in the dashboard of the car. The RPi was
supplied by a 5V battery (power bank) and the internet
connection was established using mobile hotspot
tethering. The OBD parameters were monitored using Fig. 6. Screenshot of the home tab of the web-application
the web application which was executed on a remote
computer. During the experimenting process, the Python In addition to the aforementioned parameters, all of the
code was debugged and modified to correct the errors supported OBD parameters are shown in textual format
and enhance the efficiency of the code. In addition, the in four tabs, as shown in Fig.s 8- 11. From Fig. 7, it is
Node-red sketches of both the RPi and the web-based seen that the engine rpm is 3239 and the speed is zero at
application were completed under test. The final Python the time of capture. Since the vehicle is not moving, the
code and Node-red sketches are detailed in Section III-A engine load is only 12.1%. The fuel system uses closed
and B. loop control with oxygen feedback to determine the fuel
mix. The engine coolant temperature is 105 degrees. Fig.
8 shows parameters such as air flow rate, oxygen sensors
outputs and fuel level. Other parameters are also
displayed, but due to space limit, are not shown in this
paper.

Fig. 8. Screenshot of the OBD parameters

[2] D. S. Rani and K. R. Reddy, “Raspberry Pi based vehicle tracking


and security system for real time applications,” International Journal
of Computer Science and Mobile Computing, vol.5, no. 7, pp. 387-
393, July 2016.
[3] S. R. Manalu, J. V. Moniaga, D. A. Hadipurnawan, F. Sahidi,
“OBD-II and Raspberry Pi technology to diagnose car’s machine
current condition: study literature," Library Hi Tech News, vol. 34,
no. 10, pp. 15-21, 2017.
[4] S. H. Baek and J. W. Jang, “Implementation of integrated OBD-II
connector with external network,” Information Systems, vol. 50,
pp. 69-75, 2015.
[5] Y. J. Pan, T. C. Yu, and R. S. Cheng , “Using OBD-II data to
explore driving behavior model,” Proceedings of the 2017 IEEE
International Conference on Applied System Innovation IEEE-ICASI ,
13-17 May 2017.
[6] M. Carignani, S. Ferrini, M. Petracca, M. Falcitelli and P. Pagano,
“A prototype bridge between automotive and the IoT,” Proc. IEEE 2nd
World Forum on Internet of Things (WF-IoT), 14-16 Dec. 2015.
Fig. 7. Screenshot of the charts page [7] M. Nathanson, “Vehicle intelligence and remote wireless OBD,”
SAE Transactions, Journal of Commercial Vehicles, vol. 109, Section
2: pp. 826-837, 2000.
V. CONCLUSION
[8] “OBD II, OnBoard diagnostic, OBD solutions for vehicles | iWave
This paper presents the design and implementation of an systems,” https://www.iwavesystems.com/obd-ii-connected-car-device,
IoT-based vehicle diagnostic monitoring system. In accessed 2019.
contrast with the conventional OBD systems, in which [9] Prasad (2019), “OBD modes and configuration (PID) - Outils OBD
facile," https://www.outilsobdfacile.com/obd-mode-pid.php, accessed
the mechanics access the diagnostic parameters of 2019.
vehicle by direct connection of an OBD scan tool, the [10] J. Laukkonen, “The ELM327 microcontroller will change the way
proposed system enables remote access to the OBD data. you work on your car,” updated June 24, 2019,
The scan tool collects the vehicle’s parameters from the https://www.lifewire.com/elm327-microcontroller-car-diagnostics-
OBD terminal and a Raspberry Pi transmits them to a 534688
Cloud server. Users can access the data online, by [12] C. W. Zhao, J. Jegatheesan and S. C. Loon, “Exploring IoT
application using Raspberry pi,” International Journal of Computer
executing an on-line application on their smartphones Networks and Applications, vol. 2, no. 1, pp. 27-34, January - February
and computers. 2015.
[13] “Getting Started - python-OBD,” https://python-
An algorithm is also proposed to detect faults in engine obd.readthedocs.io/en/latest/, accessed 2019.
and cooling systems. Further research is required to [14] M. Leki and G. Gardaševi, “IoT sensor integration to Node-
make this algorithm capable for real-time detection. RED platform,” Proc. 17th IEEE International Symposium Infoteh-
Jahorina (INFOTEH), 21-23 March 2018.
REFERENCES [15] K. J. M. Seyfert, “OBD II Generic PID Diagnosis,” Motor,
[1] G. Panga, S. Zamfir, T. Blan, and O. Popa, “IoT diagnostics for pp. 52-60, 2007. https://www.motor.com/magazine-summary/obd-ii-
connected cars,” Scientific Research and Education in the Air Force- generic-pid-diagnosis-september-2007/
AFASES, pp. 287-294, 2016.

You might also like