기본 콘텐츠로 건너뛰기

ESP8266/nodemcu에서 servo사용하기

https://github.com/milikiller/nodemcu-firmware 에 보니 servo 객체가 있다.

servo를 다루는 것은 프로그램으로 pwm을 구현해도 되지만 잡음 문제도 있고 신경쓰이는 부분이 많으므로 저수준에서 구현된 것을 쓰도록 하자.

일단 firmware 를 다시 빌드하려고 보니

make
DEPEND: xtensa-lx106-elf-gcc -M -Os -Os -ffunction-sections -fno-jump-tables -g -O2 -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH -DLWIP_OPEN_SRC -DPBUF_RSV_FOR_WLAN -DEBUF_LWIP -I include -I ./ -I ../../include/ets -I ../libc -I ../platform -I ../lua -I ../wofs -I ../include -I ./ -I ../../include -I ../../include/eagle user_main.c
/bin/sh: xtensa-lx106-elf-gcc: command not found
xtensa-lx106-elf-gcc -Os -Os -ffunction-sections -fno-jump-tables -g -O2 -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals  -D__ets__ -DICACHE_FLASH -DLWIP_OPEN_SRC -DPBUF_RSV_FOR_WLAN -DEBUF_LWIP   -I include -I ./ -I ../../include/ets -I ../libc -I ../platform -I ../lua -I ../wofs -I ../include -I ./ -I ../../include -I ../../include/eagle  -o .output/eagle/debug/obj/user_main.o -c user_main.c
make[2]: xtensa-lx106-elf-gcc: No such file or directory
make[2]: *** [.output/eagle/debug/obj/user_main.o] Error 1
make[1]: *** [.subdirs] Error 2
make: *** [.subdirs] Error 2

보다시피 xtensa-lx106-elf-gcc 를 찾는다.
xtensa lx106 용 gcc toolchain이 필요한데...

https://github.com/pfalcon/esp-open-sdk 에서 설치해보도록 하자.

OS X의 경우 case-sensetive 문제로 빌드의 애로사항이 있으니 가상 디렉토리를 만들어서 mount 하자
$ 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
이런 식이다.
실제로 빌드해보니 2.67GB 정도 차지하니 무식하게 -size 10g 아니하고 -size 3g정도로 해도 무방하다.

http://www.esp8266.com/viewtopic.php?f=21&t=1432
일단 성격이 급하신 분은 여기에서 0x00000.bin, 0x10000.bin이 있는 파일을 받아서 사용하시고

빌드를 해서 쓰려면 계속 따라가보자.
OS X 한정인 얘기지만 make해보면 한참 열심히 빌드를 하다가 오류를 발생한다.
https://github.com/pfalcon/esp-open-sdk/issues/45 이런 오류인 것.
은근 이쪽은 OS X보다 Linux환경을 쓰시는 분들이 많은가보다.

잊고 있다가 최근 글을 보니
idserda commented 4 days ago
Probably not the best solution, but this makes it compile:
In esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.2/gcc, add this line somewhere at the top:
#include <stddef.h>
of the following files:
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
불완전하지만 이런 해결법을 내놓아서 esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.2/gcc 경로 아래 graphite*.c들 맨 첫줄에 #include <stddef.h> 를 죄다 추가해줬다.
저장하고 make.
어쨌든 이러면 꽤 길도 지루한 시간 동안 커다란 build 파일을 만들고 xtensa toolchain이 완성이 된다.


export PATH=/Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin:$PATH

이런 식으로 toolchain을 경로에 넣고 다시 https://github.com/milikiller/nodemcu-firmware 을 clone한 경로로 가서 make를 해준다.

별 오류가 없다면 bin/ 경로 아래에

$ ll
total 760
drwxr-xr-x   7 spectrum  staff     238 Apr 27 04:18 ./
drwxr-xr-x  19 spectrum  staff     646 Apr 21 05:04 ../
-rw-r--r--   1 spectrum  staff      79 Apr 20 05:03 .gitignore
-rw-r--r--   1 spectrum  staff   45872 Apr 27 04:18 0x00000.bin
-rw-r--r--   1 spectrum  staff  325872 Apr 27 04:18 0x10000.bin
-rw-r--r--   1 spectrum  staff    4096 Apr 20 05:03 blank.bin
-rw-r--r--   1 spectrum  staff     128 Apr 20 05:03 esp_init_data_default.bin
bin $ ls

이런 식으로 0x00000.bin과 0x10000.bin을 볼 수 있다.
준비는 끝. flash 하자. GPIO0은 GND로 연결하고 리셋 한번.

/<esptool이 있는 경로>/esptool -p /dev/tty.<esp8266이 연결된 포트> -b 230400 write_flash 0x00000 0x00000.bin 0x10000 0x10000.bin

flash가 끝나면 다시 GPIO0를 원래대로 하고 리셋.
콘솔 접속 후 servo 객체가 있는 것을 확인한다.
사용법은 간단.

setup(id, pin, servo pulse length) - Start generating servopulses on selected pin
position(id, servo pulse length) - Change servo pulse length at selected ID 
stop() - Stop timer for servo pulse generator

이게 전부.
이렇게 번거로운 과정들을 자꾸 겪다보니 어짜피 Renoise말곤 딱히 시퀀서도 안쓰고 멀티미디어도 안하는데 내가 왜 OS X를 쓰나 싶은 생각이 자꾸만 든다 -_ㅜ)
하긴 맥은 iOS 개발 셔틀이었지;;

이 블로그의 인기 게시물

meteor로 nw.js 개발하기.

실제로 nw.js 어플리케이션을 개발하다보면 UI구현하기 막막하고 수동으로 리프레쉬 하는 것도 귀찮아서 Meteor 연동을 하려고 했더니 생각보다 간단했다.

디렉토리 구조는 먼저 이렇게 잡았다.
`- app
  `-client
  `-public
`- dist
  `- 배포용 html,css,js
  `- package.json
`- package.json 아이디어는 이렇다. nw.js의 시작페이지를 http://localhost:3000으로 두고 배포시엔 meteor client 배포툴인 meteor-build-client를 사용하여 html,css,js 로 분리하는 계획이다.

가장 중요한 nw.js 용 package.json 파일은 아래와 같이 구성한다.
{
  "main": "http://localhost:3000",
  "node-remote": "http://localhost:3000",
  "name": "<앱이름>"
} 이게 전부. 어떻게 보면 Web과 nw.js를 동시에 개발할 수도 있는 환경이기도 한 것이다.
meteor create app 을 해서 meteor용 앱을 만들고 meteor 를 시작한다.
그리고, 위의 package.json이 있는 경로로 돌아가서 nw . 으로 nwjs를 실행한다.

한번 번쩍하더니 잘 된다.
cordova 등에서 index.html 대신 http://localhost:3000을 하는 것도 비슷한 느낌이다.

즐겁게 개발을 일단 마구 하고 실제로 배포하기 위해서는 개발환경이 아니라 html,css,js로 구성된 배포본을 만들어야한다.
npm install -g 해도 되지만 어짜피 Meteor에서만 쓸거
meteor npm install -g meteor-build-client 해버릴거다.

개발은 문제 없어 보이고 배포판을 한번 만들어보자. meteor app 이 있는 경로(meteor run으로 …

RxJS - ReactiveX 인터뷰

A: 왜 RxJS입니까
B: javascript는 참 쉽고 친숙한 언어죠.
A: 별로 그렇게 생각 안합니다만.
B: 그래서 좀 어렵고 있어보이는게 뭘까 싶어서...
A: 네?
B: 함수형이라는게 유행하기도 하고
f(x) 좋쟎습니까? 미스테리~ 미스테리~ 정수정짱짱 으아아

이런 수학선생님이라면 수포자 따윈 A: ...
B: 그리고 반응형이라는 말 뭔가
A: 뭔가?
B: 대충대충해도 막 알아서 할거 같고...
A: 그럴리가요?
B: 안그렇겠죠?
A: 네
B: 네

(잠시만 기다려주세요)

A: 그래도 뭔가 매력이 있으니 이렇게 시간을 내셔서 이것저것 Rx에 대해 글도 쓰고 이야기도 하고 그러시는거 아닌가요?
B: 매력이라.
으음.
제가 팔꿈치 터널 증후근이 좀 있어요.
오른손 세끼손가락, 약지손가락이 저립니다.
A: 무슨 상관이?
B: 그래서 각종 괄호를 쓰는게 너무 힘듭니다.
소중대괄호 만든 사람 죽었으면.
Hello world (ASCII): https://esolangs.org/wiki/Parenthesis_Hell
A: 이미 옛날에 돌아가셨겠죠.
B: 그렇겠네요.
아무튼 그래서 소중대괄호 의존이 적은 커피스크립트를 쓰는데요.
A: 빨리 본론을 말씀해주시죠.
B: 커피스크립트에서 가로로 80자 이상쓰면 Line exceeds maximum allowed length 라고 경고해요.
A: 그래서요?
B: 근데 Rx를 쓰면 코드를 가늘게 쓸 수가 있더라구요.
A: 호오?
B: 그리고 = 쓰는 것도 너무 힘듭니다.
A: 네?
B: 오른손을 쓰쟎아요.
A: ...
그러니까 정리하면
1. 괄호가 힘들다
2. 커피를 쓴다
3. 커피는 길게 쓰면 경고
4. Rx를 쓰면 코드가 가늘다
5. 대입문을 줄이고 싶다.
B: 네
하지만 5번은 생각보다 별로...
A:
B:

B: 아!
A: ?
B: 코드가 가늘어서 좋은 점이.
A: 네.
B: 핸드폰에서 코드를 보기 좋습니다.
A: ... 왜 팔꿈치 터널 증후근이 안 낫는지 알겠습니다.
B: 도와주세요.
쇠고기 사묵으면 나을 것 같습니…

느려터진 안드로이드 에뮬은 버리고 VM을 쓰자.

iOS개발 환경이 안드로이드보다 우월점은 여러가지가 있겠지만
개인적으로 가장 큰부분이라고 생각하는 점이 iOS Simulator 의 넘사벽 속도다.
사실 iOS 의 경우 Emulator 가 아니라 Simulator 라는 훼이크를 써서 그런건데.
하드웨어+소프트웨어를 같이 하는 회사만이 쓸 수 있는 필살기라 볼 수 있다.

반면 안드로이드의 경우 ARM 에뮬레이터를 사용하는데
이게 참 못만들었다.
플스에뮬이나 GBA에뮬 반정도만 만들어도 써줄텐데 아직 갈길이 멀다.
그래서 구시렁 거리면서 하드웨어를 연결해서 테스트를 하고 있는데
역시 USB연결하는 건 불편하고
apk 를 전송하는 과정도 그다지 빠르지 않아서 개발 생산성이 월등히 나아지지는 않는다.
루팅을 하면 wifi 를 통해 apk 를 인스톨 할 수 있다고 해서
몇 가지를 해보았으나 잘 모르겠지만 인스톨까진 잘 되었는데 디버깅 모드로 실행이 되지 않아 그만두었다. 게다가 전송속도도 USB보다 wifi가 느리고 맘에 들지 않더라.
그러던중 stackoverflow.com(늘 신세지고 있습니다) 에서

"VM으로 안드로이드를 띄워서 adb connect 하면 좋아!"
라는 글에 눈이 번쩍.

시행착오를 몇번 했지만 의외로 간단하더라.

1. VMWare건 VirtualBox건 상관없다. VM호스트를 준비하자.
2. http://www.android-x86.org/download 로 가서 Deprecated x86 2.2 generic 을 받자.

Q) 왜 Deprecated 인 2.2 generic 을 받나요. Deprecated는 쓰면 안되는 거 아님?
A) http://mariuz.android-dev.ro/vm.iso.7z 도 있다고 한다. http://www.android-x86.org/download 에 있는 요즘 것들은 죄다 안된다.

3. 죄다 일단 Default 설정에 yes yes 하고 설치한다. 한글 문서가 필요한 분은 "카카오톡 PC"로 검색하면 만족하실만한 내용이 …