Archives  

아르두이노를 AVR ISP 프로그래머로 이용

아르두이노 보드를 AVR ISP로 이용해서 마이크로 컨트롤러 칩에 아르두이노 펌웨어를 업로드할 수 있습니다. 부트로더가 지워져서 고장난 아르두이노 보드를 복구시킬 수도 있습니다.
arduinoisp.png

LED + 16 Channel LED Driver TLC5940

112 RGB LED Coffee Table
16 Channel LED Driver TLC5940

LED matrix 8x8 + 시프트레지스터

L1000929.jpg

Arduino 56x8 scrolling LED matrix

Continue reading "LED matrix 8x8 + 시프트레지스터" »

캐패시터, Capacitor

캐패시터는 컨덴서라고도 하며 전기를 저장해둘 수 있는 일종의 축전지입니다. 디지털 회로에서는 주로 전원부와 노이즈제거에 쓰입니다. 낮은 주파수의 전기는 통과시키기 어렵기 때문에 저주파 제거 필터(하이패스 필터)로 쓰이기도 합니다.

전해 컨덴서
용량이 크고 전원부에 많이 쓰인다. 극성(+/-)이 있으므로 주의해야함.
pic 1.jpg

세라믹 컨덴서
용량이 작고 노이즈제거에 많이 쓰인다. 고속으로 작동하는 디지털 회로에서는 순간적인 노이즈도 에러를 낼 수 있기 때문에 작은 용량의 컨덴서를 이용해서 노이즈를 제거(바이패스)한다.
865.jpg

캐패시터 용량 변환
0.01uF = 10nF = 10000pF = 104
0.001uF = 1nF = 1000pF = 103
0.0001uF = 0.1nF = 100pF = 102
0.00001uF = 0.01nF = 10pF

Interfacing with Hardware

Arduino: Interfacing with Hardware

마우스

MB112.jpeg
마우스안에는 많은 센서들이 있습니다. 가장 많이 사용되는 광마우스에는 보통 버튼 스위치 3개, 로터리 인코더 1개, 광센서 1개가 있으며, 볼마우스에는 로터리 인코더 3개, 버튼스위치 3개가 있습니다. 이 센서들은 매우 정밀하고 신호를 컴퓨터로 보내는 전송속도도 빠르기 때문에 아르두이노 보드와 센서를 사용하지 않고도 작업을 할 수 있습니다. 무선마우스라면 선없이도 신호를 보낼 수 있습니다.

로터리 인코더: 회전
광센서: x,y방향의 움직임 / 회전
버튼: 눌린 상태

프로세싱에서 proControl라이브러리를 이용하면 여러 개의 마우스를 연결해서 사용할 수 있습니다.

보다 많은 LED를 연결한다, 시프트레지스터 74HC595

시프트레지스터를 이용하면 적은 수의 디지털 출력으로 많은 수의 LED를 컨트롤할 수 있습니다.
Serial to Parallel Shifting-Out with a 74HC595
74HC595
ShftOutExmp1_3.gif

//**************************************************************//
//  Name    : shiftOutCode, Hello World                                
//  Author  : Carlyn Maw,Tom Igoe, David A. Mellis 
//  Date    : 25 Oct, 2006    
//  Modified: 23 Mar 2010                                 
//  Version : 2.0                                             
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                           
//****************************************************************

//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 so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  // count from 0 to 255 and display the number 
  // on the LEDs
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    // pause before next value:
    delay(500);
  }
}

LED를 광센서로 이용

LED는 광센서(포토다이오드)로도 사용할 수 있습니다.

//
// This example shows one way of using an LED as a light sensor.
// You will need to wire up your components as such:
//
//           + digital2
//           |
//           <
//           > 100 ohm resistor
//           <
//           |
//           |
//         -----
//          / \  LED, maybe a 5mm, clear plastic is good
//         -----
//           |
//           |
//           + digital3
//
// What we are going to do is apply a positive voltage at digital2 and
// a low voltage at digital3. This is backwards for the LED, current will
// not flow and light will not come out, but we will charge up the 
// capacitance of the LED junction and the Arduino pin.
//
// Then we are going to disconnect the output drivers from digital2 and
// count how long it takes the stored charge to bleed off through the 
// the LED. The brighter the light, the faster it will bleed away to 
// digital3.
//
// Then just to be perverse we will display the brightness back on the 
// same LED by turning it on for a millisecond. This happens more often
// with brighter lighting, so the LED is dim in a dim room and brighter 
// in a bright room. Quite nice.
//
// (Though a nice idea, this implementation is flawed because the refresh
// rate gets too long in the dark and it flickers disturbingly.)
//
#define LED_N_SIDE 2
#define LED_P_SIDE 3

void setup()
{}

void loop()
{
  unsigned int j;

  // Apply reverse voltage, charge up the pin and led capacitance
  pinMode(LED_N_SIDE,OUTPUT);
  pinMode(LED_P_SIDE,OUTPUT);
  digitalWrite(LED_N_SIDE,HIGH);
  digitalWrite(LED_P_SIDE,LOW);

  // Isolate the pin 2 end of the diode
  pinMode(LED_N_SIDE,INPUT);
  digitalWrite(LED_N_SIDE,LOW);  // turn off internal pull-up resistor

  // Count how long it takes the diode to bleed back down to a logic zero
  for ( j = 0; j < 30000; j++) {
    if ( digitalRead(LED_N_SIDE)==0) break;
  }
  // You could use 'j' for something useful, but here we are just using the
  // delay of the counting.  In the dark it counts higher and takes longer, 
  // increasing the portion of the loop where the LED is off compared to 
  // the 1000 microseconds where we turn it on.

  // Turn the light on for 1000 microseconds
  digitalWrite(LED_P_SIDE,HIGH);
  digitalWrite(LED_N_SIDE,LOW);
  pinMode(LED_P_SIDE,OUTPUT);
  pinMode(LED_N_SIDE,OUTPUT);
  delayMicroseconds(1000);
  // we could turn it off, but we know that is about to happen at the loop() start
}

delay()를 사용하지 않고 타이밍을 조절

delay()함수는 동작 타이밍을 쉽게 지정할 수 있지만 일정 시간 보드를 정지시키기 때문에 그 동안은 입력을 받거나 출력을 할 수 없습니다. 아래의 코드는 delay()대신 millis()함수로 타이밍을 조절합니다.

const int ledPin =  13;      // the number of the LED pin

int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

long interval = 1000;           // interval at which to blink (milliseconds)

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

void loop()
{
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;   

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    digitalWrite(ledPin, ledState);
  }
}

광센서: 포토트랜지스터

phototr_st7l.jpg

phototr.jpg

포토트랜지스터는 CdS보다 반응속도가 빠르다. 저항은 22kohm을 사용한다.

Pong with 8x8 Led Matrix on Arduino

http://blog.bsoares.com.br/arduino/ping-pong-with-8x8-led-matrix-on-arduino

Pong with 8x8 Led Matrix on Arduino from Bruno Soares on Vimeo.

Continue reading "Pong with 8x8 Led Matrix on Arduino" »

아르두이노 보드 퓨즈 세팅

http://artofsaint.com/tt/53

센서가 일정값 이상으로 올라간 순간(rise) 카운터 증가

import processing.serial.*;

Serial myPort;  // The serial port

int i = 1;                   // counter
int dataIn;
int last;
boolean flag;
int k;

void setup () {
  size(400, 300);        // window size

  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);
  frameRate(30);
  background(0);
}

void draw () {
  while (myPort.available() > 0) {
    dataIn = int(myPort.read());
    drawGraph();

    if (last < 170) {
      if (dataIn > 170) flag = true;
    }
  }

  if (flag) {
    fill(255);
    k ++;
    flag = false;
  } 
  else fill(128);
  noStroke();
  rect(10,10,20,20);  
  last = dataIn;
  println(k);
}


void drawGraph() {
  stroke(255,200);
  line(i, height, i, height - dataIn);
  if (i >= width-2) {
    i = 0;
    noStroke();
    fill(0,100);
    rect(0,0,width,height); 
  } 
  else {
    i++;
  } 
}

적외선 센서/LED

photodiode.jpg

적외선 LED와 포토다이오드(적외선)을 이용한 간단한 장애물 센서입니다.
LED와 달리 포토 다이오드에는 역전압이 걸려 있습니다.
다이오드는 전류가 한 방향으로만 흐르는 특징을 가진 소자이지만,
포토 다이오드는 빛을 받으면 역방향으로 전류가 흐르는 성질이 있습니다.
장애물에 반사되어 돌아오는 적외선의 양을 포토 다이오드로 측정하면 장애물 유무를 판단할 수 있습니다.
주위가 밝을 경우 광원의 영향을 받을 수 있으므로 후드를 사용하는 것이 좋습니다.

Smoothing

센서에서 신호를 입력받을 때 급격한 신호변화나 노이즈가 생길 수 있습니다. 아래 예제는 순차적으로 입력받은 신호의 평균을 계산해서 신호를 안정화시킵니다.

/*
  Smoothing
  Reads repeatedly from an analog input, calculating a running average
  and printing it to the computer.  Keeps ten readings in an array and 
  continually averages them.
  
  The circuit:
    * Analog sensor (potentiometer will do) attached to analog input 0

  Created 22 April 2007
  By David A. Mellis  

  http://www.arduino.cc/en/Tutorial/Smoothing


*/


// Define the number of samples to keep track of.  The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.  Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.
const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int index = 0;                  // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = 0;

void setup()
{
  // initialize serial communication with computer:
  Serial.begin(9600);                   
  // initialize all the readings to 0: 
  for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;          
}

void loop() {
  // subtract the last reading:
  total= total - readings[index];         
  // read from the sensor:  
  readings[index] = analogRead(inputPin); 
  // add the reading to the total:
  total= total + readings[index];       
  // advance to the next position in the array:  
  index = index + 1;                    

  // if we're at the end of the array...
  if (index >= numReadings)              
    // ...wrap around to the beginning: 
    index = 0;                           

  // calculate the average:
  average = total / numReadings;         
  // send it to the computer (as ASCII digits) 
  Serial.println(average, DEC);               
}

프로세싱과 보드를 연동, Firmata

Firmata :아르두이노, 와이어링 보드와 컴퓨터(소프트웨어)를 연결하는 프로토콜. 보드에 프로그래밍하지 않고, 프로세싱에서 보드를 직접 제어할 수 있습니다.
Arduino and Processing

보드(Firmata) ----- usb ----- 프로세싱(Firmata라이브러리)

Instructions
Unzip the library and copy the "arduino" folder into the "libraries" sub-folder of your Processing Sketchbook.
Run Arduino, open the Examples > Firmata > StandardFirmata sketch, and upload it to the Arduino board.
Configure Processing for serial: http://processing.org/reference/libraries/serial/
In Processing, open one of the examples that comes with with the Arduino library.
Edit the example code to select the correct serial port.
Run the example.

프로세싱 예제

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;
int ledPin = 13;

void setup()
{
  //println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[0], 57600);
  arduino.pinMode(ledPin, Arduino.OUTPUT);
}

void draw()
{
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(1000);
}


Funnel Gainer, Arduino, Funnel I/O등의 하드웨어와 프로세싱, flash를 연결

flipflop

플립플롭은 1비트의 정보를 기억할 수 있는 회로입니다. 아래 예제는 스위치를 누르고 있을 때만 HIGH가 되지 않고, 스위치를 한 번 누르면 HIGH가 되고, 다시 한 번 누르면 LOW가 되는 예제입니다.

int last;
int button;
boolean pressed = false;

void setup() {
  pinMode(0,INPUT);
  pinMode(1,OUTPUT);
  pinMode(48,OUTPUT);
  digitalWrite(48,HIGH);
}

void loop() {
  button = digitalRead(0);
  if (button != last) {
    if (button == HIGH){
      pressed = !pressed;
    } 
  }

  if(pressed == true) {
    digitalWrite(1,HIGH);
  } 
  else {
    digitalWrite(1,LOW);
  }
  last = button;
  delay(10);
}

wiring-processing

wiring-processing(processing)
wiring

하드웨어 구입처 / shop list

아르두이노 국내 판매
플러그하우스
미디어플로우

전기, 전자부품
샘플전자(주로 센서) http://www.sample.co.kr
엘레파츠 http://www.eleparts.co.kr
디바이스마트 http://www.devicemart.co.kr
스파크펀(해외) http://www.sparkfun.com/


오프라인
샘플전자(용산 전자랜드 광장층 입구) : 다양한 센서 및 키트 판매
SY전자(용산 전자랜드 광장층 입구) : 마이크로 컨트롤러, IC, 저항, 캐퍼시터 등 부품을 낱개로 판매
그외 용산 전자랜드 광장층 부품상가, 청계천 세운상가 주변 부품, 공구상가

LED backpack(arduino)

IMG_9529.jpg
IMG_9530.jpg
IMG_9531.jpg
sparkfun LED backpack(7 colors)
http://www.arduino.cc/playground/Code/RGBBackpack

// Simple program to test using the Arduino with the RGB Matrix 
// & Backpack from Sparkfun. Code is a combination of Heather Dewey-Hagborg,
// Arduino Forum user: Little-Scale, and // Daniel Hirschmann. Enjoy!
// 
// The Backpack requires 125Khz SPI, which is the slowest rate 
// at which the Arduino's hardware SPI bus can communicate at. 
// 
// We need to send SPI to the backpack in the following steps:
// 1) Activate ChipSelect; 
// 2) Wait 500microseconds;
// 3) Transfer 64bytes @ 125KHz (1 byte for each RGB LED in the matrix);
// 4) De-activate ChipSelect;
// 5) Wait 500microseconds
// Repeat however often you like!


#define CHIPSELECT 10//ss
#define SPICLOCK  13//sck
#define DATAOUT 11//MOSI / DI
#define DATAIN 12//MISO / DO

int data[] = 
{0,0,0,0,0,0,0,0,
0,0,1,1,0,1,1,0,
0,1,0,0,1,0,0,1,
0,1,0,0,0,0,0,1,
0,0,1,0,0,0,1,0,
0,0,0,1,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0
}

char spi_transfer(volatile char data)
{
  SPDR = data;            // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
}

void setup()
{
  byte clr;
  pinMode(DATAOUT,OUTPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(CHIPSELECT,OUTPUT);
  digitalWrite(CHIPSELECT,HIGH); //disable device

  SPCR = B01010001;         //SPI Registers
  SPSR = SPSR & B11111110;   //make sure the speed is 125KHz

  /*
  SPCR bits:
   7: SPIEE - enables SPI interrupt when high
   6: SPE - enable SPI bus when high
   5: DORD - LSB first when high, MSB first when low
   4: MSTR - arduino is in master mode when high, slave when low
   3: CPOL - data clock idle when high if 1, idle when low if 0
   2: CPHA - data on falling edge of clock when high, rising edge when low
   1: SPR1 - set speed of SPI bus
   0: SPR0 - set speed of SPI bus (00 is fastest @ 4MHz, 11 is slowest @ 250KHz)
   */

  clr=SPSR;
  clr=SPDR;
  delay(10);
}

void loop()        
{
    delay(100);
    int index = 0;          
    digitalWrite(CHIPSELECT,LOW); // enable the ChipSelect on the backpack
    delayMicroseconds(500);
    for (int i=0;i<8;i++) for (int j=0;j<8;j++)
    {
    spi_transfer(data[index]);
        index++;             
// There are only 8 colours available to the matrix with the 
// backpack, so this will present 1 colour per column on the matrix
    }
    digitalWrite(CHIPSELECT,HIGH); // disable the ChipSelect on the backpack
    delayMicroseconds(500);
}

wiring/arduino + flash

Download file:flash_io.zip
자세한 내용은 readme파일을 참조

flash_wiring.png

LED matrix 8x8

TriColor-Matrix-2.jpg
LED Matrix는 LED를 매트릭스로 연결한 것으로 적은 수의 핀 수로 많은 수의 LED를 컨트롤합니다. 8*8의 LED Matrix는 64개의 LED로 구성되어 있지만, 16개의 핀만으로 컨트롤할 수 있습니다.

ledMatrix.png ledmatrix_pin.png

/*
  Row-Column Scanning an 8x8 LED matrix with X-Y input
 
 This example controls an 8x8 LED matrix using two analog inputs
 
 created 27 May 2009
 modified 29 Jun 2009
 by Tom Igoe
 
 This example works for the Lumex  LDM-24488NI Matrix. See 
 http://sigma.octopart.com/140413/datasheet/Lumex-LDM-24488NI.pdf
 for the pin connections
 
 For other LED cathode column matrixes, you should only need to change 
 the pin numbers in the row[] and column[] arrays
 
 rows are the anodes
 cols are the cathodes
 ---------
 
 Pin numbers:
 Matrix:
 * Digital pins 2 through 13,
 * analog pins 2 through 5 used as digital 16 through 19
 Potentiometers:
 * center pins are attached to analog pins 0 and 1, respectively
 * side pins attached to +5V and ground, respectively.
 
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/RowColumnScanning
 
 see also http://www.tigoe.net/pcomp/code/category/arduinowiring/514 for more
 */


// 2-dimensional array of row pin numbers:
const int row[8] = {
  2,7,19,5,13,18,12,16 };

// 2-dimensional array of column pin numbers:
const int col[8] = {
  6,11,10,3,17,4,8,9  };

// 2-dimensional array of pixels:
int pixels[8][8];           

// cursor position:
int x = 5;
int y = 5;

void setup() {
  Serial.begin(9600);
  // initialize the I/O pins as outputs:

  // iterate over the pins:
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    // initialize the output pins:
    pinMode(col[thisPin], OUTPUT); 
    pinMode(row[thisPin], OUTPUT);  
    // take the col pins (i.e. the cathodes) high to ensure that
    // the LEDS are off: 
    digitalWrite(col[thisPin], HIGH);    
  }

  // initialize the pixel matrix:
  for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
      pixels[x][y] = HIGH;
    }
  }
}

void loop() {
  // read input:
  readSensors();

  // draw the screen:
  refreshScreen();
}

void readSensors() {
  // turn off the last position:
  pixels[x][y] = HIGH;
  // read the sensors for X and Y values:
  x = 7 - map(analogRead(0), 0, 1023, 0, 7);
  y = map(analogRead(1), 0, 1023, 0, 7);
  // set the new pixel position low so that the LED will turn on
  // in the next screen refresh:
  pixels[x][y] = LOW;

}

void refreshScreen() {
  // iterate over the rows (anodes):
  for (int thisRow = 0; thisRow < 8; thisRow++) {
    // take the row pin (anode) high:
    digitalWrite(row[thisRow], HIGH);
    // iterate over the cols (cathodes):
    for (int thisCol = 0; thisCol < 8; thisCol++) {
      // get the state of the current pixel;
      int thisPixel = pixels[thisRow][thisCol];
      // when the row is HIGH and the col is LOW,
      // the LED where they meet turns on:
      digitalWrite(col[thisCol], thisPixel);
      // turn the pixel off:
      if (thisPixel == LOW) {
        digitalWrite(col[thisCol], HIGH);
      }
    }
    // take the row pin low to turn off the whole row:
    digitalWrite(row[thisRow], LOW);
  }
}

MAXIM7219를 이용하는 경우
View image

LED matrix serial

Download file
Download file


LED Matrix 01

int i,j,k;
int t = 0;
int ch = 0;
int w = 8;
int h = 8;
int count = 0;

int pixels1[] = 

{
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 1, 1, 0, 0, 0,
  0, 0, 0, 1, 1, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,   
  0, 0, 0, 0, 0, 0, 0, 0,   
  0, 0, 0, 0, 0, 0, 0, 0     
};


int pixels2[] = 

{
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 0, 0,
  0, 0, 1, 0, 0, 1, 0, 0,
  0, 0, 1, 0, 0, 1, 0, 0,
  0, 0, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,  
  0, 0, 0, 0, 0, 0, 0, 0     
};


int pixels3[] = 

{
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 1, 1, 1, 1, 1, 1, 0,
  0, 1, 0, 0, 0, 0, 1, 0,
  0, 1, 0, 0, 0, 0, 1, 0,
  0, 1, 0, 0, 0, 0, 1, 0,
  0, 1, 0, 0, 0, 0 ,1, 0,
  0, 1, 1, 1, 1, 1, 1, 0,
  0, 0, 0, 0, 0, 0, 0, 0
};


int pixels4[] = 

{
  1, 1, 1, 1, 1, 1, 1, 1,
  1, 0, 0, 0, 0, 0, 0, 1,
  1, 0, 0, 0, 0, 0, 0, 1,
  1, 0, 0, 0, 0, 0, 0, 1,
  1, 0, 0, 0, 0, 0, 0, 1,
  1, 0, 0, 0, 0, 0, 0, 1,
  1, 0, 0, 0, 0, 0 ,0, 1,
  1, 1, 1, 1, 1, 1, 1, 1
};


int pixels5[] = 

{
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0 ,0, 0,
  0, 0, 0, 0, 0, 0, 0, 0
};

int pixels6[] = 

{
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0 ,0, 0,
  0, 0, 0, 0, 0, 0, 0, 0
};

int pixels7[] = 

{
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0 ,0, 0,
  0, 0, 0, 0, 0, 0, 0, 0
};


void setup(){
  for(i=0; i<>w + h; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
}



void loop(){
  if(t == 0){

    drawLED(pixels1);

  }
  else if(t == 1){

    drawLED(pixels2);

  }
  else if(t == 2){

    drawLED(pixels3);

  }
  else if(t == 3){

    drawLED(pixels4);
  }
  else if(t == 4){

    drawLED(pixels5);
  }
  else if(t == 5){

    drawLED(pixels6);
  }
  else if(t == 6){

    drawLED(pixels7);
  }

  if (count > 10) {
    t += 1;
    count = 0;
  }
  if (t > 7) t = 0;
  count++;
  delay(1);
}

void drawLED(int pixels[]){

  for(i=0; i<>w; i++){    // column
    for(k=0; k<>w; k++){  // row
      if(k==i){

        digitalWrite(k, HIGH); // select row
        for(j=0; j <> h; j++) {
          digitalWrite(j+w, 1 - pixels[j + w*i]);      
        }
        delay(2);
      }
      else{
        digitalWrite(k, LOW);
      }
    }
  }
}

와이어링 펌웨어 업로드/퓨즈비트 세팅

부트로더 파일 업로드

1.AVR ISP와 Atmega128보드를 연결하고 AVR Studio를 실행시킵니다.
(ISP와 보드에 따라 핀배열이 다를 수 있습니다. 설명서를 확인하고 연결합니다)

2. Tools>Program AVR>Connect를 선택하고 대화상자에서 Platform : STK500 or AVRISP, Port : ISP가 연결된 포트 선택

avr.jpg

3. Program탭에서 bootloader.hex파일을 선택하고 보드에 프로그램합니다.


퓨즈 비트 세팅

fuse.jpg

Fuses탭에서 다음 항목들을 선택하고 보드에 프로그램합니다.

-Serial program downloading (SPI) enabled('?' 표시)
-Boot Flash section size=1024 words
-Boot Reset vector Enabled
-CKOPT fuse
-Brown-out detection level at VCC=4.0
-Brown-out detection enabled
-Ext. Crystal/Resonator High Freq ; Start up time 16K CK + 4ms

시리얼 통신/serial communication(작성중)

와이어링 보드는 시리얼 통신(Serial:USB포트, 디지털 핀 32,33 / Serial1:디지털 핀 2,3번)으로 컴퓨터와 신호를 주고 받을 수 있습니다.
hardwareserialports.jpg

프로세싱에서 시리얼 라이브러리를 이용하면 와이어링 보드에 연결된 센서의 신호를 입력받거나, 프로세싱에서 와이어링 보드에 연결된 하드웨어를 컨트롤할 수 있습니다. 시리얼 통신은 8bit의 신호를 주고 받을 수 있으며, 속도는 2400, 4800, 9600, 19200, 38400, 115200 bps등으로 설정할 수 있습니다. (와이어링 보드의 시리얼 신호는 TTL레벨(+5V)입니다. 일반적으로 PC의 시리얼 포트는 +12v/-12V레벨이기 때문에 MAX232등을 이용해서 전압 레벨을 변환해야 합니다)

serial.jpg

Continue reading "시리얼 통신/serial communication(작성중)" »

무선 연결 - 블루투스/wireless - bluetooth(작성중)

By Mitchell Page Mpag5967 [at] mail.usyd.edu.au
Key Centre of Design Computing and Cognition, University of Sydney , Australia
http://wiring.org.co/learning/tutorials/wireless.html

블루투스 모뎀을 이용하면 와이어링 보드와 컴퓨터를 무선으로 연결해서 데이터 통신을 할 수 있습니다.
http://www.devicemart.co.kr/mart7/mall.php?cat=004012000&query=view&no=10990

bluetooth.gif

Continue reading "무선 연결 - 블루투스/wireless - bluetooth(작성중)" »

7 segment LED display

09191-1_i_ma.jpg

7 segment LED는 Common Anode과 Common Cathode 두가지 타입이 있습니다. CA형은 공통 전원을 Vcc를 연결하고 LOW에서 동작하며, CC형은 공통 전원을 GND에 연결하고 HIGH에서 동작합니다. 전원연결과 동작방법이 다르므로 주의해야합니다.

7 segment LED 내부 연결

pic10.jpg


seven_segment_display.gif

Continue reading "7 segment LED display" »

dimming R,G,B LEDs

// original source @ http://www.arduino.cc/en/Tutorial/DimmingLEDs
//

int redPin   = 0;   // Red LED
int greenPin = 1;  // Green LED
int bluePin  = 2;  // Blue LED

// Program variables
int redVal   = 255; // Variables to store the values to send to the pins
int greenVal = 1;   // Initial values are Red full, Green and Blue off
int blueVal  = 1;

int i = 0;     // Loop counter    

void setup()
{

}

// Main program
void loop()
{
  i += 1;      // Increment counter
  if (i < 255) // First phase of fades
  {
    redVal   -= 1; // Red down
    greenVal += 1; // Green up
    blueVal   = 1; // Blue low
  }
  else if (i < 509) // Second phase of fades
  {
    redVal    = 1; // Red low
    greenVal -= 1; // Green down
    blueVal  += 1; // Blue up
  } 
  else if (i < 763) // Third phase of fades
  {
    redVal  += 1; // Red up
    greenVal = 1; // Green low
    blueVal -= 1; // Blue down
  }
  else // Re-set the counter, and start the fades again
  {
    i = 1;
  }  

  analogWrite(redPin,   redVal);   // Write current values to LED pins
  analogWrite(greenPin, greenVal); 
  analogWrite(bluePin,  blueVal);  

  delay(50); 
}

사운드입력(마이크) / microphone(OP amp)

마이크로폰을 통해서 사운드를 입력받기 위해서는 증폭회로가 필요합니다.
마이크로폰은 흔하게 구할 수 있는 컨덴서 마이크를 사용하고 증폭회로는 OP amp(연산증폭기)를 이용해서 간단하게 만들 수 있습니다.


L1000912.jpg

Continue reading "사운드입력(마이크) / microphone(OP amp)" »

Hello world

와이어링을 이용해서 LED를 켜봅니다. 하드웨어 준비물 -와이어링 보드 -LED -저항(330옴) -브레드 보드 -전선

Continue reading "Hello world" »

피에조 센서 / Piezo sensor

피에조 센서는 금속판 사이에 얇은 압전 소자를 끼워넣은 센서로 소리, 진동, 압력 등을 감지할 수 있습니다. 압전 소자는 압력을 가하면 전기를 발생시키고, 교류 전기를 가하면 진동하는 성질이 있습니다.

Continue reading "피에조 센서 / Piezo sensor" »

Tags:

Wiring / Arduino

와이어링은 피지컬 컴퓨팅을 위해 만들어진 소프트웨어/하드웨어 개발 환경입니다. 다른 개발 환경과 다른 특징은
1. 오픈 소스로 만들어져 있다(프로세싱 기반, avr-gcc)
2. 하드웨어를 제어하는 언어를 배우기 쉽다(기존의 C, 어셈블리어와 비교하여)
3. 가격이 저렴하다(소프트웨어는 무료, 하드웨어는 약 $70)
4. 다양한 플랫폼에서 사용 가능 (MacOS, Windows, Linux)

Continue reading "Wiring / Arduino" »

Tags:

풀업, 풀다운 저항 / Pull-up, Pull-down resistor

푸시버튼 스위치를 비롯한 바이너리 센서 종류에 저항을 연결하는 이유는 입력값을 안정시키기 위해서 입니다. 보통 디지털 입력을 받을 때 스위치가 off면 LOW(HIGH), 스위치가 on이면 HIGH(LOW)가 들어오지만 실제 회로에서 저항이 없으면 스위치가 off인 상태에서 입력에 아무것도 연결이 안되기 때문에 입력값이 불안하게 들어옵니다. 따라서 입력을 저항으로 Vcc나 GND에 연결시켜 HIGH / LOW의 어느 한쪽 상태를 유지하도록 하고, 이를 pull-up / pull-down이라고 합니다. (첫 번째 그림은 pull-up저항을 연결시켜서 스위치가 off되었을때 HIGH신호가 들어옵니다)
와이어링 보드에서 사용되는 ATMEGA 128은 내부에 풀업 저항이 있기때문에 스위치를 바로 연결할 수도 있습니다.

sensor_button.jpg
sensor_button1.jpg

브레드보드 / Bread board

00112-01.jpg

브레드 보드는 납땜을 하지않고 부품이나 전선을 꽂아서 회로를 만들 수 있기 때문에 프로토타입 제작이나 실험용도로 많이 쓰임니다. 아래 그림에서 회색 부분은 내부적으로 서로 연결되어있습니다. 즉, 1,2번은 세로로 연결되어 있고, 3~7은 가로로 연결되어 있습니다. 보통 보드의 가장자리 두 줄은 전원(+,-)용도로 사용됩니다.

breadboard.jpg09590-03.jpg

릴레이 / Relay

00524-03-L.jpg
아르두이노 보드는 5볼트 이하만을 다룰 수 있기때문에 220볼트로 작동하는 전구나 전열기, 기타 전기기구를 제어하려면 고전압, 고전류을 스위칭할 수 있는 장치가 필요합니다. 릴레이는 전자석의 원리로 작동하는 스위치로 큰 전압을 스위칭할 수 있습니다. 리모콘으로 텔레비전이나 오디오 기기를 켤 때 나는 '딱딱' 소리는 릴레이가 작동하는 소리입니다. 릴레이를 사용할 때에는 코일을 작동시키는 전압과 스위칭할 수 있는 전압을 확인해야 합니다.

릴레이의 동작원리
relay.png

릴레이를 동작시킬 때에는 TR(2SC945, 2SC1815, 2N2222, TIP-120), MOSFET을 이용합니다. 모터나 릴레이처럼 코일을 사용하는 부품은 동작할 때 순간적으로 큰 역전류가 생길 수 있습니다. 이 전류로 인해서 회로가 손상될 수 있으므로 다이오드(1N4001 등)을 연결해 줍니다.

트랜지스터에 연결하는 저항은 다음과 같이 계산합니다.

릴레이 작동 전류: 100mA
트랜지스터 2SC1815의 증폭율은 100(b-e전류:c-e전류)
릴레이를 작동시킬 드라이브 전류 = 100mA / 100 = 1mA
드라이브 전류는 여유있게 2mA로 합니다.
저항 = (5v - 0.6v) / 2mA = 2.2Kohm
2.2Kohm의 저항을 사용합니다.

L1000905.jpg

Continue reading "릴레이 / Relay" »

Tags:

적외선 거리 센서 / IR range sensor

적외선 거리 센서는 적외선을 송신한 후 장애물에 반사되어 돌아오는 적외선으로 거리를 측정합니다. 적외선 거리센서는 적외선의 양을 측정하는 방식과 적외선의 반사각을 측정하는 방식이 있으며, 후자쪽이 더 먼 거리를 측정할 수 있습니다. 아래 예제에 쓰인 샤프사의 적외선 거리센서 GP2시리즈는 반사각 측정 방식으로 거리값을 아날로그 전압으로 출력합니다.

샤프 적외선 거리센서
infra_graph.jpg

거리에 따른 출력전압(GP2-D120, 측정가능 거리 4~30cm)
infra_graph.jpg

회로도 및 배선도
ranger.gif

Code

int distance=0; 

void setup(){ 
    Serial.begin(9600); 
    pinMode(48,OUTPUT); 
    digitalWrite(48,HIGH); 
} 



void loop(){ 
    distance = analogRead(0); //sensor connected to analog pin 0 
    Serial.println(distance, DEC); 
}
  • 위 코드를 실행시키면 와이어링의 시리얼 모니터를 통해서 수치를 확인할 수 있습니다.
Tags:

초음파 거리 센서 / Ultrasonic rangefinder

쉽게 구할 수 있는 거리 측정 센서에는 초음파 거리 센서와 적외선 거리 센서가 있습니다. 적외선 거리 센서는 출력 신호가 거리에 따라 리니어하게 출력되지 않기 때문에 정밀한 거리 측정보다는 장애물을 검지하는 데에 유리합니다. 초음파 거리 센서는 초음파가 장애물에 반사되어 돌아오는 시간으로 거리를 측정하고 정밀도는 1센티미터 이하입니다.
초음파 거리 센서 SRF-04의 트리거 핀에 10uS의 펄스 신호를 주고 에코 펄스 신호의 길이를 측정하면 거리가 나옵니다. (에코 펄스의 길이는 장애물까지의 거리에 비례하고, 이 길이를 54로 나누면 거리를 센티미터로 환산할 수 있습니다)

timing.jpg
SRF-04 초음파 모듈

timing.jpg
SRF-04 초음파 모듈 각 신호별 타이밍

srf04.jpg

Code
int trigger = 1;  // trigger pin 
int echo = 0;     // echo pin 
int val; 

void setup() { 
  Serial.begin(19200);
  pinMode(trigger, OUTPUT); 
  pinMode(echo, INPUT); 
  pinMode(48,OUTPUT);
  digitalWrite(48, HIGH); 
  digitalWrite(trigger, LOW);
} 


void loop(){ 

  digitalWrite(trigger, HIGH); // send trigger pulse
  delayMicroseconds(10); // pulse width = 10us
  digitalWrite(trigger, LOW);

  val = pulseIn(0,HIGH)/54; // distance = pulse / 54 (centimeter)
  Serial.print(val);
  delay(46);
} 
Tags:

DC모터 / DC Motor

DC 모터는 구동 전류가 크기 때문에 보드에 직접 연결할 수 없고 FET나 릴레이, 드라이버 IC를 사용해야 합니다.
1. 트랜지스터 TIP 120을 이용

2. 릴레이를 이용

3. 드라이버 IC를 이용
모터의 속도와 방향을 제어할 수 있는 드라이버 IC에는 H브릿지 회로를 내장한 SN754410이나 L293이 있습니다. 이 칩들은 2개의 모터를 연결할 수 있으며 각 핀의 용도는 다음과 같습니다.
- En 1,2: 모터1,2 선택(HIGH신호로 선택, 혹은 PWM신호로 회전속도를 변화시킬 수 있다)
- In 1,2:모터1의 회전방향을 결정(H/L, L/H)
- In 3,4:모터1의 회전방향을 결정(H/L, L/H)
- Out 1,2:모터1을 연결
- Out 3,4:모터2를 연결

driving_dcmotor_01.jpg

Code

 // Driving a DC Motor 
// by BARRAGAN  

char val;          // variable to receive data from the serial port 
int motorpin = 0;  // L293D Pin En1 connected to pin PWM 0 (on-board LED) 

void setup() 
{ 
} 

void loop() { 
  analogWrite(motorpin, 125);  // turn ON the Motor at medium speed 
  delay(100);                  // wait 100ms for next reading 
} 
Tags:

RC 서보모터 / RC Servo Motor

RC서보모터는 기어가 내장되어 있어서 토크가 세고, 가변저항으로 회전각을 측정해 피드백 신호를 내보내기 때문에 회전각을 정확하게 제어할 수 있습니다. 서보모터의 전원선을 Vcc, GND에 연결하고 신호선(노란색)을 보드의 디지털 핀에 연결합니다. USB전원으로 서보모터를 작동시키면 서보모터가 오동작하거나 와이어링 보드가 꺼질 수 있기 때문에 와이어링 보드에 전원 어댑터를 연결해서 사용해야 합니다. 서보를 여러 개 작동시키거나 안정하게 사용하기 위해서는 되도록 보드의 전원과 서보모터의 전원을 분리해서 사용하는 것이 좋습니다.
servo.gif

Code

 // Driving Servo 
// by BARRAGAN  
#include  

Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 

int pos = 0;    // variable to store the servo position 

void setup() 
{ 
  myservo.attach(0);  // attaches the servo on pin 0 to the servo object 
} 


void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
} 
Tags:

트랜지스터 / TR, FET

00521-1.jpg
트랜지스터(TR / FET)는 작은 신호로 큰 전류/전압를 스위칭하거나 연속적으로 변화시킬 수 있습니다. 아르두이노 보드는 5V/40mA이하의 전기 신호만을 다룰 수 있기 때문에 백열전구, 모터, 전기 기구등 높은 전압이나 전류를 필요로 하는 장치는 연결할 때에 트랜지스터를 이용합니다. 트랜지스터 여러 개를 하나의 IC칩에 담아놓은 ULN2803(7 달링턴 어레이:7개의 트랜지스터 회로를 내장)를 사용할 수도 있습니다.

TR (BJT)
tr_.png
핀배치(NPN형)
tr.png

FET (MOSFET)
mosfet.jpg
달링턴 어레이
ULN2803A.jpg
Code

// Driving a Relay 

int relaypin = 0;

void setup() 
{ 
} 

void loop() { 
  digitalWrite(relaypin, HIGH);  // turn ON 
  delay(5000);                  // wait 5s 
  digitalWrite(relaypin, LOW);  // turn OFF
  delay(5000);                  // wait 5s
}
Reblog this post [with Zemanta]
Tags:

가변저항 / Potentiometer

가변저항은 라디오나 오디오 콘솔 등의 볼륨 조정에 흔히 쓰입니다. 손잡이를 돌리는 로터리형과 손잡이가 직선으로 움직이는 슬라이드형이 있습니다. 와이어링에는 10Kohm정도의 가변저항을 사용하면 됩니다. 가변저항의 양쪽 끝 단자를 전원(Vcc, GND)에 연결하고 가운데 단자를 보드의 아날로그 입력 핀에 연결합니다. 손잡이를 회전시키면 회전각에 따라 입력값이 0~1023으로 변화합니다.

potentiometer.gif
Code
int val; 

void setup() { 
  Serial.begin(9600); // sets the serial port to 9600 
} 

void loop() { 
  val = analogRead(0); // read analog input pin 0 
  Serial.print(val, DEC); // prints the value read 
  Serial.print(" "); 
  delay(100); // wait 100ms for next reading 
} 
* 와이어링 시리얼 모니터에서 수치를 확인할 수 있습니다.

광센서 / Photo Sensor (CdS)

광센서에는 CdS, 포토 다이오드, 포토 트랜지스터 등이 있습니다. CdS(황화카드뮴 셀)는 빛의 세기에 따라 저항값이 변하는 아날로그 광센서로, CdS의 한 쪽 다리를 Vcc(+)에 연결하고 다른 쪽 다리는 10Kohm저항과 아날로그 입력에 연결합니다.

CdS
cds.jpg

photoresistor.gif

Code

int distance=0; 
int i=0; 

void turnalloff() // function to turn off all the lights {
int i; for(i=0; i<10; i++) //LEDS connected to digital pins 0 to 9 { digitalWrite(i, LOW); } } void setup(){ Serial.begin(9600); pinMode(48,OUTPUT); digitalWrite(48,HIGH); } void loop(){ turnalloff(); // turns all lights off distance = analogRead(0); //sensor connected to analog pin 0 Serial.println(distance, DEC); delay(50); }

* 측정값은 시리얼 모니터로 확인할 수 있습니다.

Tags:

푸시버튼 스위치 / Pushbutton switch

푸시버튼 스위치의 한 쪽 단자를 Vcc에 연결하고 다른 쪽 다리는 풀다운 저항(Pull-down resistor, 10Kohm)과 디지털 입력 핀에 연결합니다. 스위치를 안누른 상태에서는 풀다운 저항을 통해서 GND와 디지털 입력핀이 연결되어 'L' 상태가 되고, 스위치를 누르면 +5V의 전원이 디지털 입력 핀으로 흐르면서 'H' 상태가 됩니다.

switch.gif

Code

// LED and switch 
// by BARRAGAN  

int direction = 1;  // used for the blinking cycle 
int switchPin = 2;  // digital pin to attach the switch 
int ledPin = 0;     // digital pin to attach the light 


void setup() 
{ 
  pinMode(switchPin, INPUT);   // sets digital pin 2 as input 
  pinMode(ledPin, OUTPUT);     // sets digital pin 0 as output 
} 

void loop() 
{ 
  if(digitalRead(switchPin) == HIGH)  // if the switch is pressed 
  { 
    direction *= -1;                  // alternate between 1 or -1 
    if (direction == 1)               // to decide to turn on or off the light 
    { 
      digitalWrite(ledPin, HIGH);     // turns the light on 
    } 
    else                              
    { 
      digitalWrite(ledPin, LOW);      // turns the light off 
    } 
    delay(200);                       // waits 200 milli seconds 
  } 
  else                                // if switch not pressed 
  { 
    digitalWrite(ledPin, LOW);        // keeps the light off 
  } 
}
Tags:

발광다이오드 / LED (Light Emitting Diode)

img_led.gif

LED는 극성(+,-)을 구별해서 연결해야 합니다. 보통 다리가 긴 쪽을 플러스(+), 짧은 쪽을 GND 혹은 마이너스(-)에 연결합니다. LED에는 적정한 전류를 흘려주기 위해 전류제한 저항을 연결합니다. 5v의 전압을 사용하는 경우라면 저항은 100-400옴을 연결합니다. LED의 종류나 색에 따라서 전류, 휘도, 발광 범위가 달라지므로 되도록 규격표를 확인하는 것이 좋습니다. 전류 제한 저항은 다음 식으로 구할 수 있습니다.

저항 = (전압 - LED 강하전압) / 적정전류

가령 전원이 5V, LED의 규격이 2V/10mA라면 저항 = (5 - 2) / 0.01 = 300ohm 입니다.

Circuit

led.gif

Code

// Blinking LED 
// by BARRAGAN  

int ledPin = 0;

void setup() 
{ 
  pinMode(ledPin, OUTPUT); // sets the digital pin as output 
} 

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