Skocz do zawartości

Arduino - problem z lcd I2C i serwomechanizmami


Albi134

Pomocna odpowiedź

Dzień dobry,

trudzę się z rozwiązaniem problemu jaki napotykam. Problem jest taki, iż w układzie z arduino UNO mam 6 serwomechanizmów, sterowanych 3 joystickami. Wszystko jest zasilane z zasilacza ATX. Całość działa dobrze do momentu, gdy chcę podłączyć ekran lcd po magistrali I2C. Gdy podłączę wyświetlacz i włącze podświetlenie, ale nic nie wyświetlam na nim, mój problem nie występuje. Jednak gdy do wyświetlacza zostanie przesłany jakiś tekst to serwa zaczynają "drgać, pulsować". Jakby serwa próbowały się cały czas koregować w miejscu. Nie mam pojęcia z czego to wynika. Dodatkowo, gdy na ekranie jest coś wyświetlane to serwomechanizmy poruszają się wolniej. Proszę o jakieś sugestie

Link do komentarza
Share on other sites

@Albi134 czy w swoim programie nie masz przypadkiem podłączonych serw/joysticków pod piny A4 i A5? One są używane podczas komunikacji przez I2C, więc wysyłając dane do wyświetlacza wpływasz na napięcia mierzone z wejść A4 i A5.

Edytowano przez Treker
Poprawna numerów wyprowadzeń.
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@Albi134 jeśli wtedy nie będzie problemu to znak, że coś jest nie tak z zasilaniem. Jeśli problem będzie nadal występował to przydałoby się, abyś pokazać swój kod - łatwiej będzie coś doradzić.

Link do komentarza
Share on other sites

Chodziło mi właśnie o te piny analogowe odpowiedzialne za I2C. Ogólnie zmieniłem w weekend płytkę na Arduino Mega, problem występuje ten sam, więc myślę że to nie jest problem wykorzystania nieodpowiednich pinów. Jak będę miał dostęp do komputera, to podeśle kod.

Link do komentarza
Share on other sites

52 minuty temu, farmaceuta napisał:

Taka ma dygresja...i2c dla Uno jest na pinach A4/A5, więc jeśli używasz tej magistrali nie możesz w żaden sposób korzystać z tych pinów...

Aj słusznie - z pamięci źle napisałem, że chodzi o A0/A1. Edytuje mój wcześniejszy post, aby nikogo nie mylić.

  • Lubię! 1
Link do komentarza
Share on other sites

#include <Servo.h>                                  // wywolanie biblioteki odpowiedzialnej za sterowanie serwami
#include <Wire.h>                                   // wywolanie biblioteki odpowiedzialnej za komunikacje I2C
#include <LiquidCrystal_I2C.h>                      // wywolanie biblioteki odpowiedzialnej za obsluge wyswietlacza
LiquidCrystal_I2C lcd(0x27,16,2);                   // adresacja wyswietlacza

Servo myServo0;                                     // wywolanie 1 serwa
Servo myServo1;                                     // wywolanie 2 serwa
Servo myServo2;                                     // wywolanie 3 serwa
Servo myServo3;                                     // wywolanie 4 serwa
Servo myServo4;                                     // wywolanie 5 serwa
Servo myServo5;                                     // wywolanie 6 serwa

int iJoyStickX1;                                    // sterowanie serwem1
int iJoyStickY1;                                    // sterowanie serwem2
int iJoyStickX2;                                    // sterowanie serwem3
int iJoyStickY2;                                    // sterowanie serwem4
int iJoyStickX3;                                    // sterowanie serwem5
int iJoyStickY3;                                    // sterowanie serwem6

int iRotation1 = 90;                                // zmienna odpowiadajaca za ruch 1 serwa
int iRotation2 = 90;                                // zmienna odpowiadajaca za ruch 2 serwa
int iRotation3 = 90;                                // zmienna odpowiadajaca za ruch 3 serwa
int iRotation4 = 90;                                // zmienna odpowiadajaca za ruch 4 serwa
int iRotation5 = 90;                                // zmienna odpowiadajaca za ruch 5 serwa
int iRotation6 = 90;                                // zmienna odpowiadajaca za ruch 6 serwa

int iPushButton1 = 0;
int iPushButton2 = 0;
int iPushButton3 = 0;
int iPushButton4 = 0;

int ilicznik = 0;
int last = 0;
  
void setup() {
  myServo0.attach(3);                               // wywolanie 3 pinu do sterowania 1 serwa
  myServo1.attach(5);                               // wywolanie 5 pinu do sterowania 2 serwa
  myServo2.attach(6);                               // wywolanie 6 pinu do sterowania 3 serwa
  myServo3.attach(9);                               // wywolanie 9 pinu do sterowania 4 serwa
  myServo4.attach(10);                              // wywolanie 10 pinu do sterowania 5 serwa
  myServo5.attach(11);                              // wywolanie 11 pinu do sterowania 6 serwa

                                   
  lcd.init();                                       // inicjalizacja LCD
  lcd.backlight();                                  // wlaczenie lub wylaczenie podswietlenia ekranu
  
  Serial.begin(9600);                               // komunikacja UART

  pinMode(19, INPUT_PULLUP);
  pinMode(28, INPUT_PULLUP);
  pinMode(29, INPUT_PULLUP);
  pinMode(53, INPUT_PULLUP);    
 
}

void loop() {

Serial.println(ilicznik);                      // podglad zmiennych

  if (digitalRead(19) == LOW){                 // aktywacja przyciskow
  iPushButton1 = 1;
  } else {
    iPushButton1 = 0;
  }
  if (iPushButton1 != last) {                 // liczenie wcisniecia, a nie przytrzymania
  delay(30);
    if (iPushButton1 == HIGH) {  
    ilicznik = 1; }  
  last = iPushButton1;    
  }

  if (digitalRead(28) == LOW){
  iPushButton2 = 1;
  } else {
    iPushButton2 = 0;
  }
  if (iPushButton2 != last) {
  delay(30);
    if (iPushButton2 == HIGH) {  
    ilicznik = 2; }  
  last = iPushButton2;    
  }
  
  if (digitalRead(29) == LOW){
  iPushButton3 = 1;
  } else {
    iPushButton3 = 0;
  }
  if (iPushButton3 != last) {
  delay(30);
    if (iPushButton3 == HIGH) {  
    ilicznik = 3; }  
  last = iPushButton3;    
  }

  if (digitalRead(53) == LOW){
  iPushButton4 = 1;
  } else {
    iPushButton4 = 0;
  }
  if (iPushButton4 != last) {
  delay(30);
    if (iPushButton4 == HIGH) {  
    ilicznik = 4; }  
  last = iPushButton4;    
  }

    lcd.setCursor(0,0);                               // ustawienie pozycji kursora na ekranie LCD                          
    lcd.print("Wybierz tryb:");
    lcd.setCursor(0,1);
    lcd.print("Reczny");
    lcd.print("  Auto");
    delay(100);


  
  // Sterowaniem pierwszym serwem pin 3

  iJoyStickX1 = analogRead(A0);                     // odczyt wartosci z pinu analogowego A0
  iJoyStickX1 = map(iJoyStickX1, 0, 1023, 0, 180);  // mapowanie wartosci z joysticka na servo
  
  if (iJoyStickX1 > 100) {                          // ruch serwa na plus
    iRotation1 = iRotation1 + 5;
    myServo0.write(iRotation1) ;
    delay(10);
  }
  if (iJoyStickX1 < 90) {                           // ruch serwa na minus
    iRotation1 = iRotation1 - 5;
    myServo0.write(iRotation1) ;
    delay(10);
  }
  if (iRotation1 < 0) {                             // ograniczenie nadpisywania wartosci ujmenych
    iRotation1 = 0;
  }
  if (iRotation1 > 180) {                            // ograniczenie nadpisywania wartosci dodatnich
    iRotation1 = 180;
  }
   // Sterowanie drugim serwem pin 5
  
   iJoyStickY1 = analogRead(A1);
   iJoyStickY1 = map(iJoyStickY1, 0, 1023, 0, 180);
  
   if (iJoyStickY1 > 90) {
    iRotation2 = iRotation2 + 5;
    myServo1.write(iRotation2);
    delay(10);
  }
  if (iJoyStickY1 < 80) {
    iRotation2 = iRotation2 - 5;
    myServo1.write(iRotation2);
    delay(10);
  }
  if (iRotation2 < 0) {
    iRotation2 = 0;
  }
  if (iRotation2 > 180) {
    iRotation2 = 180;
  } 
   // Sterowanie trzecim serwem pin 6

   iJoyStickX2 = analogRead(A2);
   iJoyStickX2 = map(iJoyStickX2, 0, 1023, 0, 180);

   if (iJoyStickX2 > 100) {
    iRotation3 = iRotation3 + 5;
    myServo2.write(iRotation3);
    delay(10);
  }
  if (iJoyStickX2 < 90) {
    iRotation3 = iRotation3 - 5;
    myServo2.write(iRotation3);
    delay(10);
  }
  if (iRotation3 < 0) {
    iRotation3 = 0;
  }
  if (iRotation3 > 180) {
    iRotation3 = 180;
  } 
   // Sterowanie czwartym serwem pin 9
   
   iJoyStickY2 = analogRead(A3);
   iJoyStickY2 = map(iJoyStickY2, 0, 1023, 0, 180);

   if (iJoyStickY2 > 100) {
    iRotation4 = iRotation4 + 5;
    myServo3.write(iRotation4);
    delay(10);
   }
   if (iJoyStickY2 < 90) {
    iRotation4 = iRotation4 - 5;
    myServo3.write(iRotation4);
    delay(10);
   }
   if (iRotation4 < 0) {
    iRotation4 = 0;
   }
   if (iRotation4 > 180) {
    iRotation4 = 180;
   }
  // Sterowanie piatym serwem pin 10
  
  iJoyStickX3 = analogRead(A4);
  iJoyStickX3 = map(iJoyStickX3, 0, 1023, 0, 180);

   if (iJoyStickX3 > 100) {
    iRotation5 = iRotation5 + 5;
    myServo4.write(iRotation5);
    delay(10);
   }
   if (iJoyStickX3 < 90) {
    iRotation5 = iRotation5 - 5;
    myServo4.write(iRotation5);
    delay(10);
   }
   if (iRotation5 < 0) {
    iRotation5 = 0;
   }
   if (iRotation5 > 180) {
    iRotation5 = 180;
   }
  
  // Sterowanie szostym serwem pin 11
  iJoyStickY3 = analogRead(A5);
  iJoyStickY3 = map(iJoyStickY3, 0, 1023, 0, 180);

   if (iJoyStickY3 > 105) {
    iRotation6 = iRotation6 + 5;
    myServo5.write(iRotation6);
    delay(10);
   }
   if (iJoyStickY3 < 90) {
    iRotation6 = iRotation6 - 5;
    myServo5.write(iRotation6);
    delay(10);
   }
   if (iRotation6 < 0) {
    iRotation6 = 0;
   }
   if (iRotation6 > 180) {
    iRotation6 = 180;
   }
 
}

Ogólnie, to chyba ogarnąłem w czym problem. Tekst przesyłam w pętli, a nie tylko wtedy gdy następuje naciśnięcie przycisku odpowiedzialnego za menu. Czy moje spostrzeżenia są poprawne?

Link do komentarza
Share on other sites

Jedno razowe wyświetlanie komunikatów napewno nie zaszkodzi... druga sprawa to taka że kawał kodu to praktycznie kopiowanie tych samych if'ów z różnymi zmiennymi...a można to upchać w funkcję z użyciem wskaźników i kod zrobi się 6 razy krótszy... Wyświetlaj komunikaty co sekundę powiedzmy i wtedy się wyjaśni czy to jest przyczyną

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.