Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

controlling a physical device via c# [closed]

Tags:

c#

device

I want to control a physical device. ie: blink some LEDs or turn a servo. (just so simple that I will connect my LED's legs to USB's legs or serial ports pins and send a signal to one of the LED's leg and lit it and same with a servo.)

Question: How can I make this in C#? How can i send a signal through either usb or serial port? What are the things that I need? and how can I manage it? thanks.

 messageBox.Show("How to control a physical device via c# ?");

 messageBox.Show("thanks");
like image 798
modest and cute girl Avatar asked Nov 18 '25 20:11

modest and cute girl


2 Answers

You can use Your serial port like this:

  SerialPort port = new SerialPort("COM1", 2400, Parity.None, 8, StopBits.One);
  port.Open();
  port.Write(new byte[] {0x00, 0xFF, 0xFF}, 0, 3);
  port.Close();

The whole thing will be send bit by bit on one wire on serial port and with additional bits for transmission control.

You can blink LED with this. You need to connect LED to pin Transmit Data and to Ground that is usually the plug cover or one of pins. Check this for reference. You need also resistor to lower the current. 3k [ohm] resistor should do.

Driving small servo motor is possible but not that easy. Its better to control servo with microcontroller connected to Your computer.

You can connect two computers and exchange data with this.

You can burn Your equipment so be careful.

You can also buy or build something like this

EDIT: Ok, lots of questions.

QUESTION 1) why its hard? cant i just send a signal to the servo and make it run just like i did on the LED?

Serial port is a communication port so its purpose is to communicate and NOT to drive equipment. Its power capabilities are low. This port will store data to send in buffer and send bit by bit. So its extremely hard to shape PWM \ PPM signal to drive servo and after all result are not gonna be brilliant as well. Depending on motor that You have You may need other control method, but it will be hard to implement with serial port as well. If You really want to drive hardware from a port I would advice parallel port.

QUESTION 2) in which cases i burn my equipment? and do u mean i burn my serial port? or i burn LED or the servo?

QUESTION 3) you said "Your PC should also have current limited output" so as you referred if i put a resistor then i can manage this? and does 3k solves in all case?

In case You do not know enough about electrical circuits, networks and analysis then You have big chance to damage Your equipment. You can burn all of them and in worst case scenario also Your PC and house! First two problems that You need to worry about are short circuit and electrostatic discharge

Current limited output should lower current when resistors value is too low. This should prevent the damage of serial port driver on mainboard of PC.

3k resistor complies with serial port specification requirements (3-7[kOhm] <2500[pF]). It should drop taken current below 4[mA]. So in theory it should solve all cases.

QUESTION 4) where will i write your code? in to the button1 clicked? i mean lest say i have a winform and a button there, will i write your code in to the button clicked event?

You can open port on opening Your program. Then write to port on button click. Then close port on close program. All the code on button click should work as well.


PS.: Its also possible to connect serial port to audio input of sound card and then send data on serial port and record it as audio. It works as simple oscilloscope. (You can damage Your PC with this)

like image 110
rumburak Avatar answered Nov 20 '25 09:11

rumburak


You need a device that will translate your USB signals to signals your device understands (likely a simple on or off for LED's).

I have used the U421 in the past, they have a library that you just load the DLL using P/Invoke then you can send signals to the pins on the chip. You will then need to wire whatever you want to control to the chip (correctly, but that is beyond the scope of Stack Overflow, you may want to try Electronics.StackExchange.com). See the U4x1 Application Notes section on the USBMicro website for example code and wiring diagrams.

Example code from the webiste:

⁄⁄ needed to import the .dll
using System.Runtime.InteropServices;

    public class USBm
        {
        public static byte BitA0 = 0x00;
        public static byte BitA1 = 0x01;
        public static byte BitA2 = 0x02;
        public static byte BitA3 = 0x03;
        public static byte BitA4 = 0x04;
        public static byte BitA5 = 0x05;
        public static byte BitA6 = 0x06;
        public static byte BitA7 = 0x07;
        public static byte BitB0 = 0x08;
        public static byte BitB1 = 0x09;
        public static byte BitB2 = 0x0A;
        public static byte BitB3 = 0x0B;
        public static byte BitB4 = 0x0C;
        public static byte BitB5 = 0x0D;
        public static byte BitB6 = 0x0E;
        public static byte BitB7 = 0x0F;

⁄⁄  USBm.dll - C# pInvoke examples
⁄⁄  "Commands"
⁄⁄      [DllImport("USBm.dll", EntryPoint = "USBm_FindDevices", CharSet = CharSet.Auto)]
        [DllImport("USBm.dll")]
        public static extern bool USBm_FindDevices();
        [DllImport("USBm.dll")]
        public static extern int USBm_NumberOfDevices();
        [DllImport("USBm.dll")]
        public static extern bool USBm_DeviceValid(int Device);
        [DllImport("USBm.dll")]
        public static extern bool USBm_About(StringBuilder About);
        [DllImport("USBm.dll")]
        public static extern bool USBm_Version(StringBuilder Version);
        [DllImport("USBm.dll")]
        public static extern bool USBm_Copyright(StringBuilder Copyright);
        [DllImport("USBm.dll")]
        public static extern bool USBm_DeviceMfr(int Device, StringBuilder Mfr);
        [DllImport("USBm.dll")]
        public static extern bool USBm_DeviceProd(int Device, StringBuilder Prod);
        [DllImport("USBm.dll")]
        public static extern int USBm_DeviceFirmwareVer(int Device);
        [DllImport("USBm.dll")]
        public static extern bool USBm_DeviceSer(int Device, StringBuilder dSer);
        [DllImport("USBm.dll")]
        public static extern int USBm_DeviceDID(int Device);
        [DllImport("USBm.dll")]
        public static extern int USBm_DevicePID(int Device);
        [DllImport("USBm.dll")]
        public static extern int USBm_DeviceVID(int Device);
        [DllImport("USBm.dll")]
        public static extern bool USBm_DebugString(StringBuilder DBug);
        [DllImport("USBm.dll")]
        public static extern bool USBm_RecentError(StringBuilder rError);
        [DllImport("USBm.dll")]
        public static extern bool USBm_ClearRecentError();
        [DllImport("USBm.dll")]
        public static extern bool USBm_SetReadTimeout(uint TimeOut);
        [DllImport("USBm.dll")]
        public static extern bool USBm_ReadDevice(int Device, byte[] inBuf);
        [DllImport("USBm.dll")]
        public static extern bool USBm_WriteDevice(int Device, byte[] outBuf);
        [DllImport("USBm.dll")]
        public static extern bool USBm_CloseDevice(int Device);
        }

Example of function calling

⁄⁄ Test USBm device attached

if ( !USBm.USBm_FindDevices() )
    { 
    MessageBox.Show( string.Format("No Device Present"), "USBm Devices", MessageBoxButtons.OK, MessageBoxIcon.Information );
    return;
    }  ⁄⁄ implied else

⁄⁄Walk the USBm.dll functions

⁄⁄ some containers
StringBuilder sb = new StringBuilder( 200 );
bool result = false;  ⁄⁄ return values

⁄⁄ .DLL FindDevices  returns the number of devices
result = USBm.USBm_FindDevices();

⁄⁄ return the number of devices
int TotalDevices = USBm.USBm_NumberOfDevices();
int Device = TotalDevices -1;  ⁄⁄ only One device is ever attached so ...

⁄⁄ .DLL About info
result = USBm.USBm_About( sb );

⁄⁄ .DLL Version info
result = USBm.USBm_Version( sb );

⁄⁄ .DLL Copyright info
result = USBm.USBm_Copyright( sb );

⁄⁄ Device Valid
result = USBm.USBm_DeviceValid( Device );

⁄⁄ Device Manufacturer
result = USBm.USBm_DeviceMfr( Device, sb );

⁄⁄ Device Product String
result = USBm.USBm_DeviceProd( Device, sb );

⁄⁄ Device Firmware Version
int FirmVer = USBm.USBm_DeviceFirmwareVer(Device);

⁄⁄ Device SerialNumber [ ]
result = USBm.USBm_DeviceSer(Device, sb);

⁄⁄ Device DiD
int DID = USBm.USBm_DeviceDID(Device);

⁄⁄ Device PiD
int PID = USBm.USBm_DevicePID(Device);

⁄⁄ Device ViD
int VID = USBm.USBm_DeviceVID(Device);

⁄⁄ Device Debug String
result = USBm.USBm_DebugString(sb);

⁄⁄ Device Recent Error - always returns true
result = USBm.USBm_RecentError(sb);

⁄⁄ Device Clear Recent Error
result = USBm.USBm_ClearRecentError();

⁄⁄ Device SetReadTimeout [ sixteen-bit millisecond value]
uint tOUT = 3000;
result = USBm.USBm_SetReadTimeout(tOUT);

⁄⁄ Device WriteDevice [ 8 byte to write (device raw commands)]
byte[] OutBuf = { 0, 21, 3, 65, 8, 17, 60, 0 };
result = USBm.USBm_WriteDevice(Device, OutBuf);

⁄⁄ Device ReadDevice [ ]
byte[] InBuf = { 0, 0, 0, 0, 0, 0, 0, 0 };
result = USBm.USBm_ReadDevice(Device, InBuf);

// Device CloseDevice [ ]
result = USBm.USBm_CloseDevice(Device);
like image 31
Scott Chamberlain Avatar answered Nov 20 '25 08:11

Scott Chamberlain



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!