Probar si programa abre y cierra bandeja de CD.

Hola:

Quiero que prueben unos programas que he hecho en Visual Studio Community 2017 en sus ordenadores y me comenten sus experiencias.

Lo que hace por ahora es que tiene dos botones, uno abre la bandeja y el otro la cierra.

En uno de los programas solo lo habre y cierra la bandeja si pulsas la tecla correspondiente.
Pulsa A y abre la bandeja, y C la Cierra.

Mientras sigo haciendo más programa, en este caso, abrir y cerrar la bandeja desde Arduino pulsando un botón desde ahí.

Otro programa más que haré, es con Arduino otra vez junto con su LCD, a parte de controlar la bandeja del lector, les dice por pantalla cuando está abierta o no.

¿alguna idea para qué les puede servir estas cosas a parte sobre cosas didacticas?

Saludos.
 

Adjuntos

Dudo mucho que tenga una utilidad práctica el hacer que se abra con un tercer sistema, si eso se puede hacer desde el mismo computador con las APIs, e incluso saber si esta abierto o cerrado..
Me viene a la mente eso de la mosca y la bazuca.

 
Última edición:

D@rkbytes

Moderador
Debe funcionar, siendo que ese proceso está basado en las API de Windows.
Concretamente: mciSendStringA de la librería WINMN.DLL
Si se invoca la llamada correctamente y se interpreta bien el valor retornado, no tiene por qué haber problemas en ningún lenguaje de programación.
Son cosas o "trucos básicos" cuando se empieza a programar software para Windows.
Pero principalmente se debe primero saber si existe unidad de CD-ROM o DVD en la PC o Laptop. (Actualmente es igual para Blu-Ray)
Ejecutando la función getLogicalDrives se puede saber los tipos de unidades existentes.
En VisualBasic también se puede usar Scripts, como Scripting.FileSystemObject
 
Hola:

A mi me funciona. Quiero saber si a ustedes com le van y cuentan sus experiencias.

El que estoy haciendo en este momento y no me sale mucho, es este otro con Arduino.


Su código de Arduino no funciona como quiero, el de Arriba hecho Visual Studio funciona bien.
Código 1:
Código:
int estadoActual1 = 0;
int estadoActual2 = 0;
int estadoUltimo = 0;
int contador = 0;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  Serial.begin(115200);
}

void loop()
{
  estadoActual1 = digitalRead(2);
  delay(10);
  estadoActual2 = digitalRead(2);
  if (estadoActual1 == estadoActual2)
  {
    if (estadoActual1 != estadoUltimo)
    {
      if (estadoActual1 == HIGH)
      {
        contador = contador + 1;
      }
    }
  }
  estadoUltimo = estadoActual1;
  if (contador % 2 == 0 )
  {
    digitalWrite(13, LOW);
    Serial.write("OFF");
  }
  else
  {
    digitalWrite(13, HIGH);
    Serial.write("OFF");
  }
}
Porque suelta muchos OFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFFOFF en vez de uno solo y se queda ahí.

Lo he intentado con este otro código.
Código 2:
Código:
int estadoActual1 = 0;
//int estadoActual2 = 0;   // <<== no nos hace falta
int estadoUltimo = 0;
int contador = 0;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  Serial.begin(115200);
}

void loop()
{
  estadoActual1 = digitalRead(2);
  delay(10);
  if(estadoActual1 == digitalRead(2))  // <<== ahorramos código
  {
    if (estadoActual1 != estadoUltimo)
    {
        contador = 1;   // <<== avisamos de la necesidad de cambiar led
        estadoUltimo = estadoActual1;   // <<== actualizamos
    }
  }
  if(contador)   // <<== si teniamos que cambiar led,...
  {
    digitalWrite(13, estadoActual1);   // <<== cambiamos led
    if(estadoActual1) Serial.write("ON");  // <== enviamos el print segun cambio
    else Serial.write("OFF");
    contador = 0;  // <<== ya hemos cambiado el led
  }
}
Funciona si usas un interruptor, pero no funciona como pulsador.

Descargar.

Saludos.
 

D@rkbytes

Moderador
Con Arduino no te podré colaborar, pero con .Net ibas bien. ;)

Snap1.jpg

Básicamente debe ser lo mismo pero validando una sentencia.
Aunque les hace falta depuración de errores por tiempo de respuesta...
Snap2.jpg
Este problema se mostró en Windows 10 x64
 
No tendrás instalado el último FrameWork 4.6.2.

Ahora lo he compilado con FW .net 4.5.

Ya puedes descargar otra vez, aún así, no olvides actualizar la última versión. Se que estoy usando VS Community 2017 que vino hace días. No todo el mundo tienen el Windows 10 actualziado.

Por cierto. ¿Qué programa es el primero?

Saludos.
 

Adjuntos

He hecho alguna modificación o mezcla entre ambos codigos. No estoy seguro si quieres detectar el flanco de bajada en el pin, pero mira a ver si te funciona esta versión. Disculpa que haya abreviado pero mi telefono móvil no edita muy bien los textos, ya me cuentas:

Código:
int eA= 0,eu=0,c=0;

void setup() {
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  Serial.begin(115200);
} 

void loop() { 
  eA= digitalRead(2); 
  delay(10); 
  if (digitalRead(2)&&eA&&!eU) { 
    if ((c++)&1) { digitalWrite(13, HIGH); Serial.write("ON"); }
    else { digitalWrite(13, LOW); Serial.write("OFF"); }
  }
eU=eA;
}
 
Hola:

Me funciona tu código, aunque me da la sensación que falla la parte de antirebotes del pulsador.

Código:
int eA = 0, eU = 0, c = 0;

void setup() 
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  Serial.begin(115200);
}

void loop()
{
  eA = digitalRead(2);
  delay(10);
  if (digitalRead(2) && eA && !eU)
  {
    if ((c++) & 1) {
      digitalWrite(13, HIGH);
      Serial.write("ON");
    }
    else
    {
      digitalWrite(13, LOW);
      Serial.write("OFF");
    }
  }
  eU = eA;
}
En la primera variable va eU, no eu. Fue el únbico fallo que no me dejaba compilar.

Al menos ya funciona en su mayoría.

Lo qu eme he dado cuenta, es que si dejo la tapa abierta desde C#, la cierro directamente con la mano, el programa me dice estar abierto todavía. Debo averiguar si existe la posibilidad de que si lo hago manualmente directamente desde el botón de la bandeja, me aparezca en C# los mensajes de Abierto y Cerrado.

Ahora voy con la LCD keypad Shield con tu código, si me lo permites.

Saludos.
 
Última edición:

D@rkbytes

Moderador
No tendrás instalado el último FrameWork 4.6.2.

Ahora lo he compilado con FW .net 4.5
Si la aplicación se ejecuta, quiere decir que el .Net Framework instalado la soporta.

Pero husmeando en el registro, tengo estas versiones instaladas... .Net Framework.jpg
Los problemas como el que mostré, no se dan por el Framework de creación o el instalado, se deben más que nada a una falta de depuración por parte del programador.

No todo el mundo tiene el Windows 10 actualizado.
Yo sí, aunque omito y elimino todo el spyware de Windows 10.
Por cierto. ¿Qué programa es el primero?
Se llama Detect It Easy
 
@D@rkbytes
No me da problemas nunca de ese tipo en mi ordandor.

El FrameWork se mira también en los programas que tienes instalados. Por si acaso, se descarga desde aquí.
https://www.microsoft.com/es-es/download/details.aspx?id=53344

Si instalas Visual Studio Community, se te instala automaticamente si o si.

Gracias por el programa.

@@palurdo
Parece que va mejor. Me funcona bien. Por fin.

Ahora usaré tu código y probar con la pantalla LCD haber que tal queda. ;)



Edito:

Hice el del LCD y no envía comandos al puerto, ni se inmuta el programa C# ni la bandeja.
Código:
// Librería para el LCD.
#include <LiquidCrystal.h>

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

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

int eA = 0, eU = 0, c = 0;

void setup()
{
  pinMode(13, OUTPUT);  // Salida digital para el pin 13.
  pinMode(2, INPUT);    // Entrada digital pin 2.
  Serial.begin(115200); // Baudios del puerto serie.
  lcd.begin(16, 2);     // Formato de pantalla.
  lcd.setCursor(0, 0); // Crusor en la primera línea del LCD.
  lcd.print("Bandeja lector:");
}

void loop()
{
  eA = digitalRead(2);

  delay(50);

  if (digitalRead(2) && eA && !eU)
  {
    if ((c++) & 1) {
      digitalWrite(13, HIGH);
      Serial.write("ON");
      lcd.setCursor(0, 1); // Crusor en la segunda línea del LCD.
      lcd.print("Abierto.        ");
    }
    else
    {
      digitalWrite(13, LOW);
      Serial.write("OFF");
      lcd.setCursor(0, 1); // Crusor en la segunda línea del LCD.
      lcd.print("Cerrado.        ");
    }
  }
  eU = eA;
}
Si solo le puse el LCD, lo demás es igual. Probé solo el anterior y si funciona, si vuelvo a probar este, pues no.

Saludos.
 
Última edición:
Parece raro. Ves comentando líneas de las modificaciones del LCD hasta que el programa vuelva a funcionar, ahí se puede intuir cual es el problema.
 
Hola:

Antes que nada, pongo el primer código documentado por si acaso.
Código:
bool estadoActual = false, estadoUltimo, contador = false;
const byte LED = 13;
const byte boton = 2;

void setup()
{
  pinMode(LED, OUTPUT); // Pin 113 como salida, para el Led.
  pinMode(boton, INPUT); // Pin 2 como entrada.
  Serial.begin(115200); // Velocidad en baudios para el puerto serie.
}

void loop()
{
  estadoActual = digitalRead(boton); // Guarda el estado del pulsador.
  delay(50); // Retardo de 50 mili segundos par evitar antirebotes.

  // ¿Pulsador y estadoActual y negación del estadoUltimo es verdadero?
  if (digitalRead(boton) && estadoActual && !estadoUltimo)
  {
    contador = !contador;   // Cambio el estado tipo boleano.

    if (contador)
    {
      digitalWrite(LED, HIGH); // Enciende el Led 13.
      Serial.write("ON"); // Envía por el puerto ON.
    }
    else
    {
      digitalWrite(LED, LOW); // Apaga el Led 13.
      Serial.write("OFF"); // Envía por el puerto OFF.
    }
  }

  // Pasa del estadoActual a estadoUltimo.
  estadoUltimo = estadoActual;
}
Hice otro igual para el LCD.
Código:
 // Librería para el LCD.
#include <LiquidCrystal.h>

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

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

bool estadoActual = false, estadoUltimo, contador = false;
const byte LED = 13;
const byte boton = 2;

void setup()
{
  pinMode(LED, OUTPUT); // Pin 113 como salida, para el Led.
  pinMode(boton, INPUT); // Pin 2 como entrada.
  Serial.begin(115200); // Velocidad en baudios para el puerto serie.
  lcd.begin(16, 2);     // Formato de pantalla.
  lcd.setCursor(0, 0); // Crusor en la primera línea del LCD.
  lcd.print("Bandeja lector:");
}

void loop()
{
  estadoActual = digitalRead(boton); // Guarda el estado del pulsador.
  delay(50); // Retardo de 50 mili segundos par evitar antirebotes.

  // ¿Pulsador y estadoActual y negación del estadoUltimo es verdadero?
  if (digitalRead(boton) && estadoActual && !estadoUltimo)
  {
    contador = !contador;   // Cambio el estado tipo boleano.

    if (contador)
    {
      digitalWrite(LED, HIGH); // Enciende el Led 13.
      Serial.write("ON"); // Envía por el puerto ON.
      lcd.setCursor(0, 1); // Crusor en la segunda línea del LCD.
      lcd.print("Abierto.        ");
    }
    else
    {
      digitalWrite(LED, LOW); // Apaga el Led 13.
      Serial.write("OFF"); // Envía por el puerto OFF.
      lcd.setCursor(0, 1); // Crusor en la segunda línea del LCD.
      lcd.print("Cerrado.        ");
    }
  }

  // Pasa del estadoActual a estadoUltimo.
  estadoUltimo = estadoActual;
}
He hecho lo que dijiste y todavía no me cambia ni el Led 13.

Saludos.
 
Me refería a comentar todas las modificaciones hasta que funcione, y luego ir descomentando una a una de arriba a abajo hasta que deje de funcionar.

Código:
 // Librería para el LCD.
//#include <LiquidCrystal.h>

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

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

bool estadoActual = false, estadoUltimo, contador = false;
const byte LED = 13;
const byte boton = 2;

void setup()
{
  pinMode(LED, OUTPUT); // Pin 113 como salida, para el Led.
  pinMode(boton, INPUT); // Pin 2 como entrada.
  Serial.begin(115200); // Velocidad en baudios para el puerto serie.
//  lcd.begin(16, 2);     // Formato de pantalla.
//  lcd.setCursor(0, 0); // Crusor en la primera línea del LCD.
//  lcd.print("Bandeja lector:");
}

void loop()
{
  estadoActual = digitalRead(boton); // Guarda el estado del pulsador.
  delay(50); // Retardo de 50 mili segundos par evitar antirebotes.

  // ¿Pulsador y estadoActual y negación del estadoUltimo es verdadero?
  if (digitalRead(boton) && estadoActual && !estadoUltimo)
  {
    contador = !contador;   // Cambio el estado tipo boleano.

    if (contador)
    {
      digitalWrite(LED, HIGH); // Enciende el Led 13.
      Serial.write("ON"); // Envía por el puerto ON.
    //  lcd.setCursor(0, 1); // Crusor en la segunda línea del LCD.
    //  lcd.print("Abierto.        ");
    }
    else
    {
      digitalWrite(LED, LOW); // Apaga el Led 13.
      Serial.write("OFF"); // Envía por el puerto OFF.
    //  lcd.setCursor(0, 1); // Crusor en la segunda línea del LCD.
   //   lcd.print("Cerrado.        ");
    }
  }

  // Pasa del estadoActual a estadoUltimo.
  estadoUltimo = estadoActual;
}
Por ejemplo si deja de funcionar en el lcd.begin del setup, puede que haya un problema de conflicto de puertos.
 
Por eso, quitas la doble barra al #include y compilas y pruebas.¿funciona?, Pues quitas la doble barra a LyquidCrystal lcd... compilas y pruebas, y así con cada línea de código comentada hasta que deje de funcionar, de esa manera creo que se puede acotar el fallo.
 
Ya funciona, lo tenía el cable conectado del botón al pin 3 en vez del 2, ajjajajajajajajaja.

En C# cuando abres la bandeja pone los pasos.

Abriendo...
Abierto.

Lo mismo para cerrar.
Cerrando...
Cerrado.

En el LCD solo si pulsas el botón te dice Abierto o Cerrado. Quiero hacer lo mismo y debo encontrar la forma, si es que se puede hacer, claro que si. Deja probar haciendo esto:

Cuando C# detecta el pulsador, que le llega ON, pasa al mensaje Abriendo..., en ese momento debo poner hacia a Arduino tramas de bytes, por ejemplo "ABRIENDO" que al leer lo muestra en el LCD.

Cuando esté abierto completamente la bandeja del lector, desde C# le manda a Arduino "ABIERTO".

Así que ahora me toca modificar el código de Arduino, que en realidad es otro ejemplo más.

Aunque soy partidiario de dejar las palabras Abriendo..., Abierto, Cerrando... y Cerrado dejarlo dentro de Arduino, desde C# entonces enviaré solo algún comando y más corto.

C# envía| Arduino LCD muestra
AB | Abriendo...
AO | Abierto.
CE | Cerrando...
CO | Cerrado.

Sigo con el código, gracias a todos por la ayuda, luego, les paso el nuevo código.

Saludos.
 
Hola de nuevo:

Ya me funciona el programa tanto de Arduino para el LCD y para C# en el cual les dejo en su descarga, prueben y me cuenten sus experiencias.



Se usa la pantalla LCD Keypad Shield.


El código fuente lo encuentras pulsando el botón "CF Arduino".

Espero sus sugerencias.

Que tengan buen día.
 

Adjuntos

Hola:


Quiero ahcer un programa con Visual Basic 6 abrir y cerrar la bandeja del lector de discos. Con Visual Basic .net 2017 funciona de maravilla, pero no se programa igual de VB 6 al VB 2017.
Para facilitarles la tarea les dejo un ejemplo hecho con VB 2017. Así podrán ayudarme a pasarlo a VB 6 si es posible.



Código:
Imports System.Runtime.InteropServices
Imports System.Text

Public Class Form1
    <DllImport("winmm.dll")>
    Public Shared Function mciSendString(lpstrCommand As String, lpstrReturnString As StringBuilder,
                                         uReturnLength As Integer, hwndCallback As IntPtr) As Int32
    End Function

    Private rt As New StringBuilder(127)

    Private Sub Button_Abrir_Click(sender As Object, e As EventArgs) Handles Button_Abrir.Click
        Label_Mensaje.Text = "Abriendo..."
        Application.DoEvents()
        mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero)

        ' Si quieres por ejemplo elegir la unidad que quieras, en este caso la H, se le asigana !H
        ' como indica abajo. En vez de CDAudio, CDAudio!H.
        'mciSendString("set CDAudio!H door open", rt, 127, IntPtr.Zero);

        Label_Mensaje.Text = "Abierto."
    End Sub

    Private Sub Button_Cerrar_Click(sender As Object, e As EventArgs) Handles Button_Cerrar.Click
        Label_Mensaje.Text = "Cerrando..."
        Application.DoEvents()
        mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero)
        Label_Mensaje.Text = "Cerrado."
    End Sub
End Class
¿Alguna posibilidad? Saludos.
 
Meta dijo:
Hola:


Quiero ahcer un programa con Visual Basic 6 abrir y cerrar la bandeja del lector de discos. Con Visual Basic .net 2017 funciona de maravilla, pero no se programa igual de VB 6 al VB 2017.
Para facilitarles la tarea les dejo un ejemplo hecho con VB 2017. Así podrán ayudarme a pasarlo a VB 6 si es posible.
https://social.msdn.microsoft.com/Forums/getfile/1159839


Código:
Imports System.Runtime.InteropServices
Imports System.Text

Public Class Form1
    <DllImport("winmm.dll")>
    Public Shared Function mciSendString(lpstrCommand As String, lpstrReturnString As StringBuilder,
                                         uReturnLength As Integer, hwndCallback As IntPtr) As Int32
    End Function

    Private rt As New StringBuilder(127)

    Private Sub Button_Abrir_Click(sender As Object, e As EventArgs) Handles Button_Abrir.Click
        Label_Mensaje.Text = "Abriendo..."
        Application.DoEvents()
        mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero)

        ' Si quieres por ejemplo elegir la unidad que quieras, en este caso la H, se le asigana !H
        ' como indica abajo. En vez de CDAudio, CDAudio!H.
        'mciSendString("set CDAudio!H door open", rt, 127, IntPtr.Zero);

        Label_Mensaje.Text = "Abierto."
    End Sub

    Private Sub Button_Cerrar_Click(sender As Object, e As EventArgs) Handles Button_Cerrar.Click
        Label_Mensaje.Text = "Cerrando..."
        Application.DoEvents()
        mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero)
        Label_Mensaje.Text = "Cerrado."
    End Sub
End Class
¿Alguna posibilidad? Saludos.
tiempo que ya no toco el 6 ya no tiene razón seguir usándolo
usa un código hecho

https://www.lawebdelprogramador.com...1954-Abrir-y-cerrar-la-unidad-del-CD-DVD.html

usa la misma apì con algunas diferencias como cambiar el long por int
 

Temas similares


Arriba