diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle index 640e7c16a50e5a08abb1cdc852120553036a13f2..9f06e041770a684127515c8483b7d5a2a239ca42 100644 Binary files a/doc/build/doctrees/environment.pickle and b/doc/build/doctrees/environment.pickle differ diff --git a/doc/build/doctrees/source_rst/developing_hardware_components.doctree b/doc/build/doctrees/source_rst/developing_hardware_components.doctree index b12600c989698c71f5a68b52c06f4bd49b6d9e74..437534bda016dddb6d5fc6d8765d201d1a2a02d1 100644 Binary files a/doc/build/doctrees/source_rst/developing_hardware_components.doctree and b/doc/build/doctrees/source_rst/developing_hardware_components.doctree differ diff --git a/doc/build/doctrees/source_rst/hardware/mb/mb_2024.doctree b/doc/build/doctrees/source_rst/hardware/mb/mb_2024.doctree index b23f498d4f879fcf7ade256089744280d7090c77..06834448c818a05dde7b24827271a79c7ca4a950 100644 Binary files a/doc/build/doctrees/source_rst/hardware/mb/mb_2024.doctree and b/doc/build/doctrees/source_rst/hardware/mb/mb_2024.doctree differ diff --git a/doc/build/doctrees/source_rst/software.doctree b/doc/build/doctrees/source_rst/software.doctree index 85ce1db6a4efc944b4b837cfcf6b42a7179803a3..8bcaf5519f0bfb69616a44bea3c7e4baac683e97 100644 Binary files a/doc/build/doctrees/source_rst/software.doctree and b/doc/build/doctrees/source_rst/software.doctree differ diff --git a/doc/build/doctrees/source_rst/software/architecture.doctree b/doc/build/doctrees/source_rst/software/architecture.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7ba0552a2506dc8f53c541e5003077e88ce98162 Binary files /dev/null and b/doc/build/doctrees/source_rst/software/architecture.doctree differ diff --git a/doc/build/doctrees/source_rst/software/developments.doctree b/doc/build/doctrees/source_rst/software/developments.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8afadea191191b2213ecd5e6275186d5d1b3dd0c Binary files /dev/null and b/doc/build/doctrees/source_rst/software/developments.doctree differ diff --git a/doc/build/doctrees/source_rst/software/installation.doctree b/doc/build/doctrees/source_rst/software/installation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a19904ed774500050fd30d5de5a52e946fa4ad04 Binary files /dev/null and b/doc/build/doctrees/source_rst/software/installation.doctree differ diff --git a/doc/build/doctrees/source_rst/software/operations.doctree b/doc/build/doctrees/source_rst/software/operations.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2129f78d343b753896edab13c74b3f8f8f60a514 Binary files /dev/null and b/doc/build/doctrees/source_rst/software/operations.doctree differ diff --git a/doc/build/html/_sources/source_rst/developing_hardware_components.rst.txt b/doc/build/html/_sources/source_rst/developing_hardware_components.rst.txt index fa97c06af7b7d85f415e829f9b9acc560960621f..55736fb5df94700adcdb4e813a95e7332a75c9f6 100644 --- a/doc/build/html/_sources/source_rst/developing_hardware_components.rst.txt +++ b/doc/build/html/_sources/source_rst/developing_hardware_components.rst.txt @@ -1,7 +1,8 @@ Software interface to new hardware components ============================================= -*** DRAFT VERSION - TO BE REVIEWED * +*** DRAFT VERSION - TO BE REVIEWED *** + This section is intended for developers of a new hardware component as part of an OhmPi system. It presents some advices and best practices that should help developing new hardware components to work diff --git a/doc/build/html/_sources/source_rst/hardware/mb/mb_2024.rst.txt b/doc/build/html/_sources/source_rst/hardware/mb/mb_2024.rst.txt index e7c14fe3b474c6be595776899e66690425229b8e..57d84aaf74c37a37f5fe9075586485472430060f 100644 --- a/doc/build/html/_sources/source_rst/hardware/mb/mb_2024.rst.txt +++ b/doc/build/html/_sources/source_rst/hardware/mb/mb_2024.rst.txt @@ -126,6 +126,9 @@ Soldering `DIODE <https://www.fluke.com/en-us/learn/blog/electrical/what-is-a-di | | Installation of female header, 1 by 10 pins, for ADS1115 | | | | +--------+-------------------------------------------------------------------+ + + + +--------+-------------------------------------------------------------------+ | | .. image:: ../../../img/mb.2024.x.x/5.jpg | | 5 +-------------------------------------------------------------------+ | | Installation of female header, 1 by 10 pins, for ADS1115 | diff --git a/doc/build/html/_sources/source_rst/software.rst.txt b/doc/build/html/_sources/source_rst/software.rst.txt index d31d9d8e46078672cf4004a51289553dc7385b84..013271742074468a32c7a80153f195195d483d7f 100644 --- a/doc/build/html/_sources/source_rst/software.rst.txt +++ b/doc/build/html/_sources/source_rst/software.rst.txt @@ -1,250 +1,15 @@ -******************************************** Software and operation -******************************************** +###################### .. warning:: **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OhmPi. The OhmPi team cannot be held responsible if the equipment does not work after assembly.** +This section details describes the Python software and how to interact with an OhmPi instrument. -System architecture -------------------- +.. toctree:: -The OhmPi V2023 software is designed around a new architecture whose main components are summarized in the figure below. + Software architecture <software/architecture> + Installation <software/installation> + Operating the instrument <software/operations> + How to contribute <software/developments> -.. figure:: ../img/architecture.png - - Software architecture of OhmPi V2023. - -The general system configuration is defined in the `config.py` file covered in the `Configuration file`_ section. -The acquisition settings (i.e. injection duration, stacks...) are defined in a separate JSON file (default: ohmpi_settings.json). - -The central software component is the ohmpi.py file that contains the OhmPi class that interacts with the hardware. Other python files include utils and handlers (see the `Loggers`_ section for more details). -A communication layer (I/O interface) on top of OhmPi allows for different user interfaces depending on the use cases (see `Interfaces and applications`_). - -Loggers -------- - -Loggers have been introduced in this release. They use the excellent logging python package. -Specific handlers have been implemented for running with ohmpi.py (one for logging to an mqtt broker (see `MQTT interface`_ for more details) and one for creating zipped rotated logs on disk). - -Two loggers have been defined. The first one is dedicated to log operations execution. It is named exec_logger. The second one, named data_logger, is dedicated to log data. A third one is planned to log the state of health (SOH) of the system in a future version. - -By default, logs are written to the console (print-like), stored locally in files (a zip is created after some time i.e. every day and/or when the size of the log exceeds a maximum size) and sent to an MQTT broker. Different logging levels may be defined for the different logs and handlers in the `Configuration file`_. - -Advanced users may write new handlers and edit the `setup_loggers.py` file to customize the logging mechanisms to their needs. - -Configuration file ------------------- - -The configuration of the OhmPi file `config.py` allows to configure the OhmPi. -A default version of `config.py` is provided in the repository. -This file should be edited to customize the configuration following the user's needs and preferences. - -The configuration includes setting the logging level desired for the different loggers and handlers, setting the mqtt broker(s) used for logging and control of the OhmPi and defining the options used for MQTT communication (i.e. username, password, security options...) - -One should make sure to understand the parameters before altering them. It is also recommended to keep a copy of the default configuration. - - - -Interfaces and applications ---------------------------- - -Different interfaces can be used to interact with the OhmPi. - -Available interfaces are: -- `Web interface`_ (=HTTP interface): run in bash: `bash run_http_interface.sh` -- Python API: import the OhmPi class from Python script: `from ohmpi import OhmPi` (see `Python interface`_) -- MQTT: IoT messaging through a broker (see `MQTT interface`_) - - -Web interface -............. - -This is a user friendly graphical interface for new users as well as running quick and easy acquisitions. - -The Raspberry Pi of the OhmPi is used as a Wi-Fi Access Point (AP) and runs -a small webserver to serve the 'index.html' interface. Using a laptop or -a mobile phone connected to the Wi-Fi of the Raspberry Pi, one can see this -interface, upload sequences, change parameters, run a sequence and download data. - -To configure the Raspberry Pi to act as an access point and run -the webserver automatically on start, see instructions on `raspap.com <https://raspap.com/>`_ and in 'runOnStart.sh'. - -Once configured, the webserver should start by itself on start and once -connected to the Pi, the user can go to `10.3.141.1:8080 <http://10.3.141.1:8080>`_ -to access the interface. - -.. figure:: ../img/http-interface-pseudo-section.png - - Web interface with its interactive pseudo-section. - - -.. figure:: ../img/http-interface-evolution.png - - Evolution of quadrupole apparent resistivity with time. - - -.. figure:: ../img/http-interface-rs.png - - Contact resistance check. - - - -Python interface -................ - -This interface offers a more direct access to the software components especially well suited for testing or automation on the Raspberry Pi. - -By importing the `OhmPi` class from the ohmpi.py, one can control the OhmPi using interactive IPython. -Typically, it involves using the terminal or an Python IDE such as Thonny on the Raspberry Pi. One can also connect using -ssh and run the Python interface (see PuTTY on Windows or ssh command on macOS/Linux). - -To access the Python API, make sure the file ohmpi.py is in the same -directory as where you run the commands/script. The file ohmpi.py can -be found on the OhmPi gitlab repository. We recommend downloading the -entire repository as ohmpi.py import other .py files and default configuration -files (.json and .py). - - -.. code-block:: python - :caption: Example of using the Python API to control OhmPi - - import os - import numpy as np - import time - os.chdir("/home/pi/OhmPi") - from ohmpi import OhmPi - - ### Define object from class OhmPi - k = OhmPi() # this loads default parameters from the disk - - ### Default parameters can also be edited manually - k.settings['injection_duration'] = 0.5 # injection time in seconds - k.settings['nb_stack'] = 1 # one stack is two half-cycles - k.settings['nbr_meas'] = 1 # number of time the sequence is repeated - - ### Update settings if needed - k.update_settings({"injection_duration":0.2}) - - ### Set or load sequence - k.sequence = np.array([[1,2,3,4]]) # set numpy array of shape (n,4) - # k.set_sequence('1 2 3 4\n2 3 4 5') # call function set_sequence and pass a string - # k.load_sequence('ABMN.txt') # load sequence from a local file - - ### Run contact resistance check - k.rs_check() - - ### Run sequence (synchronously - it will wait that all - # sequence is measured before returning the prompt - k.run_sequence() - # k.run_sequence_async() # sequence is run in a separate thread and the prompt returns immediately - # time.sleep(2) - # k.interrupt() # kill the asynchron sequence - - ### Run multiple sequences at given time interval - k.settings['nb_meas'] = 3 # run sequence three times - k.settings['sequence_delay'] = 100 # every 100 s - k.run_multiple_sequences() # asynchron - # k.interrupt() # kill the asynchron sequence - - ### Single measurement can also be taken with - k.switch_mux_on([1, 4, 2, 3]) - k.run_measurement() # use default acquisition parameters - k.switch_mux_off([1, 4, 2, 3]) # don't forget this! risk of short-circuit - - ### Custom or adaptative argument, see help(k.run_measurement) - k.run_measurement(nb_stack=4, # do 4 stacks (8 half-cycles) - injection_duration=2, # inject for 2 seconds - autogain=True) # adapt gain of ADS to get good resolution - - - -MQTT interface -.............. - -This is an interface designed for an advanced remote usage of the OhmPi such as remote automation, data consumption by multiple processes and interaction with other sensors in the scope of a monitoring. It is based on the MQTT protocol, designed for the Internet of Things (IoT), to interact with the OhmPi. - -This option allows interacting remotely with a single OhmPi, a network of OhmPis, as well as auxiliary instruments and sensors. The communication is based on a publish/subscribe approach and involves a MQTT broker. - -An example of MQTT broker that can be used is `Mosquitto <https://mosquitto.org/>`_. Depending on the monitoring needs, an MQTT broker can be set up locally on the Raspberry Pi, on a local network or any remote server reachable through the net. A local Mosquitto broker can be set up and enabled to run as a service on the OhmPi using the bash script install_local_mqtt_broker.sh. - -MQTT messages include logging messages from the OhmPi and commands sent to the OhmPi. These messages can be examined easily using a third party software such as `MQTT Explorer <http://mqtt-explorer.com/>`_. - -Commands sent on the broker are received by the ohmpi.py script that runs on the OhmPi (make sure ohmpi.py starts on reboot) and further processed. -MQTT commands are sent in JSON format following the Python API with kwargs as illustrated below: - -.. code-block:: json - :caption: Updating acquisition settings. - - { - "cmd_id": "3fzxv121UITwGjWYgcz4xw", - "cmd": "update_settings", Depending on the experiment needs, MQTT brokers can be set up locally on the Raspberry Pi or on a local or remote server. - "kwargs": { - "config": { - "nb_meas": 2, - "nb_electrodes": 10, - "nb_stack": 2, - "injection_duration": 2, - "sequence_delay": 100 - } - } - } - - -.. code-block:: json - :caption: Check contact resistances - - { - "cmd_id": "3fzxv121UITwGjWYgcz4xw", - "cmd": "rs_check", - } - -.. code-block:: json - :caption: Running a sequence. - - { - "cmd_id": "3fzxv121UITwGjWYgcz4Yw", - "cmd": "run_sequence", - } - -.. code-block:: json - :caption: Running same sequence multiple times (nb_meas). - - { - "cmd_id": "3fzxv121UITwGjWYgcz4Yw", - "cmd": "run_multiple_sequences", - } - -.. code-block:: json - :caption: Interrupt current acquisition. - - { - "cmd_id": "3fzxv121UITwGjWYgcz4xw", - "cmd": "interrupt", - } - -Custom processing of messages and tailor-made dashboards for monitoring experiments may be designed using a browser-based flow editor such as `Node-red <http://mqtt-explorer.com/>`_. -This may help designing complex IoT experiments and monitoring systems in which OhmPi is a component. - -Examples incorporating execution commands and data outputs from OhmPi can be found in the OhmPi examples. Once Node-RED is installed on the OhmPi, these examples can be accessed separately by running a command in the console such as : - -.. code-block:: console - node-red basic_ohmpi_flows_node-red.json - -These examples may require installing some additional node packages in order to work properly. This can be done in the `Palette Manager <https://nodered.org/docs/user-guide/editor/palette/manager> within Node-RED. - -.. figure:: ../img/node-red_flow.png - - Example flow in node-red to interact with an OhmPi. - - -.. figure:: ../img/node-red_interface_control.png - - Example of a dashboard UI created with node-red to interact with an OhmPi - control tab. - -.. figure:: ../img/node-red_interface_data.png - - Example of a dashboard UI created with node-red to interact with an OhmPi - data visualization tab. - - -For more documentation dedicated to node-red, please refer to the Node-red `cookbooks <https://cookbook.nodered.org/>`_. diff --git a/doc/build/html/_sources/source_rst/software/architecture.rst.txt b/doc/build/html/_sources/source_rst/software/architecture.rst.txt new file mode 100644 index 0000000000000000000000000000000000000000..ca25b7f618c4f2f65159f5e27ae842e6f7710e60 --- /dev/null +++ b/doc/build/html/_sources/source_rst/software/architecture.rst.txt @@ -0,0 +1,52 @@ +Software architecture +********************* + +The OhmPi V2024 software has been completely re-structured to enable increased flexibility for both users and developers. The software is based on an object-oriented module with a class exposing the OhmPi +functionalities used to interact with the OhmPi instrument via a web interface, IoT +communication protocols (e.g. MQTT) and/or directly through the Python API. + +.. figure:: ../../img/architecture.png + + Software architecture of OhmPi V2024. + +The software is organised in several modules describing the system in a hierarchy including three levels of description and +operation of the OhmPi. + +Hardware components +=================== +On the base level, the five main hardware components are represented by distinct classes exposing the +components atomic functionalities. Theses classes are abstract classes in order to provide a common +interface for different implementations of a component. From these abstract classes concrete classes +are implemented representing the default properties, actual capabilities and ways to interact with the +physical modules or boards. +Improving an existing hardware component or introducing a new design may be desirable in order to, +e.g. reduce costs, improve performance, adapt measurement range to specific applications, or +incorporate easily available electronic components. It is at this level that software developments are +mainly expected to occur following updates on the hardware. The component class should expose the +minimal functionalities required by the hardware system (see below) for this type of component. + +Hardware system +=============== +On the medium level, the OhmPiHardware class provides a mean to assemble and operate the +acquisition system. The methods of this class orchestrate atomic operations of the system components +in order to expose basic system functionalities such as cross-MUX switching, square wave voltage +injection or full waveform voltage and current reading during injection cycles. These functionalities +are implemented using synchronization mechanisms between threads in order to insure that each +component keeps in step with the others. +The whole system is described in a configuration file listing the hardware components and versions +used. Through a dynamic import mechanism the modules containing the classes corresponding with +the physical hardware modules of a particular OhmPi system are instantiated and associated with the +system object instantiated from the OhmPiHardware class. In this way, it is relatively simple to build +customised systems once the concrete classes describing the system components have been written. +This part of the software architecture should remain stable if the overall system functionalities do not +evolve. However, the introduction of new functionalities at the system level or radical changes in the +way the components work together will require adaptations at this level. + +Acquisition +=========== +On the top level, the OhmPi class (in ohmpi/ohmpi.py) includes all the higher-level methods and properties allowing to +operate the system (e.g. acquire measurement sequences). The OhmPi class exposes the user-oriented +API, generates logs and handles IoT messages. Generic users are expected to interact with the system +through these higher-level functionalities, which are designed to remain as stable as possible while the +hardware evolves. Only the introduction of new end-user functionalities should imply new +developments at this level. See \ No newline at end of file diff --git a/doc/build/html/_sources/source_rst/software/developments.rst.txt b/doc/build/html/_sources/source_rst/software/developments.rst.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/doc/build/html/_sources/source_rst/software/installation.rst.txt b/doc/build/html/_sources/source_rst/software/installation.rst.txt new file mode 100644 index 0000000000000000000000000000000000000000..0052606f9cf10fe97dd35241e9d660bb45bbf434 --- /dev/null +++ b/doc/build/html/_sources/source_rst/software/installation.rst.txt @@ -0,0 +1,49 @@ +Installation +************ + +Step 1: Connect to the Raspberry Pi +=================================== + +Step 2: Clone the OhmPi project +=============================== + +Step 3: Run the installation script +=================================== + +Simply navigate to the OhmPi folder and run the following command on the terminal: + +.. code-block:: bash + + $ .install.sh + +The install script first creates an python virtual environment called "ohmpy" in which all dependencies will be installed. Dependecies are specified in requirements.txt +When the installation is completed check that requirements are met using pip list. +It then installs a local MQTT broker which will be used to centralise all the communication between the hardware, software and interfaces. +It also properly configures the I2C buses on the raspberry Pi. + +When the installation is performed, we need to add the OhmPi module to the environment by editing the PYTHONPATH or editing the .bashrc file as follows: + +.. code-block:: bash + + $ nano ~/.bashrc + +And add the following line: + +.. code-block:: bash + + $export PYTHONPATH=$PYTHONPATH:/home/<username>/OhmPi + +Step 4: Activate the ohmpy virtual environment +============================================== +Before operating the instrument, we need to activate the ohmpy virtual environment with the following command: + +.. code-block:: bash + + $ cd ~/OhmPi + $ source ohmpy/bin/activate + +If you need to leave the virtual environment, simply type: + +.. code-block:: bash + + $ deactivate \ No newline at end of file diff --git a/doc/build/html/_sources/source_rst/software/operations.rst.txt b/doc/build/html/_sources/source_rst/software/operations.rst.txt new file mode 100644 index 0000000000000000000000000000000000000000..c19b404c04821a4de4db466e1dd9736c19369950 --- /dev/null +++ b/doc/build/html/_sources/source_rst/software/operations.rst.txt @@ -0,0 +1,230 @@ + +Configuration file +================== + +The configuration of the OhmPi file `config.py` allows to configure the OhmPi. +A default version of `config.py` is provided in the repository. +This file should be edited to customize the configuration following the user's needs and preferences. + +The configuration includes setting the logging level desired for the different loggers and handlers, setting the mqtt broker(s) used for logging and control of the OhmPi and defining the options used for MQTT communication (i.e. username, password, security options...) + +One should make sure to understand the parameters before altering them. It is also recommended to keep a copy of the default configuration. + + + +Interfaces and applications +=========================== + +Different interfaces can be used to interact with the OhmPi. + +Available interfaces are: +- `Web interface`_ (=HTTP interface): run in bash: `bash run_http_interface.sh` +- Python API: import the OhmPi class from Python script: `from ohmpi import OhmPi` (see `Python interface`_) +- MQTT: IoT messaging through a broker (see `MQTT interface`_) + + +Web interface +............. + +This is a user friendly graphical interface for new users as well as running quick and easy acquisitions. + +The Raspberry Pi of the OhmPi is used as a Wi-Fi Access Point (AP) and runs +a small webserver to serve the 'index.html' interface. Using a laptop or +a mobile phone connected to the Wi-Fi of the Raspberry Pi, one can see this +interface, upload sequences, change parameters, run a sequence and download data. + +To configure the Raspberry Pi to act as an access point and run +the webserver automatically on start, see instructions on `raspap.com <https://raspap.com/>`_ and in 'runOnStart.sh'. + +Once configured, the webserver should start by itself on start and once +connected to the Pi, the user can go to `10.3.141.1:8080 <http://10.3.141.1:8080>`_ +to access the interface. + +.. figure:: ../../img/http-interface-pseudo-section.png + + Web interface with its interactive pseudo-section. + + +.. figure:: ../../img/http-interface-evolution.png + + Evolution of quadrupole apparent resistivity with time. + + +.. figure:: ../../img/http-interface-rs.png + + Contact resistance check. + + + +Python interface +................ + +This interface offers a more direct access to the software components especially well suited for testing or automation on the Raspberry Pi. + +By importing the `OhmPi` class from the ohmpi.py, one can control the OhmPi using interactive IPython. +Typically, it involves using the terminal or an Python IDE such as Thonny on the Raspberry Pi. One can also connect using +ssh and run the Python interface (see PuTTY on Windows or ssh command on macOS/Linux). + +To access the Python API, make sure the file ohmpi.py is in the same +directory as where you run the commands/script. The file ohmpi.py can +be found on the OhmPi gitlab repository. We recommend downloading the +entire repository as ohmpi.py import other .py files and default configuration +files (.json and .py). + + +.. code-block:: python + :caption: Example of using the Python API to control OhmPi + + import os + import numpy as np + import time + os.chdir("/home/pi/OhmPi") + from ohmpi import OhmPi + + ### Define object from class OhmPi + k = OhmPi() # this loads default parameters from the disk + + ### Default parameters can also be edited manually + k.settings['injection_duration'] = 0.5 # injection time in seconds + k.settings['nb_stack'] = 1 # one stack is two half-cycles + k.settings['nbr_meas'] = 1 # number of time the sequence is repeated + + ### Update settings if needed + k.update_settings({"injection_duration":0.2}) + + ### Set or load sequence + k.sequence = np.array([[1,2,3,4]]) # set numpy array of shape (n,4) + # k.set_sequence('1 2 3 4\n2 3 4 5') # call function set_sequence and pass a string + # k.load_sequence('ABMN.txt') # load sequence from a local file + + ### Run contact resistance check + k.rs_check() + + ### Run sequence (synchronously - it will wait that all + # sequence is measured before returning the prompt + k.run_sequence() + # k.run_sequence_async() # sequence is run in a separate thread and the prompt returns immediately + # time.sleep(2) + # k.interrupt() # kill the asynchron sequence + + ### Run multiple sequences at given time interval + k.settings['nb_meas'] = 3 # run sequence three times + k.settings['sequence_delay'] = 100 # every 100 s + k.run_multiple_sequences() # asynchron + # k.interrupt() # kill the asynchron sequence + + ### Single measurement can also be taken with + k.switch_mux_on([1, 4, 2, 3]) + k.run_measurement() # use default acquisition parameters + k.switch_mux_off([1, 4, 2, 3]) # don't forget this! risk of short-circuit + + ### Custom or adaptative argument, see help(k.run_measurement) + k.run_measurement(nb_stack=4, # do 4 stacks (8 half-cycles) + injection_duration=2, # inject for 2 seconds + autogain=True) # adapt gain of ADS to get good resolution + + + +MQTT interface +.............. + +This is an interface designed for an advanced remote usage of the OhmPi such as remote automation, data consumption by multiple processes and interaction with other sensors in the scope of a monitoring. It is based on the MQTT protocol, designed for the Internet of Things (IoT), to interact with the OhmPi. + +This option allows interacting remotely with a single OhmPi, a network of OhmPis, as well as auxiliary instruments and sensors. The communication is based on a publish/subscribe approach and involves a MQTT broker. + +An example of MQTT broker that can be used is `Mosquitto <https://mosquitto.org/>`_. Depending on the monitoring needs, an MQTT broker can be set up locally on the Raspberry Pi, on a local network or any remote server reachable through the net. A local Mosquitto broker can be set up and enabled to run as a service on the OhmPi using the bash script install_local_mqtt_broker.sh. + +MQTT messages include logging messages from the OhmPi and commands sent to the OhmPi. These messages can be examined easily using a third party software such as `MQTT Explorer <http://mqtt-explorer.com/>`_. + +Commands sent on the broker are received by the ohmpi.py script that runs on the OhmPi (make sure ohmpi.py starts on reboot) and further processed. +MQTT commands are sent in JSON format following the Python API with kwargs as illustrated below: + +.. code-block:: json + :caption: Updating acquisition settings. + + { + "cmd_id": "3fzxv121UITwGjWYgcz4xw", + "cmd": "update_settings", Depending on the experiment needs, MQTT brokers can be set up locally on the Raspberry Pi or on a local or remote server. + "kwargs": { + "config": { + "nb_meas": 2, + "nb_electrodes": 10, + "nb_stack": 2, + "injection_duration": 2, + "sequence_delay": 100 + } + } + } + + +.. code-block:: json + :caption: Check contact resistances + + { + "cmd_id": "3fzxv121UITwGjWYgcz4xw", + "cmd": "rs_check", + } + +.. code-block:: json + :caption: Running a sequence. + + { + "cmd_id": "3fzxv121UITwGjWYgcz4Yw", + "cmd": "run_sequence", + } + +.. code-block:: json + :caption: Running same sequence multiple times (nb_meas). + + { + "cmd_id": "3fzxv121UITwGjWYgcz4Yw", + "cmd": "run_multiple_sequences", + } + +.. code-block:: json + :caption: Interrupt current acquisition. + + { + "cmd_id": "3fzxv121UITwGjWYgcz4xw", + "cmd": "interrupt", + } + +Custom processing of messages and tailor-made dashboards for monitoring experiments may be designed using a browser-based flow editor such as `Node-red <http://mqtt-explorer.com/>`_. +This may help designing complex IoT experiments and monitoring systems in which OhmPi is a component. + +Examples incorporating execution commands and data outputs from OhmPi can be found in the OhmPi examples. Once Node-RED is installed on the OhmPi, these examples can be accessed separately by running a command in the console such as : + +.. code-block:: console + + node-red basic_ohmpi_flows_node-red.json + +These examples may require installing some additional node packages in order to work properly. This can be done in the `Palette Manager <https://nodered.org/docs/user-guide/editor/palette/manager>`_ within Node-RED. + +.. figure:: ../../img/node-red_flow.png + + Example flow in node-red to interact with an OhmPi. + + +.. figure:: ../../img/node-red_interface_control.png + + Example of a dashboard UI created with node-red to interact with an OhmPi - control tab. + +.. figure:: ../../img/node-red_interface_data.png + + Example of a dashboard UI created with node-red to interact with an OhmPi - data visualization tab. + + +For more documentation dedicated to node-red, please refer to the Node-red `cookbooks <https://cookbook.nodered.org/>`_. + + +Loggers +------- + +Loggers have been introduced in this release. They use the excellent logging python package. +Specific handlers have been implemented for running with ohmpi.py (one for logging to an mqtt broker (see `MQTT interface`_ for more details) and one for creating zipped rotated logs on disk). + +Two loggers have been defined. The first one is dedicated to log operations execution. It is named exec_logger. The second one, named data_logger, is dedicated to log data. A third one is planned to log the state of health (SOH) of the system in a future version. + +By default, logs are written to the console (print-like), stored locally in files (a zip is created after some time i.e. every day and/or when the size of the log exceeds a maximum size) and sent to an MQTT broker. Different logging levels may be defined for the different logs and handlers in the `Configuration file`_. + +Advanced users may write new handlers and edit the `setup_loggers.py` file to customize the logging mechanisms to their needs. diff --git a/doc/build/html/index.html b/doc/build/html/index.html index f2fddd23585af171e76c558dbd46e93c35779ca1..e9531fa07586368bbb4dcd340c17549303e46c28 100644 --- a/doc/build/html/index.html +++ b/doc/build/html/index.html @@ -131,10 +131,10 @@ </ul> </li> <li class="toctree-l1"><a class="reference internal" href="source_rst/software.html">Software and operation</a><ul> -<li class="toctree-l2"><a class="reference internal" href="source_rst/software.html#system-architecture">System architecture</a></li> -<li class="toctree-l2"><a class="reference internal" href="source_rst/software.html#loggers">Loggers</a></li> -<li class="toctree-l2"><a class="reference internal" href="source_rst/software.html#configuration-file">Configuration file</a></li> -<li class="toctree-l2"><a class="reference internal" href="source_rst/software.html#interfaces-and-applications">Interfaces and applications</a></li> +<li class="toctree-l2"><a class="reference internal" href="source_rst/software/architecture.html">Software architecture</a></li> +<li class="toctree-l2"><a class="reference internal" href="source_rst/software/installation.html">Installation</a></li> +<li class="toctree-l2"><a class="reference internal" href="source_rst/software/operations.html">Configuration file</a></li> +<li class="toctree-l2"><a class="reference internal" href="source_rst/software/operations.html#interfaces-and-applications">Interfaces and applications</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="source_rst/api.html">API reference</a><ul class="simple"> diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv index 10e837aff9e127334118bdc6dcd095bfbc428f83..858782b33946935f607520ec583d8222bcb23779 100644 Binary files a/doc/build/html/objects.inv and b/doc/build/html/objects.inv differ diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js index 48c1bd9203681739ca5e94ccda8ee58ac32887f7..de302fc56d32d7652b4be3781dd975c190d56af4 100644 --- a/doc/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "source_rst/Ohmpi", "source_rst/V2023.x.x/V2023_step_03", "source_rst/api", "source_rst/archived_version", "source_rst/developing_hardware_components", "source_rst/gallery", "source_rst/hardware", "source_rst/hardware/assembling", "source_rst/hardware/hw_info", "source_rst/hardware/hw_pwr", "source_rst/hardware/hw_rpi", "source_rst/hardware/mb", "source_rst/hardware/mb/mb_2023", "source_rst/hardware/mb/mb_2024", "source_rst/hardware/mux_2023", "source_rst/hardware/mux_2024", "source_rst/software", "source_rst/troubleshooting", "source_rst/v1.xx/V1_01", "source_rst/v1.xx/V1_02"], "filenames": ["index.rst", "source_rst\\Ohmpi.rst", "source_rst\\V2023.x.x\\V2023_step_03.rst", "source_rst\\api.rst", "source_rst\\archived_version.rst", "source_rst\\developing_hardware_components.rst", "source_rst\\gallery.rst", "source_rst\\hardware.rst", "source_rst\\hardware\\assembling.rst", "source_rst\\hardware\\hw_info.rst", "source_rst\\hardware\\hw_pwr.rst", "source_rst\\hardware\\hw_rpi.rst", "source_rst\\hardware\\mb.rst", "source_rst\\hardware\\mb\\mb_2023.rst", "source_rst\\hardware\\mb\\mb_2024.rst", "source_rst\\hardware\\mux_2023.rst", "source_rst\\hardware\\mux_2024.rst", "source_rst\\software.rst", "source_rst\\troubleshooting.rst", "source_rst\\v1.xx\\V1_01.rst", "source_rst\\v1.xx\\V1_02.rst"], "titles": ["OHMPI: Open source and open hardware resistivity-meter", "OhmPi project", "<strong>STEP n\u00b03:</strong> MUX board", "API reference", "Archived versions", "Software interface to new hardware components", "Examples of applications", "Hardware", "Assembling the OhmPi", "OhmPi electronic design", "Power supply", "Raspberry Pi configuration", "Measurement board", "Measurement board v2023", "Measurement board 2024.0.2", "MUX board v2023", "MUX board v2024", "Software and operation", "Troubleshooting", "OhmPi V 1.01 (limited to 32 electrodes)", "OhmPi V 1.02 (limited to 32 electrodes)"], "terms": {"releas": [0, 17], "v2024rc": 0, "date": [0, 19, 20], "jan": 0, "09": [0, 19, 20], "2024": [0, 9, 12], "start": [0, 2, 5, 11, 12, 15, 16, 17, 19, 20], "juli": 0, "2016": 0, "author": [0, 11, 19, 20], "r\u00e9mi": [0, 1], "clement": [0, 1], "nicola": [0, 1], "forquet": [0, 1], "yannick": [0, 1], "fargier": [0, 1], "vivien": [0, 1], "duboi": [0, 1], "h\u00e9l\u00e8ne": [0, 1], "guyard": [0, 1], "olivi": [0, 1], "kaufmann": [0, 1], "guillaum": [0, 1], "blanchi": [0, 1], "arnaud": [0, 1], "watlet": [0, 1], "target": 0, "user": [0, 11, 17, 19, 20], "research": 0, "develop": [0, 1, 5, 11, 13, 14, 19, 20], "statu": 0, "some": [0, 5, 9, 17, 19, 20], "matur": 0, "progress": 0, "offici": 0, "guidelin": 0, "gener": [0, 2, 7, 9, 13, 14, 15, 16, 17, 19, 20], "tutori": 0, "content": 0, "project": [0, 2, 5, 8, 11, 13, 14, 15, 16, 17, 19, 20], "partner": 0, "cite": 0, "introduct": 0, "electron": [0, 1, 2, 7, 8, 11, 12, 13, 14, 15, 16, 17, 19, 20], "design": [0, 5, 7, 17, 19, 20], "measur": [0, 1, 2, 7, 8, 11, 15, 16, 17, 18], "board": [0, 5, 7, 8, 11, 18], "mux": [0, 7, 8, 19, 20], "v2023": [0, 7, 9, 12, 17, 18], "v2024": [0, 7, 9, 12, 18], "power": [0, 2, 7, 8, 12, 13, 14, 15, 16, 19, 20], "suppli": [0, 2, 7, 8, 12, 13, 14, 15, 16, 19, 20], "raspberri": [0, 2, 7, 8, 13, 14, 15, 16, 17], "pi": [0, 7, 8, 13, 14, 17], "configur": [0, 5, 7, 9], "assembl": [0, 1, 7, 11, 17], "softwar": [0, 11, 19, 20], "oper": [0, 5, 8, 9, 11, 12, 13], "system": [0, 5, 11, 19, 20], "architectur": 0, "logger": [0, 1, 19, 20], "file": [0, 5, 7, 11, 13, 19, 20], "interfac": [0, 14], "applic": [0, 1, 5, 7, 9], "api": [0, 17], "refer": [0, 8, 13, 14, 15, 16, 17, 19, 20], "troubleshoot": 0, "issu": 0, "puls": [0, 9, 12, 19, 20], "between": [0, 2, 8, 9, 13, 15, 16, 19, 20], "A": [0, 1, 5, 7, 8, 9, 10, 12, 17, 19, 20], "b": [0, 7, 8, 9, 10, 12, 14], "valu": [0, 2, 9, 13, 15, 16, 19, 20], "given": [0, 9, 17], "correct": [0, 19, 20], "one": [0, 8, 13, 17, 19, 20], "commun": [0, 1, 9, 17], "compon": [0, 9, 11, 17], "exampl": [0, 2, 8, 13, 15, 16, 17, 19, 20], "new": [0, 11, 17, 18, 19, 20], "archiv": 0, "version": [0, 5, 7, 11, 13, 17, 19, 20], "v": [0, 4, 8, 9, 10, 13, 15, 16, 18], "1": [0, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17], "01": [0, 4, 14, 20], "limit": [0, 4, 13], "32": [0, 4, 8, 11, 14], "electrod": [0, 1, 2, 4, 7, 8, 9, 10, 13, 15, 16, 18], "02": [0, 4, 13, 14, 19], "inra": [1, 6], "reversa": [1, 19, 20], "villeurbann": 1, "franc": 1, "universit\u00e9": 1, "de": 1, "mon": 1, "belgium": 1, "ger": 1, "rro": 1, "univ": 1, "gustav": 1, "eiffel": 1, "ifsttar": 1, "lyon": 1, "ig": 1, "grenobl": 1, "alp": 1, "ilvo": 1, "merelbek": 1, "julien": 1, "ganc": 1, "emil": 1, "gro": 1, "et": [1, 13], "al": 1, "an": [1, 2, 5, 7, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20], "open": [1, 2, 5, 8, 11, 13, 14, 15, 16, 17, 18, 19, 20], "sourc": [1, 5, 10, 11, 14, 19, 20], "data": [1, 9, 14, 17], "dedic": [1, 17], "electr": [1, 13, 14], "resist": [1, 8, 9, 13, 17, 18], "imag": [1, 11], "small": [1, 8, 9, 13, 14, 17, 19, 20], "laboratori": [1, 8, 12, 19, 20], "scale": [1, 9], "hardwarex": 1, "elsevi": 1, "2020": 1, "8": [1, 2, 8, 9, 11, 13, 14, 15, 16, 17, 19, 20], "24": [1, 8, 12, 13, 14, 16, 19, 20], "p": [1, 13, 15, 16], "ff10": 1, "1016": 1, "j": 1, "ohx": 1, "e00122ff": 1, "particip": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "all": [1, 2, 5, 8, 11, 13, 14, 15, 16, 17, 19, 20], "requir": [1, 5, 8, 11, 17, 19, 20], "skill": [1, 2, 8, 11, 12, 13, 14, 15, 16, 17, 19, 20], "respect": [1, 2, 8, 9, 11, 13, 14, 15, 16, 17, 19, 20], "safeti": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "rule": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "must": [1, 2, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20], "profession": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "context": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "peopl": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "compet": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "The": [1, 2, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18], "team": [1, 2, 5, 8, 11, 13, 14, 15, 16, 17, 19, 20], "cannot": [1, 2, 8, 9, 11, 13, 14, 15, 16, 17, 19, 20], "held": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "respons": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "ani": [1, 2, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "materi": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "human": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "damag": [1, 2, 8, 11, 13, 14, 15, 16, 17, 18, 19, 20], "which": [1, 2, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20], "would": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "associ": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "us": [1, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "equip": [1, 2, 8, 9, 11, 13, 14, 15, 16, 17, 19, 20], "doe": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "work": [1, 2, 5, 8, 11, 13, 14, 15, 16, 17, 18, 19, 20], "after": [1, 2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "you": [1, 2, 5, 7, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20], "mai": [1, 11, 17, 18, 19, 20], "redistribut": 1, "modifi": [1, 5, 19, 20], "thi": [1, 2, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "document": [1, 7, 17, 19], "make": [1, 2, 5, 9, 15, 16, 17, 19, 20], "product": [1, 13, 14, 15, 16], "under": [1, 8, 19, 20], "term": [1, 5], "cern": 1, "ohl": 1, "v2": 1, "distribut": [1, 9], "without": [1, 2, 9, 15, 16, 18, 19, 20], "express": [1, 5], "OR": 1, "impli": [1, 2, 15, 16], "warranti": 1, "includ": [1, 2, 5, 11, 15, 16, 17, 19, 20], "OF": 1, "merchant": 1, "satisfactori": 1, "qualiti": 1, "AND": 1, "fit": 1, "FOR": 1, "particular": 1, "purpos": [1, 8, 14, 19, 20], "pleas": [1, 8, 17, 19, 20], "see": [1, 9, 17, 18, 19, 20], "condit": [1, 14], "present": [1, 2, 5, 8, 14, 15, 16, 19, 20], "low": [1, 14, 19, 20], "cost": [1, 5, 13, 14, 15, 16, 19, 20], "hardwar": [1, 17, 19, 20], "meter": [1, 8, 19, 20], "provid": [1, 12, 14, 17, 19, 20], "scientif": 1, "robust": [1, 18, 19, 20], "flexibl": 1, "tool": [1, 14], "experi": [1, 17, 18, 19, 20], "call": [1, 2, 8, 9, 11, 15, 16, 17], "basic": [1, 5], "meterfeatur": 1, "current": [1, 7, 9, 10, 12, 13, 14, 17, 18], "inject": [1, 7, 9, 10, 14, 17], "function": [1, 5, 17, 19, 20], "multiplex": [1, 2, 7, 8, 15, 16], "allow": [1, 2, 13, 14, 15, 16, 17, 19, 20], "perform": [1, 5, 11, 14, 19, 20], "automat": [1, 17, 19, 20], "up": [1, 2, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20], "64": [1, 2, 14, 15, 16, 19, 20], "s": [1, 2, 13, 14, 15, 16, 17, 18, 19, 20], "philosophi": 1, "fulli": 1, "toolto": 1, "surfac": 1, "anyon": 1, "who": 1, "want": [1, 20], "get": [1, 11, 13, 17, 19, 20], "involv": [1, 17], "welcom": [1, 5], "join": 1, "ohmpi": [2, 4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 17, 18], "channel": [2, 12, 14, 15, 16, 19, 20], "mechan": [2, 9, 15, 16, 17, 18, 19, 20], "base": [2, 5, 11, 15, 16, 17, 19, 20], "omron": [2, 14, 15, 16], "manufactur": [2, 13, 14, 15, 16, 19, 20], "relai": [2, 9, 11, 13, 14, 15, 16, 18, 19, 20], "g5le": [2, 14, 15, 16], "vd": [2, 15, 16], "12": [2, 8, 9, 12, 13, 14, 15, 16, 19, 20], "vdc": [2, 12, 14, 15, 16], "each": [2, 8, 9, 11, 12, 15, 16, 19, 20], "combin": [2, 7, 15, 16], "zvn4206a": [2, 15, 16], "mofset": [2, 15, 16], "ha": [2, 9, 11, 12, 14, 15, 16, 18, 19, 20], "onli": [2, 5, 9, 10, 15, 16], "30": [2, 8, 15, 16, 19, 20], "gpio": [2, 8, 9, 11, 14, 15, 16, 19, 20], "enough": [2, 15, 16, 19, 20], "activ": [2, 7, 15, 16], "repres": [2, 15, 16, 19, 20], "512": [2, 15, 16], "we": [2, 7, 9, 10, 11, 13, 15, 16, 17, 18, 19, 20], "expand": [2, 9, 14, 15, 16], "i2c": [2, 9, 11, 13, 14, 15, 16, 18], "mcp23017": [2, 9, 15, 16], "have": [2, 5, 9, 11, 13, 15, 16, 17, 18, 19, 20], "type": [2, 5, 11, 14, 15, 16, 19, 20], "tca9548a": [2, 11, 15, 16], "from": [2, 8, 9, 12, 15, 16, 17, 18, 19, 20], "adafruit": [2, 11, 13, 14, 15, 16, 19, 20], "go": [2, 11, 14, 15, 16, 17], "128": [2, 15, 16], "card": [2, 8, 11, 15, 16], "its": [2, 8, 11, 14, 15, 16, 17, 19, 20], "own": [2, 15, 16], "digit": [2, 9, 13, 14, 15, 16, 19, 20], "0x70": [2, 15, 16], "0x77": [2, 15, 16], "In": [2, 5, 9, 11, 13, 15, 16, 18, 19, 20], "follow": [2, 5, 8, 9, 11, 12, 13, 15, 16, 17, 19, 20], "0x71": [2, 15, 16], "0x72": [2, 15, 16], "m": [2, 8, 9, 11, 13, 15, 16, 19, 20], "0x73": [2, 15, 16], "4": [2, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20], "need": [2, 7, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20], "pcb": [2, 5, 13, 14, 15, 16, 19, 20], "2": [2, 5, 8, 9, 11, 12, 13, 15, 16, 17, 19, 20], "instal": [2, 7, 8, 13, 14, 15, 16, 17], "100": [2, 14, 15, 16, 17, 19, 20], "kohm": [2, 13, 14, 15, 16, 19, 20], "resistor": [2, 9, 12, 13, 14, 15, 16, 18, 19, 20], "mosfet": [2, 14, 15, 16], "diod": [2, 14, 15, 16], "1n4007": [2, 15, 16], "5": [2, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "6": [2, 8, 11, 13, 14, 15, 16, 19, 20], "termin": [2, 8, 11, 13, 14, 15, 16, 17, 19, 20], "screw": [2, 8, 13, 15, 16, 19, 20], "7": [2, 8, 11, 13, 14, 15, 16, 19, 20], "male": [2, 13, 15, 16], "header": [2, 13, 14, 15, 16, 19, 20], "pin": [2, 13, 14, 15, 16, 19, 20], "strip": [2, 8, 13, 14, 15, 16, 19, 20], "16": [2, 8, 9, 13, 14, 15, 16, 19, 20], "9": [2, 8, 11, 13, 14, 15, 16, 19, 20], "dip": [2, 13, 14, 15, 16], "dual": [2, 13, 15, 16, 19, 20], "line": [2, 9, 13, 15, 16, 18, 19, 20], "socket": [2, 13, 14, 15, 16], "14": [2, 8, 13, 14, 15, 16], "10": [2, 8, 13, 14, 15, 16, 17, 19, 20], "duplic": [2, 15, 16], "time": [2, 9, 11, 15, 16, 17, 19, 20], "everi": [2, 15, 16, 17], "To": [2, 13, 15, 16, 17, 18, 19, 20], "build": [2, 7, 15, 16, 19, 20], "necessari": [2, 5, 8, 11, 15, 16, 19, 20], "differ": [2, 7, 8, 9, 11, 13, 14, 15, 16, 17, 19, 20], "It": [2, 5, 10, 11, 14, 15, 16, 17, 18, 19, 20], "therefor": [2, 15, 16, 19, 20], "identifi": [2, 15, 16], "assign": [2, 15, 16], "alloc": [2, 15, 16], "code": [2, 5, 11, 12, 15, 16, 19, 20], "here": [2, 8, 15, 16, 20], "select": [2, 11, 15, 16, 19, 20], "default": [2, 15, 16, 17], "For": [2, 9, 11, 13, 15, 16, 17, 19, 20], "suggest": [2, 13, 15, 16, 19, 20], "mount": [2, 8, 13, 15, 16, 19, 20], "jumper": [2, 15, 16], "note": [2, 8, 15, 16, 19, 20], "name": [2, 5, 15, 16, 17, 19, 20], "zoom": [2, 8, 15, 16], "first": [2, 5, 8, 9, 11, 15, 16, 17], "test": [2, 5, 8, 11, 13, 15, 16, 17, 19, 20], "befor": [2, 8, 9, 15, 16, 17, 19, 20], "them": [2, 15, 16, 17, 19, 20], "definit": [2, 15, 16], "simplifi": [2, 15, 16], "thing": [2, 15, 16, 17], "do": [2, 5, 8, 14, 15, 16, 17], "prepar": [2, 13, 15, 16, 19, 20], "50": [2, 8, 10, 12, 15, 16, 19, 20], "cm": [2, 8, 15, 16, 19, 20], "long": [2, 8, 9, 15, 16], "flat": [2, 15, 16], "wire": [2, 8, 9, 11, 14, 15, 16, 19, 20], "two": [2, 5, 9, 10, 13, 15, 16, 17, 18, 19, 20], "pole": [2, 15, 16, 19, 20], "connector": [2, 8, 15, 16, 19, 20], "cabl": [2, 8, 11, 13, 14, 15, 16, 19, 20], "contact": [2, 13, 15, 16, 17, 19, 20], "connect": [2, 8, 9, 10, 13, 14, 15, 16, 17, 18], "12v": [2, 7, 8, 9, 13, 14, 15, 16, 19, 20], "your": [2, 5, 7, 11, 12, 13, 15, 16, 19, 20], "run": [2, 8, 11, 13, 15, 16, 17, 19, 20], "write": [2, 5, 13, 15, 16, 17, 19, 20], "i2cdetect": [2, 13, 15, 16], "y": [2, 13, 15, 16], "three": [2, 13, 15, 16, 17, 19, 20], "should": [2, 5, 8, 9, 11, 13, 15, 16, 17, 19, 20], "appear": [2, 11, 13, 15, 16, 19, 20], "been": [2, 11, 12, 14, 15, 16, 17, 19, 20], "detect": [2, 15, 16], "script": [2, 5, 15, 16, 17], "test_mux_board": [2, 15, 16], "py": [2, 5, 13, 15, 16, 17, 19, 20], "These": [4, 7, 9, 17, 18, 19, 20], "ar": [4, 5, 8, 9, 10, 11, 12, 13, 17, 18, 19, 20], "support": [4, 11], "anymor": [4, 18], "draft": 5, "TO": [5, 16, 18], "BE": [5, 16, 18], "review": [5, 18], "section": [5, 7, 12, 17, 19, 20], "intend": 5, "part": [5, 7, 9, 12, 18, 19, 20], "advic": [5, 18], "best": 5, "practic": [5, 19, 20], "help": [5, 8, 9, 17], "within": [5, 11, 17, 19, 20], "contribut": 5, "howev": [5, 9, 14, 19, 20], "order": [5, 17, 19, 20], "maintain": 5, "track": [5, 19, 20], "promot": 5, "exchang": 5, "reus": 5, "contributor": 5, "ideal": 5, "few": 5, "step": [5, 11, 13, 15, 16, 19, 20], "case": [5, 11, 17, 18, 19, 20], "distinguish": 5, "when": [5, 8, 10, 17, 18, 19, 20], "deal": 5, "compli": 5, "wai": [5, 11, 19, 20], "Such": 5, "typic": [5, 9, 17, 19, 20], "focu": 5, "improv": [5, 20], "exist": [5, 7, 19, 20], "reduc": [5, 9], "adapt": [5, 13, 17, 19, 20], "rang": [5, 12, 18, 19, 20], "specif": [5, 7, 14, 17, 19, 20], "easili": [5, 17, 18], "avail": [5, 10, 17, 19, 20], "newli": 5, "creat": [5, 9, 11, 17, 19, 20], "expos": 5, "minim": 5, "hardware_system": 5, "introduc": [5, 12, 17, 19, 20], "chang": [5, 13, 15, 16, 17, 18], "singl": [5, 14, 17, 19, 20], "also": [5, 9, 10, 11, 17, 19, 20], "discuss": 5, "ohmpi_hardwar": 5, "class": [5, 17], "initi": 5, "veri": [5, 9, 20], "earli": 5, "stage": 5, "investig": 5, "implement": [5, 17], "solut": [5, 19, 20], "If": [5, 11, 13, 18, 19, 20], "path": [5, 9, 11, 19, 20], "strategi": 5, "readi": 5, "devic": [5, 9, 13, 14, 15, 16], "conceiv": 5, "recommend": [5, 11, 17, 19, 20], "import": [5, 17], "kicad": 5, "both": [5, 19, 20], "schema": 5, "share": 5, "alwai": 5, "branch": 5, "python": [5, 7], "copi": [5, 11, 17], "similar": [5, 18], "modul": [5, 7, 9, 14, 19, 20], "store": [5, 17], "hardware_compon": 5, "directori": [5, 11, 17, 19, 20], "defin": [5, 8, 17], "relev": [5, 8], "abstract": 5, "abstract_hardware_compon": 5, "method": 5, "interact": [5, 17], "accord": [5, 9, 19, 20], "sure": [5, 17, 19, 20], "place": [5, 8, 9, 18, 19, 20], "config": [5, 13, 17, 19, 20], "describ": [5, 8, 11, 12, 13, 19, 20], "hardware_config": 5, "dictionari": 5, "config_xxx": 5, "where": [5, 7, 9, 11, 17, 19, 20], "xxx": 5, "replac": [5, 14, 18, 20], "3": [5, 8, 9, 11, 13, 14, 15, 16, 17, 19, 20], "conduct": [5, 19, 20], "todo": 6, "e": [6, 12, 17, 19, 20], "g": [6, 12, 13, 14, 19, 20], "rocherfort": 6, "contain": [7, 8, 11, 17, 19, 20], "compos": [7, 8], "mb": 7, "voltag": [7, 8, 9, 13, 14, 18, 19, 20], "0": [7, 9, 12, 13, 15, 16, 17, 19, 20], "n": [7, 8, 9, 13, 14, 15, 16, 17, 19, 20], "address": [7, 9, 13, 19, 20], "pwr": 7, "either": [7, 11, 19, 20], "batteri": [7, 8, 13, 19, 20], "more": [7, 8, 9, 17, 18], "advanc": [7, 17], "can": [7, 8, 9, 10, 11, 17, 18, 19, 20], "control": [7, 9, 10, 17, 19, 20], "ctrl": [7, 19, 20], "raspberrypi": [7, 9, 10, 11, 14], "upgrad": [7, 14, 20], "recogn": 7, "c": [7, 12, 19, 20], "valid": [7, 19, 20], "regul": 7, "dps5005": 7, "os": [7, 8, 17], "virtual": 7, "environ": 7, "packag": [7, 14, 17], "thonni": [7, 13, 17], "id": [7, 17], "cut": [8, 14], "ribbon": [8, 15, 16], "proper": 8, "length": [8, 19, 20], "about": [8, 9], "5m": [8, 13], "correspond": [8, 19], "crimp": [8, 19, 20], "idc": [8, 14], "suitabl": [8, 19, 20], "clamp": 8, "pai": [8, 19, 20], "attent": [8, 19, 20], "direct": [8, 17, 19, 20], "unbalanc": 8, "perpendicular": 8, "possibl": [8, 12, 18, 19, 20], "same": [8, 9, 17, 19, 20], "flush": 8, "posit": [8, 14, 19, 20], "spacer": [8, 13, 15, 16], "abov": [8, 19, 20], "below": [8, 9, 11, 17, 19, 20], "profil": 8, "view": [8, 13], "color": 8, "yellow": 8, "tin": [8, 14], "end": [8, 19, 20], "red": [8, 13, 17, 19, 20], "black": [8, 13, 14, 19, 20], "left": [8, 13], "shown": [8, 19, 20], "pictur": 8, "i": [8, 15, 16, 17, 19, 20], "ii": 8, "gnd": [8, 19, 20], "nois": [8, 14], "often": [8, 9], "heard": 8, "clip": 8, "11": [8, 12, 13, 14, 19, 20], "input": [8, 9, 12, 13, 14, 19, 20], "right": [8, 13], "fix": [8, 13, 14], "second": [8, 9, 12, 17, 19, 20], "13": [8, 13, 14, 15, 16, 19, 20], "15": [8, 12, 13, 14, 15, 16, 19, 20], "previou": 8, "procedur": 8, "repeat": [8, 17, 19, 20], "other": [8, 17, 19, 20], "17": [8, 13, 14, 19, 20], "purpl": 8, "18": [8, 13, 14, 19, 20], "third": [8, 17], "19": [8, 13, 14, 19, 20], "fourth": 8, "nylon": 8, "hex": [8, 15, 16], "photograph": 8, "detail": [8, 9, 17, 19], "20": [8, 13, 14, 19, 20], "4th": 8, "togeth": [8, 19, 20], "could": [8, 13, 19, 20], "previous": [8, 11, 19, 20], "21": [8, 13, 14, 19, 20], "tie": 8, "22": [8, 13, 14, 19, 20], "23": [8, 13, 14, 15, 16, 19, 20], "pvc": 8, "plate": 8, "minimum": 8, "dimens": 8, "200": [8, 12, 14], "mm": [8, 13, 15, 16, 19, 20], "150": [8, 9, 19, 20], "drill": 8, "remain": [8, 19, 20], "metal": [8, 14], "tighten": 8, "25": [8, 12, 14, 15, 16, 19, 20], "rpi": [8, 11, 19, 20], "so": [8, 9, 19, 20], "access": [8, 11, 17, 19, 20], "usb": 8, "port": [8, 13, 14], "mark": [8, 13], "hole": [8, 14, 19, 20], "26": [8, 14, 19, 20], "add": [8, 19, 20], "27": [8, 14, 15, 16, 19, 20], "attach": 8, "washer": 8, "nut": 8, "28": [8, 14], "29": [8, 19, 20], "come": 8, "out": [8, 11, 19, 20], "pass": [8, 17], "output": [8, 13, 14, 17, 19, 20], "pre": [8, 13], "led": [8, 14], "simpli": [8, 11, 19, 20], "consid": 8, "temporari": 8, "modif": [8, 11, 19, 20], "orang": 8, "31": [8, 13, 15, 16], "brown": 8, "blue": [8, 19, 20], "block": [8, 14, 19, 20], "top": [8, 13, 17], "secur": [8, 17], "33": [8, 14], "34": [8, 14], "35": [8, 13, 14], "36": [8, 13, 19, 20], "37": [8, 19, 20], "38": [8, 14, 19, 20], "sd": [8, 11, 19, 20], "program": [8, 11, 19, 20], "mous": [8, 11, 19, 20], "keyboard": [8, 11, 19, 20], "monitor": [8, 17, 19, 20], "hdmi": [8, 11], "39": [8, 13, 14, 15, 16, 19, 20], "deliv": [8, 19, 20], "12vdc": 8, "enjoi": 8, "integr": [9, 13], "mn": [9, 18], "ab": 9, "switch": [9, 14, 19, 20], "polar": [9, 14, 19, 20], "half": [9, 17], "cycl": [9, 17], "stack": [9, 14, 17, 19, 20], "explan": 9, "understand": [9, 17], "redirect": 9, "reader": 9, "datasheet": 9, "done": [9, 11, 17, 19, 20], "through": [9, 14, 17, 19, 20], "adc": [9, 13, 14, 18, 19, 20], "analog": [9, 13, 14, 19, 20], "convert": [9, 13, 14, 19, 20], "ads1115": [9, 13, 14, 18, 19, 20], "bit": [9, 13, 14, 19, 20], "programm": [9, 14], "gain": [9, 13, 14, 17, 19, 20], "pga": 9, "mean": 9, "factor": 9, "digitis": 9, "Its": [9, 19, 20], "vari": 9, "With": [9, 19, 20], "precis": [9, 13, 14, 19, 20], "076": 9, "mv": 9, "beyond": 9, "larger": 9, "our": [9, 19, 20], "divid": [9, 19, 20], "receiv": [9, 17], "mb_2023": 9, "bridg": [9, 19, 20], "across": 9, "seri": [9, 19, 20], "instanc": [9, 11], "300": 9, "ohm": [9, 12, 13, 14, 19, 20], "anoth": [9, 11, 18, 19, 20], "techniqu": 9, "consist": [9, 18, 19, 20], "opamp": 9, "amplifi": [9, 13, 14, 19, 20], "multipl": [9, 11, 17], "known": [9, 11, 19, 20], "down": [9, 19, 20], "addit": [9, 17, 19, 20], "mode": 9, "ensur": [9, 11, 19, 20], "high": [9, 14, 19, 20], "imped": [9, 12, 19, 20], "inde": [9, 19, 20], "leak": 9, "while": 9, "affect": 9, "mb_2024": 9, "differenti": 9, "model": [9, 11, 13, 14, 19, 20], "float": 9, "ground": [9, 13, 18, 19, 20], "enabl": [9, 10, 17, 19, 20], "much": 9, "higher": [9, 13, 20], "too": 9, "larg": 9, "usual": 9, "accur": [9, 19, 20], "shunt": [9, 12, 13, 14, 18], "As": [9, 19, 20], "tini": 9, "being": [9, 19, 20], "ina282": [9, 13], "via": [9, 11, 18, 19, 20], "click": [9, 11, 14, 18, 19, 20], "ina": 9, "equival": [9, 13, 19, 20], "alreadi": 9, "solder": [9, 13, 14, 19, 20], "off": 9, "revers": [9, 19, 20], "four": [9, 13, 14], "optic": [9, 13, 18], "transit": 9, "mcp2308": 9, "gpi": 9, "sda": [9, 18], "scl": [9, 18], "protocol": [9, 17, 18, 19, 20], "send": 9, "clock": 9, "transmit": 9, "pull": [9, 18], "rest": [9, 18], "5v": [9, 13, 14, 18, 19, 20], "thei": [9, 17, 18, 19, 20], "entri": 9, "becaus": 9, "mani": 9, "bu": 9, "tcaxxxx": 9, "itself": [9, 17], "rapsberrypi": 9, "now": [10, 19, 20], "actual": [10, 19, 20], "henc": 10, "maximum": [10, 17, 19, 20], "aliment": 10, "modbu": 10, "quantiti": [11, 14, 19, 20], "micro": [11, 19, 20], "comput": [11, 19, 20], "instruct": [11, 17], "well": [11, 17, 19, 20], "websit": [11, 19, 20], "watch": [11, 19, 20], "video": [11, 19, 20], "how": [11, 19, 20], "set": [11, 13, 14, 17, 19, 20], "latest": [11, 12, 19, 20], "stabl": [11, 19, 20], "complet": [11, 13], "raspbian": [11, 19, 20], "visit": 11, "http": [11, 13, 14, 15, 16, 17, 19, 20], "org": [11, 17], "en": [11, 14], "were": [11, 13, 19, 20], "onc": [11, 17, 18, 19, 20], "spi": [11, 19, 20], "remot": [11, 17, 19, 20], "option": [11, 12, 14, 17, 19, 20], "deactiv": [11, 19, 20], "gui": [11, 19, 20], "menu": [11, 19, 20], "failur": [11, 19, 20], "carri": [11, 19, 20], "task": [11, 19, 20], "caus": [11, 18, 19, 20], "shield": [11, 19, 20], "dure": [11, 19, 20], "parallel": 11, "interpret": [11, 13, 19, 20], "discret": 11, "util": [11, 17], "protect": 11, "problem": 11, "depend": [11, 17, 19, 20], "specifi": [11, 19, 20], "txt": [11, 17, 19, 20], "libatla": [11, 19, 20], "dev": [11, 19, 20], "librari": [11, 19, 20], "sudo": [11, 19, 20], "apt": [11, 19, 20], "strongli": [11, 19, 20], "gather": [11, 19, 20], "python3": [11, 19, 20], "venv": [11, 19, 20], "command": [11, 17, 19, 20], "bin": [11, 19, 20], "suffici": [11, 19, 20], "meet": [11, 19, 20], "export": 11, "cflag": 11, "fcommon": 11, "pip": [11, 19, 20], "blinka": [11, 19, 20], "numpi": [11, 17, 19, 20], "panda": [11, 19, 20], "circuitpython": [11, 19, 20], "ads1x15": [11, 19, 20], "mcp230xx": 11, "gpiozero": 11, "check": [11, 12, 17, 18, 19, 20], "met": [11, 19, 20], "list": 11, "leav": [11, 19, 20], "decid": [11, 19, 20], "setup": [11, 19, 20], "pythonid": [11, 19, 20], "root": [11, 19, 20], "usr": [11, 19, 20], "window": [11, 17, 19, 20], "On": [11, 19, 20], "altern": [11, 19, 20], "button": [11, 19, 20], "locat": [11, 19, 20], "execut": [11, 17, 19, 20], "find": [11, 19, 20], "folder": [11, 19, 20], "home": [11, 17, 19, 20], "tab": [11, 17, 19, 20], "close": [11, 18, 19, 20], "ok": [11, 19, 20], "save": [11, 19, 20], "year": 12, "consequ": [12, 19, 20], "group": 12, "varieti": 12, "tailor": [12, 17], "technic": 12, "field": [12, 19, 20], "budget": 12, "characterist": [12, 19, 20], "tabl": [12, 20], "paramet": [12, 17], "unit": [12, 13, 14, 15, 16, 19, 20], "vmn": [12, 14], "number": [12, 13, 15, 16, 17, 19, 20], "temperatur": [12, 19, 20], "max": [12, 13, 14], "permiss": 12, "vab": [12, 14], "40": [12, 15, 16, 19, 20], "ma": [12, 13, 19, 20], "500": [12, 19, 20], "min": [12, 19, 20], "durat": [12, 17, 19, 20], "ms": [12, 19, 20], "80": 12, "mohm": [12, 13, 19, 20], "tohm": 12, "volt": 12, "descript": [], "per": [13, 14, 15, 16, 19, 20], "total": [13, 14, 15, 16, 19, 20], "web": [13, 14, 15, 16], "58": [13, 19, 20], "75": 13, "www": [13, 14, 15, 16, 19, 20], "mouser": [13, 14, 15, 16], "fr": [13, 14, 15, 16, 19, 20], "productdetail": [13, 14, 15, 16], "seeed": 13, "studio": 13, "102110421": 13, "qs": [13, 14, 15, 16], "7mvldsj5uaxen3lyyh3sqw": 13, "3d": [13, 14, 15, 16], "lm158n": 13, "amp": [13, 14, 19, 20], "o": [13, 15, 16, 17, 19, 20], "texa": [13, 19, 20], "instrument": [13, 17, 19, 20], "lm358an": [13, 19, 20], "nopb": [13, 19, 20], "lm158j": 13, "x1j7hmvl2zh8vpefml8": 13, "2ffq": 13, "print": [13, 15, 16, 17, 19, 20], "circuit": [13, 15, 16, 17, 19, 20], "asler": [13, 15, 16, 19, 20], "1085": [13, 14], "2fha2pyfaduh": 13, "2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn": 13, "252bg": 13, "capacitor": [13, 14, 20], "100nf": [13, 14, 20], "50vdc": [13, 20], "ceram": [13, 14, 20], "kemet": [13, 20], "c320c104k1": [13, 20], "c320c104k1r5ta7303": 13, "c4uyot": 13, "2flq1th4mcyoetma": 13, "5w": [13, 19, 20], "te": [13, 14, 15, 16, 19, 20], "h81k0bya": [13, 19, 20], "holsworthi": [13, 14], "2fha2pyfaduhuylh7az": 13, "2fmjfh2xjoums6wztux4som": 13, "252bii": 13, "h81k5bya": [13, 19, 20], "2fha2pyfadugy9twham3ru9hmijohywhbin95knm": 13, "252bx": 13, "2fm": 13, "vishai": [13, 14, 15, 16], "ccf071k50gke36": 13, "dale": 13, "qkeozdl6eqpa6lzrlqfvow": 13, "762": 13, "524": 13, "cmf651m0000fkek143": 13, "ciayqk2gdckzia2levalkg": 13, "42": [13, 14], "ohmit": [13, 14], "41f2r0e": 13, "im6toxqzgoauedprb19mha": 13, "08": [13, 15, 16], "pitch": [13, 14, 15, 16, 19, 20], "648": [13, 15, 16, 19, 20], "cui": [13, 15, 16], "tb009": [13, 15, 16], "508": [13, 15, 16], "02be": [13, 15, 16], "vlwxofp3u2wcfk5uckwtka": [13, 15, 16], "dc": [13, 14, 15, 16, 19, 20], "24v": [13, 20], "tracopow": [13, 20], "trn": [13, 20], "1215": [13, 20], "traco": [13, 14, 20], "yca": 13, "2faaymw02gquicgqj0ta": 13, "72": [13, 20], "mill": [13, 14], "110": [13, 14, 16, 19, 20], "43": [13, 14, 19, 20], "308": [13, 14], "41": [13, 14, 16], "001000": [13, 14], "iggadovctstu": 13, "2fqaur8narg": 13, "mgh": 13, "vip": 13, "gclid": 13, "eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw": 13, "aqy211eh": 13, "84": [13, 15, 16], "panason": [13, 14], "industri": 13, "wktuvitrialgiu8hcm7dvq": 13, "449": 13, "796": 13, "preci": [13, 16], "83": 13, "304": 13, "001101": [13, 16], "2fha2pyfadujqkqx4wauig": 13, "2fmgndxmcnv": 13, "2f33nj0gbxroculucynpyong": 13, "mcp23008": [13, 14], "593": [13, 14], "sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw": 13, "1x10": [13, 19, 20], "samtec": [13, 14, 19, 20], "ssw": [13, 14, 19, 20], "ru5fayqh": [13, 14], "252be0w1orxzibqpw": [13, 14], "smt": 13, "breakout": [13, 14], "soic": 13, "1212": 13, "gurawfaegucaqqfvnvtyeg": 13, "eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw": 13, "ina282aid": 13, "ze4": 13, "2fufuz19ilfayzxocfra": 13, "thd": [13, 14], "1211n": [13, 14], "2fha2pyfadugpyeg4idvm": 13, "2fmsr": 13, "252b7an": 13, "2f0t3ruis9pcaqjlt4": 13, "252bnrpuooeq": 13, "53": [13, 14, 20], "ssq": 13, "120": [13, 15, 16], "d": [13, 19, 20], "252be1bmvd": 13, "252bdzonqg": 13, "ejector": [13, 15, 16], "blk": [13, 15, 16], "10120550": [13, 15, 16], "conrad": [13, 15, 16], "com": [13, 14, 15, 16, 17, 19, 20], "bkl": [13, 15, 16], "space": [13, 15, 16], "254": [13, 15, 16], "row": [13, 14, 15, 16], "pc": [13, 15, 16], "741435": [13, 16], "searchterm": [13, 15, 16], "searchtyp": [13, 15, 16], "searchsuggest": [13, 15, 16], "femal": [13, 14, 15, 16, 19, 20], "hexagonal": 13, "87": [13, 14, 16], "48": [13, 14, 19, 20], "harwin": 13, "r25": 13, "3002002": 13, "w0yvoo0ixfenuv0hsdc4": 13, "2fq": 13, "86": [13, 14, 15, 16], "437": [13, 14], "1108331841001101": 13, "318": [13, 14], "ftmup6kvi2tnqoeziaq": 13, "2fpa": 13, "figur": [13, 17, 19, 20], "show": [13, 19, 20], "schemat": [13, 20], "plug": [13, 19, 20], "plai": 13, "propos": [13, 19, 20], "florsch": [13, 19, 20], "advantag": 13, "signal": [13, 14, 19, 20], "lie": [13, 19, 20], "114": [13, 19, 20], "directli": [13, 19, 20], "realiz": 13, "around": [13, 17], "tdh15": 13, "inpout": 13, "than": [13, 19, 20], "just": [13, 20], "decreas": 13, "don": [13, 17], "t": [13, 14, 15, 16, 17, 18], "forget": [13, 17], "kei": 13, "r_shunt": 13, "ohmpi_config": 13, "dict": 13, "adjust": [13, 19, 20], "tow": 13, "dot": 13, "corner": 13, "lm158": 13, "ads115": [13, 19, 20], "3x11": 13, "wurth": [13, 14], "elektronik": [13, 14], "971110321": 13, "305": [13, 15, 16], "apm": [13, 15, 16], "hexseal": [13, 15, 16], "rm3x8mm": [13, 15, 16], "2701": [13, 15, 16], "jjse": [13, 15, 16], "2f12mkns3vxsdryxuhw": [13, 15, 16], "shutdown": 13, "unplug": 13, "bottom": [13, 19, 20], "11mm": 13, "m3": [13, 15, 16], "upper": 13, "everyth": 13, "screen": [13, 19, 20], "1kohm": 13, "r2": [13, 19, 20], "220": 13, "r1": [13, 19, 20], "padboard": 13, "spool": 13, "sample_measurement_exampl": 13, "result": [13, 19, 20], "2023": 14, "offer": [14, 17, 19, 20], "superior": 14, "compar": 14, "predecessor": 14, "evolv": [14, 19, 20], "major": 14, "mikro": 14, "1887": [], "isol": 14, "200v": 14, "bom": [], "140": [15, 16], "560": [15, 16], "62": [15, 16], "92": [15, 16, 19, 20], "tru": [15, 16, 19, 20], "1580994": [15, 16], "256": [15, 16], "091": [15, 16], "296": [15, 16], "incorpor": [14, 15, 16, 17], "sgaepimzzmueqxo7l": [15, 16], "2fbpyakboruumren": [15, 16], "56": [15, 16], "776": [15, 16], "205": [15, 16], "46": [14, 15, 16], "103321": [15, 16], "5twgzeq9e7hsylqaljjyrw": [15, 16], "732": [15, 16], "sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi": [15, 16], "325": [15, 16], "over": [15, 16, 18], "503811": [15, 16], "nchannel": [15, 16], "471": [15, 16], "576": [15, 16, 19], "vhuuswq2": [15, 16], "252bsz9b": [15, 16], "2ff6fcxt7g": [15, 16], "100k": [15, 18], "061": [15, 16], "616": [15, 16], "beyschlag": [14, 15, 16], "mba02040c1003frp00": [14, 15, 16], "mzrxyrlhvdt9crf7zyf": [14, 15, 16], "2f5q": [14, 15, 16], "89": [14, 15, 16], "2717": [15, 16], "sgaepimzzmsyydr3r27av4eqf73yoh": [15, 16], "252baqg": [15, 16], "252bz3hvktao": [15, 16], "10120558": [15, 16], "54": [15, 16], "No": [15, 16], "51": [15, 16], "741727": [15, 16], "10120862": [15, 16], "strain": [15, 16], "relief": [15, 16], "44": [14, 15, 16, 19, 20], "742063": [15, 16], "10120158": [15, 16], "x": [15, 16, 19, 20], "multi": [15, 16, 19, 20], "colour": [15, 16], "1012015810": [15, 16], "127": [15, 16], "008": [15, 16], "1548658": [15, 16], "79": [15, 16], "49": [15, 16], "keyston": [15, 16], "24300": [15, 16], "uwqyq": [15, 16], "2f2czwu0ejpozmzc2a": [15, 16], "745": [15, 16], "846": [15, 16], "614": [15, 16], "25515": [15, 16], "2f2czwuxuhumfr": [15, 16], "252bzuq": [15, 16], "updat": [16, 17], "100k\u03c9": 16, "mm\u00b2": [16, 19, 20], "55": [16, 19, 20], "328": 16, "uqd7xcvsscnr3hwd6fta8g": 16, "whose": [17, 19, 20], "main": [17, 19, 20], "summar": 17, "cover": 17, "acquisit": 17, "separ": 17, "json": [17, 20], "ohmpi_set": 17, "central": 17, "handler": 17, "layer": 17, "excel": 17, "log": 17, "broker": 17, "zip": 17, "rotat": 17, "disk": 17, "exec_logg": 17, "data_logg": 17, "plan": 17, "state": 17, "health": 17, "soh": 17, "futur": 17, "By": 17, "written": 17, "consol": 17, "like": [17, 18], "local": 17, "dai": 17, "size": [14, 17], "exce": 17, "sent": 17, "level": [14, 17], "edit": 17, "setup_logg": 17, "custom": 17, "repositori": [17, 19, 20], "prefer": [17, 19, 20], "desir": 17, "usernam": 17, "password": 17, "One": [17, 18], "alter": 17, "keep": 17, "bash": 17, "run_http_interfac": 17, "sh": 17, "iot": 17, "messag": 17, "friendli": 17, "graphic": 17, "quick": 17, "easi": 17, "wi": 17, "fi": 17, "point": [17, 19, 20], "ap": 17, "webserv": 17, "serv": [17, 19, 20], "index": 17, "html": 17, "laptop": 17, "mobil": 17, "phone": 17, "upload": 17, "sequenc": [17, 19, 20], "download": [17, 19, 20], "act": 17, "raspap": 17, "runonstart": 17, "141": 17, "8080": 17, "pseudo": 17, "evolut": 17, "quadrupol": [17, 19, 20], "appar": 17, "especi": 17, "suit": 17, "autom": 17, "ipython": 17, "ssh": 17, "putti": 17, "maco": 17, "linux": 17, "found": 17, "gitlab": [17, 19, 20], "entir": [17, 19, 20], "np": 17, "chdir": 17, "object": 17, "k": [14, 17], "load": 17, "manual": [17, 19, 20], "injection_dur": [17, 19, 20], "nb_stack": 17, "nbr_mea": [17, 19, 20], "update_set": 17, "arrai": [14, 17, 19, 20], "shape": 17, "set_sequ": 17, "n2": 17, "string": 17, "load_sequ": 17, "abmn": [17, 19, 20], "rs_check": 17, "synchron": 17, "wait": 17, "return": [17, 19, 20], "prompt": 17, "run_sequ": 17, "run_sequence_async": 17, "thread": 17, "immedi": 17, "sleep": 17, "interrupt": 17, "kill": 17, "asynchron": 17, "interv": 17, "nb_mea": 17, "sequence_delai": [17, 19, 20], "run_multiple_sequ": 17, "taken": 17, "switch_mux_on": 17, "run_measur": 17, "switch_mux_off": 17, "risk": 17, "short": 17, "argument": 17, "autogain": 17, "true": 17, "ad": [17, 19, 20], "good": 17, "resolut": [17, 19, 20], "usag": 17, "consumpt": [17, 19, 20], "process": 17, "sensor": [14, 17], "scope": 17, "internet": 17, "network": 17, "auxiliari": 17, "publish": [17, 19], "subscrib": 17, "approach": 17, "mosquitto": 17, "server": 17, "reachabl": 17, "net": [14, 17], "servic": 17, "install_local_mqtt_brok": 17, "examin": 17, "parti": 17, "explor": 17, "reboot": 17, "further": 17, "format": 17, "kwarg": 17, "illustr": [17, 19, 20], "cmd_id": 17, "3fzxv121uitwgjwygcz4xw": 17, "cmd": 17, "nb_electrod": [17, 19, 20], "3fzxv121uitwgjwygcz4yw": 17, "made": [17, 19, 20], "dashboard": 17, "browser": 17, "flow": [17, 19, 20], "editor": [17, 19, 20], "node": 17, "complex": 17, "properli": [17, 18], "palett": 17, "manag": [14, 17, 19, 20], "noder": 17, "doc": 17, "guid": 17, "ui": 17, "visual": 17, "cookbook": 17, "due": 18, "quit": 18, "fragil": 18, "still": [18, 19, 20], "conductor": 18, "turn": [18, 19, 20], "multimet": 18, "broken": 18, "shoudn": 18, "wa": [18, 19, 20], "burn": 18, "expect": 18, "try": 18, "effect": 18, "voltmet": [18, 19, 20], "sens": 18, "malfunct": 18, "erron": 18, "solv": 18, "most": 18, "vdd": 18, "reach": 18, "stronger": [18, 19, 20], "smaller": [18, 19, 20], "journal": 19, "bug": 19, "explain": 19, "miss": 19, "invit": 19, "v1": [19, 20], "commerci": [19, 20], "cpu": [19, 20], "w": [14, 19, 20], "storag": [19, 20], "o1": [19, 20], "youtub": [19, 20], "wjwzhv1v3pk": [19, 20], "noob": [19, 20], "simpl": [19, 20], "unexpectedli": [19, 20], "boot": [19, 20], "cd": [19, 20], "gnu": [19, 20], "nano": [19, 20], "At": [19, 20], "op": [14, 19, 20], "dl": [19, 20], "press": [19, 20], "enter": [19, 20], "escap": [19, 20], "studi": [19, 20], "hous": [14, 19, 20], "diagram": [19, 20], "displai": [19, 20], "mimic": [19, 20], "behavior": [19, 20], "soil": [19, 20], "subject": [19, 20], "r11": [19, 20], "r10": [19, 20], "r12": [19, 20], "constitut": [19, 20], "stainless": [19, 20], "steel": [19, 20], "r9": [19, 20], "less": [19, 20], "sum": [19, 20], "000": [19, 20], "intens": [19, 20], "potenti": [19, 20], "calcul": [19, 20], "insert": [19, 20], "1115": [19, 20], "a1": [19, 20], "a0": [19, 20], "increas": [19, 20], "r5": [19, 20], "r8": [19, 20], "r6": [19, 20], "r7": [19, 20], "a2": [19, 20], "a3": [19, 20], "obtain": [19, 20], "ly": [19, 20], "let": [19, 20], "equal": [19, 20], "multipli": [19, 20], "reduct": [19, 20], "despit": [19, 20], "calibr": [19, 20], "variou": [14, 19, 20], "disturb": [19, 20], "estim": [19, 20], "mega": [19, 20], "shortcut": [19, 20], "excess": [19, 20], "lithium": [19, 20], "ion": [19, 20], "automobil": [19, 20], "lead": [14, 19, 20], "acid": [19, 20], "strong": [19, 20], "hazard": [19, 20], "fuse": [19, 20], "onto": [19, 20], "ohmmet": [19, 20], "coeffici": [19, 20], "coef_p0": [19, 20], "coef_p1": [19, 20], "coef_p2": [19, 20], "coef_p3": [19, 20], "coef": [19, 20], "po": [19, 20], "p1": [19, 20], "r3": [19, 20], "r4": [19, 20], "p2": [19, 20], "p3": [19, 20], "r_ref": [19, 20], "slope": [19, 20], "convers": [14, 19, 20], "p0": [19, 20], "accuraci": [19, 20], "lm358n": [19, 20], "appli": [19, 20], "weaker": 19, "tx": [19, 20], "rememb": [19, 20], "holder": [19, 20], "f": [19, 20], "circul": [19, 20], "fig": [19, 20], "common": [19, 20], "neg": [19, 20], "normal": [19, 20], "simultan": [19, 20], "role": [19, 20], "thu": [19, 20], "energ": [19, 20], "next": [19, 20], "featur": [19, 20], "strict": [19, 20], "in1": [19, 20], "in2": [19, 20], "in3": [19, 20], "in4": [19, 20], "5vdc": [14, 19, 20], "5vcc": [19, 20], "mm2": [19, 20], "lastli": [19, 20], "congratul": [19, 20], "construct": [19, 20], "ert": [19, 20], "sever": [19, 20], "ten": [19, 20], "thousand": [19, 20], "stuck": [19, 20], "hand": [19, 20], "cap": [19, 20], "produc": [19, 20], "clean": [19, 20], "distanc": [19, 20], "had": [19, 20], "extra": [19, 20], "final": [19, 20], "horizont": [19, 20], "vertic": [19, 20], "06": [14, 19, 20], "04": [19, 20], "05": [14, 19, 20], "din": [19, 20], "rail": [19, 20], "chosen": [19, 20], "incom": [19, 20], "instead": [19, 20], "moreov": [19, 20], "bought": [19, 20], "velleman": [19, 20], "wpm404": [19, 20], "potentiomet": [14, 19, 20], "scienc": [19, 20], "framework": [19, 20], "manuscript": [19, 20], "osf": [19, 20], "io": [19, 20], "dzwb4": [19, 20], "irstea": [19, 20], "unzip": [19, 20], "master": [19, 20], "readm": [19, 20], "assist": [19, 20], "disconnect": [19, 20], "handl": [19, 20], "charg": [19, 20], "full": [19, 20], "capac": [19, 20], "fewer": [19, 20], "bank": [19, 20], "2a": [19, 20], "ll": [19, 20], "insid": [19, 20], "numer": [19, 20], "optim": [19, 20], "attribut": [19, 20], "the9": [19, 20], "hear": [19, 20], "sound": [19, 20], "permut": [19, 20], "csv": [19, 20], "delai": [19, 20], "repetit": [19, 20], "littl": [19, 20], "public": [19, 20], "articl": [19, 20], "sainsmart": [19, 20], "canal": 19, "pour": 19, "arduino": 19, "dsp": [14, 19], "avr": 19, "pic": 19, "arm": 19, "99": [14, 19, 20], "199": [19, 20], "sain": [19, 20], "smart": [19, 20], "101": [19, 20], "70": [14, 19, 20], "103": [19, 20], "018": [19, 20], "1x1": [19, 20], "66": [14, 19, 20], "1568649": [19, 20], "1x0": [19, 20], "71": [14, 19, 20], "1565235": [19, 20], "68": [19, 20], "rs": [19, 20], "pro": [14, 19, 20], "897": [19, 20], "1332": [19, 20], "858": [19, 20], "627": [19, 20], "52": [14, 19, 20], "upw50b50rv": [19, 20], "1083": [19, 20], "7ah": [19, 20], "537": [19, 20], "5488": [19, 20], "lr20": [19, 20], "9v": [19, 20], "185": [19, 20], "4686": [19, 20], "ferrul": [19, 20], "piec": [19, 20], "weidmul": [19, 20], "9004330000": [19, 20], "966067": [19, 20], "car": 19, "littelfus": [19, 20], "fhac0002zxj": 19, "96": [14, 19], "trn3": 20, "suppress": 20, "10v": 20, "fast": 20, "decoupl": 20, "last": 20, "prevent": 20, "overh": 20, "toler": 20, "orient": 20, "h": [14, 20], "nf": 20, "jason": 20, "ohmpi_param": 20, "export_path": 20, "desktop": 20, "0251001": 20, "pat1l": 20, "2c": 14, "ref": 14, "link": 14, "eur": 14, "excl": 14, "vat": 14, "223": 14, "594": 14, "5063jd100k0ft": 14, "film": 14, "4watt": 14, "100kohm": 14, "8watt": 14, "bodi": 14, "eu": 14, "899": 14, "330": 14, "307": 14, "279": 14, "cfr100j330r": 14, "carbon": 14, "330ohm": 14, "1w": 14, "500ppm": 14, "ddevmfoh4ssvknglsgy0ha": 14, "228": 14, "603": 14, "cfr": 14, "25jb": 14, "4k7": 14, "yageo": 14, "4w": 14, "7k": 14, "588": 14, "wnc2r0fet": 14, "wirewound": 14, "2w": 14, "cdpnwznfzjb5bmolbzti": 14, "252bw": 14, "50v": 14, "1a": 14, "rectifi": 14, "214": 14, "637": 14, "1n4001": 14, "diotec": 14, "semiconductor": 14, "olc7aqgiedlll8na510wma": 14, "284": 14, "cree": 14, "941": 14, "c503bgancd0e0781": 14, "c503b": 14, "gan": 14, "cd0e0781": 14, "standard": 14, "green": 14, "527nm": 14, "mmround": 14, "32900": 14, "64600mcd": 14, "7d1ltpjg0i1j7dm": 14, "252b": 14, "252b5igzw": 14, "116": 14, "schottki": 14, "771": 14, "bat86113": 14, "bat86": 14, "113": 14, "nexperia": 14, "sod68": 14, "me8tqzrmiyx1ahcmzsx1tg": 14, "874": 14, "op27": 14, "ultra": 14, "offset": 14, "8dip": 14, "584": 14, "op27epz": 14, "inc": 14, "wivqp4zgangdp3uwih2ura": 14, "485": 14, "accessori": 14, "gurawfaeguaf08zux7w": 14, "2fuq": 14, "78": 14, "pack": 14, "ic": 14, "amazon": 14, "azdeliveri": 14, "parent": 14, "3x": 14, "dp": 14, "b07qhwltt": 14, "sr_1_5": 14, "__mk_fr_fr": 14, "c3": 14, "85m": 14, "85": 14, "c5": 14, "bd": 14, "95": 14, "91": 14, "crid": 14, "18whxz3e0nur5": 14, "keyword": 14, "qid": 14, "1702140215": 14, "sprefix": 14, "2cap": 14, "2c117": 14, "sr": 14, "ref03gpz": 14, "r": 14, "wivqp4zgangjpdfouwu1bw": 14, "dg411dj": 14, "781": 14, "e3": 14, "speed": 14, "dg411": 14, "xkjjivogybzznzq": 14, "252buwcw1q": 14, "unpolar": 14, "k104k15x7rf5ul2": 14, "multilay": 14, "mlcc": 14, "x7r": 14, "ammo": 14, "bc": 14, "rlgk8caobhbcqsnkgo2hja": 14, "568": 14, "10uf": 14, "667": 14, "eeu": 14, "eb1j100": 14, "aluminum": 14, "electrolyt": 14, "radial": 14, "63volt": 14, "aec": 14, "q200": 14, "ceafgkervibcbemsghcq5g": 14, "60v": 14, "600ma": 14, "700mw": 14, "transistor": 14, "zvn4206astz": 14, "335": 14, "522": 14, "chnl": 14, "onsemi": 14, "fairchild": 14, "2n7000bu": 14, "k2x4el1": 14, "2fkj6oexmhafsm5a": 14, "thd1512": 14, "11n": 14, "495": 14, "thd15": 14, "style": 14, "ckjk83fod0x2iyoeopcnmg": 14, "97": 14, "22n": 14, "1222n": 14, "ckjk83fod0uvycxqxchqfw": 14, "848": 14, "649": 14, "vi02215200j0g": 14, "vi0221520000g": 14, "amphenol": 14, "tb": 14, "ri": 14, "cla": 14, "180": 14, "anytek": 14, "mv7bduzupui3lmtbyxcxvw": 14, "088": 14, "74": 14, "932": 14, "1878": 14, "k5owtxstjao5l2rhk53deg": 14, "4976": 14, "mynhzdoqoqkab6t4ih2naq": 14, "serial": 14, "eeprom": 14, "2kb": 14, "dip8": 14, "03": 14, "474": 14, "bob": 14, "15439": 14, "sparkfun": 14, "translat": 14, "pca9306": 14, "p1jmdcb91o4xonpr": 14, "252b0xi4g": 14, "omhron": 14, "653": 14, "1a4": 14, "dc5": 14, "spst": 14, "NO": 14, "seal": 14, "pwf36butxbgftk6ytlb7nq": 14, "575": 14, "1104731841001000": 14, "47": 14, "standrd": 14, "tail": 14, "5ag0nvq1c4xxooytdz6dow": 14, "113308": 14, "8p": 14, "gld": 14, "cont": 14, "wzeyyeqmoweyjis4txlt7q": 14, "11044316": 14, "316": 14, "16p": 14, "iggadovctsrh": 14, "252bxewrwehkg": 14, "prt": 14, "14017": 14, "tall": 14, "2x20": 14, "a4bxicggsn": 14, "2f": 14, "252baml822b65a": 14, "ribon": 14, "710": 14, "61200623021": 14, "wr": 14, "bhd": 14, "54mm": 14, "6p": 14, "strt": 14, "conn": 14, "phr8rmcireabk1ywkdxzfw": 14, "571": 14, "534237": 14, "rec": 14, "1x05p": 14, "vrt": 14, "eln3i3szm1klmlr": 14, "252bszcsuq": 14, "94": 14, "1x04p": 14, "gygf5pdsjzki3hk2o1eilq": 14, "535541": 14, "1x08p": 14, "xdp7pgunc": 14, "252buqvwkjjvkwqw": 14, "ssw11002g": 14, "tiger": 14, "bui": 14, "ssw10202g": 14, "102": 14, "252be2zeimtlw": 14, "2fblw": 14, "826629": 14, "10p": 14, "fazuumncxom0apli6zggxg": 14, "1761681": 14, "hdr": 14, "vert": 14, "ht": 14, "bqfptycq3dlaez2wzdz7aw": 14, "aisler": 14, "lang": 14, "10k": 14, "sip9": 14, "bournd": 14, "3296w_vertic": 14, "raspberryp": 14, "63": 14, "kiwi": 14, "4gb": 14, "4268": 14, "src": 14, "73": 14, "801": 14, "012": 14, "012000": 14, "5ag0nvq1c4x40xnvdlnkzg": 14, "overview": 14, "machin": 14, "thirteen": 14, "eepow": [], "fundament": [], "what": [], "_": []}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"ohmpi": [0, 1, 8, 9, 19, 20], "open": 0, "sourc": 0, "hardwar": [0, 5, 7], "resist": [0, 19, 20], "meter": 0, "summari": 0, "document": 0, "center": 0, "project": 1, "author": 1, "partner": 1, "cite": 1, "introduct": 1, "step": 2, "n": 2, "3": 2, "mux": [2, 15, 16], "board": [2, 9, 12, 13, 14, 15, 16, 19, 20], "part": [2, 11, 13, 14, 15, 16], "A": [2, 11, 13, 14, 15, 16, 18], "assembl": [2, 8, 12, 13, 14, 15, 16, 19, 20], "requir": [2, 13, 14, 15, 16], "compon": [2, 5, 13, 14, 15, 16, 18, 19, 20], "b": [2, 11, 13, 15, 16, 18, 19, 20], "address": [2, 15, 16], "c": [2, 11, 13, 15, 16], "valid": [2, 15, 16], "api": 3, "refer": 3, "archiv": 4, "version": [4, 12], "softwar": [5, 17], "interfac": [5, 17], "new": 5, "exampl": 6, "applic": [6, 17], "electron": 9, "design": 9, "measur": [9, 12, 13, 14, 19, 20], "multiplex": [9, 19, 20], "power": 10, "suppli": 10, "12v": 10, "batteri": 10, "regul": 10, "dps5005": 10, "raspberri": [11, 19, 20], "pi": [11, 19, 20], "configur": [11, 17, 19, 20], "os": [11, 19, 20], "instal": [11, 19, 20], "virtual": [11, 19, 20], "environ": [11, 19, 20], "packag": [11, 19, 20], "activ": [11, 19, 20], "thonni": [11, 19, 20], "python": [11, 17, 19, 20], "id": [11, 19, 20], "recogn": 12, "specif": 12, "you": 12, "v2023": [13, 15], "list": [13, 14, 15, 16, 19, 20], "descript": [13, 14, 19, 20], "start": 13, "up": 13, "check": 13, "2024": 14, "0": 14, "2": 14, "v2024": 16, "oper": [17, 19, 20], "system": 17, "architectur": 17, "logger": 17, "file": 17, "web": 17, "mqtt": 17, "troubleshoot": 18, "issu": 18, "puls": 18, "between": 18, "valu": 18, "given": 18, "correct": 18, "one": 18, "commun": 18, "v": [19, 20], "1": [19, 20], "01": 19, "limit": [19, 20], "32": [19, 20], "electrod": [19, 20], "The": [19, 20], "philosophi": [19, 20], "technic": [19, 20], "data": [19, 20], "current": [19, 20], "inject": [19, 20], "card": [19, 20], "connect": [19, 20], "electr": [19, 20], "implement": [19, 20], "first": [19, 20], "four": [19, 20], "instruct": [19, 20], "preliminari": [19, 20], "procedur": [19, 20], "onli": [19, 20], "initi": [19, 20], "startup": [19, 20], "paramet": [19, 20], "complet": [19, 20], "tabl": 19, "titl": 19, "02": 20, "schemat": 14, "interact": 14, "bom": 14}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["index", "source_rst/Ohmpi", "source_rst/api", "source_rst/archived_version", "source_rst/developing_hardware_components", "source_rst/gallery", "source_rst/hardware", "source_rst/hardware/assembling", "source_rst/hardware/hw_info", "source_rst/hardware/hw_pwr", "source_rst/hardware/hw_rpi", "source_rst/hardware/mb", "source_rst/hardware/mb/mb_2023", "source_rst/hardware/mb/mb_2024", "source_rst/hardware/mux_2023", "source_rst/hardware/mux_2024", "source_rst/software", "source_rst/software/architecture", "source_rst/software/developments", "source_rst/software/installation", "source_rst/software/operations", "source_rst/troubleshooting", "source_rst/v1.xx/V1_01", "source_rst/v1.xx/V1_02"], "filenames": ["index.rst", "source_rst\\Ohmpi.rst", "source_rst\\api.rst", "source_rst\\archived_version.rst", "source_rst\\developing_hardware_components.rst", "source_rst\\gallery.rst", "source_rst\\hardware.rst", "source_rst\\hardware\\assembling.rst", "source_rst\\hardware\\hw_info.rst", "source_rst\\hardware\\hw_pwr.rst", "source_rst\\hardware\\hw_rpi.rst", "source_rst\\hardware\\mb.rst", "source_rst\\hardware\\mb\\mb_2023.rst", "source_rst\\hardware\\mb\\mb_2024.rst", "source_rst\\hardware\\mux_2023.rst", "source_rst\\hardware\\mux_2024.rst", "source_rst\\software.rst", "source_rst\\software\\architecture.rst", "source_rst\\software\\developments.rst", "source_rst\\software\\installation.rst", "source_rst\\software\\operations.rst", "source_rst\\troubleshooting.rst", "source_rst\\v1.xx\\V1_01.rst", "source_rst\\v1.xx\\V1_02.rst"], "titles": ["OHMPI: Open source and open hardware resistivity-meter", "OhmPi project", "API reference", "Archived versions", "Software interface to new hardware components", "Examples of applications", "Hardware", "Assembling the OhmPi", "OhmPi electronic design", "Power supply", "Raspberry Pi configuration", "Measurement board", "Measurement board v2023", "Measurement board 2024.0.2", "MUX board v2023", "MUX board v2024", "Software and operation", "Software architecture", "<no title>", "Installation", "Configuration file", "Troubleshooting", "OhmPi V 1.01 (limited to 32 electrodes)", "OhmPi V 1.02 (limited to 32 electrodes)"], "terms": {"releas": [0, 20], "v2024rc": 0, "date": [0, 22, 23], "jan": 0, "09": [0, 22, 23], "2024": [0, 8, 11], "start": [0, 4, 10, 11, 14, 15, 20, 22, 23], "juli": 0, "2016": 0, "author": [0, 10, 22, 23], "r\u00e9mi": [0, 1], "clement": [0, 1], "nicola": [0, 1], "forquet": [0, 1], "yannick": [0, 1], "fargier": [0, 1], "vivien": [0, 1], "duboi": [0, 1], "h\u00e9l\u00e8ne": [0, 1], "guyard": [0, 1], "olivi": [0, 1], "kaufmann": [0, 1], "guillaum": [0, 1], "blanchi": [0, 1], "arnaud": [0, 1], "watlet": [0, 1], "target": 0, "user": [0, 10, 17, 20, 22, 23], "research": 0, "develop": [0, 1, 4, 10, 12, 13, 17, 22, 23], "statu": 0, "some": [0, 4, 8, 20, 22, 23], "matur": 0, "progress": 0, "offici": 0, "guidelin": 0, "gener": [0, 6, 8, 12, 13, 14, 15, 17, 22, 23], "tutori": 0, "content": 0, "project": [0, 4, 7, 10, 12, 13, 14, 15, 16, 22, 23], "partner": 0, "cite": 0, "introduct": [0, 17], "electron": [0, 1, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 22, 23], "design": [0, 4, 6, 17, 20, 22, 23], "measur": [0, 1, 6, 7, 10, 14, 15, 17, 20, 21], "board": [0, 4, 6, 7, 10, 17, 21], "mux": [0, 6, 7, 17, 22, 23], "v2023": [0, 6, 8, 11, 21], "v2024": [0, 6, 8, 11, 17, 21], "power": [0, 6, 7, 11, 12, 13, 14, 15, 22, 23], "suppli": [0, 6, 7, 11, 12, 13, 14, 15, 22, 23], "raspberri": [0, 6, 7, 12, 13, 14, 15, 16, 20], "pi": [0, 6, 7, 12, 13, 16, 20], "configur": [0, 4, 6, 8, 16, 17, 19], "assembl": [0, 1, 6, 10, 16, 17], "softwar": [0, 10, 19, 20, 22, 23], "oper": [0, 4, 7, 8, 10, 11, 12, 17, 19, 20], "system": [4, 10, 16, 20, 22, 23], "architectur": [0, 16], "logger": [1, 16, 22, 23], "file": [0, 4, 6, 10, 12, 16, 17, 19, 22, 23], "interfac": [0, 13, 16, 17, 19], "applic": [0, 1, 4, 6, 8, 16, 17], "api": [0, 17, 20], "refer": [0, 7, 12, 13, 14, 15, 20, 22, 23], "troubleshoot": 0, "issu": 0, "puls": [0, 8, 11, 22, 23], "between": [0, 7, 8, 12, 14, 15, 17, 19, 22, 23], "A": [0, 1, 4, 6, 7, 8, 9, 11, 20, 22, 23], "b": [0, 6, 7, 8, 9, 11, 13], "valu": [0, 8, 12, 14, 15, 22, 23], "given": [0, 8, 20], "correct": [0, 22, 23], "one": [0, 7, 12, 20, 22, 23], "commun": [0, 1, 8, 17, 19, 20], "compon": [0, 8, 10, 16, 20], "exampl": [0, 7, 12, 14, 15, 20, 22, 23], "new": [0, 10, 17, 20, 21, 22, 23], "archiv": 0, "version": [0, 4, 6, 10, 12, 17, 20, 22, 23], "v": [0, 3, 7, 8, 9, 12, 14, 15, 21], "1": [0, 3, 4, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 20], "01": [0, 3, 13, 23], "limit": [0, 3, 12], "32": [0, 3, 7, 10, 13], "electrod": [0, 1, 3, 6, 7, 8, 9, 12, 14, 15, 21], "02": [0, 3, 12, 13, 22], "inra": [1, 5], "reversa": [1, 22, 23], "villeurbann": 1, "franc": 1, "universit\u00e9": 1, "de": 1, "mon": 1, "belgium": 1, "ger": 1, "rro": 1, "univ": 1, "gustav": 1, "eiffel": 1, "ifsttar": 1, "lyon": 1, "ig": 1, "grenobl": 1, "alp": 1, "ilvo": 1, "merelbek": 1, "julien": 1, "ganc": 1, "emil": 1, "gro": 1, "et": [1, 12], "al": 1, "an": [1, 4, 6, 7, 8, 10, 12, 14, 15, 16, 17, 19, 20, 21, 22, 23], "open": [1, 4, 7, 10, 12, 13, 14, 15, 16, 21, 22, 23], "sourc": [1, 4, 9, 10, 13, 19, 22, 23], "data": [1, 8, 13, 20], "dedic": [1, 20], "electr": [1, 12, 13], "resist": [1, 7, 8, 12, 20, 21], "imag": [1, 10], "small": [1, 7, 8, 12, 13, 20, 22, 23], "laboratori": [1, 7, 11, 22, 23], "scale": [1, 8], "hardwarex": 1, "elsevi": 1, "2020": 1, "8": [1, 7, 8, 10, 12, 13, 14, 15, 20, 22, 23], "24": [1, 7, 11, 12, 13, 15, 22, 23], "p": [1, 12, 14, 15], "ff10": 1, "1016": 1, "j": 1, "ohx": 1, "e00122ff": 1, "particip": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "all": [1, 4, 7, 10, 12, 13, 14, 15, 16, 17, 19, 20, 22, 23], "requir": [1, 4, 7, 10, 16, 17, 19, 20, 22, 23], "skill": [1, 7, 10, 11, 12, 13, 14, 15, 16, 22, 23], "respect": [1, 7, 8, 10, 12, 13, 14, 15, 16, 22, 23], "safeti": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "rule": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "must": [1, 7, 8, 10, 12, 13, 14, 15, 16, 21, 22, 23], "profession": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "context": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "peopl": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "compet": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "The": [1, 4, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21], "team": [1, 4, 7, 10, 12, 13, 14, 15, 16, 22, 23], "cannot": [1, 7, 8, 10, 12, 13, 14, 15, 16, 22, 23], "held": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "respons": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "ani": [1, 7, 10, 11, 12, 13, 14, 15, 16, 20, 21, 22, 23], "materi": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "human": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "damag": [1, 7, 10, 12, 13, 14, 15, 16, 21, 22, 23], "which": [1, 7, 8, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23], "would": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "associ": [1, 7, 10, 12, 13, 14, 15, 16, 17, 22, 23], "us": [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23], "equip": [1, 7, 8, 10, 12, 13, 14, 15, 16, 22, 23], "doe": [1, 7, 10, 12, 13, 14, 15, 16, 22, 23], "work": [1, 4, 7, 10, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23], "after": [1, 7, 10, 12, 13, 14, 15, 16, 20, 22, 23], "you": [1, 4, 6, 7, 8, 10, 12, 14, 15, 19, 20, 21, 22, 23], "mai": [1, 10, 17, 20, 21, 22, 23], "redistribut": 1, "modifi": [1, 4, 22, 23], "thi": [1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23], "document": [1, 6, 20, 22], "make": [1, 4, 8, 14, 15, 20, 22, 23], "product": [1, 12, 13, 14, 15], "under": [1, 7, 22, 23], "term": [1, 4], "cern": 1, "ohl": 1, "v2": 1, "distribut": [1, 8], "without": [1, 8, 14, 15, 21, 22, 23], "express": [1, 4], "OR": 1, "impli": [1, 14, 15, 17], "warranti": 1, "includ": [1, 4, 10, 14, 15, 17, 20, 22, 23], "OF": 1, "merchant": 1, "satisfactori": 1, "qualiti": 1, "AND": 1, "fit": 1, "FOR": 1, "particular": [1, 17], "purpos": [1, 7, 13, 22, 23], "pleas": [1, 7, 20, 22, 23], "see": [1, 8, 17, 20, 21, 22, 23], "condit": [1, 13], "present": [1, 4, 7, 13, 14, 15, 22, 23], "low": [1, 13, 22, 23], "cost": [1, 4, 12, 13, 14, 15, 17, 22, 23], "hardwar": [1, 16, 19, 22, 23], "meter": [1, 7, 22, 23], "provid": [1, 11, 13, 17, 20, 22, 23], "scientif": 1, "robust": [1, 21, 22, 23], "flexibl": [1, 17], "tool": [1, 13], "experi": [1, 20, 21, 22, 23], "call": [1, 7, 8, 10, 14, 15, 19, 20], "basic": [1, 4, 17], "meterfeatur": 1, "current": [1, 6, 8, 9, 11, 12, 13, 17, 20, 21], "inject": [1, 6, 8, 9, 13, 17, 20], "function": [1, 4, 17, 20, 22, 23], "multiplex": [1, 6, 7, 14, 15], "allow": [1, 12, 13, 14, 15, 17, 20, 22, 23], "perform": [1, 4, 10, 13, 17, 19, 22, 23], "automat": [1, 20, 22, 23], "up": [1, 8, 9, 10, 11, 13, 14, 15, 20, 21, 22, 23], "64": [1, 13, 14, 15, 22, 23], "s": [1, 12, 13, 14, 15, 20, 21, 22, 23], "philosophi": 1, "fulli": 1, "toolto": 1, "surfac": 1, "anyon": 1, "who": 1, "want": [1, 23], "get": [1, 10, 12, 20, 22, 23], "involv": [1, 20], "welcom": [1, 4], "join": 1, "ohmpi": [3, 4, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21], "channel": [11, 13, 14, 15, 22, 23], "mechan": [8, 14, 15, 17, 20, 21, 22, 23], "base": [4, 10, 14, 15, 17, 20, 22, 23], "omron": [13, 14, 15], "manufactur": [12, 13, 14, 15, 22, 23], "relai": [8, 10, 12, 13, 14, 15, 21, 22, 23], "g5le": [13, 14, 15], "vd": [14, 15], "12": [7, 8, 11, 12, 13, 14, 15, 22, 23], "vdc": [11, 13, 14, 15], "each": [7, 8, 10, 11, 14, 15, 17, 22, 23], "combin": [6, 14, 15], "zvn4206a": [14, 15], "mofset": [14, 15], "ha": [8, 10, 11, 13, 14, 15, 17, 21, 22, 23], "onli": [4, 8, 9, 14, 15, 17], "30": [7, 14, 15, 22, 23], "gpio": [7, 8, 10, 13, 14, 15, 22, 23], "enough": [14, 15, 22, 23], "activ": [6, 14, 15, 16], "repres": [14, 15, 17, 22, 23], "512": [14, 15], "we": [6, 8, 9, 10, 12, 14, 15, 19, 20, 21, 22, 23], "expand": [8, 13, 14, 15], "i2c": [8, 10, 12, 13, 14, 15, 19, 21], "mcp23017": [8, 14, 15], "have": [4, 8, 10, 12, 14, 15, 17, 20, 21, 22, 23], "type": [4, 10, 13, 14, 15, 17, 19, 22, 23], "tca9548a": [10, 14, 15], "from": [7, 8, 11, 14, 15, 17, 20, 21, 22, 23], "adafruit": [10, 12, 13, 14, 15, 22, 23], "go": [10, 13, 14, 15, 20], "128": [14, 15], "card": [7, 10, 14, 15], "its": [7, 10, 13, 14, 15, 20, 22, 23], "own": [14, 15], "digit": [8, 12, 13, 14, 15, 22, 23], "0x70": [14, 15], "0x77": [14, 15], "In": [4, 8, 10, 12, 14, 15, 17, 21, 22, 23], "follow": [4, 7, 8, 10, 11, 12, 14, 15, 17, 19, 20, 22, 23], "0x71": [14, 15], "0x72": [14, 15], "m": [7, 8, 10, 12, 14, 15, 22, 23], "0x73": [14, 15], "4": [7, 8, 10, 12, 13, 14, 15, 16, 20, 21, 22, 23], "need": [6, 8, 9, 11, 12, 14, 15, 19, 20, 21, 22, 23], "pcb": [4, 12, 13, 14, 15, 22, 23], "2": [4, 7, 8, 10, 11, 12, 14, 15, 16, 20, 22, 23], "instal": [0, 6, 7, 12, 13, 14, 15, 16, 20], "100": [13, 14, 15, 20, 22, 23], "kohm": [12, 13, 14, 15, 22, 23], "resistor": [8, 11, 12, 13, 14, 15, 21, 22, 23], "mosfet": [13, 14, 15], "diod": [13, 14, 15], "1n4007": [14, 15], "5": [7, 8, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23], "6": [7, 10, 12, 13, 14, 15, 22, 23], "termin": [7, 10, 12, 13, 14, 15, 19, 20, 22, 23], "screw": [7, 12, 14, 15, 22, 23], "7": [7, 10, 12, 13, 14, 15, 22, 23], "male": [12, 14, 15], "header": [12, 13, 14, 15, 22, 23], "pin": [12, 13, 14, 15, 22, 23], "strip": [7, 12, 13, 14, 15, 22, 23], "16": [7, 8, 12, 13, 14, 15, 22, 23], "9": [7, 10, 12, 13, 14, 15, 22, 23], "dip": [12, 13, 14, 15], "dual": [12, 14, 15, 22, 23], "line": [8, 12, 14, 15, 19, 21, 22, 23], "socket": [12, 13, 14, 15], "14": [7, 12, 13, 14, 15], "10": [7, 12, 13, 14, 15, 20, 22, 23], "duplic": [14, 15], "time": [8, 10, 14, 15, 20, 22, 23], "everi": [14, 15, 20], "To": [12, 14, 15, 20, 21, 22, 23], "build": [6, 14, 15, 17, 22, 23], "necessari": [4, 7, 10, 14, 15, 22, 23], "differ": [6, 7, 8, 10, 12, 13, 14, 15, 17, 20, 22, 23], "It": [4, 9, 10, 13, 14, 15, 17, 19, 20, 21, 22, 23], "therefor": [14, 15, 22, 23], "identifi": [14, 15], "assign": [14, 15], "alloc": [14, 15], "code": [4, 10, 11, 14, 15, 22, 23], "here": [7, 14, 15, 23], "select": [10, 14, 15, 22, 23], "default": [14, 15, 17, 20], "For": [8, 10, 12, 14, 15, 20, 22, 23], "suggest": [12, 14, 15, 22, 23], "mount": [7, 12, 14, 15, 22, 23], "jumper": [14, 15], "note": [7, 14, 15, 22, 23], "name": [4, 14, 15, 20, 22, 23], "zoom": [7, 14, 15], "first": [4, 7, 8, 10, 14, 15, 19, 20], "test": [4, 7, 10, 12, 14, 15, 20, 22, 23], "befor": [7, 8, 14, 15, 19, 20, 22, 23], "them": [14, 15, 20, 22, 23], "definit": [14, 15], "simplifi": [14, 15], "thing": [14, 15, 20], "do": [4, 7, 13, 14, 15, 17, 20], "prepar": [12, 14, 15, 22, 23], "50": [7, 9, 11, 14, 15, 22, 23], "cm": [7, 14, 15, 22, 23], "long": [7, 8, 14, 15], "flat": [14, 15], "wire": [7, 8, 10, 13, 14, 15, 22, 23], "two": [4, 8, 9, 12, 14, 15, 20, 21, 22, 23], "pole": [14, 15, 22, 23], "connector": [7, 14, 15, 22, 23], "cabl": [7, 10, 12, 13, 14, 15, 22, 23], "contact": [12, 14, 15, 20, 22, 23], "connect": [7, 8, 9, 12, 13, 14, 15, 16, 20, 21], "12v": [6, 7, 8, 12, 13, 14, 15, 22, 23], "your": [4, 6, 10, 11, 12, 14, 15, 22, 23], "run": [7, 10, 12, 14, 15, 16, 20, 22, 23], "write": [4, 12, 14, 15, 20, 22, 23], "i2cdetect": [12, 14, 15], "y": [12, 14, 15], "three": [12, 14, 15, 17, 20, 22, 23], "should": [4, 7, 8, 10, 12, 14, 15, 17, 20, 22, 23], "appear": [10, 12, 14, 15, 22, 23], "been": [10, 11, 13, 14, 15, 17, 20, 22, 23], "detect": [14, 15], "script": [4, 14, 15, 16, 20], "test_mux_board": [14, 15], "py": [4, 12, 14, 15, 17, 20, 22, 23], "These": [3, 6, 8, 17, 20, 21, 22, 23], "ar": [3, 4, 7, 8, 9, 10, 11, 12, 17, 19, 20, 21, 22, 23], "support": [3, 10], "anymor": [3, 21], "draft": 4, "TO": [4, 15, 21], "BE": [4, 15, 21], "review": [4, 21], "section": [4, 6, 11, 16, 20, 22, 23], "intend": 4, "part": [4, 6, 8, 11, 17, 21, 22, 23], "advic": [4, 21], "best": 4, "practic": [4, 22, 23], "help": [4, 7, 8, 20], "within": [4, 10, 20, 22, 23], "contribut": 4, "howev": [4, 8, 13, 17, 22, 23], "order": [4, 17, 20, 22, 23], "maintain": 4, "track": [4, 22, 23], "promot": 4, "exchang": 4, "reus": 4, "contributor": 4, "ideal": 4, "few": 4, "step": [4, 10, 12, 14, 15, 16, 17, 22, 23], "case": [4, 10, 21, 22, 23], "distinguish": 4, "when": [4, 7, 9, 19, 20, 21, 22, 23], "deal": 4, "compli": 4, "wai": [4, 10, 17, 22, 23], "Such": 4, "typic": [4, 8, 20, 22, 23], "focu": 4, "improv": [4, 17, 23], "exist": [4, 6, 17, 22, 23], "reduc": [4, 8, 17], "adapt": [4, 12, 17, 20, 22, 23], "rang": [4, 11, 17, 21, 22, 23], "specif": [4, 6, 13, 17, 20, 22, 23], "easili": [4, 17, 20, 21], "avail": [4, 9, 17, 20, 22, 23], "newli": 4, "creat": [4, 8, 10, 19, 20, 22, 23], "expos": [4, 17], "minim": [4, 17], "hardware_system": 4, "introduc": [4, 11, 17, 20, 22, 23], "chang": [4, 12, 14, 15, 17, 20, 21], "singl": [4, 13, 20, 22, 23], "also": [4, 8, 9, 10, 19, 20, 22, 23], "discuss": 4, "ohmpi_hardwar": 4, "class": [4, 17, 20], "initi": 4, "veri": [4, 8, 23], "earli": 4, "stage": 4, "investig": 4, "implement": [4, 17, 20], "solut": [4, 22, 23], "If": [4, 10, 12, 19, 21, 22, 23], "path": [4, 8, 10, 22, 23], "strategi": 4, "readi": 4, "devic": [4, 8, 12, 13, 14, 15], "conceiv": 4, "recommend": [4, 10, 20, 22, 23], "import": [4, 17, 20], "kicad": 4, "both": [4, 17, 22, 23], "schema": 4, "share": 4, "alwai": 4, "branch": 4, "python": [4, 6, 16, 17, 19], "copi": [4, 10, 20], "similar": [4, 21], "modul": [4, 6, 8, 13, 17, 19, 22, 23], "store": [4, 20], "hardware_compon": 4, "directori": [4, 10, 20, 22, 23], "defin": [4, 7, 20], "relev": [4, 7], "abstract": [4, 17], "abstract_hardware_compon": 4, "method": [4, 17], "interact": [4, 16, 17, 20], "accord": [4, 8, 22, 23], "sure": [4, 20, 22, 23], "place": [4, 7, 8, 21, 22, 23], "config": [4, 12, 20, 22, 23], "describ": [4, 7, 10, 11, 12, 16, 17, 22, 23], "hardware_config": 4, "dictionari": 4, "config_xxx": 4, "where": [4, 6, 8, 10, 20, 22, 23], "xxx": 4, "replac": [4, 13, 21, 23], "3": [4, 7, 8, 10, 12, 13, 14, 15, 16, 20, 22, 23], "conduct": [4, 22, 23], "todo": 5, "e": [5, 11, 17, 20, 22, 23], "g": [5, 11, 12, 13, 17, 22, 23], "rocherfort": 5, "contain": [6, 7, 10, 17, 22, 23], "compos": [6, 7], "mb": 6, "voltag": [6, 7, 8, 12, 13, 17, 21, 22, 23], "0": [6, 8, 11, 12, 14, 15, 20, 22, 23], "n": [6, 7, 8, 12, 13, 14, 15, 20, 22, 23], "address": [6, 8, 12, 22, 23], "pwr": 6, "either": [6, 10, 22, 23], "batteri": [6, 7, 12, 22, 23], "more": [6, 7, 8, 20, 21], "advanc": [6, 20], "can": [6, 7, 8, 9, 10, 20, 21, 22, 23], "control": [6, 8, 9, 20, 22, 23], "ctrl": [6, 22, 23], "raspberrypi": [6, 8, 9, 10, 13], "upgrad": [6, 13, 23], "recogn": 6, "c": [6, 11, 22, 23], "valid": [6, 22, 23], "regul": 6, "dps5005": 6, "os": [6, 7, 20], "virtual": [6, 16], "environ": [6, 16], "packag": [6, 13, 20], "thonni": [6, 12, 20], "id": [6, 20], "cut": [7, 13], "ribbon": [7, 14, 15], "proper": 7, "length": [7, 22, 23], "about": [7, 8], "5m": [7, 12], "correspond": [7, 17, 22], "crimp": [7, 22, 23], "idc": [7, 13], "suitabl": [7, 22, 23], "clamp": 7, "pai": [7, 22, 23], "attent": [7, 22, 23], "direct": [7, 20, 22, 23], "unbalanc": 7, "perpendicular": 7, "possibl": [7, 11, 17, 21, 22, 23], "same": [7, 8, 20, 22, 23], "flush": 7, "posit": [7, 13, 22, 23], "spacer": [7, 12, 14, 15], "abov": [7, 22, 23], "below": [7, 8, 10, 17, 20, 22, 23], "profil": 7, "view": [7, 12], "color": 7, "yellow": 7, "tin": [7, 13], "end": [7, 17, 22, 23], "red": [7, 12, 20, 22, 23], "black": [7, 12, 13, 22, 23], "left": [7, 12], "shown": [7, 22, 23], "pictur": 7, "i": [7, 14, 15, 20, 22, 23], "ii": 7, "gnd": [7, 22, 23], "nois": [7, 13], "often": [7, 8], "heard": 7, "clip": 7, "11": [7, 11, 12, 13, 22, 23], "input": [7, 8, 11, 12, 13, 22, 23], "right": [7, 12], "fix": [7, 12, 13], "second": [7, 8, 11, 20, 22, 23], "13": [7, 12, 13, 14, 15, 22, 23], "15": [7, 11, 12, 13, 14, 15, 22, 23], "previou": 7, "procedur": 7, "repeat": [7, 20, 22, 23], "other": [7, 17, 20, 22, 23], "17": [7, 12, 13, 22, 23], "purpl": 7, "18": [7, 12, 13, 22, 23], "third": [7, 20], "19": [7, 12, 13, 22, 23], "fourth": 7, "nylon": 7, "hex": [7, 14, 15], "photograph": 7, "detail": [7, 8, 16, 20, 22], "20": [7, 12, 13, 22, 23], "4th": 7, "togeth": [7, 17, 22, 23], "could": [7, 12, 22, 23], "previous": [7, 10, 22, 23], "21": [7, 12, 13, 22, 23], "tie": 7, "22": [7, 12, 13, 22, 23], "23": [7, 12, 13, 14, 15, 22, 23], "pvc": 7, "plate": 7, "minimum": 7, "dimens": 7, "200": [7, 11, 13], "mm": [7, 12, 14, 15, 22, 23], "150": [7, 8, 22, 23], "drill": 7, "remain": [7, 17, 22, 23], "metal": [7, 13], "tighten": 7, "25": [7, 11, 13, 14, 15, 22, 23], "rpi": [7, 10, 22, 23], "so": [7, 8, 22, 23], "access": [7, 10, 20, 22, 23], "usb": 7, "port": [7, 12, 13], "mark": [7, 12], "hole": [7, 13, 22, 23], "26": [7, 13, 22, 23], "add": [7, 19, 22, 23], "27": [7, 13, 14, 15, 22, 23], "attach": 7, "washer": 7, "nut": 7, "28": [7, 13], "29": [7, 22, 23], "come": 7, "out": [7, 10, 22, 23], "pass": [7, 20], "output": [7, 12, 13, 20, 22, 23], "pre": [7, 12], "led": [7, 13], "simpli": [7, 10, 19, 22, 23], "consid": 7, "temporari": 7, "modif": [7, 10, 22, 23], "orang": 7, "31": [7, 12, 14, 15], "brown": 7, "blue": [7, 22, 23], "block": [7, 13, 22, 23], "top": [7, 12, 17], "secur": [7, 20], "33": [7, 13], "34": [7, 13], "35": [7, 12, 13], "36": [7, 12, 22, 23], "37": [7, 22, 23], "38": [7, 13, 22, 23], "sd": [7, 10, 22, 23], "program": [7, 10, 22, 23], "mous": [7, 10, 22, 23], "keyboard": [7, 10, 22, 23], "monitor": [7, 20, 22, 23], "hdmi": [7, 10], "39": [7, 12, 13, 14, 15, 22, 23], "deliv": [7, 22, 23], "12vdc": 7, "enjoi": 7, "integr": [8, 12], "mn": [8, 21], "ab": 8, "switch": [8, 13, 17, 22, 23], "polar": [8, 13, 22, 23], "half": [8, 20], "cycl": [8, 17, 20], "stack": [8, 13, 20, 22, 23], "explan": 8, "understand": [8, 20], "redirect": 8, "reader": 8, "datasheet": 8, "done": [8, 10, 20, 22, 23], "through": [8, 13, 17, 20, 22, 23], "adc": [8, 12, 13, 21, 22, 23], "analog": [8, 12, 13, 22, 23], "convert": [8, 12, 13, 22, 23], "ads1115": [8, 12, 13, 21, 22, 23], "bit": [8, 12, 13, 22, 23], "programm": [8, 13], "gain": [8, 12, 13, 20, 22, 23], "pga": 8, "mean": [8, 17], "factor": 8, "digitis": 8, "Its": [8, 22, 23], "vari": 8, "With": [8, 22, 23], "precis": [8, 12, 13, 22, 23], "076": 8, "mv": 8, "beyond": 8, "larger": 8, "our": [8, 22, 23], "divid": [8, 22, 23], "receiv": [8, 20], "mb_2023": 8, "bridg": [8, 22, 23], "across": 8, "seri": [8, 22, 23], "instanc": [8, 10], "300": 8, "ohm": [8, 11, 12, 13, 22, 23], "anoth": [8, 10, 21, 22, 23], "techniqu": 8, "consist": [8, 21, 22, 23], "opamp": 8, "amplifi": [8, 12, 13, 22, 23], "multipl": [8, 10, 20], "known": [8, 10, 22, 23], "down": [8, 22, 23], "addit": [8, 20, 22, 23], "mode": 8, "ensur": [8, 10, 22, 23], "high": [8, 13, 22, 23], "imped": [8, 11, 22, 23], "inde": [8, 22, 23], "leak": 8, "while": [8, 17], "affect": 8, "mb_2024": 8, "differenti": 8, "model": [8, 10, 12, 13, 22, 23], "float": 8, "ground": [8, 12, 21, 22, 23], "enabl": [8, 9, 17, 20, 22, 23], "much": 8, "higher": [8, 12, 17, 23], "too": 8, "larg": 8, "usual": 8, "accur": [8, 22, 23], "shunt": [8, 11, 12, 13, 21], "As": [8, 22, 23], "tini": 8, "being": [8, 22, 23], "ina282": [8, 12], "via": [8, 10, 17, 21, 22, 23], "click": [8, 10, 13, 21, 22, 23], "ina": 8, "equival": [8, 12, 22, 23], "alreadi": 8, "solder": [8, 12, 13, 22, 23], "off": 8, "revers": [8, 22, 23], "four": [8, 12, 13], "optic": [8, 12, 21], "transit": 8, "mcp2308": 8, "gpi": 8, "sda": [8, 21], "scl": [8, 21], "protocol": [8, 17, 20, 21, 22, 23], "send": 8, "clock": 8, "transmit": 8, "pull": [8, 21], "rest": [8, 21], "5v": [8, 12, 13, 21, 22, 23], "thei": [8, 20, 21, 22, 23], "entri": 8, "becaus": 8, "mani": 8, "bu": 8, "tcaxxxx": 8, "itself": [8, 20], "rapsberrypi": 8, "now": [9, 22, 23], "actual": [9, 17, 22, 23], "henc": 9, "maximum": [9, 20, 22, 23], "aliment": 9, "modbu": 9, "quantiti": [10, 13, 22, 23], "micro": [10, 22, 23], "comput": [10, 22, 23], "instruct": [10, 20], "well": [10, 20, 22, 23], "websit": [10, 22, 23], "watch": [10, 22, 23], "video": [10, 22, 23], "how": [10, 16, 22, 23], "set": [10, 12, 13, 20, 22, 23], "latest": [10, 11, 22, 23], "stabl": [10, 17, 22, 23], "complet": [10, 12, 17, 19], "raspbian": [10, 22, 23], "visit": 10, "http": [10, 12, 13, 14, 15, 20, 22, 23], "org": 10, "en": [10, 13], "were": [10, 12, 22, 23], "onc": [10, 17, 20, 21, 22, 23], "spi": [10, 22, 23], "remot": [10, 20, 22, 23], "option": [10, 11, 13, 20, 22, 23], "deactiv": [10, 19, 22, 23], "gui": [10, 22, 23], "menu": [10, 22, 23], "failur": [10, 22, 23], "carri": [10, 22, 23], "task": [10, 22, 23], "caus": [10, 21, 22, 23], "shield": [10, 22, 23], "dure": [10, 17, 22, 23], "parallel": 10, "interpret": [10, 12, 22, 23], "discret": 10, "util": 10, "protect": 10, "problem": 10, "depend": [10, 19, 20, 22, 23], "specifi": [10, 19, 22, 23], "txt": [10, 19, 20, 22, 23], "libatla": [10, 22, 23], "dev": [10, 22, 23], "librari": [10, 22, 23], "sudo": [10, 22, 23], "apt": [10, 22, 23], "strongli": [10, 22, 23], "gather": [10, 22, 23], "python3": [10, 22, 23], "venv": [10, 22, 23], "command": [10, 19, 20, 22, 23], "bin": [10, 19, 22, 23], "suffici": [10, 22, 23], "meet": [10, 22, 23], "export": [10, 19], "cflag": 10, "fcommon": 10, "pip": [10, 19, 22, 23], "blinka": [10, 22, 23], "numpi": [10, 20, 22, 23], "panda": [10, 22, 23], "circuitpython": [10, 22, 23], "ads1x15": [10, 22, 23], "mcp230xx": 10, "gpiozero": 10, "check": [10, 11, 19, 20, 21, 22, 23], "met": [10, 19, 22, 23], "list": [10, 17, 19], "leav": [10, 19, 22, 23], "decid": [10, 22, 23], "setup": [10, 22, 23], "pythonid": [10, 22, 23], "root": [10, 22, 23], "usr": [10, 22, 23], "window": [10, 20, 22, 23], "On": [10, 17, 22, 23], "altern": [10, 22, 23], "button": [10, 22, 23], "locat": [10, 22, 23], "execut": [10, 20, 22, 23], "find": [10, 22, 23], "folder": [10, 19, 22, 23], "home": [10, 19, 20, 22, 23], "tab": [10, 20, 22, 23], "close": [10, 21, 22, 23], "ok": [10, 22, 23], "save": [10, 22, 23], "year": 11, "consequ": [11, 22, 23], "group": 11, "varieti": 11, "tailor": [11, 20], "technic": 11, "field": [11, 22, 23], "budget": 11, "characterist": [11, 22, 23], "tabl": [11, 23], "paramet": [11, 20], "unit": [11, 12, 13, 14, 15, 22, 23], "vmn": [11, 13], "number": [11, 12, 14, 15, 20, 22, 23], "temperatur": [11, 22, 23], "max": [11, 12, 13], "permiss": 11, "vab": [11, 13], "40": [11, 14, 15, 22, 23], "ma": [11, 12, 22, 23], "500": [11, 22, 23], "min": [11, 22, 23], "durat": [11, 22, 23], "ms": [11, 22, 23], "80": 11, "mohm": [11, 12, 22, 23], "tohm": 11, "volt": 11, "descript": 17, "per": [12, 13, 14, 15, 22, 23], "total": [12, 13, 14, 15, 22, 23], "web": [12, 13, 14, 15, 16, 17], "58": [12, 22, 23], "75": 12, "www": [12, 13, 14, 15, 22, 23], "mouser": [12, 13, 14, 15], "fr": [12, 13, 14, 15, 22, 23], "productdetail": [12, 13, 14, 15], "seeed": 12, "studio": 12, "102110421": 12, "qs": [12, 13, 14, 15], "7mvldsj5uaxen3lyyh3sqw": 12, "3d": [12, 13, 14, 15], "lm158n": 12, "amp": [12, 13, 22, 23], "o": [12, 14, 15, 22, 23], "texa": [12, 22, 23], "instrument": [12, 16, 17, 19, 20, 22, 23], "lm358an": [12, 22, 23], "nopb": [12, 22, 23], "lm158j": 12, "x1j7hmvl2zh8vpefml8": 12, "2ffq": 12, "print": [12, 14, 15, 20, 22, 23], "circuit": [12, 14, 15, 20, 22, 23], "asler": [12, 14, 15, 22, 23], "1085": [12, 13], "2fha2pyfaduh": 12, "2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn": 12, "252bg": 12, "capacitor": [12, 13, 23], "100nf": [12, 13, 23], "50vdc": [12, 23], "ceram": [12, 13, 23], "kemet": [12, 23], "c320c104k1": [12, 23], "c320c104k1r5ta7303": 12, "c4uyot": 12, "2flq1th4mcyoetma": 12, "5w": [12, 22, 23], "te": [12, 13, 14, 15, 22, 23], "h81k0bya": [12, 22, 23], "holsworthi": [12, 13], "2fha2pyfaduhuylh7az": 12, "2fmjfh2xjoums6wztux4som": 12, "252bii": 12, "h81k5bya": [12, 22, 23], "2fha2pyfadugy9twham3ru9hmijohywhbin95knm": 12, "252bx": 12, "2fm": 12, "vishai": [12, 13, 14, 15], "ccf071k50gke36": 12, "dale": 12, "qkeozdl6eqpa6lzrlqfvow": 12, "762": 12, "524": 12, "cmf651m0000fkek143": 12, "ciayqk2gdckzia2levalkg": 12, "42": [12, 13], "ohmit": [12, 13], "41f2r0e": 12, "im6toxqzgoauedprb19mha": 12, "08": [12, 14, 15], "pitch": [12, 13, 14, 15, 22, 23], "648": [12, 14, 15, 22, 23], "cui": [12, 14, 15], "tb009": [12, 14, 15], "508": [12, 14, 15], "02be": [12, 14, 15], "vlwxofp3u2wcfk5uckwtka": [12, 14, 15], "dc": [12, 13, 14, 15, 22, 23], "24v": [12, 23], "tracopow": [12, 23], "trn": [12, 23], "1215": [12, 23], "traco": [12, 13, 23], "yca": 12, "2faaymw02gquicgqj0ta": 12, "72": [12, 23], "mill": [12, 13], "110": [12, 13, 15, 22, 23], "43": [12, 13, 22, 23], "308": [12, 13], "41": [12, 13, 15], "001000": [12, 13], "iggadovctstu": 12, "2fqaur8narg": 12, "mgh": 12, "vip": 12, "gclid": 12, "eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw": 12, "aqy211eh": 12, "84": [12, 14, 15], "panason": [12, 13], "industri": 12, "wktuvitrialgiu8hcm7dvq": 12, "449": 12, "796": 12, "preci": [12, 15], "83": 12, "304": 12, "001101": [12, 15], "2fha2pyfadujqkqx4wauig": 12, "2fmgndxmcnv": 12, "2f33nj0gbxroculucynpyong": 12, "mcp23008": [12, 13], "593": [12, 13], "sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw": 12, "1x10": [12, 22, 23], "samtec": [12, 13, 22, 23], "ssw": [12, 13, 22, 23], "ru5fayqh": [12, 13], "252be0w1orxzibqpw": [12, 13], "smt": 12, "breakout": [12, 13], "soic": 12, "1212": 12, "gurawfaegucaqqfvnvtyeg": 12, "eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw": 12, "ina282aid": 12, "ze4": 12, "2fufuz19ilfayzxocfra": 12, "thd": [12, 13], "1211n": [12, 13], "2fha2pyfadugpyeg4idvm": 12, "2fmsr": 12, "252b7an": 12, "2f0t3ruis9pcaqjlt4": 12, "252bnrpuooeq": 12, "53": [12, 13, 23], "ssq": 12, "120": [12, 14, 15], "d": [12, 22, 23], "252be1bmvd": 12, "252bdzonqg": 12, "ejector": [12, 14, 15], "blk": [12, 14, 15], "10120550": [12, 14, 15], "conrad": [12, 14, 15], "com": [12, 13, 14, 15, 20, 22, 23], "bkl": [12, 14, 15], "space": [12, 14, 15], "254": [12, 14, 15], "row": [12, 13, 14, 15], "pc": [12, 14, 15], "741435": [12, 15], "searchterm": [12, 14, 15], "searchtyp": [12, 14, 15], "searchsuggest": [12, 14, 15], "femal": [12, 13, 14, 15, 22, 23], "hexagonal": 12, "87": [12, 13, 15], "48": [12, 13, 22, 23], "harwin": 12, "r25": 12, "3002002": 12, "w0yvoo0ixfenuv0hsdc4": 12, "2fq": 12, "86": [12, 13, 14, 15], "437": [12, 13], "1108331841001101": 12, "318": [12, 13], "ftmup6kvi2tnqoeziaq": 12, "2fpa": 12, "figur": [12, 22, 23], "show": [12, 22, 23], "schemat": [12, 23], "plug": [12, 22, 23], "plai": 12, "propos": [12, 22, 23], "florsch": [12, 22, 23], "advantag": 12, "signal": [12, 13, 22, 23], "lie": [12, 22, 23], "114": [12, 22, 23], "directli": [12, 17, 22, 23], "realiz": 12, "around": 12, "tdh15": 12, "inpout": 12, "than": [12, 22, 23], "just": [12, 23], "decreas": 12, "don": [12, 20], "t": [12, 13, 14, 15, 20, 21], "forget": [12, 20], "kei": 12, "r_shunt": 12, "ohmpi_config": 12, "dict": 12, "adjust": [12, 22, 23], "tow": 12, "dot": 12, "corner": 12, "lm158": 12, "ads115": [12, 22, 23], "3x11": 12, "wurth": [12, 13], "elektronik": [12, 13], "971110321": 12, "305": [12, 14, 15], "apm": [12, 14, 15], "hexseal": [12, 14, 15], "rm3x8mm": [12, 14, 15], "2701": [12, 14, 15], "jjse": [12, 14, 15], "2f12mkns3vxsdryxuhw": [12, 14, 15], "shutdown": 12, "unplug": 12, "bottom": [12, 22, 23], "11mm": 12, "m3": [12, 14, 15], "upper": 12, "everyth": 12, "screen": [12, 22, 23], "1kohm": 12, "r2": [12, 22, 23], "220": 12, "r1": [12, 22, 23], "padboard": 12, "spool": 12, "sample_measurement_exampl": 12, "result": [12, 22, 23], "2023": 13, "offer": [13, 20, 22, 23], "superior": 13, "compar": 13, "predecessor": 13, "evolv": [13, 17, 22, 23], "major": 13, "mikro": 13, "1887": [], "isol": 13, "200v": 13, "bom": [], "140": [14, 15], "560": [14, 15], "62": [14, 15], "92": [14, 15, 22, 23], "tru": [14, 15, 22, 23], "1580994": [14, 15], "256": [14, 15], "091": [14, 15], "296": [14, 15], "incorpor": [13, 14, 15, 17, 20], "sgaepimzzmueqxo7l": [14, 15], "2fbpyakboruumren": [14, 15], "56": [14, 15], "776": [14, 15], "205": [14, 15], "46": [13, 14, 15], "103321": [14, 15], "5twgzeq9e7hsylqaljjyrw": [14, 15], "732": [14, 15], "sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi": [14, 15], "325": [14, 15], "over": [14, 15, 21], "503811": [14, 15], "nchannel": [14, 15], "471": [14, 15], "576": [14, 15, 22], "vhuuswq2": [14, 15], "252bsz9b": [14, 15], "2ff6fcxt7g": [14, 15], "100k": [14, 21], "061": [14, 15], "616": [14, 15], "beyschlag": [13, 14, 15], "mba02040c1003frp00": [13, 14, 15], "mzrxyrlhvdt9crf7zyf": [13, 14, 15], "2f5q": [13, 14, 15], "89": [13, 14, 15], "2717": [14, 15], "sgaepimzzmsyydr3r27av4eqf73yoh": [14, 15], "252baqg": [14, 15], "252bz3hvktao": [14, 15], "10120558": [14, 15], "54": [14, 15], "No": [14, 15], "51": [14, 15], "741727": [14, 15], "10120862": [14, 15], "strain": [14, 15], "relief": [14, 15], "44": [13, 14, 15, 22, 23], "742063": [14, 15], "10120158": [14, 15], "x": [14, 15, 22, 23], "multi": [14, 15, 22, 23], "colour": [14, 15], "1012015810": [14, 15], "127": [14, 15], "008": [14, 15], "1548658": [14, 15], "79": [14, 15], "49": [14, 15], "keyston": [14, 15], "24300": [14, 15], "uwqyq": [14, 15], "2f2czwu0ejpozmzc2a": [14, 15], "745": [14, 15], "846": [14, 15], "614": [14, 15], "25515": [14, 15], "2f2czwuxuhumfr": [14, 15], "252bzuq": [14, 15], "updat": [15, 17, 20], "100k\u03c9": 15, "mm\u00b2": [15, 22, 23], "55": [15, 22, 23], "328": 15, "uqd7xcvsscnr3hwd6fta8g": 15, "whose": [22, 23], "main": [17, 22, 23], "summar": [], "cover": [], "acquisit": [16, 20], "separ": 20, "json": [20, 23], "ohmpi_set": [], "central": [], "handler": 20, "layer": [], "excel": 20, "log": [17, 20], "broker": [19, 20], "zip": 20, "rotat": 20, "disk": 20, "exec_logg": 20, "data_logg": 20, "plan": 20, "state": 20, "health": 20, "soh": 20, "futur": 20, "By": 20, "written": [17, 20], "consol": 20, "like": [20, 21], "local": [19, 20], "dai": 20, "size": [13, 20], "exce": 20, "sent": 20, "level": [13, 17, 20], "edit": [19, 20], "setup_logg": 20, "custom": 20, "repositori": [20, 22, 23], "prefer": [20, 22, 23], "desir": [17, 20], "usernam": [19, 20], "password": 20, "One": [20, 21], "alter": 20, "keep": [17, 20], "bash": 20, "run_http_interfac": 20, "sh": [19, 20], "iot": [17, 20], "messag": [17, 20], "friendli": 20, "graphic": 20, "quick": 20, "easi": 20, "wi": 20, "fi": 20, "point": [20, 22, 23], "ap": 20, "webserv": 20, "serv": [20, 22, 23], "index": 20, "html": 20, "laptop": 20, "mobil": 20, "phone": 20, "upload": 20, "sequenc": [17, 20, 22, 23], "download": [20, 22, 23], "act": 20, "raspap": 20, "runonstart": 20, "141": 20, "8080": 20, "pseudo": 20, "evolut": 20, "quadrupol": [20, 22, 23], "appar": 20, "especi": 20, "suit": 20, "autom": 20, "ipython": 20, "ssh": 20, "putti": 20, "maco": 20, "linux": 20, "found": 20, "gitlab": [20, 22, 23], "entir": [20, 22, 23], "np": 20, "chdir": 20, "object": [17, 20], "k": [13, 20], "load": 20, "manual": [20, 22, 23], "injection_dur": [20, 22, 23], "nb_stack": 20, "nbr_mea": [20, 22, 23], "update_set": 20, "arrai": [13, 20, 22, 23], "shape": 20, "set_sequ": 20, "n2": 20, "string": 20, "load_sequ": 20, "abmn": [20, 22, 23], "rs_check": 20, "synchron": [17, 20], "wait": 20, "return": [20, 22, 23], "prompt": 20, "run_sequ": 20, "run_sequence_async": 20, "thread": [17, 20], "immedi": 20, "sleep": 20, "interrupt": 20, "kill": 20, "asynchron": 20, "interv": 20, "nb_mea": 20, "sequence_delai": [20, 22, 23], "run_multiple_sequ": 20, "taken": 20, "switch_mux_on": 20, "run_measur": 20, "switch_mux_off": 20, "risk": 20, "short": 20, "argument": 20, "autogain": 20, "true": 20, "ad": [20, 22, 23], "good": 20, "resolut": [20, 22, 23], "usag": 20, "consumpt": [20, 22, 23], "process": 20, "sensor": [13, 20], "scope": 20, "internet": 20, "network": 20, "auxiliari": 20, "publish": [20, 22], "subscrib": 20, "approach": 20, "mosquitto": 20, "server": 20, "reachabl": 20, "net": [13, 20], "servic": 20, "install_local_mqtt_brok": 20, "examin": 20, "parti": 20, "explor": 20, "reboot": 20, "further": 20, "format": 20, "kwarg": 20, "illustr": [20, 22, 23], "cmd_id": 20, "3fzxv121uitwgjwygcz4xw": 20, "cmd": 20, "nb_electrod": [20, 22, 23], "3fzxv121uitwgjwygcz4yw": 20, "made": [20, 22, 23], "dashboard": 20, "browser": 20, "flow": [20, 22, 23], "editor": [20, 22, 23], "node": 20, "complex": 20, "properli": [19, 20, 21], "palett": 20, "manag": [13, 20, 22, 23], "noder": [], "doc": [], "guid": [], "ui": 20, "visual": 20, "cookbook": 20, "due": 21, "quit": 21, "fragil": 21, "still": [21, 22, 23], "conductor": 21, "turn": [21, 22, 23], "multimet": 21, "broken": 21, "shoudn": 21, "wa": [21, 22, 23], "burn": 21, "expect": [17, 21], "try": 21, "effect": 21, "voltmet": [21, 22, 23], "sens": 21, "malfunct": 21, "erron": 21, "solv": 21, "most": 21, "vdd": 21, "reach": 21, "stronger": [21, 22, 23], "smaller": [21, 22, 23], "journal": 22, "bug": 22, "explain": 22, "miss": 22, "invit": 22, "v1": [22, 23], "commerci": [22, 23], "cpu": [22, 23], "w": [13, 22, 23], "storag": [22, 23], "o1": [22, 23], "youtub": [22, 23], "wjwzhv1v3pk": [22, 23], "noob": [22, 23], "simpl": [17, 22, 23], "unexpectedli": [22, 23], "boot": [22, 23], "cd": [19, 22, 23], "gnu": [22, 23], "nano": [19, 22, 23], "At": [22, 23], "op": [13, 22, 23], "dl": [22, 23], "press": [22, 23], "enter": [22, 23], "escap": [22, 23], "studi": [22, 23], "hous": [13, 22, 23], "diagram": [22, 23], "displai": [22, 23], "mimic": [22, 23], "behavior": [22, 23], "soil": [22, 23], "subject": [22, 23], "r11": [22, 23], "r10": [22, 23], "r12": [22, 23], "constitut": [22, 23], "stainless": [22, 23], "steel": [22, 23], "r9": [22, 23], "less": [22, 23], "sum": [22, 23], "000": [22, 23], "intens": [22, 23], "potenti": [22, 23], "calcul": [22, 23], "insert": [22, 23], "1115": [22, 23], "a1": [22, 23], "a0": [22, 23], "increas": [17, 22, 23], "r5": [22, 23], "r8": [22, 23], "r6": [22, 23], "r7": [22, 23], "a2": [22, 23], "a3": [22, 23], "obtain": [22, 23], "ly": [22, 23], "let": [22, 23], "equal": [22, 23], "multipli": [22, 23], "reduct": [22, 23], "despit": [22, 23], "calibr": [22, 23], "variou": [13, 22, 23], "disturb": [22, 23], "estim": [22, 23], "mega": [22, 23], "shortcut": [22, 23], "excess": [22, 23], "lithium": [22, 23], "ion": [22, 23], "automobil": [22, 23], "lead": [13, 22, 23], "acid": [22, 23], "strong": [22, 23], "hazard": [22, 23], "fuse": [22, 23], "onto": [22, 23], "ohmmet": [22, 23], "coeffici": [22, 23], "coef_p0": [22, 23], "coef_p1": [22, 23], "coef_p2": [22, 23], "coef_p3": [22, 23], "coef": [22, 23], "po": [22, 23], "p1": [22, 23], "r3": [22, 23], "r4": [22, 23], "p2": [22, 23], "p3": [22, 23], "r_ref": [22, 23], "slope": [22, 23], "convers": [13, 22, 23], "p0": [22, 23], "accuraci": [22, 23], "lm358n": [22, 23], "appli": [22, 23], "weaker": 22, "tx": [22, 23], "rememb": [22, 23], "holder": [22, 23], "f": [22, 23], "circul": [22, 23], "fig": [22, 23], "common": [17, 22, 23], "neg": [22, 23], "normal": [22, 23], "simultan": [22, 23], "role": [22, 23], "thu": [22, 23], "energ": [22, 23], "next": [22, 23], "featur": [22, 23], "strict": [22, 23], "in1": [22, 23], "in2": [22, 23], "in3": [22, 23], "in4": [22, 23], "5vdc": [13, 22, 23], "5vcc": [22, 23], "mm2": [22, 23], "lastli": [22, 23], "congratul": [22, 23], "construct": [22, 23], "ert": [22, 23], "sever": [17, 22, 23], "ten": [22, 23], "thousand": [22, 23], "stuck": [22, 23], "hand": [22, 23], "cap": [22, 23], "produc": [22, 23], "clean": [22, 23], "distanc": [22, 23], "had": [22, 23], "extra": [22, 23], "final": [22, 23], "horizont": [22, 23], "vertic": [22, 23], "06": [13, 22, 23], "04": [22, 23], "05": [13, 22, 23], "din": [22, 23], "rail": [22, 23], "chosen": [22, 23], "incom": [22, 23], "instead": [22, 23], "moreov": [22, 23], "bought": [22, 23], "velleman": [22, 23], "wpm404": [22, 23], "potentiomet": [13, 22, 23], "scienc": [22, 23], "framework": [22, 23], "manuscript": [22, 23], "osf": [22, 23], "io": [22, 23], "dzwb4": [22, 23], "irstea": [22, 23], "unzip": [22, 23], "master": [22, 23], "readm": [22, 23], "assist": [22, 23], "disconnect": [22, 23], "handl": [17, 22, 23], "charg": [22, 23], "full": [17, 22, 23], "capac": [22, 23], "fewer": [22, 23], "bank": [22, 23], "2a": [22, 23], "ll": [22, 23], "insid": [22, 23], "numer": [22, 23], "optim": [22, 23], "attribut": [22, 23], "the9": [22, 23], "hear": [22, 23], "sound": [22, 23], "permut": [22, 23], "csv": [22, 23], "delai": [22, 23], "repetit": [22, 23], "littl": [22, 23], "public": [22, 23], "articl": [22, 23], "sainsmart": [22, 23], "canal": 22, "pour": 22, "arduino": 22, "dsp": [13, 22], "avr": 22, "pic": 22, "arm": 22, "99": [13, 22, 23], "199": [22, 23], "sain": [22, 23], "smart": [22, 23], "101": [22, 23], "70": [13, 22, 23], "103": [22, 23], "018": [22, 23], "1x1": [22, 23], "66": [13, 22, 23], "1568649": [22, 23], "1x0": [22, 23], "71": [13, 22, 23], "1565235": [22, 23], "68": [22, 23], "rs": [22, 23], "pro": [13, 22, 23], "897": [22, 23], "1332": [22, 23], "858": [22, 23], "627": [22, 23], "52": [13, 22, 23], "upw50b50rv": [22, 23], "1083": [22, 23], "7ah": [22, 23], "537": [22, 23], "5488": [22, 23], "lr20": [22, 23], "9v": [22, 23], "185": [22, 23], "4686": [22, 23], "ferrul": [22, 23], "piec": [22, 23], "weidmul": [22, 23], "9004330000": [22, 23], "966067": [22, 23], "car": 22, "littelfus": [22, 23], "fhac0002zxj": 22, "96": [13, 22], "trn3": 23, "suppress": 23, "10v": 23, "fast": 23, "decoupl": 23, "last": 23, "prevent": 23, "overh": 23, "toler": 23, "orient": [17, 23], "h": [13, 23], "nf": 23, "jason": 23, "ohmpi_param": 23, "export_path": 23, "desktop": 23, "0251001": 23, "pat1l": 23, "2c": 13, "ref": 13, "link": 13, "eur": 13, "excl": 13, "vat": 13, "223": 13, "594": 13, "5063jd100k0ft": 13, "film": 13, "4watt": 13, "100kohm": 13, "8watt": 13, "bodi": 13, "eu": 13, "899": 13, "330": 13, "307": 13, "279": 13, "cfr100j330r": 13, "carbon": 13, "330ohm": 13, "1w": 13, "500ppm": 13, "ddevmfoh4ssvknglsgy0ha": 13, "228": 13, "603": 13, "cfr": 13, "25jb": 13, "4k7": 13, "yageo": 13, "4w": 13, "7k": 13, "588": 13, "wnc2r0fet": 13, "wirewound": 13, "2w": 13, "cdpnwznfzjb5bmolbzti": 13, "252bw": 13, "50v": 13, "1a": 13, "rectifi": 13, "214": 13, "637": 13, "1n4001": 13, "diotec": 13, "semiconductor": 13, "olc7aqgiedlll8na510wma": 13, "284": 13, "cree": 13, "941": 13, "c503bgancd0e0781": 13, "c503b": 13, "gan": 13, "cd0e0781": 13, "standard": 13, "green": 13, "527nm": 13, "mmround": 13, "32900": 13, "64600mcd": 13, "7d1ltpjg0i1j7dm": 13, "252b": 13, "252b5igzw": 13, "116": 13, "schottki": 13, "771": 13, "bat86113": 13, "bat86": 13, "113": 13, "nexperia": 13, "sod68": 13, "me8tqzrmiyx1ahcmzsx1tg": 13, "874": 13, "op27": 13, "ultra": 13, "offset": 13, "8dip": 13, "584": 13, "op27epz": 13, "inc": 13, "wivqp4zgangdp3uwih2ura": 13, "485": 13, "accessori": 13, "gurawfaeguaf08zux7w": 13, "2fuq": 13, "78": 13, "pack": 13, "ic": 13, "amazon": 13, "azdeliveri": 13, "parent": 13, "3x": 13, "dp": 13, "b07qhwltt": 13, "sr_1_5": 13, "__mk_fr_fr": 13, "c3": 13, "85m": 13, "85": 13, "c5": 13, "bd": 13, "95": 13, "91": 13, "crid": 13, "18whxz3e0nur5": 13, "keyword": 13, "qid": 13, "1702140215": 13, "sprefix": 13, "2cap": 13, "2c117": 13, "sr": 13, "ref03gpz": 13, "r": 13, "wivqp4zgangjpdfouwu1bw": 13, "dg411dj": 13, "781": 13, "e3": 13, "speed": 13, "dg411": 13, "xkjjivogybzznzq": 13, "252buwcw1q": 13, "unpolar": 13, "k104k15x7rf5ul2": 13, "multilay": 13, "mlcc": 13, "x7r": 13, "ammo": 13, "bc": 13, "rlgk8caobhbcqsnkgo2hja": 13, "568": 13, "10uf": 13, "667": 13, "eeu": 13, "eb1j100": 13, "aluminum": 13, "electrolyt": 13, "radial": 13, "63volt": 13, "aec": 13, "q200": 13, "ceafgkervibcbemsghcq5g": 13, "60v": 13, "600ma": 13, "700mw": 13, "transistor": 13, "zvn4206astz": 13, "335": 13, "522": 13, "chnl": 13, "onsemi": 13, "fairchild": 13, "2n7000bu": 13, "k2x4el1": 13, "2fkj6oexmhafsm5a": 13, "thd1512": 13, "11n": 13, "495": 13, "thd15": 13, "style": 13, "ckjk83fod0x2iyoeopcnmg": 13, "97": 13, "22n": 13, "1222n": 13, "ckjk83fod0uvycxqxchqfw": 13, "848": 13, "649": 13, "vi02215200j0g": 13, "vi0221520000g": 13, "amphenol": 13, "tb": 13, "ri": 13, "cla": 13, "180": 13, "anytek": 13, "mv7bduzupui3lmtbyxcxvw": 13, "088": 13, "74": 13, "932": 13, "1878": 13, "k5owtxstjao5l2rhk53deg": 13, "4976": 13, "mynhzdoqoqkab6t4ih2naq": 13, "serial": 13, "eeprom": 13, "2kb": 13, "dip8": 13, "03": 13, "474": 13, "bob": 13, "15439": 13, "sparkfun": 13, "translat": 13, "pca9306": 13, "p1jmdcb91o4xonpr": 13, "252b0xi4g": 13, "omhron": 13, "653": 13, "1a4": 13, "dc5": 13, "spst": 13, "NO": 13, "seal": 13, "pwf36butxbgftk6ytlb7nq": 13, "575": 13, "1104731841001000": 13, "47": 13, "standrd": 13, "tail": 13, "5ag0nvq1c4xxooytdz6dow": 13, "113308": 13, "8p": 13, "gld": 13, "cont": 13, "wzeyyeqmoweyjis4txlt7q": 13, "11044316": 13, "316": 13, "16p": 13, "iggadovctsrh": 13, "252bxewrwehkg": 13, "prt": 13, "14017": 13, "tall": 13, "2x20": 13, "a4bxicggsn": 13, "2f": 13, "252baml822b65a": 13, "ribon": 13, "710": 13, "61200623021": 13, "wr": 13, "bhd": 13, "54mm": 13, "6p": 13, "strt": 13, "conn": 13, "phr8rmcireabk1ywkdxzfw": 13, "571": 13, "534237": 13, "rec": 13, "1x05p": 13, "vrt": 13, "eln3i3szm1klmlr": 13, "252bszcsuq": 13, "94": 13, "1x04p": 13, "gygf5pdsjzki3hk2o1eilq": 13, "535541": 13, "1x08p": 13, "xdp7pgunc": 13, "252buqvwkjjvkwqw": 13, "ssw11002g": 13, "tiger": 13, "bui": 13, "ssw10202g": 13, "102": 13, "252be2zeimtlw": 13, "2fblw": 13, "826629": 13, "10p": 13, "fazuumncxom0apli6zggxg": 13, "1761681": 13, "hdr": 13, "vert": 13, "ht": 13, "bqfptycq3dlaez2wzdz7aw": 13, "aisler": 13, "lang": 13, "10k": 13, "sip9": 13, "bournd": 13, "3296w_vertic": 13, "raspberryp": 13, "63": 13, "kiwi": 13, "4gb": 13, "4268": 13, "src": 13, "73": 13, "801": 13, "012": 13, "012000": 13, "5ag0nvq1c4x40xnvdlnkzg": 13, "overview": 13, "machin": 13, "thirteen": 13, "eepow": [], "fundament": [], "what": [], "_": [], "clone": 16, "mqtt": [16, 17, 19], "re": 17, "structur": 17, "organis": 17, "hierarchi": 17, "five": 17, "distinct": 17, "atom": 17, "Theses": 17, "concret": 17, "properti": 17, "capabl": 17, "physic": 17, "mainli": 17, "occur": 17, "medium": 17, "ohmpihardwar": 17, "orchestr": 17, "cross": 17, "squar": 17, "wave": 17, "waveform": 17, "read": 17, "insur": 17, "whole": 17, "dynam": 17, "instanti": 17, "rel": 17, "customis": 17, "overal": 17, "radic": 17, "acquir": 17, "navig": 19, "dependeci": 19, "centralis": 19, "buse": 19, "pythonpath": 19, "bashrc": 19, "And": 19, "basic_ohmpi_flows_nod": 20}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"ohmpi": [0, 1, 7, 8, 19, 22, 23], "open": 0, "sourc": 0, "hardwar": [0, 4, 6, 17], "resist": [0, 22, 23], "meter": 0, "summari": 0, "document": 0, "center": 0, "project": [1, 19], "author": 1, "partner": 1, "cite": 1, "introduct": 1, "step": 19, "n": [], "3": 19, "mux": [14, 15], "board": [8, 11, 12, 13, 14, 15, 22, 23], "part": [10, 12, 13, 14, 15], "A": [10, 12, 13, 14, 15, 21], "assembl": [7, 11, 12, 13, 14, 15, 22, 23], "requir": [12, 13, 14, 15], "compon": [4, 12, 13, 14, 15, 17, 21, 22, 23], "b": [10, 12, 14, 15, 21, 22, 23], "address": [14, 15], "c": [10, 12, 14, 15], "valid": [14, 15], "api": 2, "refer": 2, "archiv": 3, "version": [3, 11], "softwar": [4, 16, 17], "interfac": [4, 20], "new": 4, "exampl": 5, "applic": [5, 20], "electron": 8, "design": 8, "measur": [8, 11, 12, 13, 22, 23], "multiplex": [8, 22, 23], "power": 9, "suppli": 9, "12v": 9, "batteri": 9, "regul": 9, "dps5005": 9, "raspberri": [10, 19, 22, 23], "pi": [10, 19, 22, 23], "configur": [10, 20, 22, 23], "os": [10, 22, 23], "instal": [10, 19, 22, 23], "virtual": [10, 19, 22, 23], "environ": [10, 19, 22, 23], "packag": [10, 22, 23], "activ": [10, 19, 22, 23], "thonni": [10, 22, 23], "python": [10, 20, 22, 23], "id": [10, 22, 23], "recogn": 11, "specif": 11, "you": 11, "v2023": [12, 14], "list": [12, 13, 14, 15, 22, 23], "descript": [12, 13, 22, 23], "start": 12, "up": 12, "check": 12, "2024": 13, "0": 13, "2": [13, 19], "v2024": 15, "oper": [16, 22, 23], "system": 17, "architectur": 17, "logger": 20, "file": 20, "web": 20, "mqtt": 20, "troubleshoot": 21, "issu": 21, "puls": 21, "between": 21, "valu": 21, "given": 21, "correct": 21, "one": 21, "commun": 21, "v": [22, 23], "1": [19, 22, 23], "01": 22, "limit": [22, 23], "32": [22, 23], "electrod": [22, 23], "The": [22, 23], "philosophi": [22, 23], "technic": [22, 23], "data": [22, 23], "current": [22, 23], "inject": [22, 23], "card": [22, 23], "connect": [19, 22, 23], "electr": [22, 23], "implement": [22, 23], "first": [22, 23], "four": [22, 23], "instruct": [22, 23], "preliminari": [22, 23], "procedur": [22, 23], "onli": [22, 23], "initi": [22, 23], "startup": [22, 23], "paramet": [22, 23], "complet": [22, 23], "tabl": 22, "titl": 22, "02": 23, "schemat": 13, "interact": 13, "bom": 13, "acquisit": 17, "clone": 19, "run": 19, "script": 19, "4": 19}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file diff --git a/doc/build/html/source_rst/api.html b/doc/build/html/source_rst/api.html index 4f3f7d33258d7b89fae21b90bbf7927c1a718aed..2f6e29fc96a3abd2095d7d85500c19af4f2fe516 100644 --- a/doc/build/html/source_rst/api.html +++ b/doc/build/html/source_rst/api.html @@ -20,7 +20,7 @@ <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> <link rel="next" title="Troubleshooting" href="troubleshooting.html" /> - <link rel="prev" title="Software and operation" href="software.html" /> + <link rel="prev" title="<no title>" href="software/developments.html" /> </head> <body class="wy-body-for-nav"> @@ -89,7 +89,7 @@ </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> - <a href="software.html" class="btn btn-neutral float-left" title="Software and operation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> + <a href="software/developments.html" class="btn btn-neutral float-left" title="<no title>" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="troubleshooting.html" class="btn btn-neutral float-right" title="Troubleshooting" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> diff --git a/doc/build/html/source_rst/developing_hardware_components.html b/doc/build/html/source_rst/developing_hardware_components.html index 30ef0b8c3d6b7e2c37de1d976ecb321549dcf82f..2bd79c1be19241521a5f2def8d2e0795060101e0 100644 --- a/doc/build/html/source_rst/developing_hardware_components.html +++ b/doc/build/html/source_rst/developing_hardware_components.html @@ -79,8 +79,8 @@ <section id="software-interface-to-new-hardware-components"> <h1>Software interface to new hardware components<a class="headerlink" href="#software-interface-to-new-hardware-components" title="Permalink to this heading">ïƒ</a></h1> -<p><a href="#id1"><span class="problematic" id="id2">**</span></a>* DRAFT VERSION - TO BE REVIEWED * -This section is intended for developers of a new hardware component as part of an OhmPi system.</p> +<p><strong>* DRAFT VERSION - TO BE REVIEWED *</strong></p> +<p>This section is intended for developers of a new hardware component as part of an OhmPi system.</p> <p>It presents some advices and best practices that should help developing new hardware components to work within an OhmPi system.</p> <p>OhmPi is an open source system and contributions in terms of hardware and software are welcome. However, in order to diff --git a/doc/build/html/source_rst/hardware/mb/mb_2024.html b/doc/build/html/source_rst/hardware/mb/mb_2024.html index 8528e1833c4032569031d823531fc4d2407ded9a..8e2e956eb85190e0fe0c8b42e85365f10cfb3a5b 100644 --- a/doc/build/html/source_rst/hardware/mb/mb_2024.html +++ b/doc/build/html/source_rst/hardware/mb/mb_2024.html @@ -618,6 +618,10 @@ it provides electrical isolation for the Vmn measurement set. This isolation all </tr> <tr class="row-even"><td><p>Installation of female header, 1 by 10 pins, for ADS1115</p></td> </tr> +</tbody> +</table> +<table class="docutils align-default"> +<tbody> <tr class="row-odd"><td rowspan="2"><p>5</p></td> <td><img alt="../../../_images/5.jpg" src="../../../_images/5.jpg" /> </td> diff --git a/doc/build/html/source_rst/software.html b/doc/build/html/source_rst/software.html index 0a8b32b2f8a3eade7004fe7031a4828cc1acfd8f..d4a588f80210a06ce0c91162d03700584416fcc5 100644 --- a/doc/build/html/source_rst/software.html +++ b/doc/build/html/source_rst/software.html @@ -19,7 +19,7 @@ <script src="../_static/js/theme.js"></script> <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> - <link rel="next" title="API reference" href="api.html" /> + <link rel="next" title="Software architecture" href="software/architecture.html" /> <link rel="prev" title="Assembling the OhmPi" href="hardware/assembling.html" /> </head> @@ -46,15 +46,10 @@ <li class="toctree-l1"><a class="reference internal" href="Ohmpi.html">OhmPi project</a></li> <li class="toctree-l1"><a class="reference internal" href="hardware.html">Hardware</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">Software and operation</a><ul> -<li class="toctree-l2"><a class="reference internal" href="#system-architecture">System architecture</a></li> -<li class="toctree-l2"><a class="reference internal" href="#loggers">Loggers</a></li> -<li class="toctree-l2"><a class="reference internal" href="#configuration-file">Configuration file</a></li> -<li class="toctree-l2"><a class="reference internal" href="#interfaces-and-applications">Interfaces and applications</a><ul> -<li class="toctree-l3"><a class="reference internal" href="#web-interface">Web interface</a></li> -<li class="toctree-l3"><a class="reference internal" href="#python-interface">Python interface</a></li> -<li class="toctree-l3"><a class="reference internal" href="#mqtt-interface">MQTT interface</a></li> -</ul> -</li> +<li class="toctree-l2"><a class="reference internal" href="software/architecture.html">Software architecture</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/installation.html">Installation</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/operations.html">Configuration file</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/operations.html#interfaces-and-applications">Interfaces and applications</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a></li> @@ -94,225 +89,34 @@ <p class="admonition-title">Warning</p> <p><strong>OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OhmPi. The OhmPi team cannot be held responsible if the equipment does not work after assembly.</strong></p> </div> -<section id="system-architecture"> -<h2>System architecture<a class="headerlink" href="#system-architecture" title="Permalink to this heading">ïƒ</a></h2> -<p>The OhmPi V2023 software is designed around a new architecture whose main components are summarized in the figure below.</p> -<figure class="align-default" id="id4"> -<img alt="../_images/architecture.png" src="../_images/architecture.png" /> -<figcaption> -<p><span class="caption-text">Software architecture of OhmPi V2023.</span><a class="headerlink" href="#id4" title="Permalink to this image">ïƒ</a></p> -</figcaption> -</figure> -<p>The general system configuration is defined in the <cite>config.py</cite> file covered in the <a class="reference internal" href="#configuration-file">Configuration file</a> section. -The acquisition settings (i.e. injection duration, stacks…) are defined in a separate JSON file (default: ohmpi_settings.json).</p> -<p>The central software component is the ohmpi.py file that contains the OhmPi class that interacts with the hardware. Other python files include utils and handlers (see the <a class="reference internal" href="#loggers">Loggers</a> section for more details). -A communication layer (I/O interface) on top of OhmPi allows for different user interfaces depending on the use cases (see <a class="reference internal" href="#interfaces-and-applications">Interfaces and applications</a>).</p> -</section> -<section id="loggers"> -<h2>Loggers<a class="headerlink" href="#loggers" title="Permalink to this heading">ïƒ</a></h2> -<p>Loggers have been introduced in this release. They use the excellent logging python package. -Specific handlers have been implemented for running with ohmpi.py (one for logging to an mqtt broker (see <a class="reference internal" href="#mqtt-interface">MQTT interface</a> for more details) and one for creating zipped rotated logs on disk).</p> -<p>Two loggers have been defined. The first one is dedicated to log operations execution. It is named exec_logger. The second one, named data_logger, is dedicated to log data. A third one is planned to log the state of health (SOH) of the system in a future version.</p> -<p>By default, logs are written to the console (print-like), stored locally in files (a zip is created after some time i.e. every day and/or when the size of the log exceeds a maximum size) and sent to an MQTT broker. Different logging levels may be defined for the different logs and handlers in the <a class="reference internal" href="#configuration-file">Configuration file</a>.</p> -<p>Advanced users may write new handlers and edit the <cite>setup_loggers.py</cite> file to customize the logging mechanisms to their needs.</p> -</section> -<section id="configuration-file"> -<h2>Configuration file<a class="headerlink" href="#configuration-file" title="Permalink to this heading">ïƒ</a></h2> -<p>The configuration of the OhmPi file <cite>config.py</cite> allows to configure the OhmPi. -A default version of <cite>config.py</cite> is provided in the repository. -This file should be edited to customize the configuration following the user’s needs and preferences.</p> -<p>The configuration includes setting the logging level desired for the different loggers and handlers, setting the mqtt broker(s) used for logging and control of the OhmPi and defining the options used for MQTT communication (i.e. username, password, security options…)</p> -<p>One should make sure to understand the parameters before altering them. It is also recommended to keep a copy of the default configuration.</p> -</section> -<section id="interfaces-and-applications"> -<h2>Interfaces and applications<a class="headerlink" href="#interfaces-and-applications" title="Permalink to this heading">ïƒ</a></h2> -<p>Different interfaces can be used to interact with the OhmPi.</p> -<p>Available interfaces are: -- <a class="reference internal" href="#web-interface">Web interface</a> (=HTTP interface): run in bash: <cite>bash run_http_interface.sh</cite> -- Python API: import the OhmPi class from Python script: <cite>from ohmpi import OhmPi</cite> (see <a class="reference internal" href="#python-interface">Python interface</a>) -- MQTT: IoT messaging through a broker (see <a class="reference internal" href="#mqtt-interface">MQTT interface</a>)</p> -<section id="web-interface"> -<h3>Web interface<a class="headerlink" href="#web-interface" title="Permalink to this heading">ïƒ</a></h3> -<p>This is a user friendly graphical interface for new users as well as running quick and easy acquisitions.</p> -<p>The Raspberry Pi of the OhmPi is used as a Wi-Fi Access Point (AP) and runs -a small webserver to serve the ‘index.html’ interface. Using a laptop or -a mobile phone connected to the Wi-Fi of the Raspberry Pi, one can see this -interface, upload sequences, change parameters, run a sequence and download data.</p> -<p>To configure the Raspberry Pi to act as an access point and run -the webserver automatically on start, see instructions on <a class="reference external" href="https://raspap.com/">raspap.com</a> and in ‘runOnStart.sh’.</p> -<p>Once configured, the webserver should start by itself on start and once -connected to the Pi, the user can go to <a class="reference external" href="http://10.3.141.1:8080">10.3.141.1:8080</a> -to access the interface.</p> -<figure class="align-default" id="id5"> -<img alt="../_images/http-interface-pseudo-section.png" src="../_images/http-interface-pseudo-section.png" /> -<figcaption> -<p><span class="caption-text">Web interface with its interactive pseudo-section.</span><a class="headerlink" href="#id5" title="Permalink to this image">ïƒ</a></p> -</figcaption> -</figure> -<figure class="align-default" id="id6"> -<img alt="../_images/http-interface-evolution.png" src="../_images/http-interface-evolution.png" /> -<figcaption> -<p><span class="caption-text">Evolution of quadrupole apparent resistivity with time.</span><a class="headerlink" href="#id6" title="Permalink to this image">ïƒ</a></p> -</figcaption> -</figure> -<figure class="align-default" id="id7"> -<img alt="../_images/http-interface-rs.png" src="../_images/http-interface-rs.png" /> -<figcaption> -<p><span class="caption-text">Contact resistance check.</span><a class="headerlink" href="#id7" title="Permalink to this image">ïƒ</a></p> -</figcaption> -</figure> -</section> -<section id="python-interface"> -<h3>Python interface<a class="headerlink" href="#python-interface" title="Permalink to this heading">ïƒ</a></h3> -<p>This interface offers a more direct access to the software components especially well suited for testing or automation on the Raspberry Pi.</p> -<p>By importing the <cite>OhmPi</cite> class from the ohmpi.py, one can control the OhmPi using interactive IPython. -Typically, it involves using the terminal or an Python IDE such as Thonny on the Raspberry Pi. One can also connect using -ssh and run the Python interface (see PuTTY on Windows or ssh command on macOS/Linux).</p> -<p>To access the Python API, make sure the file ohmpi.py is in the same -directory as where you run the commands/script. The file ohmpi.py can -be found on the OhmPi gitlab repository. We recommend downloading the -entire repository as ohmpi.py import other .py files and default configuration -files (.json and .py).</p> -<div class="literal-block-wrapper docutils container" id="id8"> -<div class="code-block-caption"><span class="caption-text">Example of using the Python API to control OhmPi</span><a class="headerlink" href="#id8" title="Permalink to this code">ïƒ</a></div> -<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span> -<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> -<span class="kn">import</span> <span class="nn">time</span> -<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="s2">"/home/pi/OhmPi"</span><span class="p">)</span> -<span class="kn">from</span> <span class="nn">ohmpi</span> <span class="kn">import</span> <span class="n">OhmPi</span> - -<span class="c1">### Define object from class OhmPi</span> -<span class="n">k</span> <span class="o">=</span> <span class="n">OhmPi</span><span class="p">()</span> <span class="c1"># this loads default parameters from the disk</span> - -<span class="c1">### Default parameters can also be edited manually</span> -<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'injection_duration'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># injection time in seconds</span> -<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'nb_stack'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># one stack is two half-cycles</span> -<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'nbr_meas'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># number of time the sequence is repeated</span> - -<span class="c1">### Update settings if needed</span> -<span class="n">k</span><span class="o">.</span><span class="n">update_settings</span><span class="p">({</span><span class="s2">"injection_duration"</span><span class="p">:</span><span class="mf">0.2</span><span class="p">})</span> - -<span class="c1">### Set or load sequence</span> -<span class="n">k</span><span class="o">.</span><span class="n">sequence</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]])</span> <span class="c1"># set numpy array of shape (n,4)</span> -<span class="c1"># k.set_sequence('1 2 3 4\n2 3 4 5') # call function set_sequence and pass a string</span> -<span class="c1"># k.load_sequence('ABMN.txt') # load sequence from a local file</span> - -<span class="c1">### Run contact resistance check</span> -<span class="n">k</span><span class="o">.</span><span class="n">rs_check</span><span class="p">()</span> - -<span class="c1">### Run sequence (synchronously - it will wait that all</span> -<span class="c1"># sequence is measured before returning the prompt</span> -<span class="n">k</span><span class="o">.</span><span class="n">run_sequence</span><span class="p">()</span> -<span class="c1"># k.run_sequence_async() # sequence is run in a separate thread and the prompt returns immediately</span> -<span class="c1"># time.sleep(2)</span> -<span class="c1"># k.interrupt() # kill the asynchron sequence</span> - -<span class="c1">### Run multiple sequences at given time interval</span> -<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'nb_meas'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span> <span class="c1"># run sequence three times</span> -<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'sequence_delay'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">100</span> <span class="c1"># every 100 s</span> -<span class="n">k</span><span class="o">.</span><span class="n">run_multiple_sequences</span><span class="p">()</span> <span class="c1"># asynchron</span> -<span class="c1"># k.interrupt() # kill the asynchron sequence</span> - -<span class="c1">### Single measurement can also be taken with</span> -<span class="n">k</span><span class="o">.</span><span class="n">switch_mux_on</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span> -<span class="n">k</span><span class="o">.</span><span class="n">run_measurement</span><span class="p">()</span> <span class="c1"># use default acquisition parameters</span> -<span class="n">k</span><span class="o">.</span><span class="n">switch_mux_off</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span> <span class="c1"># don't forget this! risk of short-circuit</span> - -<span class="c1">### Custom or adaptative argument, see help(k.run_measurement)</span> -<span class="n">k</span><span class="o">.</span><span class="n">run_measurement</span><span class="p">(</span><span class="n">nb_stack</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="c1"># do 4 stacks (8 half-cycles)</span> - <span class="n">injection_duration</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="c1"># inject for 2 seconds</span> - <span class="n">autogain</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># adapt gain of ADS to get good resolution</span> -</pre></div> -</div> -</div> -</section> -<section id="mqtt-interface"> -<h3>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Permalink to this heading">ïƒ</a></h3> -<p>This is an interface designed for an advanced remote usage of the OhmPi such as remote automation, data consumption by multiple processes and interaction with other sensors in the scope of a monitoring. It is based on the MQTT protocol, designed for the Internet of Things (IoT), to interact with the OhmPi.</p> -<p>This option allows interacting remotely with a single OhmPi, a network of OhmPis, as well as auxiliary instruments and sensors. The communication is based on a publish/subscribe approach and involves a MQTT broker.</p> -<p>An example of MQTT broker that can be used is <a class="reference external" href="https://mosquitto.org/">Mosquitto</a>. Depending on the monitoring needs, an MQTT broker can be set up locally on the Raspberry Pi, on a local network or any remote server reachable through the net. A local Mosquitto broker can be set up and enabled to run as a service on the OhmPi using the bash script install_local_mqtt_broker.sh.</p> -<p>MQTT messages include logging messages from the OhmPi and commands sent to the OhmPi. These messages can be examined easily using a third party software such as <a class="reference external" href="http://mqtt-explorer.com/">MQTT Explorer</a>.</p> -<p>Commands sent on the broker are received by the ohmpi.py script that runs on the OhmPi (make sure ohmpi.py starts on reboot) and further processed. -MQTT commands are sent in JSON format following the Python API with kwargs as illustrated below:</p> -<div class="literal-block-wrapper docutils container" id="id9"> -<div class="code-block-caption"><span class="caption-text">Updating acquisition settings.</span><a class="headerlink" href="#id9" title="Permalink to this code">ïƒ</a></div> -<div class="highlight-json notranslate"><div class="highlight"><pre><span></span>{ - "cmd_id": "3fzxv121UITwGjWYgcz4xw", - "cmd": "update_settings", Depending on the experiment needs, MQTT brokers can be set up locally on the Raspberry Pi or on a local or remote server. - "kwargs": { - "config": { - "nb_meas": 2, - "nb_electrodes": 10, - "nb_stack": 2, - "injection_duration": 2, - "sequence_delay": 100 - } - } -} -</pre></div> -</div> -</div> -<div class="literal-block-wrapper docutils container" id="id10"> -<div class="code-block-caption"><span class="caption-text">Check contact resistances</span><a class="headerlink" href="#id10" title="Permalink to this code">ïƒ</a></div> -<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> -<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4xw"</span><span class="p">,</span> -<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rs_check"</span><span class="p">,</span> -<span class="p">}</span> -</pre></div> -</div> -</div> -<div class="literal-block-wrapper docutils container" id="id11"> -<div class="code-block-caption"><span class="caption-text">Running a sequence.</span><a class="headerlink" href="#id11" title="Permalink to this code">ïƒ</a></div> -<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> -<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4Yw"</span><span class="p">,</span> -<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"run_sequence"</span><span class="p">,</span> -<span class="p">}</span> -</pre></div> -</div> -</div> -<div class="literal-block-wrapper docutils container" id="id12"> -<div class="code-block-caption"><span class="caption-text">Running same sequence multiple times (nb_meas).</span><a class="headerlink" href="#id12" title="Permalink to this code">ïƒ</a></div> -<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> -<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4Yw"</span><span class="p">,</span> -<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"run_multiple_sequences"</span><span class="p">,</span> -<span class="p">}</span> -</pre></div> -</div> -</div> -<div class="literal-block-wrapper docutils container" id="id13"> -<div class="code-block-caption"><span class="caption-text">Interrupt current acquisition.</span><a class="headerlink" href="#id13" title="Permalink to this code">ïƒ</a></div> -<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> -<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4xw"</span><span class="p">,</span> -<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"interrupt"</span><span class="p">,</span> -<span class="p">}</span> -</pre></div> -</div> +<p>This section details describes the Python software and how to interact with an OhmPi instrument.</p> +<div class="toctree-wrapper compound"> +<ul> +<li class="toctree-l1"><a class="reference internal" href="software/architecture.html">Software architecture</a><ul> +<li class="toctree-l2"><a class="reference internal" href="software/architecture.html#hardware-components">Hardware components</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/architecture.html#hardware-system">Hardware system</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/architecture.html#acquisition">Acquisition</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="software/installation.html">Installation</a><ul> +<li class="toctree-l2"><a class="reference internal" href="software/installation.html#step-1-connect-to-the-raspberry-pi">Step 1: Connect to the Raspberry Pi</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/installation.html#step-2-clone-the-ohmpi-project">Step 2: Clone the OhmPi project</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/installation.html#step-3-run-the-installation-script">Step 3: Run the installation script</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/installation.html#step-4-activate-the-ohmpy-virtual-environment">Step 4: Activate the ohmpy virtual environment</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="software/operations.html">Configuration file</a></li> +<li class="toctree-l1"><a class="reference internal" href="software/operations.html#interfaces-and-applications">Interfaces and applications</a><ul> +<li class="toctree-l2"><a class="reference internal" href="software/operations.html#web-interface">Web interface</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/operations.html#python-interface">Python interface</a></li> +<li class="toctree-l2"><a class="reference internal" href="software/operations.html#mqtt-interface">MQTT interface</a><ul> +<li class="toctree-l3"><a class="reference internal" href="software/operations.html#loggers">Loggers</a></li> +</ul> +</li> +</ul> +</li> +</ul> </div> -<p>Custom processing of messages and tailor-made dashboards for monitoring experiments may be designed using a browser-based flow editor such as <a class="reference external" href="http://mqtt-explorer.com/">Node-red</a>. -This may help designing complex IoT experiments and monitoring systems in which OhmPi is a component.</p> -<p>Examples incorporating execution commands and data outputs from OhmPi can be found in the OhmPi examples. Once Node-RED is installed on the OhmPi, these examples can be accessed separately by running a command in the console such as :</p> -<p>These examples may require installing some additional node packages in order to work properly. This can be done in the <a href="#id2"><span class="problematic" id="id3">`</span></a>Palette Manager <<a class="reference external" href="https://nodered.org/docs/user-guide/editor/palette/manager">https://nodered.org/docs/user-guide/editor/palette/manager</a>> within Node-RED.</p> -<figure class="align-default" id="id14"> -<img alt="../_images/node-red_flow.png" src="../_images/node-red_flow.png" /> -<figcaption> -<p><span class="caption-text">Example flow in node-red to interact with an OhmPi.</span><a class="headerlink" href="#id14" title="Permalink to this image">ïƒ</a></p> -</figcaption> -</figure> -<figure class="align-default" id="id15"> -<img alt="../_images/node-red_interface_control.png" src="../_images/node-red_interface_control.png" /> -<figcaption> -<p><span class="caption-text">Example of a dashboard UI created with node-red to interact with an OhmPi - control tab.</span><a class="headerlink" href="#id15" title="Permalink to this image">ïƒ</a></p> -</figcaption> -</figure> -<figure class="align-default" id="id16"> -<img alt="../_images/node-red_interface_data.png" src="../_images/node-red_interface_data.png" /> -<figcaption> -<p><span class="caption-text">Example of a dashboard UI created with node-red to interact with an OhmPi - data visualization tab.</span><a class="headerlink" href="#id16" title="Permalink to this image">ïƒ</a></p> -</figcaption> -</figure> -<p>For more documentation dedicated to node-red, please refer to the Node-red <a class="reference external" href="https://cookbook.nodered.org/">cookbooks</a>.</p> -</section> -</section> </section> @@ -320,7 +124,7 @@ This may help designing complex IoT experiments and monitoring systems in which </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="hardware/assembling.html" class="btn btn-neutral float-left" title="Assembling the OhmPi" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> - <a href="api.html" class="btn btn-neutral float-right" title="API reference" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> + <a href="software/architecture.html" class="btn btn-neutral float-right" title="Software architecture" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/> diff --git a/doc/build/html/source_rst/software/architecture.html b/doc/build/html/source_rst/software/architecture.html new file mode 100644 index 0000000000000000000000000000000000000000..577860d7e25f92c307474f2f777afff433215283 --- /dev/null +++ b/doc/build/html/source_rst/software/architecture.html @@ -0,0 +1,177 @@ +<!DOCTYPE html> +<html class="writer-html5" lang="en" > +<head> + <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" /> + + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Software architecture — OhmPi v2024rc documentation</title> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> + <!--[if lt IE 9]> + <script src="../../_static/js/html5shiv.min.js"></script> + <![endif]--> + + <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script> + <script src="../../_static/jquery.js"></script> + <script src="../../_static/underscore.js"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script> + <script src="../../_static/doctools.js"></script> + <script src="../../_static/js/theme.js"></script> + <link rel="index" title="Index" href="../../genindex.html" /> + <link rel="search" title="Search" href="../../search.html" /> + <link rel="next" title="Installation" href="installation.html" /> + <link rel="prev" title="Software and operation" href="../software.html" /> +</head> + +<body class="wy-body-for-nav"> + <div class="wy-grid-for-nav"> + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="../../index.html" class="icon icon-home"> + OhmPi + </a> +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> + <ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../Ohmpi.html">OhmPi project</a></li> +<li class="toctree-l1"><a class="reference internal" href="../hardware.html">Hardware</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../software.html">Software and operation</a><ul class="current"> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Software architecture</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#hardware-components">Hardware components</a></li> +<li class="toctree-l3"><a class="reference internal" href="#hardware-system">Hardware system</a></li> +<li class="toctree-l3"><a class="reference internal" href="#acquisition">Acquisition</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li> +<li class="toctree-l2"><a class="reference internal" href="operations.html">Configuration file</a></li> +<li class="toctree-l2"><a class="reference internal" href="operations.html#interfaces-and-applications">Interfaces and applications</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../troubleshooting.html">Troubleshooting</a></li> +<li class="toctree-l1"><a class="reference internal" href="../gallery.html">Examples of applications</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> +<li class="toctree-l1"><a class="reference internal" href="../archived_version.html">Archived versions</a></li> +</ul> + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../../index.html">OhmPi</a> + </nav> + + <div class="wy-nav-content"> + <div class="rst-content"> + <div role="navigation" aria-label="Page navigation"> + <ul class="wy-breadcrumbs"> + <li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li> + <li class="breadcrumb-item"><a href="../software.html">Software and operation</a></li> + <li class="breadcrumb-item active">Software architecture</li> + <li class="wy-breadcrumbs-aside"> + <a href="../../_sources/source_rst/software/architecture.rst.txt" rel="nofollow"> View page source</a> + </li> + </ul> + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <section id="software-architecture"> +<h1>Software architecture<a class="headerlink" href="#software-architecture" title="Permalink to this heading">ïƒ</a></h1> +<p>The OhmPi V2024 software has been completely re-structured to enable increased flexibility for both users and developers. The software is based on an object-oriented module with a class exposing the OhmPi +functionalities used to interact with the OhmPi instrument via a web interface, IoT +communication protocols (e.g. MQTT) and/or directly through the Python API.</p> +<figure class="align-default" id="id1"> +<img alt="../../_images/architecture.png" src="../../_images/architecture.png" /> +<figcaption> +<p><span class="caption-text">Software architecture of OhmPi V2024.</span><a class="headerlink" href="#id1" title="Permalink to this image">ïƒ</a></p> +</figcaption> +</figure> +<p>The software is organised in several modules describing the system in a hierarchy including three levels of description and +operation of the OhmPi.</p> +<section id="hardware-components"> +<h2>Hardware components<a class="headerlink" href="#hardware-components" title="Permalink to this heading">ïƒ</a></h2> +<p>On the base level, the five main hardware components are represented by distinct classes exposing the +components atomic functionalities. Theses classes are abstract classes in order to provide a common +interface for different implementations of a component. From these abstract classes concrete classes +are implemented representing the default properties, actual capabilities and ways to interact with the +physical modules or boards. +Improving an existing hardware component or introducing a new design may be desirable in order to, +e.g. reduce costs, improve performance, adapt measurement range to specific applications, or +incorporate easily available electronic components. It is at this level that software developments are +mainly expected to occur following updates on the hardware. The component class should expose the +minimal functionalities required by the hardware system (see below) for this type of component.</p> +</section> +<section id="hardware-system"> +<h2>Hardware system<a class="headerlink" href="#hardware-system" title="Permalink to this heading">ïƒ</a></h2> +<p>On the medium level, the OhmPiHardware class provides a mean to assemble and operate the +acquisition system. The methods of this class orchestrate atomic operations of the system components +in order to expose basic system functionalities such as cross-MUX switching, square wave voltage +injection or full waveform voltage and current reading during injection cycles. These functionalities +are implemented using synchronization mechanisms between threads in order to insure that each +component keeps in step with the others. +The whole system is described in a configuration file listing the hardware components and versions +used. Through a dynamic import mechanism the modules containing the classes corresponding with +the physical hardware modules of a particular OhmPi system are instantiated and associated with the +system object instantiated from the OhmPiHardware class. In this way, it is relatively simple to build +customised systems once the concrete classes describing the system components have been written. +This part of the software architecture should remain stable if the overall system functionalities do not +evolve. However, the introduction of new functionalities at the system level or radical changes in the +way the components work together will require adaptations at this level.</p> +</section> +<section id="acquisition"> +<h2>Acquisition<a class="headerlink" href="#acquisition" title="Permalink to this heading">ïƒ</a></h2> +<p>On the top level, the OhmPi class (in ohmpi/ohmpi.py) includes all the higher-level methods and properties allowing to +operate the system (e.g. acquire measurement sequences). The OhmPi class exposes the user-oriented +API, generates logs and handles IoT messages. Generic users are expected to interact with the system +through these higher-level functionalities, which are designed to remain as stable as possible while the +hardware evolves. Only the introduction of new end-user functionalities should imply new +developments at this level. See</p> +</section> +</section> + + + </div> + </div> + <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> + <a href="../software.html" class="btn btn-neutral float-left" title="Software and operation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> + <a href="installation.html" class="btn btn-neutral float-right" title="Installation" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> + </div> + + <hr/> + + <div role="contentinfo"> + <p>© Copyright 2022, the OhmPi Team..</p> + </div> + + Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a + <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> + provided by <a href="https://readthedocs.org">Read the Docs</a>. + + +</footer> + </div> + </div> + </section> + </div> + <script> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/doc/build/html/source_rst/software/developments.html b/doc/build/html/source_rst/software/developments.html new file mode 100644 index 0000000000000000000000000000000000000000..2e74541f9facecfc6a1a982d9c0fabf28879b7a1 --- /dev/null +++ b/doc/build/html/source_rst/software/developments.html @@ -0,0 +1,113 @@ +<!DOCTYPE html> +<html class="writer-html5" lang="en" > +<head> + <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" /> + + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title><no title> — OhmPi v2024rc documentation</title> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> + <!--[if lt IE 9]> + <script src="../../_static/js/html5shiv.min.js"></script> + <![endif]--> + + <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script> + <script src="../../_static/jquery.js"></script> + <script src="../../_static/underscore.js"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script> + <script src="../../_static/doctools.js"></script> + <script src="../../_static/js/theme.js"></script> + <link rel="index" title="Index" href="../../genindex.html" /> + <link rel="search" title="Search" href="../../search.html" /> + <link rel="next" title="API reference" href="../api.html" /> + <link rel="prev" title="Configuration file" href="operations.html" /> +</head> + +<body class="wy-body-for-nav"> + <div class="wy-grid-for-nav"> + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="../../index.html" class="icon icon-home"> + OhmPi + </a> +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> + <ul> +<li class="toctree-l1"><a class="reference internal" href="../Ohmpi.html">OhmPi project</a></li> +<li class="toctree-l1"><a class="reference internal" href="../hardware.html">Hardware</a></li> +<li class="toctree-l1"><a class="reference internal" href="../software.html">Software and operation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../troubleshooting.html">Troubleshooting</a></li> +<li class="toctree-l1"><a class="reference internal" href="../gallery.html">Examples of applications</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> +<li class="toctree-l1"><a class="reference internal" href="../archived_version.html">Archived versions</a></li> +</ul> + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../../index.html">OhmPi</a> + </nav> + + <div class="wy-nav-content"> + <div class="rst-content"> + <div role="navigation" aria-label="Page navigation"> + <ul class="wy-breadcrumbs"> + <li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li> + <li class="breadcrumb-item"><a href="../software.html">Software and operation</a></li> + <li class="breadcrumb-item active"><no title></li> + <li class="wy-breadcrumbs-aside"> + <a href="../../_sources/source_rst/software/developments.rst.txt" rel="nofollow"> View page source</a> + </li> + </ul> + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + + + </div> + </div> + <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> + <a href="operations.html" class="btn btn-neutral float-left" title="Configuration file" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> + <a href="../api.html" class="btn btn-neutral float-right" title="API reference" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> + </div> + + <hr/> + + <div role="contentinfo"> + <p>© Copyright 2022, the OhmPi Team..</p> + </div> + + Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a + <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> + provided by <a href="https://readthedocs.org">Read the Docs</a>. + + +</footer> + </div> + </div> + </section> + </div> + <script> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/doc/build/html/source_rst/software/installation.html b/doc/build/html/source_rst/software/installation.html new file mode 100644 index 0000000000000000000000000000000000000000..b98a326477a4464ef2264ccf2866ad05058364e7 --- /dev/null +++ b/doc/build/html/source_rst/software/installation.html @@ -0,0 +1,165 @@ +<!DOCTYPE html> +<html class="writer-html5" lang="en" > +<head> + <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" /> + + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Installation — OhmPi v2024rc documentation</title> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> + <!--[if lt IE 9]> + <script src="../../_static/js/html5shiv.min.js"></script> + <![endif]--> + + <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script> + <script src="../../_static/jquery.js"></script> + <script src="../../_static/underscore.js"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script> + <script src="../../_static/doctools.js"></script> + <script src="../../_static/js/theme.js"></script> + <link rel="index" title="Index" href="../../genindex.html" /> + <link rel="search" title="Search" href="../../search.html" /> + <link rel="next" title="Configuration file" href="operations.html" /> + <link rel="prev" title="Software architecture" href="architecture.html" /> +</head> + +<body class="wy-body-for-nav"> + <div class="wy-grid-for-nav"> + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="../../index.html" class="icon icon-home"> + OhmPi + </a> +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> + <ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../Ohmpi.html">OhmPi project</a></li> +<li class="toctree-l1"><a class="reference internal" href="../hardware.html">Hardware</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../software.html">Software and operation</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="architecture.html">Software architecture</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Installation</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#step-1-connect-to-the-raspberry-pi">Step 1: Connect to the Raspberry Pi</a></li> +<li class="toctree-l3"><a class="reference internal" href="#step-2-clone-the-ohmpi-project">Step 2: Clone the OhmPi project</a></li> +<li class="toctree-l3"><a class="reference internal" href="#step-3-run-the-installation-script">Step 3: Run the installation script</a></li> +<li class="toctree-l3"><a class="reference internal" href="#step-4-activate-the-ohmpy-virtual-environment">Step 4: Activate the ohmpy virtual environment</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="operations.html">Configuration file</a></li> +<li class="toctree-l2"><a class="reference internal" href="operations.html#interfaces-and-applications">Interfaces and applications</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../troubleshooting.html">Troubleshooting</a></li> +<li class="toctree-l1"><a class="reference internal" href="../gallery.html">Examples of applications</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> +<li class="toctree-l1"><a class="reference internal" href="../archived_version.html">Archived versions</a></li> +</ul> + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../../index.html">OhmPi</a> + </nav> + + <div class="wy-nav-content"> + <div class="rst-content"> + <div role="navigation" aria-label="Page navigation"> + <ul class="wy-breadcrumbs"> + <li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li> + <li class="breadcrumb-item"><a href="../software.html">Software and operation</a></li> + <li class="breadcrumb-item active">Installation</li> + <li class="wy-breadcrumbs-aside"> + <a href="../../_sources/source_rst/software/installation.rst.txt" rel="nofollow"> View page source</a> + </li> + </ul> + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <section id="installation"> +<h1>Installation<a class="headerlink" href="#installation" title="Permalink to this heading">ïƒ</a></h1> +<section id="step-1-connect-to-the-raspberry-pi"> +<h2>Step 1: Connect to the Raspberry Pi<a class="headerlink" href="#step-1-connect-to-the-raspberry-pi" title="Permalink to this heading">ïƒ</a></h2> +</section> +<section id="step-2-clone-the-ohmpi-project"> +<h2>Step 2: Clone the OhmPi project<a class="headerlink" href="#step-2-clone-the-ohmpi-project" title="Permalink to this heading">ïƒ</a></h2> +</section> +<section id="step-3-run-the-installation-script"> +<h2>Step 3: Run the installation script<a class="headerlink" href="#step-3-run-the-installation-script" title="Permalink to this heading">ïƒ</a></h2> +<p>Simply navigate to the OhmPi folder and run the following command on the terminal:</p> +<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>.install.sh +</pre></div> +</div> +<p>The install script first creates an python virtual environment called “ohmpy†in which all dependencies will be installed. Dependecies are specified in requirements.txt +When the installation is completed check that requirements are met using pip list. +It then installs a local MQTT broker which will be used to centralise all the communication between the hardware, software and interfaces. +It also properly configures the I2C buses on the raspberry Pi.</p> +<p>When the installation is performed, we need to add the OhmPi module to the environment by editing the PYTHONPATH or editing the .bashrc file as follows:</p> +<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>nano<span class="w"> </span>~/.bashrc +</pre></div> +</div> +<p>And add the following line:</p> +<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nv">$export</span><span class="w"> </span><span class="nv">PYTHONPATH</span><span class="o">=</span><span class="nv">$PYTHONPATH</span>:/home/<username>/OhmPi +</pre></div> +</div> +</section> +<section id="step-4-activate-the-ohmpy-virtual-environment"> +<h2>Step 4: Activate the ohmpy virtual environment<a class="headerlink" href="#step-4-activate-the-ohmpy-virtual-environment" title="Permalink to this heading">ïƒ</a></h2> +<p>Before operating the instrument, we need to activate the ohmpy virtual environment with the following command:</p> +<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>~/OhmPi +$<span class="w"> </span><span class="nb">source</span><span class="w"> </span>ohmpy/bin/activate +</pre></div> +</div> +<p>If you need to leave the virtual environment, simply type:</p> +<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>deactivate +</pre></div> +</div> +</section> +</section> + + + </div> + </div> + <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> + <a href="architecture.html" class="btn btn-neutral float-left" title="Software architecture" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> + <a href="operations.html" class="btn btn-neutral float-right" title="Configuration file" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> + </div> + + <hr/> + + <div role="contentinfo"> + <p>© Copyright 2022, the OhmPi Team..</p> + </div> + + Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a + <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> + provided by <a href="https://readthedocs.org">Read the Docs</a>. + + +</footer> + </div> + </div> + </section> + </div> + <script> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/doc/build/html/source_rst/software/operations.html b/doc/build/html/source_rst/software/operations.html new file mode 100644 index 0000000000000000000000000000000000000000..c4ad40cacf46f93c5e78b41cd177ec8cccd31dc1 --- /dev/null +++ b/doc/build/html/source_rst/software/operations.html @@ -0,0 +1,335 @@ +<!DOCTYPE html> +<html class="writer-html5" lang="en" > +<head> + <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" /> + + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Configuration file — OhmPi v2024rc documentation</title> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> + <!--[if lt IE 9]> + <script src="../../_static/js/html5shiv.min.js"></script> + <![endif]--> + + <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script> + <script src="../../_static/jquery.js"></script> + <script src="../../_static/underscore.js"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script> + <script src="../../_static/doctools.js"></script> + <script src="../../_static/js/theme.js"></script> + <link rel="index" title="Index" href="../../genindex.html" /> + <link rel="search" title="Search" href="../../search.html" /> + <link rel="next" title="<no title>" href="developments.html" /> + <link rel="prev" title="Installation" href="installation.html" /> +</head> + +<body class="wy-body-for-nav"> + <div class="wy-grid-for-nav"> + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="../../index.html" class="icon icon-home"> + OhmPi + </a> +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> + <ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../Ohmpi.html">OhmPi project</a></li> +<li class="toctree-l1"><a class="reference internal" href="../hardware.html">Hardware</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../software.html">Software and operation</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="architecture.html">Software architecture</a></li> +<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Configuration file</a></li> +<li class="toctree-l2"><a class="reference internal" href="#interfaces-and-applications">Interfaces and applications</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#web-interface">Web interface</a></li> +<li class="toctree-l3"><a class="reference internal" href="#python-interface">Python interface</a></li> +<li class="toctree-l3"><a class="reference internal" href="#mqtt-interface">MQTT interface</a><ul> +<li class="toctree-l4"><a class="reference internal" href="#loggers">Loggers</a></li> +</ul> +</li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../troubleshooting.html">Troubleshooting</a></li> +<li class="toctree-l1"><a class="reference internal" href="../gallery.html">Examples of applications</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> +<li class="toctree-l1"><a class="reference internal" href="../archived_version.html">Archived versions</a></li> +</ul> + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../../index.html">OhmPi</a> + </nav> + + <div class="wy-nav-content"> + <div class="rst-content"> + <div role="navigation" aria-label="Page navigation"> + <ul class="wy-breadcrumbs"> + <li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li> + <li class="breadcrumb-item"><a href="../software.html">Software and operation</a></li> + <li class="breadcrumb-item active">Configuration file</li> + <li class="wy-breadcrumbs-aside"> + <a href="../../_sources/source_rst/software/operations.rst.txt" rel="nofollow"> View page source</a> + </li> + </ul> + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <section id="configuration-file"> +<h1>Configuration file<a class="headerlink" href="#configuration-file" title="Permalink to this heading">ïƒ</a></h1> +<p>The configuration of the OhmPi file <cite>config.py</cite> allows to configure the OhmPi. +A default version of <cite>config.py</cite> is provided in the repository. +This file should be edited to customize the configuration following the user’s needs and preferences.</p> +<p>The configuration includes setting the logging level desired for the different loggers and handlers, setting the mqtt broker(s) used for logging and control of the OhmPi and defining the options used for MQTT communication (i.e. username, password, security options…)</p> +<p>One should make sure to understand the parameters before altering them. It is also recommended to keep a copy of the default configuration.</p> +</section> +<section id="interfaces-and-applications"> +<h1>Interfaces and applications<a class="headerlink" href="#interfaces-and-applications" title="Permalink to this heading">ïƒ</a></h1> +<p>Different interfaces can be used to interact with the OhmPi.</p> +<p>Available interfaces are: +- <a class="reference internal" href="#web-interface">Web interface</a> (=HTTP interface): run in bash: <cite>bash run_http_interface.sh</cite> +- Python API: import the OhmPi class from Python script: <cite>from ohmpi import OhmPi</cite> (see <a class="reference internal" href="#python-interface">Python interface</a>) +- MQTT: IoT messaging through a broker (see <a class="reference internal" href="#mqtt-interface">MQTT interface</a>)</p> +<section id="web-interface"> +<h2>Web interface<a class="headerlink" href="#web-interface" title="Permalink to this heading">ïƒ</a></h2> +<p>This is a user friendly graphical interface for new users as well as running quick and easy acquisitions.</p> +<p>The Raspberry Pi of the OhmPi is used as a Wi-Fi Access Point (AP) and runs +a small webserver to serve the ‘index.html’ interface. Using a laptop or +a mobile phone connected to the Wi-Fi of the Raspberry Pi, one can see this +interface, upload sequences, change parameters, run a sequence and download data.</p> +<p>To configure the Raspberry Pi to act as an access point and run +the webserver automatically on start, see instructions on <a class="reference external" href="https://raspap.com/">raspap.com</a> and in ‘runOnStart.sh’.</p> +<p>Once configured, the webserver should start by itself on start and once +connected to the Pi, the user can go to <a class="reference external" href="http://10.3.141.1:8080">10.3.141.1:8080</a> +to access the interface.</p> +<figure class="align-default" id="id2"> +<img alt="../../_images/http-interface-pseudo-section.png" src="../../_images/http-interface-pseudo-section.png" /> +<figcaption> +<p><span class="caption-text">Web interface with its interactive pseudo-section.</span><a class="headerlink" href="#id2" title="Permalink to this image">ïƒ</a></p> +</figcaption> +</figure> +<figure class="align-default" id="id3"> +<img alt="../../_images/http-interface-evolution.png" src="../../_images/http-interface-evolution.png" /> +<figcaption> +<p><span class="caption-text">Evolution of quadrupole apparent resistivity with time.</span><a class="headerlink" href="#id3" title="Permalink to this image">ïƒ</a></p> +</figcaption> +</figure> +<figure class="align-default" id="id4"> +<img alt="../../_images/http-interface-rs.png" src="../../_images/http-interface-rs.png" /> +<figcaption> +<p><span class="caption-text">Contact resistance check.</span><a class="headerlink" href="#id4" title="Permalink to this image">ïƒ</a></p> +</figcaption> +</figure> +</section> +<section id="python-interface"> +<h2>Python interface<a class="headerlink" href="#python-interface" title="Permalink to this heading">ïƒ</a></h2> +<p>This interface offers a more direct access to the software components especially well suited for testing or automation on the Raspberry Pi.</p> +<p>By importing the <cite>OhmPi</cite> class from the ohmpi.py, one can control the OhmPi using interactive IPython. +Typically, it involves using the terminal or an Python IDE such as Thonny on the Raspberry Pi. One can also connect using +ssh and run the Python interface (see PuTTY on Windows or ssh command on macOS/Linux).</p> +<p>To access the Python API, make sure the file ohmpi.py is in the same +directory as where you run the commands/script. The file ohmpi.py can +be found on the OhmPi gitlab repository. We recommend downloading the +entire repository as ohmpi.py import other .py files and default configuration +files (.json and .py).</p> +<div class="literal-block-wrapper docutils container" id="id5"> +<div class="code-block-caption"><span class="caption-text">Example of using the Python API to control OhmPi</span><a class="headerlink" href="#id5" title="Permalink to this code">ïƒ</a></div> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">time</span> +<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="s2">"/home/pi/OhmPi"</span><span class="p">)</span> +<span class="kn">from</span> <span class="nn">ohmpi</span> <span class="kn">import</span> <span class="n">OhmPi</span> + +<span class="c1">### Define object from class OhmPi</span> +<span class="n">k</span> <span class="o">=</span> <span class="n">OhmPi</span><span class="p">()</span> <span class="c1"># this loads default parameters from the disk</span> + +<span class="c1">### Default parameters can also be edited manually</span> +<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'injection_duration'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># injection time in seconds</span> +<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'nb_stack'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># one stack is two half-cycles</span> +<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'nbr_meas'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># number of time the sequence is repeated</span> + +<span class="c1">### Update settings if needed</span> +<span class="n">k</span><span class="o">.</span><span class="n">update_settings</span><span class="p">({</span><span class="s2">"injection_duration"</span><span class="p">:</span><span class="mf">0.2</span><span class="p">})</span> + +<span class="c1">### Set or load sequence</span> +<span class="n">k</span><span class="o">.</span><span class="n">sequence</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]])</span> <span class="c1"># set numpy array of shape (n,4)</span> +<span class="c1"># k.set_sequence('1 2 3 4\n2 3 4 5') # call function set_sequence and pass a string</span> +<span class="c1"># k.load_sequence('ABMN.txt') # load sequence from a local file</span> + +<span class="c1">### Run contact resistance check</span> +<span class="n">k</span><span class="o">.</span><span class="n">rs_check</span><span class="p">()</span> + +<span class="c1">### Run sequence (synchronously - it will wait that all</span> +<span class="c1"># sequence is measured before returning the prompt</span> +<span class="n">k</span><span class="o">.</span><span class="n">run_sequence</span><span class="p">()</span> +<span class="c1"># k.run_sequence_async() # sequence is run in a separate thread and the prompt returns immediately</span> +<span class="c1"># time.sleep(2)</span> +<span class="c1"># k.interrupt() # kill the asynchron sequence</span> + +<span class="c1">### Run multiple sequences at given time interval</span> +<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'nb_meas'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span> <span class="c1"># run sequence three times</span> +<span class="n">k</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'sequence_delay'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">100</span> <span class="c1"># every 100 s</span> +<span class="n">k</span><span class="o">.</span><span class="n">run_multiple_sequences</span><span class="p">()</span> <span class="c1"># asynchron</span> +<span class="c1"># k.interrupt() # kill the asynchron sequence</span> + +<span class="c1">### Single measurement can also be taken with</span> +<span class="n">k</span><span class="o">.</span><span class="n">switch_mux_on</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span> +<span class="n">k</span><span class="o">.</span><span class="n">run_measurement</span><span class="p">()</span> <span class="c1"># use default acquisition parameters</span> +<span class="n">k</span><span class="o">.</span><span class="n">switch_mux_off</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span> <span class="c1"># don't forget this! risk of short-circuit</span> + +<span class="c1">### Custom or adaptative argument, see help(k.run_measurement)</span> +<span class="n">k</span><span class="o">.</span><span class="n">run_measurement</span><span class="p">(</span><span class="n">nb_stack</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="c1"># do 4 stacks (8 half-cycles)</span> + <span class="n">injection_duration</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="c1"># inject for 2 seconds</span> + <span class="n">autogain</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># adapt gain of ADS to get good resolution</span> +</pre></div> +</div> +</div> +</section> +<section id="mqtt-interface"> +<h2>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Permalink to this heading">ïƒ</a></h2> +<p>This is an interface designed for an advanced remote usage of the OhmPi such as remote automation, data consumption by multiple processes and interaction with other sensors in the scope of a monitoring. It is based on the MQTT protocol, designed for the Internet of Things (IoT), to interact with the OhmPi.</p> +<p>This option allows interacting remotely with a single OhmPi, a network of OhmPis, as well as auxiliary instruments and sensors. The communication is based on a publish/subscribe approach and involves a MQTT broker.</p> +<p>An example of MQTT broker that can be used is <a class="reference external" href="https://mosquitto.org/">Mosquitto</a>. Depending on the monitoring needs, an MQTT broker can be set up locally on the Raspberry Pi, on a local network or any remote server reachable through the net. A local Mosquitto broker can be set up and enabled to run as a service on the OhmPi using the bash script install_local_mqtt_broker.sh.</p> +<p>MQTT messages include logging messages from the OhmPi and commands sent to the OhmPi. These messages can be examined easily using a third party software such as <a class="reference external" href="http://mqtt-explorer.com/">MQTT Explorer</a>.</p> +<p>Commands sent on the broker are received by the ohmpi.py script that runs on the OhmPi (make sure ohmpi.py starts on reboot) and further processed. +MQTT commands are sent in JSON format following the Python API with kwargs as illustrated below:</p> +<div class="literal-block-wrapper docutils container" id="id6"> +<div class="code-block-caption"><span class="caption-text">Updating acquisition settings.</span><a class="headerlink" href="#id6" title="Permalink to this code">ïƒ</a></div> +<div class="highlight-json notranslate"><div class="highlight"><pre><span></span>{ + "cmd_id": "3fzxv121UITwGjWYgcz4xw", + "cmd": "update_settings", Depending on the experiment needs, MQTT brokers can be set up locally on the Raspberry Pi or on a local or remote server. + "kwargs": { + "config": { + "nb_meas": 2, + "nb_electrodes": 10, + "nb_stack": 2, + "injection_duration": 2, + "sequence_delay": 100 + } + } +} +</pre></div> +</div> +</div> +<div class="literal-block-wrapper docutils container" id="id7"> +<div class="code-block-caption"><span class="caption-text">Check contact resistances</span><a class="headerlink" href="#id7" title="Permalink to this code">ïƒ</a></div> +<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> +<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4xw"</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rs_check"</span><span class="p">,</span> +<span class="p">}</span> +</pre></div> +</div> +</div> +<div class="literal-block-wrapper docutils container" id="id8"> +<div class="code-block-caption"><span class="caption-text">Running a sequence.</span><a class="headerlink" href="#id8" title="Permalink to this code">ïƒ</a></div> +<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> +<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4Yw"</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"run_sequence"</span><span class="p">,</span> +<span class="p">}</span> +</pre></div> +</div> +</div> +<div class="literal-block-wrapper docutils container" id="id9"> +<div class="code-block-caption"><span class="caption-text">Running same sequence multiple times (nb_meas).</span><a class="headerlink" href="#id9" title="Permalink to this code">ïƒ</a></div> +<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> +<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4Yw"</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"run_multiple_sequences"</span><span class="p">,</span> +<span class="p">}</span> +</pre></div> +</div> +</div> +<div class="literal-block-wrapper docutils container" id="id10"> +<div class="code-block-caption"><span class="caption-text">Interrupt current acquisition.</span><a class="headerlink" href="#id10" title="Permalink to this code">ïƒ</a></div> +<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> +<span class="w"> </span><span class="nt">"cmd_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3fzxv121UITwGjWYgcz4xw"</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"interrupt"</span><span class="p">,</span> +<span class="p">}</span> +</pre></div> +</div> +</div> +<p>Custom processing of messages and tailor-made dashboards for monitoring experiments may be designed using a browser-based flow editor such as <a class="reference external" href="http://mqtt-explorer.com/">Node-red</a>. +This may help designing complex IoT experiments and monitoring systems in which OhmPi is a component.</p> +<p>Examples incorporating execution commands and data outputs from OhmPi can be found in the OhmPi examples. Once Node-RED is installed on the OhmPi, these examples can be accessed separately by running a command in the console such as :</p> +<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">node-red basic_ohmpi_flows_node-red.json</span> +</pre></div> +</div> +<p>These examples may require installing some additional node packages in order to work properly. This can be done in the <a class="reference external" href="https://nodered.org/docs/user-guide/editor/palette/manager">Palette Manager</a> within Node-RED.</p> +<figure class="align-default" id="id11"> +<img alt="../../_images/node-red_flow.png" src="../../_images/node-red_flow.png" /> +<figcaption> +<p><span class="caption-text">Example flow in node-red to interact with an OhmPi.</span><a class="headerlink" href="#id11" title="Permalink to this image">ïƒ</a></p> +</figcaption> +</figure> +<figure class="align-default" id="id12"> +<img alt="../../_images/node-red_interface_control.png" src="../../_images/node-red_interface_control.png" /> +<figcaption> +<p><span class="caption-text">Example of a dashboard UI created with node-red to interact with an OhmPi - control tab.</span><a class="headerlink" href="#id12" title="Permalink to this image">ïƒ</a></p> +</figcaption> +</figure> +<figure class="align-default" id="id13"> +<img alt="../../_images/node-red_interface_data.png" src="../../_images/node-red_interface_data.png" /> +<figcaption> +<p><span class="caption-text">Example of a dashboard UI created with node-red to interact with an OhmPi - data visualization tab.</span><a class="headerlink" href="#id13" title="Permalink to this image">ïƒ</a></p> +</figcaption> +</figure> +<p>For more documentation dedicated to node-red, please refer to the Node-red <a class="reference external" href="https://cookbook.nodered.org/">cookbooks</a>.</p> +<section id="loggers"> +<h3>Loggers<a class="headerlink" href="#loggers" title="Permalink to this heading">ïƒ</a></h3> +<p>Loggers have been introduced in this release. They use the excellent logging python package. +Specific handlers have been implemented for running with ohmpi.py (one for logging to an mqtt broker (see <a class="reference internal" href="#mqtt-interface">MQTT interface</a> for more details) and one for creating zipped rotated logs on disk).</p> +<p>Two loggers have been defined. The first one is dedicated to log operations execution. It is named exec_logger. The second one, named data_logger, is dedicated to log data. A third one is planned to log the state of health (SOH) of the system in a future version.</p> +<p>By default, logs are written to the console (print-like), stored locally in files (a zip is created after some time i.e. every day and/or when the size of the log exceeds a maximum size) and sent to an MQTT broker. Different logging levels may be defined for the different logs and handlers in the <a class="reference internal" href="#configuration-file">Configuration file</a>.</p> +<p>Advanced users may write new handlers and edit the <cite>setup_loggers.py</cite> file to customize the logging mechanisms to their needs.</p> +</section> +</section> +</section> + + + </div> + </div> + <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> + <a href="installation.html" class="btn btn-neutral float-left" title="Installation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> + <a href="developments.html" class="btn btn-neutral float-right" title="<no title>" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> + </div> + + <hr/> + + <div role="contentinfo"> + <p>© Copyright 2022, the OhmPi Team..</p> + </div> + + Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a + <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> + provided by <a href="https://readthedocs.org">Read the Docs</a>. + + +</footer> + </div> + </div> + </section> + </div> + <script> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/doc/source/source_rst/V2023.x.x/V2023_step_03.rst b/doc/source/source_rst/V2023.x.x/V2023_step_03.rst deleted file mode 100644 index ed1a04e1ef40f7dd7c6d4621355a3cc9d374fa69..0000000000000000000000000000000000000000 --- a/doc/source/source_rst/V2023.x.x/V2023_step_03.rst +++ /dev/null @@ -1,289 +0,0 @@ - - -.. warning:: - **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.** - - - -**STEP n°3:** MUX board -**************************************************** -The multiplexing of the channels is a mechanical multiplexing based on OMRON's manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with -a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs. -We used gpio expander I2C (MCP23017). We have associated these components with an I2C multiplexer of type type TCA9548A from adafruit. -This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each card has its own digital address between 0X70 and 0X77. -In the following presentation for an OhmPi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N. -0X73 for the N channel. 4 MUX board will be needed to multiplex an OhmPi 64 electrodes. - -**PART A** Assembly of MUX board -====================================================== - - -Required components ----------------------------------------------------- - -.. figure:: ../../img/v2023.x.x/step_n_3/a/MUX_board_components.jpg - :width: 600px - :align: center - :height: 650px - :alt: alternate text - :figclass: align-center - - -.. csv-table:: List of components - :file: ../V2023.x.x/MUX_board_list_2_xx.csv - :header-rows: 1 - - -.. table:: - :align: center - - +--------+--------------------------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_00.jpg | - | 1 +--------------------------------------------------------------------------------+ - | |Mux board pcb | - | | | - +--------+--------------------------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_01.jpg | - | 2 +------------------------------------------------------------+ - | |Installation of the 100 kOhm resistors | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_02.jpg | - | 3 +------------------------------------------------------------+ - | |Installation of the MOSFET ZVN4206A | - | | | - +--------+------------------------------------------------------------+ - - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_03.jpg | - | 4 +------------------------------------------------------------+ - | |Installation of the diode 1N4007 | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_04.jpg | - | 5 +------------------------------------------------------------+ - | |Installation of the relay | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_05.jpg | - | 6 +------------------------------------------------------------+ - | |Installation of the terminal screw | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_06.jpg | - | 7 +------------------------------------------------------------+ - | |Installation of generic male header | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_07.jpg | - | 8 +------------------------------------------------------------+ - | |Installation of Pin strip (6 pins) and pin strip (16 pins) | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_08.jpg | - | 9 +------------------------------------------------------------+ - | |Installation of DIP Dual In Line Socket 2*14 | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_09.jpg | - | 10 +------------------------------------------------------------+ - | |Installation of Adafruit TCA9548A | - | | | - +--------+------------------------------------------------------------+ - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/a/MUX_10.jpg | - | 10 +------------------------------------------------------------+ - | |Installation of MCP23017 | - | | | - +--------+------------------------------------------------------------+ - -.. note:: - This step must be duplicated 4 times for every Mux card. - - - -**PART B** MUX board address -====================================================== -To build an ohmpi it is necessary to have 4 MUX boards, with 4 different addresses. It is therefore necessary to identify each board, by assigning an address, which will be allocated in the OhmPi code. -We present here the addresses selected by default. - -For the A electrode board, we suggest addressing it with address 0x70: - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/A_0x70.jpg | - | 1 +------------------------------------------------------------+ - | |Mount the jumpers and note the value of the address and the | - | |electrode name on the mux board (A). | - | +------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/A_0x70-a.jpg | - | +------------------------------------------------------------+ - | |Zoom on the jumper | - | | | - +--------+------------------------------------------------------------+ - - - - -For the B electrode board, we suggest addressing it with address 0x71: - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/B_0x71.jpg | - | 2 +------------------------------------------------------------+ - | |Mount the jumpers and note the value of the address and the | - | |electrode name on the mux board (B). | - | +------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/B_0x71-a.jpg | - | +------------------------------------------------------------+ - | |Zoom on the jumper | - | | | - +--------+------------------------------------------------------------+ - -For the N electrode board, we suggest addressing it with address 0x72: - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/M_0x72.jpg | - | 3 +------------------------------------------------------------+ - | |Mount the jumpers and note the value of the address and the | - | |electrode name on the mux board (B). | - | +------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/M_0x72-a.jpg | - | +------------------------------------------------------------+ - | |Zoom on the jumper | - | | | - +--------+------------------------------------------------------------+ - -For the M electrode board, we suggest addressing it with address 0x73: - -.. table:: - :align: center - - +--------+------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/N_0x73.jpg | - | 4 +------------------------------------------------------------+ - | |Mount the jumpers and note the value of the address and the | - | |electrode name on the mux board (B). | - | +------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/b/N_0x73-a.jpg | - | +------------------------------------------------------------+ - | |Zoom on the jumper | - | | | - +--------+------------------------------------------------------------+ - -**PART C** Validation of MUX board -====================================================== -The first step is to test the Mux boards before assembling them definitively. -To test the Mux boards, it will be necessary first to make a simplified assembly of the Mux board and the measurement board. - -The first thing to do is to prepare a 50 cm long flat wire with two 6-poles connectors. - - - +--------+-----------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/c/20211207_115706.jpg | - | 1 +-----------------------------------------------------------------+ - | |Build a cable with 6 contacts with 6 pins connector. | - | | | - +--------+-----------------------------------------------------------------+ - - +--------+-----------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_142929.jpg | - | 2 +-----------------------------------------------------------------+ - | |Prepare the measurement board and the first mux board by | - | |example the card with address 0x71. | - +--------+-----------------------------------------------------------------+ - - +--------+-----------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_143105.jpg | - | 3 +-----------------------------------------------------------------+ - | |Connect the 12V power supply cables to the MUX board | - | |without powering the board. | - +--------+-----------------------------------------------------------------+ - - +--------+------------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/c/20220207_154111.jpg | - | 4 +------------------------------------------------------------------+ - | |Connect the 12V power supply screw terminal of the mux | - | |board to the 12V screw terminal power supply of the | - | |measurement board. | - +--------+------------------------------------------------------------------+ - - +--------+------------------------------------------------------------------+ - | | .. image:: ../../img/v2023.x.x/step_n_3/c/20220124_143823.jpg | - | 5 +------------------------------------------------------------------+ - | |Connect the 6-contact cable | - | | | - +--------+------------------------------------------------------------------+ - - -Start your 12V power supply, the raspberry must start. - -Run the terminal and write: - - .. code-block:: python - - i2cdetect -y 1 - -Three addresses should appear, including the address of the MUX board you have selected. This implies that your board has been detected. - -Open the script called "test_mux_board.py". - -Run the script - - - \ No newline at end of file diff --git a/doc/source/source_rst/developing_hardware_components.rst b/doc/source/source_rst/developing_hardware_components.rst index fa97c06af7b7d85f415e829f9b9acc560960621f..55736fb5df94700adcdb4e813a95e7332a75c9f6 100644 --- a/doc/source/source_rst/developing_hardware_components.rst +++ b/doc/source/source_rst/developing_hardware_components.rst @@ -1,7 +1,8 @@ Software interface to new hardware components ============================================= -*** DRAFT VERSION - TO BE REVIEWED * +*** DRAFT VERSION - TO BE REVIEWED *** + This section is intended for developers of a new hardware component as part of an OhmPi system. It presents some advices and best practices that should help developing new hardware components to work diff --git a/doc/source/source_rst/software.rst b/doc/source/source_rst/software.rst index 27f7db96cbc2ab8c71909548a76eebaa4bf0dfaf..013271742074468a32c7a80153f195195d483d7f 100644 --- a/doc/source/source_rst/software.rst +++ b/doc/source/source_rst/software.rst @@ -1,5 +1,5 @@ Software and operation -##################### +###################### .. warning:: **OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OhmPi. The OhmPi team cannot be held responsible if the equipment does not work after assembly.** diff --git a/doc/source/source_rst/software/architecture.rst b/doc/source/source_rst/software/architecture.rst index be42b03fc887bfc85d9e2e666e5f112b740ce02f..ca25b7f618c4f2f65159f5e27ae842e6f7710e60 100644 --- a/doc/source/source_rst/software/architecture.rst +++ b/doc/source/source_rst/software/architecture.rst @@ -1,11 +1,11 @@ Software architecture -******************* +********************* The OhmPi V2024 software has been completely re-structured to enable increased flexibility for both users and developers. The software is based on an object-oriented module with a class exposing the OhmPi functionalities used to interact with the OhmPi instrument via a web interface, IoT communication protocols (e.g. MQTT) and/or directly through the Python API. -.. figure:: ../img/architecture.png +.. figure:: ../../img/architecture.png Software architecture of OhmPi V2024. diff --git a/doc/source/source_rst/software/installation.rst b/doc/source/source_rst/software/installation.rst index 4180a58a3432a8e7dca0cc3875e14c1adaa8b6f1..0052606f9cf10fe97dd35241e9d660bb45bbf434 100644 --- a/doc/source/source_rst/software/installation.rst +++ b/doc/source/source_rst/software/installation.rst @@ -11,7 +11,9 @@ Step 3: Run the installation script =================================== Simply navigate to the OhmPi folder and run the following command on the terminal: + .. code-block:: bash + $ .install.sh The install script first creates an python virtual environment called "ohmpy" in which all dependencies will be installed. Dependecies are specified in requirements.txt @@ -20,20 +22,28 @@ It then installs a local MQTT broker which will be used to centralise all the co It also properly configures the I2C buses on the raspberry Pi. When the installation is performed, we need to add the OhmPi module to the environment by editing the PYTHONPATH or editing the .bashrc file as follows: + .. code-block:: bash + $ nano ~/.bashrc And add the following line: + .. code-block:: bash + $export PYTHONPATH=$PYTHONPATH:/home/<username>/OhmPi Step 4: Activate the ohmpy virtual environment ============================================== Before operating the instrument, we need to activate the ohmpy virtual environment with the following command: + .. code-block:: bash + $ cd ~/OhmPi $ source ohmpy/bin/activate If you need to leave the virtual environment, simply type: + .. code-block:: bash + $ deactivate \ No newline at end of file diff --git a/doc/source/source_rst/software/operations.rst b/doc/source/source_rst/software/operations.rst index cbe5b0a6abc9f9a5cc6a22c2ac0c8f3430db7fa4..c19b404c04821a4de4db466e1dd9736c19369950 100644 --- a/doc/source/source_rst/software/operations.rst +++ b/doc/source/source_rst/software/operations.rst @@ -40,17 +40,17 @@ Once configured, the webserver should start by itself on start and once connected to the Pi, the user can go to `10.3.141.1:8080 <http://10.3.141.1:8080>`_ to access the interface. -.. figure:: ../img/http-interface-pseudo-section.png +.. figure:: ../../img/http-interface-pseudo-section.png Web interface with its interactive pseudo-section. -.. figure:: ../img/http-interface-evolution.png +.. figure:: ../../img/http-interface-evolution.png Evolution of quadrupole apparent resistivity with time. -.. figure:: ../img/http-interface-rs.png +.. figure:: ../../img/http-interface-rs.png Contact resistance check. @@ -195,20 +195,21 @@ This may help designing complex IoT experiments and monitoring systems in which Examples incorporating execution commands and data outputs from OhmPi can be found in the OhmPi examples. Once Node-RED is installed on the OhmPi, these examples can be accessed separately by running a command in the console such as : .. code-block:: console - node-red basic_ohmpi_flows_node-red.json -These examples may require installing some additional node packages in order to work properly. This can be done in the `Palette Manager <https://nodered.org/docs/user-guide/editor/palette/manager> within Node-RED. + node-red basic_ohmpi_flows_node-red.json -.. figure:: ../img/node-red_flow.png +These examples may require installing some additional node packages in order to work properly. This can be done in the `Palette Manager <https://nodered.org/docs/user-guide/editor/palette/manager>`_ within Node-RED. + +.. figure:: ../../img/node-red_flow.png Example flow in node-red to interact with an OhmPi. -.. figure:: ../img/node-red_interface_control.png +.. figure:: ../../img/node-red_interface_control.png Example of a dashboard UI created with node-red to interact with an OhmPi - control tab. -.. figure:: ../img/node-red_interface_data.png +.. figure:: ../../img/node-red_interface_data.png Example of a dashboard UI created with node-red to interact with an OhmPi - data visualization tab.