Encre Résistive DIY (2)

Voilà, maintenant que nous avons une bonne piste résistive, il nous faut explorer plus avant les possibilités de son exploitation… deux options s’offrent à nous.

Objectif: lire la position 0–100 % d’une piste résistive (≈10–20 kΩ sur 50 cm) avec un microcontrôleur. Deux variantes:

  • Sans LM358: diviseur simple → 0–3,3 V.
  • Avec LM358: excitation à ~2,0 V + suiveur → source basse impédance, propre pour ADC.

Note: L’ADC est supposé référencé à 3,3 V.


Variante 1 — Sans LM358 (diviseur simple)

Principe: on alimente la piste en 3,3 V; le wiper est un diviseur ratiométrique → Vwiper ∈ [0; 3,3 V], directement proportionnel à la position.

Schéma

1
2
3
4
5
6
7
8
9
10
11
12
13
3V3 ────────────────┐

[ PISTE ] ←— curseur (wiper)
│ (≈10–20 kΩ totale)
GND ────────────────┘

Wiper ── Rprot 1k ──●───→ ADC_in

C 100–220 nF

GND

Option: Rpull 1 MΩ (Wiper → GND) pour un niveau défini si le wiper “flotte”.
  • Impédance source au milieu ≈ R/4 ≈ 2,5–5 kΩ: OK pour la plupart des ADC.
  • Rprot 1 kΩ + C 100–220 nF: filtrage anti‑bruit, protège l’ADC.
  • Diodes clamp (option): vers 3V3 et GND si environnement bruyant.

Calcul position

  • p (0..1) ≈ Vwiper / 3,3 V
  • En comptages ADC: p ≈ ADC_count / ADC_full_scale

Avantages

  • Minimal, pleine échelle 0–3,3 V, très peu de composants.

Variante 2 — Avec LM358 (excitation 2,0 V + suiveur)

Pourquoi: le LM358 n’est pas rail‑to‑rail en sortie à 3,3 V (sature vers ~2,1–2,2 V). Pour couvrir 0–100 % proprement, on excite la piste à ~2,0 V (dans la zone “safe” du LM358), puis on bufferise le wiper.

Topologie (LM358P DIP‑8, dual)

  • Canal A: génère et bufferise Vexc ≈ 1,98 V à partir de 3,3 V.
  • Canal B: suiveur (buffer) du wiper → ADC.

Schéma

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
               Rtop 10k
3V3 ──────────/\/\/\───● Vexc_div ──/\/\/\─── GND
| Rbot 15k
| (Vexc_div ≈ 1.98 V)
v
LM358 (canal A en suiveur)
Vexc = ~1.98 V ─────────● (sortie canal A)

Alimentation LM358:
- Pin 8 → 3V3
- Pin 4 → GND
- Découplage: 100 nF + 4.7–10 µF près du boîtier

Piste:
Vexc (~1.98 V) ──┐

[ PISTE ] ←— wiper

GND ─────────────┘

Wiper → LM358 canal B (suiveur):
- Pin 5 (IN+) ← Wiper
- Pin 6 (IN−) ← Pin 7 (OUT B) (suiveur)
- Sortie canal B (Pin 7) ── Rprot 1k ──●──→ ADC_in

C 100–220 nF

GND

Option: Rpull 1 MΩ (Wiper → GND) et/ou clamps ESD au nœud ADC.

Remarques

  • Vexc par 10k/15k donne ~1,98 V; le canal A le bufferise pour une source basse impédance.
  • Le canal B peut suivre le wiper jusqu’à ~1,9–2,0 V sans saturer, parfait pour l’ADC si vous réglez sa pleine échelle proche de 2,0–2,2 V (si disponible). Sinon, on corrige par logiciel.

Calcul position

  • p (0..1) = Vwiper / Vexc
  • Avec ADC référencé à 3,3 V: p = (ADC_count / ADC_full_scale) × (3,3 V / Vexc)
    • Exemple avec Vexc ≈ 1,98 V: facteur ≈ 3,3 / 1,98 ≈ 1,667
    • Clippez p entre 0 et 1.

Avantages

  • Source très basse impédance (meilleure linéarité/rapidité ADC).
  • Pleine échelle contrôlée et compatible headroom LM358.

Note alternative

  • Si votre ADC offre une pleine échelle ~2,2 V (p. ex. “atténuation 6 dB”), vous pouvez aussi exciter la piste à ~2,1–2,2 V (Rtop:Rbot = 1:2), et lire directement sans correction (p ≈ ADC/FS_2V2).

Choix rapide

  • Vous voulez simple et pleine échelle 3,3 V: Variante 1.
  • Vous voulez un signal “propre” et robuste (longs câbles, bruit) avec votre LM358: Variante 2 (Vexc ≈ 2,0 V + buffers).

Conseils pratiques

  • Placez C 100–220 nF au plus près de la broche ADC.
  • Gardez des masses propres et un plan GND sous la zone analogique.
  • Calibrez deux points (0 % et 100 %) en logiciel pour corriger les tolérances mécaniques/recette d’encre.
  • Courant dans la piste (Variante 2): I ≈ Vexc / R_piste ≈ 1,98 V / (10–20 kΩ) ≈ 0,10–0,20 mA → puissance négligeable.

Exemples de calcul (pseudo‑code)

Sans LM358 (3,3 V pleine échelle):

1
2
float p = (float)adc / (float)ADC_FULL_SCALE; // 0..1
p = clamp(p, 0.0f, 1.0f);

Avec LM358 (Vexc ≈ 1.98 V, ADC ref 3.3 V):

1
2
3
4
5
const float VrefADC = 3.3f;
const float Vexc = 1.98f; // mesurez-la au multimètre pour être précis
float v = (adc * VrefADC) / ADC_FULL_SCALE; // V à l’ADC
float p = v / Vexc; // 0..1
p = clamp(p, 0.0f, 1.0f);