04-02-2019, 15:42
(Ten post był ostatnio modyfikowany: 04-02-2019, 21:13 przez CEO.
Powód edycji: Prosimy używać znaczników [code]!
)
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 .
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;
}