Pages: [1]   Go Down
Author Topic: Arduino and gameboy printer  (Read 1628 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Well i have bought  a gameboy printer and now i am trying to print from it. Here is the code i have. It is not working. I have hardcoded a picture. Am I maby doing it wrong? When i send the questin mark, and gameboy printer is connected it replys 1, else it replys 0, so connetion between arduino and printer is working. Please help.
Code:

#include <avr/pgmspace.h>

#define delayMs 20

#define GBClock  7
#define GBIn  8
#define GBOut  9

void setupPrinter(int in, int out, int clock)
{
  pinMode(out, OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(in, INPUT);
}

void setup() {
  setupPrinter(GBIn, GBOut, GBClock);
  Serial.begin(57600);
}

uint8_t buffer[64];
uint8_t cmd;
uint16_t CRC;

void loop() {
  cmd = Serial.read();
  uint8_t repl;
 
  if (cmd == '?') {
    GBSerialOut(0x88);
    GBSerialOut(0x33);
    GBSerialOut(0x01);
    GBSerialOut(0x00);
    GBSerialOut(0x00);
    GBSerialOut(0x00);
    GBSerialOut(0x01);
    GBSerialOut(0x00);
    repl = GBSerialOut(0);
    GBSerialOut(0);
    if (repl == 129) {
      Serial.print('1');
    } else {
      Serial.print('0');
    }
  }

  if (cmd == '!') {
    GBSerialOut(0x88);
    GBSerialOut(0x33);
    GBSerialOut(0x01);
    GBSerialOut(0x00);
    GBSerialOut(0x00);
    GBSerialOut(0x00);
    GBSerialOut(0x01);
    GBSerialOut(0x00);
    repl = GBSerialOut(0);
    repl = GBSerialOut(0);
   
    GBSerialOut(0x88);
    GBSerialOut(0x33);
    GBSerialOut(0x04);
    GBSerialOut(0x00);
    GBSerialOut(0x80);
    GBSerialOut(0x02);
    CRC = 0x86;

    for (int b=0;b<10;b++) {
      Serial.print('a');

      for (int c=0;c<64;c++) {
        if (c%2==0) {
          buffer[c] = 0x00;
        } else {
          buffer[c] = 0xff;
        }
      }

      for (int c=0;c<64;c++) {
        cmd = buffer[c];
        GBSerialOut(cmd);
        CRC += cmd;
      }
    }

    GBSerialOut((uint8_t)CRC & 0xFF); // CRC Low
    GBSerialOut((CRC & 0xFF00)>>8); // CRC High
    repl = GBSerialOut(0);
    repl = GBSerialOut(0);

    delay(10); // 131: répond 4 au lieu de 8, 265 timeout (0)

    GBSerialOut(0x88); // Data vide
    GBSerialOut(0x33);
    GBSerialOut(0x04);
    GBSerialOut(0x00);
    GBSerialOut(0x00);
    GBSerialOut(0x00);
    GBSerialOut(0x04);
    GBSerialOut(0x00);
    repl = GBSerialOut(0);
    repl = GBSerialOut(0);


    GBSerialOut(0x88); // Print
    GBSerialOut(0x33);
    GBSerialOut(0x02);
    GBSerialOut(0x00);
    GBSerialOut(0x04);
    GBSerialOut(0x00);

    CRC = 6;
    //Serial.print('1');
     
    GBSerialOut(0x01);
    CRC += 0x01;
    GBSerialOut(0x01);
    CRC += 0x01;   
    GBSerialOut(0x01);
    CRC += 0x01;
    GBSerialOut(0x01);
    CRC += 0x01;
   

    GBSerialOut((uint8_t)CRC & 0xFF); // CRC Low
    GBSerialOut((CRC & 0xFF00)>>8); // CRC High

    repl = GBSerialOut(0);
    repl = GBSerialOut(0);

    while(1) {
      GBSerialOut(0x88); // Status
      GBSerialOut(0x33);
      GBSerialOut(0x0F);
      GBSerialOut(0x00);
      GBSerialOut(0x00);
      GBSerialOut(0x00);
      GBSerialOut(0x0F);
      GBSerialOut(0x00);
      GBSerialOut(0);
      if (GBSerialOut(0) & 2) break;
      delay(100);
    }
    Serial.print('P');

    while(1) {
      GBSerialOut(0x88); // Status
      GBSerialOut(0x33);
      GBSerialOut(0x0F);
      GBSerialOut(0x00);
      GBSerialOut(0x00);
      GBSerialOut(0x00);
      GBSerialOut(0x0F);
      GBSerialOut(0x00);
      GBSerialOut(0);
      if (!(GBSerialOut(0) & 2)) break;
      delay(100);
    }
    Serial.print('O');

  }
 
}

uint8_t GBSerialOut(uint8_t command) {
  uint8_t gbReplyy=0;
  for (uint8_t clock=0;  clock<8;  ++clock) {
    gbReplyy <<= 1; // Shift Printer gbReplyy
    digitalWrite(GBClock, 0);           // Send clock signal

    if((command << clock) & 0x80) {
      digitalWrite(GBOut, 1); // Write out to printer
    }
    else{
      digitalWrite(GBOut, 0);
    }

    delayMicroseconds(delayMs); // Wait 20-60us
    digitalWrite(GBClock, 1);            // End clock
    if(digitalRead(GBIn))
    {
      gbReplyy |= 1;    // Fetch printer gbReplyy
    }
    delayMicroseconds(delayMs); // Wait 20-60us
  }
  delayMicroseconds(delayMs); // Wait 20-60us
 
  return gbReplyy;
}
Logged

Colombia
Offline Offline
Newbie
*
Karma: 0
Posts: 26
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Looking for anotherthing, I found this:

http://milesburton.com/Gameboy_Printer_with_Arduino

maybe this will helpfull for u
Logged

Pages: [1]   Go Up
Jump to: