C#

C#으로 아두이노 제어하기 (digitalWrite, pinMode 쓰기)

수복이 2023. 6. 30. 18:20

수복이입니다.

 

C#으로 아두이노 제어하기 위해서는

C#에서 통신 신호를 보내면, 아두이노에서 받아 신호에 해당하는 액션을 취하는 것을 제어 방법으로 사용하는 것 같습니다.

또한 아두이노에서 신호를 보내 C#에서 받아서 C#에서도 특정 액션을 취할 수 있습니다.

 

즉 무궁무진하게 활용할 수 있습니다.

EX) 물리적 버튼 없이 컴퓨터 화면 버튼을 눌러서 아두이노 제어하기

 

많은 예제중, C#에서 "A" 라는 신호를 보낼 때 아두이노에서 "A"라는 신호를 받아들이면 그에대한 해당 액션을 취하는 예제가 많았습니다.

 

수복이는 조금 다르게 생각해서, C# 에서 아두이노 코딩처럼 사용하고 싶었습니다.

아직까진 INPUT 을 제어하는 방법을 생각하고 있는데, OUTPUT 및 PINMODE 설정까지 가능합니다.

 

즉 C#에서 아두이노 코딩인,  digitalWrite(3,HIGH);  pinMode(3,OUTPUT); 같이 C#에서 쓰면 실제로 작동하도록 하고 싶었습니다.

 

하지만 아두이노에 아예 코딩을 안하는건 힘들더라구요..

저는 NI-VISA 라이브러리로 아두이노 통신을 해봤습니다.

C#에서 VISA를 찾고, 아두이노 주소에 연결한 후 PIN 몇번으로 신호를 보내면(버튼 3 클릭)

신호는 "s1110", "a1110" 과 같이 아두이노에 보냅니다.

아두이노는 C#에서 신호를 줄 때 한글자씩 읽더라구요?

그래서 아두이노가 읽으면서 5자 까지 붙여서 한번에 읽도록 했습니다.

 

S 11 1 0 뜻은

S- SET (A는 액션입니다)

11- 11번핀

1- 출력핀 (0은 입력핀으로 설정)

0- 그냥넣었습니다. 

이렇게 아두이노 코드처럼 사용할 수 있었습니다.

즉 C#에서 핀 몇번을 켜줘 !! 꺼줘 !! 라고 명령하면 가능한 시스템입니다.

 

아직 잘 모르고, 초보자라 이곳저곳 참고해서 만들었습니다. 여러 방법이 있지만, 저는 아두이노 용어에 친숙한지라 C#에서도 편하게 하고싶어서 이와같이 진행했습니다. 

 

 

 

 

 

 

아래는 아두이노 코딩입니다.

String signal_cmd; 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //9600으로설정
}
void pinset(int x, char y){
  pinMode(x,y); // 핀모드 X핀을 Y 입력,출력 하겠다.
}
void out(int x, int y){
  digitalWrite(x,y); // X핀을 Y HIGH(1) LOW(0) 하겠다.
}
void loop() {
 while(Serial.available())
   {  char wait=""; //읽을 문자 넣을 변수
      wait = Serial.read(); // 1글자밖에 못읽음.
      signal_cmd.concat(wait); //signal_cmd 에 concat 함수를 붙여서 계속 읽은 데이터를 붙인다.
       if (signal_cmd.length()==5){ // 읽은 데이터가 5자리가 될 때.
          if (signal_cmd.substring(0,1)=="s"){ // 첫 데이터가 s일때
            int x; // 변수선언
            String y;
            char z;
            x= signal_cmd.substring(1,3).toInt();
            y= signal_cmd.substring(3,4);
            if (y="1"){
              z = "OUTPUT";
            }
            if (y="0"){
              z = "INPUT";
            }
             pinset(x,z);
             Serial.println(signal_cmd);
             signal_cmd="";
          }
          if (signal_cmd.substring(0,1)=="a"){
            int x;
            int y;
            x= signal_cmd.substring(1,3).toInt();
            y= signal_cmd.substring(3,4).toInt();
            digitalWrite(x,y);
            Serial.println(signal_cmd);
            signal_cmd="";
          }
       }
    }
}

아래는 C# 코딩입니다.

using Ivi.Visa;
using NationalInstruments.Visa;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;
namespace Arduino_Community
{
    public partial class Form1 : Form
    {
        String OUTPUT = "OUTPUT";
        String INPUT = "INPUT";
        class va
        {
            public static MessageBasedSession mbSession;
        }
        public Form1()
        {
            InitializeComponent();
        }
        private void signal(string s)
        {
            Application.DoEvents();
            va.mbSession.RawIO.Write(s);
            Application.DoEvents();
            while (true)
            {
                try
                {
                    Application.DoEvents();
                    textBox1.Text = va.mbSession.RawIO.ReadString();
                }
                catch { }

                if (textBox1.Text != "")
                {
                    DateTime currentTime = DateTime.Now;
                    string formattedTime = currentTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                    Console.Write(textBox1.Text + formattedTime);
                    textBox1.Text = "";
                    break;
                }
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            using (var rm = new ResourceManager())
            {
                try
                {
                    IEnumerable<string> resources = rm.Find("?*");
                    foreach (string s in resources)
                    {
                        ParseResult parseResult = rm.Parse(s);
                        comboBox1.Items.Clear();
                        comboBox1.Items.Add(s);                   
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (var rmSession = new ResourceManager())
            {
                try
                {
                    va.mbSession = (MessageBasedSession)rmSession.Open(comboBox1.Text);
                    MessageBox.Show("연결 성공", "성공");
                }
                catch (InvalidCastException)
                {
                    MessageBox.Show("연결하지 못하였습니다.","실패");
                }
                catch (Exception exp)
                {
                    MessageBox.Show("연결하지 못하였습니다.", "실패");
                }
                finally
                {
                    Cursor.Current = Cursors.Default;
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            using (var rm = new ResourceManager())
            {
                try
                {
                    IEnumerable<string> resources = rm.Find("?*");
                    foreach (string s in resources)
                    {
                        ParseResult parseResult = rm.Parse(s);
                        comboBox1.Items.Clear();
                        comboBox1.Items.Add(s);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
        private void PinMode(int x, String y) {
            char zero = '0';
            int z=0;
            if (y == "OUTPUT")
            {
                z = 1;
            }
            if (y == "INPUT")
            {
                z = 0;
            }
            signal("s" + x.ToString().PadLeft(2, zero)+z.ToString()+"0");
        }
        private void digitalWrite(int x, int y)
        {
            char zero = '0';
            signal("a" + x.ToString().PadLeft(2, zero) + y.ToString() + "0");
        }
        private void button3_Click(object sender, EventArgs e)
        {
            int pin = int.Parse(textBox2.Text);
            PinMode(pin, OUTPUT);
            digitalWrite(pin, 1);
            Thread.Sleep(1000);
            digitalWrite(pin, 0);

        }
    }
   
}