diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle index d8334135f0ed4c5adc033502222c9b37045fc315..a9ba1d240b6a63b7053608d8f3e7bc7c9887a44a 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 95cb54e02f92af0201de828886c5f1231e683780..a255fc85ba69a23eca717a20f27899f4f4268ef7 100644 Binary files a/doc/build/doctrees/index.doctree and b/doc/build/doctrees/index.doctree differ diff --git a/doc/build/doctrees/source_rst/Ohmpi.doctree b/doc/build/doctrees/source_rst/Ohmpi.doctree index bd22e2d0c2f21af04474b7af2d4bec038b971434..efc8dc3d75cf90f76143708445c73995fcb38762 100644 Binary files a/doc/build/doctrees/source_rst/Ohmpi.doctree and b/doc/build/doctrees/source_rst/Ohmpi.doctree differ diff --git a/doc/build/doctrees/source_rst/V2023.x.x/V2023.doctree b/doc/build/doctrees/source_rst/V2023.x.x/V2023.doctree index 9b31327fc0e761953dba40cff4a6dd0f66d87468..ddf92e4f1fae32e460009bbaec34b5d649f8f7aa 100644 Binary files a/doc/build/doctrees/source_rst/V2023.x.x/V2023.doctree and b/doc/build/doctrees/source_rst/V2023.x.x/V2023.doctree differ diff --git a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_01.doctree b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_01.doctree index 7d8739e6d0b9d058083af0e66f8a1dc4f3b18d7f..dc616ae514ac1290f2a7d100931600f81d02aabc 100644 Binary files a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_01.doctree and b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_01.doctree differ diff --git a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_02.doctree b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_02.doctree index 72f991a7a58907d9b43deabcbea6fa60799b27d3..a1e03ff5a9052b6322e17064e674df49b73cae05 100644 Binary files a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_02.doctree and b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_02.doctree differ diff --git a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_03.doctree b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_03.doctree index effb95c67c42d018fc570322ba67fb9bdf154911..56dbcca4158a30e65bae160a7ec90a8d915f3b06 100644 Binary files a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_03.doctree and b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_03.doctree differ diff --git a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_04.doctree b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_04.doctree index 3b3a27370d006aaf8b9aac311d2ebbcd16cd6af9..073b03c40bd25d7b630e715b727385339314006b 100644 Binary files a/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_04.doctree and b/doc/build/doctrees/source_rst/V2023.x.x/V2023_step_04.doctree differ diff --git a/doc/build/doctrees/source_rst/V2024.x.x/V2024.doctree b/doc/build/doctrees/source_rst/V2024.x.x/V2024.doctree index eb218d1b6d0d15fbc9f422471403fa79de68f527..b54f7a906ca72b0874cfbd67d725a63603269e7f 100644 Binary files a/doc/build/doctrees/source_rst/V2024.x.x/V2024.doctree and b/doc/build/doctrees/source_rst/V2024.x.x/V2024.doctree differ diff --git a/doc/build/doctrees/source_rst/api.doctree b/doc/build/doctrees/source_rst/api.doctree index 6a5c36f771c73f3241c4ea7fe3762c264f390696..00e755dc46e153ec0b14c884bbdfc763f778f3cb 100644 Binary files a/doc/build/doctrees/source_rst/api.doctree and b/doc/build/doctrees/source_rst/api.doctree differ diff --git a/doc/build/doctrees/source_rst/developing_hardware_components.doctree b/doc/build/doctrees/source_rst/developing_hardware_components.doctree index 115d0129a2d1ca304d5c08d0fb80afe6f947d5f4..caea739389fede1daace55f9eb84a13c809e4834 100644 Binary files a/doc/build/doctrees/source_rst/developing_hardware_components.doctree and b/doc/build/doctrees/source_rst/developing_hardware_components.doctree differ diff --git a/doc/build/doctrees/source_rst/v1.xx/V1_01.doctree b/doc/build/doctrees/source_rst/v1.xx/V1_01.doctree index 58b3cec9414e338bb08a07b9037e4811b8ae4bba..9d17d048ac94ef901435d90f9adf4b99f63babfc 100644 Binary files a/doc/build/doctrees/source_rst/v1.xx/V1_01.doctree and b/doc/build/doctrees/source_rst/v1.xx/V1_01.doctree differ diff --git a/doc/build/doctrees/source_rst/v1.xx/V1_02.doctree b/doc/build/doctrees/source_rst/v1.xx/V1_02.doctree index 266ee95ac39e61c8ac36c9455adf5ee9f3c661f1..3097a84106849387df1396299b3e554423143814 100644 Binary files a/doc/build/doctrees/source_rst/v1.xx/V1_02.doctree and b/doc/build/doctrees/source_rst/v1.xx/V1_02.doctree differ diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo index d1015364de8e443b407af79cdd0a28cc3f114414..13254cbf7ce9abfdccb81af4d3a0176ba3173f7b 100644 --- a/doc/build/html/.buildinfo +++ b/doc/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 632d0e889a8fba89da2489b9424a452f +config: ca7e0a74d2b6886c0b281f49e446eff0 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/_static/_sphinx_javascript_frameworks_compat.js b/doc/build/html/_static/_sphinx_javascript_frameworks_compat.js index 8549469dc29fac0cbf16d10355e3313897cb3752..81415803ec2750c82251e896e7eb7b0ac842dac1 100644 --- a/doc/build/html/_static/_sphinx_javascript_frameworks_compat.js +++ b/doc/build/html/_static/_sphinx_javascript_frameworks_compat.js @@ -1,20 +1,9 @@ -/* - * _sphinx_javascript_frameworks_compat.js - * ~~~~~~~~~~ - * - * Compatability shim for jQuery and underscores.js. - * - * WILL BE REMOVED IN Sphinx 6.0 - * xref RemovedInSphinx60Warning +/* Compatability shim for jQuery and underscores.js. * + * Copyright Sphinx contributors + * Released under the two clause BSD licence */ -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - - /** * small helper function to urldecode strings * diff --git a/doc/build/html/_static/basic.css b/doc/build/html/_static/basic.css index 088967717207949a5bf50138c5f253fd839b831f..30fee9d0f76a47aec5ef23e46adbf6bab4671eac 100644 --- a/doc/build/html/_static/basic.css +++ b/doc/build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -324,17 +328,17 @@ aside.sidebar { p.sidebar-title { font-weight: bold; } + nav.contents, aside.topic, - div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ + nav.contents, aside.topic, - div.topic { border: 1px solid #ccc; padding: 7px; @@ -375,7 +379,6 @@ div.sidebar > :last-child, aside.sidebar > :last-child, nav.contents > :last-child, aside.topic > :last-child, - div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; @@ -385,7 +388,6 @@ div.sidebar::after, aside.sidebar::after, nav.contents::after, aside.topic::after, - div.topic::after, div.admonition::after, blockquote::after { @@ -611,25 +613,6 @@ ul.simple p { margin-bottom: 0; } -/* Docutils 0.17 and older (footnotes & citations) */ -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -/* Docutils 0.18+ (footnotes & citations) */ aside.footnote > span, div.citation > span { float: left; @@ -654,8 +637,6 @@ div.citation > p:last-of-type:after { clear: both; } -/* Footnotes & citations ends */ - dl.field-list { display: grid; grid-template-columns: fit-content(30%) auto; @@ -668,10 +649,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -697,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -765,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/doc/build/html/_static/doctools.js b/doc/build/html/_static/doctools.js index c3db08d1c3896f616576ba6e6b96dc80fcfc50b9..d06a71d7518041301a303697d2a3c372648eb7bf 100644 --- a/doc/build/html/_static/doctools.js +++ b/doc/build/html/_static/doctools.js @@ -4,12 +4,19 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ "use strict"; +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + const _ready = (callback) => { if (document.readyState !== "loading") { callback(); @@ -18,73 +25,11 @@ const _ready = (callback) => { } }; -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - /** * Small JavaScript module for the documentation. */ const Documentation = { init: () => { - Documentation.highlightSearchWords(); Documentation.initDomainIndexTable(); Documentation.initOnKeyListeners(); }, @@ -126,51 +71,6 @@ const Documentation = { Documentation.LOCALE = catalog.locale; }, - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '<p class="highlight-link">' + - '<a href="javascript:Documentation.hideSearchWords()">' + - Documentation.gettext("Hide Search Matches") + - "</a></p>" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - /** * helper function to focus on search bar */ @@ -210,15 +110,11 @@ const Documentation = { ) return; - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; if (!event.shiftKey) { switch (event.key) { @@ -240,10 +136,6 @@ const Documentation = { event.preventDefault(); } break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); } } diff --git a/doc/build/html/_static/documentation_options.js b/doc/build/html/_static/documentation_options.js index ef993482188599e736bc8d933a19b0fb2814cf89..222d06a70309bcae46dd79f5984235fe4180ec2c 100644 --- a/doc/build/html/_static/documentation_options.js +++ b/doc/build/html/_static/documentation_options.js @@ -1,5 +1,4 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), +const DOCUMENTATION_OPTIONS = { VERSION: 'open hardware resistivity-meter', LANGUAGE: 'en', COLLAPSE_INDEX: false, @@ -10,5 +9,5 @@ var DOCUMENTATION_OPTIONS = { SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false, SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: false, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/doc/build/html/_static/language_data.js b/doc/build/html/_static/language_data.js index 2e22b06ab13bec689de4d1530b8b625bc6d69ae8..250f5665fa64b70c822190199b3b804b10f8b9d8 100644 --- a/doc/build/html/_static/language_data.js +++ b/doc/build/html/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/doc/build/html/_static/pygments.css b/doc/build/html/_static/pygments.css index 08bec689d3306e6c13d1973f61a01bee9a307e87..84ab3030a9329e5598877502bfa7f8a999af8535 100644 --- a/doc/build/html/_static/pygments.css +++ b/doc/build/html/_static/pygments.css @@ -17,6 +17,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #008400 } /* Generic.Inserted */ diff --git a/doc/build/html/_static/searchtools.js b/doc/build/html/_static/searchtools.js index ac4d5861f95f5c6161b846522d572532725aa275..7918c3fab3116026a6626a50bdc8966abc24b0b3 100644 --- a/doc/build/html/_static/searchtools.js +++ b/doc/build/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -57,14 +57,14 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, highlightTerms, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr] = item; + const [docName, title, anchor, descr, score, _filename] = item; let listItem = document.createElement("li"); let requestUrl; @@ -75,29 +75,35 @@ const _displayItem = (item, highlightTerms, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } - const params = new URLSearchParams(); - params.set("highlight", [...highlightTerms].join(" ")); let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + "?" + params.toString() + anchor; + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) - listItem.appendChild(document.createElement("span")).innerText = + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, highlightTerms) + Search.makeSearchSummary(data, searchTerms) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -116,15 +122,15 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, + searchTerms, highlightTerms, - searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), highlightTerms, searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, highlightTerms, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } @@ -155,10 +161,8 @@ const Search = { _pulse_status: -1, htmlToText: (htmlString) => { - const htmlElement = document - .createRange() - .createContextualFragment(htmlString); - _removeChildren(htmlElement.querySelectorAll(".headerlink")); + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); const docContent = htmlElement.querySelector('[role="main"]'); if (docContent !== undefined) return docContent.textContent; console.warn( @@ -239,6 +243,12 @@ const Search = { * execute search (requires search index to be loaded) */ query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -266,6 +276,10 @@ const Search = { } }); + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + // console.debug("SEARCH: searching for:"); // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); @@ -274,6 +288,40 @@ const Search = { let results = []; _removeChildren(document.getElementById("search-progress")); + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + // lookup as object objectTerms.forEach((term) => results.push(...Search.performObjectSearch(term, objectTerms)) @@ -320,7 +368,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, highlightTerms, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** @@ -401,8 +449,8 @@ const Search = { // prepare search const terms = Search._index.terms; const titleTerms = Search._index.titleterms; - const docNames = Search._index.docnames; const filenames = Search._index.filenames; + const docNames = Search._index.docnames; const titles = Search._index.titles; const scoreMap = new Map(); @@ -499,16 +547,15 @@ const Search = { /** * helper function to return a node containing the * search summary for a given text. keywords is a list - * of stemmed words, highlightWords is the list of normal, unstemmed - * words. the first one is used to find the occurrence, the - * latter for highlighting it. + * of stemmed words. */ - makeSearchSummary: (htmlText, keywords, highlightWords) => { - const text = Search.htmlToText(htmlText).toLowerCase(); + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); if (text === "") return null; + const textLower = text.toLowerCase(); const actualStartPosition = [...keywords] - .map((k) => text.indexOf(k.toLowerCase())) + .map((k) => textLower.indexOf(k.toLowerCase())) .filter((i) => i > -1) .slice(-1)[0]; const startWithContext = Math.max(actualStartPosition - 120, 0); @@ -516,13 +563,9 @@ const Search = { const top = startWithContext === 0 ? "" : "..."; const tail = startWithContext + 240 < text.length ? "..." : ""; - let summary = document.createElement("div"); + let summary = document.createElement("p"); summary.classList.add("context"); - summary.innerText = top + text.substr(startWithContext, 240).trim() + tail; - - highlightWords.forEach((highlightWord) => - _highlightText(summary, highlightWord, "highlighted") - ); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; return summary; }, diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html index b092dc4d774a49dbe6761f742e181c6a09b6246d..c3f6e8621c35bd9e40bd644f585fb3f435fe0bcf 100644 --- a/doc/build/html/genindex.html +++ b/doc/build/html/genindex.html @@ -10,11 +10,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="_static/documentation_options.js?v=c6fcd74b"></script> + <script src="_static/doctools.js?v=888ff710"></script> + <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="#" /> <link rel="search" title="Search" href="search.html" /> diff --git a/doc/build/html/index.html b/doc/build/html/index.html index 0710a34a6e04025d2738d333c362dda566dad8fe..02ed055b98c0cd577d9b7c56526adbfdb204e4de 100644 --- a/doc/build/html/index.html +++ b/doc/build/html/index.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="_static/documentation_options.js?v=c6fcd74b"></script> + <script src="_static/doctools.js?v=888ff710"></script> + <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> @@ -76,7 +76,7 @@ <div itemprop="articleBody"> <section id="ohmpi-open-source-and-open-hardware-resistivity-meter"> -<h1>OHMPI: Open source and open hardware resistivity-meter<a class="headerlink" href="#ohmpi-open-source-and-open-hardware-resistivity-meter" title="Permalink to this heading">ïƒ</a></h1> +<h1>OHMPI: Open source and open hardware resistivity-meter<a class="headerlink" href="#ohmpi-open-source-and-open-hardware-resistivity-meter" title="Link to this heading">ïƒ</a></h1> <aside class="sidebar"> <p class="sidebar-title">Summary</p> <dl class="field-list simple"> diff --git a/doc/build/html/py-modindex.html b/doc/build/html/py-modindex.html index 16a9f551e68dd18c19eb3733b4ae6a209296f102..c98ded08d0c76ca749d524099b232ce3edd99100 100644 --- a/doc/build/html/py-modindex.html +++ b/doc/build/html/py-modindex.html @@ -10,11 +10,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="_static/documentation_options.js?v=c6fcd74b"></script> + <script src="_static/doctools.js?v=888ff710"></script> + <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> diff --git a/doc/build/html/search.html b/doc/build/html/search.html index 860e74ffe506119dbd714cfd7d12f5b635707ecd..825601de72e9224f10f1885a9fb82be04a3cd5b4 100644 --- a/doc/build/html/search.html +++ b/doc/build/html/search.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="_static/documentation_options.js?v=c6fcd74b"></script> + <script src="_static/doctools.js?v=888ff710"></script> + <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <script src="_static/searchtools.js"></script> <script src="_static/language_data.js"></script> diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js index c21c7d279d5fa6920133d7226def4409112134ad..314a2e0098e8dee2ea98586ef5d6af791b176911 100644 --- a/doc/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "source_rst/Ohmpi", "source_rst/V2023.x.x/V2023", "source_rst/V2023.x.x/V2023_step_01", "source_rst/V2023.x.x/V2023_step_02", "source_rst/V2023.x.x/V2023_step_03", "source_rst/V2023.x.x/V2023_step_04", "source_rst/V2024.x.x/V2024", "source_rst/api", "source_rst/developing_hardware_components", "source_rst/v1.xx/V1_01", "source_rst/v1.xx/V1_02"], "filenames": ["index.rst", "source_rst\\Ohmpi.rst", "source_rst\\V2023.x.x\\V2023.rst", "source_rst\\V2023.x.x\\V2023_step_01.rst", "source_rst\\V2023.x.x\\V2023_step_02.rst", "source_rst\\V2023.x.x\\V2023_step_03.rst", "source_rst\\V2023.x.x\\V2023_step_04.rst", "source_rst\\V2024.x.x\\V2024.rst", "source_rst\\api.rst", "source_rst\\developing_hardware_components.rst", "source_rst\\v1.xx\\V1_01.rst", "source_rst\\v1.xx\\V1_02.rst"], "titles": ["OHMPI: Open source and open hardware resistivity-meter", "OhmPi project", "OhmPi V2023 (64 electrodes and 12V)", "<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 V2023 (64 electrodes and 12V)", "API reference", "Software interface to new hardware components", "OhmPi V 1.01 (limited to 32 electrodes)", "OhmPi V 1.02 (limited to 32 electrodes)"], "terms": {"r\u00e9mi": [0, 1], "clement": [0, 1], "vivien": [0, 1], "duboi": [0, 1], "nicola": [0, 1], "forquet": [0, 1], "inra": 1, "reversa": [1, 10, 11], "villeurbann": 1, "franc": 1, "yannick": [0, 1], "fargier": [0, 1], "ger": 1, "rro": 1, "univ": 1, "gustav": 1, "eiffel": 1, "ifsttar": 1, "lyon": 1, "h\u00e9l\u00e8ne": [0, 1], "guyard": [0, 1], "ig": 1, "grenobl": 1, "universit\u00e9": 1, "alp": 1, "olivi": [0, 1], "kaufmann": [0, 1], "arnaud": [0, 1], "watlet": [0, 1], "de": 1, "mon": 1, "belgium": 1, "guillaum": [0, 1], "blanchi": [0, 1], "ilvo": 1, "merelbek": 1, "julien": 1, "ganc": 1, "emil": 1, "gro": 1, "et": [1, 4], "al": 1, "an": [1, 3, 4, 5, 6, 9, 10, 11], "open": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "sourc": [1, 3, 9, 10, 11], "data": [0, 1, 2, 7], "logger": [1, 10, 11], "dedic": [1, 2, 7], "applic": [1, 9], "electr": [1, 4], "resist": [1, 2, 4, 6, 7], "imag": [1, 3], "small": [1, 2, 4, 6, 7, 10, 11], "laboratori": [1, 2, 6, 7, 10, 11], "scale": 1, "hardwarex": 1, "elsevi": 1, "2020": 1, "8": [1, 2, 3, 4, 5, 6, 7, 10, 11], "24": [1, 4, 5, 6, 10, 11], "p": [1, 4, 5], "ff10": 1, "1016": 1, "j": 1, "ohx": 1, "e00122ff": 1, "particip": [1, 2, 3, 4, 5, 6, 7, 10, 11], "all": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "requir": [1, 2, 3, 6, 7, 9, 10, 11], "skill": [1, 2, 3, 4, 5, 6, 7, 10, 11], "electron": [1, 2, 3, 4, 5, 6, 7, 10, 11], "respect": [1, 2, 3, 4, 5, 6, 7, 10, 11], "safeti": [1, 2, 3, 4, 5, 6, 7, 10, 11], "rule": [1, 2, 3, 4, 5, 6, 7, 10, 11], "must": [1, 2, 3, 4, 5, 6, 7, 10, 11], "assembl": [0, 1, 2, 3, 7], "profession": [1, 2, 3, 4, 5, 6, 7, 10, 11], "context": [1, 2, 3, 4, 5, 6, 7, 10, 11], "peopl": [1, 2, 3, 4, 5, 6, 7, 10, 11], "compet": [1, 2, 3, 4, 5, 6, 7, 10, 11], "The": [0, 1, 3, 4, 5, 6, 9], "team": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "cannot": [1, 2, 3, 4, 5, 6, 7, 10, 11], "held": [1, 2, 3, 4, 5, 6, 7, 10, 11], "respons": [1, 2, 3, 4, 5, 6, 7, 10, 11], "ani": [1, 2, 3, 4, 5, 6, 7, 10, 11], "materi": [1, 2, 3, 4, 5, 6, 7, 10, 11], "human": [1, 2, 3, 4, 5, 6, 7, 10, 11], "damag": [1, 2, 3, 4, 5, 6, 7, 10, 11], "which": [1, 2, 3, 4, 5, 6, 7, 10, 11], "would": [1, 2, 3, 4, 5, 6, 7, 10, 11], "associ": [1, 2, 3, 4, 5, 6, 7, 10, 11], "us": [1, 2, 3, 4, 5, 6, 7, 10, 11], "equip": [1, 2, 3, 4, 5, 6, 7, 10, 11], "doe": [1, 2, 3, 4, 5, 6, 7, 10, 11], "work": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "after": [1, 2, 3, 4, 5, 6, 7, 10, 11], "you": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "mai": [1, 2, 3, 7, 10, 11], "redistribut": 1, "modifi": [1, 9, 10, 11], "thi": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "document": [1, 2, 7, 10], "make": [1, 2, 5, 7, 9, 10, 11], "product": [1, 4, 5], "under": [1, 6, 10, 11], "term": [1, 9], "cern": 1, "ohl": 1, "v2": 1, "http": [2, 3, 4, 5, 7, 10, 11], "ch": [], "distribut": 1, "without": [1, 5, 10, 11], "express": [1, 9], "OR": 1, "impli": [1, 5], "warranti": 1, "includ": [1, 2, 3, 5, 7, 9, 10, 11], "OF": 1, "merchant": 1, "satisfactori": 1, "qualiti": 1, "AND": 1, "fit": 1, "FOR": 1, "A": [1, 2, 6, 7, 9, 10, 11], "particular": 1, "purpos": [1, 6, 10, 11], "pleas": [1, 2, 6, 7, 10, 11], "see": [1, 2, 7, 10, 11], "condit": 1, "present": [1, 5, 6, 9, 10, 11], "develop": [0, 1, 2, 3, 4, 7, 9, 10, 11], "low": [1, 2, 7, 10, 11], "cost": [1, 4, 5, 9, 10, 11], "hardwar": [1, 10, 11], "meter": [1, 2, 6, 7, 10, 11], "provid": [1, 2, 7, 10, 11], "scientif": 1, "commun": [1, 2, 7], "robust": [1, 2, 7, 10, 11], "flexibl": 1, "tool": [1, 2, 7], "experi": [1, 2, 7, 10, 11], "call": [1, 2, 3, 5, 6, 7], "basic": [1, 9], "meterfeatur": 1, "current": [0, 1, 2, 4, 7], "inject": [0, 1, 2, 7], "measur": [0, 1, 2, 3, 5, 6, 7], "function": [1, 2, 7, 9, 10, 11], "multiplex": [0, 1, 2, 5, 6, 7], "allow": [1, 2, 4, 5, 7, 10, 11], "perform": [1, 3, 9, 10, 11], "automat": [1, 2, 7, 10, 11], "up": [1, 2, 3, 5, 7, 10, 11], "64": [0, 1, 5, 10, 11], "electrod": [0, 1, 4, 5, 6], "s": [1, 2, 4, 5, 7, 10, 11], "philosophi": [0, 1], "fulli": 1, "toolto": 1, "surfac": 1, "anyon": 1, "who": 1, "want": [1, 11], "get": [1, 2, 3, 4, 7, 10, 11], "involv": [1, 2, 7], "welcom": [1, 9], "join": 1, "ohmpi": [3, 4, 5, 9], "project": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "compon": [0, 2, 3, 7], "quantiti": [3, 10, 11], "4": [2, 3, 4, 5, 7, 10, 11], "model": [3, 4, 10, 11], "micro": [2, 3, 7, 10, 11], "sd": [2, 3, 6, 7, 10, 11], "32": [0, 2, 3, 6, 7], "go": [2, 3, 5, 7], "hdmi": [3, 6], "cabl": [3, 4, 5, 6, 10, 11], "comput": [3, 10, 11], "mous": [3, 6, 10, 11], "keyboard": [3, 6, 10, 11], "first": [2, 3, 5, 6, 7, 9], "start": [0, 2, 3, 5, 7, 9, 10, 11], "board": [2, 3, 6, 7, 9], "oper": [0, 3, 4, 6, 9], "system": [3, 9, 10, 11], "For": [2, 3, 4, 5, 7, 10, 11], "instruct": [0, 2, 3, 7], "ar": [2, 3, 4, 6, 7, 9, 10, 11], "well": [2, 3, 7, 10, 11], "describ": [3, 4, 6, 9, 10, 11], "websit": [3, 10, 11], "watch": [3, 10, 11], "video": [3, 10, 11], "how": [3, 10, 11], "set": [2, 3, 4, 7, 10, 11], "your": [3, 4, 5, 9, 10, 11], "author": [0, 3, 10, 11], "recommend": [2, 3, 7, 9, 10, 11], "latest": [3, 10, 11], "stabl": [3, 10, 11], "complet": [0, 2, 3, 4, 7], "version": [2, 3, 4, 7, 9, 10, 11], "previous": [3, 6, 10, 11], "raspbian": [3, 10, 11], "can": [2, 3, 6, 7, 10, 11], "visit": 3, "raspberrypi": 3, "org": [2, 3, 7], "en": 3, "test": [2, 3, 4, 5, 6, 7, 9, 10, 11], "were": [3, 4, 10, 11], "3": [2, 3, 4, 6, 7, 9, 10, 11], "we": [2, 3, 4, 5, 7, 10, 11], "follow": [2, 3, 4, 5, 6, 7, 9, 10, 11], "onc": [2, 3, 7, 10, 11], "ha": [2, 3, 5, 7, 10, 11], "been": [2, 3, 5, 7, 10, 11], "wire": [3, 5, 6, 10, 11], "spi": [3, 10, 11], "gpio": [3, 5, 6, 10, 11], "remot": [2, 3, 7, 10, 11], "option": [2, 3, 7, 10, 11], "deactiv": [3, 10, 11], "i2c": [3, 4, 5], "via": [3, 10, 11], "gui": [3, 10, 11], "menu": [3, 10, 11], "failur": [3, 10, 11], "carri": [3, 10, 11], "out": [3, 6, 10, 11], "task": [3, 10, 11], "caus": [3, 10, 11], "relai": [3, 4, 5, 10, 11], "shield": [3, 10, 11], "card": [0, 2, 3, 5, 6, 7], "dure": [3, 10, 11], "wai": [3, 9, 10, 11], "have": [2, 3, 4, 5, 7, 9, 10, 11], "multipl": [2, 3, 7], "parallel": 3, "instanc": 3, "interpret": [3, 4, 10, 11], "each": [3, 5, 6, 10, 11], "differ": [2, 3, 4, 5, 6, 7, 10, 11], "contain": [2, 3, 6, 7, 10, 11], "discret": 3, "copi": [2, 3, 7, 9], "its": [2, 3, 5, 6, 7, 10, 11], "support": 3, "util": [2, 3, 7], "It": [2, 3, 5, 7, 9, 10, 11], "also": [2, 3, 7, 9, 10, 11], "protect": 3, "case": [2, 3, 7, 9, 10, 11], "problem": 3, "depend": [2, 3, 7, 10, 11], "specifi": [3, 10, 11], "txt": [2, 3, 7, 10, 11], "below": [2, 3, 6, 7, 10, 11], "should": [2, 3, 4, 5, 6, 7, 9, 10, 11], "type": [2, 3, 5, 7, 9, 10, 11], "termin": [2, 3, 4, 5, 6, 7, 10, 11], "necessari": [3, 5, 6, 9, 10, 11], "ensur": [3, 10, 11], "libatla": [3, 10, 11], "base": [2, 3, 5, 7, 9, 10, 11], "dev": [3, 10, 11], "librari": [3, 10, 11], "sudo": [3, 10, 11], "apt": [3, 10, 11], "strongli": [3, 10, 11], "user": [0, 2, 3, 7, 10, 11], "creat": [2, 3, 7, 9, 10, 11], "run": [2, 3, 4, 5, 6, 7, 10, 11], "code": [3, 5, 9, 10, 11], "done": [2, 3, 7, 10, 11], "either": [3, 10, 11], "directori": [2, 3, 7, 9, 10, 11], "gather": [3, 10, 11], "within": [2, 3, 7, 9, 10, 11], "python3": [3, 10, 11], "m": [3, 4, 5, 6, 10, 11], "venv": [3, 10, 11], "command": [2, 3, 7, 10, 11], "bin": [3, 10, 11], "suffici": [3, 10, 11], "meet": [3, 10, 11], "export": 3, "cflag": 3, "fcommon": 3, "pip": [3, 10, 11], "rpi": [3, 6, 10, 11], "adafruit": [3, 4, 5, 10, 11], "blinka": [3, 10, 11], "numpi": [2, 3, 7, 10, 11], "panda": [3, 10, 11], "circuitpython": [3, 10, 11], "ads1x15": [3, 10, 11], "tca9548a": [3, 5], "mcp230xx": 3, "gpiozero": 3, "check": [2, 3, 7, 10, 11], "met": [3, 10, 11], "list": [0, 3], "leav": [3, 10, 11], "simpli": [3, 6, 10, 11], "If": [3, 4, 9, 10, 11], "decid": [3, 10, 11], "setup": [3, 10, 11], "time": [2, 3, 5, 7, 10, 11], "softwar": [0, 3, 10, 11], "click": [3, 10, 11], "access": [2, 3, 6, 7, 10, 11], "program": [3, 6, 10, 11], "pythonid": [3, 10, 11], "2": [2, 3, 5, 6, 7, 9, 10, 11], "root": [3, 10, 11], "7": [3, 4, 5, 6, 10, 11], "usr": [3, 10, 11], "select": [3, 5, 10, 11], "new": [0, 2, 3, 7, 10, 11], "window": [2, 3, 7, 10, 11], "On": [3, 10, 11], "altern": [3, 10, 11], "5": [2, 3, 4, 5, 6, 7, 10, 11], "button": [3, 10, 11], "appear": [3, 4, 5, 10, 11], "locat": [3, 10, 11], "anoth": [3, 10, 11], "execut": [2, 3, 7, 10, 11], "6": [3, 4, 5, 6, 10, 11], "find": [3, 10, 11], "folder": [3, 10, 11], "where": [2, 3, 7, 9, 10, 11], "file": [3, 4, 9, 10, 11], "home": [2, 3, 7, 10, 11], "In": [2, 3, 4, 5, 7, 9, 10, 11], "known": [3, 10, 11], "tab": [2, 3, 7, 10, 11], "path": [3, 9, 10, 11], "close": [3, 10, 11], "ok": [3, 10, 11], "9": [2, 3, 4, 5, 6, 7, 10, 11], "save": [3, 10, 11], "modif": [3, 6, 10, 11], "number": [2, 4, 5, 7, 10, 11], "per": [4, 5, 10, 11], "unit": [2, 4, 5, 7, 10, 11], "total": [4, 5, 10, 11], "manufactur": [4, 5, 10, 11], "refer": [0, 2, 4, 5, 6, 7, 10, 11], "web": [4, 5], "raspberri": [0, 2, 4, 5, 6, 7], "pi": [0, 2, 4, 6, 7], "1": [0, 2, 4, 5, 6, 7, 9], "58": [4, 10, 11], "75": 4, "www": [4, 5, 10, 11], "mouser": [4, 5], "fr": [4, 5, 10, 11], "productdetail": [4, 5], "seeed": 4, "studio": 4, "102110421": 4, "qs": [4, 5], "7mvldsj5uaxen3lyyh3sqw": 4, "3d": [4, 5], "lm158n": 4, "amp": [4, 10, 11], "o": [2, 4, 5, 7, 10, 11], "14": [4, 5, 6], "texa": [4, 10, 11], "instrument": [2, 4, 7, 10, 11], "lm358an": [4, 10, 11], "nopb": [4, 10, 11], "lm158j": 4, "x1j7hmvl2zh8vpefml8": 4, "2ffq": 4, "print": [2, 4, 5, 7, 10, 11], "circuit": [2, 4, 5, 7, 10, 11], "12": [2, 4, 5, 6, 7, 10, 11], "asler": [4, 5, 10, 11], "ads1115": [4, 10, 11], "11": [4, 6, 10, 11], "23": [4, 5, 6, 10, 11], "1085": 4, "2fha2pyfaduh": 4, "2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn": 4, "252bg": 4, "capacitor": [4, 11], "100nf": [4, 11], "50vdc": [4, 11], "10": [2, 4, 5, 6, 7, 10, 11], "ceram": [4, 11], "0": [2, 4, 5, 7, 10, 11], "kemet": [4, 11], "c320c104k1": [4, 11], "c320c104k1r5ta7303": 4, "c4uyot": 4, "2flq1th4mcyoetma": 4, "resistor": [4, 5, 10, 11], "kohm": [4, 5, 10, 11], "5w": [4, 10, 11], "te": [4, 5, 10, 11], "connect": [0, 2, 4, 5, 6, 7], "h81k0bya": [4, 10, 11], "holsworthi": 4, "2fha2pyfaduhuylh7az": 4, "2fmjfh2xjoums6wztux4som": 4, "252bii": 4, "h81k5bya": [4, 10, 11], "2fha2pyfadugy9twham3ru9hmijohywhbin95knm": 4, "252bx": 4, "2fm": 4, "vishai": [4, 5], "ccf071k50gke36": 4, "dale": 4, "qkeozdl6eqpa6lzrlqfvow": 4, "mohm": [2, 4, 7, 10, 11], "762": 4, "524": 4, "cmf651m0000fkek143": 4, "ciayqk2gdckzia2levalkg": 4, "ohm": [2, 4, 7, 10, 11], "shunt": 4, "42": 4, "ohmit": 4, "41f2r0e": 4, "im6toxqzgoauedprb19mha": 4, "dual": [4, 5, 10, 11], "screw": [4, 5, 6, 10, 11], "08": [4, 5], "mm": [4, 5, 6, 10, 11], "pitch": [4, 5, 10, 11], "648": [4, 5, 10, 11], "cui": [4, 5], "devic": [4, 5, 9], "tb009": [4, 5], "508": [4, 5], "02be": [4, 5], "vlwxofp3u2wcfk5uckwtka": [4, 5], "dc": [4, 5, 10, 11], "convert": [4, 10, 11], "24v": [4, 11], "15": [4, 5, 6, 10, 11], "31": [4, 5, 6], "16": [4, 5, 6, 10, 11], "tracopow": [4, 11], "trn": [4, 11], "1215": [4, 11], "traco": [4, 11], "power": [2, 4, 5, 6, 7, 10, 11], "yca": 4, "2faaymw02gquicgqj0ta": 4, "dip": [4, 5], "line": [4, 5, 10, 11], "socket": [4, 5], "72": [4, 11], "mill": 4, "max": 4, "110": [4, 5, 10, 11], "43": [4, 10, 11], "308": 4, "41": [4, 5], "001000": 4, "iggadovctstu": 4, "2fqaur8narg": 4, "mgh": 4, "vip": 4, "gclid": 4, "eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw": 4, "aqy211eh": 4, "84": [4, 5], "36": [4, 6, 10, 11], "panason": 4, "industri": 4, "wktuvitrialgiu8hcm7dvq": 4, "449": 4, "796": 4, "preci": [4, 5], "83": 4, "304": 4, "001101": [4, 5], "2fha2pyfadujqkqx4wauig": 4, "2fmgndxmcnv": 4, "2f33nj0gbxroculucynpyong": 4, "mcp23008": 4, "593": 4, "sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw": 4, "header": [4, 5, 10, 11], "1x10": [4, 10, 11], "samtec": [4, 10, 11], "ssw": [4, 10, 11], "02": [0, 4, 10], "g": [4, 10, 11], "ru5fayqh": 4, "252be0w1orxzibqpw": 4, "smt": 4, "breakout": 4, "pcb": [4, 5, 9, 10, 11], "soic": 4, "1212": 4, "gurawfaegucaqqfvnvtyeg": 4, "eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw": 4, "ina282aid": 4, "ze4": 4, "2fufuz19ilfayzxocfra": 4, "thd": 4, "1211n": 4, "39": [4, 5, 6, 10, 11], "2fha2pyfadugpyeg4idvm": 4, "2fmsr": 4, "252b7an": 4, "2f0t3ruis9pcaqjlt4": 4, "252bnrpuooeq": 4, "20": [4, 6, 10, 11], "53": [4, 11], "ssq": 4, "120": [4, 5], "d": [4, 10, 11], "252be1bmvd": 4, "252bdzonqg": 4, "pin": [4, 5, 10, 11], "strip": [4, 5, 6, 10, 11], "ejector": [4, 5], "35": [4, 6], "blk": [4, 5], "10120550": [4, 5], "conrad": [4, 5], "com": [2, 4, 5, 7, 10, 11], "bkl": [4, 5], "contact": [2, 4, 5, 7, 10, 11], "space": [4, 5], "254": [4, 5], "row": [4, 5], "pc": [4, 5], "741435": [4, 5], "searchterm": [4, 5], "searchtyp": [4, 5], "suggest": [4, 5, 10, 11], "searchsuggest": [4, 5], "male": [4, 5], "femal": [4, 5, 10, 11], "spacer": [4, 5, 6], "5m": [4, 6], "hexagonal": 4, "87": [4, 5], "48": [4, 10, 11], "harwin": 4, "r25": 4, "3002002": 4, "w0yvoo0ixfenuv0hsdc4": 4, "2fq": 4, "86": [4, 5], "437": 4, "1108331841001101": 4, "318": 4, "ftmup6kvi2tnqoeziaq": 4, "2fpa": 4, "figur": [2, 4, 7, 10, 11], "show": [4, 10, 11], "gener": [0, 2, 4, 5, 7, 10, 11], "schemat": [4, 11], "plug": [4, 10, 11], "plai": 4, "To": [2, 4, 5, 7, 10, 11], "two": [2, 4, 5, 7, 9, 10, 11], "one": [2, 4, 6, 7, 10, 11], "voltag": [2, 4, 6, 7, 10, 11], "propos": [4, 10, 11], "florsch": [4, 10, 11], "bit": [4, 10, 11], "adc": [4, 10, 11], "analog": [4, 10, 11], "digit": [4, 5, 10, 11], "adapt": [2, 4, 7, 9, 10, 11], "gain": [2, 4, 7, 10, 11], "advantag": 4, "input": [2, 4, 6, 7, 10, 11], "signal": [4, 10, 11], "valu": [4, 5, 10, 11], "could": [4, 6, 10, 11], "lie": [4, 10, 11], "between": [4, 5, 6, 10, 11], "114": [4, 10, 11], "v": [0, 2, 4, 5, 6, 7], "directli": [4, 10, 11], "integr": 4, "ina282": 4, "realiz": 4, "precis": [4, 10, 11], "around": [2, 4, 7], "instal": [2, 4, 5, 6, 7], "solder": [4, 10, 11], "optic": 4, "suppli": [4, 5, 6, 10, 11], "12v": [0, 4, 5, 6, 10, 11], "5v": [4, 10, 11], "tdh15": 4, "four": [2, 4, 7], "inpout": 4, "output": [2, 4, 6, 7, 10, 11], "three": [2, 4, 5, 7, 10, 11], "limit": [0, 2, 4, 7], "ma": [2, 4, 7, 10, 11], "higher": [4, 11], "than": [4, 10, 11], "just": [4, 11], "decreas": 4, "don": [2, 4, 7], "t": [2, 4, 5, 7], "forget": [2, 4, 7], "chang": [2, 4, 5, 7, 9], "config": [2, 4, 7, 9, 10, 11], "py": [2, 4, 5, 7, 9, 10, 11], "kei": 4, "r_shunt": 4, "ohmpi_config": 4, "dict": 4, "pre": [4, 6], "adjust": [4, 10, 11], "13": [4, 5, 6, 10, 11], "17": [4, 6, 10, 11], "18": [2, 4, 6, 7, 10, 11], "19": [4, 6, 10, 11], "view": [4, 6], "fix": [4, 6], "dot": 4, "mark": [4, 6], "top": [2, 4, 6, 7], "left": [4, 6], "corner": 4, "21": [4, 6, 10, 11], "mount": [4, 5, 6, 10, 11], "22": [4, 6, 10, 11], "lm158": 4, "amplifi": [4, 10, 11], "ads115": [4, 10, 11], "right": [4, 6], "3x11": 4, "wurth": 4, "elektronik": 4, "971110321": 4, "305": [4, 5], "apm": [4, 5], "hexseal": [4, 5], "rm3x8mm": [4, 5], "2701": [4, 5], "jjse": [4, 5], "2f12mkns3vxsdryxuhw": [4, 5], "shutdown": 4, "unplug": 4, "bottom": [4, 10, 11], "11mm": 4, "m3": [4, 5], "upper": 4, "port": [4, 6], "write": [2, 4, 5, 7, 9, 10, 11], "i2cdetect": [4, 5], "y": [4, 5], "everyth": 4, "address": [2, 4, 10, 11], "screen": [4, 10, 11], "equival": [4, 10, 11], "need": [2, 4, 5, 7, 10, 11], "1kohm": 4, "r2": [4, 10, 11], "220": 4, "r1": [4, 10, 11], "padboard": 4, "spool": 4, "prepar": [4, 5, 10, 11], "batteri": [2, 4, 6, 7, 10, 11], "red": [2, 4, 6, 7, 10, 11], "black": [4, 6, 10, 11], "ground": [4, 10, 11], "thonni": [2, 4, 7], "sample_measurement_exampl": 4, "exampl": [2, 4, 5, 6, 7, 10, 11], "result": [4, 10, 11], "channel": [5, 10, 11], "mechan": [2, 5, 7, 10, 11], "omron": 5, "g5le": 5, "vd": 5, "vdc": 5, "combin": 5, "zvn4206a": 5, "mofset": 5, "onli": [5, 9], "30": [5, 6, 10, 11], "enough": [5, 10, 11], "activ": [2, 5], "repres": [5, 10, 11], "512": 5, "expand": 5, "mcp23017": 5, "from": [2, 5, 6, 7, 10, 11], "128": [2, 5, 7], "own": 5, "0x70": 5, "0x77": 5, "0x71": 5, "0x72": 5, "0x73": 5, "140": 5, "560": 5, "62": 5, "92": [5, 10, 11], "1580994": 5, "tru": [5, 10, 11], "diod": 5, "1n4007": 5, "256": 5, "091": 5, "296": 5, "incorpor": [2, 5, 7], "sgaepimzzmueqxo7l": 5, "2fbpyakboruumren": 5, "56": 5, "776": 5, "205": 5, "46": 5, "103321": 5, "5twgzeq9e7hsylqaljjyrw": 5, "i": [2, 5, 6, 7, 10, 11], "40": [2, 5, 7, 10, 11], "732": 5, "sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi": 5, "27": [5, 6, 10, 11], "325": 5, "over": 5, "503811": 5, "mosfet": 5, "nchannel": 5, "471": 5, "576": [5, 10], "vhuuswq2": 5, "252bsz9b": 5, "2ff6fcxt7g": 5, "100k\u03c9": 5, "061": 5, "616": 5, "beyschlag": 5, "mba02040c1003frp00": 5, "mzrxyrlhvdt9crf7zyf": 5, "2f5q": 5, "89": 5, "2717": 5, "sgaepimzzmsyydr3r27av4eqf73yoh": 5, "252baqg": 5, "252bz3hvktao": 5, "10120558": 5, "54": 5, "No": 5, "51": 5, "741727": 5, "10120862": 5, "connector": [5, 6, 10, 11], "strain": 5, "relief": 5, "44": [5, 10, 11], "742063": 5, "10120158": 5, "ribbon": [5, 6], "x": [5, 10, 11], "mm\u00b2": [5, 10, 11], "multi": [2, 5, 7, 10, 11], "colour": 5, "1012015810": 5, "127": 5, "008": 5, "1548658": 5, "hex": [5, 6], "25": [2, 5, 6, 7, 10, 11], "79": 5, "49": 5, "keyston": 5, "24300": 5, "uwqyq": 5, "2f2czwu0ejpozmzc2a": 5, "745": 5, "846": 5, "614": 5, "25515": 5, "2f2czwuxuhumfr": 5, "252bzuq": 5, "55": [5, 10, 11], "328": 5, "uqd7xcvsscnr3hwd6fta8g": 5, "100": [2, 5, 7, 10, 11], "duplic": 5, "everi": [2, 5, 7], "build": [5, 10, 11], "therefor": [5, 10, 11], "identifi": 5, "assign": 5, "alloc": 5, "here": [5, 6, 11], "default": [2, 5, 7], "jumper": 5, "note": [5, 6, 10, 11], "name": [2, 5, 7, 9, 10, 11], "zoom": [5, 6], "befor": [2, 5, 6, 7, 10, 11], "them": [2, 5, 7, 10, 11], "definit": 5, "simplifi": 5, "thing": [2, 5, 7], "do": [2, 5, 6, 7, 9], "50": [2, 5, 6, 7, 10, 11], "cm": [5, 6, 10, 11], "long": [5, 6], "flat": 5, "pole": [5, 10, 11], "detect": 5, "script": [2, 5, 7, 9], "test_mux_board": 5, "cut": 6, "compos": 6, "proper": 6, "length": [6, 10, 11], "about": 6, "correspond": [6, 10], "crimp": [6, 10, 11], "idc": 6, "suitabl": [2, 6, 7, 10, 11], "clamp": 6, "pai": [6, 10, 11], "attent": [6, 10, 11], "direct": [2, 6, 7, 10, 11], "unbalanc": 6, "perpendicular": 6, "possibl": [6, 10, 11], "same": [2, 6, 7, 10, 11], "flush": 6, "posit": [6, 10, 11], "abov": [6, 10, 11], "mux": [2, 6, 10, 11], "profil": 6, "color": 6, "yellow": 6, "tin": 6, "end": [6, 10, 11], "shown": [6, 10, 11], "pictur": 6, "ii": 6, "gnd": [6, 10, 11], "nois": 6, "often": 6, "heard": 6, "when": [2, 6, 7, 9, 10, 11], "clip": 6, "place": [6, 9, 10, 11], "second": [2, 6, 7, 10, 11], "b": [2, 6], "help": [2, 6, 7, 9], "previou": [2, 6, 7], "procedur": 6, "repeat": [2, 6, 7, 10, 11], "other": [2, 6, 7, 10, 11], "purpl": 6, "relev": [6, 9], "defin": [2, 6, 7, 9], "third": [2, 6, 7], "fourth": 6, "nylon": 6, "photograph": 6, "more": [2, 6, 7], "detail": [2, 6, 7, 10], "4th": 6, "togeth": [6, 10, 11], "tie": 6, "pvc": 6, "plate": 6, "minimum": 6, "dimens": 6, "200": 6, "150": [2, 6, 7, 10, 11], "drill": 6, "remain": [6, 10, 11], "metal": 6, "tighten": 6, "so": [6, 10, 11], "usb": 6, "hole": [6, 10, 11], "26": [6, 10, 11], "add": [6, 10, 11], "attach": 6, "washer": 6, "nut": 6, "28": [0, 6], "29": [6, 10, 11], "come": 6, "pass": [2, 6, 7], "brown": 6, "blue": [6, 10, 11], "block": [6, 10, 11], "secur": [2, 6, 7], "33": 6, "34": 6, "37": [6, 10, 11], "38": [6, 10, 11], "os": [2, 6, 7], "monitor": [2, 6, 7, 10, 11], "deliv": [6, 10, 11], "12vdc": 6, "enjoi": 6, "publish": [2, 7, 10], "journal": 10, "howev": [9, 10, 11], "correct": [10, 11], "bug": 10, "exist": [9, 10, 11], "explain": 10, "miss": 10, "point": [2, 7, 10, 11], "invit": 10, "v1": [2, 7, 10, 11], "offer": [2, 7, 10, 11], "commerci": [10, 11], "avail": [2, 7, 9, 10, 11], "field": [2, 7, 10, 11], "specif": [9, 10, 11], "temperatur": [2, 7, 10, 11], "c": [2, 7, 10, 11], "consumpt": [2, 7, 10, 11], "cpu": [2, 7, 10, 11], "control": [2, 7, 10, 11], "w": [2, 7, 10, 11], "min": [2, 7, 10, 11], "puls": [2, 7, 10, 11], "durat": [2, 7, 10, 11], "ms": [2, 7, 10, 11], "imped": [2, 7, 10, 11], "storag": [2, 7, 10, 11], "resolut": [2, 7, 10, 11], "o1": [10, 11], "step": [9, 10, 11], "youtub": [10, 11], "wjwzhv1v3pk": [10, 11], "noob": [10, 11], "simpl": [10, 11], "sure": [2, 7, 9, 10, 11], "unexpectedli": [10, 11], "boot": [10, 11], "cd": [10, 11], "gnu": [10, 11], "nano": [10, 11], "editor": [2, 7, 10, 11], "At": [10, 11], "op": [10, 11], "dl": [10, 11], "press": [10, 11], "ctrl": [10, 11], "enter": [10, 11], "escap": [10, 11], "return": [2, 7, 10, 11], "wa": [10, 11], "introduc": [2, 7, 9, 10, 11], "Its": [10, 11], "studi": [10, 11], "hous": [10, 11], "design": [2, 7, 9, 10, 11], "diagram": [10, 11], "displai": [10, 11], "mimic": [10, 11], "behavior": [10, 11], "soil": [10, 11], "subject": [10, 11], "r11": [10, 11], "r10": [10, 11], "r12": [10, 11], "constitut": [10, 11], "thei": [2, 7, 10, 11], "typic": [2, 7, 9, 10, 11], "made": [2, 7, 10, 11], "stainless": [10, 11], "steel": [10, 11], "seri": [10, 11], "part": [2, 9, 10, 11], "r9": [10, 11], "ad": [2, 7, 10, 11], "flow": [2, 7, 10, 11], "order": [2, 7, 9, 10, 11], "less": [10, 11], "sum": [10, 11], "inde": [10, 11], "000": [10, 11], "intens": [10, 11], "potenti": [10, 11], "calcul": [10, 11], "insert": [10, 11], "1115": [10, 11], "our": [2, 7, 10, 11], "a1": [10, 11], "a0": [10, 11], "increas": [10, 11], "track": [9, 10, 11], "divid": [10, 11], "bridg": [10, 11], "r5": [10, 11], "r8": [10, 11], "r6": [10, 11], "r7": [10, 11], "accord": [9, 10, 11], "n": [2, 7, 10, 11], "a2": [10, 11], "a3": [10, 11], "obtain": [10, 11], "ly": [10, 11], "rang": [9, 10, 11], "let": [10, 11], "equal": [10, 11], "multipli": [10, 11], "reduct": [10, 11], "section": [2, 7, 9, 10, 11], "despit": [10, 11], "high": [10, 11], "e": [2, 7, 10, 11], "accur": [10, 11], "still": [10, 11], "calibr": [10, 11], "voltmet": [10, 11], "variou": [10, 11], "These": [2, 7, 10, 11], "serv": [2, 7, 10, 11], "With": [10, 11], "disturb": [10, 11], "being": [10, 11], "estim": [10, 11], "mega": [10, 11], "shortcut": [10, 11], "excess": [10, 11], "whose": [2, 7, 10, 11], "lithium": [10, 11], "ion": [10, 11], "automobil": [10, 11], "lead": [10, 11], "acid": [10, 11], "strong": [10, 11], "hazard": [10, 11], "fuse": [10, 11], "repositori": [2, 7, 10, 11], "onto": [10, 11], "illustr": [2, 7, 10, 11], "ohmmet": [10, 11], "coeffici": [10, 11], "coef_p0": [10, 11], "coef_p1": [10, 11], "coef_p2": [10, 11], "coef_p3": [10, 11], "coef": [10, 11], "po": [10, 11], "p1": [10, 11], "r3": [10, 11], "r4": [10, 11], "p2": [10, 11], "p3": [10, 11], "r_ref": [10, 11], "slope": [10, 11], "convers": [10, 11], "p0": [10, 11], "accuraci": [10, 11], "both": [9, 10, 11], "addit": [2, 7, 10, 11], "lm358n": [10, 11], "appli": [10, 11], "prefer": [2, 7, 10, 11], "weaker": 10, "stronger": [10, 11], "tx": [10, 11], "rememb": [10, 11], "holder": [10, 11], "f": [10, 11], "consist": [10, 11], "circul": [10, 11], "through": [2, 7, 10, 11], "fig": [10, 11], "modul": [9, 10, 11], "switch": [10, 11], "common": [10, 11], "neg": [10, 11], "normal": [10, 11], "simultan": [10, 11], "role": [10, 11], "revers": [10, 11], "polar": [10, 11], "thu": [10, 11], "energ": [10, 11], "solut": [9, 10, 11], "manag": [2, 7, 10, 11], "next": [10, 11], "featur": [10, 11], "strict": [10, 11], "in1": [10, 11], "in2": [10, 11], "in3": [10, 11], "in4": [10, 11], "5vdc": [10, 11], "5vcc": [10, 11], "now": [10, 11], "mm2": [10, 11], "lastli": [10, 11], "congratul": [10, 11], "construct": [10, 11], "valid": [2, 10, 11], "conduct": [9, 10, 11], "manual": [2, 7, 10, 11], "practic": [9, 10, 11], "ert": [10, 11], "sever": [10, 11], "ten": [10, 11], "thousand": [10, 11], "arrai": [2, 7, 10, 11], "stuck": [10, 11], "enabl": [2, 7, 10, 11], "smaller": [10, 11], "hand": [10, 11], "entir": [2, 7, 10, 11], "cap": [10, 11], "produc": [10, 11], "clean": [10, 11], "distanc": [10, 11], "had": [10, 11], "extra": [10, 11], "As": [10, 11], "final": [10, 11], "actual": [10, 11], "singl": [2, 7, 9, 10, 11], "protocol": [2, 7, 10, 11], "horizont": [10, 11], "vertic": [10, 11], "06": [10, 11], "04": [10, 11], "09": [10, 11], "05": [10, 11], "din": [10, 11], "rail": [10, 11], "chosen": [10, 11], "consequ": [10, 11], "incom": [10, 11], "instead": [10, 11], "moreov": [10, 11], "turn": [10, 11], "bought": [10, 11], "down": [10, 11], "velleman": [10, 11], "wpm404": [10, 11], "potentiomet": [10, 11], "download": [2, 7, 10, 11], "scienc": [10, 11], "framework": [10, 11], "manuscript": [10, 11], "osf": [10, 11], "io": [10, 11], "dzwb4": [10, 11], "gitlab": [2, 7, 10, 11], "irstea": [10, 11], "unzip": [10, 11], "master": [10, 11], "readm": [10, 11], "assist": [10, 11], "disconnect": [10, 11], "handl": [2, 7, 10, 11], "charg": [10, 11], "full": [10, 11], "capac": [10, 11], "fewer": [10, 11], "bank": [10, 11], "2a": [10, 11], "ll": [10, 11], "insid": [10, 11], "abmn": [2, 7, 10, 11], "quadrupol": [2, 7, 10, 11], "numer": [10, 11], "some": [0, 2, 7, 9, 10, 11], "main": [2, 7, 10, 11], "optim": [10, 11], "attribut": [10, 11], "stack": [2, 7, 10, 11], "the9": [10, 11], "hear": [10, 11], "characterist": [10, 11], "sound": [10, 11], "permut": [10, 11], "csv": [10, 11], "nb_electrod": [2, 7, 10, 11], "maximum": [2, 7, 10, 11], "injection_dur": [2, 7, 10, 11], "nbr_mea": [2, 7, 10, 11], "sequenc": [2, 7, 10, 11], "sequence_delai": [2, 7, 10, 11], "delai": [10, 11], "repetit": [10, 11], "evolv": [10, 11], "littl": [10, 11], "public": [10, 11], "articl": [10, 11], "date": [0, 10, 11], "sainsmart": [10, 11], "canal": 10, "pour": 10, "arduino": 10, "dsp": 10, "avr": 10, "pic": 10, "arm": 10, "99": [10, 11], "199": [10, 11], "sain": [10, 11], "smart": [10, 11], "101": [10, 11], "70": [10, 11], "103": [10, 11], "018": [10, 11], "1x1": [10, 11], "66": [10, 11], "1568649": [10, 11], "1x0": [10, 11], "71": [10, 11], "1565235": [10, 11], "68": [10, 11], "rs": [10, 11], "pro": [10, 11], "897": [10, 11], "1332": [10, 11], "858": [10, 11], "627": [10, 11], "52": [10, 11], "upw50b50rv": [10, 11], "1083": [10, 11], "7ah": [10, 11], "537": [10, 11], "5488": [10, 11], "lr20": [10, 11], "9v": [10, 11], "185": [10, 11], "4686": [10, 11], "ferrul": [10, 11], "500": [10, 11], "piec": [10, 11], "weidmul": [10, 11], "9004330000": [10, 11], "966067": [10, 11], "car": 10, "littelfus": [10, 11], "fhac0002zxj": 10, "96": 10, "improv": [2, 7, 9, 11], "upgrad": [2, 7, 11], "01": [0, 2, 7, 11], "replac": [9, 11], "trn3": 11, "suppress": 11, "10v": 11, "fast": 11, "decoupl": 11, "last": 11, "veri": [9, 11], "prevent": 11, "overh": 11, "toler": 11, "orient": 11, "h": 11, "nf": 11, "tabl": 11, "jason": 11, "ohmpi_param": 11, "json": [2, 7, 11], "export_path": 11, "desktop": 11, "0251001": 11, "pat1l": 11, "box": [2, 7], "mani": [2, 7], "dii": [2, 7], "laps": [2, 7], "seek": [2, 7], "share": [2, 7, 9], "wish": [2, 7], "2023": [0, 2, 7], "stop": [2, 7], "0x": [2, 7], "effort": [2, 7], "paramet": [2, 7], "80": [2, 7], "virtual": 2, "environ": 2, "packag": [2, 7], "id": [2, 7], "summar": [2, 7], "cover": [2, 7], "acquisit": [2, 7], "separ": [2, 7], "ohmpi_set": [2, 7], "central": [2, 7], "class": [2, 7, 9], "interact": [2, 7, 9], "handler": [2, 7], "layer": [2, 7], "releas": [0, 2, 7], "excel": [2, 7], "log": [2, 7], "implement": [0, 2, 7, 9], "broker": [2, 7], "zip": [2, 7], "rotat": [2, 7], "disk": [2, 7], "exec_logg": [2, 7], "data_logg": [2, 7], "plan": [2, 7], "state": [2, 7], "health": [2, 7], "soh": [2, 7], "futur": [2, 7], "By": [2, 7], "written": [2, 7], "consol": [2, 7], "like": [2, 7], "store": [2, 7, 9], "local": [2, 7], "dai": [2, 7], "size": [2, 7], "exce": [2, 7], "sent": [2, 7], "level": [2, 7], "advanc": [2, 7], "edit": [2, 7], "setup_logg": [2, 7], "custom": [2, 7], "desir": [2, 7], "usernam": [2, 7], "password": [2, 7], "One": [2, 7], "understand": [2, 7], "alter": [2, 7], "keep": [2, 7], "bash": [2, 7], "run_http_interfac": [2, 7], "sh": [2, 7], "api": [0, 2, 7], "import": [2, 7, 9], "iot": [2, 7], "messag": [2, 7], "friendli": [2, 7], "graphic": [2, 7], "quick": [2, 7], "easi": [2, 7], "wi": [2, 7], "fi": [2, 7], "ap": [2, 7], "webserv": [2, 7], "index": [2, 7], "html": [2, 7], "laptop": [2, 7], "mobil": [2, 7], "phone": [2, 7], "upload": [2, 7], "act": [2, 7], "raspap": [2, 7], "runonstart": [2, 7], "itself": [2, 7], "141": [2, 7], "8080": [2, 7], "pseudo": [2, 7], "evolut": [2, 7], "appar": [2, 7], "especi": [2, 7], "suit": [2, 7], "autom": [2, 7], "ipython": [2, 7], "ssh": [2, 7], "putti": [2, 7], "maco": [2, 7], "linux": [2, 7], "found": [2, 7], "np": [2, 7], "chdir": [2, 7], "object": [2, 7], "k": [2, 7], "load": [2, 7], "nb_stack": [2, 7], "half": [2, 7], "cycl": [2, 7], "updat": [2, 7], "update_set": [2, 7], "shape": [2, 7], "set_sequ": [2, 7], "n2": [2, 7], "string": [2, 7], "load_sequ": [2, 7], "rs_check": [2, 7], "synchron": [2, 7], "wait": [2, 7], "prompt": [2, 7], "run_sequ": [2, 7], "run_sequence_async": [2, 7], "thread": [2, 7], "immedi": [2, 7], "sleep": [2, 7], "interrupt": [2, 7], "kill": [2, 7], "asynchron": [2, 7], "given": [2, 7], "interv": [2, 7], "nb_mea": [2, 7], "run_multiple_sequ": [2, 7], "taken": [2, 7], "switch_mux_on": [2, 7], "run_measur": [2, 7], "switch_mux_off": [2, 7], "risk": [2, 7], "short": [2, 7], "argument": [2, 7], "autogain": [2, 7], "true": [2, 7], "good": [2, 7], "usag": [2, 7], "process": [2, 7], "sensor": [2, 7], "scope": [2, 7], "internet": [2, 7], "network": [2, 7], "auxiliari": [2, 7], "subscrib": [2, 7], "approach": [2, 7], "mosquitto": [2, 7], "server": [2, 7], "reachabl": [2, 7], "net": [2, 7], "servic": [2, 7], "install_local_mqtt_brok": [2, 7], "examin": [2, 7], "easili": [2, 7, 9], "parti": [2, 7], "explor": [2, 7], "receiv": [2, 7], "reboot": [2, 7], "further": [2, 7], "format": [2, 7], "kwarg": [2, 7], "cmd_id": [2, 7], "3fzxv121uitwgjwygcz4xw": [2, 7], "cmd": [2, 7], "3fzxv121uitwgjwygcz4yw": [2, 7], "tailor": [2, 7], "dashboard": [2, 7], "browser": [2, 7], "node": [2, 7], "complex": [2, 7], "properli": [2, 7], "palett": [2, 7], "noder": [2, 7], "doc": [2, 7], "guid": [2, 7], "ui": [2, 7], "visual": [2, 7], "cookbook": [2, 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": [0, 9], "hardware_config": 9, "dictionari": 9, "config_xxx": 9, "xxx": 9, "nov": 0, "juli": 0, "2016": 0, "target": 0, "research": 0, "statu": 0, "matur": 0, "progress": 0, "offici": 0, "guidelin": 0, "tutori": 0, "content": 0, "partner": 0, "cite": 0, "introduct": 0, "technic": 0, "v2023": 0, "tow": 4, "led": 6, "consid": 6, "temporari": 6, "orang": 6, "interfac": 0}, "objects": {"": [[8, 0, 0, "-", "ohmpi"]]}, "objtypes": {"0": "py:module"}, "objnames": {"0": ["py", "module", "Python module"]}, "titleterms": {"ohmpi": [0, 1, 2, 6, 7, 10, 11], "project": 1, "author": 1, "partner": 1, "cite": 1, "introduct": 1, "step": [2, 3, 4, 5, 6, 7], "n": [3, 4, 5, 6], "1": [3, 10, 11], "raspberri": [3, 10, 11], "pi": [3, 10, 11], "configur": [2, 3, 7, 10, 11], "part": [3, 4, 5], "A": [3, 4, 5], "os": [3, 10, 11], "instal": [3, 10, 11], "b": [3, 4, 5, 10, 11], "virtual": [3, 10, 11], "environ": [3, 10, 11], "packag": [3, 10, 11], "c": [3, 4, 5], "activ": [3, 10, 11], "thonni": [3, 10, 11], "python": [2, 3, 7, 10, 11], "id": [3, 10, 11], "2": 4, "measur": [4, 10, 11], "board": [4, 5, 10, 11], "assembl": [4, 5, 6, 10, 11], "requir": [4, 5], "compon": [4, 5, 9, 10, 11], "list": [4, 5, 10, 11], "descript": [4, 10, 11], "start": 4, "up": 4, "check": 4, "3": 5, "mux": 5, "address": 5, "valid": 5, "4": 6, "v": [10, 11], "01": 10, "limit": [10, 11], "32": [10, 11], "electrod": [2, 7, 10, 11], "The": [2, 7, 10, 11], "philosophi": [2, 7, 10, 11], "technic": [10, 11], "data": [10, 11], "current": [10, 11], "inject": [10, 11], "card": [10, 11], "connect": [10, 11], "electr": [10, 11], "resist": [0, 10, 11], "implement": [10, 11], "first": [10, 11], "four": [10, 11], "multiplex": [10, 11], "oper": [2, 7, 10, 11], "instruct": [10, 11], "preliminari": [10, 11], "procedur": [10, 11], "onli": [10, 11], "initi": [10, 11], "startup": [10, 11], "paramet": [10, 11], "complet": [10, 11], "tabl": 10, "titl": 10, "02": 11, "v2023": [2, 7], "64": [2, 7], "12v": [2, 7], "hardwar": [0, 2, 7, 9], "specif": [2, 7], "build": [2, 7], "an": [2, 7], "softwar": [2, 7, 9], "system": [2, 7], "architectur": [2, 7], "logger": [2, 7], "file": [2, 7], "interfac": [2, 7, 9], "applic": [2, 7], "web": [2, 7], "mqtt": [2, 7], "api": 8, "refer": 8, "new": 9, "open": 0, "sourc": 0, "meter": 0, "summari": 0, "document": 0, "center": 0}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["index", "source_rst/Ohmpi", "source_rst/V2023.x.x/V2023", "source_rst/V2023.x.x/V2023_step_01", "source_rst/V2023.x.x/V2023_step_02", "source_rst/V2023.x.x/V2023_step_03", "source_rst/V2023.x.x/V2023_step_04", "source_rst/V2024.x.x/V2024", "source_rst/api", "source_rst/developing_hardware_components", "source_rst/v1.xx/V1_01", "source_rst/v1.xx/V1_02"], "filenames": ["index.rst", "source_rst/Ohmpi.rst", "source_rst/V2023.x.x/V2023.rst", "source_rst/V2023.x.x/V2023_step_01.rst", "source_rst/V2023.x.x/V2023_step_02.rst", "source_rst/V2023.x.x/V2023_step_03.rst", "source_rst/V2023.x.x/V2023_step_04.rst", "source_rst/V2024.x.x/V2024.rst", "source_rst/api.rst", "source_rst/developing_hardware_components.rst", "source_rst/v1.xx/V1_01.rst", "source_rst/v1.xx/V1_02.rst"], "titles": ["OHMPI: Open source and open hardware resistivity-meter", "OhmPi project", "OhmPi V2023 (64 electrodes and 12V)", "<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 V2023 (64 electrodes and 12V)", "API reference", "Software interface to new hardware components", "OhmPi V 1.01 (limited to 32 electrodes)", "OhmPi V 1.02 (limited to 32 electrodes)"], "terms": {"releas": [0, 2, 7], "date": [0, 10, 11], "nov": 0, "28": [0, 6], "2023": [0, 2, 7], "start": [0, 2, 3, 5, 7, 9, 10, 11], "juli": 0, "2016": 0, "author": [0, 3, 10, 11], "r\u00e9mi": [0, 1], "clement": [0, 1], "nicola": [0, 1], "forquet": [0, 1], "yannick": [0, 1], "fargier": [0, 1], "vivien": [0, 1], "duboi": [0, 1], "h\u00e9l\u00e8ne": [0, 1], "guyard": [0, 1], "olivi": [0, 1], "kaufmann": [0, 1], "guillaum": [0, 1], "blanchi": [0, 1], "arnaud": [0, 1], "watlet": [0, 1], "target": 0, "user": [0, 2, 3, 7, 10, 11], "research": 0, "develop": [0, 1, 2, 3, 4, 7, 9, 10, 11], "statu": 0, "some": [0, 2, 7, 9, 10, 11], "matur": 0, "progress": 0, "offici": 0, "guidelin": 0, "gener": [0, 2, 4, 5, 7, 10, 11], "tutori": 0, "content": 0, "project": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "partner": 0, "cite": 0, "introduct": 0, "v": [0, 2, 4, 5, 6, 7], "1": [0, 2, 4, 5, 6, 7, 9], "01": [0, 2, 7, 11], "limit": [0, 2, 4, 7], "32": [0, 2, 3, 6, 7], "electrod": [0, 1, 4, 5, 6], "The": [0, 1, 3, 4, 5, 6, 9], "philosophi": [0, 1], "technic": 0, "data": [0, 1, 2, 7], "raspberri": [0, 2, 4, 5, 6, 7], "pi": [0, 2, 4, 6, 7], "configur": [0, 9], "assembli": [0, 1, 2, 3, 6, 7], "measur": [0, 1, 2, 3, 5, 6, 7], "current": [0, 1, 2, 4, 7], "inject": [0, 1, 2, 7], "card": [0, 2, 3, 5, 6, 7], "connect": [0, 2, 4, 5, 6, 7], "multiplex": [0, 1, 2, 5, 6, 7], "implement": [0, 2, 7, 9], "oper": [0, 3, 4, 6, 9], "instruct": [0, 2, 3, 7], "complet": [0, 2, 3, 4, 7], "list": [0, 3], "compon": [0, 2, 3, 7], "02": [0, 4, 10], "v2023": 0, "64": [0, 1, 5, 10, 11], "12v": [0, 4, 5, 6, 10, 11], "softwar": [0, 3, 10, 11], "api": [0, 2, 7], "refer": [0, 2, 4, 5, 6, 7, 10, 11], "interfac": 0, "new": [0, 2, 3, 7, 10, 11], "inra": 1, "reversa": [1, 10, 11], "villeurbann": 1, "franc": 1, "universit\u00e9": 1, "de": 1, "mon": 1, "belgium": 1, "ger": 1, "rro": 1, "univ": 1, "gustav": 1, "eiffel": 1, "ifsttar": 1, "lyon": 1, "ig": 1, "grenobl": 1, "alp": 1, "ilvo": 1, "merelbek": 1, "julien": 1, "ganc": 1, "emil": 1, "gro": 1, "et": [1, 4], "al": 1, "an": [1, 3, 4, 5, 6, 9, 10, 11], "open": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "sourc": [1, 3, 9, 10, 11], "logger": [1, 10, 11], "dedic": [1, 2, 7], "applic": [1, 9], "electr": [1, 4], "resist": [1, 2, 4, 6, 7], "imag": [1, 3], "small": [1, 2, 4, 6, 7, 10, 11], "laboratori": [1, 2, 6, 7, 10, 11], "scale": 1, "hardwarex": 1, "elsevi": 1, "2020": 1, "8": [1, 2, 3, 4, 5, 6, 7, 10, 11], "24": [1, 4, 5, 6, 10, 11], "p": [1, 4, 5], "ff10": 1, "1016": 1, "j": 1, "ohx": 1, "e00122ff": 1, "i": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "particip": [1, 2, 3, 4, 5, 6, 7, 10, 11], "all": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "requir": [1, 2, 3, 6, 7, 9, 10, 11], "skill": [1, 2, 3, 4, 5, 6, 7, 10, 11], "electron": [1, 2, 3, 4, 5, 6, 7, 10, 11], "respect": [1, 2, 3, 4, 5, 6, 7, 10, 11], "safeti": [1, 2, 3, 4, 5, 6, 7, 10, 11], "rule": [1, 2, 3, 4, 5, 6, 7, 10, 11], "must": [1, 2, 3, 4, 5, 6, 7, 10, 11], "assembl": [1, 2, 3, 4, 5, 7, 10, 11], "profession": [1, 2, 3, 4, 5, 6, 7, 10, 11], "context": [1, 2, 3, 4, 5, 6, 7, 10, 11], "peopl": [1, 2, 3, 4, 5, 6, 7, 10, 11], "compet": [1, 2, 3, 4, 5, 6, 7, 10, 11], "team": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "cannot": [1, 2, 3, 4, 5, 6, 7, 10, 11], "held": [1, 2, 3, 4, 5, 6, 7, 10, 11], "respons": [1, 2, 3, 4, 5, 6, 7, 10, 11], "ani": [1, 2, 3, 4, 5, 6, 7, 10, 11], "materi": [1, 2, 3, 4, 5, 6, 7, 10, 11], "human": [1, 2, 3, 4, 5, 6, 7, 10, 11], "damag": [1, 2, 3, 4, 5, 6, 7, 10, 11], "which": [1, 2, 3, 4, 5, 6, 7, 10, 11], "would": [1, 2, 3, 4, 5, 6, 7, 10, 11], "associ": [1, 2, 3, 4, 5, 6, 7, 10, 11], "us": [1, 2, 3, 4, 5, 6, 7, 10, 11], "equip": [1, 2, 3, 4, 5, 6, 7, 10, 11], "doe": [1, 2, 3, 4, 5, 6, 7, 10, 11], "work": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "after": [1, 2, 3, 4, 5, 6, 7, 10, 11], "you": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "mai": [1, 2, 3, 7, 10, 11], "redistribut": 1, "modifi": [1, 9, 10, 11], "thi": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "document": [1, 2, 7, 10], "make": [1, 2, 5, 7, 9, 10, 11], "product": [1, 4, 5], "under": [1, 6, 10, 11], "term": [1, 9], "cern": 1, "ohl": 1, "v2": 1, "distribut": 1, "without": [1, 5, 10, 11], "express": [1, 9], "OR": 1, "impli": [1, 5], "warranti": 1, "includ": [1, 2, 3, 5, 7, 9, 10, 11], "OF": 1, "merchant": 1, "satisfactori": 1, "qualiti": 1, "AND": 1, "fit": 1, "FOR": 1, "A": [1, 2, 6, 7, 9, 10, 11], "particular": 1, "purpos": [1, 6, 10, 11], "pleas": [1, 2, 6, 7, 10, 11], "see": [1, 2, 7, 10, 11], "condit": 1, "present": [1, 5, 6, 9, 10, 11], "low": [1, 2, 7, 10, 11], "cost": [1, 4, 5, 9, 10, 11], "hardwar": [1, 10, 11], "meter": [1, 2, 6, 7, 10, 11], "provid": [1, 2, 7, 10, 11], "scientif": 1, "commun": [1, 2, 7], "robust": [1, 2, 7, 10, 11], "flexibl": 1, "tool": [1, 2, 7], "experi": [1, 2, 7, 10, 11], "call": [1, 2, 3, 5, 6, 7], "basic": [1, 9], "meterfeatur": 1, "function": [1, 2, 7, 9, 10, 11], "allow": [1, 2, 4, 5, 7, 10, 11], "perform": [1, 3, 9, 10, 11], "automat": [1, 2, 7, 10, 11], "up": [1, 2, 3, 5, 7, 10, 11], "": [1, 2, 4, 5, 7, 10, 11], "fulli": 1, "toolto": 1, "surfac": 1, "anyon": 1, "who": 1, "want": [1, 11], "get": [1, 2, 3, 4, 7, 10, 11], "involv": [1, 2, 7], "welcom": [1, 9], "join": 1, "In": [2, 3, 4, 5, 7, 9, 10, 11], "version": [2, 3, 4, 7, 9, 10, 11], "we": [2, 3, 4, 5, 7, 10, 11], "have": [2, 3, 4, 5, 7, 9, 10, 11], "two": [2, 4, 5, 7, 9, 10, 11], "board": [2, 3, 6, 7, 9], "type": [2, 3, 5, 7, 9, 10, 11], "made": [2, 7, 10, 11], "four": [2, 4, 7], "point": [2, 7, 10, 11], "4": [2, 3, 4, 5, 7, 10, 11], "box": [2, 7], "ha": [2, 3, 5, 7, 10, 11], "been": [2, 3, 5, 7, 10, 11], "adapt": [2, 4, 7, 9, 10, 11], "handl": [2, 7, 10, 11], "also": [2, 3, 7, 9, 10, 11], "mani": [2, 7], "offer": [2, 7, 10, 11], "dii": [2, 7], "multi": [2, 5, 7, 10, 11], "It": [2, 3, 5, 7, 9, 10, 11], "can": [2, 3, 6, 7, 10, 11], "upgrad": [2, 7, 11], "128": [2, 5, 7], "suitabl": [2, 6, 7, 10, 11], "field": [2, 7, 10, 11], "time": [2, 3, 5, 7, 10, 11], "laps": [2, 7], "monitor": [2, 6, 7, 10, 11], "seek": [2, 7], "share": [2, 7, 9], "its": [2, 3, 5, 6, 7, 10, 11], "wish": [2, 7], "improv": [2, 7, 9, 11], "more": [2, 6, 7], "differ": [2, 3, 4, 5, 6, 7, 10, 11], "from": [2, 5, 6, 7, 10, 11], "previou": [2, 6, 7], "one": [2, 4, 6, 7, 10, 11], "stop": [2, 7], "v1": [2, 7, 10, 11], "0x": [2, 7], "our": [2, 7, 10, 11], "effort": [2, 7], "paramet": [2, 7], "unit": [2, 4, 5, 7, 10, 11], "temperatur": [2, 7, 10, 11], "0": [2, 4, 5, 7, 10, 11], "50": [2, 5, 6, 7, 10, 11], "c": [2, 7, 10, 11], "25": [2, 5, 6, 7, 10, 11], "power": [2, 4, 5, 6, 7, 10, 11], "consumpt": [2, 7, 10, 11], "cpu": [2, 7, 10, 11], "control": [2, 7, 10, 11], "18": [2, 4, 6, 7, 10, 11], "5": [2, 3, 4, 5, 6, 7, 10, 11], "w": [2, 7, 10, 11], "voltag": [2, 4, 6, 7, 10, 11], "12": [2, 4, 5, 6, 7, 10, 11], "batteri": [2, 4, 6, 7, 10, 11], "9": [2, 3, 4, 5, 6, 7, 10, 11], "40": [2, 5, 7, 10, 11], "ma": [2, 4, 7, 10, 11], "min": [2, 7, 10, 11], "puls": [2, 7, 10, 11], "durat": [2, 7, 10, 11], "150": [2, 6, 7, 10, 11], "m": [2, 3, 4, 5, 6, 7, 10, 11], "input": [2, 4, 6, 7, 10, 11], "imped": [2, 7, 10, 11], "80": [2, 7], "mohm": [2, 4, 7, 10, 11], "storag": [2, 7, 10, 11], "micro": [2, 3, 7, 10, 11], "sd": [2, 3, 6, 7, 10, 11], "resolut": [2, 7, 10, 11], "ohm": [2, 4, 7, 10, 11], "n": [2, 7, 10, 11], "part": [2, 9, 10, 11], "o": [2, 4, 5, 6, 7], "instal": [2, 4, 5, 6, 7], "b": [2, 6], "virtual": 2, "environ": 2, "packag": [2, 7], "activ": [2, 5], "thonni": [2, 4, 7], "id": [2, 7], "2": [2, 3, 5, 6, 7, 9, 10, 11], "check": [2, 3, 7, 10, 11], "3": [2, 3, 4, 6, 7, 9, 10, 11], "mux": [2, 6, 10, 11], "address": [2, 4, 10, 11], "valid": [2, 10, 11], "design": [2, 7, 9, 10, 11], "around": [2, 4, 7], "whose": [2, 7, 10, 11], "main": [2, 7, 10, 11], "ar": [2, 3, 4, 6, 7, 9, 10, 11], "summar": [2, 7], "figur": [2, 4, 7, 10, 11], "below": [2, 3, 6, 7, 10, 11], "defin": [2, 6, 7, 9], "config": [2, 4, 7, 9, 10, 11], "py": [2, 4, 5, 7, 9, 10, 11], "cover": [2, 7], "section": [2, 7, 9, 10, 11], "acquisit": [2, 7], "set": [2, 3, 4, 7, 10, 11], "e": [2, 7, 10, 11], "stack": [2, 7, 10, 11], "separ": [2, 7], "json": [2, 7, 11], "default": [2, 5, 7], "ohmpi_set": [2, 7], "central": [2, 7], "contain": [2, 3, 6, 7, 10, 11], "class": [2, 7, 9], "interact": [2, 7, 9], "other": [2, 6, 7, 10, 11], "util": [2, 3, 7], "handler": [2, 7], "detail": [2, 6, 7, 10], "layer": [2, 7], "top": [2, 4, 6, 7], "depend": [2, 3, 7, 10, 11], "case": [2, 3, 7, 9, 10, 11], "introduc": [2, 7, 9, 10, 11], "thei": [2, 7, 10, 11], "excel": [2, 7], "log": [2, 7], "run": [2, 3, 4, 5, 6, 7, 10, 11], "broker": [2, 7], "creat": [2, 3, 7, 9, 10, 11], "zip": [2, 7], "rotat": [2, 7], "disk": [2, 7], "first": [2, 3, 5, 6, 7, 9], "execut": [2, 3, 7, 10, 11], "name": [2, 5, 7, 9, 10, 11], "exec_logg": [2, 7], "second": [2, 6, 7, 10, 11], "data_logg": [2, 7], "third": [2, 6, 7], "plan": [2, 7], "state": [2, 7], "health": [2, 7], "soh": [2, 7], "futur": [2, 7], "By": [2, 7], "written": [2, 7], "consol": [2, 7], "print": [2, 4, 5, 7, 10, 11], "like": [2, 7], "store": [2, 7, 9], "local": [2, 7], "everi": [2, 5, 7], "dai": [2, 7], "when": [2, 6, 7, 9, 10, 11], "size": [2, 7], "exce": [2, 7], "maximum": [2, 7, 10, 11], "sent": [2, 7], "level": [2, 7], "advanc": [2, 7], "write": [2, 4, 5, 7, 9, 10, 11], "edit": [2, 7], "setup_logg": [2, 7], "custom": [2, 7], "mechan": [2, 5, 7, 10, 11], "need": [2, 4, 5, 7, 10, 11], "repositori": [2, 7, 10, 11], "should": [2, 3, 4, 5, 6, 7, 9, 10, 11], "follow": [2, 3, 4, 5, 6, 7, 9, 10, 11], "prefer": [2, 7, 10, 11], "desir": [2, 7], "option": [2, 3, 7, 10, 11], "usernam": [2, 7], "password": [2, 7], "secur": [2, 6, 7], "One": [2, 7], "sure": [2, 7, 9, 10, 11], "understand": [2, 7], "befor": [2, 5, 6, 7, 10, 11], "alter": [2, 7], "them": [2, 5, 7, 10, 11], "recommend": [2, 3, 7, 9, 10, 11], "keep": [2, 7], "copi": [2, 3, 7, 9], "avail": [2, 7, 9, 10, 11], "http": [2, 3, 4, 5, 7, 10, 11], "bash": [2, 7], "run_http_interfac": [2, 7], "sh": [2, 7], "import": [2, 7, 9], "script": [2, 5, 7, 9], "iot": [2, 7], "messag": [2, 7], "through": [2, 7, 10, 11], "friendli": [2, 7], "graphic": [2, 7], "well": [2, 3, 7, 10, 11], "quick": [2, 7], "easi": [2, 7], "wi": [2, 7], "fi": [2, 7], "access": [2, 3, 6, 7, 10, 11], "ap": [2, 7], "webserv": [2, 7], "serv": [2, 7, 10, 11], "index": [2, 7], "html": [2, 7], "laptop": [2, 7], "mobil": [2, 7], "phone": [2, 7], "upload": [2, 7], "sequenc": [2, 7, 10, 11], "chang": [2, 4, 5, 7, 9], "download": [2, 7, 10, 11], "To": [2, 4, 5, 7, 10, 11], "act": [2, 7], "raspap": [2, 7], "com": [2, 4, 5, 7, 10, 11], "runonstart": [2, 7], "onc": [2, 3, 7, 10, 11], "itself": [2, 7], "go": [2, 3, 5, 7], "10": [2, 4, 5, 6, 7, 10, 11], "141": [2, 7], "8080": [2, 7], "pseudo": [2, 7], "evolut": [2, 7], "quadrupol": [2, 7, 10, 11], "appar": [2, 7], "contact": [2, 4, 5, 7, 10, 11], "direct": [2, 6, 7, 10, 11], "especi": [2, 7], "suit": [2, 7], "test": [2, 3, 4, 5, 6, 7, 9, 10, 11], "autom": [2, 7], "ipython": [2, 7], "typic": [2, 7, 9, 10, 11], "termin": [2, 3, 4, 5, 6, 7, 10, 11], "ssh": [2, 7], "putti": [2, 7], "window": [2, 3, 7, 10, 11], "command": [2, 3, 7, 10, 11], "maco": [2, 7], "linux": [2, 7], "same": [2, 6, 7, 10, 11], "directori": [2, 3, 7, 9, 10, 11], "where": [2, 3, 7, 9, 10, 11], "found": [2, 7], "gitlab": [2, 7, 10, 11], "entir": [2, 7, 10, 11], "exampl": [2, 4, 5, 6, 7, 10, 11], "numpi": [2, 3, 7, 10, 11], "np": [2, 7], "chdir": [2, 7], "home": [2, 3, 7, 10, 11], "object": [2, 7], "k": [2, 7], "load": [2, 7], "manual": [2, 7, 10, 11], "injection_dur": [2, 7, 10, 11], "nb_stack": [2, 7], "half": [2, 7], "cycl": [2, 7], "nbr_mea": [2, 7, 10, 11], "number": [2, 4, 5, 7, 10, 11], "repeat": [2, 6, 7, 10, 11], "updat": [2, 7], "update_set": [2, 7], "arrai": [2, 7, 10, 11], "shape": [2, 7], "set_sequ": [2, 7], "n2": [2, 7], "pass": [2, 6, 7], "string": [2, 7], "load_sequ": [2, 7], "abmn": [2, 7, 10, 11], "txt": [2, 3, 7, 10, 11], "rs_check": [2, 7], "synchron": [2, 7], "wait": [2, 7], "return": [2, 7, 10, 11], "prompt": [2, 7], "run_sequ": [2, 7], "run_sequence_async": [2, 7], "thread": [2, 7], "immedi": [2, 7], "sleep": [2, 7], "interrupt": [2, 7], "kill": [2, 7], "asynchron": [2, 7], "multipl": [2, 3, 7], "given": [2, 7], "interv": [2, 7], "nb_mea": [2, 7], "three": [2, 4, 5, 7, 10, 11], "sequence_delai": [2, 7, 10, 11], "100": [2, 5, 7, 10, 11], "run_multiple_sequ": [2, 7], "singl": [2, 7, 9, 10, 11], "taken": [2, 7], "switch_mux_on": [2, 7], "run_measur": [2, 7], "switch_mux_off": [2, 7], "don": [2, 4, 7], "t": [2, 4, 5, 7], "forget": [2, 4, 7], "risk": [2, 7], "short": [2, 7], "circuit": [2, 4, 5, 7, 10, 11], "argument": [2, 7], "help": [2, 6, 7, 9], "do": [2, 5, 6, 7, 9], "autogain": [2, 7], "true": [2, 7], "gain": [2, 4, 7, 10, 11], "ad": [2, 7, 10, 11], "good": [2, 7], "remot": [2, 3, 7, 10, 11], "usag": [2, 7], "process": [2, 7], "sensor": [2, 7], "scope": [2, 7], "base": [2, 3, 5, 7, 9, 10, 11], "protocol": [2, 7, 10, 11], "internet": [2, 7], "thing": [2, 5, 7], "network": [2, 7], "auxiliari": [2, 7], "instrument": [2, 4, 7, 10, 11], "publish": [2, 7, 10], "subscrib": [2, 7], "approach": [2, 7], "mosquitto": [2, 7], "server": [2, 7], "reachabl": [2, 7], "net": [2, 7], "enabl": [2, 7, 10, 11], "servic": [2, 7], "install_local_mqtt_brok": [2, 7], "These": [2, 7, 10, 11], "examin": [2, 7], "easili": [2, 7, 9], "parti": [2, 7], "explor": [2, 7], "receiv": [2, 7], "reboot": [2, 7], "further": [2, 7], "format": [2, 7], "kwarg": [2, 7], "illustr": [2, 7, 10, 11], "cmd_id": [2, 7], "3fzxv121uitwgjwygcz4xw": [2, 7], "cmd": [2, 7], "nb_electrod": [2, 7, 10, 11], "3fzxv121uitwgjwygcz4yw": [2, 7], "tailor": [2, 7], "dashboard": [2, 7], "browser": [2, 7], "flow": [2, 7, 10, 11], "editor": [2, 7, 10, 11], "node": [2, 7], "red": [2, 4, 6, 7, 10, 11], "complex": [2, 7], "incorpor": [2, 5, 7], "output": [2, 4, 6, 7, 10, 11], "addit": [2, 7, 10, 11], "order": [2, 7, 9, 10, 11], "properli": [2, 7], "done": [2, 3, 7, 10, 11], "palett": [2, 7], "manag": [2, 7, 10, 11], "noder": [2, 7], "org": [2, 3, 7], "doc": [2, 7], "guid": [2, 7], "within": [2, 3, 7, 9, 10, 11], "ui": [2, 7], "tab": [2, 3, 7, 10, 11], "visual": [2, 7], "For": [2, 3, 4, 5, 7, 10, 11], "cookbook": [2, 7], "ohmpi": [3, 4, 5, 9], "quantiti": [3, 10, 11], "model": [3, 4, 10, 11], "hdmi": [3, 6], "cabl": [3, 4, 5, 6, 10, 11], "comput": [3, 10, 11], "mous": [3, 6, 10, 11], "keyboard": [3, 6, 10, 11], "system": [3, 9, 10, 11], "describ": [3, 4, 6, 9, 10, 11], "websit": [3, 10, 11], "watch": [3, 10, 11], "video": [3, 10, 11], "how": [3, 10, 11], "your": [3, 4, 5, 9, 10, 11], "latest": [3, 10, 11], "stabl": [3, 10, 11], "previous": [3, 6, 10, 11], "raspbian": [3, 10, 11], "visit": 3, "raspberrypi": 3, "en": 3, "were": [3, 4, 10, 11], "wire": [3, 5, 6, 10, 11], "spi": [3, 10, 11], "gpio": [3, 5, 6, 10, 11], "deactiv": [3, 10, 11], "i2c": [3, 4, 5], "via": [3, 10, 11], "gui": [3, 10, 11], "menu": [3, 10, 11], "failur": [3, 10, 11], "carri": [3, 10, 11], "out": [3, 6, 10, 11], "task": [3, 10, 11], "caus": [3, 10, 11], "relai": [3, 4, 5, 10, 11], "shield": [3, 10, 11], "dure": [3, 10, 11], "wai": [3, 9, 10, 11], "parallel": 3, "instanc": 3, "interpret": [3, 4, 10, 11], "each": [3, 5, 6, 10, 11], "discret": 3, "support": 3, "protect": 3, "problem": 3, "specifi": [3, 10, 11], "necessari": [3, 5, 6, 9, 10, 11], "ensur": [3, 10, 11], "libatla": [3, 10, 11], "dev": [3, 10, 11], "librari": [3, 10, 11], "sudo": [3, 10, 11], "apt": [3, 10, 11], "strongli": [3, 10, 11], "code": [3, 5, 9, 10, 11], "either": [3, 10, 11], "gather": [3, 10, 11], "python3": [3, 10, 11], "venv": [3, 10, 11], "bin": [3, 10, 11], "suffici": [3, 10, 11], "meet": [3, 10, 11], "export": 3, "cflag": 3, "fcommon": 3, "pip": [3, 10, 11], "rpi": [3, 6, 10, 11], "adafruit": [3, 4, 5, 10, 11], "blinka": [3, 10, 11], "panda": [3, 10, 11], "circuitpython": [3, 10, 11], "ads1x15": [3, 10, 11], "tca9548a": [3, 5], "mcp230xx": 3, "gpiozero": 3, "met": [3, 10, 11], "leav": [3, 10, 11], "simpli": [3, 6, 10, 11], "If": [3, 4, 9, 10, 11], "decid": [3, 10, 11], "setup": [3, 10, 11], "click": [3, 10, 11], "program": [3, 6, 10, 11], "pythonid": [3, 10, 11], "root": [3, 10, 11], "7": [3, 4, 5, 6, 10, 11], "usr": [3, 10, 11], "select": [3, 5, 10, 11], "On": [3, 10, 11], "altern": [3, 10, 11], "button": [3, 10, 11], "appear": [3, 4, 5, 10, 11], "locat": [3, 10, 11], "anoth": [3, 10, 11], "6": [3, 4, 5, 6, 10, 11], "find": [3, 10, 11], "folder": [3, 10, 11], "file": [3, 4, 9, 10, 11], "known": [3, 10, 11], "path": [3, 9, 10, 11], "close": [3, 10, 11], "ok": [3, 10, 11], "save": [3, 10, 11], "modif": [3, 6, 10, 11], "per": [4, 5, 10, 11], "total": [4, 5, 10, 11], "manufactur": [4, 5, 10, 11], "web": [4, 5], "58": [4, 10, 11], "75": 4, "www": [4, 5, 10, 11], "mouser": [4, 5], "fr": [4, 5, 10, 11], "productdetail": [4, 5], "seeed": 4, "studio": 4, "102110421": 4, "q": [4, 5], "7mvldsj5uaxen3lyyh3sqw": 4, "3d": [4, 5], "lm158n": 4, "amp": [4, 10, 11], "14": [4, 5, 6], "texa": [4, 10, 11], "lm358an": [4, 10, 11], "nopb": [4, 10, 11], "lm158j": 4, "x1j7hmvl2zh8vpefml8": 4, "2ffq": 4, "asler": [4, 5, 10, 11], "ads1115": [4, 10, 11], "11": [4, 6, 10, 11], "23": [4, 5, 6, 10, 11], "1085": 4, "2fha2pyfaduh": 4, "2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn": 4, "252bg": 4, "capacitor": [4, 11], "100nf": [4, 11], "50vdc": [4, 11], "ceram": [4, 11], "kemet": [4, 11], "c320c104k1": [4, 11], "c320c104k1r5ta7303": 4, "c4uyot": 4, "2flq1th4mcyoetma": 4, "resistor": [4, 5, 10, 11], "kohm": [4, 5, 10, 11], "5w": [4, 10, 11], "te": [4, 5, 10, 11], "h81k0bya": [4, 10, 11], "holsworthi": 4, "2fha2pyfaduhuylh7az": 4, "2fmjfh2xjoums6wztux4som": 4, "252bii": 4, "h81k5bya": [4, 10, 11], "2fha2pyfadugy9twham3ru9hmijohywhbin95knm": 4, "252bx": 4, "2fm": 4, "vishai": [4, 5], "ccf071k50gke36": 4, "dale": 4, "qkeozdl6eqpa6lzrlqfvow": 4, "762": 4, "524": 4, "cmf651m0000fkek143": 4, "ciayqk2gdckzia2levalkg": 4, "shunt": 4, "42": 4, "ohmit": 4, "41f2r0e": 4, "im6toxqzgoauedprb19mha": 4, "dual": [4, 5, 10, 11], "screw": [4, 5, 6, 10, 11], "08": [4, 5], "mm": [4, 5, 6, 10, 11], "pitch": [4, 5, 10, 11], "648": [4, 5, 10, 11], "cui": [4, 5], "devic": [4, 5, 9], "tb009": [4, 5], "508": [4, 5], "02be": [4, 5], "vlwxofp3u2wcfk5uckwtka": [4, 5], "dc": [4, 5, 10, 11], "convert": [4, 10, 11], "24v": [4, 11], "15": [4, 5, 6, 10, 11], "31": [4, 5, 6], "16": [4, 5, 6, 10, 11], "tracopow": [4, 11], "trn": [4, 11], "1215": [4, 11], "traco": [4, 11], "yca": 4, "2faaymw02gquicgqj0ta": 4, "dip": [4, 5], "line": [4, 5, 10, 11], "socket": [4, 5], "72": [4, 11], "mill": 4, "max": 4, "110": [4, 5, 10, 11], "43": [4, 10, 11], "308": 4, "41": [4, 5], "001000": 4, "iggadovctstu": 4, "2fqaur8narg": 4, "mgh": 4, "vip": 4, "gclid": 4, "eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw": 4, "aqy211eh": 4, "84": [4, 5], "36": [4, 6, 10, 11], "panason": 4, "industri": 4, "wktuvitrialgiu8hcm7dvq": 4, "449": 4, "796": 4, "preci": [4, 5], "83": 4, "304": 4, "001101": [4, 5], "2fha2pyfadujqkqx4wauig": 4, "2fmgndxmcnv": 4, "2f33nj0gbxroculucynpyong": 4, "mcp23008": 4, "593": 4, "sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw": 4, "header": [4, 5, 10, 11], "1x10": [4, 10, 11], "samtec": [4, 10, 11], "ssw": [4, 10, 11], "g": [4, 10, 11], "ru5fayqh": 4, "252be0w1orxzibqpw": 4, "smt": 4, "breakout": 4, "pcb": [4, 5, 9, 10, 11], "soic": 4, "1212": 4, "gurawfaegucaqqfvnvtyeg": 4, "eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw": 4, "ina282aid": 4, "ze4": 4, "2fufuz19ilfayzxocfra": 4, "thd": 4, "1211n": 4, "39": [4, 5, 6, 10, 11], "2fha2pyfadugpyeg4idvm": 4, "2fmsr": 4, "252b7an": 4, "2f0t3ruis9pcaqjlt4": 4, "252bnrpuooeq": 4, "20": [4, 6, 10, 11], "53": [4, 11], "ssq": 4, "120": [4, 5], "d": [4, 10, 11], "252be1bmvd": 4, "252bdzonqg": 4, "pin": [4, 5, 10, 11], "strip": [4, 5, 6, 10, 11], "ejector": [4, 5], "35": [4, 6], "blk": [4, 5], "10120550": [4, 5], "conrad": [4, 5], "bkl": [4, 5], "space": [4, 5], "254": [4, 5], "row": [4, 5], "pc": [4, 5], "741435": [4, 5], "searchterm": [4, 5], "searchtyp": [4, 5], "suggest": [4, 5, 10, 11], "searchsuggest": [4, 5], "male": [4, 5], "femal": [4, 5, 10, 11], "spacer": [4, 5, 6], "5m": [4, 6], "hexagonal": 4, "87": [4, 5], "48": [4, 10, 11], "harwin": 4, "r25": 4, "3002002": 4, "w0yvoo0ixfenuv0hsdc4": 4, "2fq": 4, "86": [4, 5], "437": 4, "1108331841001101": 4, "318": 4, "ftmup6kvi2tnqoeziaq": 4, "2fpa": 4, "show": [4, 10, 11], "schemat": [4, 11], "plug": [4, 10, 11], "plai": 4, "propos": [4, 10, 11], "florsch": [4, 10, 11], "bit": [4, 10, 11], "adc": [4, 10, 11], "analog": [4, 10, 11], "digit": [4, 5, 10, 11], "advantag": 4, "signal": [4, 10, 11], "valu": [4, 5, 10, 11], "could": [4, 6, 10, 11], "lie": [4, 10, 11], "between": [4, 5, 6, 10, 11], "114": [4, 10, 11], "directli": [4, 10, 11], "integr": 4, "ina282": 4, "realiz": 4, "precis": [4, 10, 11], "solder": [4, 10, 11], "optic": 4, "suppli": [4, 5, 6, 10, 11], "5v": [4, 10, 11], "tdh15": 4, "inpout": 4, "higher": [4, 11], "than": [4, 10, 11], "just": [4, 11], "decreas": 4, "kei": 4, "r_shunt": 4, "ohmpi_config": 4, "dict": 4, "pre": [4, 6], "adjust": [4, 10, 11], "13": [4, 5, 6, 10, 11], "tow": 4, "17": [4, 6, 10, 11], "19": [4, 6, 10, 11], "view": [4, 6], "fix": [4, 6], "dot": 4, "mark": [4, 6], "left": [4, 6], "corner": 4, "21": [4, 6, 10, 11], "mount": [4, 5, 6, 10, 11], "22": [4, 6, 10, 11], "lm158": 4, "amplifi": [4, 10, 11], "ads115": [4, 10, 11], "right": [4, 6], "3x11": 4, "wurth": 4, "elektronik": 4, "971110321": 4, "305": [4, 5], "apm": [4, 5], "hexseal": [4, 5], "rm3x8mm": [4, 5], "2701": [4, 5], "jjse": [4, 5], "2f12mkns3vxsdryxuhw": [4, 5], "shutdown": 4, "unplug": 4, "bottom": [4, 10, 11], "11mm": 4, "m3": [4, 5], "upper": 4, "port": [4, 6], "i2cdetect": [4, 5], "y": [4, 5], "everyth": 4, "screen": [4, 10, 11], "equival": [4, 10, 11], "1kohm": 4, "r2": [4, 10, 11], "220": 4, "r1": [4, 10, 11], "padboard": 4, "spool": 4, "prepar": [4, 5, 10, 11], "black": [4, 6, 10, 11], "ground": [4, 10, 11], "sample_measurement_exampl": 4, "result": [4, 10, 11], "channel": [5, 10, 11], "omron": 5, "g5le": 5, "vd": 5, "vdc": 5, "combin": 5, "zvn4206a": 5, "mofset": 5, "onli": [5, 9], "30": [5, 6, 10, 11], "enough": [5, 10, 11], "repres": [5, 10, 11], "512": 5, "expand": 5, "mcp23017": 5, "own": 5, "0x70": 5, "0x77": 5, "0x71": 5, "0x72": 5, "0x73": 5, "140": 5, "560": 5, "62": 5, "92": [5, 10, 11], "1580994": 5, "tru": [5, 10, 11], "diod": 5, "1n4007": 5, "256": 5, "091": 5, "296": 5, "sgaepimzzmueqxo7l": 5, "2fbpyakboruumren": 5, "56": 5, "776": 5, "205": 5, "46": 5, "103321": 5, "5twgzeq9e7hsylqaljjyrw": 5, "732": 5, "sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi": 5, "27": [5, 6, 10, 11], "325": 5, "over": 5, "503811": 5, "mosfet": 5, "nchannel": 5, "471": 5, "576": [5, 10], "vhuuswq2": 5, "252bsz9b": 5, "2ff6fcxt7g": 5, "100k\u03c9": 5, "061": 5, "616": 5, "beyschlag": 5, "mba02040c1003frp00": 5, "mzrxyrlhvdt9crf7zyf": 5, "2f5q": 5, "89": 5, "2717": 5, "sgaepimzzmsyydr3r27av4eqf73yoh": 5, "252baqg": 5, "252bz3hvktao": 5, "10120558": 5, "54": 5, "No": 5, "51": 5, "741727": 5, "10120862": 5, "connector": [5, 6, 10, 11], "strain": 5, "relief": 5, "44": [5, 10, 11], "742063": 5, "10120158": 5, "ribbon": [5, 6], "x": [5, 10, 11], "mm\u00b2": [5, 10, 11], "colour": 5, "1012015810": 5, "127": 5, "008": 5, "1548658": 5, "hex": [5, 6], "79": 5, "49": 5, "keyston": 5, "24300": 5, "uwqyq": 5, "2f2czwu0ejpozmzc2a": 5, "745": 5, "846": 5, "614": 5, "25515": 5, "2f2czwuxuhumfr": 5, "252bzuq": 5, "55": [5, 10, 11], "328": 5, "uqd7xcvsscnr3hwd6fta8g": 5, "duplic": 5, "build": [5, 10, 11], "therefor": [5, 10, 11], "identifi": 5, "assign": 5, "alloc": 5, "here": [5, 6, 11], "jumper": 5, "note": [5, 6, 10, 11], "zoom": [5, 6], "definit": 5, "simplifi": 5, "cm": [5, 6, 10, 11], "long": [5, 6], "flat": 5, "pole": [5, 10, 11], "detect": 5, "test_mux_board": 5, "cut": 6, "compos": 6, "proper": 6, "length": [6, 10, 11], "about": 6, "correspond": [6, 10], "crimp": [6, 10, 11], "idc": 6, "clamp": 6, "pai": [6, 10, 11], "attent": [6, 10, 11], "unbalanc": 6, "perpendicular": 6, "possibl": [6, 10, 11], "flush": 6, "posit": [6, 10, 11], "abov": [6, 10, 11], "profil": 6, "color": 6, "yellow": 6, "tin": 6, "end": [6, 10, 11], "shown": [6, 10, 11], "pictur": 6, "ii": 6, "gnd": [6, 10, 11], "nois": 6, "often": 6, "heard": 6, "clip": 6, "place": [6, 9, 10, 11], "procedur": 6, "purpl": 6, "relev": [6, 9], "fourth": 6, "nylon": 6, "photograph": 6, "4th": 6, "togeth": [6, 10, 11], "tie": 6, "pvc": 6, "plate": 6, "minimum": 6, "dimens": 6, "200": 6, "drill": 6, "remain": [6, 10, 11], "metal": 6, "tighten": 6, "so": [6, 10, 11], "usb": 6, "hole": [6, 10, 11], "26": [6, 10, 11], "add": [6, 10, 11], "attach": 6, "washer": 6, "nut": 6, "29": [6, 10, 11], "come": 6, "led": 6, "consid": 6, "temporari": 6, "orang": 6, "brown": 6, "blue": [6, 10, 11], "block": [6, 10, 11], "33": 6, "34": 6, "37": [6, 10, 11], "38": [6, 10, 11], "deliv": [6, 10, 11], "12vdc": 6, "enjoi": 6, "draft": 9, "TO": 9, "BE": 9, "review": 9, "intend": 9, "advic": 9, "best": 9, "practic": [9, 10, 11], "contribut": 9, "howev": [9, 10, 11], "maintain": 9, "track": [9, 10, 11], "promot": 9, "exchang": 9, "reus": 9, "contributor": 9, "ideal": 9, "few": 9, "step": [9, 10, 11], "distinguish": 9, "deal": 9, "compli": 9, "Such": 9, "focu": 9, "exist": [9, 10, 11], "reduc": 9, "rang": [9, 10, 11], "specif": [9, 10, 11], "newli": 9, "expos": 9, "minim": 9, "hardware_system": 9, "discuss": 9, "ohmpi_hardwar": 9, "initi": 9, "veri": [9, 11], "earli": 9, "stage": 9, "investig": 9, "solut": [9, 10, 11], "strategi": 9, "readi": 9, "conceiv": 9, "kicad": 9, "both": [9, 10, 11], "schema": 9, "alwai": 9, "branch": 9, "python": 9, "similar": 9, "modul": [9, 10, 11], "hardware_compon": 9, "abstract": 9, "abstract_hardware_compon": 9, "method": 9, "accord": [9, 10, 11], "hardware_config": 9, "dictionari": 9, "config_xxx": 9, "xxx": 9, "replac": [9, 11], "conduct": [9, 10, 11], "journal": 10, "correct": [10, 11], "bug": 10, "explain": 10, "miss": 10, "invit": 10, "commerci": [10, 11], "o1": [10, 11], "youtub": [10, 11], "wjwzhv1v3pk": [10, 11], "noob": [10, 11], "simpl": [10, 11], "unexpectedli": [10, 11], "boot": [10, 11], "cd": [10, 11], "gnu": [10, 11], "nano": [10, 11], "At": [10, 11], "op": [10, 11], "dl": [10, 11], "press": [10, 11], "ctrl": [10, 11], "enter": [10, 11], "escap": [10, 11], "wa": [10, 11], "Its": [10, 11], "studi": [10, 11], "hous": [10, 11], "diagram": [10, 11], "displai": [10, 11], "mimic": [10, 11], "behavior": [10, 11], "soil": [10, 11], "subject": [10, 11], "r11": [10, 11], "r10": [10, 11], "r12": [10, 11], "constitut": [10, 11], "stainless": [10, 11], "steel": [10, 11], "seri": [10, 11], "r9": [10, 11], "less": [10, 11], "sum": [10, 11], "inde": [10, 11], "000": [10, 11], "intens": [10, 11], "potenti": [10, 11], "calcul": [10, 11], "insert": [10, 11], "1115": [10, 11], "a1": [10, 11], "a0": [10, 11], "increas": [10, 11], "divid": [10, 11], "bridg": [10, 11], "r5": [10, 11], "r8": [10, 11], "r6": [10, 11], "r7": [10, 11], "a2": [10, 11], "a3": [10, 11], "obtain": [10, 11], "ly": [10, 11], "let": [10, 11], "equal": [10, 11], "multipli": [10, 11], "reduct": [10, 11], "despit": [10, 11], "high": [10, 11], "accur": [10, 11], "still": [10, 11], "calibr": [10, 11], "voltmet": [10, 11], "variou": [10, 11], "With": [10, 11], "disturb": [10, 11], "being": [10, 11], "estim": [10, 11], "mega": [10, 11], "shortcut": [10, 11], "excess": [10, 11], "lithium": [10, 11], "ion": [10, 11], "automobil": [10, 11], "lead": [10, 11], "acid": [10, 11], "strong": [10, 11], "hazard": [10, 11], "fuse": [10, 11], "onto": [10, 11], "ohmmet": [10, 11], "coeffici": [10, 11], "coef_p0": [10, 11], "coef_p1": [10, 11], "coef_p2": [10, 11], "coef_p3": [10, 11], "coef": [10, 11], "po": [10, 11], "p1": [10, 11], "r3": [10, 11], "r4": [10, 11], "p2": [10, 11], "p3": [10, 11], "r_ref": [10, 11], "slope": [10, 11], "convers": [10, 11], "p0": [10, 11], "accuraci": [10, 11], "lm358n": [10, 11], "appli": [10, 11], "weaker": 10, "stronger": [10, 11], "tx": [10, 11], "rememb": [10, 11], "holder": [10, 11], "f": [10, 11], "consist": [10, 11], "circul": [10, 11], "fig": [10, 11], "switch": [10, 11], "common": [10, 11], "neg": [10, 11], "normal": [10, 11], "simultan": [10, 11], "role": [10, 11], "revers": [10, 11], "polar": [10, 11], "thu": [10, 11], "energ": [10, 11], "next": [10, 11], "featur": [10, 11], "strict": [10, 11], "in1": [10, 11], "in2": [10, 11], "in3": [10, 11], "in4": [10, 11], "5vdc": [10, 11], "5vcc": [10, 11], "now": [10, 11], "mm2": [10, 11], "lastli": [10, 11], "congratul": [10, 11], "construct": [10, 11], "ert": [10, 11], "sever": [10, 11], "ten": [10, 11], "thousand": [10, 11], "stuck": [10, 11], "smaller": [10, 11], "hand": [10, 11], "cap": [10, 11], "produc": [10, 11], "clean": [10, 11], "distanc": [10, 11], "had": [10, 11], "extra": [10, 11], "As": [10, 11], "final": [10, 11], "actual": [10, 11], "horizont": [10, 11], "vertic": [10, 11], "06": [10, 11], "04": [10, 11], "09": [10, 11], "05": [10, 11], "din": [10, 11], "rail": [10, 11], "chosen": [10, 11], "consequ": [10, 11], "incom": [10, 11], "instead": [10, 11], "moreov": [10, 11], "turn": [10, 11], "bought": [10, 11], "down": [10, 11], "velleman": [10, 11], "wpm404": [10, 11], "potentiomet": [10, 11], "scienc": [10, 11], "framework": [10, 11], "manuscript": [10, 11], "osf": [10, 11], "io": [10, 11], "dzwb4": [10, 11], "irstea": [10, 11], "unzip": [10, 11], "master": [10, 11], "readm": [10, 11], "assist": [10, 11], "disconnect": [10, 11], "charg": [10, 11], "full": [10, 11], "capac": [10, 11], "fewer": [10, 11], "bank": [10, 11], "2a": [10, 11], "ll": [10, 11], "insid": [10, 11], "numer": [10, 11], "optim": [10, 11], "attribut": [10, 11], "the9": [10, 11], "hear": [10, 11], "characterist": [10, 11], "sound": [10, 11], "permut": [10, 11], "csv": [10, 11], "delai": [10, 11], "repetit": [10, 11], "evolv": [10, 11], "littl": [10, 11], "public": [10, 11], "articl": [10, 11], "sainsmart": [10, 11], "canal": 10, "pour": 10, "arduino": 10, "dsp": 10, "avr": 10, "pic": 10, "arm": 10, "99": [10, 11], "199": [10, 11], "sain": [10, 11], "smart": [10, 11], "101": [10, 11], "70": [10, 11], "103": [10, 11], "018": [10, 11], "1x1": [10, 11], "66": [10, 11], "1568649": [10, 11], "1x0": [10, 11], "71": [10, 11], "1565235": [10, 11], "68": [10, 11], "r": [10, 11], "pro": [10, 11], "897": [10, 11], "1332": [10, 11], "858": [10, 11], "627": [10, 11], "52": [10, 11], "upw50b50rv": [10, 11], "1083": [10, 11], "7ah": [10, 11], "537": [10, 11], "5488": [10, 11], "lr20": [10, 11], "9v": [10, 11], "185": [10, 11], "4686": [10, 11], "ferrul": [10, 11], "500": [10, 11], "piec": [10, 11], "weidmul": [10, 11], "9004330000": [10, 11], "966067": [10, 11], "car": 10, "littelfus": [10, 11], "fhac0002zxj": 10, "96": 10, "trn3": 11, "suppress": 11, "10v": 11, "fast": 11, "decoupl": 11, "last": 11, "prevent": 11, "overh": 11, "toler": 11, "orient": 11, "h": 11, "nf": 11, "tabl": 11, "jason": 11, "ohmpi_param": 11, "export_path": 11, "desktop": 11, "0251001": 11, "pat1l": 11}, "objects": {"": [[8, 0, 0, "-", "ohmpi"]]}, "objtypes": {"0": "py:module"}, "objnames": {"0": ["py", "module", "Python module"]}, "titleterms": {"ohmpi": [0, 1, 2, 6, 7, 10, 11], "open": 0, "sourc": 0, "hardwar": [0, 2, 7, 9], "resist": [0, 10, 11], "meter": 0, "summari": 0, "document": 0, "center": 0, "project": 1, "author": 1, "partner": 1, "cite": 1, "introduct": 1, "v2023": [2, 7], "64": [2, 7], "electrod": [2, 7, 10, 11], "12v": [2, 7], "The": [2, 7, 10, 11], "philosophi": [2, 7, 10, 11], "specif": [2, 7], "build": [2, 7], "an": [2, 7], "step": [2, 3, 4, 5, 6, 7], "softwar": [2, 7, 9], "oper": [2, 7, 10, 11], "system": [2, 7], "architectur": [2, 7], "logger": [2, 7], "configur": [2, 3, 7, 10, 11], "file": [2, 7], "interfac": [2, 7, 9], "applic": [2, 7], "web": [2, 7], "python": [2, 3, 7, 10, 11], "mqtt": [2, 7], "n": [3, 4, 5, 6], "1": [3, 10, 11], "raspberri": [3, 10, 11], "pi": [3, 10, 11], "part": [3, 4, 5], "A": [3, 4, 5], "o": [3, 10, 11], "instal": [3, 10, 11], "b": [3, 4, 5, 10, 11], "virtual": [3, 10, 11], "environ": [3, 10, 11], "packag": [3, 10, 11], "c": [3, 4, 5], "activ": [3, 10, 11], "thonni": [3, 10, 11], "id": [3, 10, 11], "2": 4, "measur": [4, 10, 11], "board": [4, 5, 10, 11], "assembli": [4, 5, 10, 11], "requir": [4, 5], "compon": [4, 5, 9, 10, 11], "list": [4, 5, 10, 11], "descript": [4, 10, 11], "start": 4, "up": 4, "check": 4, "3": 5, "mux": 5, "address": 5, "valid": 5, "4": 6, "assembl": 6, "api": 8, "refer": 8, "new": 9, "v": [10, 11], "01": 10, "limit": [10, 11], "32": [10, 11], "technic": [10, 11], "data": [10, 11], "current": [10, 11], "inject": [10, 11], "card": [10, 11], "connect": [10, 11], "electr": [10, 11], "implement": [10, 11], "first": [10, 11], "four": [10, 11], "multiplex": [10, 11], "instruct": [10, 11], "preliminari": [10, 11], "procedur": [10, 11], "onli": [10, 11], "initi": [10, 11], "startup": [10, 11], "paramet": [10, 11], "complet": [10, 11], "tabl": 10, "titl": 10, "02": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"OHMPI: Open source and open hardware resistivity-meter": [[0, "ohmpi-open-source-and-open-hardware-resistivity-meter"]], "Summary": [[0, null]], "OhmPi Document Center": [[0, null]], "OhmPi V2023 (64 electrodes and 12V)": [[2, "ohmpi-v2023-64-electrodes-and-12v"], [7, "ohmpi-v2023-64-electrodes-and-12v"]], "The philosophy of OhmPi": [[2, "the-philosophy-of-ohmpi"], [7, "the-philosophy-of-ohmpi"]], "Hardware": [[2, "hardware"], [7, "hardware"]], "Specifications": [[2, "specifications"], [7, "specifications"]], "Building an OhmPi V2023 step by step": [[2, "building-an-ohmpi-v2023-step-by-step"], [7, "building-an-ohmpi-v2023-step-by-step"]], "Software and operation": [[2, "software-and-operation"], [7, "software-and-operation"]], "System architecture": [[2, "system-architecture"], [7, "system-architecture"]], "Loggers": [[2, "loggers"], [7, "loggers"]], "Configuration file": [[2, "configuration-file"], [7, "configuration-file"]], "Interfaces and applications": [[2, "interfaces-and-applications"], [7, "interfaces-and-applications"]], "Web interface": [[2, "web-interface"], [7, "web-interface"]], "Python interface": [[2, "python-interface"], [7, "python-interface"]], "MQTT interface": [[2, "mqtt-interface"], [7, "mqtt-interface"]], "STEP n\u00b01 : Raspberry Pi configuration": [[3, "step-n1-raspberry-pi-configuration"]], "PART A: OS installation": [[3, "part-a-os-installation"]], "PART B: Virtual Environment and packages": [[3, "part-b-virtual-environment-and-packages"]], "PART C: Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)": [[3, "part-c-activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"]], "STEP n\u00b02: Measurement board": [[4, "step-n2-measurement-board"]], "PART A Assembly of the measurement board": [[4, "part-a-assembly-of-the-measurement-board"]], "Required components": [[4, "required-components"], [5, "required-components"]], "List of components": [[4, "id1"], [4, "id2"], [5, "id1"], [11, "id10"]], "Description": [[4, "description"]], "PART B Start-up of the measurement board": [[4, "part-b-start-up-of-the-measurement-board"]], "PART C Check the measurement board": [[4, "part-c-check-the-measurement-board"]], "STEP n\u00b03: MUX board": [[5, "step-n3-mux-board"]], "PART A Assembly of MUX board": [[5, "part-a-assembly-of-mux-board"]], "PART B MUX board address": [[5, "part-b-mux-board-address"]], "PART C Validation of MUX board": [[5, "part-c-validation-of-mux-board"]], "STEP n\u00b04: assemble the OhmPi": [[6, "step-n4-assemble-the-ohmpi"]], "API reference": [[8, "api-reference"]], "Software interface to new hardware components": [[9, "software-interface-to-new-hardware-components"]], "OhmPi V 1.01 (limited to 32 electrodes)": [[10, "ohmpi-v-1-01-limited-to-32-electrodes"]], "The philosophy of Ohmpi": [[10, "the-philosophy-of-ohmpi"], [11, "the-philosophy-of-ohmpi"]], "Technical data": [[10, "technical-data"], [11, "technical-data"]], "Raspberry Pi configuration": [[10, "raspberry-pi-configuration"], [11, "raspberry-pi-configuration"]], "OS installation": [[10, "os-installation"], [11, "os-installation"]], "Virtual Environment and packages": [[10, "virtual-environment-and-packages"], [11, "virtual-environment-and-packages"]], "Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)": [[10, "activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"], [11, "activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"]], "Assembly of the measuring/current injection cards, and connection with the Raspberry Pi": [[10, "assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi"], [11, "assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi"]], "Electrical resistivity measurements board": [[10, "electrical-resistivity-measurements-board"], [11, "electrical-resistivity-measurements-board"]], "a) Description": [[10, "a-description"], [11, "a-description"]], "b) Implementation": [[10, "b-implementation"], [11, "b-implementation"]], "Current injection board": [[10, "current-injection-board"], [11, "current-injection-board"]], "First four electrodes resistivity measurement": [[10, "first-four-electrodes-resistivity-measurement"], [11, "first-four-electrodes-resistivity-measurement"]], "Multiplexer implementation": [[10, "multiplexer-implementation"], [11, "multiplexer-implementation"]], "Electrode connection": [[10, "electrode-connection"], [11, "electrode-connection"]], "Operating instruction": [[10, "operating-instruction"], [11, "operating-instruction"]], "Preliminary procedure (Only for the initial operation)": [[10, "preliminary-procedure-only-for-the-initial-operation"], [11, "preliminary-procedure-only-for-the-initial-operation"]], "Startup procedure": [[10, "startup-procedure"], [11, "startup-procedure"]], "Electrical resistivity measurement parameters description": [[10, "electrical-resistivity-measurement-parameters-description"], [11, "electrical-resistivity-measurement-parameters-description"]], "Complete list of components": [[10, "complete-list-of-components"], [11, "complete-list-of-components"]], "Table Title": [[10, "id9"]], "OhmPi V 1.02 (limited to 32 electrodes)": [[11, "ohmpi-v-1-02-limited-to-32-electrodes"]], "OhmPi project": [[1, "ohmpi-project"]], "Authors:": [[1, "authors"]], "Partners:": [[1, "partners"]], "Citing OhmPi:": [[1, "citing-ohmpi"]], "Introduction :": [[1, "introduction"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/doc/build/html/source_rst/Ohmpi.html b/doc/build/html/source_rst/Ohmpi.html index a3a191205533156b9521726b9dc6ed0f6f2b704d..ae574b84e878368228bcd9e4ca28123713bb224b 100644 --- a/doc/build/html/source_rst/Ohmpi.html +++ b/doc/build/html/source_rst/Ohmpi.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../_static/doctools.js?v=888ff710"></script> + <script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../_static/js/theme.js"></script> <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> @@ -55,6 +55,7 @@ <li class="toctree-l1"><a class="reference internal" href="V2023.x.x/V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -82,15 +83,15 @@ <div itemprop="articleBody"> <section id="ohmpi-project"> -<h1>OhmPi project<a class="headerlink" href="#ohmpi-project" title="Permalink to this heading">ïƒ</a></h1> +<h1>OhmPi project<a class="headerlink" href="#ohmpi-project" title="Link to this heading">ïƒ</a></h1> <blockquote> -<div><a class="reference internal image-reference" href="../_images/logo_ohmpi1.JPG"><img alt="Logo OhmPi" class="align-center" src="../_images/logo_ohmpi1.JPG" style="width: 250px; height: 180px;" /></a> +<div><a class="reference internal image-reference" href="img/logo/ohmpi/logo_ohmpi.JPG"><img alt="Logo OhmPi" class="align-center" src="img/logo/ohmpi/logo_ohmpi.JPG" style="width: 250px; height: 180px;" /></a> </div></blockquote> <div class="line-block"> <div class="line"><br /></div> </div> <section id="authors"> -<h2><strong>Authors:</strong><a class="headerlink" href="#authors" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>Authors:</strong><a class="headerlink" href="#authors" title="Link 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> @@ -100,7 +101,7 @@ </div> </section> <section id="partners"> -<h2><strong>Partners:</strong><a class="headerlink" href="#partners" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>Partners:</strong><a class="headerlink" href="#partners" title="Link to this heading">ïƒ</a></h2> <table class="docutils align-center"> <tbody> <tr class="row-odd"><td></td> @@ -115,7 +116,7 @@ </table> </section> <section id="citing-ohmpi"> -<h2><strong>Citing OhmPi:</strong><a class="headerlink" href="#citing-ohmpi" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>Citing OhmPi:</strong><a class="headerlink" href="#citing-ohmpi" title="Link to this heading">ïƒ</a></h2> <div class="line-block"> <div class="line"><br /></div> </div> @@ -127,7 +128,7 @@ </div> </section> <section id="introduction"> -<h2><strong>Introduction :</strong><a class="headerlink" href="#introduction" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>Introduction :</strong><a class="headerlink" href="#introduction" title="Link to this heading">ïƒ</a></h2> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. diff --git a/doc/build/html/source_rst/V2023.x.x/V2023.html b/doc/build/html/source_rst/V2023.x.x/V2023.html index ddeb42b7501b651c3cab7cc9412aa2a6151d17a6..39ad5875fd4260cf603f07a851495061391e82e2 100644 --- a/doc/build/html/source_rst/V2023.x.x/V2023.html +++ b/doc/build/html/source_rst/V2023.x.x/V2023.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> @@ -75,6 +75,7 @@ </li> <li class="toctree-l1"><a class="reference internal" href="../V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -102,7 +103,7 @@ <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> +<h1>OhmPi V2023 (64 electrodes and 12V)<a class="headerlink" href="#ohmpi-v2023-64-electrodes-and-12v" title="Link 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> @@ -124,7 +125,7 @@ This new version is made up of:</p> <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> +<h2>The philosophy of OhmPi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Link 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. @@ -132,9 +133,9 @@ We will stop the development on the version V1.0x, to dedicate our efforts on th </section> <hr class="docutils" /> <section id="hardware"> -<h2>Hardware<a class="headerlink" href="#hardware" title="Permalink to this heading">ïƒ</a></h2> +<h2>Hardware<a class="headerlink" href="#hardware" title="Link to this heading">ïƒ</a></h2> <section id="specifications"> -<h3>Specifications<a class="headerlink" href="#specifications" title="Permalink to this heading">ïƒ</a></h3> +<h3>Specifications<a class="headerlink" href="#specifications" title="Link to this heading">ïƒ</a></h3> <table class="docutils align-default"> <thead> <tr class="row-odd"><th class="head"><p><strong>Parameter</strong></p></th> @@ -210,7 +211,7 @@ control system</p></td> </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> +<h3>Building an OhmPi V2023 step by step<a class="headerlink" href="#building-an-ohmpi-v2023-step-by-step" title="Link to this heading">ïƒ</a></h3> <div class="toctree-wrapper compound"> <ul> <li class="toctree-l1"><a class="reference internal" href="V2023_step_01.html"><strong>STEP n°1</strong> : Raspberry Pi configuration</a><ul> @@ -237,9 +238,9 @@ control system</p></td> </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> +<h2>Software and operation<a class="headerlink" href="#software-and-operation" title="Link 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> +<h3>System architecture<a class="headerlink" href="#system-architecture" title="Link 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> <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> @@ -247,7 +248,7 @@ The acquisition settings (i.e. injection duration, stacks…) are defined in a s 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> +<h3>Loggers<a class="headerlink" href="#loggers" title="Link 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> @@ -255,7 +256,7 @@ Specific handlers have been implemented for running with ohmpi.py (one for loggi <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> +<h3>Configuration file<a class="headerlink" href="#configuration-file" title="Link 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> @@ -263,14 +264,14 @@ This file should be edited to customize the configuration following the user’s <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> +<h3>Interfaces and applications<a class="headerlink" href="#interfaces-and-applications" title="Link 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> +<h4>Web interface<a class="headerlink" href="#web-interface" title="Link 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 @@ -284,24 +285,24 @@ to access the interface.</p> <figure class="align-default" id="id4"> <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="#id4" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Web interface with its interactive pseudo-section.</span><a class="headerlink" href="#id4" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id5"> <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="#id5" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Evolution of quadrupole apparent resistivity with time.</span><a class="headerlink" href="#id5" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id6"> <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="#id6" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Contact resistance check.</span><a class="headerlink" href="#id6" title="Link 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> +<h4>Python interface<a class="headerlink" href="#python-interface" title="Link 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 @@ -312,7 +313,7 @@ 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="id7"> -<div class="code-block-caption"><span class="caption-text">Example of using the Python API to control OhmPi</span><a class="headerlink" href="#id7" title="Permalink to this code">ïƒ</a></div> +<div class="code-block-caption"><span class="caption-text">Example of using the Python API to control OhmPi</span><a class="headerlink" href="#id7" title="Link 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> @@ -365,7 +366,7 @@ files (.json and .py).</p> </div> </section> <section id="mqtt-interface"> -<h4>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Permalink to this heading">ïƒ</a></h4> +<h4>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Link 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> @@ -373,25 +374,25 @@ files (.json and .py).</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="id8"> -<div class="code-block-caption"><span class="caption-text">Updating acquisition settings.</span><a class="headerlink" href="#id8" 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 - } - } -} +<div class="code-block-caption"><span class="caption-text">Updating acquisition settings.</span><a class="headerlink" href="#id8" title="Link 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">"update_settings"</span><span class="p">,</span><span class="w"> </span><span class="err">Depe</span><span class="kc">n</span><span class="err">di</span><span class="kc">n</span><span class="err">g</span><span class="w"> </span><span class="err">o</span><span class="kc">n</span><span class="w"> </span><span class="kc">t</span><span class="err">he</span><span class="w"> </span><span class="err">experime</span><span class="kc">nt</span><span class="w"> </span><span class="kc">nee</span><span class="err">ds</span><span class="p">,</span><span class="w"> </span><span class="err">MQTT</span><span class="w"> </span><span class="err">brokers</span><span class="w"> </span><span class="err">ca</span><span class="kc">n</span><span class="w"> </span><span class="err">be</span><span class="w"> </span><span class="err">se</span><span class="kc">t</span><span class="w"> </span><span class="err">up</span><span class="w"> </span><span class="err">locally</span><span class="w"> </span><span class="err">o</span><span class="kc">n</span><span class="w"> </span><span class="kc">t</span><span class="err">he</span><span class="w"> </span><span class="err">Raspberry</span><span class="w"> </span><span class="err">Pi</span><span class="w"> </span><span class="err">or</span><span class="w"> </span><span class="err">o</span><span class="kc">n</span><span class="w"> </span><span class="err">a</span><span class="w"> </span><span class="err">local</span><span class="w"> </span><span class="err">or</span><span class="w"> </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="err">server.</span> +<span class="w"> </span><span class="nt">"kwargs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> +<span class="w"> </span><span class="nt">"config"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> +<span class="w"> </span><span class="nt">"nb_meas"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"nb_electrodes"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"nb_stack"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"injection_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"sequence_delay"</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span> +<span class="w"> </span><span class="p">}</span> +<span class="w"> </span><span class="p">}</span> +<span class="p">}</span> </pre></div> </div> </div> <div class="literal-block-wrapper docutils container" id="id9"> -<div class="code-block-caption"><span class="caption-text">Check contact resistances</span><a class="headerlink" href="#id9" title="Permalink to this code">ïƒ</a></div> +<div class="code-block-caption"><span class="caption-text">Check contact resistances</span><a class="headerlink" href="#id9" title="Link 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> @@ -400,7 +401,7 @@ MQTT commands are sent in JSON format following the Python API with kwargs as il </div> </div> <div class="literal-block-wrapper docutils container" id="id10"> -<div class="code-block-caption"><span class="caption-text">Running a sequence.</span><a class="headerlink" href="#id10" title="Permalink to this code">ïƒ</a></div> +<div class="code-block-caption"><span class="caption-text">Running a sequence.</span><a class="headerlink" href="#id10" title="Link 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> @@ -409,7 +410,7 @@ MQTT commands are sent in JSON format following the Python API with kwargs as il </div> </div> <div class="literal-block-wrapper docutils container" id="id11"> -<div class="code-block-caption"><span class="caption-text">Running same sequence multiple times (nb_meas).</span><a class="headerlink" href="#id11" title="Permalink to this code">ïƒ</a></div> +<div class="code-block-caption"><span class="caption-text">Running same sequence multiple times (nb_meas).</span><a class="headerlink" href="#id11" title="Link 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> @@ -418,7 +419,7 @@ MQTT commands are sent in JSON format following the Python API with kwargs as il </div> </div> <div class="literal-block-wrapper docutils container" id="id12"> -<div class="code-block-caption"><span class="caption-text">Interrupt current acquisition.</span><a class="headerlink" href="#id12" title="Permalink to this code">ïƒ</a></div> +<div class="code-block-caption"><span class="caption-text">Interrupt current acquisition.</span><a class="headerlink" href="#id12" title="Link 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> @@ -433,19 +434,19 @@ This may help designing complex IoT experiments and monitoring systems in which <figure class="align-default" id="id13"> <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="#id13" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Example flow in node-red to interact with an OhmPi.</span><a class="headerlink" href="#id13" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id14"> <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="#id14" title="Permalink to this image">ïƒ</a></p> +<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="#id14" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id15"> <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="#id15" title="Permalink to this image">ïƒ</a></p> +<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="#id15" title="Link 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> diff --git a/doc/build/html/source_rst/V2023.x.x/V2023_step_01.html b/doc/build/html/source_rst/V2023.x.x/V2023_step_01.html index 74eb1526e51868143b20a526f5a624e48b783d90..f3f710e32dc48e82d0d94574dc51e7074971e679 100644 --- a/doc/build/html/source_rst/V2023.x.x/V2023_step_01.html +++ b/doc/build/html/source_rst/V2023.x.x/V2023_step_01.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> @@ -64,6 +64,7 @@ </li> <li class="toctree-l1"><a class="reference internal" href="../V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -92,13 +93,13 @@ <div itemprop="articleBody"> <section id="step-n1-raspberry-pi-configuration"> -<h1><strong>STEP n°1</strong> : Raspberry Pi configuration<a class="headerlink" href="#step-n1-raspberry-pi-configuration" title="Permalink to this heading">ïƒ</a></h1> +<h1><strong>STEP n°1</strong> : Raspberry Pi configuration<a class="headerlink" href="#step-n1-raspberry-pi-configuration" title="Link 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> <section id="part-a-os-installation"> -<h2><strong>PART A:</strong> OS installation<a class="headerlink" href="#part-a-os-installation" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART A:</strong> OS installation<a class="headerlink" href="#part-a-os-installation" title="Link to this heading">ïƒ</a></h2> <table class="docutils align-default"> <tbody> <tr class="row-odd"><td><p><strong>Required components</strong></p></td> @@ -141,7 +142,7 @@ For this step, the installation instructions are well described on the Raspberry </div> </section> <section id="part-b-virtual-environment-and-packages"> -<h2><strong>PART B:</strong> Virtual Environment and packages<a class="headerlink" href="#part-b-virtual-environment-and-packages" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART B:</strong> Virtual Environment and packages<a class="headerlink" href="#part-b-virtual-environment-and-packages" title="Link to this heading">ïƒ</a></h2> <p>A virtual environment is a way to have multiple, parallel instances of the Python interpreter, each with different package sets and different configurations. Each virtual environment contains a discrete copy of the Python interpreter, including copies of its support utilities. It also protects your system in case of problems with the packages.</p> <p>All dependencies are specified in requirements.txt</p> @@ -178,7 +179,7 @@ to leave the virtual environment simply type:</p> </div> </section> <section id="part-c-activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"> -<h2><strong>PART C:</strong> Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)<a class="headerlink" href="#part-c-activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART C:</strong> Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)<a class="headerlink" href="#part-c-activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi" title="Link to this heading">ïƒ</a></h2> <p>If you decided to use a virtual environment, it is necessary to setup Thonny Python IDE the first time you use it.</p> <p>1- Run the Thonny Python IDE software, Click on raspberry access <strong>menu > programming> Thonny pythonIDE</strong></p> <p>2- Thonny opens, Python runs on the root (Python 3.7.3 (/usr/bin/python3))</p> diff --git a/doc/build/html/source_rst/V2023.x.x/V2023_step_02.html b/doc/build/html/source_rst/V2023.x.x/V2023_step_02.html index 6f76d7dde2144e95bd9cc194141fd8f42e002485..9428df38fb8046b13a0d42be3d321f3285b275f0 100644 --- a/doc/build/html/source_rst/V2023.x.x/V2023_step_02.html +++ b/doc/build/html/source_rst/V2023.x.x/V2023_step_02.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> @@ -64,6 +64,7 @@ </li> <li class="toctree-l1"><a class="reference internal" href="../V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -92,20 +93,20 @@ <div itemprop="articleBody"> <section id="step-n2-measurement-board"> -<h1><strong>STEP n°2</strong>: Measurement board<a class="headerlink" href="#step-n2-measurement-board" title="Permalink to this heading">ïƒ</a></h1> +<h1><strong>STEP n°2</strong>: Measurement board<a class="headerlink" href="#step-n2-measurement-board" title="Link 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> <section id="part-a-assembly-of-the-measurement-board"> -<h2><strong>PART A</strong> Assembly of the measurement board<a class="headerlink" href="#part-a-assembly-of-the-measurement-board" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART A</strong> Assembly of the measurement board<a class="headerlink" href="#part-a-assembly-of-the-measurement-board" title="Link to this heading">ïƒ</a></h2> <section id="required-components"> -<h3>Required components<a class="headerlink" href="#required-components" title="Permalink to this heading">ïƒ</a></h3> +<h3>Required components<a class="headerlink" href="#required-components" title="Link to this heading">ïƒ</a></h3> <figure class="align-center"> <a class="reference internal image-reference" href="../../_images/00_mes_board_components.jpg"><img alt="alternate text" src="../../_images/00_mes_board_components.jpg" style="width: 600px; height: 450px;" /></a> </figure> <table class="docutils align-default" id="id1"> -<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id1" title="Permalink to this table">ïƒ</a></caption> +<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id1" title="Link to this table">ïƒ</a></caption> <colgroup> <col style="width: 8%" /> <col style="width: 18%" /> @@ -328,7 +329,7 @@ </table> </section> <section id="description"> -<h3>Description<a class="headerlink" href="#description" title="Permalink to this heading">ïƒ</a></h3> +<h3>Description<a class="headerlink" href="#description" title="Link to this heading">ïƒ</a></h3> <figure class="align-center"> <a class="reference internal image-reference" href="../../_images/schema_measurement_board.jpg"><img alt="alternate text" src="../../_images/schema_measurement_board.jpg" style="width: 600px; height: 450px;" /></a> </figure> @@ -568,7 +569,7 @@ corners)</p></td> </section> </section> <section id="part-b-start-up-of-the-measurement-board"> -<h2><strong>PART B</strong> Start-up of the measurement board<a class="headerlink" href="#part-b-start-up-of-the-measurement-board" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART B</strong> Start-up of the measurement board<a class="headerlink" href="#part-b-start-up-of-the-measurement-board" title="Link to this heading">ïƒ</a></h2> <table class="docutils align-default"> <tbody> <tr class="row-odd"><td><p><strong>Required components</strong></p></td> @@ -576,7 +577,7 @@ corners)</p></td> </tbody> </table> <table class="docutils align-default" id="id2"> -<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id2" title="Permalink to this table">ïƒ</a></caption> +<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id2" title="Link to this table">ïƒ</a></caption> <colgroup> <col style="width: 8%" /> <col style="width: 18%" /> @@ -675,7 +676,7 @@ Raspberry Pi’s power port.</p></td> </table> </section> <section id="part-c-check-the-measurement-board"> -<h2><strong>PART C</strong> Check the measurement board<a class="headerlink" href="#part-c-check-the-measurement-board" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART C</strong> Check the measurement board<a class="headerlink" href="#part-c-check-the-measurement-board" title="Link to this heading">ïƒ</a></h2> <blockquote> <div><p>Run the terminal, and write</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">i2cdetect</span> <span class="o">-</span><span class="n">y</span> <span class="mi">1</span> diff --git a/doc/build/html/source_rst/V2023.x.x/V2023_step_03.html b/doc/build/html/source_rst/V2023.x.x/V2023_step_03.html index 81f98e4879bcdd66d88c5e46b89549b30c5306e4..49172b0fbb659714cc254656522125d11c66618e 100644 --- a/doc/build/html/source_rst/V2023.x.x/V2023_step_03.html +++ b/doc/build/html/source_rst/V2023.x.x/V2023_step_03.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> @@ -64,6 +64,7 @@ </li> <li class="toctree-l1"><a class="reference internal" href="../V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -96,7 +97,7 @@ <p><strong>OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.</strong></p> </div> <section id="step-n3-mux-board"> -<h1><strong>STEP n°3:</strong> MUX board<a class="headerlink" href="#step-n3-mux-board" title="Permalink to this heading">ïƒ</a></h1> +<h1><strong>STEP n°3:</strong> MUX board<a class="headerlink" href="#step-n3-mux-board" title="Link to this heading">ïƒ</a></h1> <p>The multiplexing of the channels is a mechanical multiplexing based on OMRON’s manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs. We used gpio expander I2C (MCP23017). We have associated these components with an I2C multiplexer of type type TCA9548A from adafruit. @@ -104,14 +105,14 @@ This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each car In the following presentation for an OhmPi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N. 0X73 for the N channel. 4 MUX board will be needed to multiplex an OhmPi 64 electrodes.</p> <section id="part-a-assembly-of-mux-board"> -<h2><strong>PART A</strong> Assembly of MUX board<a class="headerlink" href="#part-a-assembly-of-mux-board" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART A</strong> Assembly of MUX board<a class="headerlink" href="#part-a-assembly-of-mux-board" title="Link to this heading">ïƒ</a></h2> <section id="required-components"> -<h3>Required components<a class="headerlink" href="#required-components" title="Permalink to this heading">ïƒ</a></h3> +<h3>Required components<a class="headerlink" href="#required-components" title="Link to this heading">ïƒ</a></h3> <figure class="align-center"> <a class="reference internal image-reference" href="../../_images/MUX_board_components.jpg"><img alt="alternate text" src="../../_images/MUX_board_components.jpg" style="width: 600px; height: 650px;" /></a> </figure> <table class="docutils align-default" id="id1"> -<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id1" title="Permalink to this table">ïƒ</a></caption> +<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id1" title="Link to this table">ïƒ</a></caption> <colgroup> <col style="width: 8%" /> <col style="width: 18%" /> @@ -401,7 +402,7 @@ In the following presentation for an OhmPi 64 electrodes, we will use the addres </section> </section> <section id="part-b-mux-board-address"> -<h2><strong>PART B</strong> MUX board address<a class="headerlink" href="#part-b-mux-board-address" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART B</strong> MUX board address<a class="headerlink" href="#part-b-mux-board-address" title="Link to this heading">ïƒ</a></h2> <p>To build an ohmpi it is necessary to have 4 MUX boards, with 4 different addresses. It is therefore necessary to identify each board, by assigning an address, which will be allocated in the OhmPi code. We present here the addresses selected by default.</p> <p>For the A electrode board, we suggest addressing it with address 0x70:</p> @@ -474,7 +475,7 @@ electrode name on the mux board (B).</p></td> </table> </section> <section id="part-c-validation-of-mux-board"> -<h2><strong>PART C</strong> Validation of MUX board<a class="headerlink" href="#part-c-validation-of-mux-board" title="Permalink to this heading">ïƒ</a></h2> +<h2><strong>PART C</strong> Validation of MUX board<a class="headerlink" href="#part-c-validation-of-mux-board" title="Link to this heading">ïƒ</a></h2> <p>The first step is to test the Mux boards before assembling them definitively. To test the Mux boards, it will be necessary first to make a simplified assembly of the Mux board and the measurement board.</p> <p>The first thing to do is to prepare a 50 cm long flat wire with two 6-poles connectors.</p> diff --git a/doc/build/html/source_rst/V2023.x.x/V2023_step_04.html b/doc/build/html/source_rst/V2023.x.x/V2023_step_04.html index 6758bf4e3e05a2ea7a7d523cd7ad5f7649b05bd0..bf676907d90e271baf1a8ab33b6a685bfdacc034 100644 --- a/doc/build/html/source_rst/V2023.x.x/V2023_step_04.html +++ b/doc/build/html/source_rst/V2023.x.x/V2023_step_04.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> @@ -64,6 +64,7 @@ </li> <li class="toctree-l1"><a class="reference internal" href="../V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -96,7 +97,7 @@ <p><strong>OhmPi is a participative project open to all, it requires skills in electronics and to respect the safety rules. OhmPi must be assembled in a professional context and by people competent in electronics. The OhmPi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The OhmPi team cannot be held responsible if the equipment does not work after assembly.</strong></p> </div> <section id="step-n4-assemble-the-ohmpi"> -<h1><strong>STEP n°4:</strong> assemble the OhmPi<a class="headerlink" href="#step-n4-assemble-the-ohmpi" title="Permalink to this heading">ïƒ</a></h1> +<h1><strong>STEP n°4:</strong> assemble the OhmPi<a class="headerlink" href="#step-n4-assemble-the-ohmpi" title="Link to this heading">ïƒ</a></h1> <table class="docutils align-center"> <tbody> <tr class="row-odd"><td rowspan="2"><p>1</p></td> diff --git a/doc/build/html/source_rst/V2024.x.x/V2024.html b/doc/build/html/source_rst/V2024.x.x/V2024.html index e0123cbbd40b27777b40a1394b7c58499db36dc7..aae4dd9e2333c521ae502a8d206a35e9f14e4d2b 100644 --- a/doc/build/html/source_rst/V2024.x.x/V2024.html +++ b/doc/build/html/source_rst/V2024.x.x/V2024.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> @@ -99,7 +99,7 @@ <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> +<h1>OhmPi V2023 (64 electrodes and 12V)<a class="headerlink" href="#ohmpi-v2023-64-electrodes-and-12v" title="Link 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> @@ -121,7 +121,7 @@ This new version is made up of:</p> <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> +<h2>The philosophy of OhmPi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Link 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. @@ -129,9 +129,9 @@ We will stop the development on the version V1.0x, to dedicate our efforts on th </section> <hr class="docutils" /> <section id="hardware"> -<h2>Hardware<a class="headerlink" href="#hardware" title="Permalink to this heading">ïƒ</a></h2> +<h2>Hardware<a class="headerlink" href="#hardware" title="Link to this heading">ïƒ</a></h2> <section id="specifications"> -<h3>Specifications<a class="headerlink" href="#specifications" title="Permalink to this heading">ïƒ</a></h3> +<h3>Specifications<a class="headerlink" href="#specifications" title="Link to this heading">ïƒ</a></h3> <table class="docutils align-default"> <thead> <tr class="row-odd"><th class="head"><p><strong>Parameter</strong></p></th> @@ -207,20 +207,20 @@ control system</p></td> </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> +<h3>Building an OhmPi V2023 step by step<a class="headerlink" href="#building-an-ohmpi-v2023-step-by-step" title="Link to this heading">ïƒ</a></h3> <div class="toctree-wrapper compound"> </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> +<h2>Software and operation<a class="headerlink" href="#software-and-operation" title="Link 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> +<h3>System architecture<a class="headerlink" href="#system-architecture" title="Link 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="source_rst/V2024.x.x/img/architecture.png" src="source_rst/V2024.x.x/img/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> +<p><span class="caption-text">Software architecture of OhmPi V2023.</span><a class="headerlink" href="#id4" title="Link 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. @@ -229,7 +229,7 @@ The acquisition settings (i.e. injection duration, stacks…) are defined in a s 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> +<h3>Loggers<a class="headerlink" href="#loggers" title="Link 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> @@ -237,7 +237,7 @@ Specific handlers have been implemented for running with ohmpi.py (one for loggi <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> +<h3>Configuration file<a class="headerlink" href="#configuration-file" title="Link 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> @@ -245,14 +245,14 @@ This file should be edited to customize the configuration following the user’s <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> +<h3>Interfaces and applications<a class="headerlink" href="#interfaces-and-applications" title="Link 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> +<h4>Web interface<a class="headerlink" href="#web-interface" title="Link 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 @@ -266,24 +266,24 @@ to access the interface.</p> <figure class="align-default" id="id5"> <img alt="source_rst/V2024.x.x/img/http-interface-pseudo-section.png" src="source_rst/V2024.x.x/img/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> +<p><span class="caption-text">Web interface with its interactive pseudo-section.</span><a class="headerlink" href="#id5" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id6"> <img alt="source_rst/V2024.x.x/img/http-interface-evolution.png" src="source_rst/V2024.x.x/img/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> +<p><span class="caption-text">Evolution of quadrupole apparent resistivity with time.</span><a class="headerlink" href="#id6" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id7"> <img alt="source_rst/V2024.x.x/img/http-interface-rs.png" src="source_rst/V2024.x.x/img/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> +<p><span class="caption-text">Contact resistance check.</span><a class="headerlink" href="#id7" title="Link 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> +<h4>Python interface<a class="headerlink" href="#python-interface" title="Link 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 @@ -294,7 +294,7 @@ 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="code-block-caption"><span class="caption-text">Example of using the Python API to control OhmPi</span><a class="headerlink" href="#id8" title="Link 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> @@ -347,7 +347,7 @@ files (.json and .py).</p> </div> </section> <section id="mqtt-interface"> -<h4>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Permalink to this heading">ïƒ</a></h4> +<h4>MQTT interface<a class="headerlink" href="#mqtt-interface" title="Link 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> @@ -355,25 +355,25 @@ files (.json and .py).</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 - } - } -} +<div class="code-block-caption"><span class="caption-text">Updating acquisition settings.</span><a class="headerlink" href="#id9" title="Link 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">"update_settings"</span><span class="p">,</span><span class="w"> </span><span class="err">Depe</span><span class="kc">n</span><span class="err">di</span><span class="kc">n</span><span class="err">g</span><span class="w"> </span><span class="err">o</span><span class="kc">n</span><span class="w"> </span><span class="kc">t</span><span class="err">he</span><span class="w"> </span><span class="err">experime</span><span class="kc">nt</span><span class="w"> </span><span class="kc">nee</span><span class="err">ds</span><span class="p">,</span><span class="w"> </span><span class="err">MQTT</span><span class="w"> </span><span class="err">brokers</span><span class="w"> </span><span class="err">ca</span><span class="kc">n</span><span class="w"> </span><span class="err">be</span><span class="w"> </span><span class="err">se</span><span class="kc">t</span><span class="w"> </span><span class="err">up</span><span class="w"> </span><span class="err">locally</span><span class="w"> </span><span class="err">o</span><span class="kc">n</span><span class="w"> </span><span class="kc">t</span><span class="err">he</span><span class="w"> </span><span class="err">Raspberry</span><span class="w"> </span><span class="err">Pi</span><span class="w"> </span><span class="err">or</span><span class="w"> </span><span class="err">o</span><span class="kc">n</span><span class="w"> </span><span class="err">a</span><span class="w"> </span><span class="err">local</span><span class="w"> </span><span class="err">or</span><span class="w"> </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="err">server.</span> +<span class="w"> </span><span class="nt">"kwargs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> +<span class="w"> </span><span class="nt">"config"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span> +<span class="w"> </span><span class="nt">"nb_meas"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"nb_electrodes"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"nb_stack"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"injection_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span> +<span class="w"> </span><span class="nt">"sequence_delay"</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span> +<span class="w"> </span><span class="p">}</span> +<span class="w"> </span><span class="p">}</span> +<span class="p">}</span> </pre></div> </div> </div> <div class="literal-block-wrapper docutils container" id="id10"> -<div class="code-block-caption"><span class="caption-text">Check contact resistances</span><a class="headerlink" href="#id10" title="Permalink to this code">ïƒ</a></div> +<div class="code-block-caption"><span class="caption-text">Check contact resistances</span><a class="headerlink" href="#id10" title="Link 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> @@ -382,7 +382,7 @@ MQTT commands are sent in JSON format following the Python API with kwargs as il </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="code-block-caption"><span class="caption-text">Running a sequence.</span><a class="headerlink" href="#id11" title="Link 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> @@ -391,7 +391,7 @@ MQTT commands are sent in JSON format following the Python API with kwargs as il </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="code-block-caption"><span class="caption-text">Running same sequence multiple times (nb_meas).</span><a class="headerlink" href="#id12" title="Link 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> @@ -400,7 +400,7 @@ MQTT commands are sent in JSON format following the Python API with kwargs as il </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="code-block-caption"><span class="caption-text">Interrupt current acquisition.</span><a class="headerlink" href="#id13" title="Link 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> @@ -415,19 +415,19 @@ This may help designing complex IoT experiments and monitoring systems in which <figure class="align-default" id="id14"> <img alt="source_rst/V2024.x.x/img/node-red_flow.png" src="source_rst/V2024.x.x/img/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> +<p><span class="caption-text">Example flow in node-red to interact with an OhmPi.</span><a class="headerlink" href="#id14" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id15"> <img alt="source_rst/V2024.x.x/img/node-red_interface_control.png" src="source_rst/V2024.x.x/img/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> +<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="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-default" id="id16"> <img alt="source_rst/V2024.x.x/img/node-red_interface_data.png" src="source_rst/V2024.x.x/img/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> +<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="Link 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> diff --git a/doc/build/html/source_rst/api.html b/doc/build/html/source_rst/api.html index 29c90780a6d00f02b5f4779e8a23d6fd7a97a88d..801837c2cbee5f53a3ebcc354c19dd75b899d5b9 100644 --- a/doc/build/html/source_rst/api.html +++ b/doc/build/html/source_rst/api.html @@ -11,14 +11,15 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../_static/doctools.js?v=888ff710"></script> + <script src="../_static/sphinx_highlight.js?v=dc90522c"></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="Software interface to new hardware components" href="developing_hardware_components.html" /> <link rel="prev" title="OhmPi V2023 (64 electrodes and 12V)" href="V2024.x.x/V2024.html" /> </head> @@ -50,6 +51,7 @@ <li class="toctree-l1 current"><a class="current reference internal" href="#">API reference</a><ul class="simple"> </ul> </li> +<li class="toctree-l1"><a class="reference internal" href="developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -77,7 +79,7 @@ <div itemprop="articleBody"> <section id="api-reference"> -<h1>API reference<a class="headerlink" href="#api-reference" title="Permalink to this heading">ïƒ</a></h1> +<h1>API reference<a class="headerlink" href="#api-reference" title="Link to this heading">ïƒ</a></h1> <div class="toctree-wrapper compound"> </div> <span class="target" id="module-ohmpi"></span></section> @@ -87,6 +89,7 @@ </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="V2024.x.x/V2024.html" class="btn btn-neutral float-left" title="OhmPi V2023 (64 electrodes and 12V)" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> + <a href="developing_hardware_components.html" class="btn btn-neutral float-right" title="Software interface to new hardware components" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/> diff --git a/doc/build/html/source_rst/developing_hardware_components.html b/doc/build/html/source_rst/developing_hardware_components.html index 7ee431e6d75a571a7f7a5a6429f4d5867ff01374..25e9be4d8119f70076914584f4a14b993300a0b5 100644 --- a/doc/build/html/source_rst/developing_hardware_components.html +++ b/doc/build/html/source_rst/developing_hardware_components.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../_static/doctools.js?v=888ff710"></script> + <script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../_static/js/theme.js"></script> <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> @@ -76,7 +76,7 @@ <div itemprop="articleBody"> <section id="software-interface-to-new-hardware-components"> -<h1>Software interface to new hardware components<a class="headerlink" href="#software-interface-to-new-hardware-components" title="Permalink to this heading">ïƒ</a></h1> +<h1>Software interface to new hardware components<a class="headerlink" href="#software-interface-to-new-hardware-components" title="Link to this heading">ïƒ</a></h1> <p><a href="#id1"><span class="problematic" id="id2">**</span></a>* DRAFT VERSION - TO BE REVIEWED * This section is intended for developers of a new hardware component as part of an OhmPi system.</p> <p>It presents some advices and best practices that should help developing new hardware components to work diff --git a/doc/build/html/source_rst/v1.xx/V1_01.html b/doc/build/html/source_rst/v1.xx/V1_01.html index 8a6d66e0f7c3dceded418a855cc7a119a2b8f272..82e90711b99db3f0e87fb6efa5156e135575bad6 100644 --- a/doc/build/html/source_rst/v1.xx/V1_01.html +++ b/doc/build/html/source_rst/v1.xx/V1_01.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> @@ -79,6 +79,7 @@ <li class="toctree-l1"><a class="reference internal" href="../V2023.x.x/V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -106,7 +107,7 @@ <div itemprop="articleBody"> <section id="ohmpi-v-1-01-limited-to-32-electrodes"> -<h1>OhmPi V 1.01 (limited to 32 electrodes)<a class="headerlink" href="#ohmpi-v-1-01-limited-to-32-electrodes" title="Permalink to this heading">ïƒ</a></h1> +<h1>OhmPi V 1.01 (limited to 32 electrodes)<a class="headerlink" href="#ohmpi-v-1-01-limited-to-32-electrodes" title="Link to this heading">ïƒ</a></h1> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>This version corresponds to the version published in the Hardware X journal. @@ -118,13 +119,13 @@ We invite you to refer to this document to assemble Ohmpi V1.01.</p> <p><strong>Ohmpi is a participative project open to all, it requires skills in electronics and to respect the safety rules. Ohmpi must be assembled in a professional context and by people competent in electronics. The Ohmpi team cannot be held responsible for any material or human damage which would be associated with the use or the assembly of OHMPI. The Ohmpi team cannot be held responsible if the equipment does not work after assembly.</strong></p> </div> <section id="the-philosophy-of-ohmpi"> -<h2>The philosophy of Ohmpi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Permalink to this heading">ïƒ</a></h2> +<h2>The philosophy of Ohmpi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Link to this heading">ïƒ</a></h2> <p>The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low-current injection, but suitable for small laboratory experiments and small field time monitoring</p> </section> <section id="technical-data"> -<h2>Technical data<a class="headerlink" href="#technical-data" title="Permalink to this heading">ïƒ</a></h2> +<h2>Technical data<a class="headerlink" href="#technical-data" title="Link to this heading">ïƒ</a></h2> <table class="docutils align-default"> <tbody> <tr class="row-odd"><td><p><strong>Parameter</strong></p></td> @@ -176,9 +177,9 @@ control system</p></td> </table> </section> <section id="raspberry-pi-configuration"> -<h2>Raspberry Pi configuration<a class="headerlink" href="#raspberry-pi-configuration" title="Permalink to this heading">ïƒ</a></h2> +<h2>Raspberry Pi configuration<a class="headerlink" href="#raspberry-pi-configuration" title="Link to this heading">ïƒ</a></h2> <section id="os-installation"> -<h3>OS installation<a class="headerlink" href="#os-installation" title="Permalink to this heading">ïƒ</a></h3> +<h3>OS installation<a class="headerlink" href="#os-installation" title="Link to this heading">ïƒ</a></h3> <p>The first step is to start up the Raspberry Pi board, including installation of an OS (operating system). For this step, the installation instructions are well described on the Raspberry website</p> <ol class="arabic simple"> @@ -228,7 +229,7 @@ To ensure that the GPIOs are in Low position, you will need to modify the /boot/ </ol> </section> <section id="virtual-environment-and-packages"> -<h3>Virtual Environment and packages<a class="headerlink" href="#virtual-environment-and-packages" title="Permalink to this heading">ïƒ</a></h3> +<h3>Virtual Environment and packages<a class="headerlink" href="#virtual-environment-and-packages" title="Link to this heading">ïƒ</a></h3> <p>All dependencies are specified in requirements.txt</p> <div class="admonition note"> <p class="admonition-title">Note</p> @@ -262,7 +263,7 @@ to leave the virtual environment simply type:</p> </div> </section> <section id="activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"> -<h3>Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)<a class="headerlink" href="#activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi" title="Permalink to this heading">ïƒ</a></h3> +<h3>Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)<a class="headerlink" href="#activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi" title="Link to this heading">ïƒ</a></h3> <p>If you decided to use a virtual environment, it is necessary to setup Thonny Python IDE the first time you use it.</p> <p>1- Run the Thonny Python IDE software, Click on raspberry access <strong>menu > programming> Thonny pythonIDE</strong></p> <p>2- Thonny opens, Python runs on the root (Python 3.7.3 (/usr/bin/python3))</p> @@ -288,11 +289,11 @@ to leave the virtual environment simply type:</p> </section> </section> <section id="assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi"> -<h2>Assembly of the measuring/current injection cards, and connection with the Raspberry Pi<a class="headerlink" href="#assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi" title="Permalink to this heading">ïƒ</a></h2> +<h2>Assembly of the measuring/current injection cards, and connection with the Raspberry Pi<a class="headerlink" href="#assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi" title="Link to this heading">ïƒ</a></h2> <section id="electrical-resistivity-measurements-board"> -<h3>Electrical resistivity measurements board<a class="headerlink" href="#electrical-resistivity-measurements-board" title="Permalink to this heading">ïƒ</a></h3> +<h3>Electrical resistivity measurements board<a class="headerlink" href="#electrical-resistivity-measurements-board" title="Link to this heading">ïƒ</a></h3> <section id="a-description"> -<h4>a) Description<a class="headerlink" href="#a-description" title="Permalink to this heading">ïƒ</a></h4> +<h4>a) Description<a class="headerlink" href="#a-description" title="Link to this heading">ïƒ</a></h4> <p>To measure electrical resistivity with Raspberry Pi, an ADS1115 was introduced, as proposed by Florsch [7]. The ADS1115 is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. Its value has been set at 2/3 in this study. The input signal value could lie between - to + 6.114 V. The ADS1115 is mounted on a board adapted from an in-house design. @@ -327,12 +328,12 @@ constitutes a potential hazard. We therefore recommend adding a 1.5-A fuse betwe <figure class="align-center" id="id1"> <a class="reference internal image-reference" href="../../_images/schema_measurement_board1.jpg"><img alt="alternate text" src="../../_images/schema_measurement_board1.jpg" style="width: 800px; height: 400px;" /></a> <figcaption> -<p><span class="caption-text">Measurement board</span><a class="headerlink" href="#id1" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Measurement board</span><a class="headerlink" href="#id1" title="Link to this image">ïƒ</a></p> </figcaption> </figure> </section> <section id="b-implementation"> -<h4>b) Implementation<a class="headerlink" href="#b-implementation" title="Permalink to this heading">ïƒ</a></h4> +<h4>b) Implementation<a class="headerlink" href="#b-implementation" title="Link to this heading">ïƒ</a></h4> <p>The measurement board must be printed using the PCB file (Source file repository), with components soldered onto it by following the steps described below and illustrated in the following figure :</p> <ul> @@ -376,19 +377,19 @@ place a fuse holder with a 1.5-A fuse for safety purposes.</p> <figure class="align-center" id="id2"> <a class="reference internal image-reference" href="../../_images/measurement_board.jpg"><img alt="alternate text" src="../../_images/measurement_board.jpg" style="width: 800px; height: 500px;" /></a> <figcaption> -<p><span class="caption-text">Measurement circuit board assembly: a) printed circuit board, b) adding the 1-KOhm resistors ± 1%, c)adding the 1.5-KOhm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers</span><a class="headerlink" href="#id2" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Measurement circuit board assembly: a) printed circuit board, b) adding the 1-KOhm resistors ± 1%, c)adding the 1.5-KOhm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers</span><a class="headerlink" href="#id2" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-center" id="id3"> <a class="reference internal image-reference" href="../../_images/measurement_board-2.jpg"><img alt="alternate text" src="../../_images/measurement_board-2.jpg" style="width: 800px; height: 700px;" /></a> <figcaption> -<p><span class="caption-text">Measurement board installation with Raspberry Pi</span><a class="headerlink" href="#id3" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Measurement board installation with Raspberry Pi</span><a class="headerlink" href="#id3" title="Link to this image">ïƒ</a></p> </figcaption> </figure> </section> </section> <section id="current-injection-board"> -<h3>Current injection board<a class="headerlink" href="#current-injection-board" title="Permalink to this heading">ïƒ</a></h3> +<h3>Current injection board<a class="headerlink" href="#current-injection-board" title="Link to this heading">ïƒ</a></h3> <p>To carry out the electrical resistivity measurement, the first step consists of injecting current into the ground. In our case, a simple 9-V lead-acid battery is used to create an electrical potential difference that results in current circulating into the ground. The current is injected through electrodes A and B (see Fig. 2). This @@ -403,7 +404,7 @@ they remain in the normally closed position. This set-up offers a simple and rob <figure class="align-center" id="id4"> <a class="reference internal image-reference" href="../../_images/current_board.jpg"><img alt="alternate text" src="../../_images/current_board.jpg" style="width: 800px; height: 400px;" /></a> <figcaption> -<p><span class="caption-text">Wiring of the 4-channel relay module board for current injection management</span><a class="headerlink" href="#id4" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Wiring of the 4-channel relay module board for current injection management</span><a class="headerlink" href="#id4" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <p>The next step consists of featuring the 4-channel relay module used for current injection and its assembly. The wiring @@ -416,20 +417,20 @@ to terminals B and A of the measurement board.</p> <figure class="align-center" id="id5"> <a class="reference internal image-reference" href="../../_images/installation_current_board.jpg"><img alt="alternate text" src="../../_images/installation_current_board.jpg" style="width: 800px; height: 700px;" /></a> <figcaption> -<p><span class="caption-text">Current injection board installation with Raspberry Pi</span><a class="headerlink" href="#id5" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Current injection board installation with Raspberry Pi</span><a class="headerlink" href="#id5" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <p>Congratulations, you have build a 4 electrodes resistivity-meter.</p> </section> <section id="first-four-electrodes-resistivity-measurement"> -<h3>First four electrodes resistivity measurement<a class="headerlink" href="#first-four-electrodes-resistivity-measurement" title="Permalink to this heading">ïƒ</a></h3> +<h3>First four electrodes resistivity measurement<a class="headerlink" href="#first-four-electrodes-resistivity-measurement" title="Link to this heading">ïƒ</a></h3> <p>Under construction !</p> <p>Describe the way to validate the first part of the instruction. Electrical resistivity measurement on test circuit</p> </section> </section> <section id="multiplexer-implementation"> -<h2>Multiplexer implementation<a class="headerlink" href="#multiplexer-implementation" title="Permalink to this heading">ïƒ</a></h2> +<h2>Multiplexer implementation<a class="headerlink" href="#multiplexer-implementation" title="Link to this heading">ïƒ</a></h2> <p>The resistivity measurement is conducted on four terminals (A, B, M and N). The user could perform each measurement by manually plugging four electrodes into the four channel terminals. In practice, ERT requires several tens or thousands of measurements conducted on different electrode arrays. A multiplexer is therefore used to connect each channel to one of @@ -450,7 +451,7 @@ see Section 2.4). To execute this step, it will be necessary to follow the proto <div><figure class="align-center" id="id6"> <a class="reference internal image-reference" href="../../_images/connection.jpg"><img alt="alternate text" src="../../_images/connection.jpg" style="width: 800px; height: 400px;" /></a> <figcaption> -<p><span class="caption-text">Connection to the 16-channel relay shield</span><a class="headerlink" href="#id6" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Connection to the 16-channel relay shield</span><a class="headerlink" href="#id6" title="Link to this image">ïƒ</a></p> </figcaption> </figure> </div></blockquote> @@ -508,14 +509,14 @@ The next step consists of connecting the relay card inputs to the Raspberry Pi a </div></blockquote> </section> <section id="electrode-connection"> -<h2>Electrode connection<a class="headerlink" href="#electrode-connection" title="Permalink to this heading">ïƒ</a></h2> +<h2>Electrode connection<a class="headerlink" href="#electrode-connection" title="Link to this heading">ïƒ</a></h2> <p>At this point, all that remains is to connect the electrodes of each multiplexer to a terminal block (Fig. 13). In our set-up, screw terminals assembled on a din rail were used. According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.</p> <figure class="align-center" id="id7"> <a class="reference internal image-reference" href="../../_images/cable.jpg"><img alt="alternate text" src="../../_images/cable.jpg" style="width: 800px; height: 300px;" /></a> <figcaption> -<p><span class="caption-text">Wire cabling for multiplexer and terminal screw connection</span><a class="headerlink" href="#id7" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Wire cabling for multiplexer and terminal screw connection</span><a class="headerlink" href="#id7" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <p>the next figure provides an example of multiplexer relay connections for electrode no. 1: this electrode of multiplexer MUX A must be connected to electrode no. 1 of MUX B. Moreover, electrode no. 1 of MUX B @@ -524,7 +525,7 @@ This operation must be repeated for all 32 electrodes.</p> <figure class="align-center" id="id8"> <a class="reference internal image-reference" href="../../_images/electrode_cable.jpg"><img alt="alternate text" src="../../_images/electrode_cable.jpg" style="width: 800px; height: 800px;" /></a> <figcaption> -<p><span class="caption-text">Example of a multiplexer connection to the screw terminal for electrode no. 1.</span><a class="headerlink" href="#id8" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Example of a multiplexer connection to the screw terminal for electrode no. 1.</span><a class="headerlink" href="#id8" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <div class="admonition warning"> @@ -534,16 +535,16 @@ In case you bought 16 channel relay 5-V cards, you will need to add a DC/DC 12-V </div> </section> <section id="operating-instruction"> -<h2>Operating instruction<a class="headerlink" href="#operating-instruction" title="Permalink to this heading">ïƒ</a></h2> +<h2>Operating instruction<a class="headerlink" href="#operating-instruction" title="Link to this heading">ïƒ</a></h2> <section id="preliminary-procedure-only-for-the-initial-operation"> -<h3>Preliminary procedure (Only for the initial operation)<a class="headerlink" href="#preliminary-procedure-only-for-the-initial-operation" title="Permalink to this heading">ïƒ</a></h3> +<h3>Preliminary procedure (Only for the initial operation)<a class="headerlink" href="#preliminary-procedure-only-for-the-initial-operation" title="Link to this heading">ïƒ</a></h3> <p>The open source code must be downloaded at the Open Science Framework source file repository for this manuscript (<a class="reference external" href="https://osf.io/dzwb4/">https://osf.io/dzwb4/</a>) or at the following Gitlab repository address: <a class="reference external" href="https://gitlab.irstea.fr/reversaal/OhmPi">https://gitlab.irstea.fr/reversaal/OhmPi</a>. The code must be then unzipped into a selected folder (e.g. OhmPi-master). A “readme†file is proposed in the directory to assist with installation of the software and required python packages. It is strongly recommended to create a python virtual environment for installing the required packages and running the code.</p> </section> <section id="startup-procedure"> -<h3>Startup procedure<a class="headerlink" href="#startup-procedure" title="Permalink to this heading">ïƒ</a></h3> +<h3>Startup procedure<a class="headerlink" href="#startup-procedure" title="Link to this heading">ïƒ</a></h3> <p>As an initial operating instruction, all batteries must be disconnected before any hardware handling. Ensure that the battery is charged at full capacity. Plug all the electrodes (32 or fewer) into the screw terminals. The Raspberry Pi must be plugged into a computer screen, with a mouse and keyboard accessed remotely. The Raspberry Pi must then be plugged into the power supply (for laboratory measurements) or a power bank (5V - 2A for field measurements). At this point, you’ll need to access the Raspbian operating system. Inside the previously created folder “ohmPiâ€, @@ -554,7 +555,7 @@ hear the characteristic sound of a relay switching as a result of electrode perm are displayed on the screen. A measurement file is automatically created and named “measure.csvâ€; it will be placed in the same folder.</p> </section> <section id="electrical-resistivity-measurement-parameters-description"> -<h3>Electrical resistivity measurement parameters description<a class="headerlink" href="#electrical-resistivity-measurement-parameters-description" title="Permalink to this heading">ïƒ</a></h3> +<h3>Electrical resistivity measurement parameters description<a class="headerlink" href="#electrical-resistivity-measurement-parameters-description" title="Link to this heading">ïƒ</a></h3> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">27</span><span class="w"> </span><span class="sd">"""</span> <span class="linenos">28</span><span class="sd"> measurement parameters</span> <span class="linenos">29</span><span class="sd"> """</span> @@ -569,13 +570,13 @@ are displayed on the screen. A measurement file is automatically created and nam </section> </section> <section id="complete-list-of-components"> -<h2>Complete list of components<a class="headerlink" href="#complete-list-of-components" title="Permalink to this heading">ïƒ</a></h2> +<h2>Complete list of components<a class="headerlink" href="#complete-list-of-components" title="Link to this heading">ïƒ</a></h2> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date</p> </div> <table class="docutils align-default" id="id9"> -<caption><span class="caption-text">Table Title</span><a class="headerlink" href="#id9" title="Permalink to this table">ïƒ</a></caption> +<caption><span class="caption-text">Table Title</span><a class="headerlink" href="#id9" title="Link to this table">ïƒ</a></caption> <colgroup> <col style="width: 8%" /> <col style="width: 18%" /> diff --git a/doc/build/html/source_rst/v1.xx/V1_02.html b/doc/build/html/source_rst/v1.xx/V1_02.html index 9abfed134ef6aeec9bddc5ca5ade45e5073babf7..6e7be104bdaabaa38e4188b249533af61268f4de 100644 --- a/doc/build/html/source_rst/v1.xx/V1_02.html +++ b/doc/build/html/source_rst/v1.xx/V1_02.html @@ -11,11 +11,11 @@ <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/jquery.js?v=5d32c60e"></script> + <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> + <script src="../../_static/documentation_options.js?v=c6fcd74b"></script> + <script src="../../_static/doctools.js?v=888ff710"></script> + <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="../../_static/js/theme.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> @@ -79,6 +79,7 @@ <li class="toctree-l1"><a class="reference internal" href="../V2023.x.x/V2023.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../V2024.x.x/V2024.html">OhmPi V2023 (64 electrodes and 12V)</a></li> <li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li> +<li class="toctree-l1"><a class="reference internal" href="../developing_hardware_components.html">Software interface to new hardware components</a></li> </ul> </div> @@ -106,7 +107,7 @@ <div itemprop="articleBody"> <section id="ohmpi-v-1-02-limited-to-32-electrodes"> -<h1>OhmPi V 1.02 (limited to 32 electrodes)<a class="headerlink" href="#ohmpi-v-1-02-limited-to-32-electrodes" title="Permalink to this heading">ïƒ</a></h1> +<h1>OhmPi V 1.02 (limited to 32 electrodes)<a class="headerlink" href="#ohmpi-v-1-02-limited-to-32-electrodes" title="Link 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> @@ -116,13 +117,13 @@ <p>In this version, we have improved the electronic measurement board. To upgrade from version 1.01 to 1.02, you just have to replace the measurement board by the new one proposed here.</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> +<h2>The philosophy of Ohmpi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Link to this heading">ïƒ</a></h2> <p>The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low-current injection, but suitable for small laboratory experiments and small field time monitoring</p> </section> <section id="technical-data"> -<h2>Technical data<a class="headerlink" href="#technical-data" title="Permalink to this heading">ïƒ</a></h2> +<h2>Technical data<a class="headerlink" href="#technical-data" title="Link to this heading">ïƒ</a></h2> <table class="docutils align-default"> <tbody> <tr class="row-odd"><td><p><strong>Parameter</strong></p></td> @@ -174,9 +175,9 @@ control system</p></td> </table> </section> <section id="raspberry-pi-configuration"> -<h2>Raspberry Pi configuration<a class="headerlink" href="#raspberry-pi-configuration" title="Permalink to this heading">ïƒ</a></h2> +<h2>Raspberry Pi configuration<a class="headerlink" href="#raspberry-pi-configuration" title="Link to this heading">ïƒ</a></h2> <section id="os-installation"> -<h3>OS installation<a class="headerlink" href="#os-installation" title="Permalink to this heading">ïƒ</a></h3> +<h3>OS installation<a class="headerlink" href="#os-installation" title="Link to this heading">ïƒ</a></h3> <p>The first step is to start up the Raspberry Pi board, including installation of an OS (operating system). For this step, the installation instructions are well described on the Raspberry website</p> <ol class="arabic simple"> @@ -226,7 +227,7 @@ To ensure that the GPIOs are in Low position, you will need to modify the /boot/ </ol> </section> <section id="virtual-environment-and-packages"> -<h3>Virtual Environment and packages<a class="headerlink" href="#virtual-environment-and-packages" title="Permalink to this heading">ïƒ</a></h3> +<h3>Virtual Environment and packages<a class="headerlink" href="#virtual-environment-and-packages" title="Link to this heading">ïƒ</a></h3> <p>All dependencies are specified in requirements.txt</p> <div class="admonition note"> <p class="admonition-title">Note</p> @@ -260,7 +261,7 @@ to leave the virtual environment simply type:</p> </div> </section> <section id="activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi"> -<h3>Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)<a class="headerlink" href="#activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi" title="Permalink to this heading">ïƒ</a></h3> +<h3>Activate virtual environment on Thonny (Python IDE) (on Raspberry Pi)<a class="headerlink" href="#activate-virtual-environment-on-thonny-python-ide-on-raspberry-pi" title="Link to this heading">ïƒ</a></h3> <p>If you decided to use a virtual environment, it is necessary to setup Thonny Python IDE the first time you use it.</p> <p>1- Run the Thonny Python IDE software, Click on raspberry access <strong>menu > programming> Thonny pythonIDE</strong></p> <p>2- Thonny opens, Python runs on the root (Python 3.7.3 (/usr/bin/python3))</p> @@ -286,11 +287,11 @@ to leave the virtual environment simply type:</p> </section> </section> <section id="assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi"> -<h2>Assembly of the measuring/current injection cards, and connection with the Raspberry Pi<a class="headerlink" href="#assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi" title="Permalink to this heading">ïƒ</a></h2> +<h2>Assembly of the measuring/current injection cards, and connection with the Raspberry Pi<a class="headerlink" href="#assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi" title="Link to this heading">ïƒ</a></h2> <section id="electrical-resistivity-measurements-board"> -<h3>Electrical resistivity measurements board<a class="headerlink" href="#electrical-resistivity-measurements-board" title="Permalink to this heading">ïƒ</a></h3> +<h3>Electrical resistivity measurements board<a class="headerlink" href="#electrical-resistivity-measurements-board" title="Link to this heading">ïƒ</a></h3> <section id="a-description"> -<h4>a) Description<a class="headerlink" href="#a-description" title="Permalink to this heading">ïƒ</a></h4> +<h4>a) Description<a class="headerlink" href="#a-description" title="Link to this heading">ïƒ</a></h4> <p>To measure electrical resistivity with Raspberry Pi, an ADS1115 was introduced, as proposed by Florsch [7]. The ADS1115 is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. Its value has been set at 2/3 in this study. The input signal value could lie between - to + 6.114 V. The ADS1115 is mounted on a board adapted from an in-house design. @@ -330,7 +331,7 @@ the signal input on the operational amplifiers. This prevents the operational am <figure class="align-center" id="id1"> <a class="reference internal image-reference" href="../../_images/schema_measurement_board1_02.png"><img alt="alternate text" src="../../_images/schema_measurement_board1_02.png" style="width: 800px; height: 400px;" /></a> <figcaption> -<p><span class="caption-text">Measurement board (Ohmpi version 1.02)</span><a class="headerlink" href="#id1" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Measurement board (Ohmpi version 1.02)</span><a class="headerlink" href="#id1" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <div class="admonition note"> @@ -339,7 +340,7 @@ the signal input on the operational amplifiers. This prevents the operational am </div> </section> <section id="b-implementation"> -<h4>b) Implementation<a class="headerlink" href="#b-implementation" title="Permalink to this heading">ïƒ</a></h4> +<h4>b) Implementation<a class="headerlink" href="#b-implementation" title="Link to this heading">ïƒ</a></h4> <p>The measurement board must be printed using the PCB file (Source file repository), with components soldered onto it by following the steps described below and illustrated in the following figure :</p> <ul> @@ -385,19 +386,19 @@ place a fuse holder with a 1.5-A fuse for safety purposes.</p> <figure class="align-center" id="id2"> <a class="reference internal image-reference" href="../../_images/measurement_board1-02.jpg"><img alt="alternate text" src="../../_images/measurement_board1-02.jpg" style="width: 800px; height: 700px;" /></a> <figcaption> -<p><span class="caption-text">Measurement circuit board assembly: a) printed circuit board, b) adding the 1-KOhm resistors ± 1%, c)adding the 1.5-KOhm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers</span><a class="headerlink" href="#id2" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Measurement circuit board assembly: a) printed circuit board, b) adding the 1-KOhm resistors ± 1%, c)adding the 1.5-KOhm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers</span><a class="headerlink" href="#id2" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <figure class="align-center" id="id3"> <a class="reference internal image-reference" href="../../_images/measurement_board-2-V1-02.jpg"><img alt="alternate text" src="../../_images/measurement_board-2-V1-02.jpg" style="width: 800px; height: 700px;" /></a> <figcaption> -<p><span class="caption-text">Measurement board installation with Raspberry Pi</span><a class="headerlink" href="#id3" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Measurement board installation with Raspberry Pi</span><a class="headerlink" href="#id3" title="Link to this image">ïƒ</a></p> </figcaption> </figure> </section> </section> <section id="current-injection-board"> -<h3>Current injection board<a class="headerlink" href="#current-injection-board" title="Permalink to this heading">ïƒ</a></h3> +<h3>Current injection board<a class="headerlink" href="#current-injection-board" title="Link to this heading">ïƒ</a></h3> <p>To carry out the electrical resistivity measurement, the first step consists of injecting current into the ground. In our case, a simple 9-V lead-acid battery is used to create an electrical potential difference that results in current circulating into the ground. The current is injected through electrodes A and B (see Fig. 2). This @@ -412,7 +413,7 @@ they remain in the normally closed position. This set-up offers a simple and rob <figure class="align-center" id="id4"> <a class="reference internal image-reference" href="../../_images/current_board.jpg"><img alt="alternate text" src="../../_images/current_board.jpg" style="width: 800px; height: 400px;" /></a> <figcaption> -<p><span class="caption-text">Wiring of the 4-channel relay module board for current injection management</span><a class="headerlink" href="#id4" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Wiring of the 4-channel relay module board for current injection management</span><a class="headerlink" href="#id4" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <p>The next step consists of featuring the 4-channel relay module used for current injection and its assembly. The wiring @@ -425,20 +426,20 @@ to terminals B and A of the measurement board.</p> <figure class="align-center" id="id5"> <a class="reference internal image-reference" href="../../_images/installation_current_board_1_02.jpg"><img alt="alternate text" src="../../_images/installation_current_board_1_02.jpg" style="width: 800px; height: 700px;" /></a> <figcaption> -<p><span class="caption-text">Current injection board installation with Raspberry Pi</span><a class="headerlink" href="#id5" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Current injection board installation with Raspberry Pi</span><a class="headerlink" href="#id5" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <p>Congratulations, you have build a 4 electrodes resistivity-meter.</p> </section> <section id="first-four-electrodes-resistivity-measurement"> -<h3>First four electrodes resistivity measurement<a class="headerlink" href="#first-four-electrodes-resistivity-measurement" title="Permalink to this heading">ïƒ</a></h3> +<h3>First four electrodes resistivity measurement<a class="headerlink" href="#first-four-electrodes-resistivity-measurement" title="Link to this heading">ïƒ</a></h3> <p>Under construction !</p> <p>Describe the way to validate the first part of the instruction. Electrical resistivity measurement on test circuit</p> </section> </section> <section id="multiplexer-implementation"> -<h2>Multiplexer implementation<a class="headerlink" href="#multiplexer-implementation" title="Permalink to this heading">ïƒ</a></h2> +<h2>Multiplexer implementation<a class="headerlink" href="#multiplexer-implementation" title="Link to this heading">ïƒ</a></h2> <p>The resistivity measurement is conducted on four terminals (A, B, M and N). The user could perform each measurement by manually plugging four electrodes into the four channel terminals. In practice, ERT requires several tens or thousands of measurements conducted on different electrode arrays. A multiplexer is therefore used to connect each channel to one of @@ -451,7 +452,7 @@ To prepare the multiplexer, the channels of the two relay boards must be connect <figure class="align-center" id="id6"> <a class="reference internal image-reference" href="../../_images/multiplexer_implementation.jpg"><img alt="alternate text" src="../../_images/multiplexer_implementation.jpg" style="width: 800px; height: 500px;" /></a> <figcaption> -<p><span class="caption-text">Schematic diagram of the wiring of two 16-channel relay shields</span><a class="headerlink" href="#id6" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Schematic diagram of the wiring of two 16-channel relay shields</span><a class="headerlink" href="#id6" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <p>For this purpose, 0.5-mm² cables with end caps are used and their length adjusted for each connection in order to produce a clean assembly. @@ -465,7 +466,7 @@ see Section 2.4). To execute this step, it will be necessary to follow the proto <div><figure class="align-center" id="id7"> <a class="reference internal image-reference" href="../../_images/connection.jpg"><img alt="alternate text" src="../../_images/connection.jpg" style="width: 800px; height: 400px;" /></a> <figcaption> -<p><span class="caption-text">Connection to the 16-channel relay shield</span><a class="headerlink" href="#id7" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Connection to the 16-channel relay shield</span><a class="headerlink" href="#id7" title="Link to this image">ïƒ</a></p> </figcaption> </figure> </div></blockquote> @@ -523,14 +524,14 @@ The next step consists of connecting the relay card inputs to the Raspberry Pi a </div></blockquote> </section> <section id="electrode-connection"> -<h2>Electrode connection<a class="headerlink" href="#electrode-connection" title="Permalink to this heading">ïƒ</a></h2> +<h2>Electrode connection<a class="headerlink" href="#electrode-connection" title="Link to this heading">ïƒ</a></h2> <p>At this point, all that remains is to connect the electrodes of each multiplexer to a terminal block (Fig. 13). In our set-up, screw terminals assembled on a din rail were used. According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.</p> <figure class="align-center" id="id8"> <a class="reference internal image-reference" href="../../_images/cable.jpg"><img alt="alternate text" src="../../_images/cable.jpg" style="width: 800px; height: 300px;" /></a> <figcaption> -<p><span class="caption-text">Wire cabling for multiplexer and terminal screw connection</span><a class="headerlink" href="#id8" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Wire cabling for multiplexer and terminal screw connection</span><a class="headerlink" href="#id8" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <p>the next figure provides an example of multiplexer relay connections for electrode no. 1: this electrode of multiplexer MUX A must be connected to electrode no. 1 of MUX B. Moreover, electrode no. 1 of MUX B @@ -539,7 +540,7 @@ This operation must be repeated for all 32 electrodes.</p> <figure class="align-center" id="id9"> <a class="reference internal image-reference" href="../../_images/electrode_cable.jpg"><img alt="alternate text" src="../../_images/electrode_cable.jpg" style="width: 800px; height: 800px;" /></a> <figcaption> -<p><span class="caption-text">Example of a multiplexer connection to the screw terminal for electrode no. 1.</span><a class="headerlink" href="#id9" title="Permalink to this image">ïƒ</a></p> +<p><span class="caption-text">Example of a multiplexer connection to the screw terminal for electrode no. 1.</span><a class="headerlink" href="#id9" title="Link to this image">ïƒ</a></p> </figcaption> </figure> <div class="admonition warning"> @@ -549,16 +550,16 @@ In case you bought 16 channel relay 5-V cards, you will need to add a DC/DC 12-V </div> </section> <section id="operating-instruction"> -<h2>Operating instruction<a class="headerlink" href="#operating-instruction" title="Permalink to this heading">ïƒ</a></h2> +<h2>Operating instruction<a class="headerlink" href="#operating-instruction" title="Link to this heading">ïƒ</a></h2> <section id="preliminary-procedure-only-for-the-initial-operation"> -<h3>Preliminary procedure (Only for the initial operation)<a class="headerlink" href="#preliminary-procedure-only-for-the-initial-operation" title="Permalink to this heading">ïƒ</a></h3> +<h3>Preliminary procedure (Only for the initial operation)<a class="headerlink" href="#preliminary-procedure-only-for-the-initial-operation" title="Link to this heading">ïƒ</a></h3> <p>The open source code must be downloaded at the Open Science Framework source file repository for this manuscript (<a class="reference external" href="https://osf.io/dzwb4/">https://osf.io/dzwb4/</a>) or at the following Gitlab repository address: <a class="reference external" href="https://gitlab.irstea.fr/reversaal/OhmPi">https://gitlab.irstea.fr/reversaal/OhmPi</a>. The code must be then unzipped into a selected folder (e.g. OhmPi-master). A “readme†file is proposed in the directory to assist with installation of the software and required python packages. It is strongly recommended to create a python virtual environment for installing the required packages and running the code.</p> </section> <section id="startup-procedure"> -<h3>Startup procedure<a class="headerlink" href="#startup-procedure" title="Permalink to this heading">ïƒ</a></h3> +<h3>Startup procedure<a class="headerlink" href="#startup-procedure" title="Link to this heading">ïƒ</a></h3> <p>As an initial operating instruction, all batteries must be disconnected before any hardware handling. Ensure that the battery is charged at full capacity. Plug all the electrodes (32 or fewer) into the screw terminals. The Raspberry Pi must be plugged into a computer screen, with a mouse and keyboard accessed remotely. The Raspberry Pi must then be plugged into the power supply (for laboratory measurements) or a power bank (5V - 2A for field measurements). At this point, you’ll need to access the Raspbian operating system. Inside the previously created folder “ohmPiâ€, @@ -569,7 +570,7 @@ hear the characteristic sound of a relay switching as a result of electrode perm are displayed on the screen. A measurement file is automatically created and named “measure.csvâ€; it will be placed in the same folder.</p> </section> <section id="electrical-resistivity-measurement-parameters-description"> -<h3>Electrical resistivity measurement parameters description<a class="headerlink" href="#electrical-resistivity-measurement-parameters-description" title="Permalink to this heading">ïƒ</a></h3> +<h3>Electrical resistivity measurement parameters description<a class="headerlink" href="#electrical-resistivity-measurement-parameters-description" title="Link to this heading">ïƒ</a></h3> <p>In the version 1.02, the measurement parameters are in the Jason file (ohmpi_param.json).</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span> <span class="n">nb_electrodes</span> <span class="o">=</span> <span class="mi">32</span> <span class="c1"># maximum number of electrodes on the resistivity meter</span> <span class="linenos">2</span> <span class="n">injection_duration</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># Current injection duration in second</span> @@ -582,13 +583,13 @@ are displayed on the screen. A measurement file is automatically created and nam </section> </section> <section id="complete-list-of-components"> -<h2>Complete list of components<a class="headerlink" href="#complete-list-of-components" title="Permalink to this heading">ïƒ</a></h2> +<h2>Complete list of components<a class="headerlink" href="#complete-list-of-components" title="Link to this heading">ïƒ</a></h2> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date</p> </div> <table class="docutils align-default" id="id10"> -<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id10" title="Permalink to this table">ïƒ</a></caption> +<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id10" title="Link to this table">ïƒ</a></caption> <colgroup> <col style="width: 8%" /> <col style="width: 18%" /> diff --git a/index.html b/index.html index 99805072828a1187878bb6a598d9143ccec8105f..cc08146b0305cd1f3fbfe25f11d62acbd9fe494d 100755 --- a/index.html +++ b/index.html @@ -93,7 +93,7 @@ mosquitto_sub -h raspberrypi.local -t ohmpi_0001/ctrl <div class="modal-body"> <form> <div class="form-group row"> - <label for="nb_electrodes" class="col-sm-2 col-form-label">Nb electrodes</label> + <!-- <label for="nb_electrodes" class="col-sm-2 col-form-label">Nb electrodes</label> --> <div class="col-sm-10"> <input type="number" class="form-control-number" id="nb_electrodes" value="64"> </div> @@ -337,7 +337,7 @@ mosquitto_sub -h raspberrypi.local -t ohmpi_0001/ctrl function saveConfigBtnFunc() { // collect values from modal let formVals = { - 'nb_electrodes': parseInt(document.getElementById('nb_electrodes').value), + //'nb_electrodes': parseInt(document.getElementById('nb_electrodes').value), 'injection_duration': parseFloat(document.getElementById('injection_duration').value), 'nb_meas': parseInt(document.getElementById('nb_meas').value), 'sequence_delay': parseFloat(document.getElementById('sequence_delay').value), diff --git a/ohmpi/ohmpi.py b/ohmpi/ohmpi.py index 5d6eb1d80dfade52045d75ddba14103ba234d70d..e5edf9d016605bc1cfa7b7dc1de03f01083e94dc 100644 --- a/ohmpi/ohmpi.py +++ b/ohmpi/ohmpi.py @@ -42,31 +42,25 @@ VERSION = '3.0.0-beta' class OhmPi(object): - """ OhmPi class. + """OhmPi class. + Construct the ohmpi object. + + Parameters + ---------- + settings : dict, optional + Dictionnary of parameters. Possible parameters with their default values: + `{'injection_duration': 0.2, 'nb_meas': 1, 'sequence_delay': 1, + 'nb_stack': 1, 'sampling_interval': 2, 'tx_volt': 5, 'duty_cycle': 0.5, + 'strategy': 'constant', 'export_path': None, 'export_dir': 'data', + 'export_name': 'measurement.csv'`. + sequence : str, optional + Path of the .csv or .txt file with A, B, M and N electrodes. + Electrode index starts at 1. See `OhmPi.load_sequence()` for full docstring. + mqtt : bool, optional + If True (default), publish on mqtt topics while logging, + otherwise use other loggers only (print). """ - - def __init__(self, settings=None, sequence=None, mqtt=True, onpi=None): - """Constructs the ohmpi object - - Parameters - ---------- - settings: - - sequence: - - mqtt: bool, defaut: True - if True publish on mqtt topics while logging, otherwise use other loggers only - onpi: bool,None default: None - if None, the platform on which the class is instantiated is determined to set on_pi to either True or False. - if False the behaviour of an ohmpi will be partially emulated and return random data. - """ - - if onpi is None: - _, onpi = get_platform() - elif onpi: - assert get_platform()[1] # Checks that the system actually runs on a pi if onpi is True - self.on_pi = onpi # True if runs from the RaspberryPi with the hardware, otherwise False for random data # TODO : replace with dummy hardware? - + def __init__(self, settings=None, sequence=None, mqtt=True): self._sequence = sequence self.nb_samples = 0 self.status = 'idle' # either running or idle @@ -80,24 +74,12 @@ class OhmPi(object): self._hw = OhmPiHardware(**{'exec_logger': self.exec_logger, 'data_logger': self.data_logger, 'soh_logger': self.soh_logger}) self.exec_logger.info('Hardware configured...') + # default acquisition settings - self.settings = { - 'injection_duration': 0.2, - 'nb_meas': 1, - 'sequence_delay': 1, - 'nb_stack': 1, - 'sampling_interval': 2, - 'tx_volt': 5, - 'duty_cycle': 0.5, - 'strategy': 'constant', - 'export_path': None, - 'export_dir': 'data', - 'export_name': 'measurement.csv' - } + self.update_settings('settings/default.json') + # read in acquisition settings - # if settings is not None: self.update_settings(settings) - self.exec_logger.debug('Initialized with settings:' + str(self.settings)) # read quadrupole sequence @@ -167,18 +149,24 @@ class OhmPi(object): setattr(cls, i[0], i[1]) @staticmethod - def append_and_save(filename: str, last_measurement: dict, cmd_id=None): - # TODO: find alternative approach to save full data (zip, hdf5 or mseed?) + def append_and_save(filename: str, last_measurement: dict, fw_in_csv=None, fw_in_zip=None, cmd_id=None): """Appends and saves the last measurement dict. Parameters ---------- filename : str - filename to save the last measurement dataframe + Filename of the .csv. last_measurement : dict - Last measurement taken in the form of a python dictionary + Last measurement taken in the form of a python dictionary. + fw_in_csv : bool, optional + Wether to save the full-waveform data in the .csv (one line per quadrupole). + As these readings have different lengths for different quadrupole, the data are padded with NaN. + If None, default is read from default.json. + fw_in_zip : bool, optional + Wether to save the full-waveform data in a separate .csv in long format to be zipped to + spare space. If None, default is read from default.json. cmd_id : str, optional - Unique command identifier + Unique command identifier. """ # check if directory 'data' exists ddir = os.path.join(os.path.dirname(__file__), '../data/') @@ -189,7 +177,23 @@ class OhmPi(object): # TODO need to make all the full data of the same size (pre-populate # readings with NaN in hardware_system.OhmPiHardware.read_values()) - if 'fulldata' in last_measurement: + if fw_in_zip: + fw_filename = filename.replace('.csv', '_fw.csv') + if not os.path.exists(fw_filename): # new file, write headers first + with open(fw_filane, 'w') as f: + f.write('A,B,M,N,t,pulse,polarity,current,voltage\n') + # write full data + with open(fw_filename, 'a') as f: + df = pd.DataFrame(last_measurement['fulldata'], + columns=['t','pulse','polarity','current','voltage']) + df['A'] = last_measurement['A'] + df['B'] = last_measurement['B'] + df['M'] = last_measurement['M'] + df['N'] = last_measurement['N'] + df.to_csv(f, index=False, header=False) + print('--------', fw_filename) + + if fw_in_csv: d = last_measurement['fulldata'] n = d.shape[0] if n > 1: @@ -229,7 +233,6 @@ class OhmPi(object): output : numpy.ndarray 1D array of int List of index of rows where A and B are identical. """ - # if we have a 1D array (so only 1 quadrupole), make it a 2D array if len(quads.shape) == 1: quads = quads[None, :] @@ -248,7 +251,7 @@ class OhmPi(object): their content won't be returned again. Only files not in the list will be read. cmd_id : str, optional - Unique command identifier + Unique command identifier. """ # get all .csv file in data folder if survey_names is None: @@ -289,12 +292,12 @@ class OhmPi(object): return ddic def interrupt(self, cmd_id=None): - """Interrupts the acquisition + """Interrupts the acquisition. Parameters ---------- cmd_id : str, optional - Unique command identifier + Unique command identifier. """ self.status = 'stopping' if self.thread is not None: @@ -314,7 +317,7 @@ class OhmPi(object): Path of the .csv or .txt file with A, B, M and N electrodes. Electrode index start at 1. cmd_id : str, optional - Unique command identifier + Unique command identifier. Returns ------- @@ -342,12 +345,12 @@ class OhmPi(object): self.sequence = sequence def _process_commands(self, message: str): - """Processes commands received from the controller(s) + """Processes commands received from the controller(s). Parameters ---------- message : str - message containing a command and arguments or keywords and arguments + Message containing a command and arguments or keywords and arguments. """ self.status = 'idle' cmd_id = '?' @@ -378,19 +381,19 @@ class OhmPi(object): self.exec_logger.debug(f'Execution report: {reply}') def quit(self, cmd_id=None): - """Quits OhmPi + """Quits OhmPi. Parameters ---------- cmd_id : str, optional - Unique command identifier + Unique command identifier. """ self.exec_logger.debug(f'Quitting ohmpi.py following command {cmd_id}') exit() def _read_hardware_config(self): - """Reads hardware configuration from config.py + """Reads hardware configuration from config.py. """ self.exec_logger.debug('Getting hardware config') self.id = OHMPI_CONFIG['id'] # ID of the OhmPi @@ -407,12 +410,12 @@ class OhmPi(object): self.exec_logger.debug(f'OHMPI_CONFIG = {str(OHMPI_CONFIG)}') def remove_data(self, cmd_id=None): - """Remove all data in the data folder + """Remove all data in the ´data/´ folder on the raspberrypi. Parameters ---------- cmd_id : str, optional - Unique command identifier + Unique command identifier. """ self.exec_logger.debug(f'Removing all data following command {cmd_id}') datadir = os.path.join(os.path.dirname(__file__), '../data') @@ -420,48 +423,40 @@ class OhmPi(object): os.mkdir(datadir) def restart(self, cmd_id=None): - """Restarts the Raspberry Pi + """Restarts the Raspberry Pi. Parameters ---------- cmd_id : str, optional - Unique command identifier + Unique command identifier. """ - - if self.on_pi: - self.exec_logger.info(f'Restarting pi following command {cmd_id}...') - os.system('reboot') - else: - self.exec_logger.warning('Not on Raspberry Pi, skipping reboot...') + self.exec_logger.info(f'Restarting pi following command {cmd_id}...') + os.system('reboot') # this may need admin rights def download_data(self, cmd_id=None): - """Create a zip of the data folder. + """Create a zip of the data folder to then download it easily. """ datadir = os.path.join(os.path.dirname(__file__), '../data/') make_archive(datadir, 'zip', 'data') self.data_logger.info(json.dumps({'download': 'ready'})) def shutdown(self, cmd_id=None): - """Shutdown the Raspberry Pi + """Shutdown the Raspberry Pi. Parameters ---------- cmd_id : str, optional Unique command identifier """ - - if self.on_pi: - self.exec_logger.info(f'Restarting pi following command {cmd_id}...') - os.system('poweroff') - else: - self.exec_logger.warning('Not on Raspberry Pi, skipping shutdown...') - + self.exec_logger.info(f'Restarting pi following command {cmd_id}...') + os.system('poweroff') # this may require admin rights + def run_measurement(self, quad=None, nb_stack=None, injection_duration=None, duty_cycle=None, autogain=True, strategy='constant', tx_volt=5., best_tx_injtime=0.1, cmd_id=None, vab_max=None, iab_max=None, vmn_max=None, vmn_min=None, **kwargs): # TODO: add sampling_interval -> impact on _hw.rx.sampling_rate (store the current value, change the _hw.rx.sampling_rate, do the measurement, reset the sampling_rate to the previous value) # TODO: default value of tx_volt and other parameters set to None should be given in config.py and used in function definition - """Measures on a quadrupole and returns transfer resistance. + """Measures on a quadrupole and returns a dictionnary with the transfer resistance. Parameters ---------- @@ -470,36 +465,36 @@ class OhmPi(object): really create the route to the electrodes. nb_stack : int, optional Number of stacks. A stack is considered two pulses (one - positive, one negative). If 0, we will look for the best voltage. + positive, one negative). If 0, we will look for the best voltage. injection_duration : int, optional Injection time in seconds. - duty_cycle : float, optional, Default: 0.5 - Duty cycle of injection square wave + duty_cycle : float, optional + Duty cycle (default=0.5) of injection square wave. strategy : str, optional, default: constant - Define injection strategy (if power is adjustable, otherwise constant tx_volt) + Define injection strategy (if power is adjustable, otherwise constant tx_volt, generally 12V battery is used). Either: - vmax : compute Vab to reach a maximum Vmn_max and Iab without exceeding vab_max - vmin : compute Vab to reach at least Vmn_min - constant : apply given Vab (tx_volt) - - Safety check (i.e. short voltage pulses) performed prior to injection to ensure - injection within bounds defined in vab_max, iab_max, vmn_max or vmn_min. This can adapt Vab. - To bypass safety check before injection, tx_volt should be set equal to vab_max (not recpommanded) + Safety check (i.e. short voltage pulses) performed prior to injection to ensure + injection within bounds defined in vab_max, iab_max, vmn_max or vmn_min. This can adapt Vab. + To bypass safety check before injection, tx_volt should be set equal to vab_max (not recpommanded) vab_max : str, optional - Maximum injection voltage + Maximum injection voltage. Default value set by config or boards specs iab_max : str, optional - Maximum current applied + Maximum current applied. Default value set by config or boards specs vmn_max : str, optional - Maximum Vmn allowed + Maximum Vmn allowed. Default value set by config or boards specs vmn_min : - Minimum Vmn desired (used in strategy vmin) + Minimum Vmn desired (used in strategy vmin). Default value set by config or boards specs tx_volt : float, optional # TODO: change tx_volt to Vab For power adjustable only. If specified, voltage will be imposed. cmd_id : str, optional - Unique command identifier + Unique command identifier. """ # check pwr is on, if not, let's turn it on switch_power_off = False @@ -519,11 +514,6 @@ class OhmPi(object): injection_duration = self.settings['injection_duration'] if duty_cycle is None: duty_cycle = self.settings['duty_cycle'] - # quad = kwargs.pop('quad', [0,0,0,0]) - # nb_stack = kwargs.pop('nb_stack', self.settings['nb_stack']) - # injection_duration = kwargs.pop('injection_duration', self.settings['injection_duration']) - # duty_cycle = kwargs.pop('duty_cycle', self.settings['duty_cycle']) - # tx_volt = float(kwargs.pop('tx_volt', self.settings['tx_volt'])) bypass_check = kwargs['bypass_check'] if 'bypass_check' in kwargs.keys() else False d = {} if self.switch_mux_on(quad, bypass_check=bypass_check, cmd_id=cmd_id): @@ -575,7 +565,6 @@ class OhmPi(object): for key in dd.keys(): # Check why this is applied on keys and not values... if isinstance(dd[key], float): dd[key] = np.round(dd[key], 3) - dd['cmd_id'] = str(cmd_id) self.data_logger.info(dd) self._hw.switch_mux(electrodes=quad[0:2], roles=['A', 'B'], state='on') @@ -591,23 +580,35 @@ class OhmPi(object): return d - def run_multiple_sequences(self, cmd_id=None, sequence_delay=None, nb_meas=None, **kwargs): # NOTE : could be renamed repeat_sequence + def repeat_sequence(self, **kwargs): + """Identical to run_multiple_sequences(). + """ + self.run_multiple_sequences(**kwargs) + + def run_multiple_sequences(self, sequence_delay=None, nb_meas=None, fw_in_csv=None, + fw_in_zip=None, cmd_id=None, **kwargs): """Runs multiple sequences in a separate thread for monitoring mode. Can be stopped by 'OhmPi.interrupt()'. Additional arguments are passed to run_measurement(). Parameters ---------- - cmd_id : str, optional - Unique command identifier sequence_delay : int, optional Number of seconds at which the sequence must be started from each others. nb_meas : int, optional Number of time the sequence must be repeated. + fw_in_csv : bool, optional + Wether to save the full-waveform data in the .csv (one line per quadrupole). + As these readings have different lengths for different quadrupole, the data are padded with NaN. + If None, default is read from default.json. + fw_in_zip : bool, optional + Wether to save the full-waveform data in a separate .csv in long format to be zipped to + spare space. If None, default is read from default.json. + cmd_id : str, optional + Unique command identifier. kwargs : dict, optional - See help(k.run_measurement) for more info. + See help(OhmPi.run_measurement) for more info. """ - # self.run = True if sequence_delay is None: sequence_delay = self.settings['sequence_delay'] sequence_delay = int(sequence_delay) @@ -629,9 +630,8 @@ class OhmPi(object): self.exec_logger.warning('Data acquisition interrupted') break t0 = time.time() - self.run_sequence(**kwargs) - # sleeping time between sequence - dt = sequence_delay - (time.time() - t0) + self.run_sequence(fw_in_csv=fw_in_csv, fw_in_zip=fw_in_zip, **kwargs) + dt = sequence_delay - (time.time() - t0) # sleeping time between sequence if dt < 0: dt = 0 if nb_meas > 1: @@ -643,14 +643,21 @@ class OhmPi(object): self.thread = Thread(target=func) self.thread.start() - def run_sequence(self, cmd_id=None, **kwargs): + def run_sequence(self, fw_in_csv=None, fw_in_zip=None, cmd_id=None, **kwargs): """Runs sequence synchronously (=blocking on main thread). Additional arguments are passed to run_measurement(). Parameters ---------- + fw_in_csv : bool, optional + Wether to save the full-waveform data in the .csv (one line per quadrupole). + As these readings have different lengths for different quadrupole, the data are padded with NaN. + If None, default is read from default.json. + fw_in_zip : bool, optional + Wether to save the full-waveform data in a separate .csv in long format to be zipped to + spare space. If None, default is read from default.json. cmd_id : str, optional - Unique command identifier + Unique command identifier. """ # switch power on self._hw.pwr_state = 'on' @@ -669,9 +676,6 @@ class OhmPi(object): f'_{datetime.now().strftime("%Y%m%dT%H%M%S")}.csv') self.exec_logger.debug(f'Saving to {filename}') - # make sure all multiplexer are off - - # measure all quadrupole of the sequence if self.sequence is None: n = 1 @@ -685,11 +689,8 @@ class OhmPi(object): if self.status == 'stopping': break # run a measurement - if self.on_pi: - acquired_data = self.run_measurement(quad=quad, **kwargs) - else: # for testing, generate random data - pass - + acquired_data = self.run_measurement(quad=quad, **kwargs) + # log data to the data logger self.data_logger.info(acquired_data) @@ -698,7 +699,7 @@ class OhmPi(object): # log data to the data logger # self.data_logger.info(f'{acquired_data}') # NOTE: It could be useful to keep the cmd_id in the # save data and print in a text file - self.append_and_save(filename, acquired_data) + self.append_and_save(filename, acquired_data, fw_in_csv=fw_in_csv, fw_in_zip=fw_in_zip) self.exec_logger.debug(f'quadrupole {i + 1:d}/{n:d}') self._hw.pwr_state = 'off' @@ -713,7 +714,7 @@ class OhmPi(object): Parameters ---------- cmd_id : str, optional - Unique command identifier + Unique command identifier. """ def func(): @@ -726,7 +727,7 @@ class OhmPi(object): # TODO: we could build a smarter RS-Check by selecting adjacent electrodes based on their locations and try to # isolate electrodes that are responsible for high resistances (ex: AB high, AC low, BC high # -> might be a problem at B (cf what we did with WofE) - def rs_check(self, tx_volt=5., cmd_id=None): + def rs_check(self, tx_volt=5.0, cmd_id=None): # TODO: add a default value for rs-check in config.py import it in ohmpi.py and add it in rs_check definition """Checks contact resistances. Strategy: we just open A and B, measure the current and using vAB set or @@ -735,9 +736,9 @@ class OhmPi(object): Parameters ---------- tx_volt : float - Voltage of the injection + Voltage of the injection. cmd_id : str, optional - Unique command identifier + Unique command identifier. """ # check pwr is on, if not, let's turn it on switch_tx_pwr_off = False @@ -745,8 +746,6 @@ class OhmPi(object): self._hw.pwr_state = 'on' switch_tx_pwr_off = True - # self._hw.tx.pwr.voltage = float(tx_volt) - # create custom sequence where MN == AB # we only check the electrodes which are in the sequence (not all might be connected) if self.sequence is None: @@ -759,17 +758,13 @@ class OhmPi(object): elec[:-1], elec[1:], ]).T - # if self.idps: - # quads[:, 2:] = 0 # we don't open Vmn to prevent burning the MN part - # # as it has a smaller range of accepted voltage - + # create filename to store RS export_path_rs = self.settings['export_path'].replace('.csv', '') \ + '_' + datetime.now().strftime('%Y%m%dT%H%M%S') + '_rs.csv' # perform RS check self.status = 'running' - self.reset_mux() # turn dps_pwr_on if needed @@ -788,25 +783,9 @@ class OhmPi(object): print(vab, current) time.sleep(0.2) - # self.switch_mux_on(quad, bypass_check=True) # put before raising the pins (otherwise conflict i2c) - # d = self.run_measurement(quad=quad, nb_stack=1, injection_duration=0.2, tx_volt=tx_volt, autogain=False, - # bypass_check=True) - - # if self._hw.tx.voltage_adjustable: - # voltage = self._hw.tx.voltage # imposed voltage on dps - # else: - # voltage = self._hw.rx.voltage - - # voltage = self._hw.rx.voltage - # current = self._hw.tx.current - # compute resistance measured (= contact resistance) rab = abs(vab*1000 / current) / 1000 # kOhm - # print(str(quad) + '> I: {:>10.3f} mA, V: {:>10.3f} mV, R: {:>10.3f} kOhm'.format( - # current, voltage, resist)) - # msg = f'Contact resistance {str(quad):s}: I: {current :>10.3f} mA, ' \ - # f'V: {voltage :>10.3f} mV, ' \ - # f'R: {resist :>10.3f} kOhm' + # create a message as dictionnary to be used by the html interface msg = { 'rsdata': { @@ -835,26 +814,26 @@ class OhmPi(object): self.status = 'idle' if switch_pwr_off: self._hw.pwr.pwr_state = 'off' + # if power was off before measurement, let's turn if off if switch_tx_pwr_off: self._hw.pwr_state = 'off' - # - # # TODO if interrupted, we would need to restore the values - # # TODO or we offer the possibility in 'run_measurement' to have rs_check each time? + + # TODO if interrupted, we would need to restore the values + # TODO or we offer the possibility in 'run_measurement' to have rs_check each time? def set_sequence(self, sequence=None, cmd_id=None): - """Sets the sequence to acquire + """Sets the sequence to acquire. Parameters ---------- - sequence : list, str - sequence of quadrupoles + sequence : list of list or array_like + Sequence of quadrupoles (list of list or array_like). cmd_id: str, optional - Unique command identifier + Unique command identifier. """ try: self.sequence = np.array(sequence).astype(int) - # self.sequence = np.loadtxt(StringIO(sequence)).astype('uint32') except Exception as e: self.exec_logger.warning(f'Unable to set sequence: {e}') @@ -863,12 +842,12 @@ class OhmPi(object): Parameters ---------- - cmd_id : str, optional - Unique command identifier quadrupole : list of 4 int List of 4 integers representing the electrode numbers. bypass_check: bool, optional - Bypasses checks for A==M or A==N or B==M or B==N (i.e. used for rs-check) + Bypasses checks for A==M or A==N or B==M or B==N (i.e. used for rs-check). + cmd_id : str, optional + Unique command identifier. """ assert len(quadrupole) == 4 if (self._hw.tx.pwr.voltage > self._hw.rx._voltage_max) and bypass_check: @@ -886,15 +865,15 @@ class OhmPi(object): Parameters ---------- - cmd_id : str, optional - Unique command identifier quadrupole : list of 4 int List of 4 integers representing the electrode numbers. + cmd_id : str, optional + Unique command identifier. """ assert len(quadrupole) == 4 return self._hw.switch_mux(electrodes=quadrupole, state='off') - def test_mux(self, activation_time=1.0, mux_id=None, cmd_id=None): # TODO: add this in the MUX code + def test_mux(self, activation_time=0.2, mux_id=None, cmd_id=None): """Interactive method to test the multiplexer boards. Parameters @@ -902,11 +881,11 @@ class OhmPi(object): activation_time : float, optional Time in seconds during which the relays are activated. mux_id : str, optional - id of the mux_board to test + ID of the mux_board to test. cmd_id : str, optional - Unique command identifier + Unique command identifier. """ - self.reset_mux() # All mux boards should be reset even if we only want to test one otherwise we might create a shortcut + self.reset_mux() # all mux boards should be reset even if we only want to test one otherwise we might create a shortcut if mux_id is None: self._hw.test_mux(activation_time=activation_time) else: @@ -918,7 +897,7 @@ class OhmPi(object): Parameters ---------- cmd_id : str, optional - Unique command identifier + Unique command identifier. """ self._hw.reset_mux() @@ -937,13 +916,12 @@ class OhmPi(object): - export_path (path where to export the data, timestamp will be added to filename ; if export_path is given, it goes over export_dir and export_name) - Parameters ---------- settings : str, dict Path to the .json settings file or dictionary of settings. cmd_id : str, optional - Unique command identifier + Unique command identifier. """ if settings is not None: try: @@ -970,14 +948,14 @@ class OhmPi(object): self.settings['export_name'] = os.path.split(self.settings['export_path'])[1] def run_inversion(self, survey_names=None, elec_spacing=1, **kwargs): - """Run a simple 2D inversion using ResIPy. + """Run a simple 2D inversion using ResIPy (https://gitlab.com/hkex/resipy). Parameters ---------- survey_names : list of string, optional Filenames of the survey to be inverted (including extension). elec_spacing : float (optional) - Electrode spacing in meters. We assume same electrode spacing everywhere. + Electrode spacing in meters. We assume same electrode spacing everywhere. Default is 1 m. kwargs : optional Additional keyword arguments passed to `resipy.Project.invert()`. For instance `reg_mode` == 0 for batch inversion, `reg_mode == 2` for time-lapse inversion. @@ -1006,8 +984,8 @@ class OhmPi(object): reg_mode = 0 kwargs['reg_mode'] = 0 - pdir = os.path.dirname(__file__) # import resipy if available + pdir = os.path.dirname(__file__) try: from scipy.interpolate import griddata # noqa import pandas as pd #noqa @@ -1066,7 +1044,7 @@ class OhmPi(object): grid_v = griddata(df[['X', 'Z']].values, df['Resistivity(ohm.m)'].values, (grid_x, grid_z), method='nearest') - # set nan to -1 + # set nan to -1 (hard to parse NaN in JSON) inan = np.isnan(grid_v) grid_v[inan] = -1 diff --git a/ohmpi_settings.json b/ohmpi_settings.json deleted file mode 100644 index 2964e24b850157b3fe3a449a4cf5e62a701f82f3..0000000000000000000000000000000000000000 --- a/ohmpi_settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "nb_electrodes": 16, - "injection_duration": 0.2, - "nb_stack": 1, - "nb_meas": 1, - "sequence_delay": 120, - "export_path": "data/measurement.csv" -}