November 19, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[44호]WeMos D1 mini Pro V1.1.0 ESP8266 WiFi IoT 개발보드 출시

 

 WeMos 

WeMos D1 mini Pro V1.1.0 ESP8266 WiFi IoT 개발보드 출시

WeMos D1 mini 개발보드에 이어 WeMos D1 mini Pro V1.1.0 ESP8266 WiFi IoT 개발보드가 출시됐다. WeMos D1 mini 시리즈는 WeMos D1의 소형 버전으로 작지만 실제 사용하기에 필요한 기능을 다 갖추고 있어 인기가 많다.

많은 사람들이 보편적으로 사용하는 ESP-8266EX 기반의 제품으로 아두이노 및 nodemcu와 호환되며 microUSB 커넥터가 내장되어 펌웨어 개발 없이도 WiFi를 다룰 수 있어 사용자에게 편리하다.

아두이노와 비슷한 활용도에 작은 크기, 무선 통신(WiFi)이 내장되어 있어 최근 많은 메이커들이 각종 모바일 프로젝트에서 애용하고 있다. 특히 디바이스마트는 WeMos 공식판매 페이지에서 구매한 ‘정품’만을 판매중이며, WeMos D1 mini용 각종 sheild도 다양하게 구비하고 있다.

www.wemos.cc

상세정보

 

 

Description
 The D1 mini Pro is a mini wifi board based on ESP-8266EX. 

  • 11 digital input/output pins
  • Interrupt/pwm/I2C/one-wire
  • 1 analog input(3.2V max input)
  • 16M bytes(128M bit) Flash
  • External antenna connector
  • Built-in ceramic antenna
  • New CP2104 USB-TO-UART IC
  • Same size as D1 mini, but more light

What’s new with D1 mini Pro V1.1.0
  • 500mA resettable fuse
  • New 3dB ceramic antenna
  • Optimize antenna circuit

Tutorial
 

Technical Specs
Microcontroller ESP-8266EX
Operating Voltage 3.3V
Digital I/O Pins 11
Analog Input Pins 1(Max input: 3.2V)
Clock Speed 80MHz/160MHz
Flash 16M bytes
Length 34.2mm
Width 25.6mm
Weight 2.5g

 

Pin
Pin Function ESP-8266 Pin
TX TXD TXD
RX RXD RXD
A0 Analog input, max 3.3V input A0
D0 IO GPIO16
D1 IO, SCL GPIO5
D2 IO, SDA GPIO4
D3 IO, 10k Pull-up GPIO0
D4 IO, 10k Pull-up, BUILTIN_LED GPIO2
D5 IO, SCK GPIO14
D6 IO, MISO GPIO12
D7 IO, MOSI GPIO13
D8 IO, 10k Pull-down, SS GPIO15
G Ground GND
5V 5V -
3V3 3.3V 3.3V
RST Reset RST

 

Driver

 

D1 mini Pro VS mini V2
 D1 mini Pro  D1 mini V2
 Flash  16M bytes(128M bit)  4M bytes(32M bit)
 USB-TO-UART IC  CP2104  CH340G
 Antenna  Built-in ceramic antenna or External antenna  PCB antenna
 Weight(without pins)  2.5g  3.9g
 Thickness  3.6mm  6.7mm

 

Shipping list

1.Long female pins x 2pcs

2.Short female pins x 2pcs

3.Normal pins x 2pcs

4.WeMos D1 mini Pro x 1pcs

 

 

[정품] WeMos D1 mini Pro V1.1.0 ESP8266 WiFi IoT 개발보드 제품 구매하러 가기

 

 

 

[44호]Inside 3D Printing Conference & Expo 2017

44 hot iedp m

44 hot iedp m

세계 5대 3D프린팅 전문 행사인 인사이드 3D프린팅 엑스포(이하 ‘인사이드 3D프린팅’)이 6월 28일부터 30일까지 고양 킨텍스 Hall 6에서 개최되었다.

44 hot 3dp (1)

인사이드 3D프린팅은 뉴욕, 샌디에고, 뒤셀도르프 등 세계 주요 도시에서 개최되었으며 이번 킨텍스에서 열린 행사는 4회째다. 세계 14개국 주요 참가업체 73개사 210부스로 역대 최대 규모로 개최되었다. 인사이드 3D프린팅은 3D프린터, 3D스캐너, 프린팅 소재, 바이오/메디컬, CAD/CAM, 샌드몰드(금형), 하이브리드 조형기 등 디지털 제조 관련 기술을 중점적으로 보여주었다.

한편 국제 컨퍼런스는 ‘디지털 제조혁신의 시대를 열다’ 라는 주제를 다뤘다. 올해는 로보유니버스&VR 서밋, LED/OLED 엑스포와 동시 개최되어 더욱 기대가 높았다.

44 hot 3dp (2)

(주)더에스(대표 이민구, http://the-s.kr)가 ‘소중한 순간을 담은 당신의 리얼피규어’ 라는 슬로건으로 ‘리멘토 리얼피규어’를 선보였다. 많은 관람객들이 관심을 보이며 둘러보고 있어 발 디딜 틈이 없었다. 고객이 원하는 피규어를 사이즈별로 제작이 가능해 좋은 추억을 남길 수 있다.

사이즈는 6cm, 8cm, 13cm, 16cm, 20cm 등이 있으며 이외에도 원하는 사이즈도 가능하다. 일생에 한 번뿐인 웨딩을 추억으로 남길 수 있는 웨딩피규어도 제작이 가능하며, 대회 우승시에 활용할 수 있는 스포츠피규어, 가족 사진을 대체하는 가족피규어, 지금 모습을 남기는 애완동물피규어 등 각종 재미있는 피규어도 제작해준다. 고효율의 3D스캐너와 자체 하드웨어 및 소프트웨어로 지속적인 관리가 가능하며, 3D 리얼 피규어 제품 제작, 보정, 배송까지 한 번에 해결할 수 있어 효율적이다.

3D 스캔 단 3분으로 최종 데이터가 생성되어 자신의 전신 촬영 3차원 모델도 확인이 가능하다. 스캔 외에도 사진 파일을 통한 3D모델링을 작업할 수 있다. 리멘토 홈페이지 http://remento.kr 에서 더 자세한 정보를 확인할 수 있으며 예약도 가능하다.

44 hot 3dp (3)

(주)캐리마(대표 이병극, http://www.carima.com)는 우리나라에서 처음으로 3D프린터를 2000년대 초 독자 개발에 성공해 제품의 우수성이 뛰어나고 관련 노하우가 풍부한 기업으로 세계 7위를 기록하고 있다. 신제품 ‘TM200’는 대형 사이즈의 출력물을 짧은 시간 안에 출력할 수 있어 경쟁력이 있는 제품이다.

산업용으로 잘 맞는 프린터로 다양한 기능성 광중합수지를 지원하며, 캐스팅과 투명한 소재 등을 이용하여 정밀도가 높고 오차율이 낮아 우수성을 자랑한다. 강도가 높은 출력물도 출력이 가능해 다양한 산업 분야의 수요가 기대되는 제품이다.

44 hot 3dp (4)

44 hot 3dp (5)

3D 프린팅계에서 빼놓을 수 없는 메이커봇(영문: MakerBot) 부스에서는 테크톡을 참여하고 메이커-츄를 뽑는 이벤트, 퀴즈 이벤트 등을 개최해 관람객을 집중시켰으며, 참여하려는 사람들의 줄이 길게 늘어서 있는 듯 열기가 대단했다. 메이커봇은 100,000대 이상의 3D 프린터를 판매한 최초의 회사로써 보급의 대중화를 크게 이끈 기업 중 하나이다.

메이커봇이 선보인 REPLICATOR+는 380,000시간에 걸친 엄격한 테스트로 기존 제품에 비해 업그레이드된 성능을 자랑한다. 안정적이고 우수한 성능과 더불어 프린팅 시간도 기존 모델인 REPLICATOR에 비해 30% 빨라 시간이 크게 단축된다. 그립 표면(Grip Surface)이 장착된 Flex 빌드 플레이트를 사용하여 프린트가 잘 접착되고 제거하기도 간편하다.

Tough PLA 필라멘트 번들과 호환되어 내구성이 뛰어나고 충격 강도가 높은 프로토타입 및 고정 장치를 제작할 수 있다는 점을 특장점으로 내세운다. 글로벌 기업인만큼 내장 LCD 화면에서 영어, 스페인어, 이탈리아어, 프랑스어, 독일어, 일본어, 한국어 및 중국어 등 8개 언어를 지원해 사용자의 편의에도 초점을 맞췄다. 메이커봇 제품으로 출력한 특유의 컬러풀한 고퀄리티의 출력물들도 돋보였다.

44 hot 3dp (6)44 hot 3dp (7)

눈에 띄는 기업중 하나인 독일 기업 EOS(https://www.eos.info/en)는 적층 제조(AM) 솔루션을 바탕으로 제작한 다양한 소재의 금속 및 플라스틱 재료를 선보였다. 굉장히 복잡한 형태의 부품도 EOS 프린터 하나로 제조가 가능해 추가적인 제조 과정이 필요없다. 제품 초기 개발 단계의 기능성 시제품 제작에 이상적인 방법으로, 시장 출시까지 소요되는 시간을 획기적으로 단축하기까지 한다. EOS 기술은 우주항공산업, 의료산업, 치과재료, 툴링 등 다양한 산업 분야에 적용이 가능하다.

플라스틱 레이저 소결 기술(고품질 프로토타입, 최종 제품 및 시리즈 제품의 경제적인 생산을 위한 적층 제조 시스템)로 대표적인 제품은 FORMICA P 110, EOS P 396, EOS P 770, EOS P 880등이 있으며 DMLS 기술(직접 금속 레이저 소결 방식을 이용하여 고품질 프로토타입, 최종 제품 및 시리즈 제품의 경제적인 생산을 위한 적층 제조 시스템)의 모델은 EOS M 100, EOS M 290, EOS M 400, EOS M 400-4등이 있다.

44 hot 3dp (9)44 hot 3dp (8)

 

3D 프린터 분야의 세계적인 개발업체 XYZprinting(http://kr.xyzprinting.com)은 개인용부터 전문가용 3D프린터까지 다양한 제품 라인업으로 초보자도 쉽게 3D프린터를 접할 수 있도록 보급의 대중화에 기여했다. 이에 걸맞게 미국 CES 전시회에서 3D 프린터 기업으로는 최초로 ‘에디터스 초이스 어워드(EDITOR’S CHOICE AWARDS)’를 2014년부터 3년 연속 수상한 바 있다. 휴대용 3D 스캐너, 3D펜 등 기자도 사용이 가능할 정도로 사용이 쉽고, 무게가 70g에 불과해 휴대가 간편했다.

다양한 프린터 모델 중에서 ‘다빈치 미니 w’는 단연 ‘누구나 3D 프린팅을 쉽게 접할 수 있도록 하자’라는 목표에 걸맞는 제품이다. 269달러대의 보급형 가격대로 개인용 프린터 시장에서 꽤 합리적이여서 3D 프린터가 생각보다 비싸다는 편견을 없애준다. 베스트초이스에도 선정된 바 있어 좋은 호응을 얻었다.

이 프린터 하나로 전문가가 아닌 개인도 취미로 피규어를 만들 수 있고, 악세사리, 인테리어 DIY 등 다양하게 응용이 가능하다는 점이 매력적이다. 미처 사진에 담지는 못했지만, 주력 상품 중 하나인 ‘3D 핸드 스캐너’는 세련된 디자인으로 버튼 하나만으로도 신속하고 정확한 스캐닝 작업이 가능하다. 이미지 해상도(640 x 480 pixel 30Fps)을 자랑하며 일상생활 속의 사물, 풀컬러 인물까지 세밀하게 표현할 수 있어 실용적이다. USB 3.0 포트 연결을 통해 태블릿PC나 노트북에서도 사용 가능하다. ‘3D펜 체험교실’, ‘3D펜 디자인 콘테스트’ 등 일반인과 입문자들이 보다 쉽게 3D프린팅을 접할 수 있도록 다양한 이벤트 프로그램도 준비했다.

44 hot 3dp (10)44 hot 3dp (11)

주로 단색의 피규어 혹은 로봇, 산업용 재료 등의 출력물을 볼 수 있었던 것과는 반대로 쓰리디코리아(대표 최문수, http://3dk.or.kr/)는 우리나라의 알록달록한 전통 문양이 돋보이는 출력물을 선보여 외국 바이어의 눈을 사로잡았다. 쓰리디코리아는 소재, 필라멘트, 압출기, 컬러프린터 등 3D 프린터 융복합 핵심기술을 보유해 크라우드펀딩을 통해 1억원 투자유치를 받은 기업이다.

‘세계 최초 풀컬러 구현’ 문구의 현수막이 눈길을 끌었다. 신제품 12헤드 3D프린터는 12가지 색상의 필라멘트를 섞어 하나의 노즐로 풀컬러를 구현한다. 여러 색상 간의 간섭이 없어서 다양한 색상을 구현하고, 컬러 작업을 위한 별도의 보정작업도 필요없으며, 다른 소재도 사용 가능하다. 컬러별 배합기술로 3만가지 이상의 색상을 구현할 수 있으며 일반인도 1시간 만에 매뉴얼을 익혀서 사용할 수 있다. 쓰리디코리아 대표는 “국내 뿐만 아니라 싱가포르, 중국 등 해외 기업의 투자 및 협업 요청이 쇄도하고 있다”고 밝혔다.

올해는 25개국 약 1만 명의 국내외 500대 기업, 학계 및 연구소 등에서 방문했으며 다수의 거래선 확보, 사업 제휴 및 현장 판매가 전시회 현장에서 체결된 것으로 전해진다. 3D 프린팅에 대해 아직 회의적인 반응도 남아있고 항상 긍정적인 평가만 있었던 것만은 아니지만, 이제는 전 산업에서 응용 가능한 기술로 꼽히고 있다.

국내외 3D 프린팅 선두 기업들이 다수 참가해 트렌드를 엿볼 수 있는 좋은 기회였다. 다만 3D 프린팅 기술로 건축, 패션, 자동차 등 다양한 소재가 가능해졌는데도 불구하고 유사한 소재를 제조하는 3D 프린터들이 모여있는 것 같아 아쉬웠다. 둘러보기 전에는 아직 일반인들이 접하기에는 어렵다는 생각이 있었지만 다양한 보급형 3D 프린터, 스캐너 등을 둘러보니 머지 않은 미래에 대중화가 실현될 것이라는 예감이 든다.

 

 

 

 

[44호]wearable 신발 : 뚜벅앱

44 feature 뚜벅앱 (1)

44 feature 뚜벅앱 (1)

2017 ICT 융합 프로젝트 공모전 입선작

wearable 신발 : 뚜벅앱

글 | 고려대학교 양해찬, 원준현

심사평
칩센 Health-care와 Navigation을 융합한 작품으로 생각됩니다. 이미 상용화되어 있는 솔루션을 활용하여 새로운 제품에 적용하는 것은 가장 쉬워 보이지만, 그 틈을 찾아 활용성을 만들어내는 것이 쉬운 일이 아닌데 좋은 기획을 한 것으로 보입니다. 걸음수와 같은 health-care에 대해서는 걸음수 등에 대한 패턴 파악이 가장 중요하며, 그 부분은 알려진 알고리즘이 많긴 하지만 적절한 것을 찾아 적용하는 것이 필요합니다. 작품은 신발 바닥에 포함하는 방식을 고려하였으나, 단독 제품으로서의 활용도를 위해서는 별도 액세서리로 신발에 부착하는 방식도 고려해 볼 필요가 있을 것으로 보입니다.

뉴티씨 모든 사람들의 불편함을 해결하는 노력이 엿보였습니다.

위드로봇 GPS만으로 서비스를 할 때와 비교하여 걸음수 데이터가 얼마나 유용했는지 비교 평가한 내용이 들어가면 더욱 좋을 것 같습니다.

작품 개요
사용 대상 : 모르는 길을 찾아갈 때 휴대폰의 지도를 찾아보며 목적지를 찾아가는 사람들 및 시각 장애인
배경 : 현재 도시의 도로는 상당히 빠르게 변하고 있으며 이미 알고 있는 장소가 아니면 쉽게 찾아가기 힘들다. 그로 인해 핸드폰을 보며 찾아가는 사람들은 교통사고의 위험에 노출되어 있다.

44 feature 뚜벅앱 (2)

44 feature 뚜벅앱 (3)

그래서 우리는 위의 사람들에게 도움을 주고자 아이디어를 내었다.
예상 효과 및 활용 방안 : 일반 사람의 경우, 앞을 보고 걸을 수 있기 때문에 교통사고의 위험에서 벗어날 수 있다.

작품 설명
주요 동작 및 특징
사용자가 어플리케이션에서 몸무게, 목적지를 설정하면 네이버 지도 API를 이용하여 경로, 방향 데이터를 가져온다. 가져온 데이터를 어플리케이션에서 하드웨어의 블루투스로 전송하고 블루투스와 MCU 간 USART 통신을 이용하여 MCU로 가져온다. 하드웨어에선 그 데이터에 맞게 진동모터를 울려주고, 목적지 근처 일정 반경 안에 들어오게 되면 PWM 제어를 이용해 진동모터의 진동 세기를 증가시켜 사용자에게 목적지 주변에 왔다는 것을 인식하게 한다. 부가적인 기능으로 가속도 센서를 이용해 사용자가 목적지를 찾아가는 동안 걸은 걸음 수를 측정하고, 검출한 걸음 수로 소비한 칼로리를 계산할 수 있게 하였다.

44 feature 뚜벅앱 (4)

1. 스마트폰에서 목적지와 정보 입력
2. 네이버 지도 API를 이용하여 목적지까지의 경로를 받음.
3. 받아온 목적지까지의 경로 데이터의 좌표(네이버 표준 좌표계)를 자체 제작 API (문서 하단에 설명)을 이용해 안드로이드에서 사용하는 위경도 좌표계로 변환.
4. 스마트폰 나침반을 이용해 사용자의 현재 방향과 이동해야 할 방향 을 측정
5. 스마트폰에서 Bluetooth로, Bluetooth에서 USART통신으로 MCU로 방향, 경로 데이터 전송
6. 데이터에 맞게 진동모터를 울려준다.
7. 목적지에 도착 했을 때, 측정한 걸음 수와 소모한 칼로리를 계산
8. Bluetooth 통신으로 신발에서 스마트폰으로 걸음 수, 칼로리 데이터 전송

전체 시스템 구성
USART와 I2C 통신이 가능한 ARM CORTEX-M3 프로세서와 진동모터, 3축 가속도 센서를 이용하여 회로를 구성하였다.

44 feature 뚜벅앱 (5)

전체적인 시스템을 < 그림 2 >로 나타내었다.
어플리케이션에서 목적지와 사용자 몸무게 등, 정보를 받으면 그 정보를 서버의 데이터베이스에 저장한다. 경로와 방향 데이터를 받아오면 어플리케이션과 MCU 간 블루투스 와 USART통신으로 데이터를 받아오고 가속도 센서와 MCU 간 I2C 통신을 이용하여 가속도 센서 측정값을 받아와 저장한다.
그리고 가속도 센서 데이터를 이용하여 걸음 수를 측정하고 소모한 칼로리를 계산한다.

안드로이드 앱

44 feature 뚜벅앱 (6)

도보 길찾기 서비스를 제공하기 위해, 안드로이드 앱을 제작하였다. 앱의 주 기능으로는 칼로리 소모 측정을 위한 사용자 정보(몸무게) 입력, 네이버 지도 API를 이용한 장소 검색 및 목적지까지의 도보 경로 검색, 이동 중 사용자의 현재 위치와 방향을 이용하여 현재 위치에서 목적지의 방향 검출 및 하드웨어(신발)에 전송, 하드웨어(신발)에서 보내는 걸음 수 데이터 처리 기능이 있다.

네이버 지도 API 파싱 및 분석
장소 검색, 도보 경로 검색을 위해 네이버 지도 API를 사용하였다. 이 API는 안드로이드에서 바로 사용할 수 있도록 문서화가 되어있지 않으므로, 직접 서버에 정보를 요청하는 과정을 파싱하였다. (모바일 iOS)

1. 장소 검색요청 URL : http://api2.map.naver.com/api2/searchAllExt.nhn, Request(Get Parameter), Response(body – XML)

44 feature 뚜벅앱 (7)

2. 도보 경로 검색요청 URL : http://api2.map.naver.com/route/findWalkRoute.nhn, Request(Get Parameter), Response(body – JSON)
각각의 요청을 포맷에 맞게 안드로이드에서 작동할 수 있도록 코드를 작성 하였으며, 문서 하단 (7번) 에 일부 소스 코드를 기재하였다.

44 feature 뚜벅앱 (8)

 

사용자 정보 입력 화면
사용자로부터 몸무게를 입력받는 확인이다. 몸무게를 입력하고 “입력” 버튼을 누르면 메인 화면으로 이동한다.

44 feature 뚜벅앱 (9)

메인 화면
메인 화면으로, 현재 위치 및 신발 블루투스 연결 상태를 확인할 수 있다. “장소 검색”을 눌러 위치 검색 화면으로, “현재 위치 보기”를 눌러 현재 위치 지도를 보여주는 화면으로 이동한다.

44 feature 뚜벅앱 (10)

위치 검색 화면
(네이버 지도 API 파싱 및 분석) 란에 기재한 API를 이용하여 입력한 키워드로 검색 후, listview를 이용해 사용자에게 표시한다.
원하는 위치를 선택하면 현재 위치와 원하는 위치를 이용하여 도보 경로를 검색한 후, 경로 안내 화면으로 이동한다.

44 feature 뚜벅앱 (11)

좌표계 변환 API 시스템
받아온 목적지까지의 경로 데이터의 좌표(네이버 표준 좌표계)를 자체 제작 API 을 이용해 안드로이드에서 사용하는 위경도 좌표계로 변환한다.

44 feature 뚜벅앱 (12)

API 사용 예제
서버 주소 : https://transcoords.live2skull.net
HTTP Get, Post 요청을 통해 변환할 좌표를 입력한다.
요청 예제 Python 코드 :

44 feature 뚜벅앱 (13)

변환 결과 :

44 feature 뚜벅앱 (14)

파라메터 리스트 :

44 feature 뚜벅앱 (15)

형식 리스트 :** 형식 이름 // 형식 번호 (이 번호를 사용한다.)

44 feature 뚜벅앱 (16)

개발 환경

44 feature 뚜벅앱 (18)

하드웨어
· MCU: ARM-Cortex M3
· Tool: IAR Embedded Workbench
· Language: C/C++

소프트웨어
· Tool: Android Studio, Webstorm IDE
· Graphic: Photoshop
· Language: Node-js, MySql(server), Angular-js, bootstrap(client), Java(Android)
· Tool: Visual Studio (2015)
· Language: C# (DuraMap-Xr.dll)을 이용한 좌표계 변환 프로그램

단계별 제작 과정
하드웨어 회로 구성

44 feature 뚜벅앱 (1)

44 feature 뚜벅앱 (2)

1. ARM Cortex M3 구성
· 블루투스 모듈에 UART1을 사용하기 위해 Tx(A9), Rx(A10) 핀 이용
· 가속도 센서를 사용하기 위해 I2C1 – SCL(B6), SDA(B7) 핀 이용
· TIMER3의 Channel 1 – 4 까지 각각 (A6) (A7) (B0) (B1) 핀 이용

2. 블루투스 모듈 -HC06 (Datasheet 참조)
(1) Bluetooth Tx -> MCU Rx(A10)에 연결
(2) Bluetooth Rx -> MCU Tx(A9)에 연결

44 feature 뚜벅앱 (19)

3. 진동모터
(1) PWM 사용을 위해 MCU에 할당된 Timer 핀을 이용
(2) 각각 Timer 3의 Channel 1 (A6), Channel 2 (A7), Channel 3 (B0), Channel 4 (B1) 핀 이용

44 feature 뚜벅앱 (3)

4. 6축 자이로 가속도 센서 MPU6050
(1) MCU와의 I2C통신을 위해 MCU의 I2C1 – SCL (B6), SDA (B7) 핀 이용

44 feature 뚜벅앱 (20)

5. 부가적인 부품들 (트랜지스터, 저항 330옴, LED)

44 feature 뚜벅앱 (21)
트렌지스터 : PWM 제어에 사용
저항 : PWM 제어, LED 제어에 사용
LED : 제대로 전압이 흐르는지 확인하기 위해 사용

참고문헌
· 안드로이드 앱 프로그래밍
· ARM Cortex-M3 시스템 프로그래밍 완전정복 1, 2

부품목록

44 feature 뚜벅앱 (22)

소스코드
Java – 네이버 API 도보 경로 검색

Box Content

Java – 네이버 API 위치 검색

Box Content

Java – 좌표계 변환 API 서비스 연동

Box Content

좌표계 변환 API 서비스
C# 프로그램 – 네이버 좌표계 / UTM-K(GRS80 타원체) 간 상호변환

44 feature 뚜벅앱 (4)

C# 프로그램 – 좌표현환 DruaMap-xr.dll 초기화 및 설정

44 feature 뚜벅앱 (23)

C# 프로그램 – 좌표계 변환

44 feature 뚜벅앱 (24)

NodeJS – 좌표 변환 프로그램 실행 및 결과값 전달 모듈

44 feature 뚜벅앱 (25)

회로도

44 feature 뚜벅앱 (26)

[44호]작고 강한 코딩 학습용 컴퓨터 BBC micro:bit Essentials Kit 출시

micro:bit

작고 강한 코딩 학습용 컴퓨터

BBC micro:bit Essentials Kit 출시

꼭 필요한 구성품을 갖춘 micro:bit Essentials Kit가 출시됐다. micro:bit 보드 1PCS, USB 케이블 1PCS, AAA 배터리홀더로 구성되어 있다. 영국 BBC 방송사에서 만든 마이크로비트[micro:bit]는 학생과 교사들을 위해 프로그래밍 하는 방법을 보다 쉽게 배울 수 있도록 설계된 약 5cmX4cm의 작고 슬림한 초소형 컴퓨터이다. 영국 내 정규 수업에 micro:bit 보드를 포함시키고 초등학생들에게 무료 배포를 하는 등 코딩 조기 교육에 힘쓰고 있다.

프로세서 속도가 빠르면서도 외부 센서들도 강력하게 컨트롤해 다양한 분야에 걸쳐 쉽고 빠르게 프로젝트를 진행할 수 있다. 디지털 기기와 코딩에 흥미를 붙일 수 있도록 설계되어 있으며, 간단한 코딩만으로도 LED로 문자를 출력할 수 있다. 보드는 25개의 빨간색 LED, 프로그래밍할 수 있는 버튼 2개, 모션 센서, 지자기센서, 블루투스 모듈, 입출력 I/O 등으로 구성되어 다양한 온보드 모듈을 지원한다. 운영체제는 리눅스 기반으로 단독으로 사용하기보다는 다른 장치, 각종 센서와 연결해 아두이노, 갈릴레오, 카노, 라즈베리파이와도 호환이 되는 임베디드 SW 플랫폼으로 활용한다. 윈도우, IOS, 타블렛, 모바일이 호환되는 오픈소스 플랫폼으로 창의력을 발휘해 재미있는 게임 DIY, 로봇 공학등의 모든 분야에 쉽게 코딩해 응용할 수 있어 어린 학생이나 시작하는 메이커에게 더할 나위 없이 좋은 코딩 학습 플랫폼이다.

웹사이트(www.microbit.co.uk)의 소프트웨어를 통해 프로그래밍할 수 있으며 디바이스마트 홈페이지(www.devicemart.co.kr)에서 구매 가능하다.

[44호]참! 잘했어요!

44 feature 잘했어요 (2)

44 feature 잘했어요 (2)

2017  ICT 융합 프로젝트 공모전 입선작

참! 잘했어요! 

글 | 건국대학교 신한순, 고형규

심사평
칩센 빅데이터 활용을 위한 스마트폰용 어플리케이션이 주된 내용으로 보이고, 그것을 구현하기 위한 제품에 대한 고민은 크게 많지 않았던 듯 합니다. 음성 인식 및 수집을 위한 장치로 블루투스를 고려하였는데, 만약 블루투스 팔찌가 스마트폰과 연결되어 있는 상태라 치더라도, 사용자가 말하는 자연어가 그대로 전송될 수 있을 만큼 무선 성능이 뒷받침 되는지의 여부와, 대화에서 사용자의 어휘인지 아니면 상대의 어휘인지를 구분해야하는 방법에 대한 고민이 필요할 듯 하고, 휴대용 무선기기의 가장 큰 이슈는 배터리 이슈인데, 이 부분에 대한 고려도 필요합니다. 화자의 단어를 명확하게 인식, 전송 및 sorting이 가능하다면 활용도 면에서는 다양한 방법으로 사용이 가능할 듯 한 가능성은 보입니다.

뉴티씨 제가 생각하기에 아주 괜찮은 작품 같습니다. 전체적인 완성도와 작품성이 좋습니다. 다만, 이 기능을 어플리케이션으로만 구현해도 되지 않았을까 싶은 작품입니다.

위드로봇 일상의 음성을 녹음하여 통계적으로 분석한 수치를 제공하는 아이디어가 참신합니다. 음성 인식률이 관건인데, 이 부분에 대한 추가 연구가 필요할 것으로 보입니다.

작품개요
작품 개발동기
본 아이템은 일기장이나, 녹음기와 같이 ‘그 날 있었던 일을 쉽게 돌아보면 좋지 않을까’라는 생각으로 생각하게 되었다. 사람은 24시간 필기하며 다니지 않는 이상 당일 무슨 일이 있었는지, 대화나 회의의 내용은 어떠했는지, 어떤 실수를 했는지, 말버릇이나 습관이 어떤 지를 본인 스스로 잘 알 수 없다.
위와 같은 기억하지 못하는 상황을 해결함과 동시에 이를 분석해 여러 그래픽 통계자료로 보여준다면 유의미한 결과가 있을 것이라 생각했다. 사용자가 오늘에 있어 가장 관심이 있었던 키워드는 무엇인지, 의도적으로 피하려고 했던 키워드는 무엇인지를 녹음과 분석을 통해 알 수 있다는 것은 보다 쉽고 간편하게 사용자의 하루를 피드백 해주는 것이라 생각했다. 따라서 이러한 사용자에게 일상을 피드백 해 생활에 도움이 될 수 있도록 하는 팔찌와 어플리케이션 시스템을 만들어보고자 한다.

추진 배경
본 팀은 건국대학교 글로컬캠퍼스에 소재하고 있는 컴퓨터공학과 창업동아리 IctShare 팀의 구성원으로 이루어져 있어, 창업 아이디어 창출과 아이템 개발 경험이 많고 관련 기술을 다수 보유하고 있다. 이러한 배경 속에서 아두이노를 이용할 수 있는 숙련자들이 있음과 동시에 빅데이터를 이용한 아이디어로써 창업 아이템을 만들 수 있을 것이라 생각했다.
아두이노와 블루투스 모듈 등 시제품 제작에 필요한 물품 지원은 건국대학교 글로컬캠퍼스 컴퓨터공학과 학과사무실을 통해 지원받을 수 있도록 하고, 어플리케이션은 자체 제작할 수 있도록 한다. 1차 시제품 제작을 통해 아이디어의 효과 검증과 실현 가능성을 실험해보았고, 다음으로 사업성을 검증하기 위해 여러 실험과 설문조사를 진행하고 있다.

아이템 개요

44 feature 잘했어요 (3)

“참 잘했어요”는 일상을 요약하고 분석통계를 통해 하루를 피드백받는 팔찌와 어플리케이션 시스템이다. 팔찌를 통해 일상에서 있는 대화를 녹음하고 이 음성데이터를 스마트폰으로 송신한다. 데이터를 분석통계하여 사용자에게 보여주어 본인 피드백을 돕는 어플리케이션이다. 이를 통해 사용자는 쉽게 본인의 습관, 관심사 등을 파악할 수 있을 것이라 예상하고, 더 나아가 생활 전반의 개선을 가져다 줄 것으로 예상된다.

기대효과
이러한 효과를 이용한다면 스스로에게 어떠한 말버릇이 있는지, 실수는 하지 않았는지, 자신이 당장 필요한 것이 무엇인지 등을 확인하여 사용자들의 니즈를 충족시켜 줄 뿐만 아니라 더욱 스마트한 삶을 살 수 있을 것으로 예상된다.
본인의 하루를 피드백할 수 있게 된다. 오늘 자신이 말한 말들을 알 수 있고, 그것을 쉽고 간편한 통계로서 접하게 된다면 일기를 쓰는 것과 같은 효과를 얻을 수 있다고 생각된다. 이를 통해 사용자는 스스로 하루을 피드백을 할 수 있고 실수 혹은 본인이 인지하지 못했던 주제 등을 파악할 수 있다.
위와 마찬가지로 관심사, 습관 등을 파악할 수도 있다. 주간, 월간 통계를 통해서 과거를 쉽게 정리해서 본다는 것은 그를 통해서 앞으로의 일을 예측할 수도 있게 된다. 이에 따라 사용자는 본인의 진로에 대한 흥미로운 자료들을 쉽게 찾을 수 있게 된다.

작품 설명
주요동작 및 특징
본 아이템은 사용자가 했던 말을 팔찌를 통해 기능은 녹음과 블루투스 송수신을 하고, 스마트폰에 전송시켜 사용자에게 특정 단어를 얼마나 말했는지, 특정 시간에 있었던 내용은 주로 어떠한 내용이었는지를 알게 해주는 시스템이다.

이는 크게 일간, 주간 통계로 나뉘며 일간 통계의 경우 워드 클라우드와 선 그래프로 보이며 워드 클라우드는 가장 많이 말했던 단어와 크기를 비례해 한 눈에 볼 수 있다. 선 그래프의 경우 시간 단위로 끊어 언제 어떠한 단어를 몇 번 사용하였는지 사용자에게 알려주게 된다. 또한 특정 단어와 같이 말했던 단어들도 볼 수 있다.

주간 통계의 경우 꺾은선 그래프로만 이루어져 있으며 하루 단위로 나누어 사용자에게 어떠한 단어를 얼마나 사용하였는지 알려주게 된다. 이를 이용하여 사용자는 자신의 성향에 대해 알 수 있으며, 당일 있었던 내용을 상기시켜 다시 이해할 수 있고 자신의 악습관을 스스로 피드백 할 수 있는 기회가 생긴다.

팔찌와 연동되는 스마트폰 어플리케이션은 팔찌와 블루투스 연결이 되어있는 동안 수신받는 단어들을 저장하며, 시간, 일간으로 나누어 같은 단어의 개수가 추가될 때마다 카운터를 한 개씩 올리며 통계를 낸 뒤 워드 클라우드와 그래프로 사용자에게 보여주게 된다.

또한 사용자가 특정 단어를 왜 사용하였는지 모르는 경우에 특정 단어를 기준으로 5초 동안의 정보를 단어에 저장하여, 소비자는 왜 그 단어를 사용하였는지 기억할 수 있고 해당 내용에 대해 이해하기가 매우 수월해질 수 있다.

그래프 화면에서 특정 단어를 클릭하게 되면 특정 단어를 당일 얼마나 사용했는지, 주간동안 얼마나 사용하였는지, 월간동안 얼마나 사용하였는지 숫자를 이용한 수치로 사용자에게 보이게 된다. 또한 특정 단어의 화면에서 같이 사용됐던 단어들을 나오게 하여 왜 그러한 단어를 사용하였는지 사용자가 알아차릴 수 있게 도와준다.

하드웨어 개요
본 아이템의 팔찌는 기존의 스마트 워치와 비슷한 소재를 사용하여 주 소재는 스테인리스를 사용해 제작할 예정이다. 이를 통해 최대한 사용자에게 거부감 없는, 가벼운 소재의 제품을 제공할 계획이다.
팔찌에는 스마트폰과 통신할 수 있는 5V 블루투스 모듈과, 사용자의 목소리를 수신할 수 있는 마이크가 삽입되어 있다. 팔찌는 수은전지로 전원을 넣게 되며, 블루투스의 전원 버튼을 누르고 스마트폰의 블루투스 모드를 ON하게 되면 팔찌 내의 블루투스와 스마트폰이 페어링을 하게 됨으로써 스마트폰과 블루투스가 통신을 할 수 있게 된다.

소프트웨어 개요

44 feature 잘했어요 (4)

본 아이템은 음성데이터를 분석통계하는 어플리케이션이다. 팔찌로부터 음성을 읽어들여 단어를 저장하고 사용자가 사용했던 단어들을 확인하며 스스로 관리할 수 있도록 한다. 팔찌로부터 단어가 수신될 때마다 모든 단어들을 저장하며 그래프로 통계를 내어 사용자에게 보여주고 단어를 사용한 횟수 또한 사용자에게 보여지게 된다.

44 feature 잘했어요 (5)

본 어플리케이션의 첫 화면인 일간통계 화면에서의 워드 클라우드는 정해놓은 여러 가지의 색을 기준으로 특정 단어의 카운터 수와 크기가 비례하도록 프로그래밍 하여 사용자에게 핵심단어를 시각화 하고 대화의 키워드, 개념을 직관적으로 파악할 수 있도록 한다.

워드 클라우드는 사용자가 특정한 단어를 말할 때 마다 항상 어플리케이션에 업데이트가 되며 각각의 단어의 크기와 색이 변하게 된다. 그래프의 경우 특정 단어에 대해 시간과 횟수를 기준으로 사용자에게 보여지게 된다.

통계는 일간, 주간, 월간을 기준으로 나눠놓았으며 각각 24시간, 한 주, 한 달을 지정해놓아 저장되어 있는 데이터를 불러오는 방식이다.
일간통계 화면에서 좌측으로 드래그를 하게 되면 주간통계 화면으로 넘어가게 된다. 주간통계 화면 부분에는 워드 클라우드가 없으며 그래프로 한 주간 사용했던 데이터들을 모아 사용자가 한눈에 볼 수 있도록 해준다.

일간, 주간통계 그래프에서 특정 단어를 클릭할 때 특정 단어에 대한 정보가 나오게 된다. 해당 화면 하단에는 특정 단어와 5초 간격으로 사용된 단어들을 표시해 준다. 이 단어들로 하여금 사용자는 자신이 사용했던 단어들을 쉽게 이해할 수 있으며 특정 시간에 왜 이러한 단어를 사용하였는지 기억을 되새길 수 있다.

하지만 아직까지 음성데이터의 인식률 문제가 있어, 한국어 음성인식 같은 경우는 비슷할 뿐 존재하지 않는 단어를 출력하여 사용자에게 보여주게 된다.
본 아이템의 어플리케이션은 음성인식의 신뢰성을 높이기 위해 어플리케이션 내에 한글단어 데이터베이스를 추가하고, 이를 이용한 ‘오인식 글자 수정 시스템’을 도입할 예정이다.

음성인식에 대한 신뢰성이 높지 않은 시스템들과 비교하자면, 본 아이템은 틀린 단어와 철자를 비교해 비슷한 철자의 단어를 사용자에게 보여주어 일치하는지 아닌지 판단하게끔 한다.

예를 들어, ‘마우스’라는 단어가 수신하고자 할 경우 컴퓨터는 ‘미우스’, ‘마오스’ 등 잘못된 수신을 할 수 있다. 하지만 한글단어 데이터베이스를 사용하여 특정 단어와 잘못 수신된 단어의 철자가 비슷한지의 여부를 확인하고 비슷할 경우 사용자에게 ‘미우스’라는 단어가 ‘마우스’가 맞는지에 대한 판단를 물어보게 된다. 사용자에게 주어진 선택지를 이용하여 해당 단어가 맞다고 판단할 경우 ‘미우스’라고 수신되는 단어는 항상 ‘마우스’ 주소로 가게 된다.

하지만 ‘미우스’라는 단어가 ‘마우스’가 아니라고 사용자가 판단할 경우 ‘미우스’라는 단어는 더 이상 ‘마우스’가 아닌 것을 데이터베이스에 저장하여 음성인식의 신뢰도를 더욱 높일 수 있다.

이러한 오인식 글자 수정 시스템은 특정 단어화면에서 뿐만 아니라 상태 바에 알림으로도 나오며 바탕화면 위젯을 이용하여 사용자에게 인식 판단 여부를 물어볼 수 있다. 사용자에게 많은 참여를 이끌고 이를 데이터화한다면 음성 인식률을 더욱 향상시킬 수 있을 것으로 예상된다.

한글 단어 데이터베이스를 활용하여 단어를 분류한 뒤 사용자에게 분류한 통계자료를 보여줄 수 있다.
예를 들어 ‘설거지’라는 단어가 수신되어 어플리케이션에 등록이 될 경우 ‘설거지’ 라는 단어의 분류는 사전에서 ‘가정, 생활’분류에 포함되기 때문에 사용자는 어떠한 분류에 관심이 많은지, 어떠한 분류에 관심이 없는지 스스로가 보며 자기 자신을 피드백 할 수 있다.

본 아이템의 어플리케이션에서 제공되는 단어 사용 횟수, 어플리케이션에서 제공하는 단어의 정보에 대한 분류 후 특정 단어에 대한 정보, 특정 시간에서의 단어 사용을 사용자가 알고 이를 통하여 사용자는 자기 자신에 대해 알아가며 자신의 성향은 어떠한지 자신의 진로는 어떠한지에 대해 스스로를 피드백 할 수 있다.

개발 환경(개발 언어, Tool, 사용 시스템 등)
어플리케이션 개발에 있어서 오픈소스와 안드로이드 SDK, 앱 인벤터를 주요 툴로 사용하였고, 개발 환경으로는 리눅스 환경, Python, Java 등을 주로 이용하였다.

단계별 제작과정
하드웨어 제작과정
본 아이디어에 대해 실현가능성을 검토하기 위해서 본 팀은 아두이노와 아두이노 블루투스 모듈, 간이 녹음기를 통해 실험을 했으며 결과, 그 데이터가 스마트폰으로 정상 수신되는 것을 확인할 수 있었다.

그 후 1차 시제품을 만드는 데에 성공했다. 1차 시제품의 구성은 고무밴드에 아두이노 기반 블루투스 마이크 모듈을 설치하고 모듈에 전원을 넣을 수 있는 5V 수은전지 공간을 추가하여 제작했으며, 이 시제품으로 기능 작동 실험에 성공했다.

1차 시제품 이후에는 가벼운 스테인리스 소재나 플라스틱 등 기존 스마트워치 디자인 중 하나를 택해 팔찌를 제작할 예정이다. 2차 시제품은 사용자는 휴대하기 편리하고 신체에 무리가 가지 않으며 사용하기도 간편한 재료로 제작을 진행할 예정이다.

소프트웨어 제작과정
본 아이템은 안드로이드 SDK 오픈소스를 기반하여 제작하였다. 팔찌는 블루투스를 이용하여 스마트폰과 통신을 한다.

어플리케이션에는 한글단어 데이터베이스를 입력하여 수신된 단어와 비교한다. 예를 들어, 팔찌에 ‘친구야’라는 단어가 수신될 경우 스마트폰과 블루투스로 통신하여 어플리케이션은 ‘친구야’라는 단어를 수신 받는다. 어플리케이션은 내장되어있는 한글단어 데이터베이스와 비교하여 어플리케이션에게 존재하는 단어인지 검증한다. 위 검증 과정에서 수신받은 단어가 존재하는 단어가 아니라고 판단될 경우 수신받은 단어와 자음이나 모음이 비슷한 단어가 있는지 검증하게 된다. 아니라고 할 경우 단어를 수신받기 전으로 돌아가 단어를 수신 받을 때까지 대기상태가 된다. 대기상태에서 단어를 수신 받을 경우 이 과정을 다시 거치게 된다.

수신받은 단어와 검증한 단어가 일치할 경우 시스템 상에서 해당 단어를 카운트해 저장할 수 있도록 하고, 이를 통계에 포함시킨다.

위 과정을 거치며 처음에는 신뢰성이 떨어질 수 있으나 점차 많은 단어가 수신될수록 신뢰도는 급격히 높아질 것이다.

‘친구’라는 단어를 카운트한 경우 ‘친구’라는 단어가 수신된 시작에서 5초 범위로 같이 수신된 단어들을 입력하여 같이 쓰인 단어 목록에 추가된다. 이후 카운트된 ‘친구’라는 단어는 일간 통계에 전송된 후 주간 통계로 보내지게 된다.

주간 통계는 그래프 통계로, 매주 업데이트 되며 위 어플리케이션에서 소셜, 생활, 문학, 음식, 지식 등 분류해 놓은 목록들과 ‘친구’라는 단어를 비교한 뒤 퍼센트 단위로 구분하여 그래프로 사용자에게 한눈에 보여준다. 일간 통계는 단어 클라우드와 그래프 통계가 수시로 업데이트 되어 사용자에게 보여지게 된다. 단어 클라우드는 사용한 단어의 횟수와 단어 크기를 비례하여 보여준다. 단어 사용 빈도를 기준으로 가운데서부터 끝으로 갈수록 점차 단어의 크기가 작아지게 된다. 그래프 통계는 사용 빈도가 높은 단어를 기준하여 내림차순으로 사용자에게 보여지게 된다.

어플리케이션 워드클라우드 생성 소스코드(리눅스, 파이썬)

from __future__ import division
import warnings
from random import Random
import os
import re
import sys
import colorsys
import numpy as np
from operator import itemgetter
from PIL import Image
from PIL import ImageColor
from PIL import ImageDraw
from PIL import ImageFont
from .query_integral_image import query_integral_image
from .tokenization import unigrams_and_bigrams, process_tokens
item1 = itemgetter(1)
FONT_PATH = os.environ.get(“FONT_PATH”, os.path.join(os.path.dirname(__file__),
“DroidSansMono.ttf”))
STOPWORDS = set([x.strip() for x in open(
os.path.join(os.path.dirname(__file__), 'stopwords')).read().split('\n')])
class IntegralOccupancyMap(object):
def __init__(self, height, width, mask):
self.height = height
self.width = width
if mask is not None:
# the order of the cumsum’s is important for speed ?!
self.integral = np.cumsum(np.cumsum(255 * mask, axis=1),
axis=0).astype(np.uint32)
else:
self.integral = np.zeros((height, width), dtype=np.uint32)
def sample_position(self, size_x, size_y, random_state):
return query_integral_image(self.integral, size_x, size_y,
random_state)
def update(self, img_array, pos_x, pos_y):
partial_integral = np.cumsum(np.cumsum(img_array[pos_x:, pos_y:],
axis=1), axis=0)
# paste recomputed part into old image
# if x or y is zero it is a bit annoying
if pos_x > 0:
if pos_y > 0:
partial_integral += (self.integral[pos_x - 1, pos_y:] - self.integral[pos_x - 1, pos_y - 1])
else:
partial_integral += self.integral[pos_x - 1, pos_y:] if pos_y > 0:
partial_integral += self.integral[pos_x:, pos_y - 1][:, np.newaxis] self.integral[pos_x:, pos_y:] = partial_integral
def random_color_func(word=None, font_size=None, position=None,
orientation=None, font_path=None, random_state=None):
“”"Random hue color generation.
Default coloring method. This just picks a random hue with value 80% and
lumination 50%.
Parameters
———————————————–
word, font_size, position, orientation : ignored.
random_state : random.Random object or None, (default=None)
If a random object is given, this is used for generating random
numbers.
“”"
if random_state is None:
random_state = Random()
return “hsl(%d, 80%%, 50%%)” % random_state.randint(0, 255)
class colormap_color_func(object):
“”"Color func created from matplotlib colormap.
Parameters
———————————————–
colormap : string or matplotlib colormap
Colormap to sample from
Example
———————————————–
>>> WordCloud(color_func=colormap_color_func(“magma”))
“”"
def __init__(self, colormap):
import matplotlib.pyplot as plt
self.colormap = plt.cm.get_cmap(colormap)
def __call__(self, word, font_size, position, orientation,
random_state=None, **kwargs):
if random_state is None:
random_state = Random()
r, g, b, _ = 255 * np.array(self.colormap(random_state.uniform(0, 1)))
return “rgb({:.0f}, {:.0f}, {:.0f})”.format(r, g, b)
def get_single_color_func(color):
“”"Create a color function which returns a single hue and saturation with.
different values (HSV). Accepted values are color strings as usable by
PIL/Pillow.
>>> color_func1 = get_single_color_func(‘deepskyblue’)
>>> color_func2 = get_single_color_func(‘#00b4d2′)
“”"
old_r, old_g, old_b = ImageColor.getrgb(color)
rgb_max = 255.
h, s, v = colorsys.rgb_to_hsv(old_r / rgb_max, old_g / rgb_max,
old_b / rgb_max)
def single_color_func(word=None, font_size=None, position=None,
orientation=None, font_path=None, random_state=None):
“”"Random color generation.
Additional coloring method. It picks a random value with hue and
saturation based on the color given to the generating function.
Parameters
———————————————–
word, font_size, position, orientation : ignored.
random_state : random.Random object or None, (default=None)
If a random object is given, this is used for generating random
numbers.
“”"
if random_state is None:
random_state = Random()
r, g, b = colorsys.hsv_to_rgb(h, s, random_state.uniform(0.2, 1))
return ‘rgb({:.0f}, {:.0f}, {:.0f})’.format(r * rgb_max, g * rgb_max,
b * rgb_max)
return single_color_func
class WordCloud(object):
“”"Word cloud object for generating and drawing.
Parameters
———————————————–
font_path : string
Font path to the font that will be used (OTF or TTF).
Defaults to DroidSansMono path on a Linux machine. If you are on
another OS or don’t have this font, you need to adjust this path.
width : int (default=400)
Width of the canvas.
height : int (default=200)
Height of the canvas.
prefer_horizontal : float (default=0.90)
The ratio of times to try horizontal fitting as opposed to vertical.
If prefer_horizontal < 1, the algorithm will try rotating the word
if it doesn’t fit. (There is currently no built-in way to get only vertical words.)
mask : nd-array or None (default=None)
If not None, gives a binary mask on where to draw words. If mask is not
None, width and height will be ignored and the shape of mask will be
used instead. All white (#FF or #FFFFFF) entries will be considerd
“masked out” while other entries will be free to draw on. [This
changed in the most recent version!] scale : float (default=1)
Scaling between computation and drawing. For large word-cloud images,
using scale instead of larger canvas size is significantly faster, but
might lead to a coarser fit for the words.
min_font_size : int (default=4)
Smallest font size to use. Will stop when there is no more room in this size.
font_step : int (default=1)
Step size for the font. font_step > 1 might speed up computation but
give a worse fit.
max_words : number (default=200)
The maximum number of words.
stopwords : set of strings or None
The words that will be eliminated. If None, the build-in STOPWORDS
list will be used.
background_color : color value (default=”black”)
Background color for the word cloud image.
max_font_size : int or None (default=None)
Maximum font size for the largest word. If None, height of the image is
used.
mode : string (default=”RGB”)
Transparent background will be generated when mode is “RGBA” and
background_color is None.
relative_scaling : float (default=.5)
Importance of relative word frequencies for font-size. With
relative_scaling=0, only word-ranks are considered. With
relative_scaling=1, a word that is twice as frequent will have twice
the size. If you want to consider the word frequencies and not only
their rank, relative_scaling around .5 often looks good.
.. versionchanged: 2.0
Default is now 0.5.
color_func : callable, default=None
Callable with parameters word, font_size, position, orientation,
font_path, random_state that returns a PIL color for each word.
Overwrites “colormap”.
See colormap for specifying a matplotlib colormap instead.
regexp : string or None (optional)
Regular expression to split the input text into tokens in process_text.
If None is specified, “r”\w[\w']+”“ is used.
collocations : bool, default=True
Whether to include collocations (bigrams) of two words.
.. versionadded: 2.0
colormap : string or matplotlib colormap, default=”viridis”
Matplotlib colormap to randomly draw colors from for each word.
Ignored if “color_func” is specified.
.. versionadded: 2.0
normalize_plurals : bool, default=True
Whether to remove trailing ‘s’ from words. If True and a word
appears with and without a trailing ‘s’, the one with trailing ‘s’
is removed and its counts are added to the version without
trailing ‘s’ — unless the word ends with ‘ss’.
Attributes
———————————————–
“words_“ : dict of string to float
Word tokens with associated frequency.
.. versionchanged: 2.0
“words_“ is now a dictionary
“layout_“ : list of tuples (string, int, (int, int), int, color))
Encodes the fitted word cloud. Encodes for each word the string, font
size, position, orientation and color, Notes
———————————————–
Larger canvases with make the code significantly slower. If you need a
large word cloud, try a lower canvas size, and set the scale parameter.
The algorithm might give more weight to the ranking of the words
than their actual frequencies, depending on the “max_font_size“ and the
scaling heuristic.
“”"
def __init__(self, font_path=None, width=400, height=200, margin=2,
ranks_only=None, prefer_horizontal=.9, mask=None, scale=1,
color_func=None, max_words=200, min_font_size=4,
stopwords=None, random_state=None, background_color=’black’,
max_font_size=None, font_step=1, mode=”RGB”,
relative_scaling=.5, regexp=None, collocations=True,
colormap=None, normalize_plurals=True):
if font_path is None:
font_path = FONT_PATH
if color_func is None and colormap is None:
# we need a color map
import matplotlib
version = matplotlib.__version__
if version[0] < “2″ and version[2] < “5″:
colormap = “hsv”
else:
colormap = “viridis”
self.colormap = colormap
self.collocations = collocations
self.font_path = font_path
self.width = width
self.height = height
self.margin = margin
self.prefer_horizontal = prefer_horizontal
self.mask = mask
self.scale = scale
self.color_func = color_func or colormap_color_func(colormap)
self.max_words = max_words
self.stopwords = stopwords if stopwords is not None else STOPWORDS
self.min_font_size = min_font_size
self.font_step = font_step
self.regexp = regexp
if isinstance(random_state, int):
random_state = Random(random_state)
self.random_state = random_state
self.background_color = background_color
self.max_font_size = max_font_size
self.mode = mode
if relative_scaling < 0 or relative_scaling > 1:
raise ValueError(“relative_scaling needs to be ”
“between 0 and 1, got %f.” % relative_scaling)
self.relative_scaling = relative_scaling
if ranks_only is not None:
warnings.warn(“ranks_only is deprecated and will be removed as”
” it had no effect. Look into relative_scaling.”,
DeprecationWarning)
self.normalize_plurals = normalize_plurals
def fit_words(self, frequencies):
“”"Create a word_cloud from words and frequencies.
Alias to generate_from_frequencies.
Parameters
———————————————–
frequencies : array of tuples
A tuple contains the word and its frequency.
Returns
———————————————–
self
“”"
return self.generate_from_frequencies(frequencies)
def generate_from_frequencies(self, frequencies, max_font_size=None):
“”"Create a word_cloud from words and frequencies.
Parameters
———————————————–
frequencies : dict from string to float
A contains words and associated frequency.
max_font_size : int
Use this font-size instead of self.max_font_size
Returns
———————————————–
self
“”"
# make sure frequencies are sorted and normalized
frequencies = sorted(frequencies.items(), key=item1, reverse=True)
if len(frequencies) <= 0:
raise ValueError(“We need at least 1 word to plot a word cloud, ”
“got %d.” % len(frequencies))
frequencies = frequencies[:self.max_words] # largest entry will be 1
max_frequency = float(frequencies[0][1])
frequencies = [(word, freq / max_frequency)
for word, freq in frequencies] if self.random_state is not None:
random_state = self.random_state
else:
random_state = Random()
if self.mask is not None:
mask = self.mask
width = mask.shape[1] height = mask.shape[0] if mask.dtype.kind == ‘f’:
warnings.warn(“mask image should be unsigned byte between 0″
” and 255. Got a float array”)
if mask.ndim == 2:
boolean_mask = mask == 255
elif mask.ndim == 3:
# if all channels are white, mask out
boolean_mask = np.all(mask[:, :, :3] == 255, axis=-1)
else:
raise ValueError(“Got mask of invalid shape: %s”
% str(mask.shape))
else:
boolean_mask = None
height, width = self.height, self.width
occupancy = IntegralOccupancyMap(height, width, boolean_mask)
# create image
img_grey = Image.new(“L”, (width, height))
draw = ImageDraw.Draw(img_grey)
img_array = np.asarray(img_grey)
font_sizes, positions, orientations, colors = [], [], [], [] last_freq = 1.
if max_font_size is None:
# if not provided use default font_size
max_font_size = self.max_font_size
if max_font_size is None:
# figure out a good font size by trying to draw with
# just the first two words
if len(frequencies) == 1:
# we only have one word. We make it big!
font_size = self.height
else:
self.generate_from_frequencies(dict(frequencies[:2]),
max_font_size=self.height)
# find font sizes
sizes = [x[1] for x in self.layout_] font_size = int(2 * sizes[0] * sizes[1] / (sizes[0] + sizes[1]))
else:
font_size = max_font_size
# we set self.words_ here because we called generate_from_frequencies
# above… hurray for good design?
self.words_ = dict(frequencies)
# start drawing grey image
for word, freq in frequencies:
# select the font size
rs = self.relative_scaling
if rs != 0:
font_size = int(round((rs * (freq / float(last_freq))
+ (1 – rs)) * font_size))
if random_state.random() < self.prefer_horizontal:
orientation = None
else:
orientation = Image.ROTATE_90
tried_other_orientation = False
while True:
# try to find a position
font = ImageFont.truetype(self.font_path, font_size)
# transpose font optionally
transposed_font = ImageFont.TransposedFont(
font, orientation=orientation)
# get size of resulting text
box_size = draw.textsize(word, font=transposed_font)
# find possible places using integral image:
result = occupancy.sample_position(box_size[1] + self.margin,
box_size[0] + self.margin,
# if we didn’t find a place, make font smaller
# but first try to rotate!
if not tried_other_orientation and self.prefer_horizontal < 1:
orientation = (Image.ROTATE_90 if orientation is None else
Image.ROTATE_90)
tried_other_orientation = True
else:
font_size -= self.font_step
orientation = None
if font_size < self.min_font_size:
# we were unable to draw any more
break
x, y = np.array(result) + self.margin // 2
# actually draw the text
draw.text((y, x), word, fill=”white”, font=transposed_font)
positions.append((x, y))
orientations.append(orientation)
font_sizes.append(font_size)
colors.append(self.color_func(word, font_size=font_size,
position=(x, y),
, _ = process_tokens(words, self.normalize_plurals)
return word_counts
def generate_from_text(self, text):
“”"Generate wordcloud from text.
Calls process_text and generate_from_frequencies.
..versionchanged:: 1.2.2
Argument of generate_from_frequencies() is not return of
process_text() any more.
Returns
———————————————–
self
“”"
words = self.process_text(text)
self.generate_from_frequencies(words)
return self
def generate(self, text):
“”"Generate wordcloud from text.
Alias to generate_from_text.
Calls process_text and generate_from_frequencies.
Returns
———————————————–
self
“”"
return self.generate_from_text(text)
def _check_generated(self):
“”"Check if “layout_“ was computed, otherwise raise error.”"”
if not hasattr(self, “layout_”):
raise ValueError(“WordCloud has not been calculated, call generate”
” first.”)
def to_image(self):
self._check_generated()
if self.mask is not None:
width = self.mask.shape[1] height = self.mask.shape[0] else:
height, width = self.height, self.width
img = Image.new(self.mode, (int(width * self.scale),
int(height * self.scale)),
self.background_color)
draw = ImageDraw.Draw(img)
for (word, count), font_size, position, orientation, color in self.layout_:
font = ImageFont.truetype(self.font_path,
int(font_size * self.scale))
transposed_font = ImageFont.TransposedFont(
font, orientation=orientation)
pos = (int(position[1] * self.scale),
int(position[0] * self.scale))
draw.text(pos, word, fill=color, font=transposed_font)
return img
def recolor(self, random_state=None, color_func=None, colormap=None):
“”"Recolor existing layout.
Applying a new coloring is much faster than generating the whole
wordcloud.
Parameters
———————————————–
random_state : RandomState, int, or None, default=None
If not None, a fixed random state is used. If an int is given, this
is used as seed for a random.Random state.
color_func : function or None, default=None
Function to generate new color from word count, font size, position
and orientation. If None, self.color_func is used.
colormap : string or matplotlib colormap, default=None
Use this colormap to generate new colors. Ignored if color_func
is specified. If None, self.color_func (or self.color_map) is used.
Returns
———————————————–
self
“”"
if isinstance(random_state, int):
random_state = Random(random_state)
self._check_generated()
if color_func is None:
if colormap is None:
color_func = self.color_func
else:
color_func = colormap_color_func(colormap)
self.layout_ = [(word_freq, font_size, position, orientation,
color_func(word=word_freq[0], font_size=font_size,
position=position, orientation=orientation,
random_state=random_state,
font_path=self.font_path))
for word_freq, font_size, position, orientation, _
in self.layout_] return self
def to_file(self, filename):
“”"Export to image file.
Parameters
———————————————–
filename : string
Location to write to.
Returns
———————————————–
self
“”"
img = self.to_image()
img.save(filename)
return self
def to_array(self):
“”"Convert to numpy array.
Returns
———————————————–
image : nd-array size (width, height, 3)
Word cloud image as numpy matrix.
“”"
return np.array(self.to_image())
def __array__(self):
“”"Convert to numpy array.
Returns
———————————————–
image : nd-array size (width, height, 3)
Word cloud image as numpy matrix.
“”"
return self.to_array()
def to_html(self):
raise NotImplementedError(“FIXME!!!”)

기타(회로도, 소스코드, 참고문헌 등)

44 feature 잘했어요 (6)

44 feature 잘했어요 (1)