Use SD card to log PS2 keyboard output?

  1. I am successfully using a PS2 keyboard to type stuff into the serial monitor, using the following library and sample program:
    Arduino Playground - PS2Keyboard
  2. I have successfully used the SD card testing program, contents here:
/*
  SD card test 
   
 This example shows how use the utility libraries on which the'
 SD library is based in order to get info about your SD card.
 Very useful for testing a card when you're not sure whether its working or not.
 	
 The circuit:
  * SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module. 
 		Pin 4 used here for consistency with other Arduino examples

 
 created  28 Mar 2011
 by Limor Fried 
 modified 9 Apr 2012
 by Tom Igoe
 */
 // include the SD library:
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10 <---USE THIS ONE for Seeed SD shield
// Sparkfun SD shield: pin 8
const int chipSelect = 10;    

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("\nInitializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);     // change this to 53 on a mega


  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
   Serial.println("Wiring is correct and a card is present."); 
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {
  
}
  1. I'm hoping to write files to my SD card using the PS2 keyboard as an input, hopefully using an LCD screen as output (I'll sort that out later). Specifically, I want the program to work something like this:
 (setup stuff)

if(keyboard connected) then {
1. Initialize serial link. //For now, all prompts will be fed into the serial monitor. 
//Later, I think I'll add something to let me edit existing text files or view them in the serial monitor.
2. Ask for filename. Create new file when enter is pressed or cancel if escape is pressed.
3. If enter is pressed, then create a new line containing anything but the enter keystroke.
4. If escape is pressed, bring up a confirmation prompt, asking whether to continue writing or stop editing the text file.
}
  1. Additionally, I was considering using the LED on pin 13 (built-in LED) as an "SD card is being accessed" pin. Ideas?
  1. I'm hoping to write files to my SD card using the PS2 keyboard as an input, hopefully using an LCD screen as output (I'll sort that out later). Specifically, I want the program to work something like this:

What does your code that uses the PS2 library look like?

  1. Additionally, I was considering using the LED on pin 13 (built-in LED) as an "SD card is being accessed" pin. Ideas?

The SD card is an SPI device. Before you plan to use pin 13, you should take a look at which pins are used for SPI on your board.

Here's the PS2 keyboard sample program, modified to my needs. It outputs typed characters to the serial monitor via a char, "c".

/*  PS2Keyboard library, International Keyboard Layout Example
    http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html

    keyboard.begin() accepts an optional 3rd parameter to
    configure the PS2 keyboard layout.  Uncomment the line for
    your keyboard.  If it doesn't exist, you can create it in
    PS2Keyboard.cpp and email paul@pjrc.com to have it included
    in future versions of this library.
*/
   
#include <PS2Keyboard.h>

const int DataPin = 8;
const int IRQpin =  3;

PS2Keyboard keyboard;

void setup() {
  keyboard.begin(DataPin, IRQpin, PS2Keymap_US);
  //keyboard.begin(DataPin, IRQpin, PS2Keymap_German);
  //keyboard.begin(DataPin, IRQpin, PS2Keymap_French);
  Serial.begin(9600);
  Serial.println("'MURICAN Keyboard Test:");
}

void loop() {
  if (keyboard.available()) {
    char c = keyboard.read();
    Serial.print(c);
  }
}

Also, pin 13 appears to be unused by the shield; I can light up the LED without writing to (or reading) the SD card and vice versa.

Also, pin 13 appears to be unused by the shield

Which shield? The SD card shield? The communication between the Arduino and the SD card shield is usually by SPI. Which pins that involves depends on which Arduino you have. The 328-based Arduino' SPI pins are 11, 12, and 13. Therefore, if you have a 328-based machine and a normal SD shield, pin 13 is NOT unused.

I'm not really sure what you're saying, so I'll summarize my Arduino setup.

  1. The board is an Uno R3.
  2. The shield is an XSeed SD card reader; Pin 13 is available at the top of it.
  3. I was able to use Pin 13 independently of the SD card reader.

I'm not really sure what you're saying, so I'll summarize my Arduino setup.

None of your "links" worked.

I didn't add any links, actually.