:::: MENU ::::
Browsing posts in: Wiznet

아두이노 스케치를 네트워크로 업로드하기 – 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;
}




Arduino Ethernet 라이브러리 업데이트

WZnet 칩 W5100, W5200과 W5500을 지원하는 통합 아두이노 라이브러리인 Arduino Ethernet 라이브러리를 업데이트 했다. 기존 코드에서 달라진 점은 다음과 같다.

  • Arduino IDE 1.5.x 지원 : Arduino Due를 지원하기 위함.
  • Due용  SPI 드라이버 추가
  • W5200및 W5500의 경우 SPI드라이버 속도를 높였다. 무려 42Mhz까지 지원
  • w5100::read_data함수의 파라미터의 형 변경
  • flush() 함수 추가

Arduino IDE 1.5.xx를 지원하기 위해서는

  • 32비트 SAM용 SPI 드라이버가 추가 되야한다.
  • IDE 1.5.x의 폴더 구조가 바뀌어서 헤더파일 include가 변경된다.아래 그림 참고…  예를 들면 #include “w5100.h”가 #include “utility/ w5100.h” 이런 식으로…

Arduino_Folder

  • AVR코드와의 구별은 #if defined (ARDUINO_ARCH_AVR)로 한다.

W5500 SPI

W5500_SPI

데이터 시트에는 이론상 80Mhz까지 가능하다고 나오지만 실제로는 33Mhz 정도가 최대 SPI clock으로 명기해 놓고 있다. 그리고 Atmel SAM에서  SPI clock은 다음과 같이 결정된다. 즉 메인 클럭을 분주해서 사용을 하는데, 아두이노에서는 84Mhz를 메인으로 사용하므로 14Mhz, 28Mhz, 42Mhz, 84Mhz가 설정이 가능하다.

SAM_SPI

 

아두이노 코드에서는 다음과 같이 클럭을 분주해서 42Mhz가 가능하다. 1로 분주하면 84Mhz 인데, 칩에서는 80Mhz까지만 지원하므로 84Mhz는 지원이 안된다. 42에서 84는 갭이 크다…

참고로 아두이노에서 W5100의 SPI는 4Mhz로 설정이 되어 있으니, 거의 10배 이상이 빨라짐~~


Arduino 코드에서 WIZnet칩 구별하기

WIZnet 칩

WIZnet 칩중에서 SPI가 지원되는 칩은 W5100, W5200 그리고 W5500이 있다. 이중 W5100은 아두이노에 적용이 되어 Ethernet Shield 및 Arduino Ethernet 보드에 사용이 되고 있다. 물론 W5200으로 만든 Ethernet Shield도 있고 W5500으로 만든 Ethernet Shield도 있다. 그리고 최근에는 아두이노 팀에서 W5500으로 Ethernet Shield를 만들고 있다. 이렇게 3가지 칩으로 적용된 보드가 있는데, 그럼 코드에서 이 칩들을 구별할 수 있는 방법이 있는가?

Arduino 코드에서 WIZnet칩 구별하기

W5100, W5200, W5500의 칩들의 기본 기능은 같지만 H/W적으로는 패키지도 다르고 핀도 다르고, 내부 메모리 맵도 다르다. 모두 SPI 를 사용하지만 칩을 제어하기 위한 SPI format도 다르다. 그리고 W5100은 소켓이 4개이고 나머지 칩들은 모두 8개의 소켓을 지원한다.

코드에서 이들 칩을 구별을 하려면 이 칩들의 내부 레지스터를 읽어서 각 칩들에만 유효한 값을 확인해서 비교를 해야한다. 다행히 W5200과 W5500은 칩의 버젼을 구분하는 레지스터가 있다. 따라서 이들 2칩을 구분하면 3개중 2개를 구분이 되니 W5100은 구분이 가능하다. 즉 W5200이 경우 version 레지스터(0x001F)를 읽으면 0x03이 읽히고, W5500의 경우 0x0039 번지를 읽으면 0x04가 읽힌다.

 W5100W5200W5500
0x001F0x000x030x00
0x00390x000x000x04

아두이노 코드

아래 코드는 아두이노 Ethernet 코드를 수정하여 만든 코드이고, Webserver.ino에서 테스트를 했다.

관련 코드는 : https://github.com/jbkim/Differentiate-WIznet-Chip


W5500 Examples on Parallax

작년 말에 Parallax Activity board에 W5500 드라이버를 포팅을 했다. 오늘은 관련된 예제 프로그램들을 모두 포팅해서 github에 올렸다. 이중 흥미로운 것은 Html 5 지원 Webserver인데, 브라우저에서 실시간으로 변동되는 데이터를 그래프로 보여주는 응용이다.

At the end of last year I ported the W5500 driver on the Parallax Activity board. Today, I ported all the related network example and posted on my github. Most interesting example is the Html 5 Webserver showing the real time data in the graph.

Html5_Graph


WizFi210과 IoT서비스 연동

Cosm은 IoT 서비스로 예전에 Pachube라는 이름으로 서비스를 하다가 LogMeIn에 인수가 되면서 Cosm으로 이름이 바뀌었다.먼저 Cosm의 서비스를 사용하기 위해서는 회원 가입을 하고, Device/Feed를 추가해야한다.

Cosm 설정
1. 회원 가입
회원 가입을 하면 API키를 발급을 하는데, 이 정보는 기억을 해둬야하고, 나중에 Keys에서 다시 확인을 할 수 있다.

cosm_00

2. Device/Feed 추가
Something Else를 선택한다.
cosm_01
Step1에서 디폴트로 선택이 되어 있는 “No, I will push data to Cosm”를 선택을 한다.

cosm_02

나머지 Title, Tag등의 정보를 입력을 하면 Feed 설정이 끝나고 다음과 같이 피드ID가 생성이 된다. API키와 Feed ID는 이 서비스를 사용하기 위해 꼭 필요한 정보이다.

cosm_03

WizFi210 설정

1. Association
AT command mode에서 다음과 같은 순서로 입력을 해서 AP에 연결을 한다.이것은 AP의 보안 설정에 따라 다르며, 하기 내용은 infrastructure 모드에 암호가 없고, DHCP로 IP를 받는 경우이다.
AT+WD
AT+WAUTH=0
AT+NDHCP=1
AT+WA=”SSID of your AP”
AP에 정상적으로 연결이 되면 다음과 같이 모듈의 IP정보가 출력된다.
WizFi210_IP

2. DNS lookup & connection

api.cosm.com에 접속을 해야하므로, 이 URL의 실제 IP를 얻기위해서 DNSLOOKUP명령을 사용한다.
WizFi210_Cosm
  1) 위 그림을 보면 IP를 216.52.233.121을 얻었고,
  2) TCP client로 이 IP로 연결을 한다. 웹이기 때문에 포트는 80
  3) AT+CID=? 명령어는 connection ID를 얻기위한 정보이고, HTTP로 데이터를 보낼때 사용한다.
3. HTTP packet 보내기
HTTP raw 데이터를 보내기 위한 명령어 및 절차는 다음과 같다.
1) [ESC][S][CID] <= 즉 Hex로 표현을 하면 0x1B 0x53 0x30 3바이트를 입력한다.
 
2) HTTP raw 데이터 전송
WizFI210_HTTP_data
위 그림에서 1)은 Feed ID, 2) API key, 3) HTTP data size, 4) Feed 및 데이터 “200”
 
3) [ESC][E] <= 즉 Hex로 표현을 하면 0x1B 0x45 2바이트를 입력한다. 
실제 데이터는 위 [ESC][E]명령을 보낼때 전송이 되며, Cosm 서버로 부터의 응답은 다음과 같다.

Cosm_reply

Cosm서버에서 확인한 내용
cosm_data
200이라는 값이 업로드 됨을 알 수 있다.

WizFi210의 F/W를 SPI버젼으로 바꾸기

  • H/W 설정

WizFi210의 F/W를 업데이트하기 위해서는 모듈을 RUN mode에서 PROGRAM mode로 설정을하고, UART를 이용해서 업데이트를 해야한다. 아래 회로도를 보면 모듈의 37번핀을 Low로 하면 RUN mode이고, High로 하면 PROGRAM mode이다. 이 핀을 High로하고, UART핀 TX(40번), RX(42번)핀을 RS232 트랜시버를 거쳐서 PC의 시리얼 포트에 연결을 한다.

wizfi210_program

  • PC프로그램 설정

WIZSamrtScript 프로그램을 다운로드 받는다. 링크

SPI 용 F/W를 다운로르 받는다. 링크

WIZSamrtScript 프로그램의 압축을 풀면 다음과 같이 3개의 폴더가 생기는데, AppFWFiile 폴더에 SPI용 F/W를 copy하고, 각각 s2w-app1.bin, s2w-app2.bin, WFW.bin로 이름을 바꾼다.

wizsmartscrypt2

WIZSmartScript를 실행하고, 보드와 연결된 PC의 COM 포트를 Manual로 정확하게 입력한다. Group 항목을 U. JIG(User) 로 선택한다. Script는 2. Flash Write(WLAN, APP, Clear) 를 선택한다.

  • F/W 업데이트

Start Script를 클릭하면 다음 그림처럼 자동으로 flash를  erase 하고 다시  write 한다.

wizsmartscrypt

업데이트가 끝나면, 전원을 끄고 보드를 Program mode 에서 Run  mode로 설정을 변경한다.

모듈의 37번 핀을 Low 상태로 하여, 모듈run mode로 설정을 한다. 

  • MAC 어드레스 입력

이와 같이 F/W를 업데이트를 하면 MAC가 초기화된다.  따라서 AT command를 사용해서 다시 입력을 해야한다.

아두이노를 이용해서 MAC 어드레스를 입력하기

필요한 라이브러리: WizFi 쉴드의 라이브러리.

 

이 파일들은 아두이노가 설치된 폴더의 libraries 폴더 아래에 압축을 풀어서 copy한다.

MAC 어드레스 입력을 위한 아두이노용 스케치를 아두이노에 다운로드를 하고, 실행을 한후 시리얼 터미널을 실행시키면 코드는 MAC 어드레스를 받을 준비를 하는데, 이때 ‘S’를 입력한다. ”R’이 리턴이 되며, 다음 그림과 같이 MAC 어드레스를 입력을 한다.

cfile7.uf.176DA83550CEC0DD0B16D4.zip

스크린샷_2012-12-17_오후_3.45.27


Maple mini 보드에서 Wiz820io 사용하기

Leaflab사의 블로그를 보고 Maple mini보드에 Wiz820io를 연결해서 테스트를 진행했다. 브레드보드가 있으니 연결은 금방한다. 예제들이 UART3를 사용하기 때문에 아래 그림처럼 RS232 트랜시버가 달려있는 쪽보드를 사용해서 시리얼을 연결했다.


H/W 연결
Maple mini보드의 Fritzing라이브러리도 만들고… 회로 연결은 아래 그림과 같다. 사실 연결할 것은 SPI 시그널과 VCC, GND 밖에 없다. 
    Maple mini Fritzing 라이브러리:


cfile4.uf.1460D83F4EE5A5580D181E.fzpz
라이브러리
아래 첨부한 파일을 Leaflab IDE의 \libraries\wizEthernet에 압축을 풀어서 넣는다.
예제 파일이 telnetServer, webServer 2가지가 있는데, 제공되는 예제가 약간 문제가 있다.
telentServer의 경우 password를 칠때는 문제가 없지만 다른 경우에 매 문자마다 echo back를 해서 이것을 수정을 했고, webServer의 경우 브라우져에서 favicon을 요청시 처리를 위해 “HTTP/1.1 404 Not Found” 페이지를 돌려주기 위한 코드를 추가 했다. 
   wizEthernet 라이브러리: 


cfile29.uf.175DF13F4EE5A4850D2B13.zip



  수정된 예제 파일:


cfile3.uf.172F71414EE5A4430F27EA.pde


cfile27.uf.17335D414EE5A4542CA563.pde




혹시 컴파일후 보드에 다운로그가 문제가 있을 경우, 이전 포스트를 참고(LeafLabs의 Maple mini, Maple Ret 5 보드 사용기)


아두이노 보드에서 W5200 사용하기

아두이노의 공식 Ethernet 쉴드에는 WiznetW5100이 사용된다. 따라서 모든 Ethernet 라이브러리는 W5100을 이용하는 것으로 되어있는데 Wiznet의 신규칩인 W5200을 아두이노 보드에서 사용하기 위해서는 라이브러리를 일부 수정을 해야 한다. W5100과 비교해서 W5200의 장점은 대략 작은 패키지, 8 socket 지원(W5100의 경우 4 socket 지원), Power down mode, Wake on LAN 기능 지원 등이다. 
    W5100 to W5200 migration guide



Hardware 연결
간단한 테스트를 위해 Wiz820io를 사용을 해서 아래 그림처럼 테스트를 했다. 아래 그림은 Fritzing 이라는 툴로 Wiz820io 라이브러리를 만든 후 작성한 연결도이다. Fritzing관련해서는 이전 포스트 참고(Fritzing, Fritzing 라이브러리 만들기)
    Wiz820io의 Fritzing 라이브러리


cfile28.uf.182202414EE59CB821A744.fzpz


* PWDN, nINT, 스위치를 통한 reset 입력은 연결을 안 해도 되고, VCC, GND도 하나의 선만 연결해도 된다.




라이브러리 수정
변경을 최소화하고 기존의 라이브러리와의 호환성을 위해 변경된 드라이버는 W5100과 같은 파일명을 쓴다. 즉 W5100.cpp와 W5100.h 파일만 수정해서 아두이노 IDE가 설치된 폴더에 덮어쓰면 된다. 즉 “/libraries/Ethernet/utility” 아래에 있는 W5100.cpp 및 W5100.h 파일을 아래 첨부한 파일로 변경하면 된다. 파일에 수정된 부분은 W5200으로 검색을 하면 쉽게 찾을 수 있다.


cfile23.uf.160404394EE5D0692C5B5D.cpp


cfile3.uf.177E62394EE5D06A33D119.h




테스트
아두이노의 IDE에서 File > Examples >Ethernet > 에 있는 예제를 열어서 컴파일 후 아두이노보드에 다운로드를 하면 잘 동작한다. 
최근에 릴리즈한 Arduini 1.0 에서는 기존 Ethernet 라이브러리가 좀 더 확장이 되었다.  http://arduino.cc/en/Main/ReleaseNotes 참고

* Support for DHCP and DNS has been added to the Ethernet library, thanks to integration by Adrian McEwen. Most classes in the Ethernet library have been renamed to add a “Ethernet” prefix and avoid conflicts with other networking libraries. In particular, “Client” is now “EthernetClient”, “Server” is “EthernetServer”, and “UDP” is “EthernetUDP”. A new IPAddress class makes it easier to manipulate those values.


* The UDP API has been changed to be more similar to other libraries. Outgoing packets are now constructed using calls to the standard write(), print(), and println() functions – bracketed by beginPacket() and  endPacket(). The parsePacket() function checks for and parses an incoming packet, which can then be read using available(), read(), and peek(). The remoteIP() and remotePort() functions provide information about the packet’s origin. (Again, thanks to Adrian McEwen for the implementation.)


Pages:12