Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Эффективная сортировка резисторов для проектов на Arduino Nano: простой метод экономии времени

Компоненты и материалы

Необходимые инструменты

Программное обеспечение

О проекте

Знакомая ситуация: после каждого проекта рабочий стол завален резисторами, которые лень разбирать по номиналам. Проверять цветовые коды или мультиметром кажется слишком долгим. Решение — собрать простой омметр на Arduino, который сам определит сопротивление неизвестного резистора и покажет результат на дисплее.

Принцип работы: делитель напряжения

Схема основана на классическом делителе напряжения. Известный резистор Rn и измеряемый Ru соединены последовательно. Напряжение на точке их соединения считывается аналоговым входом A0 Arduino. По формуле:

Vout = 5V × Ru / (Rn + Ru)

Зная Vout (в условных единицах АЦП 0–1023) и Rn, легко вычислить Ru.

Проблема точности и её решение

Точность измерения максимальна, когда Rn ≈ Ru. Если номиналы сильно отличаются, погрешность растёт. Поэтому используется набор из пяти эталонных резисторов (100 Ом … 1 МОм). Arduino последовательно подключает их к схеме через цифровые выводы D2–D6 и выбирает тот, при котором измеренное напряжение ближе всего к середине диапазона (≈ 2.5 В, или 512 единиц АЦП).

Схема подключения

См. схему во вложениях (раздел Schematics).

Алгоритм скетча

  1. В loop() вывод D2 переводится в OUTPUT и подтягивается к HIGH (подключается 1 МОм).
  2. Считывается «сырое» значение АЦП. Если оно в диапазоне 350–800 — номинал подходит.
  3. Иначе: D2 в INPUT (высокое импеданс), включается D3 (100 кОм) и так далее до D6 (100 Ом).
  4. Как только найден подходящий эталон, вычисляется Ru по формуле делителя.
  5. Результат округляется до ближайшего стандартного значения ряда E24 (10, 100, 1к, 10к, 100к, 1М).
  6. Значение выводится на OLED с битмапами для красоты.

Важные нюансы кода

Корпус и сборка

Корпус печатается на 3D-принтере (файлы в разделе Custom parts). Детали склеиваются термоклеем. Эталонные резисторы припаяны компактно, чтобы поместиться внутри. На передней панели — два отверстия для ножек проверяемого резистора.

Итог

Устройство за пару секунд определяет номинал резистора без участия мультиметра. Идеально для наведения порядка в наборе компонентов. Полный код и STL-файлы корпуса доступны в разделе Code и CAD.

Код (основной скетч)

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ... битмапы myLOGO и myBitmap опущены для краткости ...

int R1 = 100, R2 = 1000, R3 = 10000;
long R4 = 100000, R5 = 1000000;
long Rn;
int D2 = 2, D3 = 3, D4 = 4, D5 = 5, D6 = 6;
float raw = 0, Vout = 0, Ru = 0;
int Analogohm = A0;

void setup() {
  Serial.begin(9600);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  display.clearDisplay();
  display.drawBitmap(0,0, myLOGO, 128, 64, WHITE);
  display.display();
  delay(2000);
}

void loop() {
  // Последовательный перебор эталонов 1M → 100k → 10k → 1k → 100
  pinMode(D2, OUTPUT); pinMode(D3, INPUT); pinMode(D4, INPUT); pinMode(D5, INPUT); pinMode(D6, INPUT);
  digitalWrite(D2, HIGH); raw = analogRead(Analogohm); Rn = R5;
  if (raw < 350 || raw > 800) {
    digitalWrite(D2, LOW); pinMode(D2, INPUT);
    pinMode(D3, OUTPUT); digitalWrite(D3, HIGH); raw = analogRead(Analogohm); Rn = R4;
    if (raw < 350 || raw > 800) {
      digitalWrite(D3, LOW); pinMode(D3, INPUT);
      pinMode(D4, OUTPUT); digitalWrite(D4, HIGH); raw = analogRead(Analogohm); Rn = R3;
      if (raw < 350 || raw > 800) {
        digitalWrite(D4, LOW); pinMode(D4, INPUT);
        pinMode(D5, OUTPUT); digitalWrite(D5, HIGH); raw = analogRead(Analogohm); Rn = R2;
        if (raw < 350 || raw > 800) {
          digitalWrite(D5, LOW); pinMode(D5, INPUT);
          pinMode(D6, OUTPUT); digitalWrite(D6, HIGH); raw = analogRead(Analogohm); Rn = R1;
        }
      }
    }
  }
  Vout = 5.0 * (raw / 1024.0);
  Ru = (Rn * Vout) / (5.0 - Vout);
  // Округление до стандартных значений
  if (Ru < 70) Ru = 10 * round(Ru / 10);
  else if (Ru < 700) Ru = 100 * round(Ru / 100);
  else if (Ru < 7000) Ru = 1000 * round(Ru / 1000);
  else if (Ru < 70000) Ru = 10000 * round(Ru / 10000);
  else if (Ru < 700000) Ru = 100000 * round(Ru / 100000);
  else Ru = 1000000 * round(Ru / 1000000);
  Resistance(Ru);
  delay(1000);
}

void Resistance(long Ru) {
  display.clearDisplay();
  display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0);
  display.println(F("Hey there,"));
  display.println(F("the Resistor value is"));
  display.setCursor(20,25); display.setTextSize(2);
  display.print(Ru); display.print(F(" Ohm"));
  display.drawBitmap(0,0, myBitmap, 128, 64, WHITE);
  display.display();
  delay(2000);
}

Производственный процесс

  1. Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
  2. Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
  3. Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
  4. Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
  5. Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
  6. Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
  7. Набор USB-MIDI адаптера для Arduino Micro / Leonardo — полный список деталей
  8. Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
  9. Точный тест времени реакции на Arduino UNO
  10. Нулевые резисторы (0 Ом): ключевые преимущества и реальное применение