Arduino interfaced with TI83+?

I should preface this with saying that I'm an Arduino and electronics newbie, but I'm good with computers and quite happy to learn as I go along. I tend to start with a project idea and learn what I need to do it.

So: I'm thinking of trying to interface an Arduino with my TI83+ graphing calculator. It would make for an "free" (as I already have it) I/O device- lots of buttons, nice LCD screen, plus it has a bit of flash memory to store stuff. I could then wire up other sensors and things to the Arduino, display output on the calculator as graphs etc.

The TI83 series of graphing calculators' link port uses the RS232 protocol, but with +5v as high and 0v as low. Am I right that this should be compatible with the Arduino without a separate chip? With a bit of assembly programming (which I'd have to learn) it can actually pull the wires high or low arbitrarily. Where should I go from here?

Yup, you've got yourself a "logic level" serial port which is compatible with the logic levels of an Arduino. You can use a SoftwareSerial class to connect to the TI83+ at "moderate" speeds, or use an Arduino with a second hardware serial port like the Mega (or our Rugged Circuits Gator board which comes with free USB-to-serial software).

The real key is figuring out the commands that that TI83+ sends and receives over this serial port.

Okay, cool. There's some documentation out there already on the file formats. If I learn enough asm I can just make my own protocol, or use TIBASIC. I just need to work out the call and response needed to send a single variable, for starters.

EDIT: nvm, I think it’s working. Couple of errors, and bytes seem to be being subtracted from 255 when they show up on the calculator. But it does work!

Okay, I’m not doing very well. I’m just getting “255” when I use an asm routine (triggered in TI83 BASIC) to read from the Arduino. When I use NewSoftSerial, I get a bunch of 255 alternating with bunches of -1 (-1 just means “no byte yet”).

I found a bit of PICAXE code that looks quite similar to the SWprint and SWread routines here:

; ----------------------------------------------------------------- ;
; TiLPOut - Output a byte via the Texas Instruments link protocol.  ;
; ----------------------------------------------------------------- ;
; Inputs:   B0 = Byte to output.                                    ;
; Outputs:  None.                                                   ;
; Destroys: B1.                                                     ;
; ----------------------------------------------------------------- ;
TiLPOut: ; comments by BungaDunga after quick read through of picaxe references
   For B1 = 0 To 7 ; for(b1=0;b1<8;b1++)   
      If Bit0 = 0 Then ;Bit0 is the least significant bit of B0, the input
         Low PortC 0 ; Sets pin 0 to output, and pull it low
         Do While Pin1 = 1 : Loop ; do nothing until pin 1 reads 0
         Let DirsC = %00000000 ;Set all pins to outputs
         Do While Pin1 = 0 : Loop ; do nothing until pin 1 reads 1
         Low PortC 1 ; Sets pin 1 to output, pull it low
         Do While Pin0 = 1 : Loop ; do nothing until pin 0 reads 0
         Let DirsC = %00000000
         Do While Pin0 = 0 : Loop ; do nothing until pin 0 reads 1
       Let B0 = B0 / 2
   Next B1 ; return to beginning of the for loop

I tried to translate it to work on the Arduino, and now I’m… still getting 255. This is what I have:

void sendByte(byte toSend){
  byte b1 = 0;
  for ( b1 =0;b1<=7;b1++){
    if(toSend & 1){
      while(digitalRead(7)==1) {}
      while(digitalRead(7)==0) {}
      while(digitalRead(6)==1) {}
      while(digitalRead(6)==0) {}
    toSend = toSend>>1;