Controlando uma impresora com um joystick

Programação em arduino:

 

/* Diego de los Campos – Forianópolis – Maio 2013. deloscampos@gmail.com vídeo em  http://youtu.be/EgJcKBABMJE
Programação em Arduino para controlar uma impressora Hp 7260 com o nunchuck do Wii marca intec.
Este nunchuk está com o acelerómetro quebrado então só usa o joystick.
Do Nunchuck o cabo verde (SDA) va no arduino analog 4, o azul (CLK) no A5,
branco e preto no GND, vermelho no 5v
Pode ser usada qqr impressora sem stepper motors. Na impressora os dois cabos do
motor que faz avançar a folha e os que mexem o cartucho, foram cortados e colocados
novos cabos que vão para o chip L293d H-bridge e deste para 4 pins do ARDUINO Uno
Para alimentar os motores da impressora uso um transformador de 7.5v que
va para o positivo H-bridge e cujo GND junta com o GND do Arduino
Na pasta do arduino tem que ter as bibliotecas Wire, string e stdio.
No nunchuck apertando o botão C a velocidade aumenta e aproveita o potenciómetro do joystick,
apertando o botão Z os motores se mexem randomicamente.
Na impressora foram desmontados as engrenagens que carregam as folhas e desmontada uma
parte trasseira de plástico para carregar a folha por tras. No lugar dos cartuchos de tinta coloquei um
grampo de ropa para segurar as canetas.

*/
#include <Wire.h>
#include <string.h>

#undef int
#include <stdio.h>

uint8_t outbuf[6];        // array to store arduino output
int cnt = 0;
int ledPin = 13;

// the number of the LED pin
const int motorpapel =  8;
const int motorpapel1 =  9;
const int motorlapis = 10;
const int motorlapis1 = 11;

void setup ()
{
Serial.begin (9600);
Serial.print (“Finished setup\n”);
Wire.begin ();        // join i2c bus with address 0x52
nunchuck_init (); // send the initilization handshake
pinMode(motorpapel, OUTPUT);
pinMode(motorpapel1, OUTPUT);
pinMode(motorlapis, OUTPUT);
pinMode(motorlapis1, OUTPUT);
}
void nunchuck_init ()
{
Wire.beginTransmission (0x52);    // transmit to device 0x52
Wire.write (0x40);        // sends memory address
Wire.write (0x00);        // sends sent a zero.
Wire.endTransmission ();    // stop transmitting
}

void send_zero ()
{
Wire.beginTransmission (0x52);    // transmit to device 0x52
Wire.write (0x00);        // sends one byte
Wire.endTransmission ();    // stop transmitting
}
void loop ()
{
Wire.requestFrom (0x52, 6);    // request data from nunchuck
while (Wire.available ())
{
outbuf[cnt] = nunchuk_decode_byte (Wire.read ());    // receive byte as an integer
digitalWrite (ledPin, HIGH);    // sets the LED on
cnt++;
}

// If we recieved the 6 bytes, then go print them
if (cnt >= 5)
{
print ();
}

cnt = 0;
send_zero (); // send the request for next bytes
delay (1);

int z_button = 0;
int c_button = 0;

// byte outbuf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]
if ((outbuf[5] >> 0) & 1)
{
z_button = 1;
}
if ((outbuf[5] >> 1) & 1)
{
c_button = 1;
}

if  ( z_button == 0){
digitalWrite (motorlapis1, HIGH); delay(random (2,30)); digitalWrite (motorlapis1, LOW);
digitalWrite (motorlapis, HIGH); delay(random (2,30)); digitalWrite (motorlapis, LOW);
digitalWrite (motorpapel, HIGH); delay(random (2,80)); digitalWrite (motorpapel, LOW);
digitalWrite (motorpapel1, HIGH); delay(random (2,80)); digitalWrite (motorpapel1, LOW);
}
if (c_button==0){
if(outbuf[0] >128) { digitalWrite (motorlapis1, HIGH); delay((outbuf[0]-128)/7); digitalWrite (motorlapis1, LOW);}
if(outbuf[0] <128) { digitalWrite (motorlapis, HIGH); delay((128-outbuf[0])/7); digitalWrite (motorlapis, LOW);}
if(outbuf[1] >128) { digitalWrite (motorpapel, HIGH); delay(outbuf[1]-128); digitalWrite (motorpapel, LOW);}
if(outbuf[1] <128) { digitalWrite (motorpapel1, HIGH); delay(128-outbuf[1]); digitalWrite (motorpapel1, LOW);}
}else{
if(outbuf[0] >128) { digitalWrite (motorlapis1, HIGH); delay(3); digitalWrite (motorlapis1, LOW);}
if(outbuf[0] <128) { digitalWrite (motorlapis, HIGH); delay(3); digitalWrite (motorlapis, LOW);}
if(outbuf[1] >128) { digitalWrite (motorpapel, HIGH); delay(10); digitalWrite (motorpapel, LOW);}
if(outbuf[1] <128) { digitalWrite (motorpapel1, HIGH); delay(10); digitalWrite (motorpapel1, LOW);}
}

}

// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits.  That is why I
// multiply them by 2 * 2
void print ()
{
int joy_x_axis = outbuf[0];
int joy_y_axis = outbuf[1];

int z_button = 0;
int c_button = 0;

// byte outbuf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]
if ((outbuf[5] >> 0) & 1)
{
z_button = 1;
}
if ((outbuf[5] >> 1) & 1)
{
c_button = 1;
}

Serial.print (joy_x_axis, DEC);
Serial.print (“\t”);

Serial.print (joy_y_axis, DEC);
Serial.print (“\t”);

Serial.print (z_button, DEC);
Serial.print (“\t”);

Serial.print (c_button, DEC);
Serial.print (“\t”);

Serial.print (“\r\n”);
}

// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char
nunchuk_decode_byte (char x)
{
// x = (x ^ 0x17) + 0x17;
return x;
}

 

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s