이번에 이더넷 모듈을 공부하게 되어 아두이노이더넷 모듈로 LED를 제어해봤습니다.


 
#include 
#include 
#include 


//Ethernet Shield MAC address 
byte mac[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
IPAddress ip(172,31,10,155);
IPAddress subnet(255,255,0,0);
IPAddress gateway(172,31,0,1);
IPAddress dns_local(168,126,63,1);

char buffer[8];

EthernetServer server(80);

void setup() {
  Serial.begin(9600);
  
              
  //if(Ethernet.begin(mac) == 0) {
  //  Serial.println("Failed to configure Ethernet using DHCP");
    //using fixed ip
    Ethernet.begin(mac, ip, dns_local, gateway, subnet);
  //}
  
   Serial.print("IP address: ");
  ip = Ethernet.localIP();
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(ip[thisByte], DEC);
    Serial.print("."); 
  }
  Serial.println();
  server.begin();
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    TextFinder finder(client);
    int type = 0;
    while (client.connected()) {
      if (client.available()) {
        //http request start with "GET / HTTP/1.1"
        if (finder.getString("","/", buffer, sizeof(buffer))) {
          if(strcmp(buffer, "POST ") == 0) {
            finder.find("\n\r");
            while (finder.findUntil("pinD", "\n\r")) {
              int pin = finder.getValue();
              int val = finder.getValue();
              pinMode(pin, OUTPUT);
              digitalWrite(pin, val);
              
              
              Serial.print("pin: ");
              Serial.print(pin);
              Serial.print(" Val: ");
              Serial.println(val);
            }
          }
          
          sendHeader(client,"Post example");
          //create HTML button to control pin 9
          client.println("

Click buttons to turn pin 9 on or off

"); client.print("

"); //create HTML button to turn on pin 9 client.print("

"); client.println(""); client.stop(); break; }//if finder }//if client available }//while connected delay(1); client.stop(); }//if client } void sendHeader(EthernetClient client, char *title) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.print(""); client.print(title); client.println(""); } //소스출처 = http://suakii.egloos.com/2976671

출처 아랫줄에 부분은 PRE버그여서 제외하시고 복사하시면 됩니다.

소스에 include한 TextFinder.h는 http://playground.arduino.cc/Code/TextFinder 를 참고하시면 됩니다.

LED를 9번에 사용한 이유는 이더넷포트가 13 - 10번 핀을 사용하고 있기때문에 9번핀을 사용합니다.




이런식으로 연결 하신 뒤에 작동을 시킵니다,.



동영상을 보시면 버튼을 누른뒤 꽤 오랜뒤에 작동하는것을 볼 수 있습니다.


스레드가 아니라 루프문을 돌기때문에 어디서 버튼을 누른것을 캐치했는지, 그리고 루프문 돌아가면서 어느때에 캐치하는지를 잘 파악하는것이 중요하다 생각됩니다.


위 소스를 수정해서 빠르게 작동하도록 설정이 성공하면 그때 다시 올릴 수 있도록 하겠습니다.



에프티크레이이티드(http://fdc.ne.kr)에서 제공하는 교육용 아두이노를 이용하여 제작했습니다.

사용한 센서는 

- 조도 센서

- 온도 센서

- 습도 센서

를 사용하여 

버튼을 땐경우에는 - 온도,습도 를 출력

버튼을 누른경우에는 - 조도를 출력합니다.


#include 
#include 
#include  
#define dataPin  22 // 온습도 데이터 입력핀 설정
#define clockPin 23 // 시간 데이터 입력핀 설정
SHT1x sht1x(dataPin, clockPin);
LiquidCrystal lcd(32, 54, 33, 34, 35, 36, 37);
int buttonState = 0;
const int cdsInPin = A0;  // Analog input pin that the potentiometer is attached to
const int analogInPin = A1;  // Analog input pin that the potentiometer is attached to

int sensorValue = 0;        // value read from the pot
int cdsValue = 0;        // value read from the pot


void setup()
{
   Serial.begin(9600); // 
   Serial.println("Starting up");
   Wire.begin();        // join i2c bus (address optional for master) 
   delay(500);  
   pinMode(8, INPUT);  //LED Set "Relay Board Cn1"
   lcd.begin(8,2);              // 8열 2줄 LCD 활용 시작
   lcd.clear();                  // LCD 화면 비움
  
}
void loop()
{
  buttonState = digitalRead(8);
  sensorValue = analogRead(analogInPin);
  cdsValue = analogRead(cdsInPin)*10;   
  float sensor;
  float cds;
  
  // Read values from the sensor
  sensor = analogInPin;
  cds = cdsInPin;   
  const int lookup[10] = {0x3F,0x06,0x5B,0x4F,0x66,
                          0x6D,0x7D,0x07,0x7F,0x6F};
  int Count, Thousands, Hundreds, Tens, Base;  
  Wire.beginTransmission(0x38);
  Wire.write((byte) 0);
  Wire.write(B01000111);
  Wire.endTransmission();
  
  float temp_c; // 섭씨 
  float temp_f; // 화씨
  float humidity; // 습도

  // 위의 변수 값에 센서로부터의 값을 입력 받도록 설정한다.
  temp_c = sht1x.readTemperatureC();
  temp_f = sht1x.readTemperatureF();
  humidity = sht1x.readHumidity();

  if(buttonState == HIGH){
  
      //LCD START
      lcd.setCursor(0,0);           // 0, 0 윗줄 시작
      lcd.print("Temp= ");    // 따옴표 사이에 원하는 글을 적는다.
      lcd.print(temp_c, DEC);    // 따옴표 사이에 원하는 글을 적는다.
      
      lcd.setCursor(0,1);           // 0, 1 아랫줄 시작
      lcd.print("Humi= ");
      lcd.print(temp_f, DEC);
      //LCD END
      
      // 7 SEGMENT START
      Wire.beginTransmission(0x38);
      Wire.write(1);
      Thousands = (int)temp_c/10;
      Hundreds = (int)(temp_c - (Thousands*10));
      Tens = (int)temp_f/10;
      Base = (int)(temp_f - (Tens*10));
      
      Wire.write(lookup[Thousands]);
      Wire.write(lookup[Hundreds]);
      Wire.write(lookup[Tens]);
      Wire.write(lookup[Base]);
      Wire.endTransmission();

      
  }else{
      
    if(cdsValue >= 160)
      {
        Serial.print("Relay Cn1 On\n");
        Serial.print("Trun off Light 0n\n");
    
        digitalWrite(33, LOW);
        digitalWrite(32, HIGH);
        
        lcd.begin(8,2); 
        lcd.clear();
        lcd.setCursor(0,0);        
        lcd.print("cds");   
        lcd.print(cdsValue,DEC);
        lcd.setCursor(0,1);          
        lcd.print("lightoff");
        
        Wire.beginTransmission(0x38);
        Wire.write(1);
        if(cdsValue>99 && cdsValue<1000){
          Thousands = 0;
          Hundreds = cdsValue/100;
          Tens = (cdsValue - (Hundreds*100))/10;
          Base = (cdsValue - (Hundreds*100)-(Tens*10));
        
          Wire.write(lookup[Thousands]);
          Wire.write(lookup[Hundreds]);
          Wire.write(lookup[Tens]);
          Wire.write(lookup[Base]);
          Wire.endTransmission();

        }else if(cdsValue>9 && cdsValue<100){
          Thousands = 0;
          Hundreds = 0;
          Tens = cdsValue/10;
          Base = (cdsValue - (Tens*10));
          
          Wire.write(lookup[Thousands]);
          Wire.write(lookup[Hundreds]);
          Wire.write(lookup[Tens]);
          Wire.write(lookup[Base]);
          Wire.endTransmission();

        }else if(cdsValue>10){
          Thousands = 0;
          Hundreds = 0;
          Tens = 0;
          Base = cdsValue;
        
          Wire.write(lookup[Thousands]);
          Wire.write(lookup[Hundreds]);
          Wire.write(lookup[Tens]);
          Wire.write(lookup[Base]);
          Wire.endTransmission();

        }
      }
  
    else
    {
      Serial.print("Relay Cn2 On\n");
      Serial.print("Trun On the light On\n");
  
      digitalWrite(32, LOW);
      digitalWrite(33, HIGH);
      
      lcd.begin(8,2); 
      lcd.clear();
      lcd.setCursor(0,0);        
      lcd.print("cds ");   
      lcd.print(cdsValue,DEC);
      lcd.setCursor(0,1);          
      lcd.print("light on");
    }
  }
  // 7 SEGMENT END
  delay(50);
}






이 프로그램을 응용하여 릴리즈를 활용하여 

조도값을 받아 어두울때는 전등을 키고 밝을때는 전등을끄는 기능과

추울때는 히터를 틀고 더울때는 히터를 키는 소스를 구현하였습니다.



 

#include 
#include 
#include  
#define dataPin  22 // 온습도 데이터 입력핀 설정
#define clockPin 23 // 시간 데이터 입력핀 설정
SHT1x sht1x(dataPin, clockPin);
LiquidCrystal lcd(40, 54, 41, 42, 43, 44, 45);
const int cdsInPin = A0;  // Analog input pin that the potentiometer is attached to
const int analogInPin = A1;  // Analog input pin that the potentiometer is attached to

int sensorValue = 0;        // value read from the pot
int cdsValue = 0;        // value read from the pot


void setup()
{
   Serial.begin(9600); // 
   Serial.println("Starting up"); 
   pinMode(32, OUTPUT); 
   pinMode(33, OUTPUT);    
   lcd.begin(8,2);              // 8열 2줄 LCD 활용 시작
   lcd.clear();                  // LCD 화면 비움
  
}
void loop()
{

  sensorValue = analogRead(analogInPin);
  cdsValue = analogRead(cdsInPin)*10;   
  float sensor;
  float cds;
  
  // Read values from the sensor
  sensor = analogInPin;
  cds = cdsInPin;   
  
  float temp_c; // 섭씨 
  float temp_f; // 화씨
  float humidity; // 습도

  // 위의 변수 값에 센서로부터의 값을 입력 받도록 설정한다.
  temp_c = sht1x.readTemperatureC();
  temp_f = sht1x.readTemperatureF();
  humidity = sht1x.readHumidity();

  if(temp_c<20){ // 온도의 기준은 20도
  
      //LCD START
      lcd.setCursor(0,0);           // 0, 0 윗줄 시작
      lcd.print("T=");    // 따옴표 사이에 원하는 글을 적는다.
      lcd.print((int)temp_c, DEC);    // 따옴표 사이에 원하는 글을 적는다.
      digitalWrite(32, HIGH); 
      lcd.print(" ON  ");    // 따옴표 사이에 원하는 글을 적는다.
      
  }else{
    //LCD START
      lcd.setCursor(0,0);           // 0, 0 윗줄 시작
      lcd.print("T=");    // 따옴표 사이에 원하는 글을 적는다.
      lcd.print((int)temp_c, DEC);    // 따옴표 사이에 원하는 글을 적는다.
      digitalWrite(32, LOW); 
      lcd.print(" OFF  ");    // 따옴표 사이에 원하는 글을 적는다.
  }
      
  if(cdsValue >= 160) // 밝기의 기준은 160
    {
      Serial.print("Relay Cn1 On\n");
      Serial.print("Trun off Light 0n\n");
  
      lcd.setCursor(0,1);
      lcd.print("L=");    // 따옴표 사이에 원하는 글을 적는다.
      lcd.print(cdsValue, DEC);    // 따옴표 사이에 원하는 글을 적는다.
      lcd.print(" OFF  ");    // 따옴표 사이에 원하는 글을 적는다.
      digitalWrite(33, LOW); 
  }
  else
  {
    Serial.print("Relay Cn2 On\n");
    Serial.print("Trun On the light On\n");

    lcd.setCursor(0,1);          
    lcd.print("L=");    // 따옴표 사이에 원하는 글을 적는다.
    lcd.print(cdsValue, DEC);    // 따옴표 사이에 원하는 글을 적는다.
    lcd.print(" ON  ");    // 따옴표 사이에 원하는 글을 적는다.
    digitalWrite(33, HIGH); 
  }
  delay(1000);
}




1. DC모터 제어하기.

   DC모터를 제어하기 위해서는 DC모터 , DC모터 모듈 , 9V전지가 필요합니다.

   제어 부분에 대해서는 아래그림을 참고해 주시면 됩니다.



in 핀의 HIGH(또는 아날로그값 ( 0 - 250 ) , LOW 를 조절하여 방향을 원하는대로 조절하는 기능을 가졌습니다.

또한 ENA핀을 HIGH , LOW 로 조절하여 ON/OFF 관리를 할 수 있습니다.


그럼 가변저항을 이용하여 속도를 조절하며 , 버튼을 이용하여 왼쪽 오른쪽 제어하는 소스를 구현해보겠습니다.



// 소스코드 1
// 버튼하나를 이용한 DC모터제어
int P1 = 10; // IN1 Pin
int P2 = 11; // IN2 Pin
int onOff = 9; // on/off (ENA Pin)
int btn = 2;   // Left & Right Select Button Pin
int sensorPin = A0; // SensorPin 
int sensorValue = 0; // Input Sensor Value
int val=0;           // Sensor Value Mapping 
int btn_state = 0;



void setup(){
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(onOff,OUTPUT);
  pinMode(btn , INPUT);
}

void loop(){
  btn_state = digitalRead(btn);
  digitalWrite(onOff , HIGH); //onoff
  sensorValue = analogRead(sensorPin); 
    val =  map(sensorValue , 0, 1023, 0, 250);
  if(btn_state == HIGH){
    
    analogWrite(P1 , val);
    digitalWrite(P2 , LOW);
  }else{
    analogWrite(P2 , val);
    digitalWrite(P1 , LOW);
  }

}



소스만 올리고 회로도가없어서 주석을 추가적으로 달았습니다.

아두이노는 한글에 너무 약해서 한글주석도 달기 힘드내요.


위와같이 소스를 구현하시면 아래처럼 작동합니다.


조금 더 응용을 해보아서 버튼 2개를 두어 오른쪽 왼쪽 방향키처럼 제어해보겠습니다.

버튼하나만 더 추가해주시면 됩니다.


// 소스코드 2
// 버튼두개를 이용한 DC모터제어
int P1 = 10;
int P2 = 11;
int onOff = 9;
int btn1 = 2;
int btn2 = 3;

int btn_state1 = 0;
int btn_state2 = 0;



void setup(){
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(onOff,OUTPUT);
  pinMode(btn1 , INPUT);
  pinMode(btn2 , INPUT);
}

void loop(){
  btn_state1 = digitalRead(btn1);
  btn_state2 = digitalRead(btn2);
  digitalWrite(onOff , HIGH); //onoff
   if(btn_state1 == HIGH && btn_state2 == LOW ){
    
    digitalWrite(P1 , HIGH);
    digitalWrite(P2 , LOW);
  }else if(btn_state1 == LOW && btn_state2 == HIGH){
    digitalWrite(P2 , HIGH);
    digitalWrite(P1 , LOW);
  }else{
    digitalWrite(P2 , LOW);
    digitalWrite(P1 , LOW);
  }

}


소스코드를 입력하시고 구동해보시면 됩니다.

버튼 다시는 방법은 제글을 찾아보시면 됩니다.






마이크와 스피커는 같은 구조로 이어져있습니다. 

용도에 따라 어떤식으로 좀더 특성에 맞게 구성되어있는것이지 구성자체는 진동을 주느냐 받느냐의 차이에 있습니다.


그래서 스피커를 마이크처럼 이용하여 진동을 받을 시 LED를 on/off 하는 소스를 구현했습니다,.


회로도는 간단합니다. 위처럼 가변저항같이 값을 가져오면 그값을 해석하여 LED를 추가적으로 설치하여 LED를 ON/OFF를 하는 소스입니다.




아래는 소스입니다.

시리얼모니터를 켜시고 받아오는 값을 측정하면서 소스를 조절하시면됩니다.



 
const int ledPin = 13;      // led connected to digital pin 13
const int knockSensor = A0; // the piezo is connected to analog pin 0
const int threshold = 20;  // threshold value to decide when the detected sound is a knock or not


// these variables will change:
int sensorReading = 0;      // variable to store the value read from the sensor pin
int ledState = LOW;         // variable used to store the last LED status, to toggle the light

void setup() {
 pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
 Serial.begin(9600);       // use the serial port
}

void loop() {
  // read the sensor and store it in the variable sensorReading:
  sensorReading = analogRead(knockSensor);    
  Serial.println(sensorReading);
  // if the sensor reading is greater than the threshold:
  if (sensorReading >= threshold) {
    // toggle the status of the ledPin:
    ledState = !ledState;   
    // update the LED pin itself:        
    digitalWrite(ledPin, ledState);
    // send the string "Knock!" back to the computer, followed by newline
    Serial.println("Knock!");         
  }
  delay(100);  // delay to avoid overloading the serial port buffer
}

에프디크리에이티브 사 에서 제작한 교육용 아두이노를 이용하여

초음파 탐지기를 이용한 후방주차 감지 시스탬을 구현해보았습니다.



즉흥적으로 짠거라 회로도는 따로없고 사진을 참고하시면됩니다.


소스는

int cnt;
int dummcnt;
long Distance;
long Tempture;
unsigned long duration;
int pin = 15;

void setup() {
  pinMode(32, OUTPUT);   
  pinMode(40, OUTPUT);     
  pinMode(41, OUTPUT);     
  pinMode(42, OUTPUT);     
  pinMode(43, OUTPUT);     
  pinMode(44, OUTPUT);     
  pinMode(45, OUTPUT);     
  pinMode(46, OUTPUT);     
  pinMode(47, OUTPUT);  
    Serial.begin(9600);    
    Tempture = 25;    
    pinMode(pin,OUTPUT);
    digitalWrite(pin, LOW);

    cnt = 0;
}

void allOff(){
   digitalWrite(40, LOW); 
   digitalWrite(41, LOW);
   digitalWrite(42, LOW);
   digitalWrite(43, LOW);
   digitalWrite(44, LOW);
   digitalWrite(45, LOW);
   digitalWrite(46, LOW);
   digitalWrite(47, LOW);
  
   //delay(1000);
}
void onLed(int num){
   digitalWrite(32,LOW);
 for(int j = 0 ; j<num ; j++){
   int lednum = j+40;
   digitalWrite(lednum, HIGH);
  
 }

}

void loop() {

    delay(150);
    
    pinMode(pin,OUTPUT);
    
    digitalWrite(15,HIGH);
    delayMicroseconds(10); 
    digitalWrite(15,LOW);
    
    pinMode(pin,INPUT);
    duration = pulseIn(pin, HIGH);
    
    Distance = (331.5 + 0.607 * Tempture) * ( duration * 0.001 / 2 );

    Serial.print("value (mm) = ");
    Serial.println(Distance);    
    //led all off
   
    if(Distance<40){
      digitalWrite(32,HIGH);
      allOff();
    }else if(Distance>=50 && Distance < 100){
      digitalWrite(32,HIGH);
      delay(50);
      digitalWrite(32,LOW);
      delay(50);
      digitalWrite(32,HIGH);
      delay(50);
      digitalWrite(32,LOW);
      delay(50);
      digitalWrite(32,HIGH);
      delay(50);
      digitalWrite(32,LOW);
      delay(50);
      digitalWrite(32,HIGH);
      delay(50);
      digitalWrite(32,LOW);
      
      onLed(1);
    }else if(Distance>=100 && Distance < 150){
      digitalWrite(32,HIGH);
      delay(100);
      digitalWrite(32,LOW);
      delay(100);
      digitalWrite(32,HIGH);
      delay(100);
      digitalWrite(32,LOW);
      onLed(2);
    }else if(Distance>=150 && Distance < 200){
      digitalWrite(32,HIGH);
      delay(150);
      digitalWrite(32,LOW);
      onLed(3);     
    }else if(Distance>=200 && Distance < 250){
      digitalWrite(32,HIGH);
      delay(200);
      digitalWrite(32,LOW);
      onLed(4);     
    }else if(Distance>=250 && Distance < 300){
      onLed(5);   
    }else if(Distance>=300 && Distance < 350){
      onLed(6);
    }else if(Distance>=350 && Distance < 400){
      onLed(7);
    }else{
      onLed(8);
    }
}

위와같이 소스를 설정하시면 아래영상처럼 구동됩니다.

소리를 키워주세요!





아두이노를 쓰다보면 핀수가 부족해서 원하고자하는것을 못하는경우가 생깁니다.


이럴때를 대비해서 아두이노 사이트에서는 쉬프트라는 명령어를 제공합니다. (http://arduino.cc/en/Tutorial/ShiftOut)

74HC595이라는 쉬프트레지스터를 이용해서 포트를 확장하게 됩니다.


아두이노 사이트에 있는



이그림을 구현해 보도록 하겠습니다.


우선 74HC595를 이해해보면


출처 = http://blog.naver.com/eskelt/120157837942

11,12,14를 핀에 가지고 제어를 해줍니다.

중요한건 12번핀을 LOW화 시키고 코드를 집어넣은 뒤 12번 핀을 HIGH로 바꾸어 00000000 - 11111111 사이의 데이터를 집어넣을 수 있습니다.


핀번호에 맞추어 VCC , GND 까지 연결을 해줍니다.


아래소스는 기본 아두이노 사이트에서지원하는 샘플 소스입니다.


//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //count up routine
  for (int j = 0; j < 256; j++) {
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);   
    //return the latch pin high to signal chip that it 
    //no longer needs to listen for information
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
} 
 

위 소스를 입력하고 동작시킨 영상입니다.



다음은 이걸활용한 LED매트릭스를 보여드릴께요

가변저항이란?

'저항값을 바꿀 수 있는 저항기' 를 말합니다.



요렇게 생긴거를 의미합니다.

- 스피커 볼륨

- 전등 밝기 

등에 많이 사용됩니다.


사용법은

이런식으로 양끝에 5V 와 접지를 이어주고 

가운대는 아날로그 입력을 꼳아줍니다. 

가변저항을 조절하여 출력되는 값을 A0으로 보내주어 값을 가져오는 방식입니다.


우선 가변저항 없이 기본소스를 입력하여 어떠한 변화가 오는지 알아봅시다.

// 샘플 소스 1
// LED 밝기 조절하기 ( 가변저항 X )
int led = 9
int brightness = 0;    
int fadeAmount = 5;    
void setup()  { 
  pinMode(led, OUTPUT);
} 

void loop()  { 
  analogWrite(led, brightness);    
  brightness = brightness + fadeAmount;
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  delay(30);                            
}


이런식으로 소스를 구현하고 led핀을 9번으로 넣어줍니다. 출력을 아날로그를 출력하며 0~255까지 5씩 밝기를 조절해줍니다.


밝았다가 어두워졌다가 하는 모습을 볼 수 있습니다.




그럼 가변저항을 이용한 소스를 보도록 하겠습니다.

우선 회로를 보시면


아까 위의 그림처럼 가변저항을 설정해 줍니다.

그리고 3 5 6 9 10 11 에 각각 LED를 연결해 저항 접지까지 연결해줍니다.

잘모르시는분은 1일차를 참고해주세요 

// 샘플소스 2 
// 가변저항을 이용하여 LED를 제어 1

int sensorPin = A0;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor
int brightness = 0;    
int brightness1 = 50;    
int brightness2 = 100;    
int brightness3 = 150;    
int brightness4 = 200;    
int brightness5 = 250;    
// 각각의 밝기 초기값을 설정
int fadeAmount = 5;    
int fadeAmount1 = 5;  
int fadeAmount2 = 5;  
int fadeAmount3 = 5;  
int fadeAmount4 = 5;  
int fadeAmount5 = 5;  
//가변값을 각각설정

void setup()  { 
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  //아날로그 출력핀을 설정
} 

void loop()  { 
  sensorValue = analogRead(sensorPin);    
  analogWrite(3, brightness); 
  analogWrite(5, brightness1); 
  analogWrite(6, brightness2); 
  analogWrite(9, brightness3); 
  analogWrite(10, brightness4); 
  analogWrite(11, brightness5); 

  brightness = brightness + fadeAmount;
  brightness1 = brightness1 + fadeAmount1;
  brightness2 = brightness2 + fadeAmount2;
  brightness3 = brightness3 + fadeAmount3;
  brightness4 = brightness4 + fadeAmount4;
  brightness5 = brightness5 + fadeAmount5;
  
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  if (brightness1 == 0 || brightness1 == 255) {
    fadeAmount1 = -fadeAmount1 ; 
  }
  if (brightness2 == 0 || brightness2 == 255) {
    fadeAmount2 = -fadeAmount2 ; 
  }
  if (brightness3 == 0 || brightness3 == 255) {
    fadeAmount3 = -fadeAmount3 ; 
  }
  if (brightness4 == 0 || brightness4 == 255) {
    fadeAmount4 = -fadeAmount4 ; 
  }
  if (brightness5 == 0 || brightness5 == 255) {
    fadeAmount5 = -fadeAmount5 ; 
  }
  delay(sensorValue);        
  //딜레이시간을 수신받는 가변저항을 이용하여 설정 
}

이런식으로 설정해줍니다.


포트를 A0-6 을 설정하지않고 디지털 포트를 설정한 이유는

A0-6은 아날로그 수신이 가능한포트이며

디지털포트중 ~ 물결표시가 적힌 포트는 아날로그 출력이 가능한 포트입니다.


이런식으로 설정을 해주면






마지막소스는 저항에따라 켜는 갯수를 정하는것입니다. 회로는 똑같고 프로그램만 변경합니다.


int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 11;      // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
  // declare the ledPin as an OUTPUT:
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop() {
  
  sensorValue = analogRead(sensorPin);    
  
 
  if(sensorValue == 0 ){
      digitalWrite(3, LOW);      
      digitalWrite(5, LOW);      
      digitalWrite(6, LOW);      
      digitalWrite(9, LOW);      
      digitalWrite(10, LOW);      
      digitalWrite(11, LOW);      
  }
  else if(sensorValue > 0  &&  sensorValue <= 40){
      digitalWrite(3 , HIGH);      
      digitalWrite(5 , LOW);      
      digitalWrite(6 , LOW);      
      digitalWrite(9 , LOW);      
      digitalWrite(10 , LOW);      
      digitalWrite(11, LOW);      
  }
  else if(sensorValue > 40  &&  sensorValue <= 80){
      digitalWrite(3, HIGH);      
      digitalWrite(5, HIGH);      
      digitalWrite(6, LOW);      
      digitalWrite(9, LOW);      
      digitalWrite(10, LOW);      
      digitalWrite(11, LOW);      
  }
  else if(sensorValue > 80  &&  sensorValue <= 120){
      digitalWrite(3, HIGH);      
      digitalWrite(5, HIGH);      
      digitalWrite(6, HIGH);      
      digitalWrite(9, LOW);      
      digitalWrite(10, LOW);      
      digitalWrite(11, LOW);      
  }
  else if(sensorValue > 120  &&  sensorValue <= 160){
      digitalWrite(3, HIGH);      
      digitalWrite(5, HIGH);      
      digitalWrite(6, HIGH);      
      digitalWrite(9, HIGH);      
      digitalWrite(10, LOW);      
      digitalWrite(11, LOW);      
  }
  else if(sensorValue > 160  &&  sensorValue <= 200){
      digitalWrite(3, HIGH);      
      digitalWrite(5, HIGH);      
      digitalWrite(6, HIGH);      
      digitalWrite(9, HIGH);      
      digitalWrite(10, HIGH);      
      digitalWrite(11, LOW);      
  }
  else{
      digitalWrite(3, HIGH);      
      digitalWrite(5, HIGH);      
      digitalWrite(6, HIGH);      
      digitalWrite(9, HIGH);      
      digitalWrite(10, HIGH);      
      digitalWrite(11, HIGH);      
  }
  
  delay(30);          
  
  //digitalWrite(ledPin, LOW);   
  


이런식으로 받는 값( 0 - 255 ) 를 감지해서 LED를 키는법입니다.

아날로그출력이아니라 디지털출력 그대로 사용하고 받는 값에 따라 갯수만 변경한 것입니다.




오늘은여기까지입니다.


확실히 내머리속에있는대 이걸꺼내는건 어렵내요.

ㅠㅠ


모르시는거 있으시면 꼭 리플달아주세요!!

아두이노는 스피커에 주파수를 입력하여 소리를 낼 수 있습니다.


http://arduino.cc/en/Reference/Tone 에 들어가면 Tone에 대한 설명이있습니다.



위의 그림처럼 연결해주고 소스에서 톤을 넣어주면 소리가 나게 됩니다.


아래는 소스입니다.


소스 코드 1 


  #include "pitches.h"


// notes in the melody:

int melody[] = {

  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};


// note durations: 4 = quarter note, 8 = eighth note, etc.:

int noteDurations[] = {

  4, 8, 8, 4,4,4,4,4 };


void setup() {

  for (int thisNote = 0; thisNote < 8; thisNote++) {


    int noteDuration = 1000/noteDurations[thisNote];

    tone(8, melody[thisNote],noteDuration);


    int pauseBetweenNotes = noteDuration * 1.30;

    delay(pauseBetweenNotes);

    noTone(8);

  }

}


void loop() {

  // no need to repeat the melody.

}


tone( 'pinNum' , 'toneNote' , 'toneDuration' ); 를 채워주면되는데

Note는 음계 ( 도레미파솔라시도 )

Duration 는 지속시간(ms) 입니다.


아두이노 셈플 소스를 재생해보면 띠리리띠리띠띠! 라는 소리를 들을 수 있습니다.

따로 동영상을 촬영하지않아서 넘어가겠습니다.





이제 피아노! 를 만들어봅시다.


위의 회로를 사용하여 아래그림처럼 꾸몄습니다.


버튼의 용도는 2345 6789 핀을 이용해서

도래미파 솔라시도 이런식으로 넣어주었고 

소리의 경우 출력과 그라운드를 별도의 스피커에 넣어주였습니다.


음표는 같이 동봉된  pitches.h 를 보고 만드시면 됩니다.









방학하고 막 만든 LED 큐브 입니다. 아두이노와 연동은 아직 하지않은 상태고요 3x3x3 배열로 구성했습니다.


혼자납댐하다보니 피사의 사탑이

되었내요.


위에는 작동영상입니다.


카메라가 없어서 휴대폰으로 영상을 촬영하였습니다.




1. 버튼다루기!!


버튼이란 눌렸을때 , 안눌렸을때 를 구분하는 기능을 합니다. 오락실가면 보는 버튼들을 생각하시면되죠.


이번에 할 소스는 '버튼' 을 이용하여 'LED'를 껏다 켰다 하기입니다.


설계도를보시면 5V로 출력하는 부분이 스위치에 연결되어있고 

- 하나는 저항을 통해 접지

- 다른하나는 2번핀으로 들어갑니다.

* 여기서 저항을 사용하는이유 => 저항이없으면 모든전력이 GND로 들어가게됩니다, 하지만 저항이있기에 남는전류가 2번핀으로 들어가게되여 입력되게 됩니다.


위 설계도는 버튼을 눌렀을때 , 안눌렀을때 를 구분하는법입니다. 이제 빵판에 버튼을 이용해 LED를 제어해보도록 하겠습니다.




우선 편하게 진행하기위해 5v는 +에 접지는 -에 꼳아줍니다.

그다음 

버튼을 설치합니다.

버튼은 대각선으로 작동합니다. 버튼이 눌렸을때 대각선끼리 이어준다고 생각하시면됩니다.

이렇게되면 위의 설계도처럼 완성이되었내요.


다음은 LED를 설치합니다. 1일차와 같은원리니 어렵지 않다고 생각합니다.


 소스코드 1


const int buttonPin = 2;

const int ledPin =  11;

int buttonState = 0;

// v

void setup() {

    pinMode(ledPin, OUTPUT);      

    pinMode(buttonPin, INPUT);     

}


void loop(){

    buttonState = digitalRead(buttonPin);


   if (buttonState == HIGH) {     

      digitalWrite(ledPin, HIGH);  

  } 

  else {

     digitalWrite(ledPin, LOW); 

  }

}


위의 소스코드를 적고 작동시키면 아래와 같이 실행될 것입니다.






2. 버튼 2개로 LED 제어하기



빨간 LED는 아직사용할것이 아니니 신경쓰지 마셔도됩니다.

위의 설계도를 참고하여  버튼을 하나더 추가한뒤 소스를 변경해줍니다.


 소스코드 2


const int buttonPin = 2;

const int buttonPin2 = 4;

const int ledPin =  11;

int buttonState = 0;

int buttonState2 = 0;


void setup() {

    pinMode(ledPin, OUTPUT);      

    pinMode(buttonPin, INPUT);     

    pinMode(buttonPin2, INPUT);         

}


void loop(){

    buttonState = digitalRead(buttonPin);

    buttonState2 = digitalRead(buttonPin2);


   if (buttonState == HIGH && buttonState2 == HIGH) {     

      digitalWrite(ledPin, HIGH);  

  } 

  else {

     digitalWrite(ledPin, LOW); 

  }

}


위의 소스코드를 적고 작동시키면 아래와 같이 실행될 것입니다.






- 보너스

위의 방법을 활용하여 버튼2개눌렸을때 3개눌렸을때를 제어해봅시다.



솔직히 동영상이나 설명만보면어렵고

제글을 보러오신분들은 직접 해보시는걸 추천합니다. 사진만 따라하셔도 도움이 되리라 생각드려요.

C를 하신다는 가정하에 글을적기에 소스코드는 따로 설명드리지않습니다.


내일 또 오겠습니다.

'Programming > Arduino' 카테고리의 다른 글

74HC595를 이용한 3핀->8핀 만들기  (1) 2013.01.17
4일차 가변저항으로 LED 제어하기  (2) 2013.01.12
3일차 아두이노 피아노 만들기!!!  (2) 2013.01.11
보너스 - LED CUBE  (0) 2013.01.09
1일차 LED에 불켜보기.  (0) 2013.01.07

+ Recent posts