<서론>

이클립스에서 아두이노 코딩을 위한 컴파일 작업을 했고, (http://knight76.tistory.com/entry/이클립스eclipse에서-avr-코딩해서-아두이노arduino-로-이미지-업로드하기-1)
이번에는 avrdude를 이용해서 이미지 업로드하는 방법을 소개한다.

 

<본론>

1. AVRDude 설정

프로퍼티 설정으로 가서, c/c++ build / Settings의 Addtiontal Tool in ToolChain을 선택한다.

“AVRDude” 설정에 대해서 check on 한다.

 

AVRDude item을 선택하고, Command 라인에 대한 설정 내용은 다음과 같이 수정한다.

“${COMMAND} -F -V  -P com3  -b 115200  -p m328p -c arduino -C G:\Arduino-package\arduino-1.0\hardware\tools\avr\etc\avrdude.conf  -U flash:w:arduino-test.hex”

 

망치 버튼을 눌러 동작을 시켜본다.

avrdude 툴을 써서 잘 이미지(hex)를 업로드하는 것을 확인할 수 있다.


**** Build of configuration 328P_16MHz for project arduino-test ****

make all
Building target: arduino-test.elf
Invoking: AVR C++ Linker
avr-g++ -s -Os -o"arduino-test.elf"  ./src/main.o  ./ref/CDC.o ./ref/HID.o ./ref/HardwareSerial.o
./ref/IPAddress.o ./ref/Print.o ./ref/Stream.o ./ref/Tone.o ./ref/USBCore.o
./ref/WInterrupts.o ./ref/WMath.o ./ref/WString.o ./ref/new.o ./ref/wiring.o
./ref/wiring_analog.o ./ref/wiring_digital.o ./ref/wiring_pulse.o ./ref/wiring_shift.o    -lm -Wl,-Map,arduino-test.map,--cref -mmcu=atmega328p
Finished building target: arduino-test.elf
 
Create Flash image (ihex format)
avr-objcopy -R .eeprom -O ihex arduino-test.elf  "arduino-test.hex"
Finished building: arduino-test.hex
 
Invoking: Print Size
avr-size --format=avr --mcu=atmega328p arduino-test.elf
AVR Memory Usage
----------------
Device: atmega328p

Program:   20130 bytes (61.4% Full)
(.text + .data + .bootloader)

Data:        544 bytes (26.6% Full)
(.data + .bss + .noinit)


Finished building: sizedummy
 
Invoking: AVRDude
G:\Arduino-package\arduino-1.0\hardware\tools\avr\bin\avrdude -F -V  -P com3  -b 115200  -p m328p -c arduino -C G:\Arduino-package\arduino-1.0\hardware\tools\avr\etc\avrdude.conf  -U flash:w:arduino-test.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "arduino-test.hex"
avrdude: input file arduino-test.hex auto detected as Intel Hex
avrdude: writing flash (20130 bytes):

Writing | ################################################## | 100% 3.23s

avrdude: 20130 bytes of flash written

avrdude done.  Thank you.

Finished building: avrdudedummy
 

**** Build Finished ****

 

이렇게 이클립스에서 사용하거나 따로 컴맨드 창에서 동작시켜도 된다.

>avrdude -P com3  -b 115200 -p m328p -c arduino -C../etc/avrdude.conf -F -e -U flash:w:test.hex

 

이런 설정은 하나하나 확인하면서 테스트했었는데. 그럴 필요가 없다. (소스 분석할 때는 없었는데/ ^^;; 완전 나의 삽질~ ㅎ)

hardware/arduino/boards.txt 파일을 보면 아래 arduino uno에 대한 설정 내용이 있다. 이 것만 잘 참조해도  avrdude 바로 쓸 수 있다.

 

uno.name=Arduino Uno
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.speed=115200
uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05
uno.bootloader.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.core=arduino
uno.build.variant=standar






<예제 파일 돌려보기>

1. 아두이노 스타일 코딩로 코딩하는 것은 어렵지 않다. 잘 동작된다.

main.cpp


#include <Arduino.h>


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

void loop() {
   digitalWrite(13, HIGH);   // set the LED on
   delay(1000);              // wait for a second
   digitalWrite(13, LOW);    // set the LED off
   delay(1000);              // wait for a second
}

int main(void) {
 init();

#if defined(USBCON)
 USB.attach();
#endif
 
 setup();
   
 for (;;) {
  loop();
  if (serialEventRun) serialEventRun();
 }
       
 return 0;
}





2. 그냥 코딩도 잘 돌아간다.
(http://www.javiervalcarce.eu/wiki/Program_Arduino_with_AVR-GCC에 있는 예제)

main.cpp


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

int main (void)
{
  unsigned char counter;
  DDRB = 0xFF;

  while (1)
    {
      PORTB = 0xFF;

      /* wait (10 * 120000) cycles = wait 1200000 cycles */
      counter = 0;
      while (counter != 50)
 {
   /* wait (30000 x 4) cycles = wait 120000 cycles */
   _delay_loop_2(30000);
   counter++;
 }

      /* set PORTB.2 low */
      PORTB = 0x00;

      /* wait (10 * 120000) cycles = wait 1200000 cycles */
      counter = 0;
      while (counter != 50)
 {
   /* wait (30000 x 4) cycles = wait 120000 cycles */
   _delay_loop_2(30000);
   counter++;
 }
    }

  return 1;
}




<project source>




마치며..

이클립스 환경설정하면서 많은 감을 잡은 것 같다. 조금씩 avr도 공부하면서 펌웨어의 즐거움을 즐겨봐야지..
Posted by '김용환'
,

 

<서론>

아두이노 1.0을 바탕으로 윈도우 OS 이클립스에서 아두이노 (AVR) 코딩할 수 있는 환경을 구축하는 방법을 알아보고자 한다.

 

<본론>

1. 가장 먼저 “아두이노 개발툴(pde)”를 설치한다.

나는 1.0 버전으로 설치했다.

 

2. make

mingw 에서 나온 윈도우용 make 유틸리티를 설치한다.

나는 5.1.5 버전을 사용중이다.

http://sourceforge.net/projects/mingw/files/OldFiles/MinGW%205.1.4/MinGW-5.1.4.exe/download 

custom 지정을 잘한다. make을 반드시 설치 목록에 넣어줘야 한다.

 

설치된 mingw/bin 디렉토리를 path에 추가한다.

mingw32-make.exe 파일을 make.exe 파일로 하나 복사해서 사용한다.

 

정상적으로 동작하는지 확인한다.

 

make 유틸리티가 윈도우 path에 등록되어 있지 않으면 이클립스상에서 컴파일은 되지 않는다.

 

**** Build of configuration 328P_16MHz for project arduino-test ****

make all

Error: Cannot run program "make" (in directory "G:\android\workspace\arduino-test\328P_16MHz"): CreateProcess error=2, ??d?? Æ???; ?; ¼? ¾ø

**** Build Finished ****


3. avr Eclipse 플러그인을 설치한다.

http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download 를 참조한다.
플러그인 update 주소는 다음과 같다.

http://avr-eclipse.sourceforge.net/updatesite

AVREclipseInstallUpdatesiteScreenshot.png

(출처 : http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download)

 

4. Preferneces 설정의 AVR Path를 변경

체인툴의 path를 설정해야 한다.

 

path source는 custom으로 하고 설치된 아두이노의 디렉토리를 지정한다.

 

위치 지정은 다음과 같다.

AVG-GCC : hardware\tools\avr\bin
GNU make : hardware\tools\avr\utils\bin
AVR Header Files : hardware\tools\avr\avr\include
AVRDude : hardware\tools\avr\bin

c/c++ / build item에서 Build all configuration in each project를 check on 한다.

 

5. 프로젝트 환경

먼저  c++ 프로젝트를 생성한다.

 

소스 디렉토리를 생성한다.

 

프로젝트의 properties를 설정한다.  내 꺼는 arduino uno이다. MCU type은 Atmgega328P , clock은 16000000로 지정한다.

 

Properties 중 c/c++ build 설정의 “Manage Configuration” 설정을 선택한다.

 

아래와 같은 팝업창에서 “New”버튼을 선택한다.

 

328P_16MHz 라는 이름으로 새로운 설정을 추가한다.

 

OK 버튼을 누르면, 아까 봤던 팝업창이 뜨는데 Set Avice 버튼을 선택한다. 나머지 설정은 다 지운다.

 

AVR tab를 선택하고, 항목에서 Enable시킨다.

 

C/C++ Build –> Settings 설정에서 Configuration 설정에서 328P_16MHz를 선택한다.

 

Settings 아이템의 Additional Tools in Toolchain에서 아래 두 옵션만 check on 한다. (우선은 컴파일하고 바이너리 이미지까지만 만드는 것까지이다.)
”Generate HEX file for flash memroy”, “Print Size”,

 

Tool Settings 밑의 AVR Compiler /Debugging을 선택하고, 정보를 확인한다.

 

AVR Compiler의 Optimization 설정을 다음과 같이 수정한다. 

-Os, 체크박스를 모두 off, "-ffunction-sections -fdata-sections”을 optimization flag로 설정한다.

 

C/C++ Build/Settings 탭의 Tool Settings/AVR Compiler/Language Standard 화면의 옵션을 모두 check off 한다.

 

AVR Compiler의 Directories 설정의 플러스 아이콘을 선택한다.

 


AVR Compiler 의 Directories에 아래 디렉토리를 추가한다. header 파일과 구현 파일들이다.

"G:\Arduino-package\arduino-1.0\hardware\arduino\cores\arduino" : 아두이노 h 및 cpp

"G:\Arduino-package\arduino-1.0\hardware\arduino\variants\standard" : pins_arduino.h

 

AVR Compiler 처럼 AVR C++ Compiler 부분도 똑같이 수정해야 한다. (사실 cpp로 동작하기 때문에 c++ compiler 설정을 더 잘해야 한다.)

 

AVR C++ Compiler/Debugging 설정을 잘 되었는지 확인한다.

 

Optimization 설정도 똑같이 한다.

 

Language Standard도 똑같이 설정한다.

 

Directories도 동일하게 설정한다.

 

 

6. 링커 설정

AVR C++ Linker에서 다음과 같이 설정한다.

Command는 avr-gcc,

Command line pattern은 “ ${COMMAND} -s -Os ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} -lm ${FLAGS}”으로 지정한다. (복사하면서 유니코드가 들어갈 수 있어 빌드 실패가 일어날 수 있음)

 

그리고, Library 설정은 특별히 하지 않는다.

 

7. 아두이노 디렉토리를 import한다.

Import/Filesystem 을 이용해서 Include된 디렉토리를 참조하게 한다. 이 파일들로 인해서 컴파일 시 참조가 되게 한다.

 

 

8. 컴파일

 

main.cpp 파일에 있는 setup(), loop()를 주석을 제거하거나 exmple 소스 하나를 구현해본다.

 

#include <Arduino.h>


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

void loop() {
      digitalWrite(13, HIGH);   // set the LED on
      delay(1000);              // wait for a second
      digitalWrite(13, LOW);    // set the LED off
      delay(1000);              // wait for a second
}

int main(void)
{
    init();

#if defined(USBCON)
    USB.attach();
#endif
   
    setup();
   
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
       
    return 0;
}

 

잘 생각해보면, 아두이노  개발 툴 에서 setup(), loop()를 구현한 코드에서 main.cpp 와 링킹하면서 바이너리가 만들어지는 모델이라는 점을 쉽게 이해할 수 있다.

 

컴파일을 하려면 툴바에 있는 망치를 선택한다.

 

컴파일하면, 다음과 같이 잘 되는지 확인가능 하다. 빌드 과정을 보면서 지금까지 셋팅한 정보로 컴파일되는지 확인한다.


**** Build of configuration 328P_16MHz for project arduino-test ****

make all
Building file: ../src/main.cpp
Invoking: AVR C++ Compiler
avr-g++  -I"G:\Arduino-package\arduino-1.0\hardware\arduino\cores\arduino" -I"G:\Arduino-package\arduino-1.0\hardware\arduino\variants\standard" -Wall -g2 -gstabs -Os -ffunction-sections -fdata-sections -fno-exceptions -mmcu=atmega328p -DF_CPU=1600000UL -MMD -MP -MF"src/main.d" -MT"src/main.d" -c -o "src/main.o" "../src/main.cpp"
Finished building: ../src/main.cpp
 
Building target: arduino-test.elf
Invoking: AVR C++ Linker
avr-g++ -s -Os -o"arduino-test.elf"  ./src/main.o  ./ref/CDC.o ./ref/HID.o ./ref/HardwareSerial.o
./ref/IPAddress.o ./ref/Print.o ./ref/Stream.o ./ref/Tone.o
./ref/USBCore.o ./ref/WInterrupts.o ./ref/WMath.o ./ref/WString.o
./ref/new.o ./ref/wiring.o ./ref/wiring_analog.o ./ref/wiring_digital.o
./ref/wiring_pulse.o ./ref/wiring_shift.o    -lm -Wl,-Map,arduino-test.map,--cref -mmcu=atmega328p
Finished building target: arduino-test.elf
 
Create Flash image (ihex format)
avr-objcopy -R .eeprom -O ihex arduino-test.elf  "arduino-test.hex"
Finished building: arduino-test.hex
 
Invoking: Print Size
avr-size --format=avr --mcu=atmega328p arduino-test.elf
AVR Memory Usage
----------------
Device: atmega328p

Program:   20130 bytes (61.4% Full)
(.text + .data + .bootloader)

Data:        544 bytes (26.6% Full)
(.data + .bss + .noinit)


Finished building: sizedummy
 

**** Build Finished ****

 

Navigator 또는 Project Explorer로 보면, 아래와 같이 make 파일과 hex, elf 파일이 생성되는지 확인할 수 있다.

 

이제는 이미지 업로드하는 작업을 한다.

Posted by '김용환'
,

 

600원짜리 아이폰 충전기

image

 

그리고, 오래되서 쓸모없는 명함과 플라스틱 명함통을 칼로 잘 다듬었다. 그리고 가운데 구멍을 내고. 그 안으로 600원짜리 아이폰 충전기를 연결했다.  (약간 아쉬운 점은 600원짜리 아이폰 충전기가 아닌 정식 충전기였으면 딱 구멍에 맞게 칼질을 해서 다듬었으면 좋은 결과가 나왔을 것 같다.)

명동에서 파는 아이폰 껍데기를 이용해서 약간 높게 했다. 아래 부분도 공간이 생기게 할 수 있었다.

IMG_1117

 

이렇게 해서 만든 아이폰 deck이다.

IMG_1118

 

아직까지는 그러저럭 쓸만한다.

Posted by '김용환'
,

 

아이패드 게임으로 나온 FIFA 12를 보면서 앞으로 어떤 게임이 나올지 사뭇 궁금해졌다.

 

아이패드를 모니터로 하고. 아이폰을 게임 패드로 해서 게임을 해보면서
앞으로 스마트폰이 정말 대세가 되겠다하는 생각이 들었다.

게임 입장할 때, 블루투쓰로 연결하려고 한다.

image

 

블루투쓰 연결이 되면 latency 가 보인다.

image

 

실제 게임을 하는 장면으로. 잘 돌아간다. 

나는 블루투쓰 통신은 1:1인줄 알았는데. 아이패드1-아이폰2 대의 연결을 보면서 가능성을 볼 수 있었다. 
이거 어떻게 짠거지?? 하는 호기심도 많이 발동한 것 같다.

IMG_1123

 

아이폰 화면은 이렇게 콘트롤러 패드 형태로 나오면서 게임을 즐길 수 있다.

IMG_1122

Posted by '김용환'
,
Posted by '김용환'
,

김성근 감독님

리더쉽 2012. 1. 3. 10:51

나는 야구에 많은 관심이 없다.
그런데, 전 SK 김성근 감독님의 책을 보면서 참 즐거웠다. (김성근 감독이 직접 싸인한 책을 집에 가지고 있다.) 데이터를 중시하고 리더십에 대해서 깊이 고민하는 분의 자서전을 보면서 일부분 배우고 싶었던 부분이 있었다.


야신 김성근, 꼴찌를 일등으로


데이터 야구라고 해서 우리팀 선수가 어떤 선수를 만나서 어떤 결과를 나았는지 데이터를 분석하고 사람을 키우고. 하는 모든 일들을 보면서 멋있었다 하는 생각이 들었다.
선수과 경기에 대해서 깊이 세밀하고 디테일했기 때문에 감독으로 성공하지 않았을까 하는 생각을 했다.

최근에 감독직을 그만두면서 어려운 상황에 있었는데.. 근래 좋은 인터뷰 기사가 있어서 공유하고자 한다.

"김성근 감독 작심 발언, "야구는 감독이 한다""
http://sports.media.daum.net/baseball/news/breaking/view.html?cateid=1028&newsid=20120103094316576&p=SpoSeoul

어록
- 야구는 확률 게임이다.  ('머니볼'과 일명 통하는 말이다.)
- 야구장에서는 모든 것들을 한 순간도 놓치면 안 된다. 그게 현장에 앉아 있는 감독의 책임이다.
- 외나무다리에서 원수를 만나도 끌어 안는다.
- 지도자는 엄한 아버지가 돼야 한다. 자식의 미래는 내 손에 달려 있기 때문이다. 아이들의 미래를 항상 걱정하고 내가 올바르게 행동해야 한다. 부모라 하는 것은 가슴으로 모든 비난을 받고, 위기에는 자신 뒤에 자식들을 감출 줄 알아야 한다.
- 사회적으로도 '절망은 없다. 하면 된다'는 생각을 퍼뜨릴 수 있는 기회라고 생각한다. 무엇이든 안 된다는 건 없다는 걸 보여줄 기회라고 생각해 나로서도 충분히 도전할 가치가 있었다.
- 거짓말을 못하고 늘 직선적이다.
- 감독은 어느 정도 신비스러움 속에 있어야 한다고 본다.
- 난 이기기 위해 왔지 기분 맞추러 온 사람은 아니기 때문이다.
- 우리나라 사회는 고마움이나 미안함을 모른다. 한 번 은혜를 받으면 평생 가지고 가야 하는데 의리가 없다. 그때 인터뷰에서는 그런 것들을 어필하고 싶었다.

감사합니다. 김성근 감독님. 많은 것을 배우네요~






'리더쉽' 카테고리의 다른 글

동경  (0) 2012.07.13
김준호 리더쉽, 제리 맥과이어  (0) 2012.06.12
이예 - 일본 통상기  (0) 2011.12.14
GM 되살린 영원한 'Car Guy' 밥 루츠 최고임원  (0) 2011.09.27
오진권의 맛있는 성공  (0) 2011.09.05
Posted by '김용환'
,