아빠와 함께 하는 아두이노 2기에서는 MicroPython을 이용한 피지컬 컴퓨팅 강의를 진행하고 있습니다.  아래는 지난 주 진행한 강의 사진 및 내용 정리입니다.



제로 카운트 게임 대회

  • 직접 만든 게임으로 대회 진행.  
    • 1등은 무려 강사의 악수 3번과 함께 상품 증정
    • 2등은 악수 2번, 3등은 악수 1번!
    • 4등부터는 악수 생략 상품 증정 ㅠ.ㅠ
  • 빠르게 줄어드는 숫자를 버턴으로 정지시켜서 누가 가장 작은 숫자를 만드는가!
  • 0이 되면 아웃!

가장 낮은 숫자인 1을 만들고 기뻐하는 어린이




2족 로봇 OTTO 만들기 및 달리기 대회


로봇 만들기에 한참인 아이들



로봇 달리기 대회 준비 시작!!



조교로 활동 중이신 아드님의 블로그 정리: https://ryudo1023.blogspot.kr/2017/07/2-3.html

저작자 표시 비영리 변경 금지
신고

Posted by 류종택

우선 위성통신 모듈은 아래의 사이트에서 구매하실 수 있습니다.

http://rock7mobile.com/


저는 함께 주문해야 할 것들이 있어서, 스파크 펀에서 구매했습니다.

동영상 링크를 아래처럼 올려드립니다.  

해당 링크에 구매 링크도 있으니 참고하세요.




함께파는 시리얼 모듈이 필요한지 몰라서 그냥 가지고 있는 넘으로 해도 동작을 안하더군요.  식은 땀이 ㅡ.ㅡ;;  그래서 아두이노로 붙여보았는데 되지 않습니다 ㅠ.ㅠ 


우여곡절 끝에 구글 검색으로 아두이노에 연결할 때, on/off 선도 연결해야 하는 것을 발견해서 해결했습니다.  어떤 페이지였는지 다시 찾을 수가 없어서 사진으로 대신합니다.






  • RX핀을 아두이노의 디지털 2번 핀에
  • TX핀을 아두이노의 디지털 3번 핀에
  • OfOff핀을 아두이노의 디지털 10번 핀에
  • 5V in과 Gnd를 아두이노 5V와 Gnd 핀에

라이브러리와 예제는 아래 링크를 사용하였습니다.



예제에서 4번 라인 괄호 안의 18, 19 번을 2, 3번으로 수정하시고 사용하시면 됩니다.


이제 https://rockblock.rock7.com/ 사이트에 제품을 등록하고 라인 임대 비용과 메시지 전송 비용을 내시면 아래와 같이 세계 어디에서도 장비와 메시지를 주고 받을 수가 있습니다.  

아!!  위성과 통신이 되는 곳에서 ^^



저작자 표시 비영리 변경 금지
신고

Posted by 류종택

[사진 1]



raspberry pi zero가 구하기도 힘들고, orange pi zero가 새로 나왔다고 해서 구매를 했는데 이제서야 왔네요.


일단 제가 생각한 orange pi zero의 장점은

  • 구하기 쉽다.  (강의해야 하는데 raspberry pi zero는 항상 재고가 없다)
  • wifi 내장으로 좀 더 쉽게 인터넷을 사용 할 수 있다.


그러나, 단점으로는

  • raspberry pi zero에 비해 자료가 부족하다.
  • 설치 과정에도 문제가 발생
    • 공식 자료 다운로드 링크가 깨짐 (2016년 12월 1일 현재)
    • 바이두 링크는 살아 있지만, 느리고 회원 가입해서 프로그램 설치해야 함
    • Armbian for orange pi zero를 사용했지만, 설치 후 wifi 접속 과정에 문제가 있어 많은 시간을 허비함
      • 구글에서 검색 된 자료에는 이전 버전에 대한 내용으로 이제는 그런 과정이 필요없으며, 제대로 되지도 않습니다.
      • nmcli dev wifi connect <ssid> password <password>
    • 발열이 심하다고 합니다.  그래서 조그마한 발열판을 붙였습니다.




설치 과정 - SD 카드 준비

  • SDFormatter 를 설치하고 TF 카드를 포멧합니다.
  • 옵션에서 Format Size Adjustment를 ON으로 변경하고 포멧을 합니다.

[그림 1]

[그림 2]





설치과정 - 부팅 및 기초 설정

[그림 3]

  • 터미널을 접속하면 아이디와 암호를 묻습니다.

    • 아이디: root

    • 암호: 1234

  • 로그인이 완료되면 바로 암호를 변경하도록 합니다.  기존 암호를 넣고 새로운 암호를 두 번 입력합니다.

  • 이어서 사용자 등록을 진행합니다.  아이디와 암호를 넣고 나머지 정보를 대충 입력합니다.

  • apt-get upgrade를 해서 최신 상태로 업데이트 합니다.

    • 저의 경우에는 에러가 납니다.

    • 다른 것을 처리하다가 다시 시도해서 성공했습니다.

[그림 4]

  • GPIO를 다루기 위해서 라이브러리를 설치합니다.

  • # git clone https://github.com/zhaolei/WiringOP 을 실행합니다.

  • 이후 [그림 5]와 같이 설치를 합니다.

[그림 5]



[그림 6]

  • WiringOP 설치가 완료되면 [그림 6]과 같이 표시 됩니다.


[그림 7]

  • [그림 7]과 [그림 8]과 같이 테스트 프로그램을 작성해봅니다.


[그림 8]



[그림 9]

  • [그림 9]처럼 컴파일이 완료되면, ./blink를 실행합니다.
    • [사진 1]과 [사진 2]처럼 LED가 깜박이게 됩니다.

[사진 2]





혹시나 WiringOP 저장소가 또 사라질 지 몰라서 현재 버전을 파일로 올려둡니다.

WiringOP-h3.zip


저작자 표시 비영리 변경 금지
신고

Posted by 류종택

PHP에서 json_encode($DB) 형태로 리턴 받은 문자열이 아래와 같은 형식을 취합니다.


[ {JSON #1}, {JSON #2} ... ]

이넘을 분리해서 각각의 JSON 문자열을 TStringList에 하나씩 Add 시켜 줍니다.


소스: https://github.com/ryujt/ryulib4delphi/blob/master/XE7/JsonUtils.pas 


사용법은 간단하니까 생략 ㅡ.ㅡ;;

저작자 표시 비영리 변경 금지
신고

Posted by 류종택




오픈소스를 이용한 값싼 미아방지 장치


류도영




제작동기


이 제품을 만들게 된 이유는 동생이 낯선 사람을 잘 따르기 때문에 걱정되었기 때문이다.  더구나 예전에 이모가 기르던 고양이가 한눈 판 사이에 도망갔던 경험도 있다.



기존 제품의 문제점


부모님과 아이디어를 나누는 도중에 유사한 제품이 있다는 걸 알았다. 하지만 잘 사용되지 않는 것을 알게 되어 사람들에게 그 이유를 물어보았다. 그 결과는 다음과 같다.

  • 제품이 있는 줄 몰랐다: 3명

  • 비싸다: 8명

  • 필요 없을 것 같다: 4명

그래서 나는 누구나 쉽게 사용할 수 있는 값싼 미아 방지 제품을 만들고 싶었다. 게다가 평상시에 관심을 갖고 있던 아두이노를 응용하면 실용적인 제품을 만들 수 있다고 생각했다.



주요 부품 구성


이 제품을 만들기 위한 부품은 다음과 같다.  대량으로 만들면 더욱 가격이 싸진다.

  • 무선 송수신 모듈: 700원

  • 부저: 100원

  • 아두이노 칩: 820원 (2개 필요)

  • 기타

    • 건전지

    • 제품 박스



작품 요약 및 원리

아이에게 송신기를 부착하고 부모는 수신기를 지니고 다닌다. 아이가 일정 거리 이상 멀어지면, 신호가 약해지는 것을 감지해 알람을 울린다.  송신기에서는 일정 주파수의 전파를 발생한다. 전파는 멀어질수록 약해지므로 수신기에 신되는 전파가 일정 시간 내에 들어오지 않으면 알람을 울린다.



기대효과


값싸기 때문에 많은 사람들이 쉽게 사용할 수 있고, 사람이 많은 곳으로 나들이 갔을 때  안심할 수 있다. 애완견이나 자전거에도 활용 할 수 있다.



기타 아이디어


  • 수신기 쪽에는 알람과 함께 진동으로 알려준다.

  • 거리 제한을 사용자가 직접 제한할 수 있게 만든다.

  • 아이쪽에서도 알람이 울리도록 한다.

  • 미아 찾기 앱을 이용해 오픈 된 인터넷을 만나면 부모에게 위치를 알려준다.

  • 공공기관 등에서 미아 방지용으로 공유기를 오픈하는 것도 괜찮을 것 같다.




제작 과정 - 무선 모듈 테스트


[사진 1] 송신 모듈에서 데이터를 보내지 않을 때


[사진 2] 송신 모듈에서 데이터를 보낼 때


송신기와 수신기의 동작 원리를 알아보기 위해서 다음과 같이 실험을 했다.

  • 송신기를 부착한다

  • 송신기의 VCC는 빨간색 (+) 줄 아무 곳이나 끼운다.

  • 송신기의 GND는 파란색 (-) 줄 아무 곳이나 끼운다.

  • 수신기를 부착한다.

  • 수신기의 VCC는 빨간색 (+) 줄 아무 곳이나 끼운다.

  • 수신기의 GND는 파란색(-) 줄 아무 곳이나 끼운다.

  • 수신기의 DATA는 LED의 (+) 에 연결하다.

  • LED의 (-)는 파란색 줄 아무 곳에나 끼운다.

  • 이 상태에서 [사진 1]과 같이 LED에 불이 들어오는 지 확인한다.

  • 송신기의 DATA를 빨간색(+) 줄에 끼우면 신호가 전송된다.

  • 이때 수신기에 연결되어 있는 LED의 불이 밝아졌다가 꺼진다.  즉, 수신기가 신호를 받지 않을 때는 LED가 켜져 있고, 신호를 받고 있을 때는 LED가 꺼진다.



제작 과정 - 아두이노 연결


[사진 3] 수신기

  • 부저:  j9 (+) - j12

  • RF 433 MHz수신기

    • j20 - (-)

    • j21

    • j22

    • j23 - (+)

  • LED: a21 - (-)

  • 점퍼선

    • f21 - c21

    • b21 - a4


[사진 4] 송신기

  • 송신기

    • j20 - j11

    • j21 - (+)

    • j22 - (-)



[사진 5] 작게 만든 송신기


[사진 5]는 [사진 4]의 송신기를 작게 만든 것이다.  실제 사용은 팔찌 모양으로 만들고 싶다.




프로그램 설명 - 송신기


// 아두이노가 켜지면 한 번 실행 된다.

// 프로그램에 필요한 준비 작업을 하는 공간

void setup() {

 // 아두이노의 2번 핀을 출력 모드로 바꾼다.

 // 이제부터 아두이노 2번 핀에서는 전기를 내보 낼 수가 있다.

 pinMode(2, OUTPUT);

}


void loop() {

 // 2번 핀에 전기를 내보낸다.

 digitalWrite(2, HIGH);


 // 0.1초 동안 기다린다.

 delay(100);


 // 2번 핀의 전기를 끈다.

 digitalWrite(2, LOW);


 // 0.1초 동안 기다린다.

 delay(100);

}


이렇게하면 송신기에서 계속 신호가 나가게 된다.  나중에는 글자로 된 신호를 보내서 어떤 송신기가 신호를 보내는 지 확인 할 수 있도록 개선하려고 한다.




프로그램 설명 - 수신기


unsigned long old_tick;

unsigned long tick;


void setup() {

 // millis()는 아두이노가 켜진 이후 흐른 시간을 알려준다.

 // 현재까지의 시간을 old_tick에 넣어준다.

 old_tick = millis();

}


void loop() {

 // analogRead(0)은 아날로그 방식으로 0번 핀에서 전기를 읽어 온다.

 // 즉, 0번 핀으로 얼마나 큰 전기가 흘러 들어 오는 지 알 수 있다.

 // 0번 핀에 들어 오는 전기가 300보다 크다면, 현재까지의 시간을 old_tick에 넣어준다.

 if (analogRead(0) > 300) old_tick = millis();  


 // 현재까지의 시간을 tick에 넣어준다.

 tick = millis();


 // 1초 동안 신호가 없으면 4번 핀에 연결 된 부저로 100Hz의 알람을 울린다.

 if ((tick - old_tick) > 1000) {

   tone(4, 100);

 } else {

   noTone(4);

 }

}


부저가 울리면서 발생하는 잡음 때문에 알람이 울렸다가 끊어졌다가 반복된다.  이 부분은 사용에 문제가 없기 때문에 걱정하지 않아도 된다.


저작자 표시 비영리 변경 금지
신고

Posted by 류종택

인터넷 시간을 통해서 주기적으로 실제 시간을 업데이트해주는 시계입니다.  시간을 맞출 필요가 없이 스스로 알아서 해결합니다 ^^*


동작 사진


옆면


테스트 과정




3D 모델링 파일


부품 설치


우선 NodeMCU 보드를 400 tie 빵판 맨 위에 끼어넣습니다.  이후 부품들은 아래와 같이 연결합니다.

  • Jumper 10mm: Vcc - a1

  • Jumper  8mm: Gnd - a2

  • Jumper 10mm: j2 - Gnd

  • Jumper  8mm: j5 - Vcc

  • Jumper FM: RTC.Vcc - Vcc

  • Jumper FM: RTC.Gnd - Gnd

  • Jumper FM: RTC.CLK - a6

  • Jumper FM: RTC.DAT - a7

  • Jumper FM: RTC.RST - a8

  • Jumper FM: TM1637.Vcc - Vcc

  • Jumper FM: TM1637.Gnd - Gnd

  • Jumper FM: TM1637.CLK - a11

  • Jumper FM: TM1637.DIO - a13

RTC: Real-time Clock

TM1637: 4 digit LED tube




보드 준비 및 라이브러리 설치



소스 코드

#include 
#include 
#include 
#include 

const int MAX_CONNECT_TIME = 300;
const int QUERY_INTERVAL = 3000;

const char* ssid = "공유기 ID";
const char* password = "공유기 비번";

const char* host = "www.timeapi.org";
const int httpsPort = 80;
const String url = "/utc/now";

// TM1637 LED tube pin
const int led_clk_pin = 2;
const int led_io_pin  = 4;

// Realtime Clock pin
const int rt_ce_pin  = 14; 
const int rt_io_pin  = 12; 
const int rt_clk_pin = 13; 

TM1637Display display(led_clk_pin, led_io_pin);
DS1302 rtc(rt_ce_pin, rt_io_pin, rt_clk_pin);

void setup() {
  Serial.begin(9600);

  display.setBrightness(0x0f);

  rtc.writeProtect(false);
  rtc.halt(false);

  Serial.print("connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
}

int tick_count = 0;
bool display_dots = false;
void displayTime() 
{
  uint8_t data[] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000 };

  Time t = rtc.time();

  int hr_lo = t.hr % 10;
  int hr_hi = (t.hr - hr_lo) / 10;

  if (hr_hi < 1) data[0] = display.encodeDigit(0);
  else data[0] = display.encodeDigit(hr_hi);

  if (hr_lo < 1) data[1] = display.encodeDigit(0);
  else data[1] = display.encodeDigit(hr_lo);
  
  int min_lo = t.min % 10;
  int min_hi = (t.min - min_lo) / 10;

  if (min_hi < 1) data[2] = display.encodeDigit(0);
  else data[2] = display.encodeDigit(min_hi);

  if (min_lo < 1) data[3] = display.encodeDigit(0);
  else data[3] = display.encodeDigit(min_lo);

  tick_count++;
  if (tick_count >= 5) {
      tick_count = 0;
      display_dots = ! display_dots;
      if (display_dots) data[1] = data[1] | 0b10000000;
  }
  
  display.setSegments(data);
}

int time_out = 0;
int query_count = 9999;

void loop() {
  displayTime();
  
  time_out++;
  if (WiFi.status() != WL_CONNECTED) {
    if (time_out > MAX_CONNECT_TIME) {
      time_out = 0;
      
//      Serial.print("connecting to ");
//      Serial.println(ssid);
//      WiFi.begin(ssid, password);
    }
    
    Serial.println("WiFi is not ready.");
    delay(100);
    return;
  }

  time_out = 0;

  query_count++;
  delay(100);

  if (query_count < QUERY_INTERVAL) return;

  query_count = 0;

//  Serial.println("");
//  Serial.println("WiFi connected.");
//  Serial.println("IP address: ");
//  Serial.println(WiFi.localIP());

  WiFiClient client;
//  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed.");
    delay(1000);
    return;
  }

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: BuildFailureDetectorESP8266\r\n" +
               "Connection: close\r\n\r\n");

  // Read Header
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") break;
  }
  
  // Read Body
  if (client.connected()) {
    String line = client.readStringUntil('\n');

    // Korean local time need to add 9 hours.
    String hour = line.substring(11,13);
    String minute = line.substring(14,16);
    String second = line.substring(17,19);
    
    Time t(2016, 1, 1, (hour.toInt() + 9) % 24, minute.toInt(), second.toInt(), Time::kSunday);
    rtc.time(t);
  }
}
  • NodeMCU의 경우 함수 실행에 시간이 오래 걸리면 리부팅이 계속 진행되는 현상이 있었습니다.  그 때문에 코드가 조금 복잡해졌습니다.


저작자 표시 비영리 변경 금지
신고

'프로그래밍 > Arduino & IoT' 카테고리의 다른 글

Orange Pi Zero 사용 후기  (0) 2016.12.01
미아 방지기 만들기  (0) 2016.10.06
스스로 시간을 맞춰주는 인터넷 시계  (0) 2016.10.02
중국산 Arduino YUN shield 테스트 실패  (0) 2016.10.02
NodeMCU 프로그래밍  (0) 2016.09.23
자전거 안전등 #2  (0) 2016.09.22

Posted by 류종택

아두이노 YUN 보드가 갑자기 사라지고, 쉴드 형태의 제품만 판매하고 있습니다.  알리익스프레스에서는 아직 재고를 판매하는 것 같습니다.  


얼마 전 중국산 저렴한(?) YUN 실드를 발견하고 두 개를 사서 테스트 해보았습니다.



결과적으로 테스트에 실패하였습니다.  구글을 검색해보니 저와 유사한 경우가 많은 것으로 보입니다.  LAN 상에서 테스트하면 문제가 없다는 글도 있습니다.  


"Could not connect to YunServer 146 Connection refused"


위와 같은 에러가 나면서 REST API를 사용할 수 없고, 콘솔 테스트 등도 되지 않고 있습니다.  검색에 나오는 방법대로 REST API를 인증없이 Open 상태로 설정해도 마찬가지입니다.  (정품 YUN 보드에서는 모두 테스트가 완료되었습니다)


YUIN 실드의 방화벽 설정도 수정해보았지만 역시나 실패입니다.


정품 YUN 실드의 경우에는 아직 구매 전이라 알 수없지만, 중국산 YUN 실드의 추가적인 단점이 있습니다.

  • YUN 보드는 USB를 컴퓨터에 연결하면 바로 동작하지만, 중국산 YUN 실드는 추가 전원이 없으면 파워가 부족하여 제대로 동작하지 않습니다.

  • YUN 보드는 Network port가 안잡혀도 시리얼 포트로 업로드가 가능하지만, 중국산 YUN 실드는 시리얼로는 업로드가 되지 않습니다.


위의 제품의 자료가 부족해서 더 이상 시간을 낭비하는 것이 아까워서 테스트는 중단합니다.  한 동안 묵혀두었다가 자료가 많아지면 다시 테스트를 진행해보도록 하겠습니다.  (혹시나 테스트 성공하신 분은 저에게도 좀 ^^;)

설정 및 테스트를 위한 설명은 아래 사이트를 참고하시기 바랍니다.


저작자 표시 비영리 변경 금지
신고

Posted by 류종택

NodeMCU는 와이파이 모듈이 장착된 아두이노 보드라고 생각하면 됩니다.  아래 사진과 같이 생겼습니다. ESP8266 모듈이 붙어 있는 것이 보입니다.  인터넷 관련된 프로젝트를 구상하시면 한 번 사용해보시기 바랍니다.




아두이노 IDE를 이용해서 프로그래밍을 하기 위해서 보드를 설치해야합니다.  파일 메뉴에서 환경설정을 클릭합니다.




이후 추가적인 보드 매니저 URLs에 아래와 같은 주소를 붙여 넣습니다.

  • http://arduino.esp8266.com/stable/package_esp8266com_index.json



툴 메뉴에서 보드를 클릭하고 이어서 모드 메니저를 클릭합니다.




esp라고 검색하면 아래와 같이 ESP8266 Community에서 배포하는 보드 드라이버가 보입니다.  설치를 클릭합니다.




설치가 완료되면 보드 선택창에 NodeMCU 0.9가 보입니다.   자신의 보드와 같은 모델을 선택하시면 됩니다.  이어서 연결된 포트를 선택합니다.




기본으로 제공하는 예제를 실행하기 위해서 파일 메뉴에서 예제를 클릭하시고, ESP8266에 있는 Blink 예제를 선택합니다.




스케치(프로그램)을 업로드하면 보드에 달려있는 LED가 깜박이는 것을 확인하실 수가 있습니다.









저작자 표시 비영리 변경 금지
신고

Posted by 류종택

아드님으로부터 지난 번에 만들어 준 자전거 안정등에 대한 고객 불만이 접수되어 새로 제작하였습니다.  ATTiny85를 이용해서 반짝이도록 수정하고, LED는 1W 짜리 밝게 빛나도록 하였습니다.  자동으로 켜질 필요 없이 스위치를 달아 달라고 해서 스위치도 부착하였습니다.  충전이 자유롭도록 충전 모듈도 부착하였습니다.


대략 납땜을 마치니 아래의 사진처럼 되더군요.  회로랄 것도 없습니다.  그냥 아두이노 IDE에 있는 blink 예제에서 핀번호만 바꿔서 LED에 저항없이 직접 연결하였습니다.




납땜한 뒷 면입니다.




3D 프린팅을 마치고 밑면은 잘 들어갔으나, 윗면 측정에 문제가 있어 벗어난 수치를 다시 재고, 프린팅에 들어갔습니다.  한 번에 안되네요 ㅡ.ㅡ;;




오!!  그런데로 잘 맞습니다 ^^*




이리 오너라 옆태를 보자!





아 맞다!!  연결고리는??  분명 설계할 때는 그려놨는데 ㅡ.ㅡa  결국 고리부분만 출력해서 순간접착제로 붙였습니다.  크기가 작으면 열수축이 더 심해지나 봅니다.  위로 갈수록 좁아지는 현상 때문에 칼로 일부분을 깍아야 했습니다 ^^;




자전거에 부착한 모습입니다.  0.2초 간격으로 깜박입니다.





끝!!!



저작자 표시 비영리 변경 금지
신고

Posted by 류종택


딸이 자주 가지고 노는 플래시입니다.  그런데 이넘이 배터리를 너무 많이 먹고, 밝지도 않습니다.




원흉은 바로 이넘입니다.  효율성이라고는 눈꼽만큼도 없는 전구 ㅡ.ㅡ+




휴지에 겹겹히 싸서 깨트려 줍니다.  생각보다 잘 안부셔지네요.  남은 조각들을 일일히 제거하다 보니, 그냥 알리에서 하나 사줄껄 하는 생각이 듭니다 ㅡ.ㅡa




1W 짜리 LED 전구입니다.  보통 집에 몇 백 개씩은 굴러다니지 않나요 ㅡ.ㅡa




전극을 맞춰서 납땜해주고 난 뒤 글루건으로 마감해주었습니다.




오오오!!  밝게 빛이 납니다 @.@




끝!!  ^^;;

저작자 표시 비영리 변경 금지
신고

Posted by 류종택


티스토리 툴바