레고 마인드스톰 ev3 프로그래밍 (Lego Mindstorm Programming with python)

레고에 ev3dev 설치하기

레고 마인드스톰 ev3는 기본적으로 TI Sitara AM1808 프로세서를 메인프로세서로 사용하는 리눅스 컴으로 변신합니다.

결국, 와이파이 동글을 USB에 연결하고 배터리 걱정없이 작업을 하기 위해서 무한배터리 모드로 약간 변경했습니다.

그리고 레고 마인드스톰 브릭에서 와이파이를 연결합니다.

Wireless and Networks > Wi-Fi” 메뉴에서 와이파이를 찾고 연결하면 끝납니다.

 

연결이 되었다면 이제는 터미널로 ssh로 접근할 수 있습니다.

그리고 python3 가 기본적으로 설치되어 있어서 바로 사용 가능합니다.

이제 터미널에서 파일을 하나 만들고 이름을 nano ev3TouchTest.py 라는 파일을 만들고 아래와 같이 입력합니다.

import ev3dev.ev3 as ev3

ts = ev3.TouchSensor()

while True:

    ev3.Leds.set_color(ev3.Leds.LEFT,

                       (ev3.Leds.GREEN, ev3.Leds.RED)[ts.value()])

위에 프로그램은 ev3모듈을 가져오고 TouchSensor()를 참조할 수 있도록 한 후

그 값을 읽어서 왼쪽 LED의 색으로 설정해주는 프로그램입니다.

결국 터미널에서 python3 ev3TouchTest.py 를 입력해주면

스크린샷 2017-04-28 오후 7.02.05.png

터치 센서를 터치하면 LED 색이 변경됩니다.

Advertisements

레고 마인드스톰에 ev3dev 설치하고 들이대기 (Lego Mindstorm EV3)

레고 마인드스톰 EV3가 있습니다.

기본적으로 레고이지만 ev3dev를 설치하면 이 녀석은 기본적으로 리눅스 머신으로 변신합니다.

레고의 변신은 무죄!! 이히

준비물 : 레고 마인드스톰 EV3, 8G SD 카드

IMG_1729.JPG

우선, 기본적으로 SD가 필요합니다.

http://www.ev3dev.org/docs/getting-started/

원문은 위에 링크에 있습니다. 혹시 더 자세한 내용은 참고하세요.

우선, 스크린샷 2017-04-26 오후 10.07.47.png

최신 버전의 Lego Mindstorm ev3 이미지를 다운로드 합니다.

https://etcher.io/

에서  etcher 를 다운로드하여 sd에 이미지를 복사합니다.

이미지가 복사되면 sd를 EV3 Brick 에 넣고 부팅합니다.

IMG_1730.JPG

부팅이 시작되면 리눅스 부팅화면과 유사한 화면이 나타납니다.

IMG_1731.JPG

잠시 후 부팅이 완료되면 아래와 같은 화면이 나타납니다.

IMG_1732.JPG

이제 네트워크에 연결하기 위해서 bluetooth를 통해서 맥에 연결합니다.

IMG_1733.JPG

맥과 연결되고 페어링이 되면 ip를 받고 ssh로 연결할 수 있습니다.

스크린샷 2017-04-26 오후 10.25.40.png

터미널을 열고 레고의 ev3 에 ssh로 접속합니다.

계정은 기본적으로 robot / maker 를 사용합니다.

이제. 모든 준비는 끝났습니다.

간단한 프로그래밍을 해봅니다.

우선, python3가 기본적으로 설치가 되어 있음으로 python3를 실행합니다.

아래와 같이 입력해서 ev3를 사용할 수 있도록 임포트합니다.

import ev3dev.ev3 as ev3

ev3.Sound.speak(‘Hello, Welcome to Spark Labs Academy’).wait()

위와 같이 입력하면 음성으로 읽어줍니다.

이제 모든 준비와 테스트가 끝났습니다. !!

말하는 로봇, Johnny Five – 아두이노 (Arduino)로 시작하는 로봇 만들기 (led-blink)

너무 타이틀이 일단 거창합니다. 하지만 시작은…

사실, Arduino와 Robot, JavaScript 로 검색하면 나오는게 바로 Johnny-Five 입니다.

오리지널은 JavaScript Robotics Programming framework 입니다.

http://johnny-five.io/

 

궁극적으로 JavaScript와 사랑스런 Node를 사용하여 피지컬 컴퓨팅 응용 프로그램과 제품을 만드는것입니다.

역사적으로 Johnny Five는 1986년에 나온 영화 Short Circuit 이라는데서 나온 말하는 로봇의 이름입니다.

https://en.wikipedia.org/wiki/Short_Circuit_(1986_film)

 

일단 들이대 보기로 하겠습니다.

 

1단계 들이대기 : Node 설치하기

노드를 설치해야 합니다. 위에 링크에서 참조하여 설치가 안되어 있다면 설치합니다.

 

2단계 들이대기 : 아두이노 보드 준비하기

아두이노 프로그램에서 예제>Firmata>Standard Firmata 를 불러 아두이노에 올려줍니다.

 

스크린샷 2016-04-08 오후 12.05.30

 

 

그리고 바나나는 아두이노중에서 나노를 사용했습니다.

스크린샷 2016-04-08 오후 12.07.42

 

표준 Firmata를 올려주면 준비 끝입니다.

 

3단계 들이대기 :  이제 johny-five 를 위한 폴더를 하나 만들고 github에서 소스를 다운로드합니다.

콘솔에서 복사합니다.

git clone https://github.com/rwaldron/johnny-five.git

 

처음 들이대볼 소스는 eg/led-blink.js 입니다.

var five = require(“../lib/johnny-five.js”);
var board = new five.Board();

board.on(“ready”, function() {

var led = new five.Led(2);

// “blink” the led in 500ms on-off phase periods
led.blink(500);
});

 

스크린샷 2016-04-08 오후 12.34.15

최초의 기본 소스는 13번핀을 사용합니다.

여기에서는 바나나장난감 적용되어 2번핀을 사용합니다.

 

이제 실행해봅니다.

johnny-five 폴더로 이동하여 콘솔에서 아래와 같이 실행합니다.

node eg/led-blink.js 

스크린샷 2016-04-08 오후 12.37.16

가장 좋은 점은 연결된 아두이노를 찾아서 자동으로 연결해 줍니다. 샤라랄라 랄라라~~

실행영상

 

 

 

 

 

라즈베리파이 스트림 웹으로 출력하기

라즈베리파이 ssh로 연결하기

node 설치하기

onoff 모듈 활용

라즈베리파이 스트림 이해하기

 

이번엔 버튼의 값을 웹브라우져로 보내 보도록 하겠습니다.

결국 어떤 값들을 스트림 개념으로 이해하고 파이프로 연결해서 내보낼 수 있음으로 그게 웹이든 센서든 개념적으로 같습니다.

 

새로운 파일을 하나 만들고

nano stream_browser.js 라고 합니다.

 

스크린샷 2016-04-01 오전 1.44.36

var GpioStream = require(‘gpio-stream’),
http = require(‘http’),
button = GpioStream.readable(18),
led = GpioStream.writable(17);

var stream = button.pipe(led);

http.createServer(function (req, res) {
res.setHeader(‘Content-Type’, ‘text/html’);
res.write(‘<pre>logging button presses:\n’);
stream.pipe(res);
}).listen(8080);

console.log(‘starting HTTP server on http://localhost:8080&#8217;);

 

소스는 위에있고 이렇게 입력해줍니다.

결국 http 모듈을 사용하여 웹 서버를 하나 만들고 포트는 8080을 사용합니다.

버튼을 읽어 led로 보내고 다시 웹서버의 respose로 보내줍니다.

 

결국 브라우져에서 스트림이 출력됩니다.

 

스크린샷 2016-04-01 오전 1.59.14

 

크롬브라우져에서 라즈베리파이 ip로 접속합니다. 이때 포트는 소스에서 처럼 8080을 입력해줍니다.

이제 버튼을 누르면 그 결과값이 브라우져로 스트림됩니다.

 

원문 참조 :

https://learn.adafruit.com/node-embedded-development/streams

라즈베리파이 node의 강점 스트림(stream) 들이대기

라즈베리파이 ssh로 연결하기

node 설치하기

onoff 모듈 활용

 

이제, node의 강점중의 하나인 스트림 파이프을 활용해 보겠습니다.

라즈베리파이의 라즈베리언은 리눅스 계열이고 결국 유닉스 계열의 스트림 기능을 제공합니다.

 

따라서 GPIO의 값을 표준출력으로 보낼 수(파이프로 연결하듯이) 있습니다.

gpio-stream 이라는 모듈을 활용하면 17번 핀에 연결된 버튼의 결과값을 표준 출력(콘솔)로 보낼 수 있습니다.

 

테스트 하기위해서 연결을 합니다.

 

위에 그림에서 처럼 GPIO핀들중에서 5V(보라색) 과, GND(회색), 17번(검은색)은 LED에 , 18번(빨강색)은 버튼에 연결합니다.

그리고 npm install gpio-stream 를 입력하여 모듈을 설치합니다.

그리고  nano stream_stdout.js 로 새로운 파일을 하나 만들고

아래 소스를 입력합니다.

 

var GpioStream = require(‘gpio-stream’),
button = GpioStream.readable(18);

// pipe the button presses to stdout
button.pipe(process.stdout);

소스는 18번핀에 버튼을 연결하여 스트림으로 읽어들입니다.

그리고 읽어진 스트림 데이타는 프로세스의 표준 출력(즉, 콘솔)로 보내어집니다.

 

따라서 node stream_stdout.js 를 실행한 후 버튼을 누르면 아래와 같이 콘솔에 값이 써집니다.

 

스크린샷 2016-04-01 오전 12.59.41

 

이번에는 버튼을 누르면 LED가 켜지는 프로그램을 작성해 보겠습니다.

nano stream_led.js 를 입력하여 새로운 파일을 하나 만듭니다.

아래의 소스를 입력한 후 저장해줍니다.

/**
* stream button presses to a LED
*
* circuit:
* https://learn.adafruit.com/assets/21908
*
*/
var GpioStream = require(‘gpio-stream’),
button = GpioStream.readable(18),
led = GpioStream.writable(17);

// pipe the button presses to the LED
button.pipe(led);

 

소스는 18번핀에 연결된 버튼의 입력값을 스트림으로 받아서 led의 스트림으로 다시 써주는 코드입니다.

즉, 버튼이 1이면 led도 1이, 0이면 0이 파이프를 통해서 전달되는 구조입니다.

결국 , 누르면 켜지고 떨어지면 꺼지게 됩니다.

 

동작 영상

 

 

원문 참조 :

https://learn.adafruit.com/node-embedded-development/streams

 

라즈베리파이 onoff 모듈 설치하고 Blink 테스트 들이대기

라즈베리파이 node 설치하기

 

이제 node를 설치했음으로 본격적으로 프로그래밍을 만들어 봅니다.

우선, 누구도 피해갈수 없다는 Blink 입니다. ㅋㅋ

 

이번엔 C코드가 아닌 JavaScript로 작성하고 node의 onoff 모듈을 사용합니다.

우선, 편한곳에 폴더를 만들고 onoff 모듈을 설치합니다.

npm install onoff

스크린샷 2016-03-31 오후 10.11.23

 

설치가 완료되면 이제 nano test.js 를 입력하여 테스트 파일을 작성합니다.

스크린샷 2016-03-31 오후 10.36.20

C 코드는 이렇습니다.

 

 

// LED pin
int led = 13;

void setup() {
// initialize the LED pin as an output
pinMode(led, OUTPUT);
}

void loop() {
// turn the LED on
digitalWrite(led, HIGH);
// delay for one second
delay(1000);
// turn the LED off
digitalWrite(led, LOW);
// delay for one second
delay(1000);
}

 

이제 이 코드를 JavaScript 를 사용하여 node 코드로 작성합니다.

// export GPIO 17 as an output.
var GPIO = require(‘onoff’).Gpio,
led = new GPIO(17, ‘out’);

// start a timer that runs the callback
// function every second (1000 ms)
setInterval(function() {
// get the current state of the LED
var state = led.readSync();
// write the opposite of the current state to the LED pin
led.writeSync(Number(!state));
}, 1000);

 

사용하는 모듈은 onoff 모듈이고 GPIO 17번 핀을 출력으로 설정한 후

setInterval 함수를 1초마다 호출하도록 해 줍니다.

LED 상태를 토글해주면 깜빡거립니다.

 

이제 node로 만든 Blink가 잘 작동합니다.

C와 어떤것이 다를까요? C는 delay() 호출할 때 시스템을 Block(멈춤)니다.

하지만 node는 이벤트 방식으로 Block하지 않습니다.^^ 샤라랄라 랄라라…

 

그런 장점을 활용하려면 여러개를 콘트롤 해봐야 알겠죠^^

 

실행영상

실행영상

 

 

원문 참조 :

https://learn.adafruit.com/node-embedded-development/streams

라즈베리파이에 node 설치하기

라즈베리파이 맥과 키보드와 모니터 없이 연결하기

 

일단, 맥과 라즈베리파이가 연결되었다면 이제 ssh(secure shell)로 접속하여 node를 설치하도록 합니다.

보통 맥에서 사용하는것은 zoc 입니다.

아래와 같이 라즈베리파이에 접속합니다.

스크린샷 2016-03-31 오후 1.06.25

 

가장 쉬운 방법은 연결된 쉘에서 아래와 같이 실행합니다.

adafruit의 도움으로 쉽게 설치할 수 있도록 해줍니다.

 

curl -sLS https://apt.adafruit.com/add | sudo bash

 

스크린샷 2016-03-31 오후 8.04.31

이제는 sudo apt-get install node 를 입력하여 설치합니다.

이 작업은 시간이 약간 걸립니다. 역시..커피한잔의 여유를…

스크린샷 2016-03-31 오후 9.55.50

설치가 완료되면 버젼을 확인해봅니다.

잘 설치가 된것 같습니다. 아자 아자 아자…

스크린샷 2016-03-31 오후 9.58.42

라즈베리파이 맥과 키보드와 모니터 없이 연결하기

라즈베리파이를 처음 사용 할 때 조금 귀찮은게 키보드랑 모니터가 있어야 한다는 겁니다.

처음 맛보는 라즈베리파이

파이 조금 더 맛보기

위에 설명은 처음 시작하고 간단한 블링크 코드를 올려보는 내용을 정리한것입니다.

역시, 키보드랑 모니터가 있어야 한다는 겁니다. 귀찮아요~~

 

역시, 찾으면 있습니다.  별도의 키보드랑 모니터 없이 맥과 네트워크 케이블만 있으면

라즈베리파이에 파이를 설치하고 ssh 로 연결하여 사용이 가능합니다.

 

  • 맥에 SD카드를 연결합니다.
  • 디스크 유틸리티를 실행하여 FAT으로 포맷합니다.
  • 이제 콘솔에서 아래와 같이 실행합니다. #이하는 코멘트입니다. 그 전까지 입력합니다.
    • wget http://downloads.raspberrypi.org/raspbian_latest # 다운로드합니다.
    • tar -xzvf raspbian_latest # hit enter after this twice, 압축을 풀어줍니다.
    • diskutil list #디스크의 리스트를 확인합니다.
    • diskutil unmountdisk /dev/disk2 # this needs to be the correct disk to your SD Card 설치할 SD카드를 확인합니다. 궁극적으로 마운트를 해제합니다.
    • sudo dd if=2014-01-07-wheezy-raspbian.img of=/dev/disk2 bs=2m # 이미지를 써줍니다.

위에 작업은 시간이 많이 걸립니다. 30분에서 1시간도 걸리는것 같습니다.

저도 커피한자하고 놀다가 왔는데도 깜놀했지만 결국 기다리면 완료됩니다. 참아야 합니다. 인내…

 

이제 랜케이블을 연결하고 전원을 넣어주면 부팅됩니다.

부팅되면서 랜케이블에서 ip를 할당받습니다.

 

라즈베리가 연결된 ip를 찾습니다.

여러가지 방법이 있을 수 있는데 집에 ipTime이 있다면 쉽게 찾을수도 있습니다.

관리자로 들어가서 확인하면 됩니다.

 

스크린샷 2016-05-05 오후 12.23.06

ipTime 관리자 메뉴에서 내부 네트워크를 보시면 나옵니다.^^

아니면, brew install nmap 으로 nmap을 설치합니다.

그리고 nmap -sn 192.168.0.1/24 를 콘솔에서 입력하여 연결된 라즈베리를 찾아 ip를 읽습니다.

스크린샷 2016-03-31 오후 1.02.47

nmap 을 실행하여 찾을 수도 있습니다. 위에 그림처럼 실행하면 같은 ip대역에 연결된 컴퓨터들이 나오는데

이경우엔 기존의 연결된 컴들의 ip를 아는 경우 다른 하나가 라즈베리파이가 됩니다.

저의 경우엔 30번이 라즈베리와 연결된걸 확인할 수 있습니다.

 

이제 라즈베리와 ssh  쉘로 연결할 수 있습니다.

저는 zoc 를 사용합니다.

스크린샷 2016-03-31 오후 1.06.25

아이디는 pi 이고 비밀번호는 기본이 raspberry 입니다.

스크린샷 2016-03-31 오후 1.07.38

 

이제는 맥에서 연결해서 사용할 수 있습니다.

샤라랄라 랄라라~~

 

원문 참조 :

Complete Guide to Set Up Raspberry Pi Without a Keyboard and Mouse

 

 

맥에서하는 따뜬따끈한 인텔 에디슨 펌웨어 업데이트

기존의 펌웨어 업데이트 방법

기존 방법은 에디슨 보드가 정상 동작을 할때, 외장 디스크로 인식이 될 때 가능합니다.

가끔은 펌웨어 업데이트중에 네트워크 이상으로 중단되었거나 하는 등등의 문제로 가끔은 외장 디스크 인식 자체가 안될때도 있습니다.

그럴때 매뉴얼(수동)방식으로 맥에서 업데이트 하는 방법입니다.

 

우선 케이블을 둘다 연결을 한 후

맥에서는 brew를 설치합니다. 혹시 설치가 되어 있지 않다면 콘솔(터미널)에서 아래와 같이 명령합니다.

 

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

 

brew 가 설치되었으면 필요한 몇가지 프로그램을 설치합니다.

역시 터미널에서 아래와 같이 입력해 줍니다.

brew install dfu-util coreutils gnu-getopt

 

아래의 링크에서 최선  이미지를 다운로드 합니다.

https://software.intel.com/iot/hardware/edison/downloads

 

다운로드 받은 파일을 압축을 풀어줍니다.

압출이 풀린 디렉토리로 이동합니다.

 

이동 후 아래와 같이 터미널에서 입력해 줍니다.

./flashall.sh

 

자동으로 보드의 풤웨어를 업데이트합니다.

 

 

참조 :

https://software.intel.com/en-us/flashing-firmware-on-your-intel-edison-board-mac-os-x

 

 

에디슨 미니 브레이크아웃 보드 확장하기 ( Edison Mini Breakout Board)

에디슨 미니 브레이크아웃 보드 확장하여 사용하기

 

우선 여러가지 센서를 연결하기 위해서는 남땜을 하여 확장핀을 연결해야 합니다.

IMG_3754

 

그림과 같은 모습으로 볼때 위에서 세번째 J19번 라인에 남땜을 합니다.

이유는 13번(아두이노 핀번호 기준)에 해당하는 핀이 19번 라인에 있기 때문입니다.

우선, 그렇게 시작합니다.

IMG_3757

 

어쨌든, 이쁘지는 않게되었지만 납땝을 하여 확장핀을 연결할 수 있도록 했습니다.

IMG_3759

 

아래 그림처럼 J19의 3번핀이 GND 입니다.

그리고 10번 핀이 아두이노의 13번 핀에 해당합니다.

MRAA 핀번호는 37번이고

아두이노는 13번

물리적인 핀번호는 J19-10번이고

Edison 핀번호로는 40 번입니다. 헉…ㅠㅠ 복잡합니다.


IMG_3760

 

각 핀번호에 대한 참조는 여기에서

https://github.com/intel-iot-devkit/mraa/blob/master/docs/edison.md

아래 링크에서 아두이노 핀번호를 참조 할 수도 있습니다.

https://communities.intel.com/thread/60981?start=0&tstart=0

 

결론적으로 위와 같이 연결한 후

아두이노에서 Blink 소스를 올리거나

 

Intel XDK 에서  Node 기반의 JavaScript 코드를 올려서 테스트합니다.

var mraa = require(‘mraa’); //require mraa
console.log(‘MRAA Version: ‘ + mraa.getVersion()); //write the mraa version to the Intel XDK console

//var myOnboardLed = new mraa.Gpio(3, false, true); //LED hooked up to digital pin (or built in pin on Galileo Gen1)
var myOnboardLed = new mraa.Gpio(37); //LED hooked up to digital pin 13 (or built in pin on Intel Galileo Gen2 as well as Intel Edison)

// output or input
myOnboardLed.dir(mraa.DIR_OUT); //set the gpio direction to output

var ledState = true; //Boolean to hold the state of Led

periodicActivity(); //call the periodicActivity function

function periodicActivity()
{
myOnboardLed.write(ledState?1:0); //if ledState is true then write a ‘1’ (high) otherwise write a ‘0’ (low)
ledState = !ledState; //invert the ledState

setTimeout(periodicActivity,100); //call the indicated function after 1 second (1000 milliseconds)
}

 

Gpio(37)에서 처럼 mraa 의 핀번호를 입력해 줍니다.

 

실행 영상