• 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
sorter kolorów w trybie ciągłym
#1
Dzień dobry,
zbudowałem stół obrotowy sortujący 3 kolory, ale chciałbym udoskonalić jego pracę, a mianowicie obecny kod wygląda jak poniżej i działa tak:
po naciśnięciu przycisku stół obraca się do momentu stanu wysokiego z czujnika halla, później obraca się o 320 kroków,
łapa manipulatora opuszcza się, szczęka zamyka, podnosi element do czujnika kolorów, odczyt i odłożenie elementu na stół. Później stół obraca się o odpowiednią ilość kroków (odpowiadającej odczytanemu kolorowi) i element jest ściągany przez serwo. Na koniec stół wraca do pozycji 0.

Moje pytanie brzmi co można zrobić żeby zrobić żeby urządzenie działało w trybie ciągłym tzn.:
początek z przyciskiem i czujnikiem halla bez zmian, ale później stół miałby się obracać cały czas o 320 kroków, w odpowiednim momencie odczytywać kolor i zapamiętywać odczyt aż do momentu gdy element znajdzie się na odpowiedniej stacji .

Kod:
#include <AccelStepper.h> //biblioteka silnika krokowego

#include <Bounce2.h>// biblioteka obslugi przycisku start

#include <Servo.h> // biblioteka serwomechanizmów



#define BUTTON_PIN 12 //ustalenie pinu guzika

#define LED_PIN 13 //ustalenie diody kontrolnej

#define S0 48 // piny czujnika kolorów

#define S1 49 // piny czujnika kolorów

#define S2 50 // piny czujnika kolorów

#define S3 51 // piny czujnika kolorów

#define sensorOut 52 // piny czujnika kolorów



int ledState = LOW;// ustalenie stanu diody na starcie

Bounce debouncer = Bounce();

const int hallSensorPin = 46;// ustalenie pinu czujnika halla

int hallState = LOW; // ustalenie stanu czujnika halla

Servo Ramie; //serwo manipulatora

Servo Szczeka; //serwo manipulatora

Servo Czerwone; // serwo do ściągania obiektu ze stolu

Servo Zielone; // serwo do ściągania obiektu ze stolu

Servo Niebieskie; // serwo do ściągania obiektu ze stolu

int posRamie = 0; // pozycja startowa serwa (wstępna)

int posSzczeka = 0; // pozycja startowa serwa (wstępna)

int posCzerwone =0; // pozycja startowa serwa (wstępna)

int posZielone = 0; // pozycja startowa serwa (wstępna)

int posNiebieskie = 0; // pozycja startowa serwa (wstępna)

int frequency = 0;  //częstotliwosc czujnika koloru

int color = 0;



AccelStepper stepper1(1, 2, 3); // ustalenie pinow silnika krokowego



void setup(){

 Serial.begin(9600);
 
 debouncer.attach(BUTTON_PIN, INPUT_PULLUP); // Attach the debouncer to a pin with INPUT_PULLUP mode

 debouncer.interval(25); // Use a debounce interval of 25 milliseconds

 pinMode(LED_PIN, OUTPUT); //

 digitalWrite(LED_PIN, ledState);

 digitalWrite(hallSensorPin,hallState);



 

 Ramie.attach(4); //piny PWN serwomechanizmów na plytce
 Ramie.write(70);
 Szczeka.attach(5); //piny PWN serwomechanizmów na plytce
 Szczeka.write(120);
 Czerwone.attach(6); //piny PWN serwomechanizmów na plytce
 Czerwone.write(0);
 Zielone.attach(7); //piny PWN serwomechanizmów na plytce
 Zielone.write(0);
 Niebieskie.attach(8); //piny PWN serwomechanizmów na plytce
 Niebieskie.write(0);
 stepper1.setMaxSpeed(200.0); // parametry ruchu silnika krokowego ze słownika biblioteki AccelStepper

 stepper1.setAcceleration(100.0); // parametry ruchu silnika krokowego ze słownika biblioteki AccelStepper

 pinMode(S0, OUTPUT); //ustawienie pinów czujnika kolorów jako wyjscie

 pinMode(S1, OUTPUT); //ustawienie pinów czujnika kolorów jako wyjscie

 pinMode(S2, OUTPUT); //ustawienie pinów czujnika kolorów jako wyjscie

 pinMode(S3, OUTPUT); //ustawienie pinów czujnika kolorów jako wyjscie

 pinMode(sensorOut, INPUT); //ustawienie pinów czujnika kolorów jako wejscie

 digitalWrite(S0, LOW); // tutaj do konca nie wiem co sie dzieje, ustawienie tych low/high ma wplyw na wartosci odczytywanych danych (roznica o rzad wielkosci)

 digitalWrite(S1, HIGH); // tutaj do konca nie wiem co sie dzieje, ustawienie tych low/high ma wplyw na wartosci odczytywanych danych (roznica o rzad wielkosci)
}

//void servoStart(){
 //posRamie=60;{
 //Ramie.write(posRamie);}
//}





void loop() {  

 debouncer.update(); // Update the Bounce instance



if ( debouncer.fell() ) {

   ledState = !ledState;

   digitalWrite(LED_PIN, ledState);

 }



 if (ledState != 0) {

     szukaj();

     delay(1000);  

 

     ruch();

     delay(1000);

     opusc();

     delay(1000);

     zamknij();

     delay(1000);

     podnies();

     delay(1000);

     color = readColor();

     delay(10);

     switch (color) {

       case 1:

         opusc();

         delay(1000);

         otworz();

         delay(1000);

         podnies();

         delay(1000);

         stepper1.runToNewPosition(640);

         delay(1000);
         
         Czerwone.write(180);
         delay(1000);
         Czerwone.write(0);
         delay(1000);

       break;

       case 2:

         opusc();

         delay(1000);

         otworz();

         delay(1000);

         podnies();

         delay(1000);

         stepper1.runToNewPosition(960);

         delay(1000);
         Zielone.write(180);
         delay(1000);
         Zielone.write(0);
         delay(1000);
         break;

       case 3:

         opusc();

         delay(1000);

         otworz();

         delay(1000);

         podnies();

         delay(1000);

         stepper1.runToNewPosition(1280);

         delay(1000);

         Niebieskie.write(180);
         delay(1000);
         Niebieskie.write(0);
         delay(1000);
         break;

         case 0:

         break;

       }

     

       color = 0;

       delay(1000);

       stepper1.runToNewPosition(0);

       delay(1000);

 }

}



void szukaj()

{

 stepper1.setMaxSpeed(200); // parametry ruchu silnika krokowego

 stepper1.moveTo (10000);

 stepper1.setSpeed(200);



 while (digitalRead(hallSensorPin) != 0)

 {

   stepper1.runSpeed();

 }



 stepper1.setCurrentPosition(0);

 stepper1.stop();

}



void ruch() {//pierwszy ruch silnkika w petli(docelowo po wstawieniu sie w pozycji zero)

 stepper1.runToNewPosition(320);

}

void opusc() {//ruch odpowiadajacy za opuszczenie ramienia manipulatora

 for (posRamie = 70; posRamie >= 12; posRamie -= 1) {

   Ramie.write(posRamie);

   delay(15);

 }

}

void otworz() {//ruch odpowiadajacy za otwarcie szczek manipulatora

 for (posSzczeka = 150; posSzczeka >= 120; posSzczeka -= 1) {

   Szczeka.write(posSzczeka);

   delay(5);

 }

}

void podnies() {//ruch odpowiadajacy za podniesienie ramienia manipulatora

 for (posRamie = 12; posRamie <= 70; posRamie += 1) {

   Ramie.write(posRamie);

   delay(15);

 }

}

void zamknij() {//ruch odpowiadajacy za zamknie szczek manipulatora

 for (posSzczeka = 120; posSzczeka <= 150; posSzczeka += 1) {

   Szczeka.write(posSzczeka);

   delay(5);

 }

}



int readColor() {

 // Setting red filtered photodiodes to be read

 digitalWrite(S2, LOW);

 digitalWrite(S3, LOW);

 // Reading the output frequency

 frequency = pulseIn(sensorOut, LOW);

 int R = frequency;

 // Printing the value on the serial monitor

 Serial.print("R= ");//printing name

 Serial.print(frequency);//printing RED color frequency

 Serial.print("  ");

 delay(50);

 // Setting Green filtered photodiodes to be read

 digitalWrite(S2, HIGH);

 digitalWrite(S3, HIGH);

 // Reading the output frequency

 frequency = pulseIn(sensorOut, LOW);

 int G = frequency;

 // Printing the value on the serial monitor

 Serial.print("G= ");//printing name

 Serial.print(frequency);//printing RED color frequency

 Serial.print("  ");

 delay(50);

 // Setting Blue filtered photodiodes to be read

 digitalWrite(S2, LOW);

 digitalWrite(S3, HIGH);

 // Reading the output frequency

 frequency = pulseIn(sensorOut, LOW);

 int B = frequency;

 // Printing the value on the serial monitor

 Serial.print("B= ");//printing name

 Serial.print(frequency);//printing RED color frequency

 Serial.println("  ");

 delay(50);

 if (R<G && R<B) {

   color = 1; // Red

 }

 if (G<R && G<B) {

  color = 2; // Green

 }

 if (B<G && B<R) {

   color = 3; // Blue

 }

 return color;

}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości