블로그 검색
AVR 명령어 검색
전자부품 검색

아두이노(arduino)에서 2색 도트매트릭스를 구동시켜 보았습니다.

부품

아두이노(arduino)
도트매트릭스(DotMatrix 8x8 2색)
74HC595 x2
74HC138


나름 하트를 그려봤는데 생각만큼 이쁘게 나오진 않는군요 ^^;


배선이 좀 많이 들어가네요
핀은 24핀으로 위에 12, 아래 12개 입니다.
핀소켓에 납땜으로 배선을 연결했습니다.
전선이 부드러운줄 알았는데 연결하고 나니 엄청 뻣뻣하네요 ㅜㅜ


1번핀 - [LED1-],   2번핀 - [LED1적+], 3번핀 - [LED1녹+], 4번핀 - [LED2-],   2번핀 - [LED2적+], 3번핀 - [LED2녹+]......
위 사진상으로 보면 모델번호를 위로 놓고 볼때 우상터 1~12, 우하 13~24번 입니다.




가장 왼쪽 브레드보드 대신에 도트매트릭스라고 보고
이 보드의 red에 연결된 흰색 배선 위쪽부터 도트매트릭스의 2,5,8,11,14,17,20,23,
green에 연결된 배선 위쪽부터 도트매트릭스의 3,6,9,12,15 18,21,24 번에 연결합니다.



74HC138 디코더 입니다.
Y0 ~ Y7 은 도트매트릭스의 1,4,7,10,13,16,19,22에 각각 연결합니다.
4, 5번 핀은 GND, 6번핀은 VCC에 연결합니다.
A0~A2는 아두이노의 digital 5~7에 연결합니다,







소스

//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;

//holders for infromation you're going to pass to shifting function
byte data;
byte data2;
byte dataArray[10];
int val=0;

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  // 74HC138N 
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);

  dataArray[0] = 0x24; //00100100
  dataArray[1] = 0x5a; //01011010
  dataArray[2] = 0x81; //10000001
  dataArray[3] = 0x81; //10000001
  dataArray[4] = 0x81; //10000001
  dataArray[5] = 0x42; //01000010
  dataArray[6] = 0x24; //00100100
  dataArray[7] = 0x18; //00011000
}

void loop() {
  for (int j = 0; j < 8; j++) {
    //load the light sequence you want from array
    data = dataArray[j];
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 0);

    shiftOut(dataPin, clockPin, LSBFIRST, 0); 
    shiftOut(dataPin, clockPin, LSBFIRST, data); 
    digitalWrite(7, j>>2 & 0x1);
    digitalWrite(6, j>>1 & 0x1);
    digitalWrite(5, j & 0x1);

    digitalWrite(latchPin, 1);
    delay(1);
  }
}


선이 뻣뻣해서 매트릭스가 공중에 떠버렸습니다.
깔끔하게 하려면 만능기판으로 옮겨야할듯싶네요. 다시만들어야겠네....ㅜㅜ

원래 2색인데, 2색 모두 구동 됩니다만 데이타 만들기 귀찮아서 단색만 했습니다.
회로는 2색 모두 지원합니다.
저항 연결하니 빛이 어두워서 저항도 연결하지 않았습니다.

Posted by pepsiman
comments powered by Disqus
이 글은 arv을 배우려는 사람보다는 저처럼 비 전공자(피지컬 컴퓨팅, 미디어아트, 인터렉티브 미디어 분야등)가 avr에 관심을 갖고 계신분에게 더 유용할꺼라 생각됩니다.
처음 이쪽 분야를 접하고 arduino나 wiring, atmega128(avr 중하나)을 접하면서 선택의 기로에 서게 됩니다.
이때 이글이 도움이 되길 바랍니다.

1. Arduino
아두이노 데시밀라는 atmega168 칩을 사용합니다
칩만 보면 메모리는 8k이고 가격은 4천원대 입니다.(디바이스마트)

아두이노 두에밀라노브는 328(메모리 32k)을 사용하고 국내 정식(플러그하우스)판매가격은 3.9만원 합니다, ($29.95)

아두이노 데시밀라는 168 사용(메모리 16k)

아두이노 미니는 168을 사용하고 국내 정식판매가격은 4.8만원 합니다 ($33.95)

arduino nano는 별로 특징이 없네요. 미니 usb를 가지고 있어 좋기는한데 너무 큰듯한...

최근에 나온 아두이노 메가는 1280칩(메모리 128k)을 사용하고 


1-1 . Arduino 호환보드


아두이노스토리 카페의 딸기보드는 카페에서 공동 제작 형식으로 판매했던것 같은데 사용자가 많지않아 더이상 생산은 어려울것 같습니다.

AVRTOOLS에서 아두이노 데시밀라(168) 호환보드를 팔고 있고, 아두이노 미니 호환 보드도 팔고 있는데 가격도 저렴하고 크기도 작아 상당히 매력이 있네요.

2. Wiring

와이어링에서 사용하는 atmega128 칩은 128k 메모리에 6~7천원 합니다.(디바이스마트)
Wiring-IO (atmega128)를 샘플전자에서 17.6만원에 팔고 있네요ㅡㅡ; (이런 날...)

Wiring mini 샘플전자에서 12.1만원에 팔고 있습니다

2-2. Wiring 호환보
샘플전자에서 와이어링 미니 호환보드를 2.9만원에 판매하고 있습니다.


3. AVR

AVR은 ATmel사의 mcu로 메모리와 속도등에 따라 상당히 많은 종류가 있습니다.
그중에 가장 가격대비 성능이 좋은 atmega128이 많이 쓰이는것 같습니다.(6~7천원대)
외국에서는 attiny2313 칩도 많이 쓰더군요(2000원정도)

이러한 128보드는 1만원대 부터 다양하게 있는데 가장 싼것들은 mcu에 핀만 연결해놓은것으로 다용도로 쓸수 있고 가격도 쌉니다. arduino나  wiring도 이런 기본 보드에 속합니다.
비싼보드는 여러가지 센서나 스위치, LCD등을 붙여 놓아 별도로 구입하는 번거로움을 없에기는 했으나 가격이 꽤 비쌉니다. 
이런 교육용보드중에 유명한것으로는 네이버의 당근이의 AVR갖고 놀기 카페의 당근보드(atmega32)와 아두이노스토리 카의 체리보드(atmega128)가 있고 이들을 이용하면 카페에서 지속적인 도움을 받을수 있어 편리합니다.
당근보드 메인4만원 + 디스플레이보드 4만원

체리보드 5.5만원(2009.06.08 현재 공구중 - 아두이노 스토리카페)



4. avr을 arduino로 만들기

atmega168 보드들은 아르두이노 부트로더를 올리면 아르두이노로 쓸수 있습니다.
atmega128 보드들은 와이어링 부트로더를 올리면 와이어링으로 쓸수 있습니다.(32.768K의 크리스탈을 달아야만 합니다)

이방법이 가장 저렴하긴한데 좀 번거롭습니다.
그리고 초기에는 그다지 저렴하지도 않고요. (이것 저것 준비할게 많습니다. ISP, usb2uart)

작은태양님께서 atmega168(AVRMall) 보드에 arduino 부트로더를 올려 아르두이노로 만드는 과정을 포스팅해 놓으셨습니다. http://tinysun.net/8

동작시켜보기 위한 과정을 간단히 요약해보면
부트로더 심기
1) 아르두이노 부트로더 다운로드
2) atmega168에 ISP를 연결하여 부트로더 업로드
사용하기
3) usb2uart 연결하기
4) IDE 에서 프로그램 작성 및 컴파일
5) arduino(atmega168)에 프로그램 업로드
6) 동작

1),2) 만 하면 아르두이노가 만들어 진겁니다.
하지만 avr(atmega168)이나 아르두이노 미니 같은경우 USB 포트가 없기 때문에 usb2uart 모듈을 이용하여 프로그램을 업로드 해야 합니다.
저근 이부분이 이해가 안돼서 처음에 무지 고생했지요.

직접 만들어보는것도 좋지만 호환보드들도 워낙 저렴하니 호환보드를 구입해서 쓰는것도 추천할만한 방법입니다.
Posted by pepsiman
comments powered by Disqus
얼마전 arduino에 인터넷에 연결하기 위한 모듈이 nemo10과 rj45잭을 구입했습니다
수아파파님 블로그를 열심히 들여다 보고 회로도도 보고 해서 빵판에 여기 저기 연결해 보았으나  아직 지식이 부족한건지 이해도 잘 안되고 어디가 문제인지 파악도 어렵고, 그리서 일단 보류하고 있던중....
수아파파님 블로그에 놀러 갔다가 나우테스님의 리플을보고 techblog.tistory.com에 방문해 wiznet의 이더넷 모듈을 알게 되었습니다.

W5100칩 안에 TCP, UDP, IP, ARP, ICMP, IGMP, PPPoE, MAC 프로토콜과 PHY 까지 모두 내장 되어 있는 것 같습니다.
모듈에는 rj45잭까지 붙어 있으니 바로 arduino에 붙이 SPI통신만 하면 될꺼 같습니다.
arduino에서 사용하는 이더넷 라이브러리도 바로 사용가능 하다니 현재로서는 최상의 선택인듯합니다.
그래서 바로 구입...


나우테스님의 포스팅에 810모델은 핀간격이 2mm라고 해서 다른 모델을 보니 핀간격이 2.54mm인 811모델이 있길래 그것을 주문했습니다.

위즈넷 홈피에있는 각 모듈별 호환표 입니다.

  WIZ810MJ WIZ811MJ WIZ812MJ
Architecture TCP/IP W5100
PHY Embedded in W5100
Mag Jack PPT RJ113BZ
Interface 10/100 Base-T Ethernet (Auto Detection)
Network Protocol TCP, UDP, IP, ARP, ICMP, IGMP, PPPoE, MAC
Dimension(mm) 52 x 25 x 21
(W x H x D)
55.5 x 25 x 23.5
(W x H x D)
55.5 x 25 x 23.5
(W x H x D)

Connector Type

2mm pitch
14 x 2 header

2.54mm pitch
10 x 2 header

2.54mm pitch
10 x 2 header

J2:9 GND
->RX_LED

J2:10 GND
->TX_LED

J2:19 GND
->LINK_LED
PCB Through Hole X

Two PCB Throughhole
(ø3.00mm)

Four PCB Throughhole
(ø3.00mm)
SPI Signal Pin Shared for SPI
and BUS signals
Separated for
SPI signals
(SPI_EN controlled by /SCS signal)
Separated for
SPI signals
(SPI_EN controlled by /SCS signal)
LINK LED When the link is established,
LED is on and flashes
at the TX or RX
When the link is established,
LED is on,
but not flashes
at the TX or RX
Input Voltage 3.3V internal operation and 5V tolerant I/Os
Power Consumtion 10/100 baseT max. 185mA (3.3V)


도착하면 다시 포스팅하겠습니다.



추가)
나우테스님이 소개해주시기 전에는 위드로봇에 e2net 이라는 모델을 보고 있었습니다.
이 모델도 SPI 통신을 하고 좋은 점은 브레드보드에 직접 연결가능한 핀과 적은 핀수....
허나 결정적으로 TCP 프로토콜을 직접 프로그램해줘야 한다네요. 소스는 물론 회사에서 제공하고 있으나 avr의 메모리를 차지한다는 단점때문에 wiznet 모델로 선회하게 되었습니다.


위 모델입니다. 생긴건 심플하니 괜찮은데....
ENC28J60 라는 칩을 사용한다는군요.
Posted by pepsiman
comments powered by Disqus
LCD를 연결하고나니 활용방안이 많네요.
지난번 arduino 전압계에 이어 요번엔 자전거용 속도계를 만들어봤습니다.

회로는 전압계와 비슷합니다. 전압계는 아날로그 입력을 사용했고, 속도계는 디지털입력을 사용한다는 차이뿐
하지만 프로그램은 약간더 복잡하지요.

사용부품

[플러그하우스판매]아두이노 두에밀라노브 1개
usb케이블 1개
[디바이스마트]점퍼와이어 (피복 안에 선이 하나로 된 전선) 1m 이상
캐릭터LCD 16x2 14핀(또는 16핀 - 백라이트지원) 1개
핀헤더 Single 1x40Pin Straight(2.54mm) 1개
ND자석 (네오디움) 10pi x 2T 1개
리드스위치 PMC1001 1개
(* 리드스위치는 잘 망가지니 여분으로 하나 정도는 더 구입하시길)
9v 배터리스넵  Snap.I-3(for 9V)  1개
dc 플러그 2.5pi 1개
브레드보드 WBU-D, WBU-T 각 1개
저항 10K옴 1개
TRIMMER(가변저항) WIW1036(3323 Series)-10KΩ 1개

기타 [디바이스마트 또는 동네 전파사]
인두 1개
실납 1개
니퍼 1개
전연 테이프 1개


자전거에 장착해야 하기 때문에 좀더 튼튼하게(?) 고정했습니다. 고무줄로...^^;;



속도를 측정하기 위해서 한바퀴 회전하는데 걸리는 시간을 측정했습니다.
일반적으로 판매되는 자전거용 속도계와 원리는 같습니다.
자석 스위치를 앞바퀴 프레임에 붙이고 자석은 바퀴살에 붙였습니다. 자석이 스위치옆을 지날때마다 스위치가 단락됩니다.

자석 스위치는 위와 같이 생겼습니다. 표면이 유리인데 납땜하고 약간 비틀었더니 부서져 버려서 하나는 망가져 버렸습니다.
자석을 스위치 근처로 가져가면 스위치가 단락됩니다.

검은색 전기 테이프로 대충 고정했습니다. 프레임에 스위치의 간격조절도 테이프를 대충 말아서 높이를 줬습니다.

고정도 대충하고 자석

바퀴살에 붙어있는것이 nd 자석이라불리는 지름 10mm짜리 네오디움자석을 테이프로 고정해서 붙였습니다.

자석과 스위치의 간격은 약 1cm 정도 되는데 동작은 잘하네요.
스위치의 선은 브레이크 라인을 타고 올라와 아르두이노가 있는 빵판에 연결됩니다.

왼쪽은 LCD모듈 오른쪽은 9v 배터리, 아래로 아르두이노가 있네요.
자전거에 장착은 검정테이프 하나가 다입니다. 떨어질까봐 조마 조마 ^^;
자전거를 살짝 움직여보니 시속5km라고 찍혔네요. 옆에 RPS는 초당 앞바퀴 회전수....나중에 페달 회전수가 들어가야 하는데,
스위치를 하나 망가트리는 바람에 바퀴 회전수가 들어갔습니다.

 천천히 가니 10km는 그냥 나오더군요. 한강을 살짝 달려보았습니다. 최고 속도 32km 나오더군요.
대충 맞는거 같기도 하고....어차피 숫자 계산이니 틀리면 고치면 되겠죠.
다음에 gps를 가져가서 속도를 비교해봐야겠네요. 그때까지 분해가 안된다면....ㅋㅋㅋ

To Do
자전거를 멈췄을때 속도가 0이 안되는 문제 -> 스위치가 on 됐을때만 속도를 계산하기 때문
페달 회정수 측정 -> 스위치 구입
외관 디자인 자전거고정 -> OTL

속도 계산
바퀴둘레     = 26인치 * 25.4 * 3.14 = 2074 mm = 2.074 m = 0.002074 km
속도(시속)  ->  한바퀴회전시간(ms) : 0.002074 km(바퀴둘레) = 1000ms * 60 * 60 (1시간) : 1시간동안 이동거리
속도(km/h) =  7466.4 / 한바퀴회전시간(ms)


두번째 압축 파일은 아두이노 개발툴 설치 폴더의 hardware\libraries\LiquidCrystal_pepsiman 폴더에 압축을 풀어주세요.
(이 파일은 플러그 하우스LCD용 파일입니다. 다른 LCD는 Arduino 사이트의 LiquidCrystal 라이브러리를 사용하세요)
소스코드
#include <stdio.h>
#include <LiquidCrystal_pepsiman.h>

// LiquidCrystal display with:
// rs. rw, e, d4, d5, d6, d7 - LCD pin name
//  4,  5, 6, 11, 12, 13, 14 - LCD pin #
LiquidCrystal lcd(2,3,4,  8,9,10,11); // arduino pin #

char buf[33]={0};
unsigned long time, oldtime, delta;
float spd=0;
int ledpin = 13, swpin=12, swval=0, oldswval=0;

void setup()
{
  Serial.begin(9600);

  pinMode(ledpin, OUTPUT);
  pinMode(swpin, INPUT);
  lcd.clear();
  lcd.print("hello, world!.............");
}

void loop()
{
  swval = digitalRead(swpin);
  if (oldswval == LOW && swval == HIGH)
  {
    time = millis();
    delta = millis() - oldtime;
    //26" * 25.4 * 3.141592 = 2.074m, 0.002174 km;
    // * 3600 = 7446.4 km/s
    spd = 7466.4 / (float)delta;
   
    sprintf(buf, "SPD %3ld RPS %4ld", (long)spd, (long)(1.0 / (float)delta * 1000.0));
    Serial.println(buf);
    lcd.clear();
    lcd.print(buf);
   
    oldtime = time;
    digitalWrite(ledpin, HIGH);
    delay(20);
  }
  digitalWrite(ledpin, LOW);
  oldswval = swval;
}


추가) 회로에 대한 문의가 있어서 추가 합니다.

솔찍히 회로 라고 할만한게 없습니다 ^^;
리드 스위치를 아두이노의 12번 핀에 연결하면 끝입니다.(하나는 GND, 하나는 아두이노의 D12)

추가) 전원(베터리)에 대한 문의가 있어서 추가합니다.

아두이노는 기본적으로 아답터 단자로 들어오는 7~12v 전압을 5v로 바꿔주는 레귤레이터를 내장하고 있습니다.
따라서 9v전지용 스넵단자와 아답터 단자를 구입해서 선으로 연결해 주기만하면 
아답터 단자로 9v전지를 연결해 아두이노의 전원으로 사용할 수 있습니다.
Posted by pepsiman
comments powered by Disqus
LCD 구동 이후 무엇을 해볼까 하다가 전압계를 만들어 보았습니다.

머 말은 거창하지만 사실 아르두이노의 아날로그 입력을 이용하면 간단합니다.
선만 두개 더 추가하면 되지요.

아르두이노의 아날로그 입력은 0 ~ 5v를 입력받을수 있습니다. 해상도는 10bit = 1024입니다.
즉 0.0048828125v , 약 4.88mV 단위로 측정가능합니다.

위 사진은 충전지의 전압을 측정해 본것입니다. 약 1.22v가 나오네요.
소수점 출력하는법을 몰라 x100 해버렸습니다. ^^; (출력 formatting 하는 법좀 알려주세요~)
암튼 별건 아니지만 재미있네요.



#include <LiquidCrystal.h>
// LiquidCrystal display with:
// rs. rw, e, d4, d5, d6, d7 - LCD pin name
//  4,  5, 6, 11, 12, 13, 14 - LCD pin #
LiquidCrystal lcd(2,3,4,  8,9,10,11); // arduino pin #
int val = 0;
void setup()
{
  Serial.begin(9600);
  lcd.clear();
  lcd.print("hello, world!.............");
  delay(1000);
}
void loop()
{
  val = analogRead(0)*500.0/1024.0;    // read the value from the sensor
  Serial.println(val, DEC);
  lcd.clear();
  lcd.print(val);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
}

숙제가 하나 남았네요.
5v가 넘는 전압은 어떻게 해야 측정이 가능할까요?

추가) 
아두이노에 5v이상의 전압을 직접 연결하면 아두이노가 사망할수 있으니 주의하세요.
5v 이상의 전압을 측정하려면 전압나눔 회로를 사용해야 합니다.

Posted by pepsiman
comments powered by Disqus
arduino 에서 LCD 구동하기 1에서 해결하지 못한 반쪽만 나오는 버그를 기존 라이브러리로는 도저히 안되서 이것 저것 라이브러리를 봐가며 수정하여 겨우 동작하는 화면을 볼수 있었습니다. 이로써 데이터선 4개로 연결되는 4bit LCD가 완성됐다

그런데 가끔 LCD의 화면이 나오지않거나 문자가 이상하게 찍히는 문제가 있었는데, 원인을 잘 모르겠네요.


16 문자 짜리 LCD인데, 8 x 2 로 2Line LCD로 인식하더군요.
덕분에 스크롤 명령을 실행하면 화면이 둘로 나누어져서 동시에 스크롤 됩니다.

선꽂는게 번거로워 선에 핀해더도 연결하고, 마침 주문한 가변저항도 도착해서 연결하니 깨끗한 LCD 화면을 볼수 있었네요.



선 연결은
LCD 핀 이름 gnd, vcc, vr, rs. rw, e, d4, d5, d6, d7
LCD 핀 번호   1,      2,  3,  4,   5, 6,  11, 12, 13, 14
                                 3 - (가변저항 가운데핀)
아두이노 핀  gnd, vcc,       2,   3, 4,   8,   9, 10, 11

#include <LiquidCrystal_pepsiman.h>
// LiquidCrystal display with:
// rs. rw, e, d4, d5, d6, d7 - LCD pin name
//  4,  5, 6, 11, 12, 13, 14 - LCD pin #
LiquidCrystal lcd(2,3,4,  8,9,10,11); // arduino pin #

void setup()
{
  lcd.clear();
  lcd.print("hello, world!.............");
}

void loop()
{
}

압축 파일을 아두이노 개발툴 설치 폴더의 hardware\libraries\LiquidCrystal_pepsiman 폴더에 풀고 위 소스를 스케치에 실행 하시면 됩니다.

Posted by pepsiman
comments powered by Disqus


먼저 내가 구입한 LCD는 플러그 하우스에서 구입한 16 x 1 의 charactor LCD이다. 모노에 백라이트는 없다.
모델명은 NEL16120 이라고 적혀있다.

내가 구입한 C-LCD는 14핀을 가지고 있는데 이런 LCD를 머라고 부르는지는 아직 모르겠다.
14 ~ 16 핀을 가지고 있는 LCD는 그 핀의 용도가 정해져 있는듯 하다.

C-LCD 핀의 내용

1 - Vss, GND - 전원 - 단자
2 - Vdd, 5v 전원 + 단자
3 - Vee, LCD 밝기 가변 저항 연결
4 - RS, Register Select
5 - R/W, Read/Write
6- E, Enable
7- D0, Data bit 0
8- D1, Data bit 1
9- D2, Data bit 2
10- D3, Data bit 3
11- D4, Data bit 4
12- D5, Data bit 5
13- D6, Data bit 6
14- D7, Data bit 7
15- back light -
16- back light +

핀 구성은 위와 같다. 백라이트를 사용하지 않는다면 15, 16 핀은 필요없다.
7 ~ 14핀의 data bit도 다 연결하지 않아도 된다. 대부분 11 ~ 14핀의 4bit로 구동된다. 4bit구동시 8bit를 둘로 나누어 두번에 걸쳐 보낸다.

H/W 회로연결
본인은 회로도와 연결 사진 찾느라 무지 고생했지만 사실 알고나니 연결은 무지 쉬웠다.
lcd의 1,2번은 각각 GND와 5v에 연결하고 3번은 저항에 연결해서 GND에 연결
4 ~14번 까지 다 연결해도 되고 4, 5, 6, 7, 8, 9, 10 만 연결해도 된다.
간단하게 후자로 하겠다.
LCD의 4, 5, 6, 7, 8, 9, 10핀과 arduino의 2 ~ 8핀을 순서대로 연결한다.


sketch는 LCD4Bit lib과 LiquidCrystal lib이 있는데, LCD4Bit는 기능(함수)이 좀 많은 편이고,
LiquidCrystal는 핀배열이 편하고 프로그램도 심플하다.

아래는 LiquidCrystal 예제이다.
예제 #include <LiquidCrystal.h> // rs, rw, enable, d0, d1, d2, d3 LiquidCrystal lcd(2, 3, 4, 5, 6, 7, 8); void setup() { lcd.print("hello, world!"); } void loop() {}

하지만 문제가 있었다. LCD 16문자중 왼쪽 8문자만 출력되는것이었다. 이 문제를 수정하기 위해선 LCD 초기화시 2줄 LCD로 초기화를 해줘야 하는것 같다. 시간이 없어 문자 출력되는것만 확인하고, 아직 위의 문제는 해결하지 못한 상태이다. LCD4Bit에서는 배선이 다르다. Contr핀은 가변저항, GND와 Vcc에 RS 핀은 12에, R/W 핀은 GND에, E는 2, D0 ~ D3은 arduino의 7 ~ 10 번에 연결해야 한다. 원래는 이게 정석인듯한데, LiquidCrystal lib은 핀 배열을 내가 정의 할수 있어서 연결하기 쉽게 바꾼것이다.


아래는 LCD4Bit의 예제이다.
#include <LCD4Bit.h> //create object to control an LCD. //number of lines in display=2 LCD4Bit lcd = LCD4Bit(2); void setup() { pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat lcd.init(); } void loop() { lcd.clear(); // Clear display lcd.printIn("4 bit LCD demo"); // Dislay text on first line lcd.cursorTo(2,0); // Move cursor to second line, position 0 lcd.printIn("www.skpang.co.uk"); // Display text on second line while(1) // Endless loop flashing the LED { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } }
내 arduino에서는 LCD4Bit 예제에서 글자가 출력되지 않았다. 현재 원인 파악 중이다.

Posted by pepsiman
comments powered by Disqus
아르두이노에 필이 꽃힌지 2~3주 되었나....

국내 아르두이노 총판인 플러그 하우스가 회사 근처에 있어 충동 구매를 해버렸다.

처음에는 값싼 AVR보드를 사서 arduino부트로더를 올려볼까 생각했는데 (보드는 싼데 isp케이블과 통신 케이블까지 구입하면)거의 비슷한 돈이 들어가고 호환성은 떨어지기 때문에 정품을 구입했다.

충동구매라곤 하지만 예전부터 해보고 싶다고 생각하던것이 아르두이노로 구현 가능하다는걸 알았기 때문에,
구매에 큰 망설임은 없었다.

Duemilanove는 Diecimila의 다음 버전으로 2009라는 뜻이란다.
개선된점
USB전원과 외부전원의 자동인식 및 전환
Auto-Reset 해제가능
과전류 입력으로부터 보호

arduino와 테스트용 몇가지 부품들을 같이 구입했다.
메인 MCU가 ATmega168에서 ATmega328로 변경되었다.

뒷면 모습
정면 모습
같이 구입한 브레드보드, 저항과 LED, 1줄 문자 LCD, 외부 전원용 잭과 9V 아답터



마직막으로 vega와 연결해보았다.

2009/04/03 - [Arduino] - 마이크로 컨트롤러 용어 및 개념 정리
2009/04/06 - [Arduino] - Arduino와 Wiring
Posted by pepsiman
comments powered by Disqus

설명도 안읽어 보고 대충 USB 케이블부터 연결했다.
드라이버 설치화면이 떠서 보니 다운 받은 개발 환경의 \arduino-0015\drivers\FTDI USB Drivers 폴더가 있어서 드라이버설치
문제는 이제 부터였다.

개발환경(arduino.exe)을 실행하고 대충 blink 예제(스케치)를 불러왔는데...
어떤게 컴파일 버튼인지 모르겠네...에라 모르겠다 아무거나 눌러보자 .. 플레이 버튼을 누르니 컴파일은 된다...

하드웨어로 프로그램을 다운 받아야하는데 어떤거지....
버튼을 보니 Upload to I/O board 라는 버튼이 있다 [ ->| ] 이렇게 생긴....
다운로드가 아니고 업로드구나.....^^a
엥 ...눌렀으나 오류가 난다. 설명 보자....ㅡㅡ;;;

장치관리자에서 USB Serial port 가 COM 몇번 포트로 잡혀 있는지 확인하고
tool / serial port / com? 에서 똑같이 설정한다.
tool / Board 메뉴에서 자신의 보드를 선택한다.
그리고 다시 업로드....

avrdude: stk500_get sync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

이런 시뻘건 오류가 뜬다....무서워라.....^^;

한참 씨름하다 다시보니 보드를 잘못 설정했다.
내 보드가 Duemilanove인데 처음 arduino를 실행하니 Arduino Diecimila or Duemilanove w/ATmega168 이 선택되어 있었는데 Duemilanove만 보고 어라 자동인식(자동은 개뿔ㅡㅡ+)하네 하고 뒤에 168을 확인 안한거다. 너무 많은걸 기대했나보다.
내 보드는 Arduino Duemilanove w/ATmega328 이다.
설정을 다시 하니 업로드가 잘 된다.


개발 환경은 너무 심플하다. 비주얼 스튜디오 쓰다 이거 쓰면 완전 노트패드 수준이다...
하다못해 에러 문구 복사는 가능해야 검색이라도 해볼텐데 그것도 안된다. ㅜㅜ

blink 예제

int ledPin = 13;                // LED connected to digital pin 13

void setup()                    // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop()                     // run over and over again
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second
}




보드 구성
led 의 긴 다리(+)를 13번핀에 짧은 다리를 GND에 꽂는다.
원래는 저항을 같이 연결해야 led가 타지 않는데 13번 핀은 내부적으로 저항이 들어가 있는것 같다.
또 한가지 보드 내부에 있는 led하나가 똑같이 동작하는 걸 보니 13번 핀에 연결되 있는것 같다.
즉 (arduino Duemilanove 보드의 경우) 아무것도 연결하지 않아도 보드만으로 위 소스의 결과를 확인가능하다.

 

arduino 설정 순서
1. http://arduino.cc/en/Main/Software 에서 개발 환경 다운로드 후 아무 폴더나 압축을 푼다.
2. arduino 보드를 연결, 장치인식 후 \arduino-0015\drivers\FTDI USB Drivers 경로에서 드라이버 설치
3. arduino.exe 실행
4. 장치관리자에서 USB Serial port 가 COM 몇번 포트로 잡혀 있는지 확인
5. arduino(개발환경)메뉴에서 tool / serial port / com? 에서 똑같이 설정한다.
6. tool / Board 메뉴에서 자신의 보드를 선택한다(328인지 168인지 정확히 확인하자 ^^;)
7. file / sketchbook / examples / digital / blink 를 연다.
8. Upload to I/O board 버튼을 누른다. [ ->| ]
9. 결과확인

 

Posted by pepsiman
comments powered by Disqus
arduino는 단순한 IO 보드로 만들어진 또는 임베디드컴퓨팅) 플렛폼이다.
메인칩은 AVR인 ATmega168을 주로 사용한다.

IO는 디지털 입출력핀이 14개, 아날로그 입력이 6개, PWM 6개, 시리얼 통신포트, usb 단자, 외부 전원단자를 갖추고 있다.

아르두이노의 장점은 전자회로, 또는 프로그래밍에 익숙치않은 사람도 
쉽게 접근 가능하게 그 문턱을 낮췄다는데 의의가 있다. 
기존 AVR 프로그래밍의 경우 코딩하고 컴파일하고, isp 같은 장치로 보드에 프로그램 업로드하고 오류나면 다시 디버깅하고를 반복해야 했으나 ,
아르두이노는 usb에 꽂기만하면 연결되고 개발환경에서 업로드 버튼만 누르면 보드에 프로그램이 업로드 되어 실행된다.
전원도 USB 자체에서 충당한다.
개발 언어도 자체 언어를 사용하여 직관적인 몇개의 명령만으로 원하는 결과를 얻을수 있다.
 


LED에 불을 켜려면 LED를13번 핀에 다리하나 연결하고,GND핀에 다리하나 연결하고 끝

프로그램은
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
두줄이면 됩니다. 

불을 끄려면 
digitalWrite(13, LOW);





두개를 번갈아 쓰면 불이 깜빡이겠죠?



각종 센서와 아날로그 입력단자를 사용하면 센서도 쉽게 사용할수 있다.
예로 온도 센서를 연결한다면 디지털 온도계가 되고, 나침판 센서나 적외서 거리 센서등도 이용할수 있다.

arduino에는 shield라고 불리는 확장 보드들이 존제한다. 이 보드들은 arduino 보드의 핀에 꽂는 형태로 만들어서 얹기만 하면 기능이 확장되는것으로 무선통신 모듈, 블루투스 모듈, 이더넷 모듈, lcd제어 모듈, 서보모터 제어 모듈등 여러가지가 있다.

소스 코드도 오픈, H/W도 오픈이게 때문에 회로도도 공개되어 있다.
이쯤 되면 머리속에 상상력이 마구마구 생기지 않는가?

평소에 머리속으로 이런게 되면 좋겠다. 싶은것을 arduino는 실생활에 가능하게 해둔다는데 매력이 있다.

당신에게 필요한건 상상력 뿐!!!

Posted by pepsiman
comments powered by Disqus

티스토리 툴바