Kako iskoristiti stari tintni pisač

Kako iskoristiti stari tintni pisač

Prvo ga treba raskopati :)

Ja imam jednog doniranog već raskopanog do te mjere da je sve bilo spremno za spajanje.

Prvo na pisaču moramo pronaći pinove od encodera koji će nam biti potrebni da bi znali gdje se glava odnosno u mom slučaju samo nosač glave nalazi. U ovo koraku bi nam dobro došao neki bilo kakav osciloskop i naravno multimetar.

U mom konkretnom slučaju našao sam mjesto gdje bi stajao enkoder2.

Provjerio sam na tim mjestima gdje je masa, predpostavio gdje je napajanje i uzeo da su srednje dvije Enc1 i Enc2 signali.

I dobro sam pogodio :)

DSCF1895 DSCF1896

 

 

Stavio sam da je kablić kojim je to sve spojeno dugačak jednako kao i kabl od glave pisača.

 

DSCF1894

 

 

Nakon toga sam spojio Napon na 5V od arduina masu na arduino masu

Enc1 na pin2 od arduina

Enc2 na pin3 od arduina

Motor na driver motora, za sada ćemo koristiti kupljeni driver motora, dok ne napravimo svoj :)

Driver motora se spaja na Arduino, on ima tri pina kojima arduino upravlja.

Sa prvim pinom upravljamo brzinom motora, druga dva nam koriste da bi odredili smijer motora.

DSCF1897

 

Nakon spajanja treba napisati i neki jednostavan kod koji će sve to pogoniti pa evo i koda …

/*
Arduino ink jet printer abuse
*/

#define EnkoderA 2                  //EnkoderA nam je spojen na pin 2
#define EnkoderB 3                  //EnkoderB nam je spojen na pin 3
#define Gas 9                      //Gas motora na pinu 9 
#define Ulaz1 4                    //Ulaz 1 motora na pinu 4 , sa ovim pinom cemo zajedno sa pinom 7 kontrolirati smijer
#define Ulaz2 7                    //Ulaz 2 motora na pinu 7

int trenutnaPozicija = 2000;       //nulta pozicija enkodera nije nula iz razloga da nam ne prelazi u negativnu vrijednost

void setup() {

    pinMode(EnkoderA, INPUT); //EnkoderA je ulaz
    digitalWrite(EnkoderA, HIGH); //pull up EncoderA
    pinMode(EnkoderB, INPUT); //EnkoderB je ulaz
    digitalWrite(EnkoderB, HIGH); //pull up EncoderB
    pinMode(Gas, OUTPUT); //Gas je izlaz
    analogWrite(Gas, 0); //Gas je 0 za pocetak (Speed PWM)
    pinMode(Ulaz1, OUTPUT); //Ulaz1 ce nam biti ulaz
    digitalWrite(Ulaz1, LOW); //Ulaz1 stavi na NISKO 
    pinMode(Ulaz2, OUTPUT); //Ulaz2 ce nam biti izlaz
    digitalWrite(Ulaz2, LOW); //Ulaz2 stavi na NISKO
    //Ako su Ulaz1 i Ulaz2 NISKO motor je iskljucen

    attachInterrupt(0, EnkoderOkidac, CHANGE); // Okidac koji se pokrece svaki puta kada se stanje na pinu 2 (interrupt 0)
                                               // promjeni iz NISKO u VISOKO ili obratno, znaci ako se desi promjena pokreni
                                               //funkciju pod nazivom EnkoderOkidac()

    // Otvori serijsku komunikaciju brzine 19200
    Serial.begin(19200);
   }
 void loop() // run over and over
{ 
while(trenutnaPozicija<3000)  {   idiDesno();  analogWrite(Gas,255);    } ugasiMotor(); Serial.print("Stigli smo na 3000: "); Serial.println(trenutnaPozicija); delay(500); while(trenutnaPozicija>1000)
 { 
 idiLijevo();
 analogWrite(Gas,255); 
  }
ugasiMotor();
Serial.print("Stigli smo na 1000: ");
Serial.println(trenutnaPozicija);
delay(500);
}

void EnkoderOkidac() {

        detachInterrupt(0); // iskljuci inerrupt na pinu 2
    // Provjeri da li se vrijednost mijenja iz VISOKOG u NISKO ako da
    if (digitalRead(EnkoderB) == HIGH) {
        // Provjeri EnkoderA da saznaš u koju stranu se krecemo
        if (digitalRead(EnkoderA) == HIGH) {
            trenutnaPozicija++; // Desno dodaj 1

        } else {
            trenutnaPozicija--; // Lijevo
        }
    }// Ako se vrijednost mijenje iz NISKOG u VISOKO

    else {
        // Pogledaj EnkoderA da saznaš u koju stranu se krece
        if (digitalRead(EnkoderA) == LOW) {
            trenutnaPozicija++; // Desno dodaj 1            rpmcount++;
        }
        else {
            trenutnaPozicija--; // Desno dodaj 1
        }
    }
    attachInterrupt(0, EnkoderOkidac, CHANGE); // Ponovo ukljuci interrupt
}

void idiLijevo() {
    digitalWrite(Ulaz1, HIGH);
    digitalWrite(Ulaz2, LOW);//Podesi ulaze 1 i 2 da bi motor išao lijevo
}

void idiDesno() {
    digitalWrite(Ulaz1, LOW);
    digitalWrite(Ulaz2, HIGH);//Podesi ulaze 1 i 2 da bi motor išao desno
}

void ugasiMotor() {
    digitalWrite(Ulaz1, LOW);
    digitalWrite(Ulaz2, LOW); //Podesi ulaze 1 i 2 tako da je motor iskljucen
    analogWrite(Gas, 0); //Podesi Gas na 0
}

Evo i čime bi ovo sve trebalo rezultirati.

http://www.youtube.com/watch?v=qwpCo8h_sf4

Leave a Reply