Dos potenciómetros en Arduino UNO

Buenas:

Quiero hacer una prueba con Arduino UNO y no se si se puede hacer.

¿Alguien tiene experiencia de manejar dos potenciómetros a la vez con Arduino UNO?

Suelta dos señales de 0 a 1024 cada potenciómetro o resistencia ajustable.

Vamos a suponer que el P1 suelta fijo el valor 723 y el P2 muestra 12, mostraría todo el rato esto.

723127231272312723127231272312723127231272312723127231272312

Alternando valores. He visto que en un LCD de 16x2 puedes poner valores en cada potenciómetro en cada línea de la pantalla y funciona sin problemas, otra cosa es programarlo que funcione sin problemas raros o comportamientos no deseados.

Mi idea es hacer un programa en Visual Studio como este de abajo.

Captura.PNG

Captura.PNG

No te llego a interpretar bien cual es tu duda pero si, el UNO puede manejar dos potenciómetros, de hecho puede manejar hasta seis (y si fuese un Nano, hasta ocho).

Saludos

Lees uno presentas, lees el otro presentas.
o lees ambos y los presentas uno seguido del otro.

Hola:

Cuando pueda, pongo ejemplos tanto en Arduino y C#. Por supuesto, todo funcional, explicado y con ejemplos prácticos que puedan experimentar.

El diseño de la interfaz está hecha. Tiene que recibir datos así como ejemplo:

723,485

Donde 723 corresponde del potenciómetro 1 separado del 2 por la coma.

Solo falta lograr que cada dato se muestre en forma independiente en la interfaz. En el LCD 16x2 se muestre también, pero esto ya es otro ejercicio que haré más adelante.
Gracias. :wink:

Captura.PNG

Captura.PNG

int dato1 = analogRead(A0);
int dato2 = analogRead(A1);
Serial.print(String(dato1)+","+String(dato2));
lcd.print(String(dato1)+","+String(dato2));

lo quieres mas prolijo

char buffer[20];

int dato1 = analogRead(A0);
int dato2 = analogRead(A1);
sprintf(buffer,"%d,%d", dato1, dato2);
Serial.println(buffer);          // salida por monitor Serie
lcd.print(buffer);                 // salida por lcd

Buenas:

El código lo tenía hecho como indica abajo, no digo que sea el más adecuado.

int pin1 = A1;
int pin2 = A2;
int valorPot1 = 0;
int valorPot2 = 0;

void setup()
{ 
  Serial.begin(115200); 
  pinMode(pin1, INPUT);
  pinMode(pin2, INPUT);
}

void loop()
{
     valorPot1 = analogRead(pin1);
     valorPot2 = analogRead(pin2);
     
     Serial.print(valorPot1);
     Serial.print(",");
     Serial.print(valorPot2);
     Serial.flush();
     delay(100); // 100 mili segundos o 0.1 segundos..
}

Por fin ya me funciona.

Captura.PNG

Les dejo el programa hecho con Visual C# para que lo prueben. Si lo hacen, me cuentas tu experiencia.

Un cordial saludos.

Captura.PNG

Dos_potenciometro_Arduino_01.zip (5 KB)

Te falta una coma.
Pregunta: Para que Serial.flush() ?

Description
Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0, this instead removed any buffered incoming serial data.)

Espera a completar la transmisión saliente y borra toda transmisión entrante? Entonces no tiene sentido su uso.
No tienes comunicación entrante al menos por ahora.

Lo de flush vale.

¿Qué coma me falta exactamente?

Saludos.

¿Qué coma me falta exactamente?

  Serial.print(valorPot1);
     Serial.print(",");
     Serial.print(valorPot2);

Tal vez te he malentendido pero el primer número tiene coma al final pero el segundo se va a pegar con el primero del siguiente lote de números. Se comprende? Entonces te falta una coma al final, luego de valorPot2.

Ahora te entiendo y tienes razón.

Lo curioso. ¿Por qué funciona el programa?

Voy hacer pruebas con 6 potenciómetros y les comento.

Por lo que cuentas, entiendo así como dices.

int pin1 = A1;
int pin2 = A2;
int valorPot1 = 0;
int valorPot2 = 0;

void setup()
{
  Serial.begin(115200);
  pinMode(pin1, INPUT);
  pinMode(pin2, INPUT);
}

void loop()
{
  valorPot1 = analogRead(pin1);
  valorPot2 = analogRead(pin2);

  Serial.print(valorPot1);
  Serial.print(",");
  Serial.print(valorPot2);
  Serial.print(",");
  delay(100); // 100 mili segundos o 0.1 segundos..
}

Exacto, eso es lo que yo entendí que querías, un dato una coma, otro dato otra coma.
La coma es tu delimitador de fin de dato o número.

No hace falta poner una como más, de paso me ahorro más memoria en Arduino.

Código C#:

        private void Actualizar(object sender, EventArgs e)
        {
            string[] datosArray = Recibidos.Split(',');

            if (datosArray.Length == 2)
            {
                textBox_Potenciometro_1.Text = datosArray[0];
                textBox_Potenciometro_2.Text = datosArray[1];
            }

            // Limpiar buffer.
            Recibidos = "";
        }

Ahora mismo haciendo la versión de 6 potenciómetro de Arduino UNO, cuando acabe lo muestro aquí.

Edito:

Arduino:

int pinA0 = A0;
int pinA1 = A1;
int pinA2 = A2;
int pinA3 = A3;
int pinA4 = A4;
int pinA5 = A5;
int valorPotA0 = 0;
int valorPotA1 = 0;
int valorPotA2 = 0;
int valorPotA3 = 0;
int valorPotA4 = 0;
int valorPotA5 = 0;

void setup()
{
  Serial.begin(115200);
  pinMode(pinA0, INPUT);
  pinMode(pinA1, INPUT);
  pinMode(pinA2, INPUT);
  pinMode(pinA3, INPUT);
  pinMode(pinA4, INPUT);
  pinMode(pinA5, INPUT);
}

void loop()
{
  valorPotA0 = analogRead(pinA0);
  valorPotA1 = analogRead(pinA1);
  valorPotA2 = analogRead(pinA2);
  valorPotA3 = analogRead(pinA3);
  valorPotA4 = analogRead(pinA4);
  valorPotA5 = analogRead(pinA5);

  Serial.print(valorPotA0);
  Serial.print(",");
  Serial.print(valorPotA1);
  Serial.print(",");
  Serial.print(valorPotA2);
  Serial.print(",");
  Serial.print(valorPotA3);
  Serial.print(",");
  Serial.print(valorPotA4);
  Serial.print(",");
  Serial.print(valorPotA5);
  Serial.print(",");
  delay(100); // 100 mili segundos o 0.1 segundos..
}

Captura.PNG

Captura.PNG

Buenas:

Por fin me ha funcionado al 100 %.

Para hacer pruebas con Arduino o sin ella, muestro un ejemplo de como desde una Interfaz simulando Arduino IDE o la propia placa, pueden pasar 6 datos de los potenciómetros al PC.


Les dejo ejemplo de los ejecutables de la interfaz para que hagan pruebas.

No olvidar que se necesita el programa llamado "Virtual Serial Port Driver" Para poder crear puertos series virtuales.

Gracias por todos amigos y amigas.

Interfaz Arduino.zip (102 KB)

Buenas:

Para los que quieran experimentar más todavía.
Esta vez con gráficos.

// Include el código de la librería.
#include <LiquidCrystal.h>

int valorPot1 = 0;
int valorPot2 = 0;

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
//LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Pin 10 para saber que es luz de fondo.
//int LuzFondo = 10;

void setup()
{

  Serial.begin(9600); // 115200
  // La pantalla es de 16 caracteres y 2 filas.
  lcd.begin(16, 2);

  // Indicar luz de fondo como salida.
  // pinMode(LuzFondo, OUTPUT);

  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
}

void loop()
{
  valorPot1 = analogRead(A1);
  valorPot2 = analogRead(A2);
  lcd.setCursor(0, 0);
  lcd.print(F("Pot. A1: "));
  lcd.setCursor(9, 0);
  lcd.print(F("    "));
  lcd.setCursor(9, 0);
  lcd.print(valorPot1);
  Serial.print(valorPot1);
  Serial.print(",");
  lcd.setCursor(0, 1);
  lcd.print(F("Pot. A2: "));
  lcd.setCursor(9, 1);
  lcd.print(F("    "));
  lcd.setCursor(9, 1);
  lcd.print(valorPot2);
  Serial.println(valorPot2);
  delay(1000); // 1000 mili segundos o 1 segundo.
}

Dos_potenciometro_Arduino_03.zip (6.43 KB)

Para los curiosos. Ahora en modo consola recibir datos desde Arduino.

Captura.PNG

Código C#:

using System;
using System.IO;
using System.IO.Ports;
using System.Text;
using System.Threading;

namespace Lectura_dos_potenciometros_Arduino_consola_01
{
    class Program
    {
        // Utilizaremos un string "Recibidos" como buffer de recepción.
        public static string recibidos;
        public static bool _continua;
        public static SerialPort Puerto_serie;

        static void Main(string[] args)
        {
            string COM = "";
            StringComparer comparaString = StringComparer.OrdinalIgnoreCase;
            Thread readThread = new Thread(Leer);

            // Título de la ventana.
            Console.Title = "Lectura 2 potenciómetros desde Arduino";

            // Tamaño de la ventana, x, y.
            Console.SetWindowSize(45, 20);

            // Color de fondo.
            Console.BackgroundColor = ConsoleColor.Gray;

            // Color de las letras.
            Console.ForegroundColor = ConsoleColor.Black;

            // Limpiar pantalla y dejarlo todo gris.
            Console.Clear();

            // Visible el cursor.
            Console.CursorVisible = true;

            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
            Puerto_serie = new SerialPort();

            // Obtenga una lista de nombres de puertos serie.
            string[] puertos = SerialPort.GetPortNames();

            Console.WriteLine("Se encontraron los siguientes puertos series:");

            // Muestre el nombre de cada puerto en la consola.
            foreach (string puerto in puertos)
            {
                Console.WriteLine(puerto);
            }

            // Configuración.
            Console.Write(@"
Introduzca un número para seleccionar
puerto COM.
Por ejemplo el 4, sería COM4.

Puerto: ");
            COM = Console.ReadLine(); // Escribir el número del puerto.
            Console.Clear(); // Limpiar pantalla.

            Puerto_serie.PortName = "COM" + COM; // Número del puerto serie.

            // Configuración del puerto serie.
            Puerto_serie.BaudRate = 9600; // 115200
            Puerto_serie.Parity = Parity.None;
            Puerto_serie.StopBits = StopBits.One;
            Puerto_serie.DataBits = 8;
            Puerto_serie.Handshake = Handshake.None;
            Puerto_serie.RtsEnable = true;

            // Establecer los tiempos de espera de lectura / escritura.
            //Puerto_serie.ReadTimeout = 500; // 500 // Milisegundos.
            //Puerto_serie.WriteTimeout = 500; // 500

            // Comprueba si puede abrir el puerto serie.
            try
            {
                Puerto_serie.Open(); // Abrir el puerto serie.
            }

            // En caso que diera algún error como que no encuentra el puerto seleccionado
            // muestra esta excepción.
            catch (IOException)
            {
                Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
                Console.CursorVisible = false;
                Console.SetCursorPosition(16, 6);
                Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe
                o no lo encuentra.");
                Console.ReadKey();   // Pulse cualquier tecla.
                Environment.Exit(1); // Salir de la aplicación.
            }

            _continua = true;

            // Activa el hilo.
            readThread.Start();

            // Cursos invisible.
            Console.CursorVisible = false;

            // Mostrar dibujo en pantalla.
            Console.SetCursorPosition(3, 5);
            Console.Write("Potenciómetro A1:");
            Console.SetCursorPosition(3, 7);
            Console.Write("Potenciómetro A2:");

            // Posición para empezar a dibujar las ─ (líneas).
            Console.SetCursorPosition(0, 15);

            // Generar línea.
            for (int i = 0; i <= 44; i++)
            {
                Console.Write("─"); // ASCII: Alt + 196: ─
            }

            Console.SetCursorPosition(17, 17);
            Console.Write("Puerto: COM" + COM);

            // Bloquea el subproceso.
            readThread.Join();

            // Cierra el puerto serie.
            Puerto_serie.Close();
        }

        // Lee mensaje recibido.
        public static void Leer()
        {
            // Si "_continue" es true se ejecuta todas las instrucciones dentro de while.
            while (_continua) // _continua
            {
                try
                {
                    // Almacena en la variable mensaje cualquier caracter o mensaje recibido.
                    recibidos = Puerto_serie.ReadLine();

                    // Delimitador.
                    string[] datosArray = recibidos.Split(',');

                    // Si los datos del array son dos ejecuta las intrucciones.
                    if (datosArray.Length == 2) // 2 potenciómetros.
                    {
                        // Muestra datos en pantalla del A1.
                        Console.SetCursorPosition(21, 5);
                        Console.Write("    ");
                        Console.SetCursorPosition(21, 5);
                        Console.Write(datosArray[0]); // Entrada analógica A1.

                        // Muestra datos en pantalla del A2.
                        Console.SetCursorPosition(21, 7);
                        Console.Write("    ");
                        Console.SetCursorPosition(21, 7);
                        Console.Write(datosArray[1]); // Entrada analógica A2.
                    }

                    // Limpiar buffer.
                    recibidos = "";

                }
                catch (TimeoutException)
                {
                    Console.WriteLine("ERROR");
                }
            }
        }
    }
}

Código Arduino:

// Include el código de la librería.
#include <LiquidCrystal.h>

int valorPot1 = 0;
int valorPot2 = 0;

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
//LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Pin 10 para saber que es luz de fondo.
//const byte LuzFondo = 10;

void setup()
{

  Serial.begin(9600); // 115200
  // La pantalla es de 16 caracteres y 2 filas.
  lcd.begin(16, 2);

  // Indicar luz de fondo como salida.
  // pinMode(LuzFondo, OUTPUT);

  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
}

void loop()
{
  valorPot1 = analogRead(A1);
  valorPot2 = analogRead(A2);
  lcd.setCursor(0, 0);
  lcd.print(F("Pot. A1: "));
  lcd.setCursor(9, 0);
  lcd.print(F("    "));
  lcd.setCursor(9, 0);
  lcd.print(valorPot1);
  Serial.print(valorPot1);
  Serial.print(",");
  lcd.setCursor(0, 1);
  lcd.print(F("Pot. A2: "));
  lcd.setCursor(9, 1);
  lcd.print(F("    "));
  lcd.setCursor(9, 1);
  lcd.print(valorPot2);
  Serial.println(valorPot2);
  delay(1000); // 1000 mili segundos o 1 segundo.
}

Disfruten.

Captura.PNG

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.