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

가상 시리얼 포트 에뮬레이터(VSPE)를 이용한 원격간 시리얼포트 제어에 대한 문의가 있어서 답변겸 자료를 정리합니다.

Virtual Serial Ports Emulator(VSPE) 이라는 프로그램을 이용합니다.
설정은 아래와 같습니다.
처음 두줄(Com2)은 제어할 장치가 있는쪽에 설정합니다.
물리적인 com포트에 장치가 물려있다면 첫번째줄은 필요 없습니다.
두번째 줄에서 설정한 포트(자신의 com포트에 맞춤니다)와 그 컴퓨터의 IP를 확인해야 합니다.
(IP확인: 시작> 실행> cmd(엔터) , ipconfig(엔터)

세번째 줄과 네번째 줄은 원격지에서 데이터를 보낼pc에 설정합니다.
거기에도 물리적인 com포트를 쓴다면 세번째는 생략합니다.
네번째에서 서버pc의 IP와 포트로 설정을 합니다.

설정이 모두 끝났습니다.
이제 양방향으로 데이터가 오고 갑니다 확인해보세요.
터미널 프로그램에서 com2 한개 띄우고, com3 한개 띄우면 서로 데이터가 오고 가는것을 확인할수 있습니다.


저는 한pc에서 테스트 하느라 서버와 클라이언트를 위에서 처럼 모두 설정했습니다.
실제로는 위에 두줄은 서버 pc에 아래 두줄은 클라이언트 pc에 설정 하셔야 합니다.
그럼 재미있게 활용하세요 ^^
Posted by pepsiman
comments powered by Disqus
재미있는 프로그램을 소개해드립니다.

avr 프로그램을 하다보니 pc와 시리얼 통신을 할일이 종종 생깁니다.

이때 pc용 프로그램을 테스트할때 (특히 노트북 같이 시리얼포트가 없는 pc) 사용하면 편리한 프로그램입니다.

사용법은 가상 COM1, COM2를 만들고 둘을 연결합니다.
pc용 프로그램을 com1로 연결하고 하이퍼 터미널을 com2로 연결하면 pc용 프로그램에서 시리얼 통신으로 출력되는 내용을 하이퍼 터미널에서 확인할수 있습니다.



---------------------------------------------------------------------------------------------------------


일반적인 경우에는 필요 없을지도  모르겠는데, 개발이나 테스트를 하시는 분이라면 꼭 필요한 프로그램입니다.

가상으로 시리얼 포트를 만들어주고 가상 시리얼끼리 리다이렉션도 해줍니다.

가상 시리얼 포트 Com1 Com2를 생성하고 둘을 연결시킨 화면입니다.

이렇게 하면 하이퍼터미널 두개로 Com1과 Com2를 각각 열면 둘간에 통신이 가능하게 됩니다.

시리얼 통신 프로그램 작성하시는 분들께는 대단히 편리한 프로그램이고 게다가 무료입니다.^^

나머지 활용은 어떤게 있을까요? 
Posted by pepsiman
comments powered by Disqus
- 5V와 3.3V 같이 사용하기

아두이노나 atmega128같은 AVR은 주로 5v에서 구동이 됩니다.

하지만 xBee(지그비)나 wiz811mj 같이 3.3v에서 구동되는 모듈들을 사용할 일이 종종 생깁니다.

이럴때 5v를 3.3v로 다운하여 사용하여야 하는데 이같이 전압을 변경하는 방법이 몇가지 있습니다.


1. 레귤레이터(regulator) 사용하기

제일 쉬운 방법은 레귤레이터를 사용하는 방법입니다.

전압 다운
5v 레귤레이터로는 78T05, 3.3v 레귤레이터로는 KA78R33, LM1117S-3.3 등이 있습니다.

위 이미지는 7805를 이용하여 8~18v로 5v를 얻는 방법입니다.
같은 방법으로 3.3v 레귤레이터를 사용하면 3.3v를 얻을 수 있습니다.

전압 업

7805와 위 공식으로 저항을 조절하면 입력보다 높은 전압을 얻을 수 있다네요.




2. 제너 다이오드(zener diode) 사용방법



제너 다이오드 1N4728로 3.3v를 만들고 저항으로 필요 전류를 조절하면 됩니다
저항을 줄이면 전류가 늘어나게 됩니다.


3. 레벨 변환칩 사용

이 방법은 아직 잘 모르겠습니다 ^^;


4. 전압나눔 을 이용한 방법

이 방법은 입력전압이 변하면 출력 전압도 변하므로 안정된 전압은 얻을수 없다는 문제가 있습니다.
Posted by pepsiman
comments powered by Disqus
C(전기용량) = Q(전하량) / V(전압)

기호 




표기 : F, V, 극성

  - 전압 : 표기되어 있는 전압보다 높은 전압을 인가하면 폭발 위험있슴
  - 용량 : 전기를 축적할 수 있는 용량
  - 극성 : 전해 캐패시터, 탄탈 캐패시터는 극성이 있슴. - 극성이 표시되어 있슴

용량 단위 : F, pF, uF

  - farad,패러드라고 읽음
  - pF(피코패러드) : 10^(-12)
  - uF(마이크로패러드) : 10^(-6)

전기적 특징 :  

  - 전류 평활화
  - 직류, 일정시간후 커트
  - 교류, 통과
  - 전기가 충전되는 동안은 쇼트(close), 충전이 끝나면 단락(open)


전해 캐패시터
  - 저주파 바이패스
  - - 극성 표시
  -  주파수 특성 나쁨(고주파에 적당치 않음)

탄탈 캐패시터
  - 긴 다리가 +
  - 온도 변화에 강함
  - 신호 파형을 중요시하는 아날로그 회로에 많이 쓰임
  - 가격 비쌈

세라믹 캐패시터
  - 고주파 바이패스
  - 아날로그 회로에는 쓰이지 않음
  - 극성 없슴

적층 세라믹 캐패시터
  - 온도변화에 강함
  - 바이패스용, 주파수 특성이 양호


새로 배운 내용 추가 (2009.8.13)
캐패시터에 표기된 전압은 실제 회로도(또는 vcc)의 전압보다 큰걸 써도 상관 없다.
LED와 병렬 연결하면 LED가 천천히 켜지게 된다. 용량이 커지면 켜지는 속도가 느려진다.

V =  IR + Q/C



캐패시터 계산기
Posted by pepsiman
comments powered by Disqus
일반적으로 지금까지는 아래 회로와 같이 led를 연결할때 +를 핀에 -를 GND에 연결해 왔습니다.

적은 갯수의 led를 연결할때는 문제가 없지만 도트매트릭스같이 led의 개수가 많아지면 점점 led가 흐려지게 됩니다.
원인은 아두이노나 AVR의 각 핀에서 출력되는 전류는 고작 2~30mA정도 밖에 되지않는다는데 있습니다.
AVR 전체로 따지면 100mA 정도 밖에 나오지않습니다.
led하나에 보통 20mA정도 소모하니 5개정도를 겨우 돌릴만한 전류 밖에 안되는 겁니다.
이 전류 이상 소모하게 되면 AVR이 망가질수도 있답니다.




이문제를 해결하기 위해서는 소스전류가 아닌 싱크전류를 제어 하는 방식으로 바꿔야합니다.
지금까지는 led의 +를 연결한 핀에 1(HIGH)을 주어 led를 겼지만 그와 반대로 led의 -를 핀에 연결하고 +는 Vin(또는 별도의 전원에 입력 받는 것을 권장)에 연결합니다. 그러면 핀에 0(LOW)을 주면 불이 켜지게 됩니다.

이렇게 함으로써 전류는 AVR과 별도의 안정된 전원에서 공급하고 AVR은 LED 구동에 전류를 뺏기지 않아 서로 안정된 동작을 보장할수 있게 되는 겁니다.

저는 처음에 이 (핀이 GND역할도 할수 있다는)개념이 이해되지 않아 무지 고생했는데 이해하고 나니 무척 유용한것 같습니다.

* 싱크제어라는 용어가 맞는지 모르겠네요. 잘못되었으면 댓글로 지적바랍니다.

Posted by pepsiman
comments powered by Disqus
아래 내용을 UltraEdit의 구문강조파일에 C/C++ 영역에 교체하면 AVR C 문법을 강요하여 볼수 있습니다.

구문강조 편집하기
UltraEdit의 고급메뉴 > 설정
편집기 표시 > 구문강조 > 단어목록의 파일 경로 >> 열기 버튼
/L1"C/C++" 항목에서 /L2 항목 전까지 부분을 아래 내용으로 교체합니다.



/L1"C/C++" Line Comment = // Block Comment On = /* Block Comment Off = */ Escape Char = \ String Chars = "' File Extensions = C CPP CC CXX H HPP AWK
/Delimiters = ~!@%^&*()-+=|\/{}[]:;"'<> , .?
/Function String = "%^([a-zA-Z_0-9^[^]*]+^)[ ^t]+([^p*&, ^t^[^]a-zA-Z_0-9.!]++)[~;]"
/Function String 1 = "%[a-zA-Z_0-9*]*::^([a-zA-Z_0-9^~]+^)[ ^t^p]++([^p*&, ^t^[^]/*=:&a-zA-Z_0-9./(!]++)[~;]"
/Function String 2 = "%[a-zA-Z_0-9^][a-zA-Z_0-9^[^]]+[ ^t*]+^([a-zA-Z_0-9]+^)[ ^t]++([^p*&, ^t^[^]a-zA-Z_0-9./(!]++)[~;]"
/Function String 3 = "%[a-zA-Z_0-9*&$^[^]*]+[ ^t]+[a-zA-Z_0-9*&$^[^]]+[ ^t*]+^([a-zA-Z_0-9]+^)[ ^t]++([^p*&, ^t^[^]a-zA-Z_0-9./(!]++)[~;]"
/Function String 4 = "%[a-z_0-9^[^]*]++ [a-z_0-9*^[^]]+[ ^t]++[a-z_0-9*^[^]]+[ ^t]++^([*a-z_0-9]+^)[ ^t]++([^p*&, ^t^[^]a-z_0-9./(!]++)[~;]"
/Function String 5 = "%^([a-zA-Z_0-9^[^]*]+^)[ ^t]++([^p*&, ^t^[^]a-zA-Z_0-9./()!]++)[~;]"
/Indent Strings = "{" ":"
/Unindent Strings = "}"
/C1"Keywords"
auto
break bool
case char const continue
default do double defined
else enum extern
float for
goto
if int
long
register return
short signed sizeof static struct switch
typedef
union unsigned
void volatile
while
__asm __based __cdecl __declspec __except __far __fastcall __finally __fortran __huge __inline __int16 __int32 __int64 __int8 __interrupt __leave __loadds __near __pascal __saveregs __segment __segname __self __stdcall __try __uuidof
#define #error #include #elif #if #line #else #ifdef #pragma #endif #ifndef #undef
/C2"C++ Keywords"
catch class const_cast
delete dynamic_cast
explicit export
false friend
inline
mutable
new namespace
operator
private protected public
reinterpret_cast
static_cast
template this throw true try typeid typename
using
virtual
wchar_t
__multiple_inheritance __single_inheritance __virtual_inheritance
/C3"Microsoft C extensions"
dllexport dllimport
naked
thread
uuid
/C4"Operators"
+
-
=
// /
%
&
>
<
^
!
|
/C5"AVR128"
ADCW ADC ADCL ADCH ADCSR ADCSRA ADMUX ACSR ASSR
DDRA DDRB DDRC DDRD DDRE DDRF DDRG
ETIMSK EICRA ETIFR EICRB EIFR EICRA EIMSK  EIMSK 
ICR1 ICR1L ICR1H ICR3 ICR3L ICR3H 
MCUCR MCUSR MCUCSR
OCR1B OCR1BL OCR1BH OCR1A OCR1AL OCR1AH OCR0 OCDR OCR2 OSCCAL OCR1C OCR1CL OCR1CH 
OCR3C OCR3CL OCR3CH OCR3B OCR3BL OCR3BH OCR3A OCR3AL OCR3AH 
PORTA PORTB PORTC PORTD PORTE PORTF PORTG PINA PINB PINC PIND PINE PINF PING 
RAMPZ
SPMCR SPMCSR SFIOR SPSR SPDR SPCR SPDR Signal
SIG_INTERRUPT0 SIG_INTERRUPT1 SIG_INTERRUPT2 SIG_INTERRUPT3 SIG_INTERRUPT4 SIG_INTERRUPT5 SIG_INTERRUPT6 SIG_INTERRUPT7 
SIG_OUTPUT_COMPARE0 SIG_OUTPUT_COMPARE1A SIG_OUTPUT_COMPARE1B SIG_OUTPUT_COMPARE2 SIG_INPUT_CAPTURE1
SIG_OVERFLOW2 SIG_OVERFLOW1 SIG_OVERFLOW0 SIG_OVERFLOW3 
SIG_SPI SIG_USART0_RECV SIG_UART0_RECV SIG_USART0_DATA SIG_UART0_DATA SIG_USART0_TRANS SIG_UART0_TRANS 
SIG_ADC SIG_EEPROM_READY SIG_COMPARATOR SIG_INPUT_CAPTURE3 
SIG_OUTPUT_COMPARE1C SIG_OUTPUT_COMPARE3A SIG_OUTPUT_COMPARE3B SIG_OUTPUT_COMPARE3C 
SIG_USART1_RECV SIG_UART1_RECV SIG_USART1_DATA SIG_UART1_DATA SIG_USART1_TRANS SIG_UART1_TRANS 
SIG_2WIRE_SERIAL SIG_SPM_READY 
TCNT0 TCCR0  TCNT1 TCNT1L TCNT1H TCCR1B TCCR1A TIMSK TIFR TWBR TWSR TWAR TWDR TWCR
TCCR1C TCNT2 TCCR2 TCCR0 TIMSK TCNT0 TCNT3 TCNT3L TCNT3H TCCR3B TCCR3A TCCR3C 
UBRR0L UCSR0B UCSR0A UDR0 UBRR0H UCSR0C UBRR1H UBRR1L UCSR1B UCSR1A UDR1 UCSR1C 
WDTCR
XMCRB XMCRA XDIV XMCRA XMCRB

/C6"AVR BIT"
AS0 ADHSM ACME ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0 ADLAR 
BORF BLBSET
COM1 COM0 CS2 CS1 CS0 COM01 COM00 CS02 CS01 CS00 COM21 COM20 CS22 CS21 CS20 COMA1 COMA0 COMB1 COMB0 COMC1 COMC0 
COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 COM1C0 COM3A1 COM3A0 COM3B1 COM3B0 COM3C1 COM3C0 CPOL CPHA 
CSB2 CSB1 CSB0 CS12 CS11 CS10 CS32 CS31 CS30 
DD7 DD6 DD5 DD4 DD3 DD2 DD1 DD0
DDA7 DDA6 DDA5 DDA4 DDA3 DDA2 DDA1 DDA0 
DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0
DDC7 DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0
DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0
DDE7 DDE6 DDE5 DDE4 DDE3 DDE2 DDE1 DDE0
DDF7 DDF6 DDF5 DDF4 DDF3 DDF2 DDF1 DDF0
DDG4 DDG3 DDG2 DDG1 DDG0
DORD DOR DOR1 DOR0 
EXTRF E2END 
FE FE0 FE1 FOC0 FOCA FOCB FOCC FOC3A FOC3B FOC3C FOC1A FOC1B FOC1C FOC FOC2 FLASHEND
JTD JTRF
INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0
ICNC ICES ICNC1 ICES1 ICNC3 ICES3
INTF7 INTF6 INTF5 INTF4 INTF3 INTF2 INTF1 INTF0
ICF1 ICF3 IDRD 
ISC31 ISC30 ISC21 ISC20 ISC11 ISC10 ISC01 ISC00
ISC71 ISC70 ISC61 ISC60 ISC51 ISC50 ISC41 ISC40
IVSEL IVCE 
MSTR MPCM MPCM1 MPCM0 MUX4 MUX3 MUX2 MUX1 MUX0
OCIE2 OCIE1A OCIE1B OCIE0 
OCF2 OCF1A OCF1B OCF0  
OCIE3A OCIE3B OCIE3C OCIE1C OCF3A OCF3B OCF3C OCF1C OCR0UB 
OCDR7 OCDR6 OCDR5 OCDR4 OCDR3 OCDR2 OCDR1 OCDR0

PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
PE7 PE6 PE5 PE4 PE3 PE2 PE1 PE0
PF7 PF6 PF5 PF4 PF3 PF2 PF1 PF0
PG4 PG3 PG2 PG1 PG0 PGERS PGWRT 
PIN7 PIN6 PIN5 PIN4 PIN3 PIN2 PIN1 PIN0
PINA7 PINA6 PINA5 PINA4 PINA3 PINA2 PINA1 PINA0
PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0
PINC7 PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0
PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0
PINE7 PINE6 PINE5 PINE4 PINE3 PINE2 PINE1 PINE0 
PINF7 PINF6 PINF5 PINF4 PINF3 PINF2 PINF1 PINF0 
PING4 PING3 PING2 PING1 PING0 PUD PSR0 PSR321 
PORT7 PORT6 PORT5 PORT4 PORT3 PORT2 PORT1 PORT0
PORTA7 PORTA6 PORTA5 PORTA4 PORTA3 PORTA2 PORTA1 PORTA0
PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0
PORTC7 PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0
PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0
PORTE7 PORTE6 PORTE5 PORTE4 PORTE3 PORTE2 PORTE1 PORTE0
PORTF7 PORTF6 PORTF5 PORTF4 PORTF3 PORTF2 PORTF1 PORTF0
PORTG4 PORTG3 PORTG2 PORTG1 PORTG0
PORF 
RAMPZ00 REFS1 REFS0 RWWSB RWWSRE 
RXC RXC1 RXC0 RXCIE RXCIE1 RXCIE0 RXEN RXEN1 RXEN0 RXB8 RXB81 RXB80 RAMEND 
SRE SRW SRW10 SE SM1 SM0 SM2 SPR1 SPR0 SPM_PAGESIZE 
SRL2 SRL1 SRL0 SRW01 SRW00 SRW11 
SPMIE SPMEN SPIF SPI2X SPIE SPE 
TOIE0 TOIE1 TOIE2 TOIE3 TOV0 TOV1 TOV3 TICIE3 TICIE1 TOV2 TXC TXC0 TXC1 TXCIE TXCIE1 TXCIE0 TXEN TXEN1 TXEN0 TXB8 TXB81 TXB80
TWINT TWEA TWSTA TWSTO TWWC TWEN TWIE  
TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE TSM 
TWS7 TWS6 TWS5 TWS4 TWS3 TWPS1 TWPS0 TCN0UB TCR0UB 
UDRE UDRE0 UPE U2X UDRE1 UPE1 U2X1 UPE0 U2X0 UDRIE UDRIE1 UDRIE0 UCSZ UCSZ2 UCSZ12 UCSZ02 
UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
UMSEL1 UPM11 UPM10 USBS1 UCSZ11 UCSZ10 UCPOL1 
UMSEL0 UPM01 UPM00 USBS0 UCSZ01 UCSZ00 UCPOL0 
WCOL WDRF WGM0 WGM00 WGM20 WGM01 WGM1 WGMA1 WGMA0 WGM31 WGM30 WGM11 WGM10 WGM21 WGMB3 WGMB2 
WGM13 WGM12 WGM33 WGM32 WDCE WDE WDP2 WDP1 WDP0 
XDIVEN XDIV6 XDIV5 XDIV4 XDIV3 XDIV2 XDIV1 XDIV0 XC0 XRAMEND XMBK XMM2 XMM1 XMM0
Posted by pepsiman
comments powered by Disqus
ATmega 시리즈나 ATtiny등의 AVR에 사용하는 C 명령어 메뉴얼(AVR gcc 레퍼런스)입니다.

기본적인것은 C의 명령어와 같지만 AVR 고유의 것도 있으니 레퍼런스를 참고 하세요.


블로그 상단에 명령어 검색 엔진을 달았으니 거기에서 명령어를 검색하시면 편할 껍니다.






Posted by pepsiman
comments powered by Disqus
arduino error

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

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



Posted by pepsiman
comments powered by Disqus
arduino error

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

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

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



Posted by pepsiman
comments powered by Disqus
가속도 센서와 자이로 센서는 완전히 다른것입니다.



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


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

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

깊이 들어가면 너무 수학적인것이어서 OTL...
Posted by pepsiman
comments powered by Disqus

티스토리 툴바