• CD unit open and close program making a simple robot from computer components

    CarltonBirch Member

    I am making a really simple robot from computer components. I need a program that will open and close cd units in a time period of 5 seconds. There will be 2 cd units. So my idea is to make a program that will open the cd unit then keep it opened for 5 sec and then close it. I can sort this out with hardware accessories some electrical timers. But i want to see if i can keep it single with a program. It should run on windows xp platform.

  • Ganesh Member

    I did some googling and it turns out it is possible to write this program in c++ or VB ? so if anyone is willing to help it would be nice!

  • ShikhaTan Member

    I have some basic knowledge of c++ so if there is a good article out there on this i think i would be able to write it. But if someone is willing to write it for me which should take too long i think it would be perfect. As i sad i am on a project to make a robot so i have a lot of work on hardware and really little time.

  • SapnaVishwas Member

    in python using pygame

    import pygame.cdrom as cdrom
    cdrom.init()
    cd = cdrom.CD(0) # 0 = first cdrom device
    cd.init()
    cd.eject()
    cd.quit()
    cdrom.quit()
    
  • Amit Member

    To do it in C++, use CreateFile() and give it the drive letter for the file name. When you have the handle, you can use DeviceIoControl() and use IOCTL_STORAGE_EJECT_MEDIA or IOCTL_STORAGE_LOAD_MEDIA. For a simple timer, you can use GetTickCount(). If you need something better, you can use QueryPerformanceCounter().

    CreateFile

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx

    DeviceIoControl

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363216%28v=vs.85%29.aspx

    GetTickCount

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408%28v=vs.85%29.aspx

    QueryPerformanceCounter

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904%28v=vs.85%29.aspx

    Below is a simple program that will open and close all your CD trays.

    #include 
    #include 
    
    #define MAXBUFFER 512
    
    int _tmain()
    {
       HANDLE hDrive;
       TCHAR drives[MAXBUFFER];
    
       if (GetLogicalDriveStrings(MAXBUFFER - 1, drives))
       {
          DWORD temp;
          TCHAR * ptrDrives = drives;
          TCHAR strDrive[] = TEXT("\\\\.\\ :");
    
          do
          {
             if (GetDriveType(ptrDrives) == DRIVE_CDROM)
             {
                *(strDrive + 4) = *ptrDrives;
    
                hDrive = CreateFile(strDrive, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
                if (hDrive == INVALID_HANDLE_VALUE)
                   break;
    
                if (!DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &temp, NULL))
                {
                   CloseHandle(hDrive);
                   break;
                }
    
                if (!DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &temp, NULL))
                {
                   CloseHandle(hDrive);
                   break;
                }
    
                CloseHandle(hDrive);
             }
             while (*ptrDrives++);
          } while (*ptrDrives);
       }
    
       return 0;
    }
    
  • SapnaVishwas Member

    Here it is. It is done in Visual studio. Works perfectly except the first cycle. ( it opens and closes the first driver without delay). But after that it just does what is suppose to do.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            [System.Runtime.InteropServices.DllImport("winmm.dll", EntryPoint = "mciSendStringA")]
            public static extern void mciSendStringA(string lpstrCommand, string lpstrReturnString, long uReturnLength, long hwndCallback);
    
           
    
            string rt = "";
    
    
            private void button1_Click(object sender, EventArgs e)
            {           
                timer1.Interval = 1000 * 5; //timer to open first and close second
                timer1.Enabled = true;
                timer1.Start();
                timer2.Interval = 1000 * 5; //revers timer
                timer2.Enabled = true;
                mciSendStringA("open D: type CDAudio alias driveD", rt, 127, 0); //defining driver
                mciSendStringA("open E: type CDAudio alias driveE", rt, 127, 0);
            }
    
            private void button2_Click(object sender, EventArgs e)
            {           
                //test button
    
                mciSendStringA("set driveF door open", rt, 127, 0);
                MessageBox.Show("Radi li");
            }       
    
           
            private void timer1_Tick(object sender, EventArgs e)
            {
                //open first close second
                mciSendStringA("set driveE door closed", rt, 127, 0);
                mciSendStringA("set driveD door open", rt, 127, 0);
                //MessageBox.Show("start");
                timer1.Stop();
                timer2.Start();
            }
    
            private void timer2_Tick(object sender, EventArgs e)
            {
                //open second close first
                mciSendStringA("set driveD door closed", rt, 127, 0);
                mciSendStringA("set driveE door open", rt, 127, 0);
                //MessageBox.Show("stop");
                timer2.Stop();
                timer1.Start();
            }
    
        }
    }
    
Viewing 5 reply threads
  • You must be logged in to reply to this topic.
en_USEnglish