:::: MENU ::::
Browsing posts in: Open Source Hardware

아두이노 스케치를 네트워크로 업로드하기 – Arduino update remotely

아두이노 보드의 펌웨어는 USB 케이블을 PC와 연결후 PC상에서 잡히는 것은 COM 포트를 통해 아두이노 IDE를 통해 업데이트가 된다. 좀 더 구체적으로는 avrdude라는 프로그램을 써서 stk500프로토콜을 사용해서 프로그램이 된다.

아두이노 스케치를 네트워크로 업로드하기

필요한 것들

  • Wiznet의 WIZ550S2E –  1개
  • Arduino pro mini – 테스트에 사용한 아두이노 보드
  • 와이어링 케이블 – WIZ550S2E와 Arduino pro mini를 연결
  • TFTP server program – Windows의 경우 tftpd, 맥의 경우 Tftp Server
  • 아두이노 IDE 프로그램

케이블 연결 및 설정

WIZ550S2E는 Serial to Ethernet 게이트웨이 모듈로 시리얼로 들어온 데이터는 네트워크로 보내고, 네트워크에서 들어온 데이터는 시리얼로 보낸다. WIZ550S2E의 회로도를 보면 J1에 있는 입력핀들은 풀업이 되어 있어서, 아두이노와 연결에 필요한 핀은  3V3D, GND, TXD, RXD, STATUS2 핀이다.

wiz550s2e_pin

TXD, RXD는 아두이노의 RXD, TXD에 연결을 하고 STATUS2를 아두이노의 DTR에 연결을 한다. 이 DTR 신호는 아두이노 보드의 리셋에 연결이 되어 있다.  따라서 아두이노 IDE에서 스케치 업로드를 하면 연결된 보드의 DTR을 트리거링해서 아두이노 보드를 리셋시키고, 아두이노는 bootloader로 진입한다. 그리고 이 bootloader에서는 일정 시간안에 stk500 프로토콜에 해당되는 메시지가 들어오면 펌웨어를 업데이트하고, 그렇지 않으면 0번지에 위치한 프로그램으로 jump한다. 이 DTR을 트리거링 하는 것은 WIZ550S2E 펌웨어를 수정해서 적용을 할 것이다.

모듈의 설정

모듈의 설정은 Configtool을 사용해서 설정을 하며, 아래 그림을 참고한다. 특별한 것은 없고 IP, Port, Working mode 정도만 설정하면 되고, 주의 할 것은 baud rate인데 Arduino pro mini의 경우는 57600이다. 각 보드를 프로그래밍하는 baudrate는 맥의 경우 Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt파일에 정의가 되어 있다.

configtool

WIZ550S2E 펌웨어 수정하기

WIZ550S2E 모듈의 하드웨어 자료와 펌웨어 소스, Configtool의 코드까지 모든 소스는 위키에 있다. Configtool은 모듈설정에 필요하니 다운로드를 해서 설치를 하고, 수정할 펌웨어는 github에서 다운로드를 한다. 그리고 소스를 컴파일할 컴파일러는 NXP의 LPCXPresso는 회원가입 후 다운로드해서 설치를 한다. 참고로 위키에는 LPCXpresso v7.5.0_254에 최적화되어 있다고 하는데 최근 버전인 8.0도 전혀 문제가 없다. github에서 다운로드한 zip파일을 LPCXpresso에서 import해서 WIZ550S2E_APP의 S2E.c를 수정하는데, 수정한 코드는 단 한줄로 TCP 연결이 이루어졌을때 LED를 켜는 부분을 켰다가 끄는 형태로 수정을 한다. 그럼 STATUS2의 핀이 Low에서 High로 되어 DTR를 토글시켜 아두이노가 리셋이 된다.

lpcecpress

수정된 펌웨어 업로드하기

펌웨어 업데이트는 TFTP를 사용하므로 설치한 TFTP 서버에서 bin파일을 모듈이 수신 할 수 있도록 설정을 한다. Confitool로 search를 해서 업에디트 할 모듈을 찾은 후 F/W Uploading 버튼을 누르고, 서버 IP를 PC의 IP주소, Port를 69, File Name을 WIZ550S2E_App.bin로 하고 OK 버튼을 누르면 모듈은 재부팅 후 TFTP로 펌웨어를 업데이트 한다. 참고로 펌웨어를 수정하면서 기존 펌웨어와 구별을 하기 위해 common.h에서 모듈의 펌웨어를 9.0.0으로 바꾸었다.  한줄 수정된 펌웨어의 코드는 github에서… 바이너리는 dropbox에서 다운로드.

Avrdude 설정 변경
스케치를 업로드 할때는 연결된 시리얼로 데이터는 전송하는데, avrdude의 설정을 강제로 변경을 해서 아두이노 IDE가 서버의 IP:Port로 접속을 하게한다.

맥의 경우 아두이노가 설치된 폴더/Contents/Java/hardware/arduino/avr/platform.txt에 있는 내용중

tools.avrdude.upload.pattern=”{cmd.path}” “-C{config.path}” {upload.verbose} -p{build.mcu} -c{upload.protocol} -P{serial.port} -b{upload.speed} -D “-Uflash:w:{build.path}/{build.project_name}.hex:i”

-P{serial.port}를 -P net:host:port로 변경한다. 즉 host:port를 모듈의 IP와 port로 수정한다.

동작테스트

아래그림과 같이 연결을 하고 전원을 연결한다. 그리고 아두이노 IDE에서 스케치를 업로드를 하면 컴파일이 되고 avrdude는 모듈의 IP로 접속을 해서 아두이노를 프로그래밍한다. 간단하게 blink예제를 타이밍을 바꿔서 테스트를 해봤는데 잘된다. 나중에 시간이 되면 Avrdude 설정을 바꾸지 않고, Arduino IDE에서 IP:Port를 입력할 수 있게 코드를 수정해서 빌드하면 좋을 듯~~

wiz550s2e_arduino

 

업데이트 – Mac에서 작업을 해서 Windows에서도 될 줄 알았는데, avrdude 코드를 보니 다음과 같이 win32에서는 network을 지원을 하지 않는다. 즉 net:<host>:<port> 형태는 바로 “ser_open(): network connects are currently not implemented for Win32 environments” 라는 메시지를 뿌리고 리턴한다.

/*
* If the port is of the form “net:<host>:<port>”, then
* handle it as a TCP connection to a terminal server.
*
* This is curently not implemented for Win32.
*/
if (strncmp(port, “net:”, strlen(“net:”)) == 0) {
fprintf(stderr,
“%s: ser_open(): network connects are currently not”
“implemented for Win32 environments\n”,
progname);
return -1;
}


아두이노는 hex파일을 어디에 저장하는가?

아두이노는 스케치를 avr-gcc 또는 arm-gcc를 사용해서 컴파일을 한다. 이 컴파일러의 위치는 맥의 경우 Arduino.app/Contents/Java/hardware/arduino/avr/platform.txt에 정의가 되어 있다. 즉 /Arduino.app/Contents/Java/hardware/tools/ 아래에 avr, arm 컴파일러가 컴파일을 한다.

그럼 아두이노는 hex 파일을 어디에 저장을 하는가?

Arduino_Prefernece

이것을 알아보기위해서는 Arduino > Preference의 설정에서 “다음 동작중 자세한 출력보기”의 컴파일 부분을 체크하면 hex파일이 생성되는 위치를 알 수 있다.  그런데 저장되는 폴더의 위치가…

“/var/folders/4v/frv3pzr55x77gnv6_342m3wm0000gn/T/buildd18630de25a90c7712fff203789659dd.tmp/WebServer.ino.hex”

이 폴더의 위치를 바꾸기 위해서는 아두이노를 종료하고 Preference.txt 파일에 다음과 같이 “build.path=” 항목을 추가하고 폴더의 위치를 기입후 다시 아두이노를 실행한다.

build.path=/Users/AteamRnd/Work/Arduino_Compile

아래 그림과 같이 eep, elf, hex파일이 생성된 것을 확인할 수 있다.

sketch

 


Yaler.net relay service

네트워크 기능이 내장된 임베디드 디바이스의 경우 내부 네트워크에서 외부로 접속은 쉽지만, 반대로 외부에서 이 디바이스로의 접근은 방화벽등이 있으면 쉽지않고, 공유기에서 NAT, 포트포워딩 등의 기능을 사용해야 해서 일반사용자들은 이용이 어렵다.

Yaler.net relay service
Yaler.net은 이런 문제점을 해결해 줄 수 있는 서비스인데 아래 그림을 보면 동작이 쉽게 이해가 되며, 튜토리얼 문서를 보면 Arduino, Beaglebone, Raspberry Pi… 등의 유명한 보드들의 셋업가이드도 자세하게 나와있다.

Yaler_net_-_access_devices_from_the_Web

비용
비용은 회원가입을 하면 30일 무료이고, 최저 10CHF (스위스 프랑)이니 약 10불정도이니 비싸지 않다.

테스트
회원가입을 하면 자신의 계정에 다음과 같이 Relay Host, Relay Domain, Secret Key가 생성이 된다.

Yaler_net_-_Account

동작이 되는지 확인을 위해 curl을 이용해 테스트를 하면…

$ curl -vX POST gsiot-sqqm-gym8.try.yaler.net/

다음과 같이 HTTP/1.1 504가 뜨는데 이것은 보드가 온라인이 아니거나 또는 설정이 제대로 되어 있지 않아서 이렇게 응답을 하는 것이고, 만약 제대로 되면 HTTP/1.1 200 OK로 응답을 한다.

yaler_cmdline

응용
Instructables에  Arduino와 Yaler, IFTTT를 사용한 IoT Gauge with Arduino, Yaler & IFTTT 프로젝트가 있는데, 여기서는 IFTTT의 Maker 채널 을 사용하고 “Make a web request”에  Yaler 서비스 정보를 기입해서 폰의 위치정보에따라서 디바이스(Arduino Uno, Arduino Yun) 가 반응하는 꽤 흥미로운 프로젝트를 만들었으니 참고해 보면 Yaler, IFTTT, Maker Channel을 이해하는데 도움이 된다.

IoT Gauge with Arduino, Yaler & IFTTT

괜찮은 서비스
Pushover: 안드로이드, 아이폰에 알림을 띄워주는 서비스이며 IFTTT에도 채널로 등록이 되어 있다.


OSHW Certification – 오픈소스하드웨어 인증

지난 9월 19일 2015 OSHW 서밋이 필라델피아에서 열렸다.  서밋의 Ustream

OSHW Certification – 오픈소스하드웨어 인증

이미 OSHW 의 정의는 릴리즈가 되어 있지만 이 서밋에서는 OSHW Certification즉 오픈소스하드웨어 인증관련해서 버전 1.0일 릴리즈 됐다. OSHW 로고가 생기고 OSHW가 Selling Point가 된 지금 시장에서는 실제로 OSHW가 아닌 제품들이 이 로고를 사용함으로써 사용자에게 혼란을 주는 경우가 있다고 하는데, 이런 이슈들을 해결하기 위해 인증제도가 도입이 되는 것 같다.

이 제도의 목표는 다음과 같다.

Make it easier for the public to identify open source hardware.
Expand the reach of open hardware by making it easier for newer members to join the open source hardware community.

즉 사용자 측면에서 OSHW인지 아닌지 여부를 쉽게 구분이 가능하게 하고, 제작자 입장에서 가이드 라인을 제시해서 이 OSHW에 쉽게 들어올 수 있도록 하는 것이다.  이것을 위해 새롭게 Open Source Hardware Certification Logo가 만들어질 것 같다.

인증절차
인증은 자가 인증형태로 해서 로고를 붙이고 OSHWA에 통보를 하는 형태인데, 이것의 의미는 OSHW 인증에서 정한 내용을 준수한다는 것이고, 만약 지키지 않을 경우 패널티로 감수를 하겠다는 것이다.

패널티
만약에 OSHW의 기준에 만족하지 않았는데 로고를 사용한다거나 OSHW라고 명시한 경우 제작자에서 통지를 하고 이것을 수용하지 않으면 OSHWA 웹사이트에 non-comliant 리스트에 올리게 된다. 그래도 조치가 없으면 매달 500불~10,000불선까지 벌금을 부과할 수 있다.

참고자료

  • http://www.oshwa.org/2015/09/19/open-source-hardware-certification-version-1/
  • http://www.oshwa.org/2015/09/24/what-oshwa-is-and-is-not-trying-to-do-with-the-open-source-hardware-certification/

 




아두이노 Serial to USB 사용하기

원본소스는 Mac에서 \Resource\Java\hardware\arduino\firmware\atmegaxxu2 아래에 있다. arduino-usbdfu 또는 arduino-usbserial 를 사용한다. 이 소스에는 USB 프레임워크인 LUFA(Lightweight USB Framework for AVRs)가 빠져있으므로 http://www.fourwalledcubicle.com/LUFA.php 에서 다운로드한다. 다운로드한 LUFA 폴더를 arduino-usbserial 폴더와 같은 위치에 복사한다.

make 파일에서 다음과 같은 내용을 수정한다.

LUFA_PATH

# Path to the LUFA library

LUFA_PATH = ../

MCU

MCU = at90usb162  #atmega16u2와 pin to pin 호환임

컴파일된 hex파일은 avr isp등으로 write하면 된다.

이렇게 작업한 내용은 https://github.com/jbkim/usbserial


CAM350에서 Eagle CAD NC drill 데이터를 제대로 불러오기

위 그림은 CAM350에서 Eagle CAD로 만든 거버데이터를 Auto import로 불러온 것이다. drill data의 좌표가 맞지 않아서 우측 상단에 표시된 것 을 볼 수 있다. 이렇게 된 이유는 Eagle CAD에서 NC 데이터를 출력하는 포맷은 2.5인데 CAM350의 기본 설정은 2.4이다. 따라서 다음과 같이 CAM350의 Auto import 포맷에서 Digits항목을 2, 5로 수정하면 된다.

단순히 거버 데이터를 보는 수준이면 상관이 없는데 샘플 PCB가격을 아끼기 위해 2개 이상의 거버데이터를 합기기(영어로 PCB Penalization)위해서는 중요한 이슈이다.


USB 디바이스의 VID, PID

USB 디바이스 제품을 개발하려면 필요한 것이 USB 디바이스의 VID(Vendor ID), PID(Product ID)이다. 여기서 VID는 제조사의 ID이고, PID 제조사의 제품의 ID로 이해할 수 있는데 각각 2바이트로 VID-PID의 쌍으로 수많은 USB 디바이스와 구별이 가능하게 된다.  VID, PID는 USB Implementers Forum, Inc.(http://www.usb.org)에서 발급을 하는데 문제는 발급하는 데 드는 비용이 $5,000이다.

발급 신청서 링크 – http://www.usb.org/developers/vendor/VID_Only_Form_withCCAuth_010113.pdf

이 발급 신청서에 보면 다음과 같이 발급된 VID는 다른 사람에게 판매할 수 없다고 되어 있다. 예외 조항은  “special circumstances, and then only upon prior written approval by USB-IF”

The company set forth above hereby applies for a USB Vendor ID Number and agrees to the following: The USB Implementers Forum is the authority which assigns and maintains all USB Vendor ID Numbers. Each Vendor ID Number is assigned to one company for its sole and exclusive use, along with associated Product ID Numbers. They may not be sold, transferred, or used by others, directly or indirectly, except in special circumstances, and then only upon prior written approval by USB-IF. Unauthorized use of assigned or unassigned USB Vendor ID Numbers and associated Product ID Numbers are strictly prohibited.

하지만 MCS에서는 PID를 9.95유로에 판매(링크)를 한다. 그리고 openmoko의 경우 오픈소스하드웨어에 한하여 PID를 사용할 수 있게 하고 있다. http://wiki.openmoko.org/wiki/USB_Product_IDs  이 리스트를 보니, Marlin, Pinoccio, SparkCore, Tessel등이 openmoko로 부터 PID를 받은 것을 알 수 있다.

각 업체들이 받은 VID, PID는 http://www.linux-usb.org/usb.ids  링크를 참고. 그리고 PC에 연결된 디바이스의 VID, PID를 확인하려면 windows의 경우 장치관리자에서 확인이 가능하다.  

Mac OS에서는 “이 Mac에 관하여 > 개요> 시스템 리포트의 USB” 항목에서 확인이 가능하다.


ARM mbed – 데모 (big mouth billy bass)

ARM mbed는 2008년 ARM사의 직원이었던 Simon과 Chris가 Rapid Prototyping을 위한 개발 보드를 기획하면서 프로젝트가 시작이 되었다. 이때 ARM 코어를 사용하는 NXP사의 LPC1768칩을 사용하여 모듈을 구성하였으며, 2009년에 보스턴에서 열린 ESC(Embedded System Conference)에서 NXP사의 부스에서 모듈이 릴리즈가 되었고 물고기가 트위터 메시지를 네트워크로 수신해서 음성으로 출력하는 데모를 진행하였다.
2009년도 관련 동영상