[Arduino] 저장, 엔터 돔 버튼 제작

일할때 사용할 버튼을 만들고 싶었다.

어서 UPDATE문 커밋을 해야해. 근데 정말 이게 맞나??

고민고민중

에라모르겠다 딸칵딸칵

404 Not Found.

내가 상상했던 버튼의 기능과 모습.

자 그럼 이제 만들어보자.

우선 다이소에서 두가지 버튼을 올릴 수 있을만한 상자를 하나 사왔다.

근데 사이즈가 안맞아서 버튼이 삐져나오….

재료는 메카솔루션에서 사고 Wiring은 SparkFun의 가이드를 참고했다.

대략 한시간정도 작동이 제대로 되지 않아 땀을 삐질삐질 흘렸는데

원인은 대부분의 가이드, 완성본 내용과 다르게 스위치의 Common을

5V가 아닌 GND로 연결해주어야 했다.

상자에 USB구멍을 파고,, 8000원짜리 UNO 호환 보드를 꾸깃꾸깃 넣어 봅니다.

버튼 와이어링에 납땜하면 안빠지고 좋겠지만 귀찮엉 ㅎ_ㅎ

LED밝기 차이가 난다.

LED는 원래 저항이 달려있어 밝기가 매우 약했는데

기존에 달려있던 저항+LED를 빼고 일반 LED로 교체해주었다.

작업하면서 LED를 제대로 노출시켜주지 않아 밝기 차이가 나는 모습.

코드는 아두이노-프로세싱 연동을 사용한다.

별거 없는 아두이노 소스.

Loop를 이용하지 않고, 2,3번 핀에 인터럽트를 걸었다.

(우노는 2,3번 핀에만 인터럽트 설정이 가능하다)

인터럽트로 스위치 신호가 들어오면 USB시리얼로 명령어를 쏘지요~!

  int buttonState =  HIGH;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  attachInterrupt(0, SaveKey, FALLING);
  attachInterrupt(1, EnterKey, FALLING);   
}

void loop() {
  // read the input pin:
//  digitalWrite(9, HIGH);
//  digitalWrite(10, HIGH);
  
  // print out the state of the button:
  //Serial.print("button1:");
  //Serial.println(buttonState1);
  //Serial.print("button2:");
  //Serial.println(buttonState2);
  //Bang();
//  if(buttonState1 == 0){
//    digitalWrite(9, LOW);
//    delay(1000);
//    digitalWrite(9, HIGH);
//  }
//  if(buttonState2 == 0){
//    digitalWrite(10, LOW);
//    delay(1000);
//    digitalWrite(10, HIGH);
//  }
  delay(5000);        // delay in between reads for stability
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
}

// ISR (인터럽트 호출 합수)
void EnterKey() {
  static unsigned long lastDebounceTime = 0;
  unsigned long debounceTime = millis();
  if(debounceTime - lastDebounceTime > 50) {
    digitalWrite(10, HIGH);
    digitalWrite(9, LOW);
    buttonState = !buttonState;
    Serial.write("e");
    Serial.write("\n");  
  } 
  lastDebounceTime = debounceTime;
  
}
// ISR (인터럽트 호출 합수)
void SaveKey() {
  static unsigned long lastDebounceTime = 0;
  unsigned long debounceTime = millis();
  if(debounceTime - lastDebounceTime > 50) {
    digitalWrite(9, HIGH);
    digitalWrite(10, LOW);
    buttonState = !buttonState;
    Serial.write("s");
    Serial.write("\n");  
  } 
  lastDebounceTime = debounceTime;
  
}

프로세싱 코드.

자바와 이클립스를 이용해서도 짤 수 있겠지만, 프로세싱을 사용하면 아주 쉽고 간단하게

로컬PC연동 자바 애플리케이션을 만들 수 있다.

위에서 쏴준 명령어를 받아 PC에 키이벤트를 날려준다.

맥의 경우는 컨트롤이 아닌 커맨드를 매핑해주어야 했다.

이제 글씨만 써주면 되겠다.

import processing.serial.*;
import java.awt.*;
import java.awt.event.KeyEvent;

Serial myPort;

boolean temp;

void setup(){
  println(Serial.list());
  println(Serial.list()[1]);
  
  String portName = Serial.list()[1];
  myPort = new Serial(this, portName, 9600);
  myPort.bufferUntil('\n');
  
}

void draw(){
  serialEvent(myPort);
}

void serialEvent(Serial myPort){

  String inputString = myPort.readStringUntil('\n');
  try{
    inputString = trim(inputString);
    RobotTest(inputString);
  }catch(NullPointerException ne){
    inputString = "0";
  }
}

void RobotTest(String temp) {
  try{
    Robot robot = new Robot();

     robot.setAutoDelay(10);
    
    if(temp.equals("s")){
      // Ctrl + S 
      println("Press Save");
      robot.keyPress(KeyEvent.VK_CONTROL);
      robot.keyPress(KeyEvent.VK_S);
      robot.delay(5);
      robot.keyRelease(KeyEvent.VK_CONTROL);
      robot.keyRelease(KeyEvent.VK_S);
    }else if (temp.equals("e")){
      // Enter
      println("Press Enter");
      robot.keyPress(KeyEvent.VK_ENTER);
      robot.delay(5);
      robot.keyRelease(KeyEvent.VK_ENTER);
    }
    
  }catch(Exception e){
    
  }
 }
video
play-sharp-fill

You may also like...

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.