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

SPI of Arduino

SPI of Arduino

ArduinoMOSIMISOSCK
UnoD11 or ICSP4D12 or ICSP1D13 or ICSP3
Mega256051 or ICSP450 or ICSP152 or ICSP3
LeonardoICSP4ICSP1ICSP3
DueICSP4ICSP1ICSP3

SPI 신호들은 ICSP핀이나 보드의 우측 상단(AREF 있는 쪽)에 같이 연결된 경우도 있으나, 그렇지 않은 경우도 있다. 그러므로 SPI를 사용하는 쉴드를 디자인 할 경우 라우팅을 쉽게하기 위해 한쪽만 SPI를 사용하려면 ICSP핀 쪽에만 연결을 하면 된다.


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



오픈 소스 하드웨어를 위해 정부가 할 일?

오픈 소스 하드웨어

업무때문에 2010년도에 아두이노팀을 만나고 오픈소스 하드웨어에 관심을 갖게되어서 뉴욕에서 열린 오픈하드웨어 서밋에도 참석을 하고, 메이커페어도 참석을 했다. 이후에 아두이노 IDE가 다국어 버젼을 지원을 할때, 한국어 번역도 하고(덕분에 지금도 버젼이 바뀌면 메일이 온다…) OSHW definition 도 번역을 했다.  최근 아두이노의 영향때문에 크라우드 펀딩 사이트인 Kickstarter.com에도 아두이노로 검색을 하면 161여개의 프로젝트가 뜬다.

Kickstarter_Arduino

ICT D.I.Y

국내에도 오픈소스 하드웨어에 대한 관심아 졌는데 특히 정부에서도 이 분야에 관심을 가지고 있는듯 하다. 미래창조과학부의 보도 자료에 의하면 2017년까지 ICT R&D예산 총 8.5조를 투자하는데 이중 15대 미래서비스 중 하나로 들어가 있는 것이 ICT D.I.Y서비스 이다. 물론 IoT플랫폼도 오픈 소스 하드웨어와 관련이 있다. 그런데 몇가지 궁금한 점이 있다.

“한류(국산) 오픈 소스 하드웨어 플랫폼”?

기술적으로 국산 오픈 소스 하드웨어 플랫폼이 가능하려면 사용되는 모든 부품 특히 MCU를 만들어야 하는데, 호환성 없는 즉 전혀 생소한 개발 환경의 제품을 만들어 내지는 않을까 우려가 된다. 즉 한국형이라는 말로 정말 한국에서만 쓰이는… 또는 정부 과제를 위한 사업들로 전락하는 것은 아닌지 우려스럽다.

개인적인 바램은 이런 사업으로 중소기업 또는 개인이 이런 플랫폼으로 쉽게 자신의 아이디어를 구체화하고 검증하며 시제품을 만드는데 도움을 줘야한다.

특히 요즘은 하나의 제품을 만드는 것이 단순히 하드웨어를 만드는 것 뿐만 아니라 S/W, 스마트폰 앱, 인터넷 서비스 까지 신경을 써야하기 때문에 이런 부분의 전문가들이 서로 협업을 할 수 있는 공간과 미국의 TechShop처럼 Tool들의 사용법을 가르치고 사용할 수 있는 기반이 필요하다.

또한 해외의 유명 커뮤니티처럼 국내에서도 이런 커뮤니티를 육성하고 지원을 해줄 수 있는 제도도 필요하다. 국내의 카페형 커뮤니티는 너무 폐쇄적임…

너무 이상적인 이야기인가?


오픈소스 하드웨어 정의 – OSHW definition 1.0

예전에 오픈소스 하드웨어 정의(OSHW definition 1.0)를 위키에서 한글 번역을 했다. 이때도 권한이 없어서 변경 저장을 위해 관리자에게 메일을 보내서 수정을 한 기억이 있다. 수정을 끝내고 오픈소스 하드웨어 협회의 홈페이지에 게재를 요청하고 승락을 받았는데, 최근에 보니 업데이트가 되어있다.

 Translations: 中文FrançaisΕλληνικά,  Italiano,  日本語한글,  Latina,PortuguêsEspañolSvenska,   <= 번역된 순서대로인가? ^^

oshw

 


W5500 드라이버 포팅: Parallax Propeller칩

Parrallax는 미국의 펩리스 반도체 회사이다. 이 회사의 칩은 Propeller인데 이 칩은 특이하게도 내부에 8개의 프로세어 코아가 있어서 병렬처리가 가능하다. 이 8개의 코아를 COG라고 부르는데, 아래 블럭다이아그램 처럼 내부에 각각 프로세서, RAM, 레지스터, 카운터 등이 있고 이 COG가 외부에 나와 있는 I/O를 공유한다. 그리고 각각의 COG를 제어하는 HUB가 있어서 각각의 COG각 언제 I/O를 access할지를 결정한다.

parallax_propeller

Propeller칩을 프로그래밍하게 위해서는 어셈블러, SPIN이라는 언어로 프로그래밍이 가능하며, 최근에는 C 컴파일러가 지원이어서 C로도 프로그래밍이 가능하지만 코드사이즈나 성능이슈로 대부분의 코드는 어셈블러나 SPIN으로 만들어져 있다.

데이터 시트 및 메뉴얼은 다음 링크에서 다운로드…

 

W5500칩의 드라이버를 포팅하기 위해 사용한 보드는 Propeller Activity Board인데, 이 보드에 있는 브레드보드에 WIZ550io를 꼽고 와이어링을 통해 Propeller칩과 연결을 했다. 연결되는 방식은 SPI 신호, 리셋 신호 및 전원 신호만 결하면 되므로 간단하다.

Propeller_WIZ550io

포팅한 코드는 Mike G라는 사람이 W5200으로 만든 코드를 포팅을 했는데, 이 코드는 SPI 인터페이스가 어셈블러로 되어있어서 이것을 일단 SPIN 랭귀지로 수정했다. W5500에서는 SPI 포맷 및 메모리 맵이 바뀌어서 W5500을 read, write하는 함수들 역시 수정을 했다.  수정된 코드가 제대로 동작하는지 확인을 하기위해 TCPMultiSocketServer 프로그램(간단한 웹서버 프로그램) 코드와 같이 컴파일을 해서 돌리니 잘 동작한다.

관련된 모든 코드는 github에 오픈: https://github.com/jbkim/Parallax_W5500


Intel Galileo board와 Arduino Tre

Intel Galileo Board

최근 아두이노는 매년 메이커페어에서 신제품의 출시에 대한 내용을 발표하는 것 같다. 올해는 지난 주말에 이태리 로마에서 있었던 메이커페어 유럽에디션에서 인텔과의 협력으로 나온 보드인 Intel Galileo Board를 발표를 했다. PC 기반의 칩셋업체인 인텔이 임베디드분야에 그것도 오픈하드웨어에 발을 담그기 시작한 것이니 최근 오픈 소스 하드웨어의 열풍이 세상을 변화시키고 있는 것은 확실한 것 같다.

그런데 한가지 재미있는 것은 이 제품이 아두이노의 “Arduino Certified” 제품군에 들어간 것이다. 우리가 익히 알고 있듯이 인텔은 자신들의 칩셋을 PC 업체에 공급을 하면서 Intel Inside라는 로고를 붙이게 했다. 하지만 오픈소스하드웨어 시장에서는 도리어 아두이노가 거대 기업 인텔에게 “Arduino Certified”라는 로고를 주다니…

Arduino Certified & Arduino at Heart Program

아두이노가 유명세를 타면서 많은 클론과 카피켓들이 나오고 있는 상황에서 “Arduino Certified”는 이에 대한 대안으로 생각이 된다. 이제 시장에서 “Arduino Certified”가 붙지 않은 제품들은 아무래도 입지가 좁아들 것이고, 반대로 아두이노는 더 큰 영향력을 갖게 될 것이다.

ArduinoAtHeart_logo

이것과 함께, Arduino at Heart Program이 소개가 되었는데, 이것은 Atmel 칩을 사용하면서 아두이노 플랫폼에 기반한 제품들에 주는 로고이다. 즉 아래 칩들을 사용한 제품이 아두이노 기반의 코드로 만들어 있다면 Arduino at Heart 로고를 준다. 아마도 이것은 Atmel과 같이 기획한 냄새가 많이 나는데, 오픈소스하드웨어가 기존의 프로토타입이나 하비스트의 제품을 넘어서 완제품까지 연결이 되는 시대가 왔음을 시사하는 것 같다.

  • ATMega328 clocked at 8 or 16 MHz
  • ATMega1280 clocked at 16 MHz
  • ATMega2560 clocked at 16 MHz
  • ATMega32U4 clocked at 16MHz
  • SAM3X

이 프로그램의 혜택은 아두이노 커뮤니티의 도움을 얻을 수 있고, 사용자가 커스터마이징이 가능하며, 아두이노 채널(홈페이지, 트위터 및 기타 마케팅 채널)을 통해서 프로모션을 해준다는 것. 물론 이 로고를 붙이기 위한 라이센스 비용이 필요하다. -_-;;

Intel® Quark SoC X1000 Application Processor

아무튼 보드의 스펙을 보면 펜티엄기반 Intel® Quark SoC X1000 Application Processor를 사용하고, 아두이노의 IDE 를 사용해서 프로그래밍이 가능하다. 물론 기존의 쉴드들도 사용이 가능하다고 한다.

관련기사: http://blog.arduino.cc/2013/10/03/massimo-banzi-reveals-an-exciting-new-product-and-collaboration-with-intel/

개봉기: http://www.flickr.com/photos/brucesterling/sets/72157636182707015/

Arduino Tre

Arduino Tre

Tre는 이태리어로 3이라는 뜻인데, 기존 Uno, Due보드의 후속의 성격이다. 하지만 TI의 1-GHz Sitara AM335x을 사용해 우노나 네오나르도 보드보다 100배 빠르다고 한다. Arduino Yun보드가 리눅스를 사용한 것 처럼 이보드 역시 리눅스 기반인데 더 의미가 있는 것은 Beagleboard와 협력해서 나온 작품이라는 것이다.

즉 Beaglbone Black에 사용된 동일한 칩을 사용하고 있다. 인텔과의 콜레보레이션에 이어 TI와 콜레보레이션 이라… 아두이노는 8비트 기반에서 High-end로 가고 싶었고, BeagleBoard는 아두이노의 다양한 쉴드 및 커뮤니티를 원했던 것이 아닌가 생각이 된다. ^^*

관련기사: http://beagleboard.org/blog/2013-10-03-beagleboardorg-collaborates-with-arduino/


LPC810 ARM CortexM0+ Project -1

Project Description

이 프로젝트의 목적은 가장 작은 MCU에 Ethernet connectivity를 구현하는 것이다. 아마 아래 그림과 같은 형태가 될것이다.

lpc810_ethernet

CortexMo+

NXP에서 출시한 LPC800시리즈는 ARM사의 CortexM0+ 시리즈의 칩이다. ARM의 소개 페이지에 있는 것 처럼 CortexM0와 마찬가지로 8, 16비트 시장을 타겟으로 하고 있다. CortexM0와 비교해서는 파워소모를 더 줄였고 성능은 더 높인 버젼이라고 이해하면 될 듯 하다. TI의 MSP430과 비교를 한 사이트도 있는데, GPIO만 적을뿐 가격, 파워 소모, 성능등 모든 면에서 우월하다.

LPC810

LPC800 시리즈중 눈길을 끄는 칩은 8핀 DIP패키지인 LPC810 이다.

Lpc800 dip8

이 패키지의 내부 구조는 아래 그림과 같다. 전원핀 6, 7번을 제외하면 나머지 핀들은 GPIO와 다른 기능이 multiplex되어 있어서 칩의 핀수를 줄일 수 있다. 더구나 내부 RC발진 회로덕분에 외부에 크리스탈 또는 오실레이터를 연결하지 않아도 된다.

LPC810_Pin

LPC810 시리즈는 아래 그림과 같이 메모리 용량에 따라 DIP8, TSSOP16, SO20, TSSOP20등의 패키지가 존재한다.

LPC810 Ordering

회로도

LPC810_Sch

일단 간단한 동작확인을 위해 Ardafruit에서 LPC810 Mini Starter Pack을 구매하고 Adafruit의 회로를 참고해서 위와 같은 회로를 구성하였다. Adafruit의 회로는 초보자를 위해 Fritzing(이 툴 관련 이전 블로그의 글들)을 이용해서 그려져 있는데 사실 엔지니어가 보기에는 회로도가 더 편하다. 암튼 안정적인 동작을 위해 난 리셋 회로를 추가하고 편의를 위해 ISP에 핀 헤더를 달았다. P0_2에는 LED가 달려있으며, MCP1700 레귤레이터를 통해 5V가 3.3V로 변환되어 칩에 입력이 된다.

프로그래밍

요즘 나오는 칩들이 거의 모두다 그렇지만 이 칩도 내부 ROM에 bootloader가 있고,  ISP(In System Programming)기능을 지원한다. 즉 UART를 통해서 내부 Flash의 업데이트가 가능하다.  그리고 NXP에서 제공하는 개발 환경인 LPCXpresso는 이클립스 기반이라서 Win, MAC, Linux를 모두 지원한다.  Adafruit에서 소개하는 페이지에는 Windows기반에서 설명을 하는데 난 MAC  환경이라서 OS X에서 개발 환경을 구축하였다. LPCXpresso를 다운받으려면 http://lpcxpresso.code-red-tech.com/LPCXpresso/ 여기에 사용자 등록을 해야 다운로드가 가능하다. 문제는  MAC용 Falsh Magic에서 아직 LPC800시리즈를 지원하지 않아서 lpc2isp를 사용해야 한다.

  • LPCXpresso에 프로젝트 등록 : 이 내용은 Adafruit에 자세히 나와 있으니 이곳을 참고. 간단히 설명하면  코드를 Github에서 ZIP 형태로 다운로드해서  받아서 LPCXpresso에서 Import Project를 하면 된다.
  • PL2303드라이버: Adafruit의 USB to TTL Serial Cable 에서 설명하는 Prolific 드라이버를 설치했으나 MAC 에서 인식이 되지 않아 인터넷에서 다른 드라이버를 찾아서 인식시켰다. 
  • Mac에서 시리얼 포트가 잡혔는지 확인하기: ls /dev/tty.*
  • Flash Magic 대신 lpc2isp사용하기: http://lpc21isp.sourceforge.net/에서 소스를 다운로드 받아서 gcc 로 컴파일 한다. 단 make 파일에서 CFLAG에 -static옵션을 빼야지 제대로 컴파일이 된다.

lpc21isp

  • lpc2isp 사용법은 “lpc21isp hex-file명 serial-port baud-rate clock of MCU(in Khz단위)”이다 여기서 마지막 파라미터인 MCU의 clock을 Khz단위로 넣는 것이 중요하다.  즉: ./lpc21isp LPC810_CodeBase.hex usbserial 115200 12000 을 입력하면 아래 그림과 같이 제대로 flash가 write 된다.

lpc2isp

위와 같이 프로그래밍 끝나면,  점퍼를 제거하고 리셋 버튼을 누르면 코드가 동작을 한다. 아래 그림은 LED를 깜박이는 코드를 로드….

LPC810_Board