Go Down

Topic: Proyecto sobre Arduino UNO que funcione (Read 973 times) previous topic - next topic

Metaconta

Hola:

He estado trasteando el código RS232 con Arduino UNO r3. Quiero usar el RS232 y el LCD 16x2. En la salida de Arduino, el que ustedes quieran, tienen 4 Leds o 8 Leds, da igual.

Desde el HyperTerminal de Windows, Terra Term o otro similar, que si pulsas la tecla 'q' desde el PC, se enciende el Led 1, si pulsas la tecla 'w', se enciende el Led 2. Si pulsas la tecla 's', el Led 2 se apaga.

Para que se entienda. Las teclas q, w, e,r, t, y,u,i son para encender los Leds, para apagarlas son a,s,d,f,g,h,j,k.

Lo que tiene que hacer Arduino es, apagar y encender Led desde el PC o ordenador por el puerto serie RS232. En el LCD tiene que aparecer la tecla pulsada o que diga mensajes de apagado Led 2, cosas así.

Lo he hecho con PIC16F84A en su día, puedes ver un vídeo por aquí.
http://www.youtube.com/watch?v=niWAbQ-HVnY

Tutorial o manual sobre ello.
http://electronica-pic.blogspot.com.es/2008/11/electrnica-pic.html

Los mensajes recibidos o enviados deben aparecer tanto en el HyperTErminal de Windows y en el LCD 16x2 HD77480 Hitachi.

Cualquier información para empezar y quelos códigos funcionen es bienvenido.

Gracias por leer hasta aquí.

Metaconta

Hola:

He conseguido algo.
Arduino-Rs232 + Arduino-LCD.
http://fritzing.org/home/

Buenas:

Por fin, me funciona directamente con un LCD 16x2 suelto, no había conectado el pin RW a masa, lo dejaba la aire, jajajaj. El LCD Keypad Shield también me funciona bien. En este caso, seguiré con el LCD suelto. Luego pruebo el 20x4 a ver que tal.



Código LCD y funciona.
Code: [Select]
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 // Print a message to the LCD.
 lcd.print("ELECTRONICA PIC");
}

void loop() {
 // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 lcd.setCursor(6, 1);
 // print the number of seconds since reset:
 lcd.print(millis()/1000);
}
Ahora toca probar el puerto serie físico y directo, no el virtual por puerto USB. Espero que me entiendas. El problemón es jugar con el RS232 y LCD juntos.

Pongo el código completo con el LCD, todavía no he modificado lo que tengo que modificar, eso si, hay que analizarlo poco a poco y haré preguntas. El código de abajo hay que analizarlo.

Code: [Select]
#include <LiquidCrystal.h>
#include <ctype.h>

#define bit9600Delay 84  
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte rx = 6;
byte tx = 7;
byte SWval;

void setup() {
   // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 // Print a message to the LCD.
 lcd.print("ELECTRONICA PIC");
 //###############################################
 pinMode(rx,INPUT);
 pinMode(tx,OUTPUT);
 digitalWrite(tx,HIGH);
 digitalWrite(13,HIGH); //turn on debugging LED
 SWprint('h');  //debugging hello
 SWprint('i');
 SWprint(10); //carriage return
}

void SWprint(int data)
{
   // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 lcd.setCursor(6, 1);
 // print the number of seconds since reset:
 lcd.print(millis()/1000);
 //#################################################
 byte mask;
 //startbit
 digitalWrite(tx,LOW);
 delayMicroseconds(bit9600Delay);
 for (mask = 0x01; mask>0; mask <<= 1) {
   if (data & mask){ // choose bit
    digitalWrite(tx,HIGH); // send 1
   }
   else{
    digitalWrite(tx,LOW); // send 0
   }
   delayMicroseconds(bit9600Delay);
 }
 //stop bit
 digitalWrite(tx, HIGH);
 delayMicroseconds(bit9600Delay);
}

int SWread()
{
 byte val = 0;
 while (digitalRead(rx));
 //wait for start bit
 if (digitalRead(rx) == LOW) {
   delayMicroseconds(halfBit9600Delay);
   for (int offset = 0; offset < 8; offset++) {
    delayMicroseconds(bit9600Delay);
    val |= digitalRead(rx) << offset;
   }
   //wait for stop bit + extra
   delayMicroseconds(bit9600Delay);
   delayMicroseconds(bit9600Delay);
   return val;
 }
}

void loop()
{
   SWval = SWread();
   SWprint(toupper(SWval));
}
Arduino UNO rv3, que lo compré hace dos días, jejejjeje. Dice en el código que usan el pin 6 y 7 para puerto serie. Así como está no pasa nada. En el "Terra Term Pro" que es como el HyperTerminal de Windows XP, salen carácteres raros.

Haciendo pruebas cambiando hasta los Rx y Tx correspondientes a Arduino UNO r3 pues no logro nada. Sigo investigando, a lo mejor hay códigos más actualizados.

Saludo.

Go Up