• 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
płynne zwijanie filamentu
#1
            Cześć siedzę sobie nad projektem redusera filamentu z 3mm na 1,75mm wiem ze jest troche tematow w internecie i pewnie jakbym się wgryzł to bym znalazł kod który mógłbym zaadoptować po paru zmianach ale chciałbym to z małą pomocą zrobić sam, w tym momencie jak zrobić żeby silnik krokowy kręcił się cały czas z prędkością X a nie skokowo co pomiar z fotorezystorów.

Jest 7 fotorezystorów dwa po dwa brzeżne są połączone w pary więc ich odczyty są wyższe.

Kod :
Kod:
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;

int readPin0 = A0;
int readPin1 = A1;
int readPin2 = A2;
int readPin3 = A3;
int readPin4 = A4;
int pomiar;
int min_0 = 0;
int max_0;
int min_1 = 0;
int max_1;
int min_2 = 0;
int max_2;
int min_3 = 0;
int max_3;
int min_4 = 0;
int max_4;
int kroki = 2000;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
// Declare pins as Outputs
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);

}

void loop() {

pomiar = analogRead(readPin0);
if(pomiar>max_0){
  max_0=pomiar;
  }
while(min_0==0){
  min_0=pomiar;
  }
if(pomiar<min_0){
  min_0=pomiar;
  }
Serial.print("Sensory 1-2 : ");
Serial.print(pomiar);
Serial.print(" MIN : ");
Serial.print(min_0);
Serial.print(" MAX : ");
Serial.println(max_0);
if((pomiar-min_0)<30){
  kroki=kroki-20;
  }
//delay();

pomiar = analogRead(readPin1);
if(pomiar>max_1){
  max_1=pomiar;
  }
while(min_1==0){
  min_1=pomiar;
  }
if(pomiar<min_1){
  min_1=pomiar;
  }
Serial.print("Sensory   3 : ");
Serial.print(pomiar);
Serial.print(" MIN : ");
Serial.print(min_1);
Serial.print(" MAX : ");
Serial.println(max_1);
if((pomiar-min_1)<30){
  kroki=kroki-10;
}
//delay();

pomiar = analogRead(readPin2);
if(pomiar>max_2){
  max_2=pomiar;
  }
while(min_2==0){
  min_2=pomiar;
  }
if(pomiar<min_2){
  min_2=pomiar;
  }
Serial.print("Sensory   4 : ");
Serial.print(pomiar);
Serial.print(" MIN : ");
Serial.print(min_2);
Serial.print(" MAX : ");
Serial.println(max_2);
//delay();

pomiar = analogRead(readPin3);
if(pomiar>max_3){
  max_3=pomiar;
  }
while(min_3==0){
  min_3=pomiar;
  }
if(pomiar<min_3){
  min_3=pomiar;
  }
Serial.print("Sensory   5 : ");
Serial.print(pomiar);
Serial.print(" MIN : ");
Serial.print(min_3);
Serial.print(" MAX : ");
Serial.println(max_3);
if((pomiar-min_3)<30){
  kroki=kroki+10;
}
//delay();

pomiar = analogRead(readPin4);
if(pomiar>max_4){
  max_4=pomiar;
  }
while(min_4==0){
  min_4=pomiar;
  }
if(pomiar<min_4){
  min_4=pomiar;
  }
Serial.print("Sensory 6-7 : ");
Serial.print(pomiar);
Serial.print(" MIN : ");
Serial.print(min_4);
Serial.print(" MAX : ");
Serial.println(max_4);
if((pomiar-min_4)<30){
  kroki=kroki+20;
}
//delay();

{
  // Set motor direction clockwise
  digitalWrite(dirPin, HIGH);

  // Spin motor slowly
  for(int x = 0; x < stepsPerRevolution; x++)
  {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(kroki);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(kroki);
  }

}
Serial.print("predkosc : ");
Serial.println(kroki);
}
 odczyty z serial portu wygladają tak:

[Obrazek: Thumbnail.aspx?e=d2oO-lW5ywLG2A301hIZ6Jm...dom2o&pv=2]
a układ :
[Obrazek: Thumbnail.aspx?e=6sxsBKyfO5rsmP-vbp4JtcX...C2mu4&pv=2]


Załączone pliki Miniatury
   
 
Odpowiedź
#2
Zastanów się jak napisać program używając millis() tak by robić wymagane rzeczy tak często jak to jest wymagane, ale nie częściej.
Pętla loop może się wykonywać miliony razy na sekundę, potrzebujesz tyle razy coś wydrukować na serial? Zdążysz to przeczytać?
Tak samo pomiar czegokolwiek, jest sens robić to co 1us jeśli w tym czasie filament przesunie się o 10nm?
Do obsługi silnika krokowego można użyć biblioteki, np. accelstepper.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(01-11-2020, 03:46)kaczakat napisał(a): Zastanów się jak napisać program używając millis() tak by robić wymagane rzeczy tak często jak to jest wymagane, ale nie częściej.
Pętla loop może się wykonywać miliony razy na sekundę, potrzebujesz tyle razy coś wydrukować na serial? Zdążysz to przeczytać?
Tak samo pomiar czegokolwiek, jest sens robić to co 1us jeśli w tym czasie filament przesunie się o 10nm?
Do obsługi silnika krokowego można użyć biblioteki, np. accelstepper.
Właśnie o taką pomoc mniej może więcej mi chodzi, sam także zauważam problem przy zmianie prędkości silnika poprzez zwykłe wahanie odczytów z diod który wynosi parę punktów i wprowadza zakłócenia przy zmianie prędkości Wink

W tej bibliotece znajdę odpowiedz jak jednocześnie zachować płynność zwijania przy jednoczesnym odczycie z fotorezystorów ? zakładam że tak będę wklejał kod w trakcie powstawania z zapytaniami bardziej szczegółowymi Wink
 
Odpowiedź
#4
Bez zmiany myślenia, że program jest zbiorem instrukcji wykonywanych jedna po drugiej (lub nie) z lub bez pauz w postaci delay() nie zrobisz kroku dalej.
Musisz do tego dodać stałe odmierzanie czasu jako jedną ze składowych programu i również w oparciu o to odmierzanie wykonywać lub nie jakieś czynności. Niektóre czynności trzeba wykonać w każdym obiegu loop, niektóre co 10, 20, 50, 100, 500, 1000, itd, ms.
Loop() od początku do końca powinien trwać tak krótko jak to możliwe, przy takim zabawkowym zastosowaniu jak w Arduino usekundy to super, kilkanaście ms jest wg mnie OK, czasami z wykorzystaniem gotowych funkcji wręcz nie do przeskoczenia. Ale dokładanie do tego jeszcze jakiś delay po 50ms, czy sekund, to już zaczyna być mocno kulawo.
Umiesz migać led z delay, naucz się bez, z przyciskiem, z wieloma led.
Ten problem pojawia się za każdym razem, gdy ktoś liźnie jakiś kurs dla początkujących i próbuje zrobić program użytkowy. Ciężko pisać tutorial każdemu, kto tu się pochwali swoim pierwszym większym programem.
Poczytaj forum, wrzucałem wiele przykładów jak to robić z millis - poszukaj funkcja czas(). Warto też wrócić do kursu C/C++/Arduino i sprawdzić, czy na pewno go skończyłeś.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości