• 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
Opornik podciągający
#1
Witajcie.

Napisałem sobie program do sterowania bramą (Otwieranie - STOP - ZAMYKANIE - STOP) i na teście to dobrze działało.
Podłączyłem wszystko pod bramę i teraz sama się zamyka lub otwiera (nie wiem dlaczego) i szukam przyczyny

Całość jest postawione na Kicie z ATTINY85
Attiny85
i ponieważ nie działa funkcja podciągania wejścia INPUT_PULLUP to podciągam ją opornikiem 22k do +12V
Układ zasilany z 12V przez VIN
Miał być 10k ale nie znalazłem i miałem 2k lub 22k więc wybrałem ten większy.
Ewentualnie może błąd w kodzie - dodałem linijki do Monitora portu szeregowego i testuję na UNO i nie widać błędu (stąd LED1 na 13 a w ATTINY85 na 1
Kod:
#include <Timers.h> // https://github.com/nettigo/Timers
Timer TimerOtwierania;
Timer TimerZamykania;
Timer TimerFlash;
Timer TimerOpoznienia;
Timer TimerBlink;
Timer TimerBlink1;
Timer TimerKey;
Timer TimerALL;
int ji,ki;
long z;
byte j,k,blink_stats, blink_stats1;
byte cykl; //0-przerwa, 1-otwieranie, 2-przerwa, 3-zamykanie


#define LED0 3 //0 Zamykanie
#define LED1 13 //1 BuiltIN -
#define LED2 2 //2 Otwieranie
#define LED3 0 //3 Flash
#define KEY1 4 //4 Elmes
#define ON HIGH
#define OFF LOW
#define CZAS_OTWIERANIA 22000
#define CZAS_ZAMYKANIA 23000
#define CZAS_FLASH 25000

void setup() {               
Serial.begin(38400);
Serial.println("Start programu");
  pinMode(LED0, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(KEY1, INPUT_PULLUP);
  digitalWrite(LED0, OFF);
  digitalWrite(LED1, OFF);
  digitalWrite(LED2, OFF);
  digitalWrite(LED3, OFF);
  blink_stats = OFF;
  TimerBlink1.begin(1000);

}

// the loop routine runs over and over again forever:
void loop() {
    digitalWrite(LED1, blink_stats1);
    if (j==1) ji++;
    if (digitalRead(KEY1) == 0) {
      digitalWrite(LED1, HIGH); //OFF - dla diody wbudowanej odwrotnie
      // Serial.println("FLASH - Start");
      TimerFlash.begin(CZAS_FLASH);
      TimerOpoznienia.begin(3000);
      TimerKey.begin(1000);     
      TimerALL.begin(CZAS_FLASH);
      blink_stats = ON;     
     
      }
    else {
      digitalWrite(LED1, LOW); //OFF
      }    // turn the LED off by making the voltage LOW
   
      if (ji==10) {
        cykl++;
        // Serial.print("Cykl bramy: ");
        // Serial.println(cykl);
        j=0;
        ji=0;       
        }
      if (cykl==0 || cykl==2)digitalWrite(LED0, OFF); //FLASH stop
      if (cykl==1 || cykl==3)digitalWrite(LED0, blink_stats); //FLASH start
      if (cykl==4) cykl=0;

    if (TimerOpoznienia.available())  {
      TimerOtwierania.begin(CZAS_OTWIERANIA);
      TimerZamykania.begin(CZAS_ZAMYKANIA);     
      TimerBlink.begin(1000);
      TimerOpoznienia.time(STOP);
      // Serial.println("Koniec opoznienia");
      k=1;
      }   

    if (k==1 && cykl==1) {
      z++;
      digitalWrite(LED2, ON);
      digitalWrite(LED3, OFF);
      if (z==1) Serial.println("Otwieranie bramy");
      }
    if (TimerOtwierania.available())  {
      TimerOtwierania.time(STOP); 
      if (cykl==1) Serial.println("Koniec Otwierania");
      k=0;
      z=0;
      }
    if (cykl==2 || cykl==0) {
      digitalWrite(LED2, OFF);
      digitalWrite(LED3, OFF);
      if (k==1) {
      Serial.print("PRZERWA cykl= ");
      Serial.println(cykl); 
      }
      k=0;
      z=0;
      }
    if (k==1 && cykl==3) {
      z++;
      digitalWrite(LED2, OFF);
      digitalWrite(LED3, ON);
      if (z==1) Serial.println("Zamykanie bramy");
      }

    if (TimerZamykania.available())  {
      TimerZamykania.time(STOP); 
      if (cykl==3) Serial.println("Koniec Zamykania");
      k=0;
      z=0;
      }
    if (TimerKey.available())  {
      TimerKey.time(STOP); 
      j=1;
      }     
    if (TimerFlash.available())  {
      TimerFlash.time(STOP); 
      digitalWrite(LED0, OFF); //FLASH stop
      Serial.print("Koniec FLASH. Cykl: ");
      Serial.println(cykl);
      }
    if (TimerALL.available())  {
      TimerALL.time(STOP); 
      if (cykl==1) cykl=2;
      if (cykl==3) cykl=0;
      Serial.print("Automatyczna zmiana cyklu. Cykl: ");     
      Serial.println(cykl);
      }           
    if (TimerBlink.available())  {
      TimerBlink.restart(); 
      blink_stats = !blink_stats;
      } 
    if (TimerBlink1.available())  {
      TimerBlink1.restart(); 
      blink_stats1 = !blink_stats1;
      if (z) Serial.print(".");
      }       
}
 
Odpowiedź
#2
Nie uwzględniasz tak zwanych, "drgania styku" ani flagi wiec loop może przelecieć kilkakrotnie

if (digitalRead(KEY1) == 0)
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Wejście układu zasilanego z 5V podciągasz do +12?
O drganiach styku już napisał Jarewa0606. Jak widzisz nie zawsze to co działa na stole działa w polu. Jak rozwiążesz problem zakłóceń na wejściu to pozostaną kolejne, bark watchodoga, prawdopodobnie brak zabezpieczenia wejść.
 
Odpowiedź
#4
Jak podłączyłeś jakiś pin pod 12V to on już pewnie jest usmażony. Pokaż schemat.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
drgania styków są rozwiązane na inny sposób. Jest sobie zmienna ji która tylko przy jednym obiegu procka ma wartość 10 i przy tej wartości zmienia cykl++ - więc to nie problem.
podciąganie zrobiłem 22k po to żeby obniżyć napięcie . Miało być zasilane z 5V ale wtedy przekaźniki nie działały - stąd 12V. a z kolei jak dawałem podciąganie do wyjścia 5V jak jest zasilane z 12V to niestety nie podciągało i nie rozpoznawało stanu wysokiego.

Schemat nakreślę później, ale od razu mówię że to jest czysty KIT z linku + jeden opornik 22k + zestaw przekaźników z tranzystorami do arduino.

Wejście nie upalone jeszcze ale zrobię dzielnik rezystorowy - tylko wtedy zostawić opornik podciągający 22k czy zmniejszyć do 10k
 
Odpowiedź
#6
Stan wysoki jest pewnie rozpoznawany przy V>2/3Vcc, rezystor w szeregu nie obniża napięcia tylko ogranicza prąd. Jak u Ciebie tak nie jest to POKAŻ SCHEMAT Big Grin.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
Witam.
Schemat w załączeniu

Teraz dziwna sprawa - wziąłem drugi kit (nowy z folijki), zaprogramowałem tym samym programem i zachowuje się dziwnie.
(kod programu powyżej)

1. Podłączyłem zasilanie z USB i nie działa. Ciągle nie rozpoznaje przycisku czyli cały czas dioda LED1 się świeci, dopiero jak podłączymy bez opornika +5V na PB4 to rozpoznaje stan wysoki, z kolei takie podłączenie nie daje możliwości wyzwalania przycisku (chyba że ściągnę napięcie z PB4 to wtedy rozpoznaje jakby naciśnięcie przycisku - czyli teoretycznie jako zwarcie do masy.
2. Podłączam zasilanie do pinów +5V i GND i zachowuje się dobrze: wartość opornika  od 1k do 20k (miernik pokazuje napięcie na PB4 około 3,5V przy 1k i 2,5V przy 20k
3. Podłączyłem zasilanie do pinów VIN i GND i ciekawostka. Działa wewnętrzne podciąganie ale tylko jeśli napięcie jest od 5 do 6,5V (Teoretycznie wg opisu zasilanie na VIN może być od 7 do 25V), ale chce mieć to 12V bo akurat taki mam zasilacz podłączony i robię dzielnik napięcia rezystorowy (10k i 8,2k) i niby jest ok, ale nie działa. Po podaniu masy na
PB4 dioda LED1 się świeci a po ściągnięciu masy miga ale nie rozpoczyna odliczania. Ten układ nie ma portu szeregowego więc nie wiem co on robi, ale nie zachowuje się poprawnie. Można by próbować z innym dzielnikiem i szukać rozwiązania, ale chyba nie o to chodzi żeby szukać na siłę rozwiązania tylko żeby być pewny tego najwłaściwszego.
Co o tym myślicie.
Ciekawostka jest taka że teraz ten nowy KIT nie działa w starym układzie (być może po włączeniu podciągania programowego coś to psuje
Ciekawostka jest taka że w zasadzie działa poprawnie tylko dla napięcia +5V do +6,5V mimo że ma oddzielne wejście do 25V. Nie ma mowy o złym podłączeniu bo skoro działa na +5V to tylko przekładam kabelek z +5V na VIN i zwiększam napięcie na zasilaczu i przy 7V przestaje to działać.


Załączone pliki Miniatury
   
 
Odpowiedź
#8
Tak na szybko zaprogramowałem bez podciągania wewnętrznego i nie działa z zasilaniem powyżej 7V. Zaprogramowałem ponownie z podciąganiem i teraz działa poprawnie tak jak wcześniej ale tylko przy napięciu na VIN poniżej 6,5V
Czyżby to był procesor na 3,3V a Chińczycy dali stabilizator 5V?
muszę jeszcze sprawdzić jak jest na arduino UNO, ale jak mierzę napięcie na PB4 to mimo że opornik jest do +12V tak jak na schemacie to napięcie jest 3,5V względem masy układu


Załączone pliki Miniatury
   
 
Odpowiedź
#9
Mylisz pojęcia, Vin i VCC to powinny być różne napięcia. Vcc to jest napięcie na pinie uC, Vin to przed regulatorem napięcia. Albo podpinasz >7V do Vin przed regulator napięcia albo Vcc=5V za nim wprost na pin Vcc uC. W każdym przypadku używając zewnętrznego rezystora podciągającego podłączasz go do Vcc i generalnie powinno to być 5V.
Nie robi się kilku wersji napięciowej Attiny85, możesz go zasilić  Vcc od 1.8-5.5V i będzie działał, pod warunkiem że częstotliwość taktowania będzie pasować do tego Vcc, przy 1.8V nie można przekraczać 4MHz, przy 3.3V może być max 12MHz, a powyżej wymagane jest napięcie 5V. Napięcia podawane na piny nie mogą przekraczać Vcc, tak że jeśli zasilasz uC 3V to podciągasz piny do 3V, coś powyżej 2V traktowane jest jako stan wysoki, a wszystko poniżej 1V jako stan niski. Interpretacja jest w odniesieniu do Vcc (1/3Vcc, obszar niepewny, 2/3Vcc). Wartości napięć podaję w przybliżeniu, dokładne sprawdź sobie w PDF uC.
Jeśli przekaźniki mają cewki na 12V to musisz podłączyć Vin do 12V, Vin podajesz na cewki, uC będzie zasilany z Vcc=5V, do Vcc podłączasz rezystor podciągający, ale lepiej kup sobie przekaźniki z optoizolacją.
Po zasileniu uC wystarczy wziąć miernik i sprawdzić Vcc. Jak nie masz żadnego multimetru to bieda straszna, jak już z tym zaczynasz gdybać to daleko nie zajedziesz.
Może się zdarzyć, że 1 płytka na 100 przyjdzie skopana, w pozostałych 99 przypadkach to jest błąd użytkownika, szczególnie gdy jest na początku zabawy z Arduino.
Ta płytka wygląda na taką do zabawy z ledami, UNO będzie dużo lepsze do testów, ma przynajmniej jakieś kondensatory elektrolityczne, w razie czego można też podejrzeć co się dzieje przez serial port.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#10
Mnie się wydaje, że tu wiele rzeczy stoi na głowie. Podciągnięcia do +12V a na płytce jest +5V po stabilizatorze, tranzystory NPN podpięte odwrotnie. Niby wtórnik emiterowy, ale do góry nogami. Jak to ma działać nie wiem. Trzeba to wszystko postawić na nogi, bo tak to nic z tego nie będzie. Chyba, że mi się coś wydaje i mam oczopląs.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości