Skocz do zawartości

Programowanie serwomechanizmu do poszczególnych przycisków


Pomocna odpowiedź

1 godzinę temu, AlanB napisał:

jak wyeliminować te drgania styków bez uzywania zewnętrznych filtrów

Normalnie ludzie używają Bounce2 albo innych popularnych bibliotek do debouncingu...

@Santiago @Santiago oj gdyby tylko program Arduino IDE było tak proste jak kody które są w mojej głowie to było by pięknie 😁  a tak na poważnie to próbowałem samemu coś pokombinować z biblioteką Bounce2 ale zawsze coś nie wychodziło a to po przytrzymaniu przycisku serwo się nie ruszało , a to serwo cały czas się ruszało a dopiero jak wcisnąłem przycisk to serwo się zatrzymywało... Eh a tak to w tym głównym kodzie to właśnie są te drgania styków bo jak postawie kieliszek i zabiorę go po jakieś 1 minucie to przycisk znowu wyzwala i nalewa już do nalanego .... 

(edytowany)

@AlanB , jeżeli dalej bazujecie na tym, to spróbuj może tak:

void loop(){
	if (digitalRead(A0) == HIGH)  {pusty0 = true;}
	// dalsza część kodu
	
	if ((digitalRead(A0) == LOW) && (pusty0 == true)) {
		delay(100); // 50-100 ms na "uspokojenie" styków
		
		// dopiero teraz sprawdzam faktyczny stan
		if (digitalRead(A0) == LOW){
			serwomechanizm.write(20);  digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty0 = false; delay(1000);}
		}
		
	// dalsza część kodu
}

 

Edytowano przez orb777

@AlanB Na razie stara mi zmieniła plany na niedzielę, muszę odprowadzić dziecko na urodziny i je odebrać i to w moim wolnym czasie... , ale nie wie o tym , że w poniedziałek mam urlop, i na wszelki wypadek dowie się o tym dopiero w PONIEDZIAŁEK :), tak że spoko. 

Dzisiaj przetestuję jak się używa funkcji w c, która nie zwraca wartości. 

Dopracuję też algorytm. 

Jak się uda to podłączę wyświetlacz (zaczyna brakować kabelków).

Nie zapomnij o zaprojektowaniu Nalewaka tak, aby można było podłączyć USB i w razie czego przeprogramować.

ok zdaje się , że mniej więcej opanowałem wysyłanie danej do funkcji, oraz nieco tablice. Jutro jak tak dobrze pójdzie to podłączę wyświetlacz.

Nie zdziw się , że tablice są deklarowane jako 7 a nie 6, po prostu dla ułatwienia życia. Po prostu pierwszy element w tablicy to nie 1 a 0. Tak samo łatwo jest nadpisać dane nieumiejętnie używając tablic. 

 

#include <Servo.h>          // biblioteka dla silnika serwo
#include <LiquidCrystal.h>  // biblioteka wyswietlacza
LiquidCrystal lcd (7, 6, 5, 4, 3, 2);   // jak podlaczony jest wyswietlacz
Servo serwomechanizm;
 bool tPelny[7];            // warunek czy kieliszek zostal napelniony
 int  tOsoby[7];            // tablica dla kazdej osoby od 0 do 6 - takie sa tablice w c, ilosc na osobe
 const int tPozycja[7] {0, 10, 44, 78, 112, 146, 180};   // pozycja dla serwa
 long sumaZimprezy = 0;     // ile w sumie na imprezie bylo nalanych
 
void setup() {
 pinMode(13, OUTPUT);                  // przekaznik
 pinMode(A0, INPUT_PULLUP);    pinMode(A1, INPUT_PULLUP);    pinMode(A2, INPUT_PULLUP);
 pinMode(A3, INPUT_PULLUP);    pinMode(A4, INPUT_PULLUP);    pinMode(A5, INPUT_PULLUP);
 serwomechanizm.attach(12);     serwomechanizm.write(0);
 lcd.begin(12,2);  lcd.print("Witam");
 
}

void loop() {
  fCzujniki();           // funkcja ktora sprawdza stan czujnikow

}

void fCzujniki() {
  if (digitalRead(A0) == LOW) {delay(100); if (digitalRead(A0) == 0) {
    fUstawNalej(1);}  } else {tPelny[1] = false;}
  if (digitalRead(A1) == LOW) {delay(100); if (digitalRead(A1) == 0) {
    fUstawNalej(2);}  } else {tPelny[2] = false;}
  if (digitalRead(A2) == LOW) {delay(100); if (digitalRead(A2) == 0) {
    fUstawNalej(3);}  } else {tPelny[3] = false;}  
  if (digitalRead(A3) == LOW) {delay(100); if (digitalRead(A3) == 0) {
    fUstawNalej(4);}  } else {tPelny[4] = false;}
  if (digitalRead(A4) == LOW) {delay(100); if (digitalRead(A4) == 0) {
    fUstawNalej(5);}  } else {tPelny[5] = false;}
  if (digitalRead(A5) == LOW) {delay(100); if (digitalRead(A5) == 0) {
    fUstawNalej(6);}  } else {tPelny[6] = false;}
    
}

void fUstawNalej(int poz)
 {
  if (tPelny[poz] == false) {delay(800); serwomechanizm.write(tPozycja[poz]); digitalWrite(13, HIGH);
                             delay(3000); digitalWrite(13, LOW); tPelny[poz] = true;
  }
 }

czujniki dzialają poprawnie (przynajmniej nie zauważyłem anomali), podłączyłem wyświetlacz i nawet za pierwszym razem dobrze. Teraz muszę sprawdzić co tam dokładnie chciałeś aby było napisane.

@Santiago ekstra akurat jutro przyjdzie mi nowe Arduino uno starym gdzieś musiałem zwarcie zrobić i poszło się ..... Tak obudowa przyciski już wstępnie ogarnięte , dostęp do przesłania danych również nie będzie utrudniony , musiałem jeszcze zamówić inny serwomechanizm bo sg90 był za słaby do mojej konstrukcji nowe jest dużo mocniejsze , więc teraz jest ok. Może napiszę w skrócie jak mam podłączone wszystko

Zasilacz mam 12 więc nie kupowałem nowego , następnie mam 2 regulatory napięcia , pierwszy regulator jest ustawiony na 7.30v do zasilania płytki Arduino ( płytka ma zasilnie od( 7v-12v ) natomiast 2 regulator napięcia jest ustawiony na 6v tyle ile potrzebuje serwo .  Pompka steruje za pomocą modułu przekaźnikowego z możliwością ustawienia czasu który jest zasilany 12v więc bezpośrednio z zasilacza natomiast cewka przekaźnika jest ustawiona na 6v więc serwomechanizm i pompka jest na 6v. 

Wspólny gnd z Arduino są podłączone przyciski oraz podpięte pod szczególne wejścia (A0,A1 itd...) a sygnałem (Pin 13) wyzwala moduł czasowy który później uruchamia pompkę na ustalony czas 😉

 

Zdjęcie poglądowe całość zamierzam jeszcze pomalować w jednym kolorze. 

IMG20241026000439.jpg

Jak podłączyć to masz na zdjęciu...:)  Co do części elektrycznej czy mechanicznej to nie mam pojęcia. 

Za tą kabelkologię to Nalewaka odpal na 30000 delajow

17301153796597063675856825209624.jpg

1730115491716767968274036212212.jpg

Jak masz  na i2c to lepiej. 

Jak taki jak ja to zajrzyj na kurs arduino uno 1 Wyświetlacz 2x16. 

Pamiętaj aby piny na arduino0 i 1    TX , RX lepiej nie podpinać do niczego. Ponieważ mogą nastąpić problemy przy próbie programowania.

1730397112623628550467979110778.thumb.jpg.1f80cf9de3cdfac41eae1f9941400b1d.jpg

Liczy nalane na osobę. Niestety ten stary laptop ma problemy z nowym internetem... jak zdążę to wyślę z nowego. Tak na marginesie to  podczas pracy serwa wyświetlacz nieco szaleje. Bateria nie wyrabia, 

17303969903588448852031866492083.jpg

#include <Servo.h>          // biblioteka dla silnika serwo
#include <LiquidCrystal.h>  // biblioteka wyswietlacza
LiquidCrystal lcd (7, 6, 5, 4, 3, 2);   // jak podlaczony jest wyswietlacz
Servo serwomechanizm;
 bool tPelny[7];            // warunek czy kieliszek zostal napelniony
 int  tOsoby[7];            // tablica dla kazdej osoby od 0 do 6 - takie sa tablice w c, ilosc na osobe
 const int tPozycja[7] {0, 10, 44, 78, 112, 146, 180};   // pozycja dla serwa
 long sumaZimprezy = 0;     // ile w sumie na imprezie bylo nalanych
 
void setup() {
 pinMode(13, OUTPUT);                  // przekaznik
 pinMode(A0, INPUT_PULLUP);    pinMode(A1, INPUT_PULLUP);    pinMode(A2, INPUT_PULLUP);
 pinMode(A3, INPUT_PULLUP);    pinMode(A4, INPUT_PULLUP);    pinMode(A5, INPUT_PULLUP);
 serwomechanizm.attach(12);     serwomechanizm.write(0);
 lcd.begin(12,2);     
                      lcd.print("Napijemy sie ?"); delay(3000);
 lcd.setCursor(0,1);  lcd.print("Postaw kielich !");
}

void loop() {
  fCzujniki();           // funkcja ktora sprawdza stan czujnikow

}

void fCzujniki() {
  if (digitalRead(A0) == LOW) {delay(100); if (digitalRead(A0) == 0) {
    fUstawNalej(1);}  } else {tPelny[1] = false;}
  if (digitalRead(A1) == LOW) {delay(100); if (digitalRead(A1) == 0) {
    fUstawNalej(2);}  } else {tPelny[2] = false;}
  if (digitalRead(A2) == LOW) {delay(100); if (digitalRead(A2) == 0) {
    fUstawNalej(3);}  } else {tPelny[3] = false;}  
  if (digitalRead(A3) == LOW) {delay(100); if (digitalRead(A3) == 0) {
    fUstawNalej(4);}  } else {tPelny[4] = false;}
  if (digitalRead(A4) == LOW) {delay(100); if (digitalRead(A4) == 0) {
    fUstawNalej(5);}  } else {tPelny[5] = false;}
  if (digitalRead(A5) == LOW) {delay(100); if (digitalRead(A5) == 0) {
    fUstawNalej(6);}  } else {tPelny[6] = false;}   // sprawdzanie dwa razy aby wyeliminowac drgania stykow
    delay(1000); serwomechanizm.write(tPozycja[0]); // wracaj do pozycji poczatkowej
  
}

void fUstawNalej(int poz)    // sprawdz czy kieliszek pusty, jesli tak to nalewaj, zaznacz jako pelny
 {
  if (tPelny[poz] == false) {++ tOsoby[poz]; fWyswietlacz(poz);
                             delay(110); serwomechanizm.write(tPozycja[poz]);delay(2000); digitalWrite(13, HIGH);
                             delay(3000); digitalWrite(13, LOW); tPelny[poz] = true;
                             
  }
 }
void fWyswietlacz(int poz)
 {
 // char numer; numer = tOsoby[poz];
  lcd.clear();
  lcd.setCursor(0,0);  lcd.print("Nalewam do -");
  lcd.setCursor(14,0); lcd.print(poz);
  lcd.setCursor(0,1);  lcd.print("To nalanie -");
  lcd.setCursor(14,1); lcd.print(tOsoby[poz]);

}

Oczywiście to nie jest skończony kod, więc należy czekać na dalszy rozwój akcji.

 

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