nTree
가치가 있다고 생각되는 만큼 과감하게 자신의 노력과 근성을 투자하라. 나무의 크기와 열매는 그 다음이다.
Branches :     소개 선우 그녀 편지 주저리 Apple CS Perl FBP Arduino erinPaper
 
Arduino - rss link

요즘 한참 유명한 Arduino에 입문하다.!!
AVR을 직접 다루는 것보다 간단한 skech(coding)이 가능하다는 이야기를 듣고 한번 쯤 경험해보려고 시작했다.
이렇게 되었으니 머리 속에만 있었던, 너무나 만들어 보고 싶었던 다양한 것들을 시도해보기로 한다.
reference: http://arduino.cc/en/Reference/HomePage
 

2012.01.11 - 22:00:09

 

WiFly Shield Test

 


 

매번 함께 올리는 사진에 UNO 혼자 만이 아닌 WiFly Shield가 함께 붙어 있는 사진을 매번 올려놓고서는 이제야 Test해 보았다. 일단 당장 만들어보고 싶은 것이 있는데 간단하지만 별도의 Protocol을 설계할 필요가 있는 것이기 때문에 WiFly Shield를 제대로 쓸 필요가 있다. 여러 sample code들을 돌려보면서 마지막으로 간단히 수정하여 다음과 같이 sketch해 봤다. (code는 gitHub link로 대체한다.)
 

해당 code를 가지고 다음과 같은 결과를 얻었다.
(결과는 매우 길기 때문에 아랫부분은 생략하였다.)

Open serial connection
Attempting to connect to SPI UART for WiFi
Associated
connected to eriny.net
HTTP/1.1 200 OK
Date: Wed, 11 Jan 2012 12:43:02 GMT
Server: Apache
X-Powered-By: PHP/5.3.3
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Language: en

<!DOCTYPE html>
<!--
	nTree
	Ver 0.8.6 | 2011.10.04
-->
<html>

<head>
 

Github: https://gist.github.com/1620823
 

 

2012.01.11 - 00:29:15

 

Sketch with C?

 


 

Arduino에서 code를 작성하는 것을 Sketch라고 한다. Arduino의 Sketch를 이해하기 위하여 sample code로 제공하는 LED Blink를 살펴보면 code가 C와 매우 유사한 듯하다. (개인적인 생각으로는 #include라던가, main() 등을 생략하고 작성하고 있는 것으로 이해된다.)
 

일단, 여기서 우리가 이해해야하는 것은 setup(), loop(), pinMode(), digitalWrite() 등이다. pinMode()는 Arduino sketch가 아니라 AVR을 위한 coding을 한다고 한다고 했을 때에, DDR register에 값을 쓰는 것으로 해당 pin을 INPUT으로 사용하는 가? 또는 OUTPUT으로 사용하는 가?를 결정하는 것이며 digitalWrite()는 PORTx register에 값을 쓰는 것으로 해당 pin에 Data를 쓰는 역활을 하는 것으로 이해된다.
또한 setup()은 program이 최초에 한번 실행되는 function으로 이름과 같이 기본적인 설정들을 넣는 용도로 사용된다. loop()를 사용하기 전 초기화해야하는 것이나 미리 실행시켜 둘 필요가 있는 작업들을 기록하면 된다. loop()는 계속해서 반복될 일련의 작업을 기록하면 된다.
 

아래는 sketch에 사용되는 언어가 c언어 인가? 하는 부분을 확인하기 위하여 source file 길이를 쓸데없이(?) 늘려보았다. 회로는 Arduino 2번부터 4번 pin까지에 각각 330ohm 저항[1]과 LED를 순서대로 연결하여 다시 Arduino의 GND에 연결하였다.

int ledPin1= 2;
int ledPin2= 3;
int ledPin3= 4;

int ledArray[3];
int pinMax;
int current;
int sw;

void setup() { 
  ledArray[0]= ledPin1;
  ledArray[1]= ledPin2;
  ledArray[2]= ledPin3;

  pinMax= 3;  
  for(int i=0; i<pinMax; i++) {  
    pinMode(ledArray[i], OUTPUT);     
  }  
  
  current= 0;
  sw= 1;
}

void loop() {
  ledBlink();
  switchDirection();
}

void ledBlink()
{
  for(int i=0; i<pinMax; i++) {
    if(current==i) digitalWrite(ledArray[i], HIGH);
    else digitalWrite(ledArray[i], LOW);
  }
  delay(500);
}

void switchDirection()
{
  current= current + sw;
  if(current+1 >= pinMax || current-1 <= 0) sw= sw*-1;
}
 

이렇게만 봐서는 c라고 이야기할 수도 있을 것 같지만

Serial.println(number, DEC);
와 같은 문법이 존재하므로 확실히 이렇다고 이야기하기가 힘들듯 하다. Serial.println()는 class를 이용하는 것 같으니 C++, Java 같은 느낌을 주지 않는 가? 그냥 적당히 C++의 subset 정도로 생각하면 되는 걸까나? [2] 잘 알고 계시는 누군가가 알려주셨으면 좋겠군요...
 

[1] 위 사진에서 저항이 잘 보이지 않지만 분명히 각각 330ohm 저항을 연결하였다.
[2] freenode(irc)의 #perl-kr에 계시는 chammse_x201님의 말씀입니다.
 

 

2012.01.09 - 22:41:52

 

LED Blink Test

 


 

아두이노(Arduino)[1]는 open-source hardware로 AVR을 기반으로하고 있다. 일반적으로 AVR을 이용한 것이기 때문에 아두이노를 가지고도 AVR에서 행했던 coding, compile, upload(with ISP)를 그대로 할 수 있으나, 아두이노는 기본적으로 제공하는 IDE가 있기 때문에 해당 IDE를 이용하여 coding, compile, upload의 과정을 모두 할 수 있으며, 기존의 assembly, C, C++을 이용하여 coding 하는 것보다 쉽게 할 수 있도록 하고 있다. 중요한 것은 Open-source를 기반으로 하였기 때문에 아두이노(Arudino)의 회로도가 공개되어 있고, Board를 구입할 필요없이 누구나 직접 Board를 만들고 수정할 수 있다.
 

아두이노(Arduino)를 소개하고 있는 이유는 AVR을 직접 다루는 것보다 매우 쉽다는 이야기를 주변에서 귀가 닳도록 이미 들은 것과, 다양한 Shield의 제공으로 Hardware의 대부분을 직접 구현하지 않아도 구입하여 쉽게 사용할 수 있다는 이야기를 들어왔기 때문에 다양하게 Test하면서 사용해보고 간단한 무언가(?)를 만들어 볼 예정이다.
 

위 사진은 아트로봇[2]에서 구입한 Arduino UNO R3, WiFly Shield를 붙여 놓은 형태이며, WiFly Shield의 앞부분이 UNO R3에 재적층 핀을 사용하여 연결하게되면 길이가 길어 붙일 수 없으므로 전지가위를 이용하여 일부분을 잘라낸 후 재적층 핀을 이용하여 연결하였다.
 

int ledPort= 2;

void setup() {                
  pinMode(ledPort, OUTPUT);     
}

void loop() {
  digitalWrite(ledPort, HIGH);
  delay(1000);
  digitalWrite(ledPort, LOW);
  delay(1000);
}
위 code는 UNO R3의 기본동작을 확인하기 위하여 작성한 것으로, 간단히 LED Blink를 Test할 수 있는 code이다. Pin 2과 GND 사이에 330ohm 저항과 LED를 배치함으로써 Test할 수 있다. Pin 2를 꼭 사용해야 하는 것은 아니지만 WiFly Shield를 재적층핀으로 연결하여 그 위를 사용하고 있기 때문에 WiFly Shield에서 사용하고 있는 Pin을 피하여 사용하였다. 만약 Pin 13을 사용하였다면 별도의 LED 연결 필요없이 UNO R3에 TX, RX 신호 확인을 위한 LED 위에 있는 LED를 통하여 확인할 수 있다.
 

기억을 되살려 기존의 방식대로 code를 작성한다면 다음과 같을 것이다.

#include <avr/io.h>
#include <util/delay.h>

int main()
{
  DDRB0= 0x1;

  while(1) {
    PORTB0= 0x1;
    _delay_ms(1000);
    PORTB0= 0x0;
    _delay_ms(1000);
  }

  return 0;
}
 

[1] http://arduino.cc/
[2] http://www.artrobot.co.kr/
 

<<   1   >>
 
rss feed / created by yuki.n.pl