Proyecto sobre Arduino UNO que funcione

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í.

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í.
 
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.

hola.jpg

Código LCD y funciona.
Código:
#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.

Código:
#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.
 
Última edición:
Hola:

Con este código me funciona. Los demás no. Es la primera vez que envío datos desde Arduino al ordenador sin el cable USB, sino directamente por puerto COM. Por fin.

Código:
// Serial Output 
// by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>

int switchpin = 8; // interruptor conectado al pin 0

void setup()
{
   pinMode(switchpin, INPUT); // pin 0 como ENTRADA
   Serial.begin(9600);    // inicia el puerto serie a 600bps
}

void loop()
{
   if(digitalRead(switchpin) == HIGH) //si el interruptor esta en ON
   {
      Serial.print(1);    // envía 1 a Processing
   } else {
      Serial.print(0);    // en caso contrario envía 0 a Processing
   }
   delay(100);     // espera 100ms
}
holaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-846653.jpg


Ahora debo expander mejor el código. El que quiera aportar ideas es bienvenido. Tengo un interruptor, que envía un caracter que puede ser un "1" o un "0" o una "a" por poner ejemplos. Si lo envío me lo muestra tanto en el HyperTerminal de Windows como en la LCD 16x2 es este caso. Cuando tenga el LCD 20x4 haré que se muestre así:

RL 1 2 3 4 5 6 7 8 --> Indica los 8 relés.
E 1 0 1 1 1 0 0 0 --> Entradas digitales. (1 es activado y desactivado o apagado).
S 0 0 0 0 1 0 1 1 --> Muestra salidas digitales.
A T=29ºC 42%RH --> Mensaje de Temperatura y Humedad.
(Es un ejemplo, puede ser hasta mensajes de alarma).

Ahora toca investigar a fondo poco a poco:
1. Ser capaz de enviar y recibir datos por puerto serie directamente por los pines 0 y 1.
2. Mostrar mensajes por HyperTerminal o similar desde Arduino.
3. Mostrar lo mismo pero en el LCD 20x4.

Desde que funcione, quito el ATMEGA328P-PU y hago una PCB a parte preparado para ello.

Un saludo.
 
Hola de nuevo:

En C# puedo enviar un mensaje así:
Código:
byte[] mBuffer = Encoding.ASCII.GetBytes("Hola mundo.");
En Arduino basta así:
Código:
Serial.write("Hola mundo.");
En C# puedo enviar directamente un byte en hexadecimal así:
Código:
byte[] mBuffer = new byte[1];     
mBuffer[0] = 0x74; //ASCII letra "t".     
serialPort1.Write(mBuffer, 0, mBuffer.Length);
Si quiero enviar una cadena de bytes en hexadecimal en C# lo hago así:
Código:
byte[] mBuffer = new byte[5];     
mBuffer[0] = 0x74;     
mBuffer[1] = 0x75;     
mBuffer[2] = 0x89;     
mBuffer[3] = 0x20;     
mBuffer[4] = 0x6C;     
serialPort1.Write(mBuffer, 0, mBuffer.Length);
¿Cómo envío una cadena de byte en hexadecimal para el puerto serie en ARduino IDE 1.0.5?

Ver tabla ASCII aquí.

Saludo.
 
Buenas:

Por fin me sale algo, con tildes y todo.

Código:
int E0 = 8; // interruptor conectado al pin 0


void setup()
{
   pinMode(E0, INPUT); // pin 0 como ENTRADA
   Serial.begin(9600);    // inicia el puerto serie a 600bps
}

void loop()
{
   if(digitalRead(E0) == HIGH) //si el interruptor esta en ON
   {
     byte arrayBytes [] = {0x41, 0x64, 0x69, 0xA2, 0x73, 0x20};
     Serial.write(arrayBytes, 6);    // envía 1 a Processing
   } 
   else 
   {
     Serial.print("ADIOS ");    // en caso contrario envía 0 a Processing
   }
   delay(100);     // espera 100ms
}
En esta parte del código:
Serial.write(arrayBytes, 6);

Debo poner el número de bytes exactos a enviar. Pensaba que len era como en C#, se envía los bytes hasta donde llegue, sin poner la cantidad manualmente cuantos bytes envias.

¿Hay alguna manera de resolverlo?

Saludo.

Edito:

Con este otro código, pensé que enviar todo en byte bajo Hex sería la única forma.
El problema que tengo es el retono de carro 0x13 y salto de línea 0x10. No lo hacen.

¿Por qué?

Que cosa más rara. Quiero hacer un menú mistrado en el HyperTerminal de Windows y me sale cosas raras así:

variable-846998.gif


Su código es:
Código:
int E0 = 8; // interruptor conectado al pin 0


void setup()
{
   pinMode(E0, INPUT); // pin 0 como ENTRADA
   Serial.begin(9600);    // inicia el puerto serie a 600bps
}

void loop()
{
   if(digitalRead(E0) == HIGH) //si el interruptor esta en ON
   {
     byte arrayBytes [] = {0x41, 0x64, 0x69, 0xA2, 0x73, 0x20};
     Serial.write(arrayBytes, 6);    // envía 1 a Processing
   } 
   else 
   {
     byte array_Dibujo [] = {0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 
   0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 
 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 
 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 
 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 
 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xBB, 
 0x10, 0x10};
     Serial.write(array_Dibujo, 79);    // en caso contrario envía 0 a Processing
     
     byte array_Dibujo2 [] = {0xBA, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4D, 0x45,
 0x4E, 0xE9, 0x20, 0x50, 0x52, 0x49, 0x4E, 0x43, 0x49, 0x50, 0x41, 0x4C, 0x20, 0x20, 
 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xBA,
 0x13, 0x10};
     Serial.write(array_Dibujo2, 80);
     
     byte array_Dibujo3 [] = {"Hola \r\n"};
     Serial.write(array_Dibujo3, 80);
   }
   delay(100000);     // espera 100ms
}

Saludo.
 
Última edición:
Atrás
Arriba