ARDUINO ШИМ и 2е ардуино

bokonV2

✩✩✩✩✩✩✩
28 Апр 2024
5
0
Появилась нужда в устройстве которое определяет провод в жгуте, есть жгут в "Авто" и ардуина с кучей крокодилов, цепляем её на массу и на провода в жгуте, а с другой стороны жгута сижу я, 2ая ардуинка подключена на массу, и щупом тыкаю в провода, с выводом номера провода на дисплей

Столкнулся с проблемой при чтении ШИМ или отправке, на приёмнике получаю 0 или 180
спустя несколько часов решил воспользоваться OpenAi, но результат не поменялся

Приёмник:
// Приемник (Arduino 2)
// Используем аналоговый пин для приема сигнала
const int inputPin = A0;   // Один аналоговый пин для приема ШИМ
const int tolerance = 10;  // Допуск для определения ШИМ значений

void setup() {
  pinMode(inputPin, INPUT); // Настройка пина как вход
  Serial.begin(9600);       // Начало последовательной связи
}

void loop() {
  // Чтение аналогового значения с пина
  int analogValue = analogRead(inputPin); // Чтение значения (от 0 до 1023)
  Serial.println(analogValue);
 
  // Преобразуем аналоговое значение в значение ШИМ (от 0 до 255)
  int pwmValue = map(analogValue, 0, 1023, 0, 255);
 
  // Определение, какое значение ШИМ было отправлено, с учетом допуска
  if (withinRange(pwmValue, 128, tolerance)) {
    Serial.println("Принят ШИМ сигнал с пина A0");
  } else if (withinRange(pwmValue, 200, tolerance)) {
    Serial.println("Принят ШИМ сигнал с пина A1");
  } else if (withinRange(pwmValue, 255, tolerance)) {
    Serial.println("Принят ШИМ сигнал с пина A2");
  } else {
    Serial.println("Неизвестный сигнал");
  }
 
  delay(100); // Пауза для предотвращения перегрузки
}

// Функция для проверки попадания значения в диапазон с допуском
bool withinRange(int value, int target, int tolerance) {
  return (value >= target - tolerance) && (value <= target + tolerance);
}
Передатчик:
// Передатчик (Arduino 1)
// Используем аналоговые пины как выходы
const int analogPins[] = {3, 5, 6};   // Аналоговые пины для передачи ШИМ
const int pwmValues[] = {128, 200, 255}; // Значения ШИМ для каждого пина

void setup() {
  // Настройка аналоговых пинов как выходов
  for (int i = 0; i < 3; i++) {
    pinMode(analogPins[i], OUTPUT);
  }
  Serial.begin(9600); // Для отладки
}

void loop() {
  // Поочередная передача ШИМ-сигналов через аналоговые пины
  for (int i = 0; i < 3; i++) {
    analogWrite(analogPins[i], pwmValues[i]);  // Отправка ШИМ-сигнала через аналоговый пин
    Serial.print("Отправка ШИМ с пина:");
    Serial.print(i);
    Serial.print(", значение ШИМ: ");
    Serial.println(pwmValues[i]);
    
    delay(5000); // Пауза перед отправкой на следующий пин
    
    // Отключение сигнала на текущем пине
    analogWrite(analogPins[i], 0);
  }
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
426
127
Вы используете RC фильтр на Щупе? Он нужен, чтобы из ШИМ получить аналоговый сигнал.
Почему на передатчике вы отправляете сигналы по очереди а не одновременно?

Думаю вам проще будет поискать готовый проект. Возможно на автомобильных форумах, или может здесь кто подскажет.
Я вижу логические ошибки в ваших скетчах. Так же по моему выбран не оптимальный способ. Но рекомендовать что то, не имея опыта в прозвонке длинных и возможно разветвленных кабелей, не рискну.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
588
143
Какие пины передатчика вы цепляете к жгуту проводов?
C++:
const int analogPins[] = {3, 5, 6};   // Аналоговые пины для передачи ШИМ
C++:
// Поочередная передача ШИМ-сигналов через аналоговые пины
  for (int i = 0; i < 3; i++) {
    analogWrite(analogPins[i], pwmValues[i]);  // Отправка ШИМ-сигнала через аналоговый
Судя по этому набору букв D3, D5, D6. Но почему шим вы выводите на 0, 1, 2, и 3 ? Вот это загадка для меня? Еще загадка, почему длительность импульса вы измеряете с помощью analogRead()? Похоже, что вы либо не понимаете, что такое ШИМ, либо что-то не договариваете.
Код приемника - это какая-то ... (вставьте своё слово). На него иде не ругается, компилирует? Тут в передатчике, самое простое, использовать функцию tone(), а в приемнике pulseIn(). Почитайте на досуге.
 
Изменено:

viktor1703

★★★✩✩✩✩
9 Дек 2021
588
143
Да согласен, мой косяк, ночью не досмотрел. Но зачем for "заведён" на 4 повторения, если только три значения в массиве?
почему длительность импульса вы измеряете с помощью analogRead()?
А вот этот вопрос пока без ответа.
 

poty

★★★★★★✩
19 Фев 2020
3,179
928
Использовать ШИМ, имеющийся на ограниченном количестве портов МП, и раскодировать его через преобразование в аналог - ну, такое себе решение. Проще использовать цифровые порты с разным количеством импульсов в посылке и подсчитывать на приёмной стороне это количество, гораздо помехоустойчивей и проще, да и портов больше.
 

bokonV2

✩✩✩✩✩✩✩
28 Апр 2024
5
0
код который вы видите сгенерирован с помощью OpenAi, до него пробовал разные способы как и tone(), pulseIn(), и по статье с сигналами, но в конце получал бред, поэтому и пришёл сюда за советами
 

bokonV2

✩✩✩✩✩✩✩
28 Апр 2024
5
0
Добился рабочего варианта, без нюансов, но уже с этим можно работать

Приёмник:
// Приёмник
#define READ_PIN 5
#define CLK 2
#define DIO 3
#include "GyverTM1637.h"

GyverTM1637 disp(CLK, DIO);

int lastWire;                   
int Htime;
int Ltime;   
float Ttime;
float frequency;

const int NUM_READ = 20;  // количество усреднений для средних арифм. фильтров

void setup() {
  disp.clear();
  disp.brightness(1);
  disp.clear();
  disp.displayByte(_H, _E, _L, _L);
}

void loop() {
  Htime = pulseIn(READ_PIN, HIGH);
  Ltime = pulseIn(READ_PIN, LOW);
  Ttime = Htime + Ltime;
  frequency = 1000000 / Ttime;    // вычисляем значение частоты учитывая что время у нас в микросекундах
  lastWire = round(midArifm2(frequency) / 1000);

  disp.displayClock(0, lastWire);
}

float midArifm2(float newVal) {
  static byte counter = 0;     // счётчик
  static float prevResult = 0; // хранит предыдущее готовое значение
  static float sum = 0;  // сумма
  sum += newVal;   // суммируем новое значение
  counter++;       // счётчик++
  if (counter == NUM_READ) {      // достигли кол-ва измерений
    prevResult = sum / NUM_READ;  // считаем среднее
    sum = 0;                      // обнуляем сумму
    counter = 0;                  // сброс счётчика
  }
  return prevResult;
}
Передатчик:
// Передатчик
const int pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

void setup() {
  for (int i = 0; i < 13; i++) {
    pinMode(pins[i], OUTPUT);
  }
}

void loop() {
  for (int i = 0; i < 13; i++) {
    tone(pins[i], (1 + i) * 1000, 100);
    delay(105);
  }
}
 

bort707

★★★★★★✩
21 Сен 2020
3,016
901

@bokonV2,
считать не умеешь
(int i = 0; i < 13; i++)
Цикл от 0 до 12 - всего 13 ступеней.
 

bokonV2

✩✩✩✩✩✩✩
28 Апр 2024
5
0
@bort707,мой косяк, извиняюсь, но и так работает и не ругается, мне больше и не нужно