• 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
Arduino jako DTG sterownik
#1
Chciał bym rozpocząć temat DTG i Adruino

W sieci można znaleść wiele programów poświęconych temu zagadnieniu.

Sam przerobiłem drukarkę Epson R1500W na tego rodzaju urządzenie.
Jednak konstrukcja zbudowana z płyt MDF i na bazie napędu drukarki jest nie do końca projektem który budzi zachwyt.
Dla tego postanowiłem poprwaić ten projekt o sterowany silnikiem krokowym napęd stołu.


Chciał bym prosić elektroników - programistów o pomoc w skompilowaniu codu do arduino w oparciu o materiały które posiadam.
Mam dwa kody do arduino :

1. Arduino sterowane sygnałem z enkodera optycznego porusza silnikiem 1:1
2. Arduino sterowane 2 przyciskami przesunie stół w pozycje load i zatrzyma -end stop switch oraz eject i też stop end switch.

Oba kody działaja poprawnie ale niestety nie mam pojęcia jak je połączyć w jeden działający.

Więcej informacji na prv.
 
Odpowiedź
#2
Pokaż jakie błędy miałeś.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#3
Arduino:1.6.9 (Windows 7), Płytka:"Arduino/Genuino Uno"

Silnik Nema + driver
Sygnały Input z dekodera
PIN 2 Direction
PIN 3 Steep
Next Input
PIN 4  Load
Pin 5 End stop
PIN 6 Eject
Pin 7 End Stop

Output
PIN 8 - motor DIR
PIN 9 - motor Steep
 
Odpowiedź
#4
podaj kod połączony (chyba ze to ten co wysłałeś mi na pw) po błędach wynika ze masz powielone te same porty ale dokładnie odp jak kod zobaczę.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#5
(09-07-2016, 23:32)adix napisał(a): podaj kod połączony (chyba ze to ten co wysłałeś mi na pw) po błędach wynika ze masz powielone te same porty ale dokładnie odp jak kod zobaczę.

Po moim połączeniu kompilacja sie udaje ale kod działa tylko na eject i stop. Reszta niestety nie.
Nie mam pojęcia co jest nie tak.
Jestem ciągle na etapie czytania książki o Arduino ale niestety nie za wiele udaje mi się zrozumieć.
Więc z tąd moja prośba.
Czy ktoś może wytłumaczyć mi jak połączyć te dwa kody w jeden działający.
Założenia programu to:
Sterowanie silnikiem poprzez wyjście 8-Dir i 9-Steep 2 kierunki
Load-end stop  4-7
Eject-end stop  5-6

do tego włączenie silnika pin 2-3
z enkodera optycznego A i B w 2 kierunkach

Może to zabrzmi skomplikowanie ale nie wiem jak to prościej wytłumaczyć.

Mamy dekorer optyczny który ma 4 wyjścia A / B / +5V / GND
Code : pierwszy
schemat podłączenia arduino :
[Obrazek: index.php?action=dlattach;topic=234667.0;attach=80469]
Do tego
po przyciśnięciu pin 4 silnik obraca się w jedną stronę aż do end stop który zatrzymuje go sygnałem na pin 7
i odwrotnie pin 5 aż do end stop sw. na pin 6

Oba programy działaja jak juz wspomniałem ale osobno .
Więc chciał bym sie dowiedzieć jak połączyć dwa w jeden.
 
Odpowiedź
#6
Kod:
#define encoder_a 2 //keep this on and interrupt pin
#define encoder_b 3 //keep this on and interrupt pin
#define motor_step 9 //can be any pin
#define motor_direction 8 //can be any pin

volatile long motor_position, encoder;
long encoder_time, encoder_diff; //Meritev časa med impulzi enkoderja
byte inputA;
byte inputB;
void setup() {
//set up the various outputs
pinMode(motor_step, OUTPUT);
pinMode(motor_direction, OUTPUT);
  // then the encoder inputs
pinMode(encoder_a, INPUT);
pinMode(encoder_b, INPUT);
  // enable pullup as we are using an open collector encoder
digitalWrite(encoder_a, HIGH);
digitalWrite(encoder_b, HIGH);
  // encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, encoderPinChangeA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, encoderPinChangeB, CHANGE);
encoder = 0; //reseet the encoder position to 0
}

void loop() {
// put your main code here, to run repeatedly:
if ((encoder_diff / 2 + encoder_time <  micros()) || ( encoder_time + 10 <  micros())) {//Šele ko je 1/2 časa impulza preteklo, vrni step pin na nulo, oziroma po 100 mikrosekundah!
if ((encoder > 0) ) {
digitalWrite(motor_step, LOW);
PORTD = PORTD & 0b11101111;
delayMicroseconds(200); //_delay_us(200); //modify to alter speed
motor_position++;
encoder --; //encoder--;
}
else if ((encoder < 0) ) {
digitalWrite (motor_step, LOW);
PORTD = PORTD & 0b11101111;
delayMicroseconds(200); //_delay_us(200); //modify to alter speed
motor_position--;
encoder ++; //encoder++;
  }
}
}
void encoderPinChangeA() {
inputA = (PIND & 0b00000100) >>2; // result is 0b00000001 if input is high, 0b00000000 if input is low.
inputB = (PIND & 0b00001000) >>3; //result is 0b00000001 if input is high, 0b00000000 if input is low.
//if (digitalRead(encoder_a)==digitalRead(encoder_b)) {
if (inputA == inputB){
encoder--;
PORTD = PORTD | 0b00100000;//digitalWrite(motor_direction, HIGH);// move stepper in reverse
}
else{
encoder++;
PORTD = PORTD & 0b11011111;//digitalWrite (motor_direction, LOW); //move stepper forward
}
PORTD = PORTD | 0b00010000;//digitalWrite(motor_step, HIGH);
encoder_diff=micros()-encoder_time;//Izračun diference med impulzi časa enkoderja
encoder_time=micros();//Shrani zadnjo vrednost
}
  void encoderPinChangeB() {
inputA = (PIND & 0b00000100) >>2; // result is 0b00000001 if input is high, 0b00000000 if input is low.
inputB = (PIND & 0b00001000) >>3; // result is 0b00000001 if input is high, 0b00000000 if input is low.
//if (digitalRead(encoder_a) != digitalRead(encoder_b)) {
if (inputA != inputB){
encoder--;
PORTD = PORTD | 0b00100000;//digitalWrite(motor_direction, HIGH);// move stepper in reverse
}
else {
encoder++;
PORTD = PORTD & 0b11011111;//digitalWrite (motor_direction, LOW); //move stepper forward
}
PORTD = PORTD | 0b00010000;//digitalWrite(motor_step, HIGH);
encoder_diff=micros() - encoder_time;//Izračun diference med impulzi časa enkoderja
encoder_time=micros();//Shrani zadnjo vrednost
}
sprawdź to i opisz co się dzieje (to tylko testowo próbuje kod zrozumieć)
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#7
(10-07-2016, 23:28)adix napisał(a): Niestety nic nie działa.
Jak pisałem na początku to oba kody działają.
pierwszy został napisany żeby sterować accuratorem i przesuwać stół w 2 kierunkach.
Drugi kod
Dotyczy odebrania sygnału na PIN-ach 2-3 do steep motora DIR i STEEP
i działa równiez w dwóch kierunkach.
Sprawa dotyczy połączenia tych 2 kodów w jeden
Twoja wersja codu encodera niestety nie działa.
Wgrywa sie OK ale później nic.
Obrazek powyżej przedstawia podłączenie do Arduino enkodera opto. I steruje silnikiem
Nie wiem czy nie jest problemem że sygnały z wejść 2-3 są równiez wykożystywane do programu który syteruje tylko stołem.

Dzięki za zainteresowanie czekam na inne pomysły.

Czytam wszystko co mi wpadnie w ręce ale i tak jeszcze nie wiem nic jak widze w temacie. A łączenie na zasadzie prób i błędów mija się z celem. Dlatego zwróciłem się z prośbą do innych , mam nadzieje że coś z tego będzie....


Dla zobrazowania możesz zobaczyć film który przedstawia założenie programu.

http://youfacebookclip.com/watch?v=igqlC1Ebc4s
 
Odpowiedź
#8
(10-07-2016, 23:28)adix napisał(a): Sorki nie działa.
W kodzie który ci wysłałem skasuj linię
#include <delay.h>

I wszystko działa OK
Teraz myślę jak dopisać następne komendy do tego kodu. Do sterowania silnikiem i stołem.
 
Odpowiedź
#9
Niestety nie jest wiele osób które postanowiły podjąć wyzwanie.
Problem rozwiązałem przy pomocy znajomych więc uważam temat za wyczerpany.
Pozdrawiam wszystkich.
 
Odpowiedź
#10
Założenia kontroli :

Pin 2 i 3 sygnał z dekodera..........

Reszta :

int inBtn = 4; // Momentary push button to send the Platen to the Back / Home position
int outBtn = 5; // Momentary push button to eject the platen to the front position
int passBtn = 6; // Automatic 2 pass Rocker style switch

int motorEnable = 7; // Not used yet: Some motor drivers require a HIGH signal to enable.
int motorDirection = 8; // Wire to motor driver direction pin
int motorStep = 9; // Wire to motor driver Step / Pulse pin

int backStop = 11; // Back or Home position
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości