arduino error

avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x64
avrdude: failed to write flash memory, rc=-4

스케치 업로드시 아두이노를 리셋하지 않았을때 발생합니다.



arduino error

D:\arduino-0015/hardware\libraries\Matrix/Matrix.cpp:64: multiple definition of `Matrix::Matrix()'

`Matrix::Matrix()' 함수가 두번 정의 되었다는 오류입니다.

폴더 또는 파일명이 다르더라도 `Matrix::Matrix()'함수가 두번 정의되어 있으면 오류가 발생합니다.
include 하지 않아도 libraries폴더에 함수가 존재하면 오류가 발생합니다. 사용하지 않는 폴더는 제거 합니다.



가속도 센서와 자이로 센서는 완전히 다른것입니다.



가속도라는것은 특정 방향 직선운동에 대한 속도의 증감비를 말합니다.
여기서 중요한것은 직선 방향이라는것이 중요합니다.
따라서 가속도센서는 직선방향으로의 단위시간에 속도 증감비를 수치로 알려주는 센서입니다.
한가지 더 중력도 가속도의 하나이기 때문에 가속도 센서는 기본적으로 
항상 Z축 방향으로 -g(중력가속도)값을 가지고 시작합니다.
만약 센서가 정지해 있는 상태에서 X축에서도 가속도값이 나온다면 X축으로 기울어져 있다는 것도 알수 있겠지요


자이로센서는 각속도를 측정합니다.
한축을 기준으로 단위시간에 물체가 회전한 각도의 값을 수치로 알려주는 센서입니다.

정리하자면 속도와 각도의 차이입니다.
두 센서는 서로 상호 보완관계로 활용하여야 활용도가 극대화 된다고 합니다.

깊이 들어가면 너무 수학적인것이어서 OTL...
  1. BlogIcon 코끼리 2010.02.05 19:23

    좋은 설명이에요ㅠ_ㅠ 무슨 말인지 대충은 알아먹었답니다ㅠㅜ 감사합니다.

  2. ㅠㅠ 2012.04.15 20:34

    저기 두 그래프에서 X축과 Y축은 각각 무엇인가요??

    • BlogIcon pepsiman 2012.06.14 13:52 신고

      각 축이라는것이 특별한건 아니고요
      3차원 공간에서 물체의 움직임을 표현하려면 3개의 축이 필요합니다.
      그 축들중에 하나에요

      휴대폰을 들고 제자리에서 한쪽 방향으로 돌려보세요.
      하나의 축이 만들어질꺼에요.

전에 소개한 위즈넷 이더넷 모듈과 같은 W5100칩을 사용한 iConn5100M이라는 이더넷 모듈입니다.
2009/05/19 - [Arduino/AVR/1. H/W] - arduino에 사용가능한 이더넷 모듈



스펙

•  10/100 Base TX 지원
•  Half/Full duplex 지원
•  Auto-negotiation, Auto Crossover Detection 지원
•  IEEE 802.3/802.3u Compliant
•  5V Tolerant I/O, 3.3V 동작
•  Network Status Indicator LEDs
•  Hardware Internet Protocols : TCP/IP v4, UDP, ICMP, ARP, PPPoE, IGMP
•  Hardware Ethernet Protocols : DLC, MAC
•  4 independent Channels
•  MCU bus Interface and SPI Interface
•  Direct/Indirect mode bus access
•  Application Programmer를 위한 Socket API 제공 : W5100 Driver, DHCP, SMTP, DNS, DDNS
•  2개의 2.0mm pitch 2*14 header pin




스펙과 다이어그램을 보면 기존 위즈넷 모듈과 비교해 가장큰 장점은 바로 Tiny24로 보이는 칩을 내장했다는 것입니다.
MCU를 내장함으로써 DHCP, SMTP, DNS, DDNS 등을 지원하고, MAC Address도 내장 되어 있어 프로그램으로 구현할 필요가 없다는 것이 가장 큰 장점이네요.
핀이 2mm 피치 라는것이 약간 불편하긴 하겠습니다.
인터페이스는 SPI를 사용하는것 같네요.

가격도 WIZ810MJ 보다 저렴한 2만원 입니다. (ICBank)

아래는 데이터시트 입니다.

  1. 웅쓰 2009.07.08 15:39

    안에 있는 Tiny MCU는 MAC address만 저장하는 기능을 합니다.
    DHCP, SMTP, DNS, DDNS는 지원가능하지만, 직접 코딩해야 합니다.
    간단히 요약하면 [위즈넷 모듈 기능 + MAC 저장] 기능입니다.

    • BlogIcon pepsiman 2009.07.08 15:41 신고

      아 그런가요?
      그런 내용은 못봤는데...
      정말 그렇담 별거 아니네요....그래도 머 가격은 싸니...^^
      정보 감사합니다

스위치가 열려 있는 상태에서  닫거나 닫혀있는 상태에서 열때.
즉 스위치의 상태가 변하는 순간 10ms 이내에 열림과 닫힘이 수회 반복되는 현상을 잡음 또는 채터링(chattering)이라고 합니다.


채터링을 처리하지 않고 그냥 AVR에서 처리한다면 한번의 S/W 누름 행동이 프로그램상에는 여러번 눌린것처럼 나타나게 됩니다. 따라서 반드시 채터링을 처리해야 합니다.

채터링을 처리하는 방법에는 하드웨어적인 방법과 프로그램적인 방법이 있습니다.
하드웨어적인 방법으로는 104 캐페시터를 연결하는 방법이 있습니다.

제가 소개할 방법은 프로그램적인 방법입니다.
프로그램으로 처리하면 부품값(얼마안하긴 합니다만)을 절약할 수 있다는 장점이 있으나 메모리를 더 소모한다는 단점도 있습니다. (사실 둘다 미미합니다. ^^)

보통은 스위치 값을 한번 읽고, 10ms 딜레이후 다시 스위치 값을 읽어 같은지 비교하여 처리합니다.
그래서 처음에는 flag 변수를 사용하여 처리했습니다만, 서핑을 통해 더 나은 방법을 발견했습니다.
다름이 아닌 스위치가 일정한 상태로 유지된 시간을 측정하는 방식입니다.
이 방식의 장점은 스위치의 On/Off 뿐만 아니라 Hold 동작도 체크할 수 있다는것이 장점입니다.




설명이 너무길어 복잡해보이지요? 실제 코드를 보죠.
while (1)
{
    i = ((0xff - inp(PORTC)) >> 4) & 0x0f;
    switch(i)
    {
    case 1:
        outp(PORTB, 0x10);
        printf("Push Button 1 (SW1) is on.\n");
        count = 0;
        do
        {
              i = ((0xff - inp(PORTC)) >> 4) & 0x01;
              if (i != 0) count++;
              delay(1);
        } while(count < 10);
        count = 0;
        do
        {
              i = ((0xff - inp(PORTC)) >> 4) & 0x01;
              if (i == 0) count++;
              delay(1);
        } while(count < 10);
        outp(PORTB, 0x00);
        break;
}
스위치가 On 또는 Off 상태에서 변하지 않고 같은 상태를 유지하면 SWCount가 증가하고,
변하면 0으로 초기화 됩니다.
따라서 SWCount값이 일정 값(hold)에 도달했다면 그만큼 누르고 있었다는 예기 이지요.

이렇게 되면 채터링이 무시되고 안정된 스위치 값을 얻을 수 있게 됩니다.
더불어 누르고 있는 시간도 측정할 수 있고요.
  1. AVR공부하자 2012.09.27 08:26

    도움 감사합니다! 자료 퍼 가겠습니다!

tiny은 가격도 싸고 칩 단독으로 회로구성이 가능해서 꼭 한번 해보고 싶었는데
ISP를 구입하게 되서 프로그래을 해봤습니다.

간단히 LED 8개가 순차적으로 왔다 갔다 하는 예제 입니다.
tiny와 isp를 연결한 모습입니다.
tiny의 1, 2, 3, 5, 6, 10 번핀을 ISP에 각 핀에 연결합니다.
VTG가 VCC 입니다.
저는 매번 결선하기 귀찮아서 핀헤더로 연결했습니다.



led는 11 ~ 20번 즉 PA0 ~ PA7번에 저항과 같이 연결했습니다.
sw는 PB6에 풀다운저항으로 연결하였습니다.
핀헤더와 isp를 제거하고 칩과 led만 남아있는 모습입니다.
전원은 충전지 4개 4.8v를 연결했습니다.
ATTiny26L-8PI는 2.7-5.5V의 전압을 허용하므로 활용도가 높습니다. 
스위치를 누르면 led가 왔다 갔다 합니다.

bascom-avr 소스

아두이노 전압계 와 processing 만 있으면 아두이노를 오실로스코프로 활용할수 있습니다.

일단 아두이노는 이전 포스팅의 전압계 프로그램을 넣어 놓습니다.

processing라는 프로그램을 다운 받아 설치합니다.


processing에 다음 코드를 붙여 넣게 합니다.
/*
 * Oscilloscope
 * Gives a visual rendering of analog pin 0 in realtime.
 * 
 * This project is part of Accrochages
 * See http://accrochages.drone.ws
 * 
 * (c) 2008 Sofian Audry (info@sofianaudry.com)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */ 
import processing.serial.*;

Serial port;  // Create object from Serial class
int val;      // Data received from the serial port
int[] values;
String s;

void setup() 
{
  size(640, 480);
  // Open the port that the board is connected to and use the same speed (9600 bps)
  port = new Serial(this, "COM3", 9600);
  values = new int[width];
  smooth();
}

int getY(int val) {
  return (int)(val / 600.0f * height) - 1;
}

void draw()
{
  while (port.available() >= 1) {
    //if (port.readString() == 0xff) {
    //  val = (port.read() << 8) | (port.read());
    //}
    s = trim(port.readString());
    val =   int(s );
    println(val);
  }
  for (int i=0; i<width-1; i++)
    values[i] = values[i+1];
  values[width-1] = val;
  background(0);
  stroke(255);
  for (int x=1; x<width; x++) {
    line(width-x,   height-1-getY(values[x-1]), 
         width-1-x, height-1-getY(values[x]));
  }
}
원본코드를 아두이노 전압계에 맞게 약간 수정 했습니다.
아두이노에서 시리얼 포트(제꺼에서는 COM3)쪽으로
119
399
47
499
38
169
436
13
499
이런 식으로 출력 됩니다
이걸 processing에서 받아서 그래프로 출력합니다.



결과물을 볼까요?

아두이노의 ADC가 여러개 있으니 다채널도 가능하겠지요.
  1. 제갈식 2013.05.16 10:03

    내용이 좋아서 퍼갑니다.

    잘 읽었습니다.,

    http://cafe.naver.com/iphonediy

전에 MegaLoad 부트로더 심기에 실패 했었는데 아무래도 컴파일러 버전 문제인가 싶은데 잘 모르겠네요.

이 부트로더는 ATMega128용 입니다.
위의 hex 파일을 CodeVsionAVR에서 프로그램 했습니다.
Fuse 옵션은 아래와 같고요.




시리얼 다운로드는 아래 프로그램을 이용하면 됩니다.

체리보드의 Com 포트를 찾아서 설정하고 속도는 57600bps로 했습니다.

체리보드의 리셋을 누르면 다운로드가 진행이 됩니다. ^^
두개의 저항을 이용하여 전압을 낮출때 사용하는 회로로
실제 측정하고자하는 전압이 Vin이고 이 저항 값을 떨어뜨린 전압이 Vout 입니다.



계산은
이와 같이 계산합니다.
Vin = 10v
R1 = 10k
R2 = 10k
이면  10k/20k *10 = 5v가 됩니다. 반으로 줄었지요

아두이노 전압계에도 이걸 응용하면
Vout을 아두이노 입력으로 읽고, 
R1 = 40k
R2 = 10k
로 하고 측정하고자 하는 전압을 Vin 에 연결하면, 아두이노가 5v까지 측정 가능하니 5배즉
Vin에 25v까지 측정이 가능하게 됩니다.
R1을 더 높이면 더 높은 전압도 측정가능하겠지요?

이때 사용하는 저항은 오차가 적은것을 사용해야 정확한 계산이 됩니다.
  1. ajsfdg 2010.02.11 01:05

    얼핏 들어 보기만 해서 정확히는 모르고 있었는데
    여기에서 정확히 알아가네요~

  2. BlogIcon ghd baratas 2013.04.06 23:07

    춤추라,아무도 바라보고있지 않은것처럼

결론부터 말하자면
Vcc, Vdd 는 +전원, Vss, Vee는 -전원(GND)를 말합니다.

각각
Vcc - collector 전원
Vee - emitter 전원
Vdd - drain 전원
Vss - source 전원의 약자로
Vcc,Vee는 TR에서 사용하는 용어이고 Vdd,Vss는 FET에서 사용하는 용어라는 차이 입니다.



아래는 웹에서 찾은 결과들 입니다.

sink current는 칩의 특정 핀이??외부에서 이 핀을 통해 칩 안으로 끌어 들일 수 있는 전류를 나타내고,
source current는 특정 핀이??이 핀에서 외부로 공급해 줄 수 있는 전류를 나타냅니다.
얼핏 생각하면, sink current 와 source current 는 크기가 거의 같을 것 처럼 생각되나,
사실을 그렇지 않은 경우가 있읍니다. 8051의 경우가 그러합니다.
이러한 sink current 와 source current의 크기의 비대칭성은 8051의 외부에 다른 장치를 연결하는 방식에 영향을
미칩니다. 예를 들어 8051 칩에 LED를 붙이는 경우, Vcc에서 나온 전류가 보호 저항과 LED를 거친 뒤 8051 칩
안으로 들어가겠끔 설계되지, 그 반대의 경우는 찾아보기 힘듭니다.
그 이유인 즉은, 8051의 source current가 sink current에 비해 미약하기 때문입니다.
운좋게도 Atmega8 (아마도 다른 AVR도 그럴것 같지만) 스펙을 보면 IO port가 비교적symetrical 하게
sink와 source할 수 있도록 좋은 output buffer를 가지고 있어서,
LED를 direct로 드라이브할 수 있군요 (5V일경우 20mA는 드라이브할 수 있는 듯).
그래도 LED를 sink하는 방식으로 설계하는 것이 좋긴할 것 같아요. 전류를 많이 쓰는것은 전력소모상 안좋으니까용.
sink와 source current가 중요한 것은 fan-out 과fan-in 수용능력때문인데,
큰 sink와 source current 가진다면 한 IO에서 한꺼번에 여러개의 LED를 구동할 수 있기때문입니다.
AVR은 힘이 좋은 놈이죠.

싱크 전류(sink current)
부하 측에서 전원쪽으로 거꾸로 흘러들어 가는 전류. 일반적으로 전원은 부하로 전류(source current)를 공급하는 장치이나 동작에 따라서는 부하 측에서 전원 방향으로 전류가 거꾸로 흘러들어 가기도 하는데 이러한 전류가 정상 동작일 수도 있지만 때로는 과도한 전류로 전원이 제어 능력을 상실해 고장을 일으키는 원인이 될 수도 있다. 집적 회로에서는 출력을 통하여 제공되는 전류의 양을 의미한다.


Vcc,Vdd,Vss의 풀네임은 무엇인가요??: http://ledtv.tistory.com/10

요약하면, Vcc, Vdd, Vss 따위는 회로에 사용하는 여러 공통전원단을 나타내는 것인데, 원래는 발췌문 표에 나와있는 것 처럼 트랜지스터에 인가되는 전원을 구분하기 위한 것입니다.

예를 들면, BJT의 collector에 인가되는 전원은 Vcc, FET의 drain에 인가되는 전원은 Vdd 라는 식으로 말이지요.

즉, BJT로 구현되는 TTL IC에는 Vcc, Vee의 기호를 주로 쓰고 FET을 사용하는 CMOS IC에는 Vdd, Vss의  기호를 주로 씁니다.

그런데, 이런 구분은 서로 호환가능한 CMOS와 TTL의 응용회로가 쓰이는 이후로 모호하게 되었다고 하는군요.

그래서, 요즘은 CMOS라도 정/부전원을 표시하기 위해 Vcc와 GND를 쓴다고 합니다.

정리하면, Vcc, Vdd, Vss, Vee에서 c, d, s, e는 각각 collector, drain, source, emitter의 머릿자를 딴 것이 되겠네요.

그냥 Vs라고 하면 회로의 일반적인 전원과 혼동될 수 있고, Vc라고 하면 제어기나 보상회로의 출력을 의미하는 경우가 많으며, Ve 역시 제어기의 오차전압을 의미하는 경우가 많고, Vd는 전압 차나 다이오드 전압이라는 의미로 생각하기 쉽기 때문에, cc, dd, ee 하는 식으로 두 번씩 반복해서 씀으로 해서 트랜지스터 전원이라는 의미로 구분하여 나타내는 것 같습니다.

아래 발췌문의 링크들은 원 사이트에 들어가면 제대로 동작합니다.
---------------- 발췌 ----------------
Vcc, Vdd, Vss, etc.

These notations are used in describingvoltagesat various common power supply terminals (at these points, only a wire lead exists between the point and a power source) of a givencircuit. It turns out that these commonvoltageterms map totransistortechnology as follows:

BJT | FET | "Vxx" meaning
----+-----+-----------------------
Vcc | Vdd | Positive supplyvoltage
Vee | Vss | Negative supply,ground

Apparently this terminology originated in some way from the terminals of each type oftransistor, and their common connections in logiccircuits (i.e., Vcc is often applied toBJTcollectors, Vee toBJTemitters, Vdd toFETdrains, and Vss toFETsources). This notation then carries across to integrated circuits --TTLICs were originally based onBJTtechnology, and so often use the Vcc / Vee terminology;CMOSICs are based onFETtechnology, and so often use the Vdd / Vss terminology.
The absolute distinctions between these common supply terms has since been blurred by the interchangeable application ofTTLandCMOSlogic families. MostCMOS(74HC / AC, etc.)ICdata sheets now use Vcc and Gnd to designate the positive and negative supply pins.
내용출처 : http://encyclobeamia.solarbotics.net/articles/vxx.html
Vcc,Vdd,Vss의 풀네임은 무엇인가요??: http://ledtv.tistory.com/10



+ Recent posts