오렌지보드 WiFi

Posted by 카이젠8501 카이젠8501
2016.11.24 17:17 IoT/Wi-Fi Module

(주)위즈네트와 (주)네패스가 콜라보레이션 해서 만든 오렌지보드 WiFi를 소개 한다. 아두이노 Uno에 WizFi250(Wi-Fi 모듈)을 연결해서 하나의 보드로 만든 보드이며, 당연히 아두이노 Uno와 완벽 호환하며  아두이노에서 Wi-Fi를 사용하기 위한 WizFi250 Library를 제공한다.


구성품은 아래와 같이 오렌지보드WiFi 1개, 확장 안테나 1개, USB 케이블 1개로 되어 있다.


오렌지 보드를 만드는 과정 중, WizFi250 Library를 구현하기 위해 조금 고생하였지만, (주)네패스를 통해 다양하고 유익한 컨텐츠들이 많이 생성되고 있어 보람을 느끼고 있다.


아래 링크들은 오렌지보드 WiFi를 학습하기 위한 학습 가이드이며 자세한 내용은 아래 링크를 참고 하기 바란다.

http://www.kocoafab.cc/product/orangewifi

 

1Wiznet라이브러리 설치와 WebClient 예제 사용하기
2WebServer 예제 사용하여 조도센서 값 웹브라우저에 출력하기
3OpenWeatherMap API를 사용하여 날씨데이터 받아오기
4OrangeBoard WiFi와 Ubidots를 연동하여 사용하기
5OrangeBoard WiFi와 Ubidots를 연동하여 사용하기2
6OrangeBoard WiFi와 Thingspeak를 연동하여 사용하기
7OrangeBoard WiFi와 Dweet.io를 연동하여 사용하기
8OrangeBoard WiFi의 AP모드 사용하기
9OrangeBoard WiFi, 조이스틱 센서 쉴드로 RC카 제어해보기


저작자 표시
신고
이 댓글을 비밀 댓글로

DIY Projects using WizFi250 or WizFi210

Posted by 카이젠8501 카이젠8501
2016.10.10 10:50 IT 개발/DIY 프로젝트

본 포스팅은 WIZnet의 Wi-Fi Module인 WizFi250과 WizFi210을 활용한 DIY 프로젝트들을 소개한다.

To Make Canon DSLR’s Remote controller using  WizFi250

본 프로젝트에서는 Canon Camera를 제어하기 위한 Wi-Fi Remote Controller를 만드는 방법에 대해 설명한다.

 해당 장치를 위해서는 아래와 같은 구성 요소가 필요하다.

  • Camera
    • Receiver와 2.5pi Audio Cable을 이용하여 연결
  • Receiver
    • Arduino Uno(MCU)+WizFi250 (Wi-Fi Module)
    • WizFi250의 AP 기능을 사용 ( 별도의 유/무선 공유기 없이 스마트폰과 다이렉트로 연결 )
  • Remote Controller
    • Smart Phone
    • Simple Android App

Wiznet Museum : http://wiznetmuseum.com/portfolio-items/to-make-canon-dslrs-remote-controller-using-wizfi250/

Author’s Blog(KOR) : http://kaizen8501.tistory.com/86

Author’s Blog(ENG) : http://www.life4iot.com/2015/01/18/to-make-canon-dslrs-remote-controller-using-wizfi250/?lang=en

 

WiFi Electric Skateboard using WIZwiki-W7500ECO + WizFi250

본 프로젝트에서는 WIZwiki-W7500ECO MCU Board와 WizFi250 Wi-Fi Module을 이용하여 전동 스케이트 보드를 만드는 방법에 대해 설명한다.

필요한 구성 요소는 아래와 같다. 해당 구성 요소에 대한 구입을 원하는 경우, 아래 구성 요소들의 이름을 클릭하여 구매 사이트로 이동하면 된다.

 

Wiznet Museum : http://wiznetmuseum.com/portfolio-items/to-make-canon-dslrs-remote-controller-using-wizfi250/

Author’s Blog(KOR) :

http://kaizen8501.tistory.com/112

http://kaizen8501.tistory.com/113

http://kaizen8501.tistory.com/114

Author’s Blog(ENG) :

- http://www.life4iot.com/2015/10/29/electric-skateboard-1-material/

http://www.life4iot.com/2015/10/29/electric-skateboard2-servo-motor-test/

http://www.life4iot.com/2015/10/29/electric-skateboard3-wi-fi-receiver-and-controller/

 

Hedgehog - Educational Robotics Controller

Hedgehog는 Robot을 이용하여 교육 및 연구를 하기 원하는 사람들을 위한 프로젝트이다. 본 프로젝트는 2015년에 KickStarter에 게시 되었지만 펀딩에는 실패 하였다. 하지만 로봇 동작 원리 및 임베디드 디바이스의 동작 원리를 쉽고 간단하게 학습 하기 좋은 프로젝트로 판단 되어 본 포스팅에서 소개 하게 되었다. 참고로 Hedgehog의 Wi-Fi 통신에는 WizFi210 Wi-Fi Module이 탑재되어 있다.

본 프로젝트의 자세한 내용은 아래 링크를 참고 하기 바란다.

Wiznet Museum : http://wiznetmuseum.com/portfolio-items/hedgehog-educational-robotics-controller-2/

KickStarter : https://www.kickstarter.com/projects/priarobotics/hedgehog-educational-robotics-controller


Drainage tank of water purifier IoT

본 프로젝트는 정수기를 사용하면서 한번 쯤 필요하다고 생각한 아이디어를 실제로 구현하고 구현 방법을 정리 하였다.
저자는 Arduino와 WizFi250(Wi-Fi Module)을 이용하여, 정수기 배수통에 물을 비워야 하는지 확인하고 배수통에 물이 일정 높이 이상 차면 등록된 E-mail로 알려주는 장치를 구현하였다.

해당 장치에 대한 자세한 설명이 필요하면 아래 링크를 참고 하기 바란다.
Wiznet Museum : http://wiznetmuseum.com/portfolio-items/drainage-tank-of-water-purifier-iot/





신고
이 댓글을 비밀 댓글로

DIY Smart Home Projects 소개

Posted by 카이젠8501 카이젠8501
2016.09.05 11:06 IT 개발/DIY 프로젝트

DIY Smart Home Projects

사물인터넷의 발전과 함께 스마트 홈 으로 주거문화가 바뀌고 있다. 최근 모 통신사의 광고와 같이 집 밖에서 냉/난방기의 온도를 조절하고 집에 있는 기기를 제어 한 다거나, 웹캠을 이용하여 집 안을 모니터링 하는 일은 이미 우리에게 낯익은 풍경이 되어 가고 있다.

이와 더불어, 인터넷 상에서는 아두이노와 라즈베리파이와 같은 오픈소스하드웨어의 영향으로 메이커(Maekr)들이 직접 설계하고 구현한 스마트 홈 프로젝트들을 공유 하고 있다.

본 포스팅에서는 메이커(Maker)들이 직접 만든 스마트 홈 프로젝트를 종류 별로 분류하고 소개 한다.

Aquarium

Arduino Fish Tank Controller

이 프로젝트는 Arduino와 Ethernet Shield를 사용해서 웹 서버를 구현하고, 구현한 웹 서버를 이용해서 물고기 밥을 주는 장치와 조명 장치를 제어 한다. 그리고 온도 센서를 이용해서 수족관 안의 온도 및 외부 온도를 모니터링 하는 장치를 구현 하였다.

Feeder

CatFeeder

본 프로젝트의 저자는 고양이 먹이를 자동으로 주기 위한 장치를 개발 하였다.

장치에는 버튼이 부착되어 있어, 이 버튼을 이용하여 고양이 먹이를 줄 수 있다. 또한 이더넷을 위한 장치를 연결하여 외부에서도 스마트 폰을 이용하여 고양이 먹이를 줄 수 있다.

Twitter Controlled Pet Feeder

본 프로젝트는 Twitter와 연동하여 애완 동물의 먹이를 Twitter Message로 제어 할 수 있는 장치를 구현 하였다. 앞에서 소개한 CatFeeder는 자체 웹 서버를 구현하여 스마트폰이 웹 브라우저를 통해 제어 하였다면 이 프로젝트는 Twitter라는 범용 SNS 툴을 이용하여 제어 할 수 있다는 점이 특징이다.

Garden

SmartGarden

본 프로젝트의 저자는 본인이 키우는 화분의 온/습도를 측정하고 물을 원격에서 줄 수 있는 시스템을 구축 하였다. 프로젝트는 Paraimpu(https://www.paraimpu.com) 라는 클라우드 서비스를 이용하였으며 Paraimpu를 통해 측정된 온도 값을 Tweeter로 보내고 Tweeter로 부터 받은 제어 신호를 가지고 자동 급수기를 On/Off 할 수 있다.

CloudCooker

본 프로젝트의 저자는 바베큐 그릴의 온도 및 음식의 온도를 측정하고 온도를 조절 할 수 있는 스마트 그릴를 만드는 것을 목표로 하였다.

이 프로젝트는 Microsoft에서 만든 Azure 클라우드 서비스의 기능을 이용하여 프론트엔드(Front-end)에서 더 다양한 형태로 데이터를 출력하고 제어 하는 기능을 제공 할 수 있다는 특징이 있다.

http://www.codeproject.com/KB/AzureIoT/882552/egg2.jpg


지금까지 메이커(Maker)들이 직접 만든 Smart Home Project들을 소개 하였다. 각 프로젝트에 있는 링크를 따라가면, 프로젝트에서 사용한 보드,클라우드 시스템 및 구축 방법이 자세히 설명되어 있고 심지어는 소스코드 까지 공유 되어 있다.

이런 자료들을 이용하여 한개 혹은 두가지 프로젝트를 튜토리얼 식으로 따라 하다 보면 필요한 기술을 쉽게 습득 할 수 있다. 더불어 습득한 기술에 아이디어를 추가하면 여러분 만의 독창적인 프로젝트를 만드는 것도 어렵지 않을 것으로 판단 한다.

저작자 표시
신고
이 댓글을 비밀 댓글로
    • 박지수
    • 2017.04.26 22:06 신고
    우와.. 진짜 멋지시네요!

Arduino Library Manger에 Library 등록하기

Posted by 카이젠8501 카이젠8501
2016.09.05 10:23 IT 개발/Arduino

Library를 Arduino Library Manager에 등록하는 방법

새로 작성한 라이브러리를 Arduino Library Manager에 등록하기 위해서는 아래 문서에 있는 조건들을 만족해야 한다.
https://github.com/arduino/Arduino/wiki/Library-Manager-FAQ

간단하게 정리하면

  • GitHub에 Library Repository 등록
  • GitHub Repository 폴더 구조는 아래과 같은 구조로 구성
    • examples : 라이브러리 예제
    • src : 라이브러리를 구성하는 전체 소스 파일 (.h, .cpp)
    • README.md : 라이브러리를 설명하는 문서
    • keywords.txt : 아두이노 IDE에서 Highlite 할 문자 표시
    • library.properties : 라이브러리 이름, 버전, 저자, 및 다운로드 url
  • 라이브러리 Tag 생성

20160801_155014

위 조건에 따라 GitHub Repository를 만든 후, https://github.com/arduino/Arduino의 Issues 탭에 GitHub Repository를 등록 해 달라는 이슈를 남기면, 관리자가 검토 후 Arduino Library Manager에 등록 한다.

20160801_155508

20160801_155519

저작자 표시
신고
이 댓글을 비밀 댓글로

WizFi250 Arduino Library

Posted by 카이젠8501 카이젠8501
2016.09.05 10:18 IT 개발/Arduino

기존 WizFi250 Arduino Library 개선 필요

이전에 있던 WizFi250 Arduino Library에 아래와 같은 문제 및 불편한 사항이 있었다.
Old Version WizFi250 Arduino Libary Download link

  1. API 함수들이 표준과 달라서, Arduino 예제들을 그대로 사용 할 수 없음
  2. 구조적으로 버퍼를 많이 사용하고 있어, Arduino Uno와 같이 RAM이 부족한 보드에서는 Memory Overflow가 발생

위와 같은 문제가 있어 WizFi250 Arduino Library를 다시 구현해야 겠다는 생각이 들었으며, 본 포스팅에서는 새로운 WizFi250 Arduino Library를 구현하는 과정과 예제 구동 방법에 대해 설명한다.

개발 환경

Arduino Library를 구현하기 위한 Eclipse 개발 환경 구축을 참고 하기 바란다.

WizFi250 Arduino Library 다운로드 링크

New Version WizFi250 Arduino Library Download link

WizFi250 Arduino Library 참고 사항

WizFi250 Arduino Library는 ESP-8266 기반의 아두이노 라이브러리를 참고 해서 개발하였다.
이미 일반적으로 많이 사용되고 있는 ESP-8266 라이브러리의 함수 포맷을 맞춰서, 이미 만들어져 있는 예제들을 그대로 사용 할 수 있도록 하는 것에 초점을 두고 개발 하였다. 그 결과 WizFi250 Arduino Library 예제에 있는 것과 같이 별도의 큰 수정 없이 MQTT, ThingPlus 및 Ubidot와 같은 클라우드 예제를 사용 할 수 있다.

WizFi250 Arduino Library 폴더 구조

파일및폴더명 내용
examples WizFi250 Library를 활용한 예제(.ino)
utility
WizFi250_spi_drv SPI 인터페이스로 WizFi250을 제어하는 드라이버 구현
WizFiRingBuffer WizFi250에서 사용하는 Ring Buffer 구현
general_parse Parsing을 위한 범용적인 함수들 구현
WizFi250 Wi-Fi 동작을 위한 기능 구현
WizFi250Client TCP Client 동작을 위한 기능 구현
WizFi250Server TCP Server 동작을 위한 기능 구현
WizFi250Udp UDP 동작을 위한 기능 구현
저작자 표시
신고
이 댓글을 비밀 댓글로

Arduino Library를 구현하기 위한 Eclipse 개발 환경 구축

Posted by 카이젠8501 카이젠8501
2016.09.05 10:02 IT 개발/Arduino

Arduino를 설치 하면 Sketch라는 별도의 IDE를 사용해서 코드를 수정, 컴파일 및 다운로드를 한다. 간단한 프로그램을 작성하거나, 사용하고 있는 라이브러리를 내부까지 확인 할 필요가 없는 경우 Sketch 프로그램만 이용해도 대부분의 Arduino의 기능을 사용 할 수 있다.

하지만 나와 같이 Arduino Library를 구현해야 하거나, Arduino Core 및 Library에서 제공하는 함수들의 내부를 확인하고 싶을 때는 Sketch 프로그램의 기능이 한 없이 부족함을 느낀다.

때문에 본 포스팅에서는 Eclipse IDE 환경에서 Arduino Library를 개발 하기 위한 환경 구축하는 방법을 설명한다.

Arduino Library를 구현하기 위한 Eclipse 개발 환경

Download Eclipse

본 포스팅에서는 Eclipse Mars 버전을 사용 하였다.

아래 주소를 이용하면 Eclipse Mars 버전을 다운로드 할 수 있다.

Eclipse IDE for C/C++ Developers

Install Arduino Plugin

Eclipse를 실행 한 후, [Help]-[Eclipse Marketplace]에서 Arduino Eclipse IDE V2를 설치 한다.

20160727_091520

정상적으로 설치가 완료되면, 아래와 같은 메뉴와 아이콘이 생성되는 것을 볼 수 있다.

20160727_092202

Install Arduino IDE

위에서 설치한 Arduino Plugin은 Arduino IDE version 1.6.5 이상을 지원하지 않는다. 때문에 최신 버전의 Arduino IDE 대신, 1.6.5 버전을 설치해야 되며 아래 주소를 이용하면 해당 버전을 다운로드 할 수 있다.

https://www.arduino.cc/en/Main/OldSoftwareReleases#previous

20160727_093141

Configure Arduino Plugin in Eclipse

Arduino IDE 설치가 완료되면, Eclipse에서 Arduino를 컴파일하기 위한 환경 설정이 필요하다. Eclipse에서는 Arduino IDE에 설치된 컴파일러와 다운로드 프로그램을 이용하여 컴파일 및 다운로드를 할 수 있으며, Arduino IDE가 설치 되어 있는 경로를 지정하는 간단한 환경 설정이 필요 하다.

[Window]-[Preferences]-[Arduino]에서 아래 표시되어 있는 정보를 설정하면 된다.

(일반적인 Arduino IDE를 설치 경로는 C:\Program Files (x86)\Arduino 이다.)

또한 개인적으로 사용하고 있는 Library가 있는 경우, 아래 Private Library path 에 설정하면 Arduino에서 지원하는 Library 이외의 개인적인 Library를 사용 할 수 있다.

20160727_093549

Create Arduino Project

새로운 Arduino Project를 생성하기 위해서는, Project Explorer에서 [New]-[Project]-[Arduino]-[New Arduino sketch]를 선택 하고 프로젝트 이름 및 간단한 옵션들을 선택 해야 한다.

20160727_092534 20160727_092606

20160727_094049 20160727_094102

20160727_094122

프로젝트가 정상적으로 만들어 지면 아래와 같은 폴더 구조를 볼 수 있으며, Test_Arduino.cpp 파일에 main 코드를 구현하면 된다.

20160727_094151

Import Library

내가 만든 새로운 라이브러리 혹은 별도의 외부 라이브러리를 사용하기 위해서는 라이브러리를 Import 해야 한다.

Import를 위한 방법은 프로젝트 이름을 선택 한 후, [마우스 우 클릭]-[Import]-[Arduino]-[Import Arduino libraries into the current project]를 선택 해서 원하는 라이브러리를 추가 한다.

20160727_095036

20160727_095149

20160727_095210

Compile and Download

코드를 작성한 후, 아래 표시된 화살표 아이콘을 누르면 컴파일과 다운로드가 동시에 된다. 다운로드가 정상적으로 완료 되면 Console 탭에서 아래와 같은 메시지를 확인 할 수 있다.

20160727_111425

Trouble Shooting

혹시, 컴파일이 안되거나 다운로드시 보드를 찾을 수 없다는 메시지가 나오면 아래와 같이 프로젝트 속성을 확인해서 컴포트 및 보드가 제대로 설정되어 있는지 확인 해야 한다.

20160727_111638

저작자 표시
신고
이 댓글을 비밀 댓글로

DIY 캐논 카메라 리모컨 및 수신기 만들기

Posted by 카이젠8501 카이젠8501
2014.11.26 19:08 IT 개발/DIY 프로젝트

DIY 캐논 카메라 리모컨 및 수신기 만들기

본 포스팅에서는 원격에서 캐논 카메라를 제어하기 위한 리모컨과 수신기를 만드는 방법을 설명한다.
리모컨은 Focus와 Shutter 기능을 지원하며 수신기와 스마트폰은는 Wi-Fi 통신을 사용한다.

시스템 구성

본 프로젝트의 구성 요소는 아래와 같다.

  • Camera

    • Receiver와 2.5pi Audio Cable을 이용하여 연결
  • Receiver

    • Arduino Uno(MCU) + WizFi250 (Wi-Fi Module)
    • WizFi250의 AP 기능을 사용 ( 별도의 유/무선 공유기 없이 스마트폰과 다이렉트로 연결 )
  • Remote Controller

    • Smart Phone ( LG G2 )
    • Simple Android App 구현

Camera + Receiver H/W 구성

캐논 카메라를 제어 할 수 있는 방법은 두가지가 있다.

  1. 2.5파이 오디오 잭을 이용하는 방법
  2. USB를 이용하는 방법

2번 방법은 캐논 카메라의 SD Card에 있는 사진을 불러 온다거나 설정 값들을 변경 할 수 있는 다양한 기능을 제어 할 수 있다.
하지만 내가 필요한 기능은 사진을 찍는 간단한 동작만 되면 되기 때문에 1번 방법을 사용하여 구현 하였다.

1번 방법은 아래 그림과 같이 오디오 잭의 모서리 금속과 마지막 금속을 접지 시키면 캐논 카메라의 Shutter가 눌려지는 동작을 하는 원리 이다.
또한 두번째 금속과 마지막 금속을 접지 하면 캐논 카메라가 포커스를 잡는다.

오디오 잭의 피복을 벗기면 빨강, 흰색, 금색 선을 볼 수 있다. ( 이 부분은 오디오 잭에 따라 다를 수 있으니 테스터기를 가지고 어느 선과 연결되어 있는지 확인 하는 것을 추천 한다.)

본 프로젝트에 사용된 오디오 잭은 빨간 석은 Shutter, 흰색 선은 Focus로 사용 할 수 있으며, 각각 Arduino Board의 D7번과 D6번에 연결 하였다.
아래는 Arduino Board와 WizFi250-EVB를 결합한 보드에 오디오 잭을 연결한 사진이다.

위와 같은 구성을 마치고 오디오 잭을 캐논 카메라에 연결하면 Camera와 Receiver의 H/W 구성은 끝이다.
(아래 사진과 같이 표시된 부분에 오디오 잭을 연결)

Receiver S/W 구성

본 프로젝트에서는 WizFi250의 AP 기능을 사용하려고 한다. WizFi250은 일반적인 유/무선 공유기에 접속하여 통신하는 Station 모드 이외에 AP 기능을 지원한다. WizFi250이 지원하는 AP 기능은 제한적이기 하지만 Device 2~3대 정도가 통신하기에는 적합하다.

아래는 Recevier S/W 구현으로 설정한 네트워크 환경을 나타내는 그림이다.

구현한 Arduino Code는 아래와 같다. 스마트폰과의 통신은 TCP를 이용하였고 프로토콜은 보는 것과 같이 아주 간단하다.
스마트폰으로 부터 ‘S’를 받으면 사진을 찍고 ‘F’를 받으면 Focus를 잡는다.

#include <Arduino.h>
#include <SPI.h>
#include <IPAddress.h>
#include "WizFi250.h"
#include "WizFi250_tcp_server.h"


#define SSID    "600D_AP"
#define KEY        "123456789"
#define AUTH    "WPA2"

#define FOCUS        6
#define SHUTTER        7
#define REMOTE_PORT    5000
#define LOCAL_PORT    5000

WizFi250    wizfi250;
IPAddress    ip(192,168,12,1);
IPAddress    subnet(255,255,255,0);
IPAddress    gateway(192,168,12,1);

void pinSetup();
void PushFocus();
void ReleaseFocus();
void PushShutter();
void ReleaseShutter();

boolean Wifi_setup = false;
WizFi250_TCP_Server myServer(LOCAL_PORT);

String str;

void setup()
{
    Serial.begin(9600);
    Serial.println("\r\nSerial Init");

    wizfi250.init();
    wizfi250.setDebugPrint(4);
    wizfi250.hw_reset();
    pinSetup();

    wizfi250.sync();

    wizfi250.setDhcp(ip,subnet,gateway);

    if( wizfi250.begin(SSID,KEY,AUTH,1) == RET_OK )
    {
        Wifi_setup = true;
    }

}

void loop()
{
    char cmd;

    if( Wifi_setup )
    {
        wizfi250.RcvPacket();

        if( myServer.isListen() != true )
        {
            myServer.listen();
        }

        if( myServer.available() )
        {
            cmd = myServer.recv();

            if( cmd == (uint8_t)'S')
            {
                ReleaseFocus();
                PushShutter();
                delay(500);
                ReleaseShutter();
            }
            else if( cmd == (uint8_t) 'F')
            {
                ReleaseShutter();
                PushFocus();
            }
            cmd = NULL;
        }
    }
}

void pinSetup()
{
    pinMode(FOCUS, OUTPUT);
    pinMode(SHUTTER, OUTPUT);

    digitalWrite(FOCUS, HIGH);
    digitalWrite(SHUTTER, HIGH);
}

void PushFocus()
{
    digitalWrite(FOCUS, LOW);
}

void ReleaseFocus()
{
    digitalWrite(FOCUS, HIGH);
}

void PushShutter()
{
    digitalWrite(SHUTTER, LOW);

}

void ReleaseShutter()
{
    digitalWrite(SHUTTER, HIGH);
}

스마트폰 S/W

스마트 폰 역시 Shutter 버튼과 Focus 버튼만 있는 아주 간단한 형태로 구현하였으며, 아래는  소스 코드 이다.

package com.example.canonremotecontrol;

import android.support.v7.app.ActionBarActivity;
import android.os.*;
import android.util.Log;
import android.view.*;
import android.widget.*;

import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.*;


public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnFocus = (Button)findViewById(R.id.focus_btn);
        btnFocus.setOnClickListener(new Button.OnClickListener(){
            public void onClick(View v){

                ConnectThread thread = new ConnectThread("192.168.12.1");
                thread.SetAction("F");
                thread.start();
            }
         });

        Button btnTake = (Button)findViewById(R.id.shutter_btn);
        btnTake.setOnClickListener(new Button.OnClickListener(){
            public void onClick(View v){
                ConnectThread thread = new ConnectThread("192.168.12.1");
                thread.SetAction("S");
                thread.start();
            }
        });
    }


    class ConnectThread extends Thread{
        String hostname;
        String m_action;

        public ConnectThread(String addr){
            hostname = addr;
        }

        public void SetAction(String action){
            m_action = action;
        }

        public void run(){
            try{
                int port = 5000;

                Socket sock = new Socket(hostname, port);
                OutputStream out = sock.getOutputStream();
                out.write(m_action.getBytes());
                out.flush();
                sock.close();
            } catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
} 








저작자 표시
신고
이 댓글을 비밀 댓글로
    • Dude
    • 2017.06.30 14:56 신고
    선풍기를 핸드폰으로 조작되게 만들려고 찾아봤는데
    이런 좋은 글이.. 참고하겠습니다

Using Arduino Serial monitor of Eclipse on Linux

Posted by 카이젠8501 카이젠8501
2014.10.20 13:13 IT 개발/Arduino


Using Arduino Serial monitor of Eclipse on Linux

요 근래 NoteBook의 OS를 windows에서 Linux로 변경 하였다. 변경 된 Linux 환경에서 Eclipse의 Arduino Plugin을 설치하고 Arduino Library 개발 작업을 진행하려고 하는데, Serial Monitor가 동작하지 않는다. 이를 해결하기 위해 구글링한 내용을 정리하여 포스팅 한다.

위 문제를 해결 하기 위해서는 eclipse.ini 파일에 아래 내용을 추가 해야 한다.

-Dgnu.io.rxtx.SerialPorts=/dev/ttyACM0:/dev/ttyACM1:/dev/ttyACM2:/dev/ttyACM3:/dev/ttyUSB0::/dev/ttyUSB1::/dev/ttyUSB2::/dev/ttyUSB3::/dev/ttyUSB4

kaizen@kaizen-SharkBay-Platform ~/eclipse $ pwd
/home/kaizen/eclipse

kaizen@kaizen-SharkBay-Platform ~/eclipse $ ls
about.html   artifacts.xml  dropins  eclipse.ini   features  notice.html  plugins
about_files  configuration  eclipse  epl-v10.html  icon.xpm  p2           readme

kaizen@kaizen-SharkBay-Platform ~/eclipse $ vi eclipse.ini

In Eclipse.ini

위 내용을 추가 한 후, Eclipse.ini 파일을 열면 아래과 같다.

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20140116-2212
-product
org.eclipse.epp.package.standard.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m
-Dgnu.io.rxtx.SerialPorts=/dev/ttyACM0:/dev/ttyACM1:/dev/ttyACM2:/dev/ttyACM3:/dev/ttyUSB0::/dev/ttyUSB1::/dev/ttyUSB2::/dev/ttyUSB3::/dev/ttyUSB4

Reference

http://www.baeyens.it/eclipse/Arduino%20eclipse%20plugin%20FAQ.html#Serialdoesntwork


저작자 표시
신고
이 댓글을 비밀 댓글로
    • 2014.11.24 16:49
    비밀댓글입니다

Arduino Sketch 버전을 1.5.x로 변경시 발생하는 컴파일 에러를 해결하는 방법

Posted by 카이젠8501 카이젠8501
2014.10.20 11:27 IT 개발/Arduino


Arduino Sketch 버전을 1.5.x로 변경시 발생하는 컴파일 에러를 해결하는 방법

아두이노 라이브러리를 작업하면서, Arduino Sketch 버전을 1.5.x로 변경하면 아래와 같은 컴파일 에러가 발생하는 경우가 있다.

error: variable ‘debugreceivingdatatable’ must be const in order to be put into read-only section by means of ‘attribute((progmem))’
error: variable ‘notistring_table’ must be const in order to be put into read-only section by means of ‘__attribute
((progmem))’
error: variable ‘at_cmd_table’ must be const in order to be put into read-only section by means of ‘__attribute
((progmem))’

위와 같은 문제가 발생하였을 때의 제 코드는 아래와 같습니다.

const char at_command_wset[]                PROGMEM = "AT+WSET=0,%s";
const char at_command_wsec[]                PROGMEM = "AT+WSEC=0,%s,%s";
const char at_command_wnet[]                PROGMEM = "AT+WNET=1";
const char at_command_wjoin[]               PROGMEM = "AT+WJOIN";
const char at_command_wstat[]               PROGMEM = "AT+WSTAT";
const char at_command_scon_tcp_client[]     PROGMEM = "AT+SCON=O,TCN,%s,%d,,%d";
const char at_command_scon_tcp_server[]     PROGMEM = "AT+SCON=O,TSN,,,%d,%d";
const char at_command_scon_udp[]            PROGMEM = "AT+SCON=O,UCN,%s,%d,%d,%d";
const char at_command_fdns[]                PROGMEM = "AT+FDNS=%s,%d";
const char at_command_fwebs_down[]          PROGMEM = "AT+FWEBS=0";
const char at_command_fwebs_up[]            PROGMEM = "AT+FWEBS=1,A";
const char at_command_smgmt[]               PROGMEM = "AT+SMGMT=%c";
const char at_command_ssend[]               PROGMEM = "AT+SSEND=%c,%s,%d,%d";
const char at_command_ssend_data[]          PROGMEM = "";
const char at_command_wleave[]              PROGMEM = "AT+WLEAVE";

PROGMEM const char *at_cmd_table[] =
{
        at_command_wset,                    // AT_WSET
        at_command_wsec,                    // AT_WSEC
        at_command_wnet,                    // AT_WNET
        at_command_wjoin,                    // AT_WJOIN
        at_command_wstat,                    // AT_WSTAT
        at_command_scon_tcp_client,        // AT_SCON_TCP_CLIENT
        at_command_scon_tcp_server,        // AT_SCON_TCP_SERVER
        at_command_scon_udp,                // AT_SCON_UDP
        at_command_fdns,                    // AT_FDNS
        at_command_fwebs_down,            // AT_FWEBS_DOWN
        at_command_fwebs_up,                // AT_FWEBS_UP
        at_command_smgmt,                // AT_SMGMT
        at_command_ssend,                    // AT_SSEND
        at_command_ssend_data,            // AT_SSEND_DATA
        at_command_wleave                // AT_WLEAVE
};

// Read Point
strcpy_P((char *)tmpstr, (char*)pgm_read_word(&(at_cmd_table[AT_WNET])));

제일 좋은 것은 호환성을 위해 PROGMEM 키워드를 사용하지 않는 것이 제일 좋겠으나, Arduino Board 중 RAM Size가 현저히 작은 것들이 있기 때문에 사용 할 수 밖에 없었습니다. 이로 인해 아래와 같은 컴파일 에러가 발생 하였고 이를 해결 하기 위해서는 아래와 같으 수정하면 된다.

PROGMEM const char *at_cmd_table[] =

to

const char * const at_cmd_table[] PROGMEM =


저작자 표시
신고
이 댓글을 비밀 댓글로

[Arduino]WizFi250 Twitter Example

Posted by 카이젠8501 카이젠8501
2014.09.23 15:30 IT 개발/DIY 프로젝트

[Arduino]WizFi250 Twitter Example

Step 1 : 구성도

Arduino에서 Reference 하는 예제는 Twitter Server에 직접 접속하는 구조가 아닌, 별도의 Proxy Server를 이용하여 Twitter Server에 접속하여 Message를 Post 한다. 참고로 본 포스팅에서 사용하는 Proxy Server는 arduino-tweet.appspot.com 이며 Post는 1분에 한번 씩 가능 하다.
Twitter Server에 직접 접속하기 위해서는 SSL Protocol 이 필요하며, 추후에 WizFi250의 SSL 기능을 이용하여 Twitter에 직접 접속하는 예제를 구현할 예정이다.
본 포스팅 예제의 구성도는 아래와 같다.

Step 2 : Get a token to post a message using OAuth

Step 3 : Hardware

  • Arduino Mega, WizFi250-EVB

Step 4 : Software

아래 예제는 https://github.com/Wiznet/Arduino_WizFi250의 Software/WizFi250/Example/WizFi250_Twitter 폴더에 있다.

#include <Arduino.h>
#include <SPI.h>
#include <IPAddress.h>
#include "WizFi250.h"
#include "WizFi250_tcp_client.h"

#define SSID    "WiznetKaizen"
#define KEY     "qazxswedc"
#define AUTH    ""

#define REMOTE_PORT 80
#define TOKEN "Your-Token"    // For Wiznet_Maker

#define LIB_DOMAIN "arduino-tweet.appspot.com"

char server[] = LIB_DOMAIN;
unsigned long lastConnectionTime = 0;
const unsigned long postingInterval = 60000;

boolean Wifi_setup = false;
boolean lastConnected = false;
boolean isFirst = true;

WizFi250        wizfi250;
WizFi250_TCP_Client myClient(server, REMOTE_PORT);

//The setup function is called once at startup of the sketch
void setup()
{
    // Add your initialization code here
    String str;
    char ssid[50],key[50];

    Serial.begin(9600);
    Serial.println("\r\nSerial Init");

    wizfi250.begin();
    wizfi250.setDebugPrint(4);
    wizfi250.hw_reset();

    wizfi250.sync();
    wizfi250.setDhcp();

    Serial.println("Input SSID");
    str = getStr();
    str.toCharArray(ssid,50);
    Serial.println("Input KEY");
    str = getStr();
    str.toCharArray(key,50);

    for(int i=0; i<10; i++)     // Try to join 30 times
    {
        if( wizfi250.join(ssid,key,AUTH) == RET_OK )
        {
            Wifi_setup = true;
            break;
        }
    }
}

void loop()
{
    if( Wifi_setup )
    {
        wizfi250.RcvPacket();

        if( myClient.available() )
        {
            char c = myClient.recv();
            if( c != NULL )
                Serial.print(c);
        }
        else
        {
            if( !myClient.getIsConnected() && lastConnected )
            {
                Serial.println();
                Serial.println("disconnecting.");
                myClient.stop();
            }


            if( isFirst || (((millis() - lastConnectionTime) > postingInterval) && (!myClient.getIsConnected())) )
            {
                Serial.println("Ready to transmit message");
                Twitter_Post( inputSerialMessage() );
                isFirst = false;
            }

            lastConnected = myClient.getIsConnected();
        }
    }
}

String inputSerialMessage()
{
    String SendingMessage="";

    Serial.print("Input Your Name :");
    SendingMessage  = "Name : ";
    SendingMessage += getStr();
    SendingMessage += "\r\n";

    Serial.print("Input Your Comment :");
    SendingMessage += "Comment : ";
    SendingMessage += getStr();
    SendingMessage += "\r\n";

    return SendingMessage;
}


String getStr()
{
    String str="";

    while(1)
    {
        if( Serial.available() )
        {
            char inChar = (char)Serial.read();
            Serial.print(inChar);

            if(inChar == '\r')   break;
            str += inChar;
        }
    }
    return str;
}


bool Twitter_Post(String thisData)
{
    uint8_t content_len[6]={0};
    String TxData;
    uint16_t length;

    Serial.println("Connecting..");
    if(myClient.connect() == RET_OK)
    {
        TxData  = "POST http://";
        TxData += LIB_DOMAIN;
        TxData += "/update HTTP/1.0\r\n";
        TxData += "Content-Length: ";

        length = thisData.length() + strlen(TOKEN) + 14;
        itoa(length, (char*)content_len, 10);

        TxData += (char*)content_len;
        TxData += "\r\n\r\n";
        TxData += "token=";
        TxData += TOKEN;
        TxData += "&status=";
        TxData += thisData;
        TxData += "\r\n";

        Serial.print(TxData);
        myClient.send((String)TxData);

        lastConnectionTime = millis();
    }
}

5 Demo

    1. 환경 설정

    Linux Terminal 설정

    • minicom 실행

    • Serial setup
    • dmesg | grep tty를 수행하면 linux 상에서 사용 중인 Serial Port를 확인 할 수 있다.



2. 실행 화면

AT+WNET=1
[OK]
Input SSID

Input KEY
qazxswedc
<Send AT Command>
AT+WLEAVE
[OK]
<Send AT Command>
AT+WSET=0,WiznetKaizen
[OK]
<Send AT Command>
AT+WSEC=0,,qazxswedc
[OK]
<Send AT Command>
AT+WJOIN
Joining : WiznetKaizen
Successfully joined : WiznetKaizen
[Link-Up Event]
  IP Addr    : 192.168.201.12
  Gateway    : 192.168.201.1
[OK]Ready to transmit message
Input Your Name : WizFi250
Comment : Hi I am WizFi250
Connecting..

<Send AT Command>
AT+FDNS=arduino-tweet.appspot.com,1000
74.125.203.141
[OK]
<Send AT Command>
AT+SCON=O,TCN,74.125.203.141,80,,0
[OK]
[CONNECT 0]POST http://arduino-tweet.appspot.com/update HTTP/1.0
Content-Length: 111

token=2815954261-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:status=Name : WizFi250
Comment : Hi I am WizFi250


<Send AT Command>
AT+SSEND=0,0.0.0.0,80,191
[0,,,191]
[OK]HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Vary: Accept-Encoding
Date: Tue, 23 Sep 2014 04:03:08 GMT
Server: Google Frontend
Alternate-Protocol: 80:quic,p=0.002

OK<Disassociate>

disconnecting.


3. Twitter 계정에서 메시지 확인






저작자 표시
신고
이 댓글을 비밀 댓글로