Login [Register]
Don't have an account? Register now to chat, post, use our tools, and much more.
Hey! So I just recently got myself an arduino mega, an ethernet shield, and a 2.8" LCD TFT Capacitive touch breakout board from adafruit. This is were I'll be posting about my adventures and questions with and about these items.

First off, I have a monochrome lcd from that Casio 9750g plus that I took apart. I was wondering how feasable it would be to make it display something by using an arduino.

I also want to know, are there any good, simple calc modding things that I could do with an arduino? I do have the 83+ SE for its spacious case.
One of the first things you could try is using ArTICL with your calculator, starting with some of the example programs and seeing what else you can make them do. That might give you some ideas about what you might want to interface to your calculator as an internal module. Keep in mind that some of the most popular mods from the Ultimate Calculators and other projects, like speakers, a PS/2 port, a touchpad, and so on do not require an Arduino, so you might have to be creative.

Regarding the LCD, can you find out the model number, and thence find a datasheet? That will be key for developing a driver to interface with the LCD.
KermMartian wrote:
Regarding the LCD, can you find out the model number, and thence find a datasheet? That will be key for developing a driver to interface with the LCD.
It's Adafruit, so they already provide piles of code for most uses. Appears to be a ILI9341 though.
Tari wrote:
KermMartian wrote:
Regarding the LCD, can you find out the model number, and thence find a datasheet? That will be key for developing a driver to interface with the LCD.
It's Adafruit, so they already provide piles of code for most uses. Appears to be a ILI9341 though.
I should have been more specific. I was responding to this part:
Unicorn wrote:
First off, I have a monochrome lcd from that Casio 9750g plus that I took apart. I was wondering how feasable it would be to make it display something by using an arduino.
Woops, didn't see these replies.

KermMartian wrote:
One of the first things you could try is using ArTICL with your calculator, starting with some of the example programs and seeing what else you can make them do. That might give you some ideas about what you might want to interface to your calculator as an internal module. Keep in mind that some of the most popular mods from the Ultimate Calculators and other projects, like speakers, a PS/2 port, a touchpad, and so on do not require an Arduino, so you might have to be creative.

Regarding the LCD, can you find out the model number, and thence find a datasheet? That will be key for developing a driver to interface with the LCD.


I do want to work on getting my CSE connected using ArTICL, and with the addition of those videos, I shouldn't have much of a problem. Smile

Regarding the Casio LCD, I'll take a look at that.


And among other things, I created CircleIt on the Arduino using my Adafruit LCD.

Video:
https://www.youtube.com/watch?v=QYDW2biWEUs


Code:

#include <Adafruit_GFX.h>    // Core graphics library
#include <SPI.h>       // this is needed for display
#include <Adafruit_ILI9341.h>
#include <Wire.h>      // this is needed for FT6206
#include <Adafruit_FT6206.h>
// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206();
// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 10
#define TFT_DC 9
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
int oldcolor, currentcolor;
int radius = 65;
int score;
int highscore;

void setup(void) {
  while (!Serial);     // used for leonardo debugging

  Serial.begin(115200);
  Serial.println(F("Cap Touch Paint!"));

  tft.begin();

  if (! ctp.begin(40)) {  // pass in 'sensitivity' coefficient
    Serial.println("Couldn't start FT6206 touchscreen controller");
    while (1);
  }

  Serial.println("Capacitive touchscreen started");

  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(27,130);
  tft.setTextSize(4);
  tft.setTextColor(ILI9341_PINK);
  tft.print("CircleIt");
  tft.setCursor(27,165);
  tft.setTextSize(2);
  tft.setTextColor(ILI9341_GREEN);
  tft.print("Highscore: ");
  tft.print(highscore);
  while (1) {
    if (ctp.touched()){
      tft.fillScreen(ILI9341_BLACK);
      tft.fillCircle(120,166,50,ILI9341_PINK);
      tft.drawCircle(120,166,51,ILI9341_BLUE);
      tft.drawCircle(120,166,52,ILI9341_BLUE);
      tft.drawCircle(120,166,53,ILI9341_BLUE);
      tft.drawCircle(120,166,54,ILI9341_BLUE);
      tft.drawCircle(120,166,55,ILI9341_BLUE);
      tft.setTextSize(2);
      tft.setTextColor(ILI9341_GREEN);
      tft.setCursor(1,1);
      tft.fillRect(1,1,100,15,ILI9341_BLACK);
      tft.print("Score: ");
      tft.print(score);
      return;
    }
  }
}

void loop() {
  // Retrieve a point 
  TS_Point p = ctp.getPoint();
  // flip it around to match the screen.
  p.x = map(p.x, 0, 240, 240, 0);
  p.y = map(p.y, 0, 320, 320, 0);
  Serial.print("(");
  Serial.print(p.x);
  Serial.print(", ");
  Serial.print(p.y);
  Serial.println(")");
  tft.drawCircle(120,166,radius,ILI9341_YELLOW);
  if (radius <= 50){
    tft.drawCircle(120,166,radius,ILI9341_PINK);
  }
  if (radius > 50 && radius <= 55){
    tft.drawCircle(120,166,radius,ILI9341_BLUE);
  }
  if (radius > 55){
    tft.drawCircle(120,166,radius,ILI9341_BLACK);
  }
  if (ctp.touched() && radius <= 50 || ctp.touched() && radius > 55) {
    if (score > highscore)
      highscore = score;
    tft.fillScreen(ILI9341_BLACK);
    tft.setTextSize(2);
    tft.setTextColor(ILI9341_WHITE);
    tft.setCursor(1,1);
    tft.println("GAME OVER");
    tft.setTextColor(ILI9341_ORANGE);
    tft.println("tap to play again.");
    tft.setCursor(1,37);
    tft.setTextColor(ILI9341_GREEN);
    tft.print("Highscore: ");
    tft.print(highscore);
    tft.setTextColor(ILI9341_PURPLE);
    tft.setCursor(1,53);
    tft.print("Score: ");
    tft.println(score);
    score = 0;
    while (1) {
      if (ctp.touched()){
        radius = 65;
        tft.fillScreen(ILI9341_BLACK);
        tft.fillCircle(120,166,50,ILI9341_PINK);
        tft.drawCircle(120,166,51,ILI9341_BLUE);
        tft.drawCircle(120,166,52,ILI9341_BLUE);
        tft.drawCircle(120,166,53,ILI9341_BLUE);
        tft.drawCircle(120,166,54,ILI9341_BLUE);
        tft.drawCircle(120,166,55,ILI9341_BLUE);
        tft.setTextSize(2);
        tft.setTextColor(ILI9341_GREEN);
        tft.setCursor(1,1);
        tft.fillRect(1,1,100,15,ILI9341_BLACK);
        tft.print("Score: ");
        tft.print(score);
        return;
      }
    }
  }
  if (ctp.touched() && radius <= 55 || ctp.touched() && radius > 50) {
    score++;
    tft.setTextSize(2);
    tft.setTextColor(ILI9341_GREEN);
    tft.setCursor(1,1);
    tft.fillRect(1,1,100,15,ILI9341_BLACK);
    tft.print("Score: ");
    tft.print(score);
  }
  radius--;
  radius--;
  radius--;
  if (radius <= 1){
    radius = 65;
  }
}


Its great fun, and I'm thinking about what to do next with these things. Smile



Oh yeah, I got a hc-05 Bluetooth module from my robotics teacher and got that working with an arduino using the arduino IDE's built in serial port.
I decided to make it a little more fancy and create a ruby program to interface with it. But, I got a permissions error of some sort when trying to interface with the Bluetooth. But, when trying to interface with an arduino everything worked fine. I asked about it here: http://stackoverflow.com/questions/35190016/bluetooth-serial-port-permission-error-errnoeacces-ruby-serialport-gem
I haven't posted here for a while...

Anyways, I recently got a lattepanda, which is essentially a 1.8 GHz computer with 4 gb of ram, with an arduino processor built in. Its a really nice little device, but it tends to overheat. To counter this problem I took a heat sink off of an old dell computer I had, and also took the fan. I hooked the fan's Power and Ground wires up to the arduino's 5v and GND, and voila! Whenever the panda gets power, the fan starts up. The heat sink sits on top of the box around the processor.

The thing is though, the panda may not be on, but the fan will be running. To only make it so that the fan runs when the panda is on, I'm going to write a program using their sample code and make the program run when the computer starts up.
Sounds like a good solution to a real problem! Do you have thermal paste left over from working on a computer at some point to adhere the heat sink to the SoC, or is it just floating there for now? I'm also curious if you have a 3D printer available to you to explore making a bracket to hold the heat sink in place.
I do not have thermal paste, so the heat sink us just floating there. I also do not have access to a 3D printer, though iay be able to once school starts.
So I have a question: Do you think I should put the board on top of the heat sink with the fan behind it like this:
http://imgur.com/4o4xpK3

Or with the heat sink on top with the panda held up by supports, like this: (the supports will be screws or something on each corner)

http://imgur.com/cH5vtYN

What would be the best design for keeping the temp down?
Bump. So instead of creating my own case, I think I am going to get this 3D printed and buy my own fans and heatsinks. I think I may still make my own setup for the touchscreen, this one is more designed for desktop use.
Unicorn wrote:
Bump. So instead of creating my own case, I think I am going to get this 3D printed and buy my own fans and heatsinks. I think I may still make my own setup for the touchscreen, this one is more designed for desktop use.
"This" appears to link to a user's profile rather than a specific design, but I get the idea. That sounds reasonable for more permanent desktop use; good luck!
Woops, heres the actual link: http://www.thingiverse.com/thing:1605660

But anyways, I kind of got impatient yesterday and didn't order it, and instead made my own setup, something along the lines of what I'd posted before:

I re-hooked up the fan to the green airflow conductor, and wedged a piece of wood with the lattepanda screwed onto it between the edges.

Here you can see it in the "case"


As you can see, there is a small block of wood resting on the hood, as well as a cutout along the side. These two things exist to let the Display connect and have a mount. You can also see the Coasters in this image, making sure that it does not tip over. I have since put some nails halfway into the fan that support it now.



From this view you can see the fan and the lattepanda itself inside:


Now, I haven't mentioned the heat sink, but it is in there, just resting on top of the CPU. I have ordered some thermal paste to make it more permanent. You can also see the fan's wires, which go to 5v and GND pins.



And here is a picture of what it will look like most of the time:



This seems to be pretty successful cooling, it is averaging 50-45 degrees Celsius while writing this post, while it used to average 75-80.


EDIT: I also have another question, this time about ArTIcl. I followed along with geekboy's how-to video, but I am wondering if there is a way to get what key is being pressed on the calc. For example, if I press [Enter] on the homescreen, It sends some sort of data to the Arduino that I can read over serial.
Unicorn wrote:
[photos and explanation]
Nice, that looks like a good temporary solution. The only thing I want to mention about that is that thermal paste is thermal, not mechanical. That means that you'll still need something to hold it on other than the thermal paste; it's not like glue.

Unicorn wrote:
EDIT: I also have another question, this time about ArTIcl. I followed along with geekboy's how-to video, but I am wondering if there is a way to get what key is being pressed on the calc. For example, if I press [Enter] on the homescreen, It sends some sort of data to the Arduino that I can read over serial.
You'll need a program running on the calculator for this. It can be as simple as a program that loops getKey until you get a nonzero value, then Send({K})'s that to the ArTICL-enabled Arduino attached.
Ah, that makes sense.

Anyways, the main reason I want to get keypresses without a program is because I'm thinking about making the TI Keyboard into a computer keyboard, like I said on IRC.
So I'm thinking that to get the information from the keyboard I need a constant displaying of everything sent out from the keyboard in the serial window. How would I go about doing that?
Bump.

So I think I would use this code, correct?

Code:
int get(uint8_t* header, uint8_t* data, int* datalength, int maxlength, int timeout = GET_ENTER_TIMEOUT);

I think I should just switch out the SendLetter Example's send(...); with this.
What would I do for the header? I honestly don't understand half of it, could someone please explain the different requirements and terms?
Bump, I guess.
I'd need to check what the protocol the TI Keyboard uses to communicate looks like, especially if it's CBL-like, but you'll most likely need to combine a series of Gets and Sends. A good first step would be to put a get() in a loop on the Arduino and print out what is received each time you press a key on the keyboard on the Arduino's serial console. The protocol is probably the one described on the following page, meaning that you'll need to get(), send(), and then send():

http://www.merthsoft.com/linkguide/ti83+/remote.html
That makes sense, but the main point is that I don't understand how to use get() or send().

Each command requires a header, and I'm not sure what is wanted put in the header command, as well as "data" or "datalength'.
"Maxlength" is the maximum length the data can be, but what about "timeout". I wouldn't know what to put in those places.
It's hard to understand the difference between the header and the data without looking at some sample packet formats to see the difference. The header generally specifies which type of device (TI-82, TI-83/+, TI-84+, CBL, CBL2, etc) is sending or receiving, what type of data is being sent, how long the data is, and so on. The data is, well, the data. It contains variable names and descriptions in some cases, variable contents in some cases, keypress information in some cases, directory listings in some cases, and so on. I strongly recommend you take a look at a bunch of the samples, as well as CBL2.cpp in the ArTICL library, and refer to the File Format and Link Protocol Guide to see some sample packet formats. Please of course follow up with any specific questions and I'll try to answer them as quickly as possible.
Kerm, great work. But my lazy/busy PnP expectations for serial getbyte() via Arduino did not even acknowledge receipt of any packets.

Lazy PnP midi-out for midi DIN via Arduino succeeded.

No doubt this library is a great seed and gift, but as a time-limited user, who might not know electronics and arduinos... ive tried and failed.

please attach troubleshooting, or someone should up your GitHub for sorry sacks like me Wink

I've logic analyzer at best, but really, your code, while an excellent starting point falls short of PnP for me as one, and my noobie measures failed to acquire necessary troubleshooting.

printed and read all code, thx chief.

but yeah, after Arduino ide junk and visual studio I'm still far from succeeding in any link or capture of any bytes protocols aside.

someone else can fix this??

Smile
  
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.

» Go to Registration page
Page 1 of 2
» All times are GMT - 5 Hours
 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

 

Advertisement