Kontrola silnika DC 24V joystickiem i wyświetlanie poziomu baterii na LCD

Pytanie

Napisz kod w arduino służący do kontrolowania silnika DC 24v przy pomocy joysticka ( kontrola kierunku jak i prędkości obrotów silnika ). Dodatkowo na wyświetlaczu LCD 2x16 znaków niebieski + konwerter I2C LCM1602 wskazywany ma być poziom naładowania baterii wyrażony w procentach gdzie 100% oznacza w pełni naładowany zestaw akumulatorów a 0% stan najniższego bezpiecznego napięcia akumulatora, wykorzystaj do tego Dzielnik napięcia 5V/25V dla Arduino.
Pokaż schemat połączeń

Odpowiedź Sztucznej Inteligencji


Wprowadzenie

Aby zrealizować zadanie kontrolowania silnika DC 24V za pomocą joysticka oraz wyświetlania poziomu naładowania baterii na wyświetlaczu LCD 2x16 z konwerterem I2C, potrzebujemy odpowiedniego sprzętu i oprogramowania. Poniżej przedstawiam szczegółowy kod Arduino oraz schemat połączeń.

Bezpośrednia odpowiedź na pytanie

Poniżej znajduje się kod Arduino, który realizuje sterowanie silnikiem DC za pomocą joysticka oraz wyświetla poziom naładowania baterii na wyświetlaczu LCD.

Kod Arduino

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Definicje pinów
const int JOYSTICK_X = A0;
const int JOYSTICK_Y = A1;
const int MOTOR_PWM = 9;
const int MOTOR_DIR1 = 7;
const int MOTOR_DIR2 = 8;
const int BATTERY_VOLTAGE = A2;

// Konfiguracja wyświetlacza LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Zmienne do obsługi baterii
const float MAX_BATTERY_VOLTAGE = 25.0;
const float MIN_BATTERY_VOLTAGE = 20.0;
const float R1 = 20000.0; // Rezystor górny dzielnika napięcia
const float R2 = 5000.0;  // Rezystor dolny dzielnika napięcia

void setup() {
  pinMode(MOTOR_PWM, OUTPUT);
  pinMode(MOTOR_DIR1, OUTPUT);
  pinMode(MOTOR_DIR2, OUTPUT);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Bateria:");

  Serial.begin(9600);
}

void loop() {
  // Odczyt joysticka
  int joystickX = analogRead(JOYSTICK_X);
  int joystickY = analogRead(JOYSTICK_Y);

  // Mapowanie wartości joysticka na prędkość silnika
  int motorSpeed = map(joystickY, 0, 1023, -255, 255);

  // Kontrola kierunku i prędkości silnika
  if (motorSpeed > 0) {
    digitalWrite(MOTOR_DIR1, HIGH);
    digitalWrite(MOTOR_DIR2, LOW);
    analogWrite(MOTOR_PWM, motorSpeed);
  } else if (motorSpeed < 0) {
    digitalWrite(MOTOR_DIR1, LOW);
    digitalWrite(MOTOR_DIR2, HIGH);
    analogWrite(MOTOR_PWM, -motorSpeed);
  } else {
    digitalWrite(MOTOR_DIR1, LOW);
    digitalWrite(MOTOR_DIR2, LOW);
    analogWrite(MOTOR_PWM, 0);
  }

  // Odczyt napięcia baterii
  float batteryVoltage = readBatteryVoltage();
  int batteryPercentage = map(batteryVoltage * 100, MIN_BATTERY_VOLTAGE * 100, MAX_BATTERY_VOLTAGE * 100, 0, 100);
  batteryPercentage = constrain(batteryPercentage, 0, 100);

  // Wyświetlanie poziomu naładowania baterii na LCD
  lcd.setCursor(0, 1);
  lcd.print("     ");
  lcd.setCursor(0, 1);
  lcd.print(batteryPercentage);
  lcd.print("%");

  delay(100);
}

float readBatteryVoltage() {
  int sensorValue = analogRead(BATTERY_VOLTAGE);
  float voltage = sensorValue * (5.0 / 1023.0);
  float batteryVoltage = voltage / (R2 / (R1 + R2));
  return batteryVoltage;
}

Schemat połączeń

  1. Joystick:

    • VCC do 5V Arduino
    • GND do GND Arduino
    • VRx (oś X) do A0 Arduino
    • VRy (oś Y) do A1 Arduino
  2. Silnik DC i sterownik (np. L298N):

    • PWM silnika do pinu 9 Arduino
    • DIR1 silnika do pinu 7 Arduino
    • DIR2 silnika do pinu 8 Arduino
    • Zasilanie sterownika podłączone do baterii 24V
  3. Wyświetlacz LCD I2C:

    • VCC do 5V Arduino
    • GND do GND Arduino
    • SDA do pinu A4 Arduino
    • SCL do pinu A5 Arduino
  4. Dzielnik napięcia:

    • Górny rezystor (R1 = 20kΩ) podłączony do dodatniego bieguna baterii
    • Dolny rezystor (R2 = 5kΩ) podłączony do GND
    • Punkt środkowy między rezystorami podłączony do A2 Arduino
  5. Zasilanie Arduino:

    • Użyj regulatora napięcia (np. LM7805) do konwersji 24V na 5V dla Arduino

Szczegółowa analiza problemu

Kontrola silnika DC

  • Joystick: Odczytujemy wartości z osi X i Y joysticka za pomocą analogRead().
  • Prędkość i kierunek: Wartości z osi Y są mapowane na prędkość silnika, a wartości z osi X na kierunek obrotów.
  • Sterowanie silnikiem: Używamy sygnałów PWM do kontrolowania prędkości silnika oraz pinów cyfrowych do zmiany kierunku.

Wyświetlanie poziomu naładowania baterii

  • Dzielnik napięcia: Używamy dzielnika napięcia, aby zmniejszyć napięcie baterii do bezpiecznego poziomu dla Arduino.
  • Odczyt napięcia: Odczytujemy napięcie z dzielnika za pomocą analogRead() i przeliczamy je na rzeczywiste napięcie baterii.
  • Wyświetlanie na LCD: Przeliczamy napięcie na procenty i wyświetlamy na LCD.

Wspierające wyjaśnienia i detale

  • Dzielnik napięcia: Używamy rezystorów 20kΩ i 5kΩ, aby zmniejszyć napięcie z 25V do 5V.
  • Mapowanie wartości: Funkcja map() jest używana do przeliczania wartości z joysticka na zakres prędkości silnika oraz napięcia na procenty.

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • Bezpieczeństwo: Upewnij się, że wszystkie połączenia są prawidłowo izolowane i że używasz odpowiednich komponentów dostosowanych do napięcia 24V.
  • Dokładność: Sprawdź dokładność dzielnika napięcia i ewentualnie dostosuj wartości rezystorów.

Podsumowanie

Kod i schemat połączeń przedstawione powyżej pozwalają na kontrolowanie silnika DC za pomocą joysticka oraz wyświetlanie poziomu naładowania baterii na wyświetlaczu LCD. Upewnij się, że wszystkie połączenia są prawidłowe i bezpieczne przed uruchomieniem układu.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.