Skocz do zawartości

Arduino - problem z lcd I2C i serwomechanizmami


Pomocna odpowiedź

Tak, to będzie to. Po zwiększeniu delay serwa jeszcze bardziej zwolniły. Co do funkcji z użyciem wskaźników, to nie wiem jak to wykonać. Mogę prosić o jakieś źródło wiedzy jak to zastosować?

15 minut temu, Albi134 napisał:

Po zwiększeniu delay serwa jeszcze bardziej zwolniły. 

Co jest czymś naturalnym bo tak napisałeś kod...nie wprowadzasz do serwo.write tego co Ci wychodzi po funkcji map() tylko po "kawałeczku" zwiekszasz/zmniejszasz wartość...no chyba że taki był zamiar żeby serwa reagowały powoli? 

 

void loop() {
  fun(nr_pin, wartosc);

}

void fun(int pin, int * val) {
 
 int iJoyStickY3 = analogRead(pin);
  iJoyStickY3 = map(iJoyStickY3, 0, 1023, 0, 180);

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

I dla 6 serw zmieniasz tylko w wywołaniu funkcji, nr pin i zmienna do przechowania wartości...można też prościej bez użycia wskaźników...upchać wszystko w tablice(zmienne,nr piny, etc) i w wywołaniu podawać nr indeksu...

  • Lubię! 1
Przed chwilą, Albi134 napisał:

Serwa mają być napędem do ramienia robota 5 osiowego. Więc chodziło mi o to żeby serwa zapamiętywały pozycje

No i będą...to jaka wartość wprowadzisz do .write() to taka pozycję trzymają serwa...moim zdaniem powinieneś wywalić te delaye od opóźnień i to zwiększanie/zmniejszanie wartości...to są zwykle serwa 180°?

4 minuty temu, farmaceuta napisał:

No i będą...to jaka wartość wprowadzisz do .write() to taka pozycję trzymają serwa..

To jak zrealizować zatrzymanie serwa po powrocie joysticka do pozycji wyjściowej?

10 minut temu, Albi134 napisał:

Serwa mają być napędem do ramienia robota 5 osiowego. Więc chodziło mi o to żeby serwa zapamiętywały pozycje

Aha! Teraz dopiero załapałem o co Ci chodzi😉...no tak, to wszystko będzie jak jest teraz, tylko upakować to w tą funkcję jak mówię...jutro Ci to ładniej rozpiszę

#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

 byte pin[] = {A0, A1, A2, A3, A4, A5};
 byte val[] = {90, 90, 90, 90, 90, 90};   // wartosci startowe

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
   guziki();
   fun();

  myServo0.write(val[0]);
  myServo1.write(val[1]);
  myServo2.write(val[2]);
  myServo3.write(val[3]);
  myServo4.write(val[4]);
  myServo5.write(val[5]);
  
 delay(2);
}  



void fun() {
  for(int x = 0; x < 6; x++) {
  int value = analogRead(pin[x]);                     // odczyt wartosci z pinu analogowego A0
  value = map(value, 0, 1023, 0, 180);  // mapowanie wartosci z joysticka na servo
  
  if (value > 100) {                          // ruch serwa na plus
    val[x] = val[x] + 1;
   
  }
  if (value < 90) {                           // ruch serwa na minus
    val[x] = val[x] - 1;
   
  }
  if (val[x] < 0) {                             // ograniczenie nadpisywania wartosci ujmenych
    val[x] = 0;
  }
  if (val[x] > 180) {                            // ograniczenie nadpisywania wartosci dodatnich
    val[x] = 180;
  }


  }

  
}

void guziki() {

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;    
  }
  
}

daj znac czy ten kod dziala...a jak bedzie to mozna dalej bawic sie wyswietlaniem na lcd...

kod działa obecnie tak, że serwo podpięte do pinu 5 rusza się cały czas lewo prawo, a gdy spróbuje się poruszyć joystickiem to wszystkie serwa zaczynają się tak ruszać

#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

 byte pin[] = {A0, A1, A2, A3, A4, A5};
 int val[] = {90, 90, 90, 90, 90, 90};   // wartosci startowe

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
  // guziki();
   fun();

  myServo0.write(val[0]);
  myServo1.write(val[1]);
  myServo2.write(val[2]);
  myServo3.write(val[3]);
  myServo4.write(val[4]);
  myServo5.write(val[5]);
  
 delay(4);
}  



void fun() {
  for(int x = 0; x < 6; x++) {
  int value = analogRead(pin[x]);                     // odczyt wartosci z pinu analogowego A0
  value = map(value, 0, 1023, 0, 180);  // mapowanie wartosci z joysticka na servo
    // Serial.println(value);
  if (value > 100) {                          // ruch serwa na plus
    val[x] = val[x] + 1;
  
   
  }
  if (value < 85 ) {                           // ruch serwa na minus
    val[x] = val[x] - 1;
   
  }
  if (val[x] > 180) {                            // ograniczenie nadpisywania wartosci dodatnich
    val[x] = 180;
  }
  if (val[x] < 0) {                             // ograniczenie nadpisywania wartosci ujmenych
    val[x] = 0;
  }


  }

  
}

void guziki() {

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;    
  }
  
}

tylko taka rada...podepnij wszystkie joistiki po piny adc bo wchodza miedzy soba w interakcje i cuda sie dzieja jesli nie podlaczone (sieja na inne)(wlasnie sprawdzalem)

Jest super, teraz działa jak powinno i zajmuje dużo mniej miejsca. Tylko mam jeszcze pytanie. Serwa z których korzystam przy ruszaniu pobierają tyle prądu, że są spadki napięcia na tyle duże że powodują delikatne przygaszenie ekranu LCD. Co mogę dołączyć do układu aby zniwelować te zjawisko? Próbowałem z kondensatorem 1000mikro, ale albo mam zbyt małą pojemność, albo źle go wpinam do układu.

No jeśli Ci brakuje prądu to żaden kondensator nie pomoże (troszkę poprawi sytuację) więc musisz dać lepsze zasilanie dla serw...innej rady nie ma..( delay() w loop() jest odpowiedzialny za prędkości serw)

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...