USB Kontrol Aygıtı // USB HID CONTROL DEVICE


usb control deviceArkadaşlar bu projemde USB üzerinden bir kontrol devresi üretmeyi amaçladım.Devremde daha fazla tanıdığım mikrokontroller ailesi olduğu için PIC18F4550 ve dil olarak daha alıştığım için de microC kullandım. Bilgisayar da ki arayüzü ise Visual Studio 2010 içerisinde bulunan C# ile hazırladım. Devremin microC v4.60 için yazılmış kaynak kodu aşağıdaki gibidir. PIC gelen bilgiye göre fazla bir işlem yapmadan gene switch-case döngüsü içerisinde gelen bilgiye göre işlem yapıyor. Açıkçası temel bir uygulama olduğu için PIC’e fazla bir iş yüklemedim. Ama istendiği taktirde istenen alt programlar rahatlıkla eklenebilir.

microC kendi içindeki HID Terminal modülünde PIC’e ait USBdsc dosyasını derliyor. Siz sadece VID ve PID numaralarını belirliyorsunuz.

Ben programda kontrol devresi olduğu için bilgisayardan sadece bilgi gönderdim. Tersi işlemleride aynı zorlukta halletmek oldukça kolay. (microC sağolsun!)

Gelelim devrenin çalışmasına;
PIC’in RD portunu çıkış olarak aldım. Gelen bilgiye göre, (örneğin “0x20” RD0 bitini “0” “0x30” ise aynı biti “1” yapıyor.) RD portundaki bitler “1” ve “0” değeri alıyorlar. Ben gene devremi gene developmend board(EasyPic6) üzerinde denedim. RD portunun LED’leri benim için çıkış bilgisi. İleride (yakın bir gelecekte) devremi röle çıkışları bulunan bir yapıda uygulamayı planlıyorum.
Devremde bir de 2×16 LCD bulunmakta. Açıkçası bunu bende sorduladım. USB kablosu en uzun 120 cm civarında iken LCD’ye gerek var mı? Tartışılır… LCD üzerinden devrenin çışışlarını “1” ve “0” olarak görmek mümkün. Belki bilgisayardaki program problem oluşturursa buradaki bilgiler faydalı olabilir.

Bilgisayar Programı;
Daha önceden de belirttiğim gibi programı C# da yazdım. Programımın bir takım bug’ları ve hataları olabilir. Ya da burası şöle olsa daha iyi olabilir diyebileceğiniz ayrıntılar vardır. Lütfen bu konuda bana mail atın.[ erkan@erkancil.net ]

Programım RD portunu kontrol ettiği için doğal olarak 8 ayrı timer bilgisi var.

  • Temel fonksyonlar ise;
    -Manuel olarak açık kapama;
    -Belirlenen bir süre sonra TURN-ON;
    -Belirlenen bir süre sonra TURN-OFF;
    -Turn>ON>OFF döngüsü;
    -Turn>OFF>ON döngüsü;
  1. TURN-ON: Belirlenen bir süre sonra açar.
  2. TURN-OFF:Belirlenen bir süre sonra kapatır.
  3. Turn>ON>OFF ve Turn>OFF>ON : Sonsuz açıp kapama döngüsü.

Aslında, Turn>ON>OFF döngüsü ve Turn>OFF>ON döngüsü ilk turdan sonra aynı olsa da uzun süreli işlemlerde önemli olabileceği için ayrı ayrı yazmayı uygun gördüm.

Sorusu olan? (çok mu öğretmen vari oldu? 😀 )

Saygılarımla Erkan ÇİL

12/10/2011
Kozan / ADANA

USB HID CONTROL DEVICE PROGRAMI VE AŞAĞIDAKİ PIC PROGRAMININ HEX OLARAK DERLENMİŞ HALİ…
http://tinyurl.com/USBkontrolCihazi

usb control device


usbControlDevice



usb control device PCB

 

usbControlDevice.c

/*------------------------------------------*/
/*             USB CONTROL DEVICE           */
/*             OUTPUT TIMER FOR PORTD       */
/*             mcu PIC18F4550               */
/*             PROJECT BY                   */
/*             ERKAN CIL                    */
/*------------------------------------------*/

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

unsigned char readbuff[64] absolute 0x500;
unsigned char writebuff[64] absolute 0x540;

char cnt;
char kk;

char txt1[] = "www.erkancil.net";
char txt2[] = "USB";
char txt3[] = "CONTROL DEVICE";
char txt4[] = "CONTROL DEVICE";
char txt5[] = "PROJECT";
char txt6[] = "By   ERKAN CiL";
char txt7[] = "..ENJOY CODING..";
char i;

void OpenScreen() {
Lcd_Init();

  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Lcd_Out(1,1,txt1);
  Delay_ms(3000);
  Lcd_Cmd(_LCD_CLEAR);

  Lcd_Out(1,8,txt2);
  Lcd_Out(2,2,txt3);
  Delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);

  Lcd_Out(1,2,txt4);
  Lcd_Out(2,5,txt5);
  Delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);

  Lcd_Out(1,2,txt6);
  Lcd_Out(2,1,txt7);
  Delay_ms(5000);
  Lcd_Cmd(_LCD_CLEAR);
  }
void main(void){
  ADCON1 |= 0x0F;
  CMCON  |= 7;
  TRISD = 0x00;
  PORTD = 0x00;

  HID_Enable(&readbuff,&writebuff);
  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);
  OpenScreen();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Out(1,1,"*0*1*2*3*4*5*6*7");
  Lcd_Out(2,1,"*0*0*0*0*0*0*0*0");
  while(1){
    USB_Polling_Proc();
    kk = HID_Read();
    if(kk != 0){
       for(cnt=0;cnt < 64;cnt++)
        writebuff[cnt]=readbuff[cnt];

        switch(readbuff[0])
        {
        case 0x20 : RD0_bit = 0; Lcd_Out(2,1,"*0"); break;
        case 0x21 : RD1_bit = 0; Lcd_Out(2,3,"*0"); break;
        case 0x22 : RD2_bit = 0; Lcd_Out(2,5,"*0"); break;
        case 0x23 : RD3_bit = 0; Lcd_Out(2,7,"*0"); break;
        case 0x24 : RD4_bit = 0; Lcd_Out(2,9,"*0"); break;
        case 0x25 : RD5_bit = 0; Lcd_Out(2,11,"*0"); break;
        case 0x26 : RD6_bit = 0; Lcd_Out(2,13,"*0"); break;
        case 0x27 : RD7_bit = 0; Lcd_Out(2,15,"*0"); break;

        case 0x30 : RD0_bit = 1; Lcd_Out(2,1,"*1"); break;
        case 0x31 : RD1_bit = 1; Lcd_Out(2,3,"*1"); break;
        case 0x32 : RD2_bit = 1; Lcd_Out(2,5,"*1"); break;
        case 0x33 : RD3_bit = 1; Lcd_Out(2,7,"*1"); break;
        case 0x34 : RD4_bit = 1; Lcd_Out(2,9,"*1"); break;
        case 0x35 : RD5_bit = 1; Lcd_Out(2,11,"*1"); break;
        case 0x36 : RD6_bit = 1; Lcd_Out(2,13,"*1"); break;
        case 0x37 : RD7_bit = 1; Lcd_Out(2,15,"*1"); break;

        }

    }
  }
}

USBdsc.c

void USB_Init_Desc();
const unsigned int USB_VENDOR_ID = 0x1234;
const unsigned int USB_PRODUCT_ID = 0x1234;
const char USB_SELF_POWER = 0xC0;            // Self powered 0xC0,  0x80 bus powered
const char USB_MAX_POWER = 50;               // Bus power required in units of 2 mA
const char HID_INPUT_REPORT_BYTES = 64;
const char HID_OUTPUT_REPORT_BYTES = 64;
const char USB_TRANSFER_TYPE = 0x03;         //0x03 Interrupt
const char EP_IN_INTERVAL = 1;
const char EP_OUT_INTERVAL = 1;

const char USB_INTERRUPT = 0;
const char USB_HID_EP = 1;
const char USB_HID_RPT_SIZE = 33;

/* Device Descriptor */
const struct {
    char bLength;               // bLength         - Descriptor size in bytes (12h)
    char bDescriptorType;       // bDescriptorType - The constant DEVICE (01h)
    unsigned int bcdUSB;        // bcdUSB          - USB specification release number (BCD)
    char bDeviceClass;          // bDeviceClass    - Class Code
    char bDeviceSubClass;       // bDeviceSubClass - Subclass code
    char bDeviceProtocol;       // bDeviceProtocol - Protocol code
    char bMaxPacketSize0;       // bMaxPacketSize0 - Maximum packet size for endpoint 0
    unsigned int idVendor;      // idVendor        - Vendor ID
    unsigned int idProduct;     // idProduct       - Product ID
    unsigned int bcdDevice;     // bcdDevice       - Device release number (BCD)
    char iManufacturer;         // iManufacturer   - Index of string descriptor for the manufacturer
    char iProduct;              // iProduct        - Index of string descriptor for the product.
    char iSerialNumber;         // iSerialNumber   - Index of string descriptor for the serial number.
    char bNumConfigurations;    // bNumConfigurations - Number of possible configurations
} device_dsc = {
      0x12,                   // bLength
      0x01,                   // bDescriptorType
      0x0200,                 // bcdUSB
      0x00,                   // bDeviceClass
      0x00,                   // bDeviceSubClass
      0x00,                   // bDeviceProtocol
      8,                      // bMaxPacketSize0
      USB_VENDOR_ID,          // idVendor
      USB_PRODUCT_ID,         // idProduct
      0x0001,                 // bcdDevice
      0x01,                   // iManufacturer
      0x02,                   // iProduct
      0x00,                   // iSerialNumber
      0x01                    // bNumConfigurations
  };

/* Configuration 1 Descriptor */
const char configDescriptor1[]= {
    // Configuration Descriptor
    0x09,                   // bLength             - Descriptor size in bytes
    0x02,                   // bDescriptorType     - The constant CONFIGURATION (02h)
    0x29,0x00,              // wTotalLength        - The number of bytes in the configuration descriptor and all of its subordinate descriptors
    1,                      // bNumInterfaces      - Number of interfaces in the configuration
    1,                      // bConfigurationValue - Identifier for Set Configuration and Get Configuration requests
    0,                      // iConfiguration      - Index of string descriptor for the configuration
    USB_SELF_POWER,         // bmAttributes        - Self/bus power and remote wakeup settings
    USB_MAX_POWER,          // bMaxPower           - Bus power required in units of 2 mA

    // Interface Descriptor
    0x09,                   // bLength - Descriptor size in bytes (09h)
    0x04,                   // bDescriptorType - The constant Interface (04h)
    0,                      // bInterfaceNumber - Number identifying this interface
    0,                      // bAlternateSetting - A number that identifies a descriptor with alternate settings for this bInterfaceNumber.
    2,                      // bNumEndpoint - Number of endpoints supported not counting endpoint zero
    0x03,                   // bInterfaceClass - Class code
    0,                      // bInterfaceSubclass - Subclass code
    0,                      // bInterfaceProtocol - Protocol code
    0,                      // iInterface - Interface string index

    // HID Class-Specific Descriptor
    0x09,                   // bLength - Descriptor size in bytes.
    0x21,                   // bDescriptorType - This descriptor's type: 21h to indicate the HID class.
    0x01,0x01,              // bcdHID - HID specification release number (BCD).
    0x00,                   // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h.
    1,                      // bNumDescriptors - Number of subordinate report and physical descriptors.
    0x22,                   // bDescriptorType - The type of a class-specific descriptor that follows
    USB_HID_RPT_SIZE,0x00,  // wDescriptorLength - Total length of the descriptor identified above.

    // Endpoint Descriptor
    0x07,                   // bLength - Descriptor size in bytes (07h)
    0x05,                   // bDescriptorType - The constant Endpoint (05h)
    USB_HID_EP | 0x80,      // bEndpointAddress - Endpoint number and direction
    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
    EP_IN_INTERVAL,         // bInterval - Service interval or NAK rate

    // Endpoint Descriptor
    0x07,                   // bLength - Descriptor size in bytes (07h)
    0x05,                   // bDescriptorType - The constant Endpoint (05h)
    USB_HID_EP,             // bEndpointAddress - Endpoint number and direction
    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
    EP_OUT_INTERVAL         // bInterval - Service interval or NAK rate
};

const struct {
  char report[USB_HID_RPT_SIZE];
}hid_rpt_desc =
  {
     {0x06, 0x00, 0xFF,       // Usage Page = 0xFF00 (Vendor Defined Page 1)
      0x09, 0x01,             // Usage (Vendor Usage 1)
      0xA1, 0x01,             // Collection (Application)
  // Input report
      0x19, 0x01,             // Usage Minimum
      0x29, 0x40,             // Usage Maximum
      0x15, 0x00,             // Logical Minimum (data bytes in the report may have minimum value = 0x00)
      0x26, 0xFF, 0x00,       // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
      0x75, 0x08,             // Report Size: 8-bit field size
      0x95, HID_INPUT_REPORT_BYTES,// Report Count
      0x81, 0x02,             // Input (Data, Array, Abs)
  // Output report
      0x19, 0x01,             // Usage Minimum
      0x29, 0x40,             // Usage Maximum
      0x75, 0x08,             // Report Size: 8-bit field size
      0x95, HID_OUTPUT_REPORT_BYTES,// Report Count
      0x91, 0x02,             // Output (Data, Array, Abs)
      0xC0}                   // End Collection
  };

//Language code string descriptor
const struct {
  char bLength;
  char bDscType;
  unsigned int string[1];
  } strd1 = {
      4,
      0x03,
      {0x0409}
    };

//Manufacturer string descriptor
const struct{
  char bLength;
  char bDscType;
  unsigned int string[16];
  }strd2={
    34,           //sizeof this descriptor string
    0x03,
    {'w','w','w','.','e','r','k','a','n','c','i','l','.','n','e','t'}
  };

//Product string descriptor
const struct{
  char bLength;
  char bDscType;
  unsigned int string[23];
}strd3={
    32,          //sizeof this descriptor string
    0x03,
    {'U','S','B',' ','H','I','D',' ','C','O','N','T','R','O','L'}
 };

//Array of configuration descriptors
const char* USB_config_dsc_ptr[1];

//Array of string descriptors
const char* USB_string_dsc_ptr[3];

void USB_Init_Desc(){
  USB_config_dsc_ptr[0] = &configDescriptor1;
  USB_string_dsc_ptr[0] = (const char*)&strd1;
  USB_string_dsc_ptr[1] = (const char*)&strd2;
  USB_string_dsc_ptr[2] = (const char*)&strd3;
}

Çalışmanın Videosu;

Uygulamanın Videosu;

  1. #1 by kametem on 16 Şubat 2013 - 13:30

    üstadım merhaba.
    Bu çalışmanızın dosyalarına ulaşamıyorum.(silinmiş).dosyalarınızı en son proje haliyle bana gönderebilirseniz sevinirim.

    • #2 by Erkan ÇİL on 25 Aralık 2013 - 10:23

      link yanilenmiştir. Teşekkürler

  2. #3 by serkan tapan on 04 Kasım 2013 - 14:48

    slm hocam cok guzel olmus ama zip indirme linki omus yenilerseniz sevinirim ellerinize saglik

    • #4 by Erkan ÇİL on 25 Aralık 2013 - 10:23

      link yanilenmiştir. Teşekkürler

  3. #5 by murat on 01 Kasım 2014 - 10:50

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

    namespace led_kontrol
    {
    public partial class Form1 : Form
    {
    byte sayi = 0;
    protected override void OnHandleCreated(EventArgs e)
    {
    base.OnHandleCreated(e);
    usbHidPort1.RegisterHandle(Handle);
    }
    protected override void WndProc(ref Message m)
    {
    usbHidPort1.ParseMessages(ref m);
    base.WndProc(ref m);
    }
    public Form1()
    {
    InitializeComponent();
    }
    private void usb_gonder(byte veri)
    {
    byte[] dizi = new byte[usbHidPort1.SpecifiedDevice.OutputReportLength + 1];
    dizi[0] = 0;
    dizi[1] = veri;
    for (int i = 2; i < textBox1.Text.Length; i++) { dizi[i] = 0xFF; }
    if (usbHidPort1.SpecifiedDevice != null)
    {
    usbHidPort1.SpecifiedDevice.SendData(dizi);
    }
    else
    {
    MessageBox.Show("USB cihaz hazır değil, cihazı takınız!.. ");
    }
    }
    private void Form1_Load(object sender, EventArgs e)
    {
    toolStripStatusLabel1.Text = " Herhangi bir USB Cihaz baglı degil!..";
    checkBox1.Checked = true;
    checkBox2.Checked = false;
    }
    private void usbHidPort1_OnSpecifiedDeviceArrived(object sender, EventArgs e)
    {
    toolStripStatusLabel1.Text = " Hikko USB HID (PIC18F4550) Cihazı baglandı!";
    }
    private void usbHidPort1_OnDeviceArrived(object sender, EventArgs e)
    {
    toolStripStatusLabel1.Text = " Herhangi bir USB Cihaz bağlandı!";
    }
    private void usbHidPort1_OnDeviceRemoved(object sender, EventArgs e)
    {
    toolStripStatusLabel1.Text = " Hikko USB HID (PIC18F4550) Cihazı çıkarıldı!";
    }
    private void button2_Click(object sender, EventArgs e)
    {
    try
    {
    usbHidPort1.VendorId = Convert.ToInt32(textBox1.Text);
    usbHidPort1.ProductId = Convert.ToInt32(textBox2.Text);
    if ((usbHidPort1.VendorId == 4660) & (usbHidPort1.ProductId == 4660))
    {
    usbHidPort1.CheckDevicePresent();
    }
    else
    {
    MessageBox.Show("Yanlıs Vendor ID veya Product ID giridiniz!..");
    }
    }
    catch
    {
    MessageBox.Show("Vendor ID ile Product ID girmelisiniz!..");
    }
    }
    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    if (textBox3.Text != "")
    {
    if (checkBox1.Checked)
    sayi = Byte.Parse(textBox3.Text, System.Globalization.NumberStyles.HexNumber);
    if (checkBox2.Checked)
    sayi = Convert.ToByte(textBox3.Text);
    }
    usb_gonder(sayi);
    }
    catch
    {
    MessageBox.Show("Hikko USB HID (PIC18F4550) Cihazı baglı degil!");
    textBox3.Text = "0";
    }
    }
    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
    if (checkBox1.Checked) checkBox2.Checked = false;
    if (checkBox2.Checked) checkBox1.Checked = false;
    textBox3.MaxLength = 2;
    textBox3.Text = "0";
    }
    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    {
    if (checkBox2.Checked) checkBox1.Checked = false;
    if (checkBox1.Checked) checkBox2.Checked = false;
    textBox3.MaxLength = 3;
    }

    }
    }

  4. #6 by murat on 01 Kasım 2014 - 10:51

    hocam bu programı yazdım c# 2008,2010 da açalıştıramadım c# ın hangi ayarları yapmam lazım

  5. #7 by Kürşat on 25 Nisan 2015 - 15:35

    Merhabalar hocam. Elektronik bölümü öğrencisiyim. Sistem analizi ödevi olarak sunacagım. İsis Ares ve Hex dosyalarını bana mail olarak gönderebilirmisiniz ?

(yayınlanmayacak)