Автор Тема: Ардуино контроллер поворотки  (Прочитано 418406 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ua4fkd Сергей

  • Ветеран
  • *****
  • Сообщений: 2906
  • Репутация: +251/-67
  • QRA: LO13HL
Re: Ардуино контроллер поворотки
« Ответ #1740 : 02 Июня 2025, 14:39:14 »
Нет ли ни у кого скетча для обычного для  LCD 1602 с I2C. Самый минимальный набор настроек, азимут, потенциометр


https://disk.yandex.ru/d/tStqJhi7p4ubVg   досье на меня

https://www.instagram.com/ua4fkd  ЗАБЛОКИРОВАН НЕЗАКОННЫМИ ДЕЙСТВИЯМИ  США

Оффлайн ua4fkd Сергей

  • Ветеран
  • *****
  • Сообщений: 2906
  • Репутация: +251/-67
  • QRA: LO13HL
Re: Ардуино контроллер поворотки
« Ответ #1741 : 02 Июня 2025, 14:40:29 »
Нет ли ни у кого скетча для обычного для  LCD 1602 с I2C. Самый минимальный набор настроек, азимут, потенциометр


https://disk.yandex.ru/d/tStqJhi7p4ubVg   досье на меня

https://www.instagram.com/ua4fkd  ЗАБЛОКИРОВАН НЕЗАКОННЫМИ ДЕЙСТВИЯМИ  США

Оффлайн ua4fkd Сергей

  • Ветеран
  • *****
  • Сообщений: 2906
  • Репутация: +251/-67
  • QRA: LO13HL
Re: Ардуино контроллер поворотки
« Ответ #1742 : 12 Июня 2025, 14:18:26 »
спасибо проблема решена
https://disk.yandex.ru/d/tStqJhi7p4ubVg   досье на меня

https://www.instagram.com/ua4fkd  ЗАБЛОКИРОВАН НЕЗАКОННЫМИ ДЕЙСТВИЯМИ  США

Оффлайн UD2F

  • Модератор форума
  • Ветеран
  • *****
  • Сообщений: 4773
  • Репутация: +949/-33
  • UA2 Contest Club
  • QRA: KO04HR
Re: Ардуино контроллер поворотки
« Ответ #1743 : 28 Августа 2025, 09:44:59 »
Коллеги, кто "обрезал" питание от  USB на плате Arduino MEGA-2560.
Правильно ли я понимаю, что обведенное на фото это предохранитель ?
И можно либо его выпаять, либо перерезать дорожку справа, что бы схема не питалась от USB ?
73! Валентин   ex: RU2FM

Оффлайн rw6acm

  • Пользователь
  • **
  • Сообщений: 14
  • Репутация: +17/-0
  • Подпись находится в стадии разработки
  • QRA: kn94bu
Re: Ардуино контроллер поворотки
« Ответ #1744 : 28 Августа 2025, 10:46:02 »
Можно.

Оффлайн UD2F

  • Модератор форума
  • Ветеран
  • *****
  • Сообщений: 4773
  • Репутация: +949/-33
  • UA2 Contest Club
  • QRA: KO04HR
Re: Ардуино контроллер поворотки
« Ответ #1745 : 28 Августа 2025, 10:52:56 »
Эту схему я видел (она для Микро МЕГА).
Я правильно понимаю, что USB порт на ней обозначен как CN1 ?
73! Валентин   ex: RU2FM

Оффлайн EU6AX

  • Пользователь
  • **
  • Сообщений: 14
  • Репутация: +12/-0
  • 11 эл. - 144, 21 эл. - 433
  • QRA: KO35ud
Re: Ардуино контроллер поворотки
« Ответ #1746 : 17 Октября 2025, 21:36:34 »
здраствуйте,Помогите со скейчем на азимутальную поворотку ,ардуино nano ,двухстрочный дисплей LCD1602 c I2c адаптером и резестивный датчик P3022-V1-CW360.

Оффлайн ua4fkd Сергей

  • Ветеран
  • *****
  • Сообщений: 2906
  • Репутация: +251/-67
  • QRA: LO13HL
Re: Ардуино контроллер поворотки
« Ответ #1747 : 19 Октября 2025, 16:47:02 »
пожалуйста
https://disk.yandex.ru/d/tStqJhi7p4ubVg   досье на меня

https://www.instagram.com/ua4fkd  ЗАБЛОКИРОВАН НЕЗАКОННЫМИ ДЕЙСТВИЯМИ  США

Оффлайн RA3TES Андрей

  • Ветеран
  • *****
  • Сообщений: 1478
  • Репутация: +414/-47
  • Подпись находиться в стадии разработки
  • QRA: LO15VJ
Re: Ардуино контроллер поворотки
« Ответ #1748 : 19 Октября 2025, 18:15:12 »
По пробовал, не компилится .
Далее ...
"
Абсолютный энкодер P3022-V1-CW360 работает по принципу электромагнитной индукции, угол преобразуется в электрический сигнал.
Когда угол поворота объекта передается на ось
датчиков вращения, датчик угла P3022 выдает
электрический сигнал, который пропорционален
углу поворота. "
Т.е. Датчик не резистивный ... Еще желательно знать, с какими прогами контроллеру работать придется, тоже есть нюансы.
Подшаманить, заработает конечно.

 

Оффлайн RW6HM Yuri

  • Ветеран
  • *****
  • Сообщений: 718
  • Репутация: +245/-18
  • Подпись находится в стадии разработки
  • QRA: LN14sg
Re: Ардуино контроллер поворотки
« Ответ #1749 : 19 Октября 2025, 18:26:20 »
Т.е. Датчик не резистивный ..
И что?Смотрим схему-на резистор подается 5 вольт,с ползунка снимается на плату,третий вывод-на корпус.То же самое и с датчиком,раскомментим строку с "Датчик резистивный" и вперед.Работает три года на азимуте и элевации-по точности лучше чем с энкодерами самопальными.Хотя датчик тоже энкодер,только выход не импульсы а напруга.
« Последнее редактирование: 19 Октября 2025, 18:29:13 от RW6HM Yuri »
Я борзАя,я пущенная стрела...И нет моей вины,но кто-то должен упасть

Оффлайн RC3UE

  • Ветеран
  • *****
  • Сообщений: 1704
  • Репутация: +331/-79
  • 13 el F9FT/21 el F9FT
  • QRA: LO07NG
Re: Ардуино контроллер поворотки
« Ответ #1750 : 19 Октября 2025, 19:52:55 »
ИИ дипсик ответил так -

Цитировать
DeepSeek | ChatGPT, [19.10.25 18:58]
Отличная задача! Давайте создадим проект контроллера азимутальной поворотки для антенны.

Вот подробное описание проекта, включая схему подключения, код и принцип работы.

### 1. Аппаратная часть (Hardware)

**Используемые компоненты:**

1.  **Arduino Nano**
2.  **Дисплей LCD1602 с I2C адаптером** (синий или зеленый, с адресом обычно 0x27 или 0x3F)
3.  **Датчик положения P3022-V1-CW360** (это потенциометр на 360°, 10 кОм, линейный)
4.  **Сервопривод** (например, SG90 для макета или более мощный, в зависимости от размера антенны). *Для реальной антенны скорее всего потребуется мотор-редуктор с драйвером (например, L298N) и энкодер для обратной связи. В данном примере используем сервопривод для простоты.*
5.  **Потенциометр** (10 кОм) - для задания целевого азимута.
6.  **Кнопка (тактовская)** - для запуска поворота.
7.  **Макетная плата и провода.**

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

| Компонент           | Контакт    | Подключение к Arduino Nano |
| ------------------- | ---------- | -------------------------- |
| **LCD1602 (I2C)**   | SDA        | A4 (SDA)                   |
|                     | SCL        | A5 (SCL)                   |
|                     | VCC        | 5V                         |
|                     | GND        | GND                        |
| **Датчик P3022**    | Средний    | A0                         |
|                     | VCC        | 5V                         |
|                     | GND        | GND                        |
| **Потенциометр**    | Средний    | A1                         |
|                     | VCC        | 5V                         |
|                     | GND        | GND                        |
| **Кнопка**          | Один контакт| D2                         |
|                     | Второй контакт| GND (через резистор 10к) |
| **Сервопривод**     | Сигнальный | D9                         |
|                     | VCC        | 5V (если мощный - внешний) |
|                     | GND        | GND                        |

*Примечание: Кнопку подключаем с подтягивающим резистором на GND. В коде используем INPUT_PULLUP.*

### 2. Программная часть (Software)

**Логика работы:**

1.  Система постоянно считывает текущий азимут с датчика P3022 (A0) и целевой азимут с задающего потенциометра (A1).
2.  Значения отображаются на дисплее LCD1602.
3.  При нажатии на кнопку (D2) контроллер рассчитывает кратчайший путь к целевому азимуту и поворачивает сервопривод в нужное положение.
4.  Сервопривод поворачивается плавно, имитируя работу реального мотора.

**Код для Arduino IDE:**

```cpp
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

// Пины
#define SENSOR_PIN A0      // Датчик положения P3022
#define TARGET_PIN A1      // Потенциометр для задания цели
#define BUTTON_PIN 2       // Кнопка запуска
#define SERVO_PIN 9        // Сервопривод

// Настройки
#define DEAD_ZONE 2        // Мертвая зона (в единицах АЦП), чтобы не было дрожания
#define SERVO_MIN 0        // Минимальный угол сервы (град)
#define SERVO_MAX 180      // Максимальный угол сервы (град)
#define MOVE_DELAY 15      // Задержка между шагами сервы (мс)

// Объекты
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес дисплея 0x27 или 0x3F
Servo myServo;

// Переменные
int currentAzimuth = 0;   // Текущий азимут (0-1023)
int targetAzimuth = 0;    // Целевой азимут (0-1023)
int servoAngle = 90;      // Текущий угол сервопривода
bool lastButtonState = HIGH; // Для отслеживания нажатия кнопки
bool isMoving = false;    // Флаг движения

void setup() {
  // Инициализация портов
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  // Инициализация сервопривода
  myServo.attach(SERVO_PIN);
  myServo.write(servoAngle); // Стартовая позиция

  // Инициализация дисплея
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Azimuth Control");
  lcd.setCursor(0, 1);
  lcd.print("Cur:    Tgt:    ");

  Serial.begin(9600); // Для отладки
}

void loop() {
  // 1. Чтение данных
  readSensors();

  // 2. Отображение на дисплее

DeepSeek | ChatGPT, [19.10.25 18:59]
updateDisplay();

  // 3. Проверка нажатия кнопки
  checkButton();

  // 4. Если идет движение - управление сервой
  if (isMoving) {
    moveServoToTarget();
  }

  delay(50); // Небольшая задержка для стабильности
}

void readSensors() {
  currentAzimuth = analogRead(SENSOR_PIN); // Текущий азимут с датчика
  targetAzimuth = analogRead(TARGET_PIN);   // Целевой азимут с потенциометра

  // Ограничиваем значения (на всякий случай)
  currentAzimuth = constrain(currentAzimuth, 0, 1023);
  targetAzimuth = constrain(targetAzimuth, 0, 1023);
}

void updateDisplay() {
  // Обновляем только цифры, чтобы избежать мерцания
  lcd.setCursor(5, 1);
  lcd.print(map(currentAzimuth, 0, 1023, 0, 360)); // Преобразуем в градусы (0-360)
  lcd.print(" ");
  lcd.setCursor(13, 1);
  lcd.print(map(targetAzimuth, 0, 1023, 0, 360)); // Преобразуем в градусы (0-360)
  lcd.print(" ");
}

void checkButton() {
  bool currentButtonState = digitalRead(BUTTON_PIN);

  // Если кнопка была отпущена, а теперь нажата (падающий фронт)
  if (lastButtonState == HIGH && currentButtonState == LOW) {
    // Защита от дребезга
    delay(50);
    // Повторное чтение
    currentButtonState = digitalRead(BUTTON_PIN);
    if (currentButtonState == LOW) {
      isMoving = true; // Запускаем движение
      lcd.setCursor(0, 0);
      lcd.print("MOVING...       ");
    }
  }
  lastButtonState = currentButtonState;
}

void moveServoToTarget() {
  // Проверяем, не достигли ли цели (с учетом мертвой зоны)
  if (abs(currentAzimuth - targetAzimuth) <= DEAD_ZONE) {
    isMoving = false;
    lcd.setCursor(0, 0);
    lcd.print("TARGET REACHED! ");
    return;
  }

  // Определяем направление вращения (выбираем кратчайший путь)
  int error = targetAzimuth - currentAzimuth;

  // Преобразуем ошибку в шаг для сервопривода
  int step = 0;
  if (error > 0) {
    step = 1;
  } else if (error < 0) {
    step = -1;
  }

  // Обновляем угол сервы (серва 0-180, азимут 0-1023, поэтому маппим)
  servoAngle += step;
  servoAngle = constrain(servoAngle, SERVO_MIN, SERVO_MAX);

  // Плавное движение сервы
  myServo.write(servoAngle);
  delay(MOVE_DELAY);

  // Обновляем текущий азимут (в реальной системе он считывается с датчика,
  // но здесь имитируем, что серва его меняет)
  // currentAzimuth = map(servoAngle, SERVO_MIN, SERVO_MAX, 0, 1023);
  // Вместо имитации лучше постоянно читать датчик (он уже читается в loop)
}
```

### 3. Пояснения и улучшения

1.  **Принцип работы датчика P3022:** Это обычный потенциометр. При повороте его напряжение на среднем выводе меняется от 0 до 5В, что Arduino считывает как значение от 0 до 1023. Эти значения мы интерпретируем как азимут от 0° до 360°.

2.  **Сервопривод vs Реальный мотор:**
    *   В данном примере используется сервопривод для простоты.
    *   Для реальной антенной поворотки вам понадобится:
        *   **Двигатель постоянного тока с редуктором** (или шаговый двигатель).
        *   **Драйвер двигателя** (например, L298N или TB6612FNG).
        *   **Энкодер** на валу двигателя для *точной* обратной связи (потенциометр P3022 на самом валу антенны будет давать неточности из-за люфтов в редукторе).
    *   Код тогда нужно будет переписать под управление драйвером двигателя (подача сигналов IN1, IN2 и PWM) и чтение энкодера.

3.  **Возможные улучшения кода:**
    *   **Библиотека для кнопки:** Используйте библиотеку `Bounce2` для лучшей обработки нажатий.
    *   **ПИД-регулятор:** Вместо простого шага можно реализовать ПИД-регулятор для плавного и точного позиционирования.
    *   **Калибровка:** Добавьте режим калибровки для сопоставления значений АЦП с реальными градусами.
    *   **Графический индикатор:** На дисплее можно нарисовать простую шкалу или стрелку.
    *   **Управление через Serial:** Добавьте команды для задания азимута через монитор порта.

DeepSeek | ChatGPT, [19.10.25 18:59]
Этот код является отличной отправной точкой для создания полнофункционального контроллера антенной поворотки. Начните с него, протестируйте с сервоприводом, а затем адаптируйте под более мощные моторы и точные датчики обратной связи.

Модель: DeepSeek V3.2 Exp
:)
В принципе, неплохо для начала самостоятельной обработки.
Под датчик  P3022 есть довольно серъёзная разработка от D0ITC.
Но она с TFT дисплеем ILI9488 и на мой взгляд имеет один, но существенный недостаток - связь между собственно узлом поворотки и блоком управления по WIFI.
А это кроме потенциального источника помех, ещё и невысокая надёжность, учитывая огромное кол-во домашних роутеров по-соседству, так и влияние всевозможных "глушилок"..
По пробовал, не компилится .
Не удивительно. Контроллер k3ng очень "навороченный" и с кандачка, без тщательной правки конфигурации, его не запустить.
73! Александр RC3UE (ex RA3UJ, UA3UES)

Оффлайн RA3TES Андрей

  • Ветеран
  • *****
  • Сообщений: 1478
  • Репутация: +414/-47
  • Подпись находиться в стадии разработки
  • QRA: LO15VJ
Re: Ардуино контроллер поворотки
« Ответ #1751 : 19 Октября 2025, 21:13:55 »
to RC3UE
С компилился, проверить не чем , все на работе ...
Надо бы туда еще управление от компа прикрутить :-)   

Оффлайн ua4fkd Сергей

  • Ветеран
  • *****
  • Сообщений: 2906
  • Репутация: +251/-67
  • QRA: LO13HL
Re: Ардуино контроллер поворотки
« Ответ #1752 : 19 Октября 2025, 22:00:57 »
не компилируется  из за того,что i2c  адрес не тот, а не какой датчик установлен или предполагается установить.
а резистивный или  P3022-V1-CW360 ардуине всё равно,она ардуина отслеживает напряжение выходящее из P3022-V1-CW360 на А0 или в данном скетче А7 (#define rotator_analog_az A7    // A0 reads analog azimuth voltage from rotator - pin 4 on Yaesu connector).
так же и с резистора подаётся напряжение  от 0вольт= 360*  и +5вольт= 0*
скетч заливал в Arduino IDE 1.8.18

« Последнее редактирование: 19 Октября 2025, 22:09:30 от ua4fkd Сергей »
https://disk.yandex.ru/d/tStqJhi7p4ubVg   досье на меня

https://www.instagram.com/ua4fkd  ЗАБЛОКИРОВАН НЕЗАКОННЫМИ ДЕЙСТВИЯМИ  США

Оффлайн ua4fkd Сергей

  • Ветеран
  • *****
  • Сообщений: 2906
  • Репутация: +251/-67
  • QRA: LO13HL
Re: Ардуино контроллер поворотки
« Ответ #1753 : 19 Октября 2025, 22:07:41 »
  **Датчик положения P3022-V1-CW360** (это потенциометр на 360°, 10 кОм, линейный)
это скорее всего  энкодер  с выводом  PWM, тоесть напряжения от 0в до +5вольт
https://disk.yandex.ru/d/tStqJhi7p4ubVg   досье на меня

https://www.instagram.com/ua4fkd  ЗАБЛОКИРОВАН НЕЗАКОННЫМИ ДЕЙСТВИЯМИ  США

Оффлайн RC3UE

  • Ветеран
  • *****
  • Сообщений: 1704
  • Репутация: +331/-79
  • 13 el F9FT/21 el F9FT
  • QRA: LO07NG
Re: Ардуино контроллер поворотки
« Ответ #1754 : 19 Октября 2025, 22:43:31 »
3.  **Датчик положения P3022-V1-CW360** (это потенциометр на 360°, 10 кОм, линейный)
это скорее всего  энкодер  с выводом  PWM
Да это дипсик придумал. :)
На самом деле это -
Цитировать
Абсолютный экодер P3022-V1-CW360 работает по принципу электромагнитной индукции, угол преобразуется в электрический сигнал.
Когда угол поворота объекта передается на ось датчиков вращения, датчик угла P3022 выдает электрический сигнал, который пропорционален
углу поворота.
73! Александр RC3UE (ex RA3UJ, UA3UES)