diff --git a/doc/build/doctrees/Ohmpi.doctree b/doc/build/doctrees/Ohmpi.doctree index adbd423a02dab53489ce6768874d4f031d0d6925..c90107a2fb525e59f45fa066994077d4106d22ef 100644 Binary files a/doc/build/doctrees/Ohmpi.doctree and b/doc/build/doctrees/Ohmpi.doctree differ diff --git a/doc/build/doctrees/Ohmpi_V2023/V2023_step_02.doctree b/doc/build/doctrees/Ohmpi_V2023/V2023_step_02.doctree index d519b2c924e8f79433ae45979f40a477bd6c35c3..9a8b44516b7ec3071c857eb10f0c226fb38c2bb2 100644 Binary files a/doc/build/doctrees/Ohmpi_V2023/V2023_step_02.doctree and b/doc/build/doctrees/Ohmpi_V2023/V2023_step_02.doctree differ diff --git a/doc/build/doctrees/V2024.doctree b/doc/build/doctrees/V2024.doctree new file mode 100644 index 0000000000000000000000000000000000000000..208aaee64b53af3d862a2d6059f86b4db7429869 Binary files /dev/null and b/doc/build/doctrees/V2024.doctree differ diff --git a/doc/build/doctrees/V2024_rc.doctree b/doc/build/doctrees/V2024_rc.doctree new file mode 100644 index 0000000000000000000000000000000000000000..88695e9e0e7b190d7c10f270e96255e362588fef Binary files /dev/null and b/doc/build/doctrees/V2024_rc.doctree differ diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle index 203b5199e2aab6179ae45faf7ad06af52432f59d..6df0b8558f695fe1d3075f73e667c5e43b74856b 100644 Binary files a/doc/build/doctrees/environment.pickle and b/doc/build/doctrees/environment.pickle differ diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree index 7847f3938cfca2c1dcbdea0a6675e8098413f914..1ef17375380ee9d6e2dd7eb0b43b4fe0194ae304 100644 Binary files a/doc/build/doctrees/index.doctree and b/doc/build/doctrees/index.doctree differ diff --git a/doc/build/html/Ohmpi.html b/doc/build/html/Ohmpi.html index 9f7f9bf14fab95a111fcbb04d691c9abd9f009d1..30ec4b15e69fca57756882a9902006e65864e31a 100644 --- a/doc/build/html/Ohmpi.html +++ b/doc/build/html/Ohmpi.html @@ -92,10 +92,10 @@ <h2><strong>Authors:</strong><a class="headerlink" href="#authors" title="Permalink to this heading">ïƒ</a></h2> <div class="line-block"> <div class="line">Rémi CLEMENT, Vivien DUBOIS, Nicolas Forquet, INRAE, REVERSAAL, Villeurbanne, France</div> +<div class="line">Olivier KAUFMANN, Arnaud WATLET, Université de Mons, Mons, Belgium</div> <div class="line">Yannick FARGIER, GERS-RRO, Univ Gustave Eiffel, IFSTTAR, Lyon, France</div> <div class="line">Hélène GUYARD, IGE Grenoble, Université Grenoble Alpes, Grenoble, France</div> -<div class="line">Olivier KAUFMANN, Arnaud WATLET, Université de Mons, Mons, Belgium</div> -<div class="line">Guillaume BLANCHY, ILVO, Merelbeke, Belgium|</div> +<div class="line">Guillaume BLANCHY, ILVO, Merelbeke, Belgium</div> </div> </section> <section id="partners"> diff --git a/doc/build/html/Ohmpi_V2023/V2023_step_02.html b/doc/build/html/Ohmpi_V2023/V2023_step_02.html index e71862278391e0f5622e7ce80850f8cebf263f35..753ae39d66a4cf723dd1cd599c2014123621367f 100644 --- a/doc/build/html/Ohmpi_V2023/V2023_step_02.html +++ b/doc/build/html/Ohmpi_V2023/V2023_step_02.html @@ -46,11 +46,12 @@ <li class="toctree-l1"><a class="reference internal" href="../Ohmpi.html">OhmPi project</a></li> <li class="toctree-l1"><a class="reference internal" href="../V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="../V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li> -<li class="toctree-l1 current"><a class="reference internal" href="../V2023.html">OhmPi V2023 (64 electrodes and 12V)</a><ul class="current"> -<li class="toctree-l2"><a class="reference internal" href="../V2023.html#the-philosophy-of-ohmpi">The philosophy of OhmPi</a></li> -<li class="toctree-l2 current"><a class="reference internal" href="../V2023.html#hardware">Hardware</a><ul class="current"> -<li class="toctree-l3"><a class="reference internal" href="../V2023.html#specifications">Specifications</a></li> -<li class="toctree-l3 current"><a class="reference internal" href="../V2023.html#building-an-ohmpi-v2023-step-by-step">Building an OhmPi V2023 step by step</a><ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../V2024_rc.html">OhmPi V2023 (64 electrodes and 12V)</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="../V2024_rc.html#the-philosophy-of-ohmpi">The philosophy of OhmPi</a></li> +<li class="toctree-l2 current"><a class="reference internal" href="../V2024_rc.html#hardware">Hardware</a><ul class="current"> +<li class="toctree-l3"><a class="reference internal" href="../V2024_rc.html#specifications">Specifications</a></li> +<li class="toctree-l3 current"><a class="reference internal" href="../V2024_rc.html#building-an-ohmpi-v2023-step-by-step">Building an OhmPi V2023 step by step</a><ul class="current"> <li class="toctree-l4"><a class="reference internal" href="V2023_step_01.html"><strong>STEP n°1</strong> : Raspberry Pi configuration</a></li> <li class="toctree-l4 current"><a class="current reference internal" href="#"><strong>STEP n°2</strong>: Measurement board</a></li> <li class="toctree-l4"><a class="reference internal" href="V2023_step_03.html"><strong>STEP n°3:</strong> MUX board</a></li> @@ -59,7 +60,7 @@ </li> </ul> </li> -<li class="toctree-l2"><a class="reference internal" href="../V2023.html#software-and-operation">Software and operation</a></li> +<li class="toctree-l2"><a class="reference internal" href="../V2024_rc.html#software-and-operation">Software and operation</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> @@ -476,6 +477,26 @@ electrodes A and B</p></td> </table> <table class="docutils align-center"> <tbody> +<tr class="row-odd"><td rowspan="2"><p>14</p></td> +<td><img alt="../_images/14_mes_board.jpg" src="../_images/14_mes_board.jpg" /> +</td> +</tr> +<tr class="row-even"><td><p>1 MOhm resistors</p></td> +</tr> +</tbody> +</table> +<table class="docutils align-center"> +<tbody> +<tr class="row-odd"><td rowspan="2"><p>15</p></td> +<td><img alt="../_images/15_mes_board.jpg" src="../_images/15_mes_board.jpg" /> +</td> +</tr> +<tr class="row-even"><td><p>Soldering tow 1 kOhm resistors</p></td> +</tr> +</tbody> +</table> +<table class="docutils align-center"> +<tbody> <tr class="row-odd"><td rowspan="2"><p>16</p></td> <td><img alt="../_images/16_mes_board.jpg" src="../_images/16_mes_board.jpg" /> </td> diff --git a/doc/build/html/V2023.html b/doc/build/html/V2023.html index b7957f1d3491e1ab5642a64d9a0cad5e818003b4..b7c3279291dada565991f83c416d6befcfc5a6ca 100644 --- a/doc/build/html/V2023.html +++ b/doc/build/html/V2023.html @@ -73,6 +73,7 @@ </li> </ul> </li> +<li class="toctree-l1"><a class="reference internal" href="V2024_rc.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a></li> </ul> diff --git a/doc/build/html/V2024.html b/doc/build/html/V2024.html new file mode 100644 index 0000000000000000000000000000000000000000..d5e610eed0851c4997d0fed71687a6e5efe19131 --- /dev/null +++ b/doc/build/html/V2024.html @@ -0,0 +1,462 @@ +<!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>OhmPi V2023 (64 electrodes and 12V) — OhmPi open hardware resistivity-meter 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" /> +</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="V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> +<li class="toctree-l1"><a class="reference internal" href="api.html">API reference</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 active">OhmPi V2023 (64 electrodes and 12V)</li> + <li class="wy-breadcrumbs-aside"> + <a href="_sources/V2024.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="ohmpi-v2023-64-electrodes-and-12v"> +<h1>OhmPi V2023 (64 electrodes and 12V)<a class="headerlink" href="#ohmpi-v2023-64-electrodes-and-12v" title="Permalink to this heading">ïƒ</a></h1> +<div class="admonition warning"> +<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> +<figure class="align-center"> +<a class="reference internal image-reference" href="_images/image_ohmpi_2.jpg"><img alt="OhmPi V: 2023.0.0-rc1" src="_images/image_ohmpi_2.jpg" style="width: 400px; height: 350px;" /></a> +</figure> +<div class="admonition note"> +<p class="admonition-title">Note</p> +<blockquote> +<div><p>In this version, we have developed two new board types that allow the assembly of OhmPi v2023, a measurement board and a multiplexer board. +This new version is made up of:</p> +<ol class="arabic simple"> +<li><p>A measurement board for four-point measurement</p></li> +<li><p>4 multiplexer cards</p></li> +<li><p>A box</p></li> +</ol> +</div></blockquote> +<p>The OhmPi V2023 software has been adapted to handle this new boards and also includes many new functionalities.</p> +</div> +<section id="the-philosophy-of-ohmpi"> +<h2>The philosophy of OhmPi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Permalink to this heading">ïƒ</a></h2> +<p>The philosophy of OhmPi V2023 is to offer a new DIY multi-electrode resistivity meter. It is a resistivity meter with 64 electrodes, which can be upgraded to 128 electrodes. +It is limited to low-current injection, but suitable for small laboratory experiments and small field time-lapse monitoring. +OhmPi is developed by a team that seeks to share its experience and wishes to improve and offer a more and more robust tool to the community. OhmPi 2023 is completely different version from the previous one. +We will stop the development on the version V1.0x, to dedicate our efforts on this new version.</p> +</section> +<hr class="docutils" /> +<section id="hardware"> +<h2>Hardware<a class="headerlink" href="#hardware" title="Permalink to this heading">ïƒ</a></h2> +<section id="specifications"> +<h3>Specifications<a class="headerlink" href="#specifications" title="Permalink to this heading">ïƒ</a></h3> +<table class="docutils align-default"> +<thead> +<tr class="row-odd"><th class="head"><p><strong>Parameter</strong></p></th> +<th class="head"><p><strong>V1.0x</strong></p></th> +<th class="head"><p>Units</p></th> +<th class="head"><p><strong>v2023</strong></p></th> +<th class="head"><p>Units</p></th> +</tr> +</thead> +<tbody> +<tr class="row-even"><td><p>Electrodes</p></td> +<td><p>32</p></td> +<td></td> +<td><p>64 to 128</p></td> +<td></td> +</tr> +<tr class="row-odd"><td><p>Operating temperature</p></td> +<td><p>-0 to 50</p></td> +<td><p>°c</p></td> +<td><p>-25 to 50</p></td> +<td><p>°C</p></td> +</tr> +<tr class="row-even"><td><p>Power consumption of CPU and +control system</p></td> +<td><p>18.5</p></td> +<td><p>W</p></td> +<td><p>18.5</p></td> +<td><p>W</p></td> +</tr> +<tr class="row-odd"><td><p>Voltage injection</p></td> +<td><p>12</p></td> +<td><p>V</p></td> +<td><p>12</p></td> +<td><p>V</p></td> +</tr> +<tr class="row-even"><td><p>Battery</p></td> +<td><p>9</p></td> +<td><p>V</p></td> +<td><p>12</p></td> +<td><p>V</p></td> +</tr> +<tr class="row-odd"><td><p>Current</p></td> +<td><p>0 to 40</p></td> +<td><p>mA</p></td> +<td><p>0 to 40</p></td> +<td><p>mA</p></td> +</tr> +<tr class="row-even"><td><p>Min pulse duration</p></td> +<td><p>150</p></td> +<td><p>ms</p></td> +<td><p>150</p></td> +<td><p>ms</p></td> +</tr> +<tr class="row-odd"><td><p>Input impedance</p></td> +<td><p>80</p></td> +<td><p>MOhm</p></td> +<td><p>80</p></td> +<td><p>MOhm</p></td> +</tr> +<tr class="row-even"><td><p>Data storage</p></td> +<td><p>micro SD card</p></td> +<td></td> +<td><p>micro SD card</p></td> +<td></td> +</tr> +<tr class="row-odd"><td><p>Resolution</p></td> +<td><p>0.01</p></td> +<td><p>Ohm</p></td> +<td><p>0.01</p></td> +<td><p>Ohm</p></td> +</tr> +</tbody> +</table> +</section> +<section id="building-an-ohmpi-v2023-step-by-step"> +<h3>Building an OhmPi V2023 step by step<a class="headerlink" href="#building-an-ohmpi-v2023-step-by-step" title="Permalink to this heading">ïƒ</a></h3> +<div class="toctree-wrapper compound"> +<ul> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html"><strong>STEP n°1</strong> : Raspberry Pi configuration</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html#part-a-os-installation"><strong>PART A:</strong> OS installation</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html#part-b-virtual-environment-and-packages"><strong>PART B:</strong> Virtual Environment and packages</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html#part-c-activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"><strong>PART C:</strong> Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html"><strong>STEP n°2</strong>: Measurement board</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html#part-a-assembly-of-the-measurement-board"><strong>PART A</strong> Assembly of the measurement board</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html#part-b-start-up-of-the-measurement-board"><strong>PART B</strong> Start-up of the measurement board</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html#part-c-check-the-measurement-board"><strong>PART C</strong> Check the measurement board</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html"><strong>STEP n°3:</strong> MUX board</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html#part-a-assembly-of-mux-board"><strong>PART A</strong> Assembly of MUX board</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html#part-b-mux-board-address"><strong>PART B</strong> MUX board address</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html#part-c-validation-of-mux-board"><strong>PART C</strong> Validation of MUX board</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_04.html"><strong>STEP n°4:</strong> assemble the OhmPi</a></li> +</ul> +</div> +</section> +</section> +<section id="software-and-operation"> +<h2>Software and operation<a class="headerlink" href="#software-and-operation" title="Permalink to this heading">ïƒ</a></h2> +<section id="system-architecture"> +<h3>System architecture<a class="headerlink" href="#system-architecture" title="Permalink to this heading">ïƒ</a></h3> +<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"> +<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 id="configuration-file"> +<h3>Configuration file<a class="headerlink" href="#configuration-file" title="Permalink to this heading">ïƒ</a></h3> +<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"> +<h3>Interfaces and applications<a class="headerlink" href="#interfaces-and-applications" title="Permalink to this heading">ïƒ</a></h3> +<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"> +<h4>Web interface<a class="headerlink" href="#web-interface" title="Permalink to this heading">ïƒ</a></h4> +<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"> +<h4>Python interface<a class="headerlink" href="#python-interface" title="Permalink to this heading">ïƒ</a></h4> +<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"> +<h4>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Permalink to this heading">ïƒ</a></h4> +<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> +</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> +</section> + + + </div> + </div> + <footer> + + <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/V2024_rc.html b/doc/build/html/V2024_rc.html new file mode 100644 index 0000000000000000000000000000000000000000..3cbefca905d368983ce8bde418e7a399427f84d9 --- /dev/null +++ b/doc/build/html/V2024_rc.html @@ -0,0 +1,494 @@ +<!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>OhmPi V2023 (64 electrodes and 12V) — OhmPi open hardware resistivity-meter 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="STEP n°4: assemble the OhmPi" href="Ohmpi_V2023/V2023_step_04.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="V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">OhmPi V2023 (64 electrodes and 12V)</a><ul> +<li class="toctree-l2"><a class="reference internal" href="#the-philosophy-of-ohmpi">The philosophy of OhmPi</a></li> +<li class="toctree-l2"><a class="reference internal" href="#hardware">Hardware</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#specifications">Specifications</a></li> +<li class="toctree-l3"><a class="reference internal" href="#building-an-ohmpi-v2023-step-by-step">Building an OhmPi V2023 step by step</a><ul> +<li class="toctree-l4"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html"><strong>STEP n°1</strong> : Raspberry Pi configuration</a></li> +<li class="toctree-l4"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html"><strong>STEP n°2</strong>: Measurement board</a></li> +<li class="toctree-l4"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html"><strong>STEP n°3:</strong> MUX board</a></li> +<li class="toctree-l4"><a class="reference internal" href="Ohmpi_V2023/V2023_step_04.html"><strong>STEP n°4:</strong> assemble the OhmPi</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="#software-and-operation">Software and operation</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#system-architecture">System architecture</a></li> +<li class="toctree-l3"><a class="reference internal" href="#loggers">Loggers</a></li> +<li class="toctree-l3"><a class="reference internal" href="#configuration-file">Configuration file</a></li> +<li class="toctree-l3"><a class="reference internal" href="#interfaces-and-applications">Interfaces and applications</a><ul> +<li class="toctree-l4"><a class="reference internal" href="#web-interface">Web interface</a></li> +<li class="toctree-l4"><a class="reference internal" href="#python-interface">Python interface</a></li> +<li class="toctree-l4"><a class="reference internal" href="#mqtt-interface">MQTT interface</a></li> +</ul> +</li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="api.html">API reference</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 active">OhmPi V2023 (64 electrodes and 12V)</li> + <li class="wy-breadcrumbs-aside"> + <a href="_sources/V2024_rc.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="ohmpi-v2023-64-electrodes-and-12v"> +<h1>OhmPi V2023 (64 electrodes and 12V)<a class="headerlink" href="#ohmpi-v2023-64-electrodes-and-12v" title="Permalink to this heading">ïƒ</a></h1> +<div class="admonition warning"> +<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> +<figure class="align-center"> +<a class="reference internal image-reference" href="_images/image_ohmpi_2.jpg"><img alt="OhmPi V: 2023.0.0-rc1" src="_images/image_ohmpi_2.jpg" style="width: 400px; height: 350px;" /></a> +</figure> +<div class="admonition note"> +<p class="admonition-title">Note</p> +<blockquote> +<div><p>In this version, we have developed two new board types that allow the assembly of OhmPi v2023, a measurement board and a multiplexer board. +This new version is made up of:</p> +<ol class="arabic simple"> +<li><p>A measurement board for four-point measurement</p></li> +<li><p>4 multiplexer cards</p></li> +<li><p>A box</p></li> +</ol> +</div></blockquote> +<p>The OhmPi V2023 software has been adapted to handle this new boards and also includes many new functionalities.</p> +</div> +<section id="the-philosophy-of-ohmpi"> +<h2>The philosophy of OhmPi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Permalink to this heading">ïƒ</a></h2> +<p>The philosophy of OhmPi V2023 is to offer a new DIY multi-electrode resistivity meter. It is a resistivity meter with 64 electrodes, which can be upgraded to 128 electrodes. +It is limited to low-current injection, but suitable for small laboratory experiments and small field time-lapse monitoring. +OhmPi is developed by a team that seeks to share its experience and wishes to improve and offer a more and more robust tool to the community. OhmPi 2023 is completely different version from the previous one. +We will stop the development on the version V1.0x, to dedicate our efforts on this new version.</p> +</section> +<hr class="docutils" /> +<section id="hardware"> +<h2>Hardware<a class="headerlink" href="#hardware" title="Permalink to this heading">ïƒ</a></h2> +<section id="specifications"> +<h3>Specifications<a class="headerlink" href="#specifications" title="Permalink to this heading">ïƒ</a></h3> +<table class="docutils align-default"> +<thead> +<tr class="row-odd"><th class="head"><p><strong>Parameter</strong></p></th> +<th class="head"><p><strong>V1.0x</strong></p></th> +<th class="head"><p>Units</p></th> +<th class="head"><p><strong>v2023</strong></p></th> +<th class="head"><p>Units</p></th> +</tr> +</thead> +<tbody> +<tr class="row-even"><td><p>Electrodes</p></td> +<td><p>32</p></td> +<td></td> +<td><p>64 to 128</p></td> +<td></td> +</tr> +<tr class="row-odd"><td><p>Operating temperature</p></td> +<td><p>-0 to 50</p></td> +<td><p>°c</p></td> +<td><p>-25 to 50</p></td> +<td><p>°C</p></td> +</tr> +<tr class="row-even"><td><p>Power consumption of CPU and +control system</p></td> +<td><p>18.5</p></td> +<td><p>W</p></td> +<td><p>18.5</p></td> +<td><p>W</p></td> +</tr> +<tr class="row-odd"><td><p>Voltage injection</p></td> +<td><p>12</p></td> +<td><p>V</p></td> +<td><p>12</p></td> +<td><p>V</p></td> +</tr> +<tr class="row-even"><td><p>Battery</p></td> +<td><p>9</p></td> +<td><p>V</p></td> +<td><p>12</p></td> +<td><p>V</p></td> +</tr> +<tr class="row-odd"><td><p>Current</p></td> +<td><p>0 to 40</p></td> +<td><p>mA</p></td> +<td><p>0 to 40</p></td> +<td><p>mA</p></td> +</tr> +<tr class="row-even"><td><p>Min pulse duration</p></td> +<td><p>150</p></td> +<td><p>ms</p></td> +<td><p>150</p></td> +<td><p>ms</p></td> +</tr> +<tr class="row-odd"><td><p>Input impedance</p></td> +<td><p>80</p></td> +<td><p>MOhm</p></td> +<td><p>80</p></td> +<td><p>MOhm</p></td> +</tr> +<tr class="row-even"><td><p>Data storage</p></td> +<td><p>micro SD card</p></td> +<td></td> +<td><p>micro SD card</p></td> +<td></td> +</tr> +<tr class="row-odd"><td><p>Resolution</p></td> +<td><p>0.01</p></td> +<td><p>Ohm</p></td> +<td><p>0.01</p></td> +<td><p>Ohm</p></td> +</tr> +</tbody> +</table> +</section> +<section id="building-an-ohmpi-v2023-step-by-step"> +<h3>Building an OhmPi V2023 step by step<a class="headerlink" href="#building-an-ohmpi-v2023-step-by-step" title="Permalink to this heading">ïƒ</a></h3> +<div class="toctree-wrapper compound"> +<ul> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html"><strong>STEP n°1</strong> : Raspberry Pi configuration</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html#part-a-os-installation"><strong>PART A:</strong> OS installation</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html#part-b-virtual-environment-and-packages"><strong>PART B:</strong> Virtual Environment and packages</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_01.html#part-c-activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"><strong>PART C:</strong> Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html"><strong>STEP n°2</strong>: Measurement board</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html#part-a-assembly-of-the-measurement-board"><strong>PART A</strong> Assembly of the measurement board</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html#part-b-start-up-of-the-measurement-board"><strong>PART B</strong> Start-up of the measurement board</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_02.html#part-c-check-the-measurement-board"><strong>PART C</strong> Check the measurement board</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html"><strong>STEP n°3:</strong> MUX board</a><ul> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html#part-a-assembly-of-mux-board"><strong>PART A</strong> Assembly of MUX board</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html#part-b-mux-board-address"><strong>PART B</strong> MUX board address</a></li> +<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2023/V2023_step_03.html#part-c-validation-of-mux-board"><strong>PART C</strong> Validation of MUX board</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="Ohmpi_V2023/V2023_step_04.html"><strong>STEP n°4:</strong> assemble the OhmPi</a></li> +</ul> +</div> +</section> +</section> +<section id="software-and-operation"> +<h2>Software and operation<a class="headerlink" href="#software-and-operation" title="Permalink to this heading">ïƒ</a></h2> +<section id="system-architecture"> +<h3>System architecture<a class="headerlink" href="#system-architecture" title="Permalink to this heading">ïƒ</a></h3> +<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"> +<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 id="configuration-file"> +<h3>Configuration file<a class="headerlink" href="#configuration-file" title="Permalink to this heading">ïƒ</a></h3> +<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"> +<h3>Interfaces and applications<a class="headerlink" href="#interfaces-and-applications" title="Permalink to this heading">ïƒ</a></h3> +<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"> +<h4>Web interface<a class="headerlink" href="#web-interface" title="Permalink to this heading">ïƒ</a></h4> +<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"> +<h4>Python interface<a class="headerlink" href="#python-interface" title="Permalink to this heading">ïƒ</a></h4> +<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"> +<h4>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Permalink to this heading">ïƒ</a></h4> +<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> +</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> +</section> + + + </div> + </div> + <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> + <a href="Ohmpi_V2023/V2023_step_04.html" class="btn btn-neutral float-left" title="STEP n°4: assemble 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> + </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/_images/14_mes_board.jpg b/doc/build/html/_images/14_mes_board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31c7f113e432921c311b3ce4967a2be82f2e3f5e Binary files /dev/null and b/doc/build/html/_images/14_mes_board.jpg differ diff --git a/doc/build/html/_images/15_mes_board.jpg b/doc/build/html/_images/15_mes_board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43a4682dead6a8ffc87d444f7bfe9daabb577938 Binary files /dev/null and b/doc/build/html/_images/15_mes_board.jpg differ diff --git a/doc/build/html/_sources/Ohmpi.rst.txt b/doc/build/html/_sources/Ohmpi.rst.txt index 0f71904ebe25fbcfa27d9894e7756b7adc524ae4..ceefe20f08203d7c5db30981ce26ea0949c6c871 100644 --- a/doc/build/html/_sources/Ohmpi.rst.txt +++ b/doc/build/html/_sources/Ohmpi.rst.txt @@ -14,10 +14,10 @@ OhmPi project **Authors:** ------------ | Rémi CLEMENT, Vivien DUBOIS, Nicolas Forquet, INRAE, REVERSAAL, Villeurbanne, France +| Olivier KAUFMANN, Arnaud WATLET, Université de Mons, Mons, Belgium | Yannick FARGIER, GERS-RRO, Univ Gustave Eiffel, IFSTTAR, Lyon, France | Hélène GUYARD, IGE Grenoble, Université Grenoble Alpes, Grenoble, France -| Olivier KAUFMANN, Arnaud WATLET, Université de Mons, Mons, Belgium -| Guillaume BLANCHY, ILVO, Merelbeke, Belgium| +| Guillaume BLANCHY, ILVO, Merelbeke, Belgium **Partners:** diff --git a/doc/build/html/_sources/Ohmpi_V2023/V2023_step_02.rst.txt b/doc/build/html/_sources/Ohmpi_V2023/V2023_step_02.rst.txt index 763078b49d46d2f6dbeb2e9175f694ff76f636cc..c7b7622c9918815e532eb455507ea085a8dbd3ec 100644 --- a/doc/build/html/_sources/Ohmpi_V2023/V2023_step_02.rst.txt +++ b/doc/build/html/_sources/Ohmpi_V2023/V2023_step_02.rst.txt @@ -188,7 +188,7 @@ which allows to realize precise current measurement around a shunt resistor. The +---------+------------------------------------------------------------+ | | .. image:: step_n_2/a/14_mes_board.jpg | |14 +------------------------------------------------------------+ - | | 1 MOhm resistors | + | | 1 MOhm resistors | | | | +---------+------------------------------------------------------------+ @@ -198,7 +198,7 @@ which allows to realize precise current measurement around a shunt resistor. The +---------+------------------------------------------------------------+ | | .. image:: step_n_2/a/15_mes_board.jpg | |15 +------------------------------------------------------------+ - | | Soldering tow 1 kOhm resistors | + | | Soldering tow 1 kOhm resistors | | | | +---------+------------------------------------------------------------+ diff --git a/doc/source/V2024.rst b/doc/build/html/_sources/V2024.rst.txt similarity index 100% rename from doc/source/V2024.rst rename to doc/build/html/_sources/V2024.rst.txt diff --git a/doc/build/html/_sources/V2024_rc.rst.txt b/doc/build/html/_sources/V2024_rc.rst.txt new file mode 100644 index 0000000000000000000000000000000000000000..3b7c7486058b2f5aa91443199dcae18cabbc1b4c --- /dev/null +++ b/doc/build/html/_sources/V2024_rc.rst.txt @@ -0,0 +1,326 @@ +******************************************** +OhmPi V2023 (64 electrodes and 12V) +******************************************** + +.. 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.** + + + +.. figure:: image_ohmpi_2.jpg + :width: 400px + :align: center + :height: 350px + :alt: OhmPi V: 2023.0.0-rc1 + :figclass: align-center + +.. note:: + In this version, we have developed two new board types that allow the assembly of OhmPi v2023, a measurement board and a multiplexer board. + This new version is made up of: + + 1. A measurement board for four-point measurement + + 2. 4 multiplexer cards + + 3. A box + + The OhmPi V2023 software has been adapted to handle this new boards and also includes many new functionalities. + +The philosophy of OhmPi +======================== + +The philosophy of OhmPi V2023 is to offer a new DIY multi-electrode resistivity meter. It is a resistivity meter with 64 electrodes, which can be upgraded to 128 electrodes. +It is limited to low-current injection, but suitable for small laboratory experiments and small field time-lapse monitoring. +OhmPi is developed by a team that seeks to share its experience and wishes to improve and offer a more and more robust tool to the community. OhmPi 2023 is completely different version from the previous one. +We will stop the development on the version V1.0x, to dedicate our efforts on this new version. + +============================================================================================================================================================= + +Hardware +======== + +Specifications +-------------- + ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +| **Parameter** | **V1.0x** | Units | **v2023** | Units | ++===============================+=======================+===========+=======================+===========+ +|Electrodes |32 | |64 to 128 | | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Operating temperature |-0 to 50 |°c |-25 to 50 |°C | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Power consumption of CPU and |18.5 |W |18.5 |W | +|control system | | | | | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Voltage injection |12 |V |12 |V | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Battery |9 |V |12 |V | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Current |0 to 40 |mA |0 to 40 |mA | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Min pulse duration |150 |ms |150 |ms | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Input impedance |80 |MOhm |80 |MOhm | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Data storage |micro SD card | |micro SD card | | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Resolution |0.01 |Ohm |0.01 |Ohm | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ + +Building an OhmPi V2023 step by step +------------------------------------ + +.. toctree:: + :maxdepth: 2 + + Ohmpi_V2023/V2023_step_01 + Ohmpi_V2023/V2023_step_02 + Ohmpi_V2023/V2023_step_03 + Ohmpi_V2023/V2023_step_04 + + +Software and operation +====================== + +System architecture +------------------- + +The OhmPi V2023 software is designed around a new architecture whose main components are summarized in the figure below. + +.. 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/index.rst.txt b/doc/build/html/_sources/index.rst.txt index b91937f7772d028de63ab92b97effd382c1c8ef3..6e1a93d55b23b80507b9b8c3882d66cc0f4caea0 100644 --- a/doc/build/html/_sources/index.rst.txt +++ b/doc/build/html/_sources/index.rst.txt @@ -37,6 +37,7 @@ Contents: V1_01 V1_02 V2023 + V2024_rc api diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html index d83deb5887104bf50a3cbf427094dc6218c5f547..7ab0775f9dfdd9116e3a9c49f3075b495e79bab7 100644 --- a/doc/build/html/genindex.html +++ b/doc/build/html/genindex.html @@ -44,6 +44,7 @@ <li class="toctree-l1"><a class="reference internal" href="V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V2024_rc.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a></li> </ul> diff --git a/doc/build/html/index.html b/doc/build/html/index.html index 23d719182fcbaf7fefb547de6ee7f917b8e2889f..22fb484474ab394c48a381dba8d59e3c5fbcaccc 100644 --- a/doc/build/html/index.html +++ b/doc/build/html/index.html @@ -46,6 +46,7 @@ <li class="toctree-l1"><a class="reference internal" href="V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V2024_rc.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a></li> </ul> @@ -145,6 +146,12 @@ <li class="toctree-l2"><a class="reference internal" href="V2023.html#software-and-operation">Software and operation</a></li> </ul> </li> +<li class="toctree-l1"><a class="reference internal" href="V2024_rc.html">OhmPi V2023 (64 electrodes and 12V)</a><ul> +<li class="toctree-l2"><a class="reference internal" href="V2024_rc.html#the-philosophy-of-ohmpi">The philosophy of OhmPi</a></li> +<li class="toctree-l2"><a class="reference internal" href="V2024_rc.html#hardware">Hardware</a></li> +<li class="toctree-l2"><a class="reference internal" href="V2024_rc.html#software-and-operation">Software and operation</a></li> +</ul> +</li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a><ul class="simple"> </ul> </li> diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv index 91e781fc05142b0ed56faa72410e04dbb8400b28..feb8623a7bbaff2d26dc22fcca8c0b2a3335b8ab 100644 Binary files a/doc/build/html/objects.inv and b/doc/build/html/objects.inv differ diff --git a/doc/build/html/py-modindex.html b/doc/build/html/py-modindex.html index 6d9ace5ae97381008ae83ef11ac9dcb9de826b0e..d5b018c131ebb9bddd6b40fbfd6b855aef1fba76 100644 --- a/doc/build/html/py-modindex.html +++ b/doc/build/html/py-modindex.html @@ -51,6 +51,7 @@ <li class="toctree-l1"><a class="reference internal" href="V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V2024_rc.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a></li> </ul> diff --git a/doc/build/html/search.html b/doc/build/html/search.html index bc922cccdd7670b1326e31335b77a57ec233c7d8..21578951705fbf2050233cdd9d76dd2535b8dc23 100644 --- a/doc/build/html/search.html +++ b/doc/build/html/search.html @@ -47,6 +47,7 @@ <li class="toctree-l1"><a class="reference internal" href="V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li> <li class="toctree-l1"><a class="reference internal" href="V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> +<li class="toctree-l1"><a class="reference internal" href="V2024_rc.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a></li> </ul> diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js index b49de70c4abcfbe34f083772bfb2d0e81902a696..0b767e7c1beb19c8db1fe2b4baa919f607b5415c 100644 --- a/doc/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["Ohmpi", "Ohmpi_V2023/V2023_step_01", "Ohmpi_V2023/V2023_step_02", "Ohmpi_V2023/V2023_step_03", "Ohmpi_V2023/V2023_step_04", "V1_01", "V1_02", "V2023", "api", "developing_hardware_components", "index"], "filenames": ["Ohmpi.rst", "Ohmpi_V2023\\V2023_step_01.rst", "Ohmpi_V2023\\V2023_step_02.rst", "Ohmpi_V2023\\V2023_step_03.rst", "Ohmpi_V2023\\V2023_step_04.rst", "V1_01.rst", "V1_02.rst", "V2023.rst", "api.rst", "developing_hardware_components.rst", "index.rst"], "titles": ["OhmPi project", "<strong>STEP n\u00b01</strong> : Raspberry Pi configuration", "<strong>STEP n\u00b02</strong>: Measurement board", "<strong>STEP n\u00b03:</strong> MUX board", "<strong>STEP n\u00b04:</strong> assemble the OhmPi", "OhmPi V 1.01 (limited to 32 electrodes)", "OhmPi V 1.02 (limited to 32 electrodes)", "OhmPi V2023 (64 electrodes and 12V)", "API reference", "Software interface to new hardware components", "OHMPI: Open source and open hardware resistivity-meter"], "terms": {"r\u00e9mi": [0, 10], "clement": [0, 10], "vivien": [0, 10], "duboi": [0, 10], "nicola": [0, 10], "forquet": [0, 10], "inra": 0, "reversa": [0, 5, 6], "villeurbann": 0, "franc": 0, "yannick": [0, 10], "fargier": [0, 10], "ger": 0, "rro": 0, "univ": 0, "gustav": 0, "eiffel": 0, "ifsttar": 0, "lyon": 0, "h\u00e9l\u00e8ne": [0, 10], "guyard": [0, 10], "ig": 0, "grenobl": 0, "universit\u00e9": 0, "alp": 0, "olivi": [0, 10], "kaufmann": [0, 10], "arnaud": [0, 10], "watlet": [0, 10], "de": 0, "mon": 0, "belgium": 0, "guillaum": [0, 10], "blanchi": [0, 10], "ilvo": 0, "merelbek": 0, "julien": 0, "ganc": 0, "emil": 0, "gro": 0, "et": [0, 2], "al": 0, "an": [0, 1, 2, 3, 4, 5, 6, 9], "open": [0, 1, 2, 3, 4, 5, 6, 7, 9], "sourc": [0, 1, 5, 6, 9], "data": [0, 7, 10], "logger": [0, 5, 6], "dedic": [0, 7], "applic": [0, 9], "electr": [0, 2], "resist": [0, 2, 7], "imag": [0, 1], "small": [0, 2, 4, 5, 6, 7], "laboratori": [0, 4, 5, 6, 7], "scale": 0, "hardwarex": 0, "elsevi": 0, "2020": 0, "8": [0, 1, 2, 3, 4, 5, 6, 7], "24": [0, 2, 3, 4, 5, 6], "p": [0, 2, 3], "ff10": 0, "1016": 0, "j": 0, "ohx": 0, "e00122ff": 0, "particip": [0, 1, 2, 3, 4, 5, 6, 7], "all": [0, 1, 2, 3, 4, 5, 6, 7, 9], "requir": [0, 1, 4, 5, 6, 7, 9], "skill": [0, 1, 2, 3, 4, 5, 6, 7], "electron": [0, 1, 2, 3, 4, 5, 6, 7], "respect": [0, 1, 2, 3, 4, 5, 6, 7], "safeti": [0, 1, 2, 3, 4, 5, 6, 7], "rule": [0, 1, 2, 3, 4, 5, 6, 7], "must": [0, 1, 2, 3, 4, 5, 6, 7], "assembl": [0, 1, 7, 10], "profession": [0, 1, 2, 3, 4, 5, 6, 7], "context": [0, 1, 2, 3, 4, 5, 6, 7], "peopl": [0, 1, 2, 3, 4, 5, 6, 7], "compet": [0, 1, 2, 3, 4, 5, 6, 7], "The": [0, 1, 2, 3, 4, 9, 10], "team": [0, 1, 2, 3, 4, 5, 6, 7, 9], "cannot": [0, 1, 2, 3, 4, 5, 6, 7], "held": [0, 1, 2, 3, 4, 5, 6, 7], "respons": [0, 1, 2, 3, 4, 5, 6, 7], "ani": [0, 1, 2, 3, 4, 5, 6, 7], "materi": [0, 1, 2, 3, 4, 5, 6, 7], "human": [0, 1, 2, 3, 4, 5, 6, 7], "damag": [0, 1, 2, 3, 4, 5, 6, 7], "which": [0, 1, 2, 3, 4, 5, 6, 7], "would": [0, 1, 2, 3, 4, 5, 6, 7], "associ": [0, 1, 2, 3, 4, 5, 6, 7], "us": [0, 1, 2, 3, 4, 5, 6, 7], "equip": [0, 1, 2, 3, 4, 5, 6, 7], "doe": [0, 1, 2, 3, 4, 5, 6, 7], "work": [0, 1, 2, 3, 4, 5, 6, 7, 9], "after": [0, 1, 2, 3, 4, 5, 6, 7], "you": [0, 1, 2, 3, 4, 5, 6, 7, 9], "mai": [0, 1, 5, 6, 7], "redistribut": 0, "modifi": [0, 5, 6, 9], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 9], "document": [0, 5, 7], "make": [0, 3, 5, 6, 7, 9], "product": [0, 2, 3], "under": [0, 4, 5, 6], "term": [0, 9], "cern": 0, "ohl": 0, "v2": 0, "http": [0, 1, 2, 3, 5, 6, 7], "ch": 0, "distribut": 0, "without": [0, 3, 5, 6], "express": [0, 9], "OR": 0, "impli": [0, 3], "warranti": 0, "includ": [0, 1, 3, 5, 6, 7, 9], "OF": 0, "merchant": 0, "satisfactori": 0, "qualiti": 0, "AND": 0, "fit": 0, "FOR": 0, "A": [0, 4, 5, 6, 7, 9], "particular": 0, "purpos": [0, 4, 5, 6], "pleas": [0, 4, 5, 6, 7], "see": [0, 5, 6, 7], "condit": 0, "present": [0, 3, 4, 5, 6, 9], "develop": [0, 1, 2, 5, 6, 7, 9, 10], "low": [0, 5, 6, 7], "cost": [0, 2, 3, 5, 6, 9], "hardwar": [0, 5, 6], "meter": [0, 4, 5, 6, 7], "provid": [0, 5, 6, 7], "scientif": 0, "commun": [0, 7], "robust": [0, 5, 6, 7], "flexibl": 0, "tool": [0, 7], "experi": [0, 5, 6, 7], "call": [0, 1, 3, 4, 7], "basic": [0, 9], "meterfeatur": 0, "current": [0, 2, 7, 10], "inject": [0, 7, 10], "measur": [0, 1, 3, 4, 7, 10], "function": [0, 5, 6, 7, 9], "multiplex": [0, 3, 4, 7, 10], "allow": [0, 2, 3, 5, 6, 7], "perform": [0, 1, 5, 6, 9], "automat": [0, 5, 6, 7], "up": [0, 1, 3, 5, 6, 7], "64": [0, 3, 5, 6, 10], "electrod": [0, 2, 3, 4, 10], "s": [0, 2, 3, 5, 6, 7], "philosophi": [0, 10], "fulli": 0, "toolto": 0, "surfac": 0, "anyon": 0, "who": 0, "want": [0, 6], "get": [0, 1, 2, 5, 6, 7], "involv": [0, 7], "welcom": [0, 9], "join": 0, "ohmpi": [1, 2, 3, 9], "project": [1, 2, 3, 4, 5, 6, 7, 9, 10], "compon": [1, 7, 10], "quantiti": [1, 5, 6], "4": [1, 2, 3, 5, 6, 7], "model": [1, 2, 5, 6], "micro": [1, 5, 6, 7], "sd": [1, 4, 5, 6, 7], "32": [1, 4, 7, 10], "go": [1, 3, 7], "hdmi": [1, 4], "cabl": [1, 2, 3, 4, 5, 6], "comput": [1, 5, 6], "mous": [1, 4, 5, 6], "keyboard": [1, 4, 5, 6], "first": [1, 3, 4, 7, 9], "start": [1, 3, 5, 6, 7, 9, 10], "board": [1, 4, 7, 9], "oper": [1, 2, 4, 9, 10], "system": [1, 5, 6, 9], "For": [1, 2, 3, 5, 6, 7], "instruct": [1, 7, 10], "ar": [1, 2, 5, 6, 7, 9], "well": [1, 5, 6, 7], "describ": [1, 2, 4, 5, 6, 9], "websit": [1, 5, 6], "watch": [1, 5, 6], "video": [1, 5, 6], "how": [1, 5, 6], "set": [1, 2, 5, 6, 7], "your": [1, 2, 3, 5, 6, 9], "author": [1, 5, 6, 10], "recommend": [1, 5, 6, 7, 9], "latest": [1, 5, 6], "stabl": [1, 5, 6], "complet": [1, 2, 7, 10], "version": [1, 2, 5, 6, 7, 9], "previous": [1, 4, 5, 6], "raspbian": [1, 5, 6], "can": [1, 4, 5, 6, 7], "visit": 1, "raspberrypi": 1, "org": [1, 7], "en": 1, "test": [1, 2, 3, 5, 6, 7, 9], "were": [1, 2, 5, 6], "3": [1, 2, 4, 5, 6, 7, 9], "we": [1, 2, 3, 5, 6, 7], "follow": [1, 2, 3, 4, 5, 6, 7, 9], "onc": [1, 5, 6, 7], "ha": [1, 3, 5, 6, 7], "been": [1, 3, 5, 6, 7], "wire": [1, 3, 4, 5, 6], "spi": [1, 5, 6], "gpio": [1, 3, 5, 6], "remot": [1, 5, 6, 7], "option": [1, 5, 6, 7], "deactiv": [1, 5, 6], "i2c": [1, 2, 3], "via": [1, 5, 6], "gui": [1, 5, 6], "menu": [1, 5, 6], "failur": [1, 5, 6], "carri": [1, 5, 6], "out": [1, 4, 5, 6], "task": [1, 5, 6], "caus": [1, 5, 6], "relai": [1, 2, 3, 5, 6], "shield": [1, 5, 6], "card": [1, 3, 4, 7, 10], "dure": [1, 5, 6], "wai": [1, 5, 6, 9], "have": [1, 2, 3, 5, 6, 7, 9], "multipl": [1, 7], "parallel": 1, "instanc": 1, "interpret": [1, 2, 5, 6], "each": [1, 3, 4, 5, 6], "differ": [1, 2, 3, 4, 5, 6, 7], "contain": [1, 4, 5, 6, 7], "discret": 1, "copi": [1, 7, 9], "its": [1, 3, 4, 5, 6, 7], "support": 1, "util": [1, 7], "It": [1, 3, 5, 6, 7, 9], "also": [1, 5, 6, 7, 9], "protect": 1, "case": [1, 5, 6, 7, 9], "problem": 1, "depend": [1, 5, 6, 7], "specifi": [1, 5, 6], "txt": [1, 5, 6, 7], "below": [1, 4, 5, 6, 7], "should": [1, 2, 3, 4, 5, 6, 7, 9], "type": [1, 3, 5, 6, 7, 9], "termin": [1, 2, 3, 4, 5, 6, 7], "necessari": [1, 3, 4, 5, 6, 9], "ensur": [1, 5, 6], "libatla": [1, 5, 6], "base": [1, 3, 5, 6, 7, 9], "dev": [1, 5, 6], "librari": [1, 5, 6], "sudo": [1, 5, 6], "apt": [1, 5, 6], "strongli": [1, 5, 6], "user": [1, 5, 6, 7, 10], "creat": [1, 5, 6, 7, 9], "run": [1, 2, 3, 4, 5, 6, 7], "code": [1, 3, 5, 6, 9], "done": [1, 5, 6, 7], "either": [1, 5, 6], "directori": [1, 5, 6, 7, 9], "gather": [1, 5, 6], "within": [1, 5, 6, 7, 9], "python3": [1, 5, 6], "m": [1, 2, 3, 4, 5, 6], "venv": [1, 5, 6], "command": [1, 5, 6, 7], "bin": [1, 5, 6], "suffici": [1, 5, 6], "meet": [1, 5, 6], "export": 1, "cflag": 1, "fcommon": 1, "pip": [1, 5, 6], "rpi": [1, 4, 5, 6], "adafruit": [1, 2, 3, 5, 6], "blinka": [1, 5, 6], "numpi": [1, 5, 6, 7], "panda": [1, 5, 6], "circuitpython": [1, 5, 6], "ads1x15": [1, 5, 6], "tca9548a": [1, 3], "mcp230xx": 1, "gpiozero": 1, "check": [1, 5, 6, 7], "met": [1, 5, 6], "list": [1, 10], "leav": [1, 5, 6], "simpli": [1, 5, 6], "If": [1, 2, 5, 6, 9], "decid": [1, 5, 6], "setup": [1, 5, 6], "time": [1, 3, 5, 6, 7], "softwar": [1, 5, 6, 10], "click": [1, 5, 6], "access": [1, 4, 5, 6, 7], "program": [1, 4, 5, 6], "pythonid": [1, 5, 6], "2": [1, 3, 4, 5, 6, 7, 9], "root": [1, 5, 6], "7": [1, 2, 3, 4, 5, 6], "usr": [1, 5, 6], "select": [1, 3, 5, 6], "new": [1, 5, 6, 7], "window": [1, 5, 6, 7], "On": [1, 5, 6], "altern": [1, 5, 6], "5": [1, 2, 3, 4, 5, 6, 7], "button": [1, 5, 6], "appear": [1, 2, 3, 5, 6], "locat": [1, 5, 6], "anoth": [1, 5, 6], "execut": [1, 5, 6, 7], "6": [1, 2, 3, 4, 5, 6], "find": [1, 5, 6], "folder": [1, 5, 6], "where": [1, 5, 6, 7, 9], "file": [1, 2, 5, 6, 9], "home": [1, 5, 6, 7], "In": [1, 2, 3, 5, 6, 7, 9], "known": [1, 5, 6], "tab": [1, 5, 6, 7], "path": [1, 5, 6, 9], "close": [1, 5, 6], "ok": [1, 5, 6], "9": [1, 2, 3, 4, 5, 6, 7], "save": [1, 5, 6], "modif": [1, 5, 6], "number": [2, 3, 5, 6, 7], "per": [2, 3, 5, 6], "unit": [2, 3, 5, 6, 7], "total": [2, 3, 5, 6], "manufactur": [2, 3, 5, 6], "refer": [2, 3, 4, 5, 6, 7, 10], "web": [2, 3], "raspberri": [2, 3, 4, 7, 10], "pi": [2, 4, 7, 10], "1": [2, 3, 4, 7, 9, 10], "58": [2, 5, 6], "75": 2, "www": [2, 3, 5, 6], "mouser": [2, 3], "fr": [2, 3, 5, 6], "productdetail": [2, 3], "seeed": 2, "studio": 2, "102110421": 2, "qs": [2, 3], "7mvldsj5uaxen3lyyh3sqw": 2, "3d": [2, 3], "lm158n": 2, "amp": [2, 5, 6], "o": [2, 3, 5, 6, 7], "14": [2, 3, 4], "texa": [2, 5, 6], "instrument": [2, 5, 6, 7], "lm358an": [2, 5, 6], "nopb": [2, 5, 6], "lm158j": 2, "x1j7hmvl2zh8vpefml8": 2, "2ffq": 2, "print": [2, 3, 5, 6, 7], "circuit": [2, 3, 5, 6, 7], "12": [2, 3, 4, 5, 6, 7], "asler": [2, 3, 5, 6], "ads1115": [2, 5, 6], "11": [2, 5, 6], "23": [2, 3, 4, 5, 6], "1085": 2, "2fha2pyfaduh": 2, "2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn": 2, "252bg": 2, "capacitor": [2, 6], "100nf": [2, 6], "50vdc": [2, 6], "10": [2, 3, 4, 5, 6, 7], "ceram": [2, 6], "0": [2, 3, 5, 6, 7], "kemet": [2, 6], "c320c104k1": [2, 6], "c320c104k1r5ta7303": 2, "c4uyot": 2, "2flq1th4mcyoetma": 2, "resistor": [2, 3, 5, 6], "kohm": [2, 3, 5, 6], "5w": [2, 5, 6], "te": [2, 3, 5, 6], "connect": [2, 3, 4, 7, 10], "h81k0bya": [2, 5, 6], "holsworthi": 2, "2fha2pyfaduhuylh7az": 2, "2fmjfh2xjoums6wztux4som": 2, "252bii": 2, "h81k5bya": [2, 5, 6], "2fha2pyfadugy9twham3ru9hmijohywhbin95knm": 2, "252bx": 2, "2fm": 2, "vishai": [2, 3], "ccf071k50gke36": 2, "dale": 2, "qkeozdl6eqpa6lzrlqfvow": 2, "mohm": [2, 5, 6, 7], "762": 2, "524": 2, "cmf651m0000fkek143": 2, "ciayqk2gdckzia2levalkg": 2, "ohm": [2, 5, 6, 7], "shunt": 2, "42": 2, "ohmit": 2, "41f2r0e": 2, "im6toxqzgoauedprb19mha": 2, "dual": [2, 3, 5, 6], "screw": [2, 3, 4, 5, 6], "08": [2, 3], "mm": [2, 3, 4, 5, 6], "pitch": [2, 3, 5, 6], "648": [2, 3, 5, 6], "cui": [2, 3], "devic": [2, 3, 9], "tb009": [2, 3], "508": [2, 3], "02be": [2, 3], "vlwxofp3u2wcfk5uckwtka": [2, 3], "dc": [2, 3, 5, 6], "convert": [2, 5, 6], "24v": [2, 6], "15": [2, 3, 4, 5, 6], "31": [2, 3, 4], "16": [2, 3, 4, 5, 6], "tracopow": [2, 6], "trn": [2, 6], "1215": [2, 6], "traco": [2, 6], "power": [2, 3, 4, 5, 6, 7], "yca": 2, "2faaymw02gquicgqj0ta": 2, "dip": [2, 3], "line": [2, 3, 5, 6], "socket": [2, 3], "72": [2, 6], "mill": 2, "max": 2, "110": [2, 3, 5, 6], "43": [2, 5, 6], "308": 2, "41": [2, 3], "001000": 2, "iggadovctstu": 2, "2fqaur8narg": 2, "mgh": 2, "vip": 2, "gclid": 2, "eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw": 2, "aqy211eh": 2, "84": [2, 3], "36": [2, 4, 5, 6], "panason": 2, "industri": 2, "wktuvitrialgiu8hcm7dvq": 2, "449": 2, "796": 2, "preci": [2, 3], "83": 2, "304": 2, "001101": [2, 3], "2fha2pyfadujqkqx4wauig": 2, "2fmgndxmcnv": 2, "2f33nj0gbxroculucynpyong": 2, "mcp23008": 2, "593": 2, "sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw": 2, "header": [2, 3, 5, 6], "1x10": [2, 5, 6], "samtec": [2, 5, 6], "ssw": [2, 5, 6], "02": [2, 5, 10], "g": [2, 5, 6], "ru5fayqh": 2, "252be0w1orxzibqpw": 2, "smt": 2, "breakout": 2, "pcb": [2, 3, 5, 6, 9], "soic": 2, "1212": 2, "gurawfaegucaqqfvnvtyeg": 2, "eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw": 2, "ina282aid": 2, "ze4": 2, "2fufuz19ilfayzxocfra": 2, "thd": 2, "1211n": 2, "39": [2, 3, 4, 5, 6], "2fha2pyfadugpyeg4idvm": 2, "2fmsr": 2, "252b7an": 2, "2f0t3ruis9pcaqjlt4": 2, "252bnrpuooeq": 2, "20": [2, 4, 5, 6], "53": [2, 6], "ssq": 2, "120": [2, 3], "d": [2, 5, 6], "252be1bmvd": 2, "252bdzonqg": 2, "pin": [2, 3, 5, 6], "strip": [2, 3, 4, 5, 6], "ejector": [2, 3], "35": [2, 4], "blk": [2, 3], "10120550": [2, 3], "conrad": [2, 3], "com": [2, 3, 5, 6, 7], "bkl": [2, 3], "contact": [2, 3, 5, 6, 7], "space": [2, 3], "254": [2, 3], "row": [2, 3], "pc": [2, 3], "741435": [2, 3], "searchterm": [2, 3], "searchtyp": [2, 3], "suggest": [2, 3, 5, 6], "searchsuggest": [2, 3], "male": [2, 3], "femal": [2, 3, 5, 6], "spacer": [2, 3, 4], "5m": [2, 4], "hexagonal": 2, "87": [2, 3], "48": [2, 5, 6], "harwin": 2, "r25": 2, "3002002": 2, "w0yvoo0ixfenuv0hsdc4": 2, "2fq": 2, "86": [2, 3], "437": 2, "1108331841001101": 2, "318": 2, "ftmup6kvi2tnqoeziaq": 2, "2fpa": 2, "figur": [2, 5, 6, 7], "show": [2, 5, 6], "gener": [2, 3, 5, 6, 7, 10], "schemat": [2, 5, 6], "plug": [2, 5, 6], "plai": 2, "To": [2, 3, 5, 6, 7], "two": [2, 3, 5, 6, 7, 9], "one": [2, 4, 5, 6, 7], "voltag": [2, 4, 5, 6, 7], "propos": [2, 5, 6], "florsch": [2, 5, 6], "bit": [2, 5, 6], "adc": [2, 5, 6], "analog": [2, 5, 6], "digit": [2, 3, 5, 6], "adapt": [2, 5, 6, 7, 9], "gain": [2, 5, 6, 7], "advantag": 2, "input": [2, 4, 5, 6, 7], "signal": [2, 5, 6], "valu": [2, 3, 5, 6], "could": [2, 4, 5, 6], "lie": [2, 5, 6], "between": [2, 3, 4, 5, 6], "114": [2, 5, 6], "v": [2, 3, 4, 7, 10], "directli": [2, 5, 6], "integr": 2, "ina282": 2, "realiz": 2, "precis": [2, 5, 6], "around": [2, 7], "instal": [2, 3, 4, 7], "solder": [2, 5, 6], "optic": 2, "suppli": [2, 3, 4, 5, 6], "12v": [2, 3, 4, 5, 6, 10], "5v": [2, 5, 6], "tdh15": 2, "four": [2, 7], "inpout": 2, "output": [2, 4, 5, 6, 7], "three": [2, 3, 5, 6, 7], "limit": [2, 7, 10], "ma": [2, 5, 6, 7], "higher": [2, 6], "than": [2, 5, 6], "just": [2, 6], "decreas": 2, "don": [2, 7], "t": [2, 3, 7], "forget": [2, 7], "chang": [2, 3, 7, 9], "config": [2, 5, 6, 7, 9], "py": [2, 3, 5, 6, 7, 9], "kei": 2, "r_shunt": 2, "ohmpi_config": 2, "dict": 2, "pre": [2, 4], "adjust": [2, 5, 6], "13": [2, 3, 4, 5, 6], "17": [2, 4, 5, 6], "18": [2, 4, 5, 6, 7], "19": [2, 4, 5, 6], "view": [2, 4], "fix": [2, 4], "dot": 2, "mark": [2, 4], "top": [2, 4, 7], "left": [2, 4], "corner": 2, "21": [2, 4, 5, 6], "mount": [2, 3, 4, 5, 6], "22": [2, 4, 5, 6], "lm158": 2, "amplifi": [2, 5, 6], "ads115": [2, 5, 6], "right": [2, 4], "3x11": 2, "wurth": 2, "elektronik": 2, "971110321": 2, "305": [2, 3], "apm": [2, 3], "hexseal": [2, 3], "rm3x8mm": [2, 3], "2701": [2, 3], "jjse": [2, 3], "2f12mkns3vxsdryxuhw": [2, 3], "shutdown": 2, "unplug": 2, "bottom": [2, 5, 6], "11mm": 2, "m3": [2, 3], "upper": 2, "port": [2, 4], "write": [2, 3, 5, 6, 7, 9], "i2cdetect": [2, 3], "y": [2, 3], "everyth": 2, "address": [2, 5, 6, 7], "screen": [2, 5, 6], "equival": [2, 5, 6], "need": [2, 3, 5, 6, 7], "1kohm": 2, "r2": [2, 5, 6], "220": 2, "r1": [2, 5, 6], "padboard": 2, "spool": 2, "prepar": [2, 3, 5, 6], "batteri": [2, 4, 5, 6, 7], "red": [2, 4, 5, 6, 7], "black": [2, 4, 5, 6], "ground": [2, 5, 6], "thonni": [2, 7], "sample_measurement_exampl": 2, "exampl": [2, 3, 4, 5, 6, 7], "result": [2, 5, 6], "channel": [3, 5, 6], "mechan": [3, 5, 6, 7], "omron": 3, "g5le": 3, "vd": 3, "vdc": 3, "combin": 3, "zvn4206a": 3, "mofset": 3, "onli": [3, 9], "30": [3, 5, 6], "enough": [3, 5, 6], "activ": [3, 7], "repres": [3, 5, 6], "512": 3, "expand": 3, "mcp23017": 3, "from": [3, 4, 5, 6, 7], "128": [3, 7], "own": 3, "0x70": 3, "0x77": 3, "0x71": 3, "0x72": 3, "0x73": 3, "140": 3, "560": 3, "62": 3, "92": [3, 5, 6], "1580994": 3, "tru": [3, 5, 6], "diod": 3, "1n4007": 3, "256": 3, "091": 3, "296": 3, "incorpor": [3, 7], "sgaepimzzmueqxo7l": 3, "2fbpyakboruumren": 3, "56": 3, "776": 3, "205": 3, "46": 3, "103321": 3, "5twgzeq9e7hsylqaljjyrw": 3, "i": [3, 4, 5, 6, 7], "40": [3, 5, 6, 7], "732": 3, "sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi": 3, "27": [3, 4, 5, 6, 10], "325": 3, "over": 3, "503811": 3, "mosfet": 3, "nchannel": 3, "471": 3, "576": [3, 5], "vhuuswq2": 3, "252bsz9b": 3, "2ff6fcxt7g": 3, "100k\u03c9": 3, "061": 3, "616": 3, "beyschlag": 3, "mba02040c1003frp00": 3, "mzrxyrlhvdt9crf7zyf": 3, "2f5q": 3, "89": 3, "2717": 3, "sgaepimzzmsyydr3r27av4eqf73yoh": 3, "252baqg": 3, "252bz3hvktao": 3, "10120558": 3, "54": 3, "No": 3, "51": 3, "741727": 3, "10120862": 3, "connector": [3, 4, 5, 6], "strain": 3, "relief": 3, "44": [3, 5, 6], "742063": 3, "10120158": 3, "ribbon": [3, 4], "x": [3, 5, 6], "mm\u00b2": [3, 5, 6], "multi": [3, 5, 6, 7], "colour": 3, "1012015810": 3, "127": 3, "008": 3, "1548658": 3, "hex": [3, 4], "25": [3, 4, 5, 6, 7], "79": 3, "49": 3, "keyston": 3, "24300": 3, "uwqyq": 3, "2f2czwu0ejpozmzc2a": 3, "745": 3, "846": 3, "614": 3, "25515": 3, "2f2czwuxuhumfr": 3, "252bzuq": 3, "55": [3, 5, 6], "328": 3, "uqd7xcvsscnr3hwd6fta8g": 3, "100": [3, 5, 6, 7], "duplic": 3, "everi": [3, 7], "build": [3, 5, 6], "therefor": [3, 5, 6], "identifi": 3, "assign": 3, "alloc": 3, "here": [3, 4, 6], "default": [3, 7], "jumper": 3, "note": [3, 4, 5, 6], "name": [3, 5, 6, 7, 9], "zoom": [3, 4], "befor": [3, 4, 5, 6, 7], "them": [3, 5, 6, 7], "definit": 3, "simplifi": 3, "thing": [3, 7], "do": [3, 4, 7, 9], "50": [3, 4, 5, 6, 7], "cm": [3, 4, 5, 6], "long": [3, 4], "flat": 3, "pole": [3, 5, 6], "detect": 3, "script": [3, 7, 9], "test_mux_board": 3, "cut": 4, "compos": 4, "proper": 4, "length": [4, 5, 6], "about": 4, "correspond": [4, 5], "crimp": [4, 5, 6], "idc": 4, "suitabl": [4, 5, 6, 7], "clamp": 4, "pai": [4, 5, 6], "attent": [4, 5, 6], "direct": [4, 5, 6, 7], "unbalanc": 4, "perpendicular": 4, "possibl": [4, 5, 6], "same": [4, 5, 6, 7], "flush": 4, "posit": [4, 5, 6], "abov": [4, 5, 6], "mux": [4, 5, 6, 7], "profil": 4, "color": 4, "yellow": 4, "tin": 4, "end": [4, 5, 6], "shown": [4, 5, 6], "pictur": 4, "ii": 4, "gnd": [4, 5, 6], "nois": 4, "often": 4, "heard": 4, "when": [4, 5, 6, 7, 9], "clip": 4, "place": [4, 5, 6, 9], "second": [4, 5, 6, 7], "b": [4, 7], "help": [4, 7, 9], "previou": [4, 7], "procedur": 4, "repeat": [4, 5, 6, 7], "other": [4, 5, 6, 7], "purpl": 4, "relev": [4, 9], "defin": [4, 7, 9], "third": [4, 7], "fourth": 4, "nylon": 4, "photograph": 4, "more": [4, 7], "detail": [4, 5, 7], "4th": 4, "togeth": [4, 5, 6], "tie": 4, "pvc": 4, "plate": 4, "minimum": 4, "dimens": 4, "200": 4, "150": [4, 5, 6, 7], "drill": 4, "remain": [4, 5, 6], "metal": 4, "tighten": 4, "so": [4, 5, 6], "usb": 4, "hole": [4, 5, 6], "26": [4, 5, 6], "add": [4, 5, 6], "attach": 4, "washer": 4, "nut": 4, "28": 4, "29": [4, 5, 6], "come": 4, "pass": [4, 7], "brown": 4, "blue": [4, 5, 6], "block": [4, 5, 6], "secur": [4, 7], "33": 4, "34": 4, "37": [4, 5, 6], "38": [4, 5, 6], "os": [4, 7], "monitor": [4, 5, 6, 7], "deliv": [4, 5, 6], "12vdc": 4, "enjoi": 4, "publish": [5, 7], "journal": 5, "howev": [5, 6, 9], "correct": [5, 6], "bug": 5, "exist": [5, 6, 9], "explain": 5, "miss": 5, "point": [5, 6, 7], "invit": 5, "v1": [5, 6, 7], "offer": [5, 6, 7], "commerci": [5, 6], "avail": [5, 6, 7, 9], "field": [5, 6, 7], "specif": [5, 6, 9], "temperatur": [5, 6, 7], "c": [5, 6, 7], "consumpt": [5, 6, 7], "cpu": [5, 6, 7], "control": [5, 6, 7], "w": [5, 6, 7], "min": [5, 6, 7], "puls": [5, 6, 7], "durat": [5, 6, 7], "ms": [5, 6, 7], "imped": [5, 6, 7], "storag": [5, 6, 7], "resolut": [5, 6, 7], "o1": [5, 6], "step": [5, 6, 9], "youtub": [5, 6], "wjwzhv1v3pk": [5, 6], "noob": [5, 6], "simpl": [5, 6], "sure": [5, 6, 7, 9], "unexpectedli": [5, 6], "boot": [5, 6], "cd": [5, 6], "gnu": [5, 6], "nano": [5, 6], "editor": [5, 6, 7], "At": [5, 6], "op": [5, 6], "dl": [5, 6], "press": [5, 6], "ctrl": [5, 6], "enter": [5, 6], "escap": [5, 6], "return": [5, 6, 7], "wa": [5, 6], "introduc": [5, 6, 7, 9], "Its": [5, 6], "studi": [5, 6], "hous": [5, 6], "design": [5, 6, 7, 9], "diagram": [5, 6], "displai": [5, 6], "mimic": [5, 6], "behavior": [5, 6], "soil": [5, 6], "subject": [5, 6], "r11": [5, 6], "r10": [5, 6], "r12": [5, 6], "constitut": [5, 6], "thei": [5, 6, 7], "typic": [5, 6, 7, 9], "made": [5, 6, 7], "stainless": [5, 6], "steel": [5, 6], "seri": [5, 6], "part": [5, 6, 7, 9], "r9": [5, 6], "ad": [5, 6, 7], "flow": [5, 6, 7], "order": [5, 6, 7, 9], "less": [5, 6], "sum": [5, 6], "inde": [5, 6], "000": [5, 6], "intens": [5, 6], "potenti": [5, 6], "calcul": [5, 6], "insert": [5, 6], "1115": [5, 6], "our": [5, 6, 7], "a1": [5, 6], "a0": [5, 6], "increas": [5, 6], "track": [5, 6, 9], "divid": [5, 6], "bridg": [5, 6], "r5": [5, 6], "r8": [5, 6], "r6": [5, 6], "r7": [5, 6], "accord": [5, 6, 9], "n": [5, 6, 7], "a2": [5, 6], "a3": [5, 6], "obtain": [5, 6], "ly": [5, 6], "rang": [5, 6, 9], "let": [5, 6], "equal": [5, 6], "multipli": [5, 6], "reduct": [5, 6], "section": [5, 6, 7, 9], "despit": [5, 6], "high": [5, 6], "e": [5, 6, 7], "accur": [5, 6], "still": [5, 6], "calibr": [5, 6], "voltmet": [5, 6], "variou": [5, 6], "These": [5, 6, 7], "serv": [5, 6, 7], "With": [5, 6], "disturb": [5, 6], "being": [5, 6], "estim": [5, 6], "mega": [5, 6], "shortcut": [5, 6], "excess": [5, 6], "whose": [5, 6, 7], "lithium": [5, 6], "ion": [5, 6], "automobil": [5, 6], "lead": [5, 6], "acid": [5, 6], "strong": [5, 6], "hazard": [5, 6], "fuse": [5, 6], "repositori": [5, 6, 7], "onto": [5, 6], "illustr": [5, 6, 7], "ohmmet": [5, 6], "coeffici": [5, 6], "coef_p0": [5, 6], "coef_p1": [5, 6], "coef_p2": [5, 6], "coef_p3": [5, 6], "coef": [5, 6], "po": [5, 6], "p1": [5, 6], "r3": [5, 6], "r4": [5, 6], "p2": [5, 6], "p3": [5, 6], "r_ref": [5, 6], "slope": [5, 6], "convers": [5, 6], "p0": [5, 6], "accuraci": [5, 6], "both": [5, 6, 9], "addit": [5, 6, 7], "lm358n": [5, 6], "appli": [5, 6], "prefer": [5, 6, 7], "weaker": 5, "stronger": [5, 6], "tx": [5, 6], "rememb": [5, 6], "holder": [5, 6], "f": [5, 6], "consist": [5, 6], "circul": [5, 6], "through": [5, 6, 7], "fig": [5, 6], "modul": [5, 6, 9], "switch": [5, 6], "common": [5, 6], "neg": [5, 6], "normal": [5, 6], "simultan": [5, 6], "role": [5, 6], "revers": [5, 6], "polar": [5, 6], "thu": [5, 6], "energ": [5, 6], "solut": [5, 6, 9], "manag": [5, 6, 7], "next": [5, 6], "featur": [5, 6], "strict": [5, 6], "in1": [5, 6], "in2": [5, 6], "in3": [5, 6], "in4": [5, 6], "5vdc": [5, 6], "5vcc": [5, 6], "now": [5, 6], "mm2": [5, 6], "lastli": [5, 6], "congratul": [5, 6], "construct": [5, 6], "valid": [5, 6, 7], "conduct": [5, 6, 9], "manual": [5, 6, 7], "practic": [5, 6, 9], "ert": [5, 6], "sever": [5, 6], "ten": [5, 6], "thousand": [5, 6], "arrai": [5, 6, 7], "stuck": [5, 6], "enabl": [5, 6, 7], "smaller": [5, 6], "hand": [5, 6], "entir": [5, 6, 7], "cap": [5, 6], "produc": [5, 6], "clean": [5, 6], "distanc": [5, 6], "had": [5, 6], "extra": [5, 6], "As": [5, 6], "final": [5, 6], "actual": [5, 6], "singl": [5, 6, 7, 9], "protocol": [5, 6, 7], "horizont": [5, 6], "vertic": [5, 6], "06": [5, 6], "04": [5, 6], "09": [5, 6], "05": [5, 6], "din": [5, 6], "rail": [5, 6], "chosen": [5, 6], "consequ": [5, 6], "incom": [5, 6], "instead": [5, 6], "moreov": [5, 6], "turn": [5, 6], "bought": [5, 6], "down": [5, 6], "velleman": [5, 6], "wpm404": [5, 6], "potentiomet": [5, 6], "download": [5, 6, 7], "scienc": [5, 6], "framework": [5, 6], "manuscript": [5, 6], "osf": [5, 6], "io": [5, 6], "dzwb4": [5, 6], "gitlab": [5, 6, 7], "irstea": [5, 6], "unzip": [5, 6], "master": [5, 6], "readm": [5, 6], "assist": [5, 6], "disconnect": [5, 6], "handl": [5, 6, 7], "charg": [5, 6], "full": [5, 6], "capac": [5, 6], "fewer": [5, 6], "bank": [5, 6], "2a": [5, 6], "ll": [5, 6], "insid": [5, 6], "abmn": [5, 6, 7], "quadrupol": [5, 6, 7], "numer": [5, 6], "some": [5, 6, 7, 9, 10], "main": [5, 6, 7], "optim": [5, 6], "attribut": [5, 6], "stack": [5, 6, 7], "the9": [5, 6], "hear": [5, 6], "characterist": [5, 6], "sound": [5, 6], "permut": [5, 6], "csv": [5, 6], "nb_electrod": [5, 6, 7], "maximum": [5, 6, 7], "injection_dur": [5, 6, 7], "nbr_mea": [5, 6, 7], "sequenc": [5, 6, 7], "sequence_delai": [5, 6, 7], "delai": [5, 6], "repetit": [5, 6], "evolv": [5, 6], "littl": [5, 6], "public": [5, 6], "articl": [5, 6], "date": [5, 6, 10], "sainsmart": [5, 6], "canal": 5, "pour": 5, "arduino": 5, "dsp": 5, "avr": 5, "pic": 5, "arm": 5, "99": [5, 6], "199": [5, 6], "sain": [5, 6], "smart": [5, 6], "101": [5, 6], "70": [5, 6], "103": [5, 6], "018": [5, 6], "1x1": [5, 6], "66": [5, 6], "1568649": [5, 6], "1x0": [5, 6], "71": [5, 6], "1565235": [5, 6], "68": [5, 6], "rs": [5, 6], "pro": [5, 6], "897": [5, 6], "1332": [5, 6], "858": [5, 6], "627": [5, 6], "52": [5, 6], "upw50b50rv": [5, 6], "1083": [5, 6], "7ah": [5, 6], "537": [5, 6], "5488": [5, 6], "lr20": [5, 6], "9v": [5, 6], "185": [5, 6], "4686": [5, 6], "ferrul": [5, 6], "500": [5, 6], "piec": [5, 6], "weidmul": [5, 6], "9004330000": [5, 6], "966067": [5, 6], "car": 5, "littelfus": [5, 6], "fhac0002zxj": 5, "96": 5, "improv": [6, 7, 9], "upgrad": [6, 7], "01": [6, 7, 10], "replac": [6, 9], "trn3": 6, "suppress": 6, "10v": 6, "fast": 6, "decoupl": 6, "last": 6, "veri": [6, 9], "prevent": 6, "overh": 6, "toler": 6, "orient": 6, "h": 6, "nf": 6, "tabl": 6, "jason": 6, "ohmpi_param": 6, "json": [6, 7], "export_path": 6, "desktop": 6, "0251001": 6, "pat1l": 6, "box": 7, "mani": 7, "dii": 7, "laps": 7, "seek": 7, "share": [7, 9], "wish": 7, "2023": [7, 10], "stop": 7, "0x": 7, "effort": 7, "paramet": 7, "80": 7, "virtual": 7, "environ": 7, "packag": 7, "id": 7, "summar": 7, "cover": 7, "acquisit": 7, "separ": 7, "ohmpi_set": 7, "central": 7, "class": [7, 9], "interact": [7, 9], "handler": 7, "layer": 7, "releas": [7, 10], "excel": 7, "log": 7, "implement": [7, 9, 10], "broker": 7, "zip": 7, "rotat": 7, "disk": 7, "exec_logg": 7, "data_logg": 7, "plan": 7, "state": 7, "health": 7, "soh": 7, "futur": 7, "By": 7, "written": 7, "consol": 7, "like": 7, "store": [7, 9], "local": 7, "dai": 7, "size": 7, "exce": 7, "sent": 7, "level": 7, "advanc": 7, "edit": 7, "setup_logg": 7, "custom": 7, "desir": 7, "usernam": 7, "password": 7, "One": 7, "understand": 7, "alter": 7, "keep": 7, "bash": 7, "run_http_interfac": 7, "sh": 7, "api": [7, 10], "import": [7, 9], "iot": 7, "messag": 7, "friendli": 7, "graphic": 7, "quick": 7, "easi": 7, "wi": 7, "fi": 7, "ap": 7, "webserv": 7, "index": 7, "html": 7, "laptop": 7, "mobil": 7, "phone": 7, "upload": 7, "act": 7, "raspap": 7, "runonstart": 7, "itself": 7, "141": 7, "8080": 7, "pseudo": 7, "evolut": 7, "appar": 7, "especi": 7, "suit": 7, "autom": 7, "ipython": 7, "ssh": 7, "putti": 7, "maco": 7, "linux": 7, "found": 7, "np": 7, "chdir": 7, "object": 7, "k": 7, "load": 7, "nb_stack": 7, "half": 7, "cycl": 7, "updat": 7, "update_set": 7, "shape": 7, "set_sequ": 7, "n2": 7, "string": 7, "load_sequ": 7, "rs_check": 7, "synchron": 7, "wait": 7, "prompt": 7, "run_sequ": 7, "run_sequence_async": 7, "thread": 7, "immedi": 7, "sleep": 7, "interrupt": 7, "kill": 7, "asynchron": 7, "given": 7, "interv": 7, "nb_mea": 7, "run_multiple_sequ": 7, "taken": 7, "switch_mux_on": 7, "run_measur": 7, "switch_mux_off": 7, "risk": 7, "short": 7, "argument": 7, "autogain": 7, "true": 7, "good": 7, "usag": 7, "process": 7, "sensor": 7, "scope": 7, "internet": 7, "network": 7, "auxiliari": 7, "subscrib": 7, "approach": 7, "mosquitto": 7, "server": 7, "reachabl": 7, "net": 7, "servic": 7, "install_local_mqtt_brok": 7, "examin": 7, "easili": [7, 9], "parti": 7, "explor": 7, "receiv": 7, "reboot": 7, "further": 7, "format": 7, "kwarg": 7, "cmd_id": 7, "3fzxv121uitwgjwygcz4xw": 7, "cmd": 7, "3fzxv121uitwgjwygcz4yw": 7, "tailor": 7, "dashboard": 7, "browser": 7, "node": 7, "complex": 7, "properli": 7, "palett": 7, "noder": 7, "doc": 7, "guid": 7, "ui": 7, "visual": 7, "cookbook": 7, "draft": 9, "TO": 9, "BE": 9, "review": 9, "intend": 9, "advic": 9, "best": 9, "contribut": 9, "maintain": 9, "promot": 9, "exchang": 9, "reus": 9, "contributor": 9, "ideal": 9, "few": 9, "distinguish": 9, "deal": 9, "compli": 9, "Such": 9, "focu": 9, "reduc": 9, "newli": 9, "expos": 9, "minim": 9, "hardware_system": 9, "discuss": 9, "ohmpi_hardwar": 9, "initi": 9, "earli": 9, "stage": 9, "investig": 9, "strategi": 9, "readi": 9, "conceiv": 9, "kicad": 9, "schema": 9, "alwai": 9, "branch": 9, "python": 9, "similar": 9, "hardware_compon": 9, "abstract": 9, "abstract_hardware_compon": 9, "method": 9, "configur": [9, 10], "hardware_config": 9, "dictionari": 9, "config_xxx": 9, "xxx": 9, "nov": 10, "juli": 10, "2016": 10, "target": 10, "research": 10, "statu": 10, "matur": 10, "progress": 10, "offici": 10, "guidelin": 10, "tutori": 10, "content": 10, "partner": 10, "cite": 10, "introduct": 10, "technic": 10, "v2023": 10}, "objects": {"": [[8, 0, 0, "-", "ohmpi"]]}, "objtypes": {"0": "py:module"}, "objnames": {"0": ["py", "module", "Python module"]}, "titleterms": {"ohmpi": [0, 4, 5, 6, 7, 10], "project": 0, "author": 0, "partner": 0, "cite": 0, "introduct": 0, "step": [1, 2, 3, 4, 7], "n": [1, 2, 3, 4], "1": [1, 5, 6], "raspberri": [1, 5, 6], "pi": [1, 5, 6], "configur": [1, 5, 6, 7], "part": [1, 2, 3], "A": [1, 2, 3], "os": [1, 5, 6], "instal": [1, 5, 6], "b": [1, 2, 3, 5, 6], "virtual": [1, 5, 6], "environ": [1, 5, 6], "packag": [1, 5, 6], "c": [1, 2, 3], "activ": [1, 5, 6], "thonni": [1, 5, 6], "python": [1, 5, 6, 7], "id": [1, 5, 6], "2": 2, "measur": [2, 5, 6], "board": [2, 3, 5, 6], "assembl": [2, 3, 4, 5, 6], "requir": [2, 3], "compon": [2, 3, 5, 6, 9], "list": [2, 3, 5, 6], "descript": [2, 5, 6], "start": 2, "up": 2, "check": 2, "3": 3, "mux": 3, "address": 3, "valid": 3, "4": 4, "v": [5, 6], "01": 5, "limit": [5, 6], "32": [5, 6], "electrod": [5, 6, 7], "The": [5, 6, 7], "philosophi": [5, 6, 7], "technic": [5, 6], "data": [5, 6], "current": [5, 6], "inject": [5, 6], "card": [5, 6], "connect": [5, 6], "electr": [5, 6], "resist": [5, 6, 10], "implement": [5, 6], "first": [5, 6], "four": [5, 6], "multiplex": [5, 6], "oper": [5, 6, 7], "instruct": [5, 6], "preliminari": [5, 6], "procedur": [5, 6], "onli": [5, 6], "initi": [5, 6], "startup": [5, 6], "paramet": [5, 6], "complet": [5, 6], "tabl": 5, "titl": 5, "02": 6, "v2023": 7, "64": 7, "12v": 7, "hardwar": [7, 9, 10], "specif": 7, "build": 7, "an": 7, "softwar": [7, 9], "system": 7, "architectur": 7, "logger": 7, "file": 7, "interfac": [7, 9], "applic": 7, "web": 7, "mqtt": 7, "api": 8, "refer": 8, "new": 9, "open": 10, "sourc": 10, "meter": 10, "summari": 10, "document": 10, "center": 10}, "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": ["Ohmpi", "Ohmpi_V2023/V2023_step_01", "Ohmpi_V2023/V2023_step_02", "Ohmpi_V2023/V2023_step_03", "Ohmpi_V2023/V2023_step_04", "V1_01", "V1_02", "V2023", "V2024_rc", "api", "developing_hardware_components", "index"], "filenames": ["Ohmpi.rst", "Ohmpi_V2023\\V2023_step_01.rst", "Ohmpi_V2023\\V2023_step_02.rst", "Ohmpi_V2023\\V2023_step_03.rst", "Ohmpi_V2023\\V2023_step_04.rst", "V1_01.rst", "V1_02.rst", "V2023.rst", "V2024_rc.rst", "api.rst", "developing_hardware_components.rst", "index.rst"], "titles": ["OhmPi project", "<strong>STEP n\u00b01</strong> : Raspberry Pi configuration", "<strong>STEP n\u00b02</strong>: Measurement board", "<strong>STEP n\u00b03:</strong> MUX board", "<strong>STEP n\u00b04:</strong> assemble the OhmPi", "OhmPi V 1.01 (limited to 32 electrodes)", "OhmPi V 1.02 (limited to 32 electrodes)", "OhmPi V2023 (64 electrodes and 12V)", "OhmPi V2023 (64 electrodes and 12V)", "API reference", "Software interface to new hardware components", "OHMPI: Open source and open hardware resistivity-meter"], "terms": {"r\u00e9mi": [0, 11], "clement": [0, 11], "vivien": [0, 11], "duboi": [0, 11], "nicola": [0, 11], "forquet": [0, 11], "inra": 0, "reversa": [0, 5, 6], "villeurbann": 0, "franc": 0, "yannick": [0, 11], "fargier": [0, 11], "ger": 0, "rro": 0, "univ": 0, "gustav": 0, "eiffel": 0, "ifsttar": 0, "lyon": 0, "h\u00e9l\u00e8ne": [0, 11], "guyard": [0, 11], "ig": 0, "grenobl": 0, "universit\u00e9": 0, "alp": 0, "olivi": [0, 11], "kaufmann": [0, 11], "arnaud": [0, 11], "watlet": [0, 11], "de": 0, "mon": 0, "belgium": 0, "guillaum": [0, 11], "blanchi": [0, 11], "ilvo": 0, "merelbek": 0, "julien": 0, "ganc": 0, "emil": 0, "gro": 0, "et": [0, 2], "al": 0, "an": [0, 1, 2, 3, 4, 5, 6, 10], "open": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "sourc": [0, 1, 5, 6, 10], "data": [0, 7, 8, 11], "logger": [0, 5, 6], "dedic": [0, 7, 8], "applic": [0, 10], "electr": [0, 2], "resist": [0, 2, 7, 8], "imag": [0, 1], "small": [0, 2, 4, 5, 6, 7, 8], "laboratori": [0, 4, 5, 6, 7, 8], "scale": 0, "hardwarex": 0, "elsevi": 0, "2020": 0, "8": [0, 1, 2, 3, 4, 5, 6, 7, 8], "24": [0, 2, 3, 4, 5, 6], "p": [0, 2, 3], "ff10": 0, "1016": 0, "j": 0, "ohx": 0, "e00122ff": 0, "particip": [0, 1, 2, 3, 4, 5, 6, 7, 8], "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "requir": [0, 1, 4, 5, 6, 7, 8, 10], "skill": [0, 1, 2, 3, 4, 5, 6, 7, 8], "electron": [0, 1, 2, 3, 4, 5, 6, 7, 8], "respect": [0, 1, 2, 3, 4, 5, 6, 7, 8], "safeti": [0, 1, 2, 3, 4, 5, 6, 7, 8], "rule": [0, 1, 2, 3, 4, 5, 6, 7, 8], "must": [0, 1, 2, 3, 4, 5, 6, 7, 8], "assembl": [0, 1, 7, 8, 11], "profession": [0, 1, 2, 3, 4, 5, 6, 7, 8], "context": [0, 1, 2, 3, 4, 5, 6, 7, 8], "peopl": [0, 1, 2, 3, 4, 5, 6, 7, 8], "compet": [0, 1, 2, 3, 4, 5, 6, 7, 8], "The": [0, 1, 2, 3, 4, 10, 11], "team": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "cannot": [0, 1, 2, 3, 4, 5, 6, 7, 8], "held": [0, 1, 2, 3, 4, 5, 6, 7, 8], "respons": [0, 1, 2, 3, 4, 5, 6, 7, 8], "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8], "materi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "human": [0, 1, 2, 3, 4, 5, 6, 7, 8], "damag": [0, 1, 2, 3, 4, 5, 6, 7, 8], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8], "would": [0, 1, 2, 3, 4, 5, 6, 7, 8], "associ": [0, 1, 2, 3, 4, 5, 6, 7, 8], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8], "equip": [0, 1, 2, 3, 4, 5, 6, 7, 8], "doe": [0, 1, 2, 3, 4, 5, 6, 7, 8], "work": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "after": [0, 1, 2, 3, 4, 5, 6, 7, 8], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "mai": [0, 1, 5, 6, 7, 8], "redistribut": 0, "modifi": [0, 5, 6, 10], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "document": [0, 5, 7, 8], "make": [0, 3, 5, 6, 7, 8, 10], "product": [0, 2, 3], "under": [0, 4, 5, 6], "term": [0, 10], "cern": 0, "ohl": 0, "v2": 0, "http": [0, 1, 2, 3, 5, 6, 7, 8], "ch": 0, "distribut": 0, "without": [0, 3, 5, 6], "express": [0, 10], "OR": 0, "impli": [0, 3], "warranti": 0, "includ": [0, 1, 3, 5, 6, 7, 8, 10], "OF": 0, "merchant": 0, "satisfactori": 0, "qualiti": 0, "AND": 0, "fit": 0, "FOR": 0, "A": [0, 4, 5, 6, 7, 8, 10], "particular": 0, "purpos": [0, 4, 5, 6], "pleas": [0, 4, 5, 6, 7, 8], "see": [0, 5, 6, 7, 8], "condit": 0, "present": [0, 3, 4, 5, 6, 10], "develop": [0, 1, 2, 5, 6, 7, 8, 10, 11], "low": [0, 5, 6, 7, 8], "cost": [0, 2, 3, 5, 6, 10], "hardwar": [0, 5, 6], "meter": [0, 4, 5, 6, 7, 8], "provid": [0, 5, 6, 7, 8], "scientif": 0, "commun": [0, 7, 8], "robust": [0, 5, 6, 7, 8], "flexibl": 0, "tool": [0, 7, 8], "experi": [0, 5, 6, 7, 8], "call": [0, 1, 3, 4, 7, 8], "basic": [0, 10], "meterfeatur": 0, "current": [0, 2, 7, 8, 11], "inject": [0, 7, 8, 11], "measur": [0, 1, 3, 4, 7, 8, 11], "function": [0, 5, 6, 7, 8, 10], "multiplex": [0, 3, 4, 7, 8, 11], "allow": [0, 2, 3, 5, 6, 7, 8], "perform": [0, 1, 5, 6, 10], "automat": [0, 5, 6, 7, 8], "up": [0, 1, 3, 5, 6, 7, 8], "64": [0, 3, 5, 6, 11], "electrod": [0, 2, 3, 4, 11], "s": [0, 2, 3, 5, 6, 7, 8], "philosophi": [0, 11], "fulli": 0, "toolto": 0, "surfac": 0, "anyon": 0, "who": 0, "want": [0, 6], "get": [0, 1, 2, 5, 6, 7, 8], "involv": [0, 7, 8], "welcom": [0, 10], "join": 0, "ohmpi": [1, 2, 3, 10], "project": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11], "compon": [1, 7, 8, 11], "quantiti": [1, 5, 6], "4": [1, 2, 3, 5, 6, 7, 8], "model": [1, 2, 5, 6], "micro": [1, 5, 6, 7, 8], "sd": [1, 4, 5, 6, 7, 8], "32": [1, 4, 7, 8, 11], "go": [1, 3, 7, 8], "hdmi": [1, 4], "cabl": [1, 2, 3, 4, 5, 6], "comput": [1, 5, 6], "mous": [1, 4, 5, 6], "keyboard": [1, 4, 5, 6], "first": [1, 3, 4, 7, 8, 10], "start": [1, 3, 5, 6, 7, 8, 10, 11], "board": [1, 4, 7, 8, 10], "oper": [1, 2, 4, 10, 11], "system": [1, 5, 6, 10], "For": [1, 2, 3, 5, 6, 7, 8], "instruct": [1, 7, 8, 11], "ar": [1, 2, 5, 6, 7, 8, 10], "well": [1, 5, 6, 7, 8], "describ": [1, 2, 4, 5, 6, 10], "websit": [1, 5, 6], "watch": [1, 5, 6], "video": [1, 5, 6], "how": [1, 5, 6], "set": [1, 2, 5, 6, 7, 8], "your": [1, 2, 3, 5, 6, 10], "author": [1, 5, 6, 11], "recommend": [1, 5, 6, 7, 8, 10], "latest": [1, 5, 6], "stabl": [1, 5, 6], "complet": [1, 2, 7, 8, 11], "version": [1, 2, 5, 6, 7, 8, 10], "previous": [1, 4, 5, 6], "raspbian": [1, 5, 6], "can": [1, 4, 5, 6, 7, 8], "visit": 1, "raspberrypi": 1, "org": [1, 7, 8], "en": 1, "test": [1, 2, 3, 5, 6, 7, 8, 10], "were": [1, 2, 5, 6], "3": [1, 2, 4, 5, 6, 7, 8, 10], "we": [1, 2, 3, 5, 6, 7, 8], "follow": [1, 2, 3, 4, 5, 6, 7, 8, 10], "onc": [1, 5, 6, 7, 8], "ha": [1, 3, 5, 6, 7, 8], "been": [1, 3, 5, 6, 7, 8], "wire": [1, 3, 4, 5, 6], "spi": [1, 5, 6], "gpio": [1, 3, 5, 6], "remot": [1, 5, 6, 7, 8], "option": [1, 5, 6, 7, 8], "deactiv": [1, 5, 6], "i2c": [1, 2, 3], "via": [1, 5, 6], "gui": [1, 5, 6], "menu": [1, 5, 6], "failur": [1, 5, 6], "carri": [1, 5, 6], "out": [1, 4, 5, 6], "task": [1, 5, 6], "caus": [1, 5, 6], "relai": [1, 2, 3, 5, 6], "shield": [1, 5, 6], "card": [1, 3, 4, 7, 8, 11], "dure": [1, 5, 6], "wai": [1, 5, 6, 10], "have": [1, 2, 3, 5, 6, 7, 8, 10], "multipl": [1, 7, 8], "parallel": 1, "instanc": 1, "interpret": [1, 2, 5, 6], "each": [1, 3, 4, 5, 6], "differ": [1, 2, 3, 4, 5, 6, 7, 8], "contain": [1, 4, 5, 6, 7, 8], "discret": 1, "copi": [1, 7, 8, 10], "its": [1, 3, 4, 5, 6, 7, 8], "support": 1, "util": [1, 7, 8], "It": [1, 3, 5, 6, 7, 8, 10], "also": [1, 5, 6, 7, 8, 10], "protect": 1, "case": [1, 5, 6, 7, 8, 10], "problem": 1, "depend": [1, 5, 6, 7, 8], "specifi": [1, 5, 6], "txt": [1, 5, 6, 7, 8], "below": [1, 4, 5, 6, 7, 8], "should": [1, 2, 3, 4, 5, 6, 7, 8, 10], "type": [1, 3, 5, 6, 7, 8, 10], "termin": [1, 2, 3, 4, 5, 6, 7, 8], "necessari": [1, 3, 4, 5, 6, 10], "ensur": [1, 5, 6], "libatla": [1, 5, 6], "base": [1, 3, 5, 6, 7, 8, 10], "dev": [1, 5, 6], "librari": [1, 5, 6], "sudo": [1, 5, 6], "apt": [1, 5, 6], "strongli": [1, 5, 6], "user": [1, 5, 6, 7, 8, 11], "creat": [1, 5, 6, 7, 8, 10], "run": [1, 2, 3, 4, 5, 6, 7, 8], "code": [1, 3, 5, 6, 10], "done": [1, 5, 6, 7, 8], "either": [1, 5, 6], "directori": [1, 5, 6, 7, 8, 10], "gather": [1, 5, 6], "within": [1, 5, 6, 7, 8, 10], "python3": [1, 5, 6], "m": [1, 2, 3, 4, 5, 6], "venv": [1, 5, 6], "command": [1, 5, 6, 7, 8], "bin": [1, 5, 6], "suffici": [1, 5, 6], "meet": [1, 5, 6], "export": 1, "cflag": 1, "fcommon": 1, "pip": [1, 5, 6], "rpi": [1, 4, 5, 6], "adafruit": [1, 2, 3, 5, 6], "blinka": [1, 5, 6], "numpi": [1, 5, 6, 7, 8], "panda": [1, 5, 6], "circuitpython": [1, 5, 6], "ads1x15": [1, 5, 6], "tca9548a": [1, 3], "mcp230xx": 1, "gpiozero": 1, "check": [1, 5, 6, 7, 8], "met": [1, 5, 6], "list": [1, 11], "leav": [1, 5, 6], "simpli": [1, 5, 6], "If": [1, 2, 5, 6, 10], "decid": [1, 5, 6], "setup": [1, 5, 6], "time": [1, 3, 5, 6, 7, 8], "softwar": [1, 5, 6, 11], "click": [1, 5, 6], "access": [1, 4, 5, 6, 7, 8], "program": [1, 4, 5, 6], "pythonid": [1, 5, 6], "2": [1, 3, 4, 5, 6, 7, 8, 10], "root": [1, 5, 6], "7": [1, 2, 3, 4, 5, 6], "usr": [1, 5, 6], "select": [1, 3, 5, 6], "new": [1, 5, 6, 7, 8], "window": [1, 5, 6, 7, 8], "On": [1, 5, 6], "altern": [1, 5, 6], "5": [1, 2, 3, 4, 5, 6, 7, 8], "button": [1, 5, 6], "appear": [1, 2, 3, 5, 6], "locat": [1, 5, 6], "anoth": [1, 5, 6], "execut": [1, 5, 6, 7, 8], "6": [1, 2, 3, 4, 5, 6], "find": [1, 5, 6], "folder": [1, 5, 6], "where": [1, 5, 6, 7, 8, 10], "file": [1, 2, 5, 6, 10], "home": [1, 5, 6, 7, 8], "In": [1, 2, 3, 5, 6, 7, 8, 10], "known": [1, 5, 6], "tab": [1, 5, 6, 7, 8], "path": [1, 5, 6, 10], "close": [1, 5, 6], "ok": [1, 5, 6], "9": [1, 2, 3, 4, 5, 6, 7, 8], "save": [1, 5, 6], "modif": [1, 5, 6], "number": [2, 3, 5, 6, 7, 8], "per": [2, 3, 5, 6], "unit": [2, 3, 5, 6, 7, 8], "total": [2, 3, 5, 6], "manufactur": [2, 3, 5, 6], "refer": [2, 3, 4, 5, 6, 7, 8, 11], "web": [2, 3], "raspberri": [2, 3, 4, 7, 8, 11], "pi": [2, 4, 7, 8, 11], "1": [2, 3, 4, 7, 8, 10, 11], "58": [2, 5, 6], "75": 2, "www": [2, 3, 5, 6], "mouser": [2, 3], "fr": [2, 3, 5, 6], "productdetail": [2, 3], "seeed": 2, "studio": 2, "102110421": 2, "qs": [2, 3], "7mvldsj5uaxen3lyyh3sqw": 2, "3d": [2, 3], "lm158n": 2, "amp": [2, 5, 6], "o": [2, 3, 5, 6, 7, 8], "14": [2, 3, 4], "texa": [2, 5, 6], "instrument": [2, 5, 6, 7, 8], "lm358an": [2, 5, 6], "nopb": [2, 5, 6], "lm158j": 2, "x1j7hmvl2zh8vpefml8": 2, "2ffq": 2, "print": [2, 3, 5, 6, 7, 8], "circuit": [2, 3, 5, 6, 7, 8], "12": [2, 3, 4, 5, 6, 7, 8], "asler": [2, 3, 5, 6], "ads1115": [2, 5, 6], "11": [2, 5, 6], "23": [2, 3, 4, 5, 6], "1085": 2, "2fha2pyfaduh": 2, "2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn": 2, "252bg": 2, "capacitor": [2, 6], "100nf": [2, 6], "50vdc": [2, 6], "10": [2, 3, 4, 5, 6, 7, 8], "ceram": [2, 6], "0": [2, 3, 5, 6, 7, 8], "kemet": [2, 6], "c320c104k1": [2, 6], "c320c104k1r5ta7303": 2, "c4uyot": 2, "2flq1th4mcyoetma": 2, "resistor": [2, 3, 5, 6], "kohm": [2, 3, 5, 6], "5w": [2, 5, 6], "te": [2, 3, 5, 6], "connect": [2, 3, 4, 7, 8, 11], "h81k0bya": [2, 5, 6], "holsworthi": 2, "2fha2pyfaduhuylh7az": 2, "2fmjfh2xjoums6wztux4som": 2, "252bii": 2, "h81k5bya": [2, 5, 6], "2fha2pyfadugy9twham3ru9hmijohywhbin95knm": 2, "252bx": 2, "2fm": 2, "vishai": [2, 3], "ccf071k50gke36": 2, "dale": 2, "qkeozdl6eqpa6lzrlqfvow": 2, "mohm": [2, 5, 6, 7, 8], "762": 2, "524": 2, "cmf651m0000fkek143": 2, "ciayqk2gdckzia2levalkg": 2, "ohm": [2, 5, 6, 7, 8], "shunt": 2, "42": 2, "ohmit": 2, "41f2r0e": 2, "im6toxqzgoauedprb19mha": 2, "dual": [2, 3, 5, 6], "screw": [2, 3, 4, 5, 6], "08": [2, 3], "mm": [2, 3, 4, 5, 6], "pitch": [2, 3, 5, 6], "648": [2, 3, 5, 6], "cui": [2, 3], "devic": [2, 3, 10], "tb009": [2, 3], "508": [2, 3], "02be": [2, 3], "vlwxofp3u2wcfk5uckwtka": [2, 3], "dc": [2, 3, 5, 6], "convert": [2, 5, 6], "24v": [2, 6], "15": [2, 3, 4, 5, 6], "31": [2, 3, 4], "16": [2, 3, 4, 5, 6], "tracopow": [2, 6], "trn": [2, 6], "1215": [2, 6], "traco": [2, 6], "power": [2, 3, 4, 5, 6, 7, 8], "yca": 2, "2faaymw02gquicgqj0ta": 2, "dip": [2, 3], "line": [2, 3, 5, 6], "socket": [2, 3], "72": [2, 6], "mill": 2, "max": 2, "110": [2, 3, 5, 6], "43": [2, 5, 6], "308": 2, "41": [2, 3], "001000": 2, "iggadovctstu": 2, "2fqaur8narg": 2, "mgh": 2, "vip": 2, "gclid": 2, "eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw": 2, "aqy211eh": 2, "84": [2, 3], "36": [2, 4, 5, 6], "panason": 2, "industri": 2, "wktuvitrialgiu8hcm7dvq": 2, "449": 2, "796": 2, "preci": [2, 3], "83": 2, "304": 2, "001101": [2, 3], "2fha2pyfadujqkqx4wauig": 2, "2fmgndxmcnv": 2, "2f33nj0gbxroculucynpyong": 2, "mcp23008": 2, "593": 2, "sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw": 2, "header": [2, 3, 5, 6], "1x10": [2, 5, 6], "samtec": [2, 5, 6], "ssw": [2, 5, 6], "02": [2, 5, 11], "g": [2, 5, 6], "ru5fayqh": 2, "252be0w1orxzibqpw": 2, "smt": 2, "breakout": 2, "pcb": [2, 3, 5, 6, 10], "soic": 2, "1212": 2, "gurawfaegucaqqfvnvtyeg": 2, "eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw": 2, "ina282aid": 2, "ze4": 2, "2fufuz19ilfayzxocfra": 2, "thd": 2, "1211n": 2, "39": [2, 3, 4, 5, 6], "2fha2pyfadugpyeg4idvm": 2, "2fmsr": 2, "252b7an": 2, "2f0t3ruis9pcaqjlt4": 2, "252bnrpuooeq": 2, "20": [2, 4, 5, 6], "53": [2, 6], "ssq": 2, "120": [2, 3], "d": [2, 5, 6], "252be1bmvd": 2, "252bdzonqg": 2, "pin": [2, 3, 5, 6], "strip": [2, 3, 4, 5, 6], "ejector": [2, 3], "35": [2, 4], "blk": [2, 3], "10120550": [2, 3], "conrad": [2, 3], "com": [2, 3, 5, 6, 7, 8], "bkl": [2, 3], "contact": [2, 3, 5, 6, 7, 8], "space": [2, 3], "254": [2, 3], "row": [2, 3], "pc": [2, 3], "741435": [2, 3], "searchterm": [2, 3], "searchtyp": [2, 3], "suggest": [2, 3, 5, 6], "searchsuggest": [2, 3], "male": [2, 3], "femal": [2, 3, 5, 6], "spacer": [2, 3, 4], "5m": [2, 4], "hexagonal": 2, "87": [2, 3], "48": [2, 5, 6], "harwin": 2, "r25": 2, "3002002": 2, "w0yvoo0ixfenuv0hsdc4": 2, "2fq": 2, "86": [2, 3], "437": 2, "1108331841001101": 2, "318": 2, "ftmup6kvi2tnqoeziaq": 2, "2fpa": 2, "figur": [2, 5, 6, 7, 8], "show": [2, 5, 6], "gener": [2, 3, 5, 6, 7, 8, 11], "schemat": [2, 5, 6], "plug": [2, 5, 6], "plai": 2, "To": [2, 3, 5, 6, 7, 8], "two": [2, 3, 5, 6, 7, 8, 10], "one": [2, 4, 5, 6, 7, 8], "voltag": [2, 4, 5, 6, 7, 8], "propos": [2, 5, 6], "florsch": [2, 5, 6], "bit": [2, 5, 6], "adc": [2, 5, 6], "analog": [2, 5, 6], "digit": [2, 3, 5, 6], "adapt": [2, 5, 6, 7, 8, 10], "gain": [2, 5, 6, 7, 8], "advantag": 2, "input": [2, 4, 5, 6, 7, 8], "signal": [2, 5, 6], "valu": [2, 3, 5, 6], "could": [2, 4, 5, 6], "lie": [2, 5, 6], "between": [2, 3, 4, 5, 6], "114": [2, 5, 6], "v": [2, 3, 4, 7, 8, 11], "directli": [2, 5, 6], "integr": 2, "ina282": 2, "realiz": 2, "precis": [2, 5, 6], "around": [2, 7, 8], "instal": [2, 3, 4, 7, 8], "solder": [2, 5, 6], "optic": 2, "suppli": [2, 3, 4, 5, 6], "12v": [2, 3, 4, 5, 6, 11], "5v": [2, 5, 6], "tdh15": 2, "four": [2, 7, 8], "inpout": 2, "output": [2, 4, 5, 6, 7, 8], "three": [2, 3, 5, 6, 7, 8], "limit": [2, 7, 8, 11], "ma": [2, 5, 6, 7, 8], "higher": [2, 6], "than": [2, 5, 6], "just": [2, 6], "decreas": 2, "don": [2, 7, 8], "t": [2, 3, 7, 8], "forget": [2, 7, 8], "chang": [2, 3, 7, 8, 10], "config": [2, 5, 6, 7, 8, 10], "py": [2, 3, 5, 6, 7, 8, 10], "kei": 2, "r_shunt": 2, "ohmpi_config": 2, "dict": 2, "pre": [2, 4], "adjust": [2, 5, 6], "13": [2, 3, 4, 5, 6], "17": [2, 4, 5, 6], "18": [2, 4, 5, 6, 7, 8], "19": [2, 4, 5, 6], "view": [2, 4], "fix": [2, 4], "dot": 2, "mark": [2, 4], "top": [2, 4, 7, 8], "left": [2, 4], "corner": 2, "21": [2, 4, 5, 6], "mount": [2, 3, 4, 5, 6], "22": [2, 4, 5, 6], "lm158": 2, "amplifi": [2, 5, 6], "ads115": [2, 5, 6], "right": [2, 4], "3x11": 2, "wurth": 2, "elektronik": 2, "971110321": 2, "305": [2, 3], "apm": [2, 3], "hexseal": [2, 3], "rm3x8mm": [2, 3], "2701": [2, 3], "jjse": [2, 3], "2f12mkns3vxsdryxuhw": [2, 3], "shutdown": 2, "unplug": 2, "bottom": [2, 5, 6], "11mm": 2, "m3": [2, 3], "upper": 2, "port": [2, 4], "write": [2, 3, 5, 6, 7, 8, 10], "i2cdetect": [2, 3], "y": [2, 3], "everyth": 2, "address": [2, 5, 6, 7, 8], "screen": [2, 5, 6], "equival": [2, 5, 6], "need": [2, 3, 5, 6, 7, 8], "1kohm": 2, "r2": [2, 5, 6], "220": 2, "r1": [2, 5, 6], "padboard": 2, "spool": 2, "prepar": [2, 3, 5, 6], "batteri": [2, 4, 5, 6, 7, 8], "red": [2, 4, 5, 6, 7, 8], "black": [2, 4, 5, 6], "ground": [2, 5, 6], "thonni": [2, 7, 8], "sample_measurement_exampl": 2, "exampl": [2, 3, 4, 5, 6, 7, 8], "result": [2, 5, 6], "channel": [3, 5, 6], "mechan": [3, 5, 6, 7, 8], "omron": 3, "g5le": 3, "vd": 3, "vdc": 3, "combin": 3, "zvn4206a": 3, "mofset": 3, "onli": [3, 10], "30": [3, 5, 6], "enough": [3, 5, 6], "activ": [3, 7, 8], "repres": [3, 5, 6], "512": 3, "expand": 3, "mcp23017": 3, "from": [3, 4, 5, 6, 7, 8], "128": [3, 7, 8], "own": 3, "0x70": 3, "0x77": 3, "0x71": 3, "0x72": 3, "0x73": 3, "140": 3, "560": 3, "62": 3, "92": [3, 5, 6], "1580994": 3, "tru": [3, 5, 6], "diod": 3, "1n4007": 3, "256": 3, "091": 3, "296": 3, "incorpor": [3, 7, 8], "sgaepimzzmueqxo7l": 3, "2fbpyakboruumren": 3, "56": 3, "776": 3, "205": 3, "46": 3, "103321": 3, "5twgzeq9e7hsylqaljjyrw": 3, "i": [3, 4, 5, 6, 7, 8], "40": [3, 5, 6, 7, 8], "732": 3, "sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi": 3, "27": [3, 4, 5, 6, 11], "325": 3, "over": 3, "503811": 3, "mosfet": 3, "nchannel": 3, "471": 3, "576": [3, 5], "vhuuswq2": 3, "252bsz9b": 3, "2ff6fcxt7g": 3, "100k\u03c9": 3, "061": 3, "616": 3, "beyschlag": 3, "mba02040c1003frp00": 3, "mzrxyrlhvdt9crf7zyf": 3, "2f5q": 3, "89": 3, "2717": 3, "sgaepimzzmsyydr3r27av4eqf73yoh": 3, "252baqg": 3, "252bz3hvktao": 3, "10120558": 3, "54": 3, "No": 3, "51": 3, "741727": 3, "10120862": 3, "connector": [3, 4, 5, 6], "strain": 3, "relief": 3, "44": [3, 5, 6], "742063": 3, "10120158": 3, "ribbon": [3, 4], "x": [3, 5, 6], "mm\u00b2": [3, 5, 6], "multi": [3, 5, 6, 7, 8], "colour": 3, "1012015810": 3, "127": 3, "008": 3, "1548658": 3, "hex": [3, 4], "25": [3, 4, 5, 6, 7, 8], "79": 3, "49": 3, "keyston": 3, "24300": 3, "uwqyq": 3, "2f2czwu0ejpozmzc2a": 3, "745": 3, "846": 3, "614": 3, "25515": 3, "2f2czwuxuhumfr": 3, "252bzuq": 3, "55": [3, 5, 6], "328": 3, "uqd7xcvsscnr3hwd6fta8g": 3, "100": [3, 5, 6, 7, 8], "duplic": 3, "everi": [3, 7, 8], "build": [3, 5, 6], "therefor": [3, 5, 6], "identifi": 3, "assign": 3, "alloc": 3, "here": [3, 4, 6], "default": [3, 7, 8], "jumper": 3, "note": [3, 4, 5, 6], "name": [3, 5, 6, 7, 8, 10], "zoom": [3, 4], "befor": [3, 4, 5, 6, 7, 8], "them": [3, 5, 6, 7, 8], "definit": 3, "simplifi": 3, "thing": [3, 7, 8], "do": [3, 4, 7, 8, 10], "50": [3, 4, 5, 6, 7, 8], "cm": [3, 4, 5, 6], "long": [3, 4], "flat": 3, "pole": [3, 5, 6], "detect": 3, "script": [3, 7, 8, 10], "test_mux_board": 3, "cut": 4, "compos": 4, "proper": 4, "length": [4, 5, 6], "about": 4, "correspond": [4, 5], "crimp": [4, 5, 6], "idc": 4, "suitabl": [4, 5, 6, 7, 8], "clamp": 4, "pai": [4, 5, 6], "attent": [4, 5, 6], "direct": [4, 5, 6, 7, 8], "unbalanc": 4, "perpendicular": 4, "possibl": [4, 5, 6], "same": [4, 5, 6, 7, 8], "flush": 4, "posit": [4, 5, 6], "abov": [4, 5, 6], "mux": [4, 5, 6, 7, 8], "profil": 4, "color": 4, "yellow": 4, "tin": 4, "end": [4, 5, 6], "shown": [4, 5, 6], "pictur": 4, "ii": 4, "gnd": [4, 5, 6], "nois": 4, "often": 4, "heard": 4, "when": [4, 5, 6, 7, 8, 10], "clip": 4, "place": [4, 5, 6, 10], "second": [4, 5, 6, 7, 8], "b": [4, 7, 8], "help": [4, 7, 8, 10], "previou": [4, 7, 8], "procedur": 4, "repeat": [4, 5, 6, 7, 8], "other": [4, 5, 6, 7, 8], "purpl": 4, "relev": [4, 10], "defin": [4, 7, 8, 10], "third": [4, 7, 8], "fourth": 4, "nylon": 4, "photograph": 4, "more": [4, 7, 8], "detail": [4, 5, 7, 8], "4th": 4, "togeth": [4, 5, 6], "tie": 4, "pvc": 4, "plate": 4, "minimum": 4, "dimens": 4, "200": 4, "150": [4, 5, 6, 7, 8], "drill": 4, "remain": [4, 5, 6], "metal": 4, "tighten": 4, "so": [4, 5, 6], "usb": 4, "hole": [4, 5, 6], "26": [4, 5, 6], "add": [4, 5, 6], "attach": 4, "washer": 4, "nut": 4, "28": 4, "29": [4, 5, 6], "come": 4, "pass": [4, 7, 8], "brown": 4, "blue": [4, 5, 6], "block": [4, 5, 6], "secur": [4, 7, 8], "33": 4, "34": 4, "37": [4, 5, 6], "38": [4, 5, 6], "os": [4, 7, 8], "monitor": [4, 5, 6, 7, 8], "deliv": [4, 5, 6], "12vdc": 4, "enjoi": 4, "publish": [5, 7, 8], "journal": 5, "howev": [5, 6, 10], "correct": [5, 6], "bug": 5, "exist": [5, 6, 10], "explain": 5, "miss": 5, "point": [5, 6, 7, 8], "invit": 5, "v1": [5, 6, 7, 8], "offer": [5, 6, 7, 8], "commerci": [5, 6], "avail": [5, 6, 7, 8, 10], "field": [5, 6, 7, 8], "specif": [5, 6, 10], "temperatur": [5, 6, 7, 8], "c": [5, 6, 7, 8], "consumpt": [5, 6, 7, 8], "cpu": [5, 6, 7, 8], "control": [5, 6, 7, 8], "w": [5, 6, 7, 8], "min": [5, 6, 7, 8], "puls": [5, 6, 7, 8], "durat": [5, 6, 7, 8], "ms": [5, 6, 7, 8], "imped": [5, 6, 7, 8], "storag": [5, 6, 7, 8], "resolut": [5, 6, 7, 8], "o1": [5, 6], "step": [5, 6, 10], "youtub": [5, 6], "wjwzhv1v3pk": [5, 6], "noob": [5, 6], "simpl": [5, 6], "sure": [5, 6, 7, 8, 10], "unexpectedli": [5, 6], "boot": [5, 6], "cd": [5, 6], "gnu": [5, 6], "nano": [5, 6], "editor": [5, 6, 7, 8], "At": [5, 6], "op": [5, 6], "dl": [5, 6], "press": [5, 6], "ctrl": [5, 6], "enter": [5, 6], "escap": [5, 6], "return": [5, 6, 7, 8], "wa": [5, 6], "introduc": [5, 6, 7, 8, 10], "Its": [5, 6], "studi": [5, 6], "hous": [5, 6], "design": [5, 6, 7, 8, 10], "diagram": [5, 6], "displai": [5, 6], "mimic": [5, 6], "behavior": [5, 6], "soil": [5, 6], "subject": [5, 6], "r11": [5, 6], "r10": [5, 6], "r12": [5, 6], "constitut": [5, 6], "thei": [5, 6, 7, 8], "typic": [5, 6, 7, 8, 10], "made": [5, 6, 7, 8], "stainless": [5, 6], "steel": [5, 6], "seri": [5, 6], "part": [5, 6, 7, 8, 10], "r9": [5, 6], "ad": [5, 6, 7, 8], "flow": [5, 6, 7, 8], "order": [5, 6, 7, 8, 10], "less": [5, 6], "sum": [5, 6], "inde": [5, 6], "000": [5, 6], "intens": [5, 6], "potenti": [5, 6], "calcul": [5, 6], "insert": [5, 6], "1115": [5, 6], "our": [5, 6, 7, 8], "a1": [5, 6], "a0": [5, 6], "increas": [5, 6], "track": [5, 6, 10], "divid": [5, 6], "bridg": [5, 6], "r5": [5, 6], "r8": [5, 6], "r6": [5, 6], "r7": [5, 6], "accord": [5, 6, 10], "n": [5, 6, 7, 8], "a2": [5, 6], "a3": [5, 6], "obtain": [5, 6], "ly": [5, 6], "rang": [5, 6, 10], "let": [5, 6], "equal": [5, 6], "multipli": [5, 6], "reduct": [5, 6], "section": [5, 6, 7, 8, 10], "despit": [5, 6], "high": [5, 6], "e": [5, 6, 7, 8], "accur": [5, 6], "still": [5, 6], "calibr": [5, 6], "voltmet": [5, 6], "variou": [5, 6], "These": [5, 6, 7, 8], "serv": [5, 6, 7, 8], "With": [5, 6], "disturb": [5, 6], "being": [5, 6], "estim": [5, 6], "mega": [5, 6], "shortcut": [5, 6], "excess": [5, 6], "whose": [5, 6, 7, 8], "lithium": [5, 6], "ion": [5, 6], "automobil": [5, 6], "lead": [5, 6], "acid": [5, 6], "strong": [5, 6], "hazard": [5, 6], "fuse": [5, 6], "repositori": [5, 6, 7, 8], "onto": [5, 6], "illustr": [5, 6, 7, 8], "ohmmet": [5, 6], "coeffici": [5, 6], "coef_p0": [5, 6], "coef_p1": [5, 6], "coef_p2": [5, 6], "coef_p3": [5, 6], "coef": [5, 6], "po": [5, 6], "p1": [5, 6], "r3": [5, 6], "r4": [5, 6], "p2": [5, 6], "p3": [5, 6], "r_ref": [5, 6], "slope": [5, 6], "convers": [5, 6], "p0": [5, 6], "accuraci": [5, 6], "both": [5, 6, 10], "addit": [5, 6, 7, 8], "lm358n": [5, 6], "appli": [5, 6], "prefer": [5, 6, 7, 8], "weaker": 5, "stronger": [5, 6], "tx": [5, 6], "rememb": [5, 6], "holder": [5, 6], "f": [5, 6], "consist": [5, 6], "circul": [5, 6], "through": [5, 6, 7, 8], "fig": [5, 6], "modul": [5, 6, 10], "switch": [5, 6], "common": [5, 6], "neg": [5, 6], "normal": [5, 6], "simultan": [5, 6], "role": [5, 6], "revers": [5, 6], "polar": [5, 6], "thu": [5, 6], "energ": [5, 6], "solut": [5, 6, 10], "manag": [5, 6, 7, 8], "next": [5, 6], "featur": [5, 6], "strict": [5, 6], "in1": [5, 6], "in2": [5, 6], "in3": [5, 6], "in4": [5, 6], "5vdc": [5, 6], "5vcc": [5, 6], "now": [5, 6], "mm2": [5, 6], "lastli": [5, 6], "congratul": [5, 6], "construct": [5, 6], "valid": [5, 6, 7, 8], "conduct": [5, 6, 10], "manual": [5, 6, 7, 8], "practic": [5, 6, 10], "ert": [5, 6], "sever": [5, 6], "ten": [5, 6], "thousand": [5, 6], "arrai": [5, 6, 7, 8], "stuck": [5, 6], "enabl": [5, 6, 7, 8], "smaller": [5, 6], "hand": [5, 6], "entir": [5, 6, 7, 8], "cap": [5, 6], "produc": [5, 6], "clean": [5, 6], "distanc": [5, 6], "had": [5, 6], "extra": [5, 6], "As": [5, 6], "final": [5, 6], "actual": [5, 6], "singl": [5, 6, 7, 8, 10], "protocol": [5, 6, 7, 8], "horizont": [5, 6], "vertic": [5, 6], "06": [5, 6], "04": [5, 6], "09": [5, 6], "05": [5, 6], "din": [5, 6], "rail": [5, 6], "chosen": [5, 6], "consequ": [5, 6], "incom": [5, 6], "instead": [5, 6], "moreov": [5, 6], "turn": [5, 6], "bought": [5, 6], "down": [5, 6], "velleman": [5, 6], "wpm404": [5, 6], "potentiomet": [5, 6], "download": [5, 6, 7, 8], "scienc": [5, 6], "framework": [5, 6], "manuscript": [5, 6], "osf": [5, 6], "io": [5, 6], "dzwb4": [5, 6], "gitlab": [5, 6, 7, 8], "irstea": [5, 6], "unzip": [5, 6], "master": [5, 6], "readm": [5, 6], "assist": [5, 6], "disconnect": [5, 6], "handl": [5, 6, 7, 8], "charg": [5, 6], "full": [5, 6], "capac": [5, 6], "fewer": [5, 6], "bank": [5, 6], "2a": [5, 6], "ll": [5, 6], "insid": [5, 6], "abmn": [5, 6, 7, 8], "quadrupol": [5, 6, 7, 8], "numer": [5, 6], "some": [5, 6, 7, 8, 10, 11], "main": [5, 6, 7, 8], "optim": [5, 6], "attribut": [5, 6], "stack": [5, 6, 7, 8], "the9": [5, 6], "hear": [5, 6], "characterist": [5, 6], "sound": [5, 6], "permut": [5, 6], "csv": [5, 6], "nb_electrod": [5, 6, 7, 8], "maximum": [5, 6, 7, 8], "injection_dur": [5, 6, 7, 8], "nbr_mea": [5, 6, 7, 8], "sequenc": [5, 6, 7, 8], "sequence_delai": [5, 6, 7, 8], "delai": [5, 6], "repetit": [5, 6], "evolv": [5, 6], "littl": [5, 6], "public": [5, 6], "articl": [5, 6], "date": [5, 6, 11], "sainsmart": [5, 6], "canal": 5, "pour": 5, "arduino": 5, "dsp": 5, "avr": 5, "pic": 5, "arm": 5, "99": [5, 6], "199": [5, 6], "sain": [5, 6], "smart": [5, 6], "101": [5, 6], "70": [5, 6], "103": [5, 6], "018": [5, 6], "1x1": [5, 6], "66": [5, 6], "1568649": [5, 6], "1x0": [5, 6], "71": [5, 6], "1565235": [5, 6], "68": [5, 6], "rs": [5, 6], "pro": [5, 6], "897": [5, 6], "1332": [5, 6], "858": [5, 6], "627": [5, 6], "52": [5, 6], "upw50b50rv": [5, 6], "1083": [5, 6], "7ah": [5, 6], "537": [5, 6], "5488": [5, 6], "lr20": [5, 6], "9v": [5, 6], "185": [5, 6], "4686": [5, 6], "ferrul": [5, 6], "500": [5, 6], "piec": [5, 6], "weidmul": [5, 6], "9004330000": [5, 6], "966067": [5, 6], "car": 5, "littelfus": [5, 6], "fhac0002zxj": 5, "96": 5, "improv": [6, 7, 8, 10], "upgrad": [6, 7, 8], "01": [6, 7, 8, 11], "replac": [6, 10], "trn3": 6, "suppress": 6, "10v": 6, "fast": 6, "decoupl": 6, "last": 6, "veri": [6, 10], "prevent": 6, "overh": 6, "toler": 6, "orient": 6, "h": 6, "nf": 6, "tabl": 6, "jason": 6, "ohmpi_param": 6, "json": [6, 7, 8], "export_path": 6, "desktop": 6, "0251001": 6, "pat1l": 6, "box": [7, 8], "mani": [7, 8], "dii": [7, 8], "laps": [7, 8], "seek": [7, 8], "share": [7, 8, 10], "wish": [7, 8], "2023": [7, 8, 11], "stop": [7, 8], "0x": [7, 8], "effort": [7, 8], "paramet": [7, 8], "80": [7, 8], "virtual": [7, 8], "environ": [7, 8], "packag": [7, 8], "id": [7, 8], "summar": [7, 8], "cover": [7, 8], "acquisit": [7, 8], "separ": [7, 8], "ohmpi_set": [7, 8], "central": [7, 8], "class": [7, 8, 10], "interact": [7, 8, 10], "handler": [7, 8], "layer": [7, 8], "releas": [7, 8, 11], "excel": [7, 8], "log": [7, 8], "implement": [7, 8, 10, 11], "broker": [7, 8], "zip": [7, 8], "rotat": [7, 8], "disk": [7, 8], "exec_logg": [7, 8], "data_logg": [7, 8], "plan": [7, 8], "state": [7, 8], "health": [7, 8], "soh": [7, 8], "futur": [7, 8], "By": [7, 8], "written": [7, 8], "consol": [7, 8], "like": [7, 8], "store": [7, 8, 10], "local": [7, 8], "dai": [7, 8], "size": [7, 8], "exce": [7, 8], "sent": [7, 8], "level": [7, 8], "advanc": [7, 8], "edit": [7, 8], "setup_logg": [7, 8], "custom": [7, 8], "desir": [7, 8], "usernam": [7, 8], "password": [7, 8], "One": [7, 8], "understand": [7, 8], "alter": [7, 8], "keep": [7, 8], "bash": [7, 8], "run_http_interfac": [7, 8], "sh": [7, 8], "api": [7, 8, 11], "import": [7, 8, 10], "iot": [7, 8], "messag": [7, 8], "friendli": [7, 8], "graphic": [7, 8], "quick": [7, 8], "easi": [7, 8], "wi": [7, 8], "fi": [7, 8], "ap": [7, 8], "webserv": [7, 8], "index": [7, 8], "html": [7, 8], "laptop": [7, 8], "mobil": [7, 8], "phone": [7, 8], "upload": [7, 8], "act": [7, 8], "raspap": [7, 8], "runonstart": [7, 8], "itself": [7, 8], "141": [7, 8], "8080": [7, 8], "pseudo": [7, 8], "evolut": [7, 8], "appar": [7, 8], "especi": [7, 8], "suit": [7, 8], "autom": [7, 8], "ipython": [7, 8], "ssh": [7, 8], "putti": [7, 8], "maco": [7, 8], "linux": [7, 8], "found": [7, 8], "np": [7, 8], "chdir": [7, 8], "object": [7, 8], "k": [7, 8], "load": [7, 8], "nb_stack": [7, 8], "half": [7, 8], "cycl": [7, 8], "updat": [7, 8], "update_set": [7, 8], "shape": [7, 8], "set_sequ": [7, 8], "n2": [7, 8], "string": [7, 8], "load_sequ": [7, 8], "rs_check": [7, 8], "synchron": [7, 8], "wait": [7, 8], "prompt": [7, 8], "run_sequ": [7, 8], "run_sequence_async": [7, 8], "thread": [7, 8], "immedi": [7, 8], "sleep": [7, 8], "interrupt": [7, 8], "kill": [7, 8], "asynchron": [7, 8], "given": [7, 8], "interv": [7, 8], "nb_mea": [7, 8], "run_multiple_sequ": [7, 8], "taken": [7, 8], "switch_mux_on": [7, 8], "run_measur": [7, 8], "switch_mux_off": [7, 8], "risk": [7, 8], "short": [7, 8], "argument": [7, 8], "autogain": [7, 8], "true": [7, 8], "good": [7, 8], "usag": [7, 8], "process": [7, 8], "sensor": [7, 8], "scope": [7, 8], "internet": [7, 8], "network": [7, 8], "auxiliari": [7, 8], "subscrib": [7, 8], "approach": [7, 8], "mosquitto": [7, 8], "server": [7, 8], "reachabl": [7, 8], "net": [7, 8], "servic": [7, 8], "install_local_mqtt_brok": [7, 8], "examin": [7, 8], "easili": [7, 8, 10], "parti": [7, 8], "explor": [7, 8], "receiv": [7, 8], "reboot": [7, 8], "further": [7, 8], "format": [7, 8], "kwarg": [7, 8], "cmd_id": [7, 8], "3fzxv121uitwgjwygcz4xw": [7, 8], "cmd": [7, 8], "3fzxv121uitwgjwygcz4yw": [7, 8], "tailor": [7, 8], "dashboard": [7, 8], "browser": [7, 8], "node": [7, 8], "complex": [7, 8], "properli": [7, 8], "palett": [7, 8], "noder": [7, 8], "doc": [7, 8], "guid": [7, 8], "ui": [7, 8], "visual": [7, 8], "cookbook": [7, 8], "draft": 10, "TO": 10, "BE": 10, "review": 10, "intend": 10, "advic": 10, "best": 10, "contribut": 10, "maintain": 10, "promot": 10, "exchang": 10, "reus": 10, "contributor": 10, "ideal": 10, "few": 10, "distinguish": 10, "deal": 10, "compli": 10, "Such": 10, "focu": 10, "reduc": 10, "newli": 10, "expos": 10, "minim": 10, "hardware_system": 10, "discuss": 10, "ohmpi_hardwar": 10, "initi": 10, "earli": 10, "stage": 10, "investig": 10, "strategi": 10, "readi": 10, "conceiv": 10, "kicad": 10, "schema": 10, "alwai": 10, "branch": 10, "python": 10, "similar": 10, "hardware_compon": 10, "abstract": 10, "abstract_hardware_compon": 10, "method": 10, "configur": [10, 11], "hardware_config": 10, "dictionari": 10, "config_xxx": 10, "xxx": 10, "nov": 11, "juli": 11, "2016": 11, "target": 11, "research": 11, "statu": 11, "matur": 11, "progress": 11, "offici": 11, "guidelin": 11, "tutori": 11, "content": 11, "partner": 11, "cite": 11, "introduct": 11, "technic": 11, "v2023": 11, "tow": 2}, "objects": {"": [[9, 0, 0, "-", "ohmpi"]]}, "objtypes": {"0": "py:module"}, "objnames": {"0": ["py", "module", "Python module"]}, "titleterms": {"ohmpi": [0, 4, 5, 6, 7, 8, 11], "project": 0, "author": 0, "partner": 0, "cite": 0, "introduct": 0, "step": [1, 2, 3, 4, 7, 8], "n": [1, 2, 3, 4], "1": [1, 5, 6], "raspberri": [1, 5, 6], "pi": [1, 5, 6], "configur": [1, 5, 6, 7, 8], "part": [1, 2, 3], "A": [1, 2, 3], "os": [1, 5, 6], "instal": [1, 5, 6], "b": [1, 2, 3, 5, 6], "virtual": [1, 5, 6], "environ": [1, 5, 6], "packag": [1, 5, 6], "c": [1, 2, 3], "activ": [1, 5, 6], "thonni": [1, 5, 6], "python": [1, 5, 6, 7, 8], "id": [1, 5, 6], "2": 2, "measur": [2, 5, 6], "board": [2, 3, 5, 6], "assembl": [2, 3, 4, 5, 6], "requir": [2, 3], "compon": [2, 3, 5, 6, 10], "list": [2, 3, 5, 6], "descript": [2, 5, 6], "start": 2, "up": 2, "check": 2, "3": 3, "mux": 3, "address": 3, "valid": 3, "4": 4, "v": [5, 6], "01": 5, "limit": [5, 6], "32": [5, 6], "electrod": [5, 6, 7, 8], "The": [5, 6, 7, 8], "philosophi": [5, 6, 7, 8], "technic": [5, 6], "data": [5, 6], "current": [5, 6], "inject": [5, 6], "card": [5, 6], "connect": [5, 6], "electr": [5, 6], "resist": [5, 6, 11], "implement": [5, 6], "first": [5, 6], "four": [5, 6], "multiplex": [5, 6], "oper": [5, 6, 7, 8], "instruct": [5, 6], "preliminari": [5, 6], "procedur": [5, 6], "onli": [5, 6], "initi": [5, 6], "startup": [5, 6], "paramet": [5, 6], "complet": [5, 6], "tabl": 5, "titl": 5, "02": 6, "v2023": [7, 8], "64": [7, 8], "12v": [7, 8], "hardwar": [7, 8, 10, 11], "specif": [7, 8], "build": [7, 8], "an": [7, 8], "softwar": [7, 8, 10], "system": [7, 8], "architectur": [7, 8], "logger": [7, 8], "file": [7, 8], "interfac": [7, 8, 10], "applic": [7, 8], "web": [7, 8], "mqtt": [7, 8], "api": 9, "refer": 9, "new": 10, "open": 11, "sourc": 11, "meter": 11, "summari": 11, "document": 11, "center": 11}, "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/source/Ohmpi_V2023/V2023_step_02.rst b/doc/source/Ohmpi_V2023/V2023_step_02.rst index 763078b49d46d2f6dbeb2e9175f694ff76f636cc..c7b7622c9918815e532eb455507ea085a8dbd3ec 100644 --- a/doc/source/Ohmpi_V2023/V2023_step_02.rst +++ b/doc/source/Ohmpi_V2023/V2023_step_02.rst @@ -188,7 +188,7 @@ which allows to realize precise current measurement around a shunt resistor. The +---------+------------------------------------------------------------+ | | .. image:: step_n_2/a/14_mes_board.jpg | |14 +------------------------------------------------------------+ - | | 1 MOhm resistors | + | | 1 MOhm resistors | | | | +---------+------------------------------------------------------------+ @@ -198,7 +198,7 @@ which allows to realize precise current measurement around a shunt resistor. The +---------+------------------------------------------------------------+ | | .. image:: step_n_2/a/15_mes_board.jpg | |15 +------------------------------------------------------------+ - | | Soldering tow 1 kOhm resistors | + | | Soldering tow 1 kOhm resistors | | | | +---------+------------------------------------------------------------+ diff --git a/doc/source/V2024_rc.rst b/doc/source/V2024_rc.rst new file mode 100644 index 0000000000000000000000000000000000000000..3b7c7486058b2f5aa91443199dcae18cabbc1b4c --- /dev/null +++ b/doc/source/V2024_rc.rst @@ -0,0 +1,326 @@ +******************************************** +OhmPi V2023 (64 electrodes and 12V) +******************************************** + +.. 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.** + + + +.. figure:: image_ohmpi_2.jpg + :width: 400px + :align: center + :height: 350px + :alt: OhmPi V: 2023.0.0-rc1 + :figclass: align-center + +.. note:: + In this version, we have developed two new board types that allow the assembly of OhmPi v2023, a measurement board and a multiplexer board. + This new version is made up of: + + 1. A measurement board for four-point measurement + + 2. 4 multiplexer cards + + 3. A box + + The OhmPi V2023 software has been adapted to handle this new boards and also includes many new functionalities. + +The philosophy of OhmPi +======================== + +The philosophy of OhmPi V2023 is to offer a new DIY multi-electrode resistivity meter. It is a resistivity meter with 64 electrodes, which can be upgraded to 128 electrodes. +It is limited to low-current injection, but suitable for small laboratory experiments and small field time-lapse monitoring. +OhmPi is developed by a team that seeks to share its experience and wishes to improve and offer a more and more robust tool to the community. OhmPi 2023 is completely different version from the previous one. +We will stop the development on the version V1.0x, to dedicate our efforts on this new version. + +============================================================================================================================================================= + +Hardware +======== + +Specifications +-------------- + ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +| **Parameter** | **V1.0x** | Units | **v2023** | Units | ++===============================+=======================+===========+=======================+===========+ +|Electrodes |32 | |64 to 128 | | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Operating temperature |-0 to 50 |°c |-25 to 50 |°C | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Power consumption of CPU and |18.5 |W |18.5 |W | +|control system | | | | | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Voltage injection |12 |V |12 |V | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Battery |9 |V |12 |V | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Current |0 to 40 |mA |0 to 40 |mA | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Min pulse duration |150 |ms |150 |ms | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Input impedance |80 |MOhm |80 |MOhm | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Data storage |micro SD card | |micro SD card | | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ +|Resolution |0.01 |Ohm |0.01 |Ohm | ++-------------------------------+-----------------------+-----------+-----------------------+-----------+ + +Building an OhmPi V2023 step by step +------------------------------------ + +.. toctree:: + :maxdepth: 2 + + Ohmpi_V2023/V2023_step_01 + Ohmpi_V2023/V2023_step_02 + Ohmpi_V2023/V2023_step_03 + Ohmpi_V2023/V2023_step_04 + + +Software and operation +====================== + +System architecture +------------------- + +The OhmPi V2023 software is designed around a new architecture whose main components are summarized in the figure below. + +.. 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/>`_.