• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wyświetlacz 16x2 na I2C + serwo = problem
#1
Z racji że jest to mój pierwszy post, powinienem się przywitać więc CZEŚĆ wszystkim Smile

Robiłem sobie prosty projekt na Arduino i wystąpił niezrozumiały dla mnie problem, do rzeczy

1. Podłączyłem klawiaturę 4x4 membranową na I2C
2. Podłączyłem wyświetlacz 16x2 bezpośrednio do Arduino Uno 
3. Wyświetla mi wszystko bez problemu na ekranie

Problem pojawia się gdy dokładam linijkę servo.attach(9);
Wtedy wyświetlacz ma problemy - raz działa, raz wypisuje bzdury

Podobnie przestaje działać gdy ustawię serial.begin(9600);

Czy ktoś wie jak to rozwiązać albo jakie są tego przyczyny?
Pozdrawiam

PS nie znalazłem rozwiązania na forum Sad

Edit: wstawiam kod + za chwile film z działania
Kod:
#include <Wire.h>
#include <Keypad_I2C.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#include <EEPROM.h>

LiquidCrystal lcd(0, 1, 2, 3, 4, 5); //podpięcie wyswietlacza

const byte ROWS = 4; //ilosc wierszy
const byte COLS = 4; //ilosc kolumn

char keys[ROWS][COLS] = { //definicja klawiszy
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte rowPins[ROWS] = {0,1,2,3}; //wiersze 0-3
byte colPins[COLS] = {4,5,6,7}; //kolumny 0-3

int i2caddress = 0x20;
Keypad_I2C kpd = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress ); //definicja klawiatury - zaczerpniete dane ze zmiennych

int pamiec[4]; //pamiec wcisnietych klawiszy
char kod[4]={'1','2','3','4'};
Servo serwo;

void setup()
{ lcd.begin(16, 2); //Deklaracja typu
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print("Witaj! wpisz kod"); //Wyświetlenie tekstu
 kpd.begin();
 pinMode(7, OUTPUT);
 digitalWrite(7,LOW);
 serwo.attach(9);
 //serwo.write(0);
}

void stan_norm()
{ lcd.begin(16, 2); //Deklaracja typu
 lcd.clear();
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print("Witaj! wpisz kod"); //Wyświetlenie tekstu
 digitalWrite(7,LOW); //zgaszenie diody
 //serwo.write(0);
}

void wypisanie_kodu()  //zapisywanie kodu + sterowanie zamkiem
{  
   lcd.setCursor(0,1);
   
     for(int l=0; l<=3 ; l++ )
     {
         char key;
         do key= kpd.getKey(); while(key==NO_KEY);
         digitalWrite(7, HIGH);
            {
             pamiec[l]=(key);  //zapisanie cyfry kodu
             //lcd.setCursor(l,1);
             lcd.print(key);
             delay(100); //dlugosc sygnalu dzwiekowego
             digitalWrite(7, LOW);
             if (l==3)
               { if (pamiec[0]==kod[0] && pamiec[1]==kod[1] && pamiec[2]==kod[2] && pamiec[3]==kod[3])    
                   otwarte();
                   else
                   zamkniete();
             }
           }
     }
     
}
void zamkniete()
{  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Bledny kod");
  digitalWrite(7, HIGH);
  delay(500);
  digitalWrite(7, LOW);
  delay(600);
  stan_norm();  
}

void otwarte()
{  serwo.write(120);
   lcd.begin(16,2);
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("OTWARTE");
     for (int i=0;i<5;i++)
       {digitalWrite(7, HIGH);
        delay(100);
        digitalWrite(7,LOW);
        delay(100);
       }
   delay(5000);
   stan_norm();
}    

void loop ()
{   wypisanie_kodu();
}
Film z działania
 
Odpowiedź
#2
Spróbuj innej wersji arduino , jak nie pomoże to poszukaj alternatywnych bibliotek . Czasem się zdarza że wewnętrzne procedury bibliotek mają konflikt i niestety czasem właśnie takie efekty można zaobserwować .

tutaj masz kodzik do obsługi serwa bez biblioteki

Kod:
int servo = 9;

int angle;
int pwm;

void setup()
{
pinMode(servo, OUTPUT);
}

void loop ()
{
for (angle = 0; angle <= 140; angle += 1)  {
   servoPulse(servo, angle);  }
for (angle = 140; angle >= 0; angle -= 1)  {
   servoPulse(servo, angle);  }
}

void servoPulse (int servo, int angle)
{
pwm = (angle*11) + 500;      // Convert angle to microseconds
digitalWrite(servo, HIGH);
delayMicroseconds(pwm);
digitalWrite(servo, LOW);
delay(50);                   // Refresh cycle of servo
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#3
Dzięki wielkie  JasQ Smile
Teraz działa wyświetlacz aczkolwiek mam problemy z regulacją kąta, ale to wina raczej bałaganu w kodzie który jest świeżo modyfikowany przez świeżaka.

a z biblioteką pewnie jest problem tą od wyświetlacza (w moim przypadku) gdyż po linijce serial.begin też pisze mi po chińsku :Big Grin

Pozdrawiam ;Wink
 
Odpowiedź
#4
Mogę się mylić, ale moim skromnym zdaniem, to problem leży nie w programie, lecz w zakłóceniach, spowodowanych pracą silnika w serwie. Proponuję podłączenie serwa pod inne zasilanie lub przynajmniej spróbować dołożyć kondensator filtrujący.
 
Odpowiedź
#5
Ta biblioteka do serwa używa timer 1 i bibloteka do key 4X4 tag ze z tat jest takie dziwne działanie konieczne jest znalezienie innej biblioteki
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości