[nodemcu 강좌] 1. 펌웨어 컴파일하기

|

nodemcu 는 루아기반의 콘솔 개발환경으로 esp8266모듈상에서 gpio,pwm,uart,i2c,spi,wifi,tcp등을 지원합니다.(새로운 기능들이 現在도 추가 되있습니다.)


nodemcu 펌웨어 소스는 씨언어로 되어있으며 下 link에서 可用的.

https://github.com/nodemcu/nodemcu-firmware

그러나 이것을 컴파일하기위해서는 xtensa칩용 크로스컴파일러가 필요합니다.

소스를 컴파일을 위한 툴체인은 下 link에서 可用的.

https://github.com/pfalcon/esp-open-sdk


우분투14.04에서 설치하는게 가장 쉽습니다.

일단 우분투피씨가 없으면 pc를 한대 구해서 우분투를 설치합니다.

아니면 라즈베리파이도 괜찬습니다.


그리고 기본적인것들부터 설치해줍니다. (라즈베리파이에서는 unrar 대신에 unrar-free를 설치합니다.)

sudo apt-get install make unrar autoconf automake libtool gcc g++ gperf \
    flex bison texinfo gawk ncurses-dev libexpat-dev python sed

sudo apt-get install unzip

sudo apt-get install git


git허브에서 툴체인 소스를 받아옵니다.

git clone https://github.com/pfalcon/esp-open-sdk.git


툴체인 디랙토리로 이동합니다.

cd esp-open-sdk


스탠드얼론버전으로 빌드합니다.

make STANDALONE=y


툴체인이 성공적으로 빌드되면 esp-open-sdk/xtensa-lx106-elf/ 에 파일들이 생성됩니다. (라즈베리에서는 12시간정도 소요됩니다.)

내용은 다음과 같이 컴파일러 링커같은것들입니다.




이상으로 툴체인 설치되었습니다. 다음으로 이걸가지고 nodemcu를 빌드합니다..


git clone https://github.com/nodemcu/nodemcu-firmware.git


cd nodemcu-firmware


툴체인 패스를 설정해줍니다.(한번만 해주면되고 세션이 종료될때까지 유효합니다.)

PATH=$PATH:[툴체인경로]


예>

PATH=$PATH:/home/gbox3d/work/esp8266/esp-open-sdk/xtensa-lx106-elf/bin 


빌드 실행합니다.

make


아래와같이 /bin 에 빌드된바이너리가 생성됩니다.




-추가사항.2015-10-21

raspbian jessie의 경우는 libtool을 찾지못한다는 에러가 납니다. 

이럴때는 ....

apt-get install libtool-bin 을 추가로 해줍니다.


-추가사항 2015-10-28

mac osx 에서 빌드하는 방법입니다.

리눅스와 비슷합니다, 먼저 필요한 모듈을 설치합니다. 

brew 를 이용해서 설치합니다. 리눅스에서 apt-get과 비슷한 개념입니다.

http://brew.sh/index_ko.html <= 여기에 브루설치하는 방법이 있습니다.


brew tap homebrew/dupes

brew install binutils coreutils automake wget gawk libtool gperf gnu-sed --with-default-names grep

 export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"


그다음에 추가적으로 macosx해주어야할 작업이 있습니다. 리눅스파일시스템과 호환되도록 대소문자폴더를 만들어야합니다. 그리고 거기에서 컴파일해야합니다.

sudo hdiutil create ~/Documents/case-sensitive.dmg -volname "case-sensitive" -size 10g -fs "Case-sensitive HFS+"

sudo hdiutil mount ~/Documents/case-sensitive.dmg

cd /Volumes/case-sensitive


그리고 마지막으로 또한가지 xcode의 6.1 이상의 툴체인과 충돌이 생기는 문제가있습니다.

xcode의 CLI의 버전을 낮추는 방법도있지만 좋은 방법이 아닌것같습니다.


graphite.c 
graphite-blocking.c 
graphite-clast-to-gimple.c
graphite-dependences.c 
graphite-interchange.c 
graphite-optimize-isl.c 
graphite-poly.c 
graphite-scop-detection.c 
graphite-sese-to-poly.c


위파일들을 찾아서 맨위에 

#include <stddef.h> 를 추가 해주면됩니다. 


일일이 찾기가 귀찬다면 다음은 sed 를 이용해서 자동화시킨것입니다.


sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite.c 
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-blocking.c 
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-clast-to-gimple.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-dependences.c 
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-interchange.c 
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-optimize-isl.c 
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-poly.c 
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-scop-detection.c 
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-sese-to-poly.c








'esp8266' 카테고리의 다른 글

[nodemcu 강좌] 4.wifi station 모드  (0) 2015.12.13
[nodemcu 강좌] 3. gpio 다루기  (0) 2015.12.06
[nodemcu 강좌] 2. 펌웨어 프레슁하기  (0) 2015.06.08
And

firmata 프로토콜분석

|


1. pin mode


커멘트는 0xf4 입니다. 뒤로 핀번호와 핀의 모드가 차례로 옵니다.


input/output/analog/pwm/servo

     0 /         1/        2/       3/     4


13번핀을 입력모드로 세팅하는 예제입니다.

0x4f,13,0



2. digital write


명령어는 앞4비트의 값은 1001(0x9) 입니다. 뒤에 포트번호가 옵니다.(0~15)


총 16개의 포트가 존재합니다.

0~7핀 -> 0번포트

8~15 -> 1

..

120~127 -> 15번 포트


그래서 포트를 얻는 방법은 pin/8 의 몫이 포트가 됩니다. 

0번 포트는 0x90, 1번 포트는 0x91 됩니다.


포트당8개의 io가존재합니다. 두개의 바이트로 7개 1개로 나누어서 표시합니다.


아래 표처럼 5번핀은 포트0번의 io 5번 입니다.


 7

4

 0

 

 

 

 

 

 

 

 

그래서 5번핀에 HIGH를 넣어주려면 다음과 같은 코드가 됩니다.

0x90,0x20,0x00


13번핀은 1번 포트입니다. 1번포트는 최하위비트가 8이됩니다.(8번핀)


15

14 

13 

12

11 

10 

 0

 

 

 

 

 

 

 

 


HIGH넣어 주려면 다음과 같습니다.

0x91,0x20,0x00


2. digital read


포트단위로스캔여부를 지정하는 방식입니다.


 커멘드 바이트는 다음과 같이 구성됩니다.

7~4 

 3~0

 1101,(0xD)

0~15  포트번호


두번째바이트는 스캔여부를 묻는 바이트입니다. 0이면 스캔중지 1이면 스캔시작입니다.

10,13번핀을 읽고 싶다면 모두 1번포트이므로 다음과 같이 해줍니다.

0xf4,13,0

0xf4,10,0 --> 인풋모드 설정

0xD1,1 -->1번포트 스캔시작


3. analog


4. pwm


5. servo


6. 기타


0xf9 프로토콜버전 뒤에오는 두바이트가 마이너, 매이져 숫자

0xff 소프트웨어 리셋 


참고자료

http://firmata.org/wiki/Protocol#I.2FOs_Supported


https://github.com/jgautier/firmata

https://github.com/firmata/arduino

And

라즈베리파이에서 웹캠제어하기

|

먼저 기나긴 여정이 될것이므로 마음을 단단히 먹고 시작해야합니다.

일단 opencv라는것을 먼저 설치해야합니다.


http://robertcastle.com/2014/02/installing-opencv-on-a-raspberry-pi/


여기는 2.4.8로 설명되어있는데 저는 2.4.10으로 했습니다. 3.0은 잘모르겠네요.


따라서 하시면 컴파일해서 설치까지 10시간정도 걸립니다.(컴파일 시간이 대부분..)



그런 다음 

sudo ldconfig -v

해줍니다. 동적라이브러리 패스가 설정됩니다. 이단계를 안해주면 동적 라이브러리를 찾지못해서 에러가 발생합니다.

참고

http://ubuntuforums.org/showthread.php?t=2109967


추가적으로 

sudo apt-get install v4l2ucp v4l-utils libv4l-dev

설치해줍니다. 안해도 되긴합니다.


마지막으로 npm을 설치해줍니다.

sudo npm install opencv -g

sudo npm install camera -g


실제로 캠관련어플은 camera를 주로 사용해서 개발합니다. 

다음은 간단하게 스냅샷을 찍는 예제입니다.


fs = require ('fs');
camera = require ('camera');

webcam = camera.createStream(0);


webcam.on('data', function(buffer) {
fs.writeFileSync ('cam.jpg', buffer);
console.log('capture..');
//webcam.destroy();
});









And
prev | 1 | ··· | 5 | 6 | 7 | 8 | 9 | 10 | 11 | ··· | 36 | next