Cambiar los pines analógicos a digital de Arduino UNO r3

Hola:

En Arduino UNO r3 quiero cambiar las entradas analógicas com entrada o salida digital cuando quiera o al menos dejar solo una entrada analógico. Muchas veces uso un LCD y me quita 7 digitales. Me quedan otras 7 para usar pulsadores o Led.

¿Existe la forma de cambiar esas entradas analógicas en ditales?

¿Hay que tocar el IDE 1.0.5 en su interior para lograrlo?

Sludo.

Hola Metaconta,

Si no me equivoco simplemente con definirlo en el setup() como entrada o salida ya lo puedes usar como digital.

Aquí te dejo la info:

http://arduino.cc/es/Tutorial/AnalogInputPins#.U0mLZ_l_tyU

Edito:
Si quieres evitarte quebraderos de cabeza con el LCD por que te ocupa demasiados pines te recomiendo esto:
http://www.ebay.es/itm/K1BO-1602LCD-Display-IIC-I2C-TWI-SP-I-Serial-Interface-Board-Module-Port-/261288760695?pt=LH_DefaultDomain_2&hash=item3cd6061577&_uhb=1

Un saludo

Buenas:

Entonces si es así, ya no hay 14 digitales, si no 20 digitales en total. Ya se me quedaba corto Arduino UNO en tan poco tiempo, ejjejejej.

Voy a probar a ver que tal.

Saludos.

Yo trato de buscar dispositivos I2C precisamente para evitar este problema, aunque lei una solucion (que no he probado) que mediante multiplexores solucionaban el tema de las salidas,

http://playground.arduino.cc/Learning/4051

Solo es cuestión de probarlo XD

Saludos

Buenas:

Pensé en el I2C y SPI, precisamente es lo que no quiero usar mucho. Tampoco me quiero complicar la vida manejando esos protocolos exceptuando que no me queda otra según proyectos.

El tema de multiplexores lo he probado con PIC y funciona muy bien. Ningún problema. Hast en ensambaldor se hace fácil.

Tablas:

; Implementar una tabla de la verdad mediante el manejo de tablas grabadas en ROM. Por
; ejemplo, la tabla será de 3 entradas y 6 salidas:
; 
; 		C  B  A  | S5  S4  S3  S2  S1  S0
; 		-----------|---------------------------
; 		0   0   0   |   0    0    1    0    1    0	; (Configuración 0).
; 		0   0   1   |   0    0    1    0    0    1	; (Configuración 1).
; 		0   1   0   |   1    0    0    0    1    1	; (Configuración 2).
; 		0   1   1   |   0    0    1    1    1    1	; (Configuración 3).
; 		1   0   0   |   1    0    0    0    0    0	; (Configuración 4).
; 		1   0   1   |   0    0    0    1    1    1	; (Configuración 5).
; 		1   1   0   |   0    1    0    1    1    1	; (Configuración 6).
; 		1   1   1   |   1    1    1    1    1    1	; (Configuración 7).
;
; Las entradas C, B, A se conectarán a las líneas del puerto A: RA2 (C), RA1 (B) y RA0 (A).
; Las salidas se obtendrán del puerto B: RB5 (S5), RB4 (S4), RB3 (S3), RB2 (S2), RB1 (S1)
; y RB0 (S0).
;
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0						; El programa comienza en la dirección 0.
Inicio
	bsf		STATUS,RP0				; Acceso al Banco 1.
	clrf	TRISB					; Las líneas del Puerto B se configuran como salida.
	movlw	b'00011111'				; Las 5 líneas del Puerto A se configuran como entrada.
	movwf	TRISA
	bcf		STATUS,RP0				; Acceso al Banco 0.
Principal
	movf	PORTA,W					; Lee el valor de las variables de entrada.
	andlw	b'00000111'				; Se queda con los tres bits bajos de entrada.
	call	TablaVerdad 			; Obtiene la configuración de salida.
	movwf	PORTB					; Se visualiza por el puerto de salida.
	goto 	Principal

; Subrutina "TablaVerdad" ---------------------------------------------------------------
;
TablaVerdad
	addwf	PCL,F
	retlw 	b'00001010'				; (Configuración 0).
	retlw 	b'00001001'				; (Configuración 1).
	retlw 	b'00100011'				; (Configuración 2).
	retlw 	b'00001111'				; (Configuración 3).
	retlw 	b'00100000'				; (Configuración 4).
	retlw 	b'00000111'				; (Configuración 5).
	retlw 	b'00010111'				; (Configuración 6).
	retlw 	b'00111111'				; (Configuración 7).

	END

Indexado:

; Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del
; microcontrolador a la que se han conectado):
; -	Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1);
;	SR, Sonda de Rebose (RA2).
; -	Dos bombas de agua: B1 (RB5), B2 (RB6).
; - Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3),
;	Alarma (RB4).
;
; Su funcionamiento: 
; -	Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y
;	se accionarán las dos bombas. El indicador "Vacio" se iluminará .
; -	Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el
; 	depósito con las dos bombas. El indicador "Llenandose" se ilumina.
; -	Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando
;	B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina.
; -	Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1,
;	quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende.
; -	Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por
;	ejemplo que se active la sonda de rebose y no active la de vacío) se paran
;	las dos bombas. El indicador "Alarma" se ilumina.
;
; Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la
; salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:
;
; RA2.. RA0 | RB7 ...          ... RB0
; ------------|--------------------------------
;  0   0   0  |  0   1   1   0   0   0   0   1	(Configuración 0. Estado "Vacio").
;  0   0   1  |  0   1   1   0   0   0   1   0	(Configuración 1. Estado "Llenandose").
;  0   1   0  |  0   0   0   1   0   0   0   0	(Configuración 2. Estado "Alarma").
;  0   1   1  |  0   0   1   0   0   1   0   0	(Configuración 3. Estado "Lleno").
;  1   0   0  |  0   0   0   1   0   0   0   0	(Configuración 4. Estado "Alarma").
;  1   0   1  |  0   0   0   1   0   0   0   0	(Configuración 5. Estado "Alarma").
;  1   1   0  |  0   0   0   1   0   0   0   0	(Configuración 6. Estado "Alarma").
;  1   1   1  |  0   0   0   0   1   0   0   0	(Configuración 7. Estado "Rebose").
;
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0					; El programa comienza en la dirección 0.
Inicio
	clrf	PORTB				; Debe estar a cero cuando el puerto se configure como salida.
	bsf		STATUS,RP0			; Acceso al Banco 1.
	clrf	TRISB				; Las líneas del Puerto B se configuran como salida.
	movlw	b'00011111'			; Las 5 líneas del Puerto A se configuran como entrada.
	movwf	TRISA
	bcf		STATUS,RP0			; Acceso al Banco 0.
Principal
	movf	PORTA,W				; Lee los sensores.
	andlw	b'00000111'			; Máscara para quedarse con el valor de los sensores.
	addwf	PCL,F				; Salta a la configuración adecuada.
	goto	Configuracion0
	goto	Configuracion1
	goto	Configuracion2
	goto	Configuracion3
	goto	Configuracion4
	goto	Configuracion5
	goto	Configuracion6
	goto	Configuracion7
Configuracion0
	movlw 	b'01100001'			; Estado "Vacio" (configuración 0).
	goto	ActivaSalida
Configuracion1
	movlw 	b'01100010'			; Estado "Llenándose" (configuración 1).
	goto	ActivaSalida
Configuracion2
	movlw 	b'00010000'			; Estado "Alarma" (configuración 2).
	goto	ActivaSalida
Configuracion3
	movlw 	b'00100100'			; Estado "Lleno" (configuración 3).
	goto	ActivaSalida
Configuracion4
	movlw 	b'00010000'			; Estado "Alarma" (configuración 4).
	goto	ActivaSalida
Configuracion5
	movlw 	b'00010000'			; Estado "Alarma" (configuración 5).
	goto	ActivaSalida
Configuracion6
	movlw 	b'00010000'			; Estado "Alarma" (configuración 6).
	goto	ActivaSalida
Configuracion7
	movlw 	b'00001000'			; Estado "Rebose" (configuración 7).
ActivaSalida
	movwf	PORTB				; Visualiza por el puerto de salida.
	goto 	Principal

	END

Lo mejor de todo, no tienes que simplificar nada de nada, solo loprogramas directamente y ya está,esloque mesorprendió en su día.

Saludos.

Interesantes ejercicios :slight_smile:

Yo lo que he llegado a ver ha sido hallar tablas de verdad y simplicacion bien por Karnaugh o bien por Algebra de Boole y diseñar el circuito mediante puertas logicas, pero no he llegado a implementar ninguno.

Me has dado otra idea para seguir practicando.

Muchas gracias. :slight_smile:

Buenas:

Lo bueno del asm en PIC, qu epuedes hacer la tabla de la verdad como desees y on tardas nada en entenderlo, ejjejejee.
El de arriba es para el PIC16F84A, si quieres hacerlo en otro PIC diferente, solo tienes que cambiar los registros para adaptarlo al PIC correspondiente. Por ahora, PIC de la firma de Microchip.com es el más usado en todas partes y en asm, luego en C, Arduino se extá impulsado, hasta con el AVR. AVR parece ser que lo ha dejado un poco de lado, no tiene el apoyo al 100 % con Arduino, ahora Arduino, le está dando por ARM, el mejor microcontrolador recomendado, al menos la marca. Está así, para que hagan libros de ARM en español, porque PIC hay de sobre y siguen haciéndolo, Arduino tiene muchos también en poco tiempo y habrá más y en español, solo en AVR no hay ninguno en español, una lástima.

Hay otros ejemploe en asm y en C de CCS para PIC16F886.

Ejemplo en ASM:

;Entradas/salidas digitales: Programa combinacional
;                                                                         
;Según el estado de los interruptores E0 y E1 conectados en RA0 y RA1,
;activar los leds S0-S7 conectados a la puerta B, según la siguiente tabla de la verdad:
;
;	RA1	RA0		RB7	RB6	RB5	RB4	RB3	RB2	RB1	RB0
;	--	--		--	--	--	--	--	--	--	--
;	0	0		1	0	1	0	1	0	1	0
;	0	1		0	1	0	1	0	1	0	1
;	1	0		0	0	0	0	1	1	1	1
;	1	1		1	1	1	1	0	0	0	0
					
		List	p=16F886		;Tipo de procesador
		include	"P16F886.INC"	;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

		__config	_CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF 	;Palabra 1 de configuración
		__config	_CONFIG2, _WRT_OFF									;Palabra 2 de configuración

Temp		equ	0x20			;Variable temporal

			org		0x00
			goto	Inicio		;Vector de reset
			org		0x05

Inicio		clrf 	PORTB		;Borra los latch de salida
			bsf		STATUS,RP0
			bsf		STATUS,RP1	;Selecciona banco 3
			clrf	ANSEL		;Puerta A digital
			clrf	ANSELH		;Puerta B digital
			bcf		STATUS,RP1	;Selecciona banco 1
			clrf	TRISB		;RB7:RB0 se configuran como salida
			movlw	b'00111111'		
			movwf	TRISA		;RA5:RA0 se configuran como entrada
			bcf		STATUS,RP0	;Selecciona banco 0			

Loop:		movf	PORTA,W		;Leer el puerto de entrada
			andlw	b'00000011'	;Máscara para las líneas RA0 y RA1
			btfsc	STATUS,Z	;Están a 00 ?
			goto	Valen_00	;Si
			movwf	Temp		;Almacena el resultado
			movlw	b'00000001'
			subwf	Temp,W
			btfsc	STATUS,Z	;Están a 01 ?
			goto	Valen_01
			movlw	b'00000010'
			subwf	Temp,W
			btfsc	STATUS,Z	;Están a 10 ?
			goto	Valen_10

Valen_11	movlw	b'11110000'
			movwf	PORTB		;Salida de 11110000
			goto	Loop
Valen_00	movlw	b'10101010'
			movwf	PORTB		;Salida de 10101010
			goto	Loop
Valen_01	movlw	b'01010101'
			movwf	PORTB		;Salida de 01010101
			goto	Loop
Valen_10	movlw	b'00001111'
			movwf	PORTB		;Salida de 00001111
			goto	Loop		

			end					;Fin del programa fuente

Ejemplo en C:

/* 
Entradas/salidas digitales: Programa combinacional

Programa combinacional. Según el estado de los interruptores RA0 y RA1, activar
los leds RB0-RB7 conectados a la puerta B, conforme a la siguiente tabla de
la verdad:

RA1 RA0  RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
--- ---  --- --- --- --- --- --- --- ---
 0   0    1   0   1   0   1   0   1   0
 0   1    0   1   0   1   0   1   0   1
 1   0    0   0   0   0   1   1   1   1
 1   1    1   1   1   1   0   0   0   0
*/

#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses 	NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT	//Palabra 1 de configuración
#fuses	NOWRT,BORV40								//Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
 el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#use fast_io (A)
#use fast_io (B)

main()
{
  	output_b(0x0);					//Borra las salidas
	setup_adc_ports(NO_ANALOGS);	//Puertas A y B digitales
  	set_tris_a(0x3F);				//Puerta A entrada
  	set_tris_b(0x00);				//Puerta B salida

	  while(1)
	{
 	   	switch(input_a() & 0b00000011)// Máscara para RA0 y RA1
    	{
      		case 0: output_b(0b10101010); break;
      		case 1: output_b(0b01010101); break;
      		case 2: output_b(0b00001111); break;
      		case 3: output_b(0b11110000); break;
			default:;
    	}
	}
}

Adaptar estos ejemplos en Arduino no es complicado.

Un saludo.

Edito:
Preguntaba los temas digitales y dejar una entrada analógica, ya que esta es para ajustar las revoluciones RPM del centrifugado de una lavadora. Tiene un potenciómetro.

Estoy en primera fase en buscar muchos ejemplos sobre controlar velocidad del motor y cosas así con Arduino, que ya he encontrado por cierto. Le dejo la Web aquí para tener más información y los que quieran aportar ideas al proyecto.

Por otro lado estoy haciendo un simulador de lavadoras para hacer pruebas mediante códigos con Visual Studio .net. Por ahora tengo hecho esto.

Haré un dibujo que se parezca una lavadora con sus Led y botones con el tiempo.

Poryecto placa labadora:

Saludo.

Holaaaaaaaaa:

Más novedad de ka simulación.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Drawing.Drawing2D; // No olvidar.

namespace Lavadora_4
{
    public partial class Form1 : Form
    {
        private Pen lápiz2;
        private Pen lápiz3;
        private Pen lápiz4;
        private float ángulo;
        private SolidBrush agua;

        private GraphicsPath m_lavadora;
        private GraphicsPath m_agua;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Size = new Size(300, 300);
            pictureBox1.BackColor = Color.AntiqueWhite;

            lápiz2 = new Pen(Color.Green, 10);
            lápiz2.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
            lápiz2.EndCap = System.Drawing.Drawing2D.LineCap.RoundAnchor;

            lápiz3 = new Pen(Color.Black);
            lápiz4 = new Pen(Color.Red, 10);

            ángulo = 0;

            agua = new SolidBrush(Color.FromArgb(200, 0, 0, 255)); // Transparencia del agua 200.
            trackBar2.Value = -90; // Para que empiece sin agua.
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);

            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.RotateTransform(ángulo);
            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
            //e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.DrawPath(lápiz2, m_lavadora);
            e.Graphics.ResetTransform();
            e.Graphics.FillPath(agua, m_agua); 
        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            ángulo = (float)trackBar1.Value;
            pictureBox1.Refresh();
        }

        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            int ancho = pictureBox1.ClientSize.Width;
            int alto = pictureBox1.ClientSize.Height;

            m_lavadora = new GraphicsPath();

            m_lavadora.AddEllipse(20, 20, ancho - 40, alto - 40);
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(20, (alto / 2), ancho - 20, (alto / 2));
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(ancho / 2, 20, ancho / 2, alto - 20);
            m_lavadora.CloseFigure();

            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, ancho - 40, alto - 40, trackBar2.Value, 180 - 2 * trackBar2.Value);
            m_agua.CloseFigure();
        }

        private void trackBar2_ValueChanged(object sender, EventArgs e)
        {
            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, pictureBox1.ClientSize.Width - 40, pictureBox1.ClientSize.Height - 40, -trackBar2.Value, 180 - 2 * -trackBar2.Value);
            m_agua.CloseFigure();
            pictureBox1.Refresh();
        }
    }

Ahora toca los tiempos.

Saludo.