기술연구

김경현 2018. 10. 28. 22:13

안녕하세요.


기술이 공유되지 않으면 미래의 사회는 지금보다 더욱 폐쇄적이고 불평등한 사회가 될 것입니다. 카피레프트(copyleft)는 개인의 지적재산권을 중시하는 기존의 카피라이트(copyright)에 대항해 사회적 공유를 강조하는 정신이자 운동입니다. DIY연구소는 카피레프트(copyleft) 정신과 4차 산업기술의 확산을 위하여 연구한 내용을 무료로 배포하고 있습니다. 오늘은 '3D프린터 로봇으로 스마트공장 만들기' 를 공유합




☞ 4차 산업 설계제작 (교보문고)

☞ 3D프린터 설계제작 (교보문고)


DIY연구소 김경현 배상 (010 8604 6802)



[교육내용]


☞ 1. 3D프린터 설계제작

☞ 2. 3D프린터 프로그램

☞ 3. 3D프린터 의수제작

☞ 4. Core XY 3D프린터 구동방식과 조립

☞ 5. Prusa i3 3D프린터 조립

☞ 6. Prusa i3 3D프린터 배선

☞ 7. 3D프린터 전기조립 기초

☞ 8. Fun i3 3D프린터 조립

☞ 9. 3D프린터 오픈소스 RepRap

☞ 10. 20만원대 교육용 3D프린터 개발

☞ 11. 3D프린터 전기자전거 개발

☞ 12. 원노즐 듀얼 3D프린터 개발

☞ 13. 3D프린터 모델링 프로그램 라이노(Rhino)




1. 프로토타입 (Prototype) : 상품화에 앞서 성능을 검증 개선하기 위해 핵심 기능만 넣어 아두이노 라즈베리파이로 제작

■  로봇 : 참고


■ 아두이노 : ☞ 참고

 

 


■ 라즈베리파이 : ☞ 참고


 


모듈 : ☞ 참고

 

 

 

 

 

 

 

 

 


■ 디스플레이 : ☞ 참고

 

 

 


 센서 : ☞ 참고


 

 

 


 모터☞ 참고


 

 

 


 전원 : ☞ 참고

 

 

 


 케이블 및 빵판 : ☞ 참고


 

 


 부품 (LED, 저항, IC 등) : ☞ 참고


 

 

 

 

 

 

 

 

 

 

 


■ PCB 제작 : ☞ 참고




2. 설계제작 예


2.1. 온도 습도 수분 측정기 만들기


3D프린터 로봇으로 스마트공장 (Smart Factory) 만들기 중 아두이노를 이용한 온도, 습도, 수분 측정기 를 만들어 봅니다. 준비물은 3D프린터 로봇, Arduino Pro MiniDHT22, OLED, 수분센서, TP4056, 리튬배터리, 미니스위치, 악어클립, 암수점퍼선이 필요합니다.


■  3D프린터 로봇 : 참고


■  Arduino Pro Mini : 아두이노 프로미니 328. 3.3V/8MHz


아두이노 프로미니에서 센서들에 제공 가능한 최대 전류는 150 mA 입니다.

  



  



※ 참고 : 아두이노 우노, 아두이노 나노 , 아두이노 프로미니 사진



■  OLED : 12864 OLED 모듈 4핀 (0.96 인치)


시리얼통신 대신 디스플레이를 통해 출력하며, 12864 OLED 의미는 가로 128 픽셀, 세로 64 픽셀을 의미합니다. 메이커측의 라이브러리를 사용하면 OLED 데모 화면의 선, 사각형, 원, 글자 등을 쉽게 디자인할수 있습니다. LED는 17개 핀으로 OLED는 4개 핀으로 연결합니다.



비교 : LCD : 사용 전류는 0.12A (120mA) 로 OLED 0.012A (12mA) 보다 10 배 더 많은 전류를 소모 합니다.





OLED 데모 화면 :









■  FDTI 브레이크 아웃보드


아두이노 프로미니가 작기에 기능들이 최소화되어 있습니다. 아두이노 우노에서는 시리얼통신을 자체적으로 할수 있지만, 아두이노 프로미니에서는 FDTI 브레이크아웃보드를 이용해야만 시리얼통신을 할수 있습니다. 시리얼통신을 할수 있다는 것은 작성한 프로그램을 아두이노 프로미니로 옮길수 있고 입력출력 내용들을 시리얼통신을 통하여 받아볼수 있습니다.


  


  


  


2.5. USB 잭







연결 :



(1) OLED I2C 주소 찾기 :


I2C Scanner 프로그램 사용 : http://playground.arduino.cc/Main/I2cScanner


OLED를 모두 연결해야 주소를 찾을수 있고, 0x3C 출력 확인합니다. NoI2C devices found 이면 OLED 불량 가능성 있습니다.


(2) 라이브러리 직접 설치하는 방법 : OLED I2C 를 사용하기 위해서는 SSD1306 와 GFX 라이브러리를 다운 받아 설치합니다. 


SSD1306 라이브러리 다운로드 : https://github.com/adafruit/Adafruit_SSD1306



GFX 라이브러리 다운로드 : https://github.com/adafruit/Adafruit-GFX-Library



내 PC의 아래 폴더에 다운로드한 라이브러리들을 복사후 사용합니다.



(3) 아두이노 스케치 툴에서 라이브러리 추가하는 방법 : 



라이브러리 관리 버튼 클릭후



라이브러리 매니저 창이 보여지면



검색창에 SD1306 입력후 Adafruit SSD1306 라이브러리를 찾아 설치합니다.



SSD1306 헤더 정보 변경 :


Adafruit_SSD1306.h 헤더 파일내에서 아래의 주석내용을 반드시 수정해야 합니다.

#define SSD1306_128_64     -> 주석 해제

// #define SSD1306_128_32 <- 주석 처리



샘플 소스 실행 : 아두이노 스케치 또는 비쥬얼 스튜디오에서 실행


비쥬얼 스튜디오의 경우 파일-> 열기-> Arduino Project 선택 :



로컬디스크 (C:) / Arduino / libraries / Adafruit_SSD1306 / examples / ssd1306_128x64_I2C / ssd1306_128x64_i2c.ino 선택 :



소스 화면 : 비쥬얼 스튜디오는 프로젝트까지 자동으로 만들어 집니다.



코드 수정 : disply.begin(SSD1306_SWITCHCAPVCC, 0x3D) 에서 3D 를 3C 로 수정 합니다.



실행 : [Ctrl + F5] 눌러 아두이노 프로미니에 소스파일 업로드. 컴파일되어 정상업로드시 FDTI 보드의 적색램프가 반복 점등 됩니다.




아두이노 기본 구조와 OLED 출력 구조 :


setup 구조는 Arduino 와 OLED 초기화 기능, loop 구조는 Serial 통신, 처리부분, OLED 출력 기능 합니다. 아두이노 안에 감추어진 프로그램의 시작부분 Main() 안에서 setup 과 loop 를 호출합니다. 초기화는 한번만 호출되기에 setup 도 전체프로그램에서 한번만 호출되는 함수입니다. loop는 계속적으로 호출되며 1초에 60회 정도 호출됩니다. loop 는 처리를 하기 위해서 존재합니다. OLED는 내부적으로 스크린버퍼라는 조그마한 메모리에 조금씩 저장후 한꺼번에 화면에 보여지도록 출력합니다. 스크린버퍼는 백버퍼라고도 하며 화면의 깜박임 현상을 막기 위함 입니다. 화면안에서 출력해주기 위해서는 loop 안에서 스크린버퍼를 지우고 그리기를 반복해야 합니다. 스크린 버퍼안에 메모리에 그려진것을 화면에 그리라는 명령을 하여 화면에 출력을 해주게 됩니다.



OLED 메서드 :


초기화 관련 메서드 : begin() : I2C 초기화, clearDisplay() : 스크린 버퍼 지우기, setTextSize() : 글자크기 설정 1부터, setTextColor() : BLACK, WHITE 문자, YELLOW, BLUE 문자, setCursor() : 좌표 설정. 128x64 이므로 가로 0~127, 세로 0~63


출력 관련 메서드 : display() : 스크린 버퍼 출력하기, println() : 글자 출력, print() : 지정된 문자열 출력.



그래픽 출력 메서드 : drawCicle() : 원 및 타원 출력, fillRect() : 색으로 채워진 사각형 출력, drawTriangle() : 삼각형 출력, fillTriangle() : 색으로 채워진 삼각형 출력, drawRoundRect() : 모서리가 둥근 사각형 출력, fillRoundRect() : 색으로 채워진 둥근 모서리 사각형 출력, drawLine() : 선 그리기, 스크롤 관련 함수 : startscrollright(), stopscroll(), startscrollledt(), startscrolldiagright(), startscrolldiagledt()



소스 보기 :


C언어 프로그래밍은 곧 순서이고 무엇으로 어떻게 나열할것인가가 코딩이고 C, C++, C#  공부가 필요합니다. 4차산업 혁명 안에서의 언어와 기기와 여러 센서들과 융합되는 하나의 부분이라고 생각할수 있습니다. 스마트한 화면의 OLED 다루는 방법을 확인해 봅니다. 아두이노 스케치 튤을 이용하여 프로그램 작업하거나 비쥬얼 스튜디오 무료 커뮤니티 툴을 다운로드하여 프로그램 작업합니다.




코드 설명 :


1~5 열 : 헤더 파일들을 추가해주어야 합니다.



9~10 열 : 리셋에 대한 부분들로 필요한 이유는 Adafruit_SSD1306에 대한 객체를 생성하기 위함입니다. 생성할때 초기으로 들어갑니다.



12 열 : X, Y 자표를 정합니다. 이유는 화면상 웃고 있는 눈표시 (^^) 를 좌에서 우로 애니메이션 흐름을 위하여 X, Y 좌표를 잡기 위해서 입니다.



14~33 열 : setup 부분에서 해주어야 할것은 아두이노와 OLED에 대한 초기화도 필요합니다. 여기서는 시리얼통신을 통한 시리얼모니터에 출력하는 것이 아니고 OLED 에만 출력하에 OLED 초기화만 합니다.


17 열 : display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 는 셋팅으로 메이커에서 함수를 지정하였으므로 변경할수 없습니다.

18 열 : display.clearDisplay(); 이전에 스크린에 남아있던것을 지우고 (0) 으로 초기화 시킵니다.

19 열 : display.setTextSize(1); 글자 크기를 (1) 로 지정합니다.

20 열 : display.setTextColor(WHITE); 글자 색상을 흰색 (WHITE) 로 지정합니다.

21 열 : display.setCursor(0,0); 커서위치를 (0,0) 으로 옮겨 놓습니다.

22 열 : display.println("Hello World"); 화면에 Hello World 를 한번 출력하며 글자의 크기를 확인해 봅니다.

24 열 : display.setTextSize(2); 두번째 사이즈를 확인하고자 글자 크기를 (2) 로 지정합니다.

25 열 : display.println("Hello World"); 화면에 Hello World 를 다시 출력하며 글자의 크기를 확인해 봅니다.

27 열 : display.setTextSize(3); 두번째 사이즈를 확인하고자 글자 크기를 (3) 로 지정합니다.

28 열 : display.println("Hello World"); 화면에 Hello World 를 세번째 다시 출력하며 글자의 크기를 확인해 봅니다.

30 열 : display.display(); 상기 내용은 셋업이지만 한번 실행되기에 내용을 출력하려 display 를 호출합니다.

31 열 : delay(2000); 2 초후 복귀 지정합니다.

32 열 : display.setTextSize(2); 글자 크기를 (2) 로 설정합니다.




35~53 열 : 반복하는 loop 가 나옵니다.



39 열 : display.clearDisplay(); 이전에 스크린에 남아있던것을 지우고 (0) 으로 초기화 시킵니다. X 좌표를 (0)으로 만들어 줍니다.



40 열 : if (g_nX  >= 96) 눈웃음 (^^) 는 (^) 하나가 16 개 픽셀이 필요합니다. (^^) 는 2 개 이기에 32 개 픽셀이 필요합니다. (^^) 의 우측끝단의 길이가 우측으로 3배 폭 이동후 96 픽셀보다 크거나 같아지면, 39 열의 display.clearDisplay(); 에 의하여 X 좌표를 (0)으로 만들어 줍니다.

42 열 : g_nX = 0; 다음 칸의 제일 처음으로 가도록 합니다.

43 열 : g_nY++; 다음 열로 넘어가야 하기에 1씩 증가시킵니다.

44 열 : g_nY = g_nY % 4; 모드 연산 %를 이용하여 열을 16 픽셀칸 4개로 나누어 4가 되면 0으로 이동하도록 만들어 줍니다.

46 열 : else { 그렇지 않으면

47 열 : g_nX += 2; 다음 칸 이동시 2씩 증가 하도록 합니다.

50 열 : display.setCursor (g_nX, g_nY * 16); 디스플레이에서 셋커서는 X 는 그대로 하되, Y는 16 픽셀씩 간단히 점프 이동합니다.

51 열 : display.print ("^^"); 눈웃음 (^^) 을 출력하도록 합니다.

52 열 : display.display ();  display 를 호출합니다.



실행 : [Ctrl + F5] 눌러 아두이노 프로미니에 소스파일 업로드. 컴파일되어 정상업로드시 FDTI 보드의 적색램프가 반복 점등 됩니다.





■  DHT22 : 고정밀 온습도 센서 (AM2302) 모듈


센서를 사용하는 방법과 사용되는 코드는 고정되어 있으며 사용자가 바꿀수 있는것이 아닙니다. 제공되는 함수를 이용해 별도의 함수를 만들수는 있겠지만 센서자체의 기능함수는 제조사외는 만들기 어렵습니다. 이러한 이유로 센서의 사양은 중요하며 연결, 소스, 실행까지 공부합니다. DHT22 (부품번호 : AM2302) 는 DHT11에 비하여 고정밀, 버전업 되었습니다.





DHT22 사용을 위해서는 아래의 2가지 라이브러리를 설치해야 DHT22 메서드 함수를 사용할수 있습니다.


(1) Adafruit Unified Sensor Library : https://github.com/adafruit/adafruit_sensor





센서에 필요한 전류를 아두이노 프로미니에서 공급해줄수 있는지 사양을 확인해야 합니다.





연결 :






소스 코드 :


C언어가와 아두이노가 결합되면 움직이고, 생명을 주고, 소통하고, 정보들을 출력할수 있는 언어가 됩니다. 4차 산업혁명에서 C언어와 하드웨어를 접목하고 융합하는것이 중요합니다. 온습도계 DATA 2번 핀과 아두이노 D2 포트를 연결했는데 이와 같이 기본적으로 핀모드 (pinMode[]) 라는 메서드 함수를 사용해서 핀에대한 부분들을 입력모드로 쓸것인지, 출력모드로 쓸것인지, 이런부분들을 우리가 결정해주어야 합니다. 하지만 라이브러리를 쓴다는것은 기존의 불편했던 부분들을 라이브러리 안에서 전부다 처리를 다하는것입니다. 그래서 라이브러리를 이용하면 이와같이 핀모드란 부분을 호출할 필요가 없고, DHT 객체안에 이미 설정하기에 객체에서 제공하는 메소드 함수를 중심으로  프레임을 작성후 실제 출력이 일어나는 것을 확인합니다. 소스나 센서를 사용하는 방법은 이미 정형화되어 고정되어 있습니다. 이런 편의를 이용해 어떻게 활용할것인가를 공부합니다. 라이브러리를 이용하면 노력과 시간도 줄일수 있고 더 많은 것들을 풍부하게 적용해 볼수 있기에 적극 활용해야 합니다.





코드 설명 :


1~6 열 : 헤더 파일들을 추가해주어야 합니다.



8~10 열 : 코딩의 정의 부분 입니다.



12~14 열 : 변수 정의 부분 입니다.



16~21 열 : setup 부분 입니다.



27~56 열 : 반복하는 loop 부분 입니다.




■  수분센서 : DFROBOT Gravity



■  리튬배터리 : 아두이노호환 보호회로 (Li-Po) 3.7V 503035 500mAh



■  TP4056 : 충전용 입력단자 (TP4056) 5V 1A 리튬폴리머 배터리 충전기 모듈 Mini-B 단자



■  미니 스위치



■  와이파이 모듈 : 초기범용버전으로 ESP8266 WiFi Module. 스마트폰, PC로 데이터를 와이파이로 전송, 저장 가능



※ 참고 : ESP8266 SMD WiFi 모듈 [ESP-12E] 사진, 현재 14 버전까지 출시.



2.2. 제작 :










밧데리 충전 전압은 3.7V (+) -> 아두이노 프로미니는 전압 3.3V (+) 사용 이유로 감압 레귤레이터 RAW 포트와 연결











[3D프린터 로봇머리 (기계 KIT :  구입]








사업자 정보 표시
| | | 사업자 등록번호 : -- | TEL : -- | 사이버몰의 이용약관 바로가기