Skocz do zawartości

Programowanie serwomechanizmu do poszczególnych przycisków


Pomocna odpowiedź

(edytowany)
#include <Servo.h>

Servo myServo;             // tworzenie obiektu dla serwa
const int buttonPin1 = 0;  //pin przycisk 1
const int buttonPin2 = 2;  //pin przycisk 2
const int buttonPin3 = 3;  //pin przycisk 3
const int buttonPin4 = 4;  //pin przycisk 4
const int buttonPin5 = 5;  //pin przycisk5
const int pumpPin = 8;     //pin pompka-przekaznik
const int servoPin = 9;    //pin serwo
const int startBut = 11; //pin przycisku startu
const int moovePos[5] = {36, 72, 108, 144, 180}; //pozycje pojemników
const int butPins[5] = {7, 2, 3, 4, 6}; //tablica przypisania pinów
int posToFillUp[5] = {1, 1, 1, 1, 1}; //początkowy stan przycisków
int contCtr = 0;  //kontrolka ustawienia pojemników, 0 gdy nie ma żadnego pojemnika
bool beginFillUp = false; //kontrolka rozpoczęcia napełniania

void setup() {
  //ustawienie stanu przycisków
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);
  pinMode(buttonPin5, INPUT_PULLUP);
  pinMode(startBut, INPUT_PULLUP);
  pinMode(pumpPin, OUTPUT);

  myServo.attach(servoPin);
  moove(0); //ustawienie serwo w pozycji startowej
  Serial.begin(9600);
  Serial.println("\nNapełniacz gotowy do pracy.");
}

void loop() {
  
  bool start = false; //kontrolka przycisku rozpoczęcia cyklu napełniania
  contCtr = 0;
  int posToFillUp[5];
  Serial.println("\nNaciśnij start by rozpocząć napełnianie");
  //ustawienie początkowego stanu przycisków
  for (int i=0; i<5; i++) {
    posToFillUp[i] =1;
  }
  while (digitalRead(startBut) == HIGH) {
    delay(20);
  }
  //odczytanie stanu przycisków
  for (int i=0; i < 5; i++) {
    int value = digitalRead(butPins[i]);  // odczytaj stany przycisków
    posToFillUp[i] = value;
    if (value == 0) {
      contCtr = contCtr + 1;
    }
  }
  //sprawdzenie czy ustawiono pojemniki
  if (contCtr == 0) {
    Serial.print("Brak pojemników.");
    Serial.print("Ustaw pojemniki\n");
    delay(1000);
  }
  else {
    Serial.println("Rozpoczynam napełnianie");
    beginFillUp = true;
  }
  //rozpoczęcie napełniania
  while (beginFillUp) {
    for ( int i=0; i<5; i++) {
      if (posToFillUp[i] == LOW) {
        Serial.print("pojemnik ");
        Serial.print(i+1);
        Serial.print("\t");
        moove(moovePos[i]);
        posToFillUp[i] = HIGH;
      }
    }
    Serial.println("\nNapełnianie zakończone");
    moove(0);
    beginFillUp = false;
  }
}

void moove(int position) {  //obracanie serwo mechanizmu
  delay(1000);
  myServo.write(position);
  delay(1000);
  digitalWrite(8, HIGH);
  delay(1000);
  digitalWrite(8, LOW);
  delay(1000);
}

To moja propozycja.

Idea jest taka:

1. Założyłem, że będzie pozycja startowa oraz 5 pozycji napełniania równomiernie rozmieszczonych. Pozycje poszczególnych stanowisk zapisałem w tablicy moovePos.

2. Na każdym stanowisku z wyjątkiem startowego umieszczony jest czujnik - przycisk. Piny d, do których podłączone są czujniki zapisałem w tablicy butPins

Algorytm działania:

Powiadomienie o gotowości do działania;
Sprawdzenie czy użytkownik potwierdził rozpoczęcie napełniania;
Rozpoczęcie napełniania obejmujące
- sprawdzenie na których pozycjach znajdują się pojemniki i zapisanie stanu w tablicy posToFillUp
- przemieszczenie serwa do pozycji, na których są pojemniki i napełnienie pojemnika (funkcja moove()
- powrót do pozycji startowej po napełnieniu ostatniego pojemnika
Zapytanie użytkownika czy chce powtórzyć operację

Do tego dołączyłem kilka komunikatów.

W tej chwili program obsługuje 5 pozycja oraz pozycję startową. Zmiana ilości przycisków wymaga wprowadzenia zmian w tablicach i funkcjach for, które można jeszcze zautomatyzować. Nie chodziło mi o doktoryzowanie się, tylko o pokazanie propozycji rozwiązania.

Edytowano przez Sylba
  • Lubię! 1

Tablice to podstawa, ja jednak się uczę narzecza arduino. Myślałem również jakiego typu czujników użyć. Idealnie by było gdyby sam czujnik pokazywał czy naczynie stoi, czy jest puste czy pełne. No i najlepiej tanio.

@Santiago kod jest ekstra , natomiast nie wiem czy to kwestia przycisków, ale u mnie jest tak ze jak wcisnę przycisk i puszczę to serwo wykonuje ruch , natomiast jak wcisnę przycisk i go trzymam to komendy nie są wykonywane do czasu az nie puszczę przycisku .. wiec działa troszkę odwrotnie , bo jesli postawie kieliszki na przyciski to nic sie nie stanie musze zabrac wtedy dopiero zaczyna kod dzialac

(edytowany)
1 godzinę temu, Santiago napisał:

Idealnie by było gdyby sam czujnik pokazywał czy naczynie stoi, czy jest puste czy pełne. No i najlepiej tanio.

Czujnik tensometryczny (na przykład taki) przyklejony do odpowiednio cienkiej blaszki, będącej podstawką pod kieliszek, powinien spełnić to zadanie.

Oczywiście do tego czujnika jest potrzebny jeszcze wzmacniacz.

Edytowano przez jand
8 godzin temu, AlanB napisał:

u mnie jest tak ze jak wcisnę przycisk i puszczę to serwo wykonuje ruch , natomiast jak wcisnę przycisk i go trzymam to komendy nie są wykonywane do czasu az nie puszczę przycisku

To kwestia kodu. Jeśli kod wstrzymuje działanie gdy przycisk wciśnięty, to szukałbym problemu w funkcji while().

 

8 godzin temu, Santiago napisał:

Myślałem również jakiego typu czujników użyć.

Może takiego modułu dotyku?

Tak próbuję i główkuje się jak troszkę zmienić ten kod od @Santiago bo działa super , ale posiadam przyciski (mikroprzełącznik ) i gdy na tym kodzie postawię na nim kieliszek to nie jest wykonywana komenda , czy w tym kodzie jest możliwość aby zmienić zamiast chwilowego przyciskania tak aby  podczas trzymania komenda została wykonywana ?   ( zdjęcie poglądowe przycisku jaki mam)

mikroprzelacznik-kw11-msw-11db1-3a-250v-bez-dzwigni.jpg

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