Go Down

Topic: Serial data passthru? (Read 615 times) previous topic - next topic

Things

Dec 02, 2009, 07:46 am Last Edit: Dec 02, 2009, 12:02 pm by Things Reason: 1
Hi, I have 2 Arduino boards, and some 433Mhz transmitting modules with serial input.

I was wondering, is it possible to have the computer to send data to 1 Arduino, then that Arduino chucks out that data exactly as it's receiving it from the computer, to pin 1?

And on the 2nd Arduino, do you just use Serial.read() as always?

EDIT: Ok, remove the wireless boards from the setup for now.

I have 1 Arduino, connected to USB. Pin 1 of this Arduino is going to pin 0 on the 2nd Arduino, and pin 0 on the 1st Arduino is connected to pin 1 on the 2nd Arduino.

According to the website, these pins are directly connected to the FTDI chip.

I have LCD smartie running on the computer, sending serial data to Arduino 1.

Now, the Arduino should be sending that exact serial data thru pin 1, into the 2nd Arduino, however the 2nd Arduino isn't doing anything??

These are my codes:

Arduino 1:

Code: [Select]

void setup(){
 Serial.begin(9600);
}
void loop(){
}


Arduino 2:

Code: [Select]
/*
Use matrix.dll in lcd smartie setup.
setup your comport and 9600 baudrate.
*/
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(14, 15, 16, 17, 18, 19);

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(4, 20);
Serial.begin(9600);
}


byte serial_getch(){

int incoming;  
while (Serial.available()==0){}
    // read the incoming byte:
incoming = Serial.read();

return (byte) (incoming &0xff);
}
     


void loop(){

byte rxbyte;
byte temp;

rxbyte = serial_getch();

if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
    {
          switch (serial_getch())
          {
                case 66: //backlight on (at previously set brightness)
                              // not implemented                        

                      break;
                case 70: //backlight off
                      // not implemented                        
                              break;
                case 71:  //set cursor position
                      temp = (serial_getch() - 1);  //get column byte
                      switch (serial_getch())  //get row byte
                      {
                            //line 1 is already set up
                            case 2:
                                  temp += 0x40;
                                  break;
                            case 3:
                                  temp += 0x14;
                                  break;
                            case 4:
                                  temp += 0x54;
                                  break;
                            default:
                                  break;
                      }
                      lcd.command(0b10000000 + temp);
                      break;
                case 72:  //cursor home (reset display position)
                      lcd.command(2);
                      break;
                case 74:  //show underline cursor
                      lcd.command(0b00001110);
                      break;
                case 75:  //underline cursor off
                case 84:  //block cursor off
                      lcd.command(0b00001100);
                      break;
                case 76:  //move cursor left
                      lcd.command(16);
                      break;
                case 77:  //move cursor right
                      lcd.command(20);
                      break;
                case 78:  //define custom char
                      lcd.command(64 + (serial_getch() * 8));  //get+set char address
                      for (temp = 7; temp != 0; temp--)
                      {
                            lcd.print(serial_getch()); //get each pattern byte
                      }
                      break;
                case 83:  //show blinking block cursor
                      lcd.command(0b00001111);
                      break;
                case 86:  //GPO OFF
                      //implement later
                      break;
                case 87:  //GPO ON
                      /*temp = serial_getch();
                      if (temp == 1)
                      {
                            GPO1 = GPO_ON;
                      }*/
                      break;
                case 88:  //clear display, cursor home
                      lcd.command(1);
                      break;
                case 152: //set and remember (doesn't save value, though)
                case 153: //set backlight brightness
                      //not implemented
                      break;

                //these commands ignored (no parameters)
                case 35: //read serial number
                case 36: //read version number
                case 55: //read module type
                case 59: //exit flow-control mode
                case 65: //auto transmit keypresses
                case 96: //auto-repeat mode off (keypad)
                case 67: //auto line-wrap on
                case 68: //auto line-wrap off
                case 81: //auto scroll on
                case 82: //auto scroll off
                case 104: //init horiz bar graph
                case 109: //init med size digits
                case 115: //init narrow vert bar graph
                case 118: //init wide vert bar graph
                      break;
                default:
                      //all other commands ignored and parameter byte discarded
                      temp = serial_getch();  //dump the command code
                      break;
          }
          return;
    } //END OF COMMAND HANDLER

    //change accented char to plain, detect and change descenders
    //NB descenders only work on 5x10 displays. This lookup table works
    //  with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
    switch (rxbyte)
    {
          //chars that have direct equivalent in LCD charmap
         case 0x67: //g
                rxbyte = 0xE7;
                break;
          case 0x6A: //j
                rxbyte = 0xEA;
                break;
          case 0x70: //p
                rxbyte = 0xF0;
                break;
          case 0x71: //q
                rxbyte = 0xF1;
                break;
          case 0x79: //y
                rxbyte = 0xF9;
                break;
         case 0xE4: //ASCII "a" umlaut
                rxbyte = 0xE1;
                break;
          case 0xF1: //ASCII "n" tilde
                rxbyte = 0xEE;
                break;
          case 0xF6: //ASCII "o" umlaut
                rxbyte = 0xEF; //was wrong in v0.86
                break;
          case 0xFC: //ASCII "u" umlaut
                rxbyte = 0xF5;
                break;

          //accented -> plain equivalent
          //and misc symbol translation
          case 0xA3: //sterling (pounds)
                rxbyte = 0xED;
                break;
         case 0xB0: //degrees symbol
                rxbyte = 0xDF;
                break;
         case 0xB5: //mu
                rxbyte = 0xE4;
                break;
          case 0xC0: //"A" variants
          case 0xC1:
          case 0xC2:
          case 0xC3:
          case 0xC4:
          case 0xC5:
                rxbyte = 0x41;
                break;
          case 0xC8: //"E" variants
          case 0xC9:
          case 0xCA:
          case 0xCB:
                rxbyte = 0x45;
                break;
          case 0xCC: //"I" variants
          case 0xCD:
          case 0xCE:
          case 0xCF:
                rxbyte = 0x49;
                break;
          case 0xD1: //"N" tilde -> plain "N"
                rxbyte = 0x43;
                break;
          case 0xD2: //"O" variants
          case 0xD3:
          case 0xD4:
          case 0xD5:
          case 0xD6:
          case 0xD8:
                rxbyte = 0x4F;
                break;
          case 0xD9: //"U" variants
          case 0xDA:
          case 0xDB:
          case 0xDC:
                rxbyte = 0x55;
                break;
          case 0xDD: //"Y" acute -> "Y"
                rxbyte = 0x59;
                break;
         case 0xDF: //beta  //mucks up LCDSmartie's degree symbol??
                rxbyte = 0xE2;
                break;
         case 0xE0: //"a" variants except umlaut
          case 0xE1:
          case 0xE2:
          case 0xE3:
          case 0xE5:
                rxbyte = 0x61;
                break;
          case 0xE7: //"c" cedilla -> "c"
                rxbyte = 0x63;
                break;
          case 0xE8: //"e" variants
          case 0xE9:
          case 0xEA:
          case 0xEB:
                rxbyte = 0x65;
                break;
          case 0xEC: //"i" variants
          case 0xED:
          case 0xEE:
          case 0xEF:
                rxbyte = 0x69;
                break;
          case 0xF2: //"o" variants except umlaut
          case 0xF3:
          case 0xF4:
          case 0xF5:
          case 0xF8:
                rxbyte = 0x6F;
                break;
          case 0xF7: //division symbol
                rxbyte = 0xFD;
                break;
          case 0xF9: //"u" variants except umlaut
          case 0xFA:
          case 0xFB:
                rxbyte = 0x75;
               

Things

Rest of the code for Arduino 2:

Code: [Select]
break;
          default:
                break;
    }

    lcd.print(rxbyte);  //otherwise a plain char so we print it to lcd
    return;


}

MikMo

You must connect the grounds of the 2 Arduinos together also.

Things

#3
Dec 02, 2009, 12:51 pm Last Edit: Dec 02, 2009, 02:38 pm by Things Reason: 1
I have done that.

I realized I actually need to connect the RX output of the 1st Arduino to the 2nd Arduino, and vice versa. However, it's still not working.

Hmmm

After some more reading, connecting the RX and TX pins on both boards together, means that both ATMega's SHOULD be receiving the EXACT same data. Is there anything going on in the Arduino that is preventing this?


EDIT: OK well, I have the LCD updating thru the other Arduino, however all I get is a bunch of random characters on the LCD.

Is there a way you can Serial.write the EXACT same data as it's receiving?

Go Up