Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

허봉춘씨의 파란만장한 IoT 보드 만들기

4,137 views

Published on

초보 개발자 허봉춘씨의 파란만장한 IoT 보드 만들기

Published in: Devices & Hardware
  • Be the first to comment

허봉춘씨의 파란만장한 IoT 보드 만들기

  1. 1. 강의를 시작하기 전에! * CoIDE 설치 – 그냥 다음 다음만 누르시면 됩니다. * Gcc 설치 – 맨 마지막 단계에 환경 변수 추가하는 체크박스를 클릭한 후 완료해 주세요.
  2. 2. 허 봉춘씨의 파란만장한 IoT 보드 만들기 강 사 첫 번째 시간: 정 석균 두 번째 시간: 방 보현 Ethernet 시작하기
  3. 3. • 이름: 허봉춘 • 나이: 30세 • 학력: 그냥 저냥 전자과 대졸(평점 3.3) • 생김새: 동네 아저씨 • 학생 경력: 교내 경진 대회에서 AVR 라인 트레이서 입상. • 직장 경력 • 중소 기업에서 2년째 근무 중 • 2년째 AVR로 RS232로 장비 제어하는 것만 하고 있음. • 거주지: 회사 근처의 월세 40만원짜리 월세에 살고 있음. • 가족 관계: 아버지, 어머니, 여동생. • 할 줄 아는 것: AVR 코딩, 회로 그리기, Artwork. HUR BONG CHUN! 그는 누구인가!
  4. 4. 봉춘씨의 뇌 구조 나도 좀 발전 하고 싶다. AVR만 해서 나중에 먹고 살 수 있을까? 요세 IoT대세라던데. 배고프다. 이직하고 싶다. 아~ 조금 더 많은 걸 경험하고 내 자신을 발전시켜서 야근 많 이 안 하면서 돈 많이 주는 회사로 이직해 서 여자 친구도 좀 사 귀고 맛있는 것도 좀 사먹고 싶은데 선배 새끼는 계속 갈궈서 짜증이 난다.
  5. 5. • IoT가 대세라던데… IoT가 뭐지? • 사물 인터넷? 아~ 죄다 인터넷에 연결하는 거네. • 오~그럼 보일러 같은 거 핸드폰으로 끄면 좋겠다. 끄는 걸 자꾸 까먹어서 지난 달 가스 값이 ㅠㅠ • 그럼 어떻게 인터넷이 되게 하지? • 뭐? 임베디드 이더넷? 아~ 나도 발전하고 싶다. 대강 훑어볼까? 늘 발전!하고 있는 피카츄!
  6. 6. • RJ-45 - 이건 커넥터 잖아~ 패스~ • Transformer – 트랜스포머는 뭐 필요한가 보다~ 하는 거지 ㅎㅎ • PHY? – 그게 뭐시다냐… • MAC? – Mac 주소 이야기 하는건가? • TCP/IP Stack – 포팅을 해야 한다고??? • Application – HTTP, FTP, DHCP, SMTP…… 내가 만들어야 한다고??? 흐음 임베디드 이더넷을 하려면? 봉무룩 MCU MAC PHY Transformer RJ-45 Application TCP/IP “언제 공부해서 언제 하냐! ㅠㅠ 아~ 그냥 포기해야 겠다.”
  7. 7. 뭐? W5500? 그게 뭔데? 오! MAC PHY TCP/IP 다 들어 있어! 오! 나 SPI 알아. 나 해봤어. 오! ~좋아! 이거 가능성이 있겠는데?
  8. 8. W5500 더 알아 볼까? 그 유명하다는 아두이노에 W5100이 있었군. 오~ Ethernet Shield 2에는 W5500이 들어 갔구나. 이거(W5500) 어느 정도 성능 검증된 것 같은데? 이거(W5500) 써도 되겠네~ WIZwiki? 이건 뭐지? W5100 Arduino Ethernet Shield W5500 Arduino Ethernet Shield 2 회로랑 뭐 다 있네~ 이거 보고 하면 되겠네. Github? 이건 또 뭐야? http://wizwiki.net/wiki/doku.php?id=products:w5500:migration https://github.com/Wiznet/ioLibrary_Driver 와우 예제 코드도 종류별로 다 있네~
  9. 9. W5500으로 IoT 보드 한 번 만들어 보자! 그까이꺼 대강 뚝딱 만들면 되지!! 그래! 결심했어! 우리 봉춘씨가 기분 좋은 상상을 하며 이렇게 웃고 있겠죠?
  10. 10. !!대공개!! 허 봉춘씨의 프로젝트 진행 계획! 1. 컨셉 작업 2. 소자 선정 3. 개발 비용 및 제작 단가 산출 4. 회로 설계 5. 아트웍 6. 샘플 보드 발주 및 납땜 7. 펌웨어 8. 개발
  11. 11. 1. 컨셉 작업 – Brain Stormming • 뭘 만들지? • W5500으로 Ethernet에 연결이 가능하고 새로운 MCU를 사용해서 보드를 만들어 보자. • 어떻게 만들지? • 내가 직접 회로설계랑 아트웍이 가능하니 직접 하드웨어를 만들고 펌웨어도 직접 작성해 보자. • 무엇을 배울 수 있을까? • Embedded Ethernet 하드웨어 설계와 Embedded Ethernet 펌웨어 작성을 배울수 있어. • 보드에 얼마를 투자할 수 있을까? • 나는 월급이 적으니까..… 원가를 1-2만원에 맞추고 싶은데? 좋아! 박리다매야 박리다매! • 보드에 시간을 얼마나 투자할 수 있을까? • 아 맨날 야근하고… 시간은 늘 부족해… 귀찮기도 하고. 그렇다면 하루에 1시간씩 투자해 보자.
  12. 12. 1. 컨셉 작업 - 목표 W5500 사용 보드 원가 2만원 이하 Embedded Ethernet 구현 새로운 MCU 사용
  13. 13. MCU W5500 RJ45 + Transformer SD CARD MAC EEPROM USB USB to UART 1. 컨셉 작업 – 블록 다이어그램
  14. 14. 2. 소자 선정 ( 스펙추가 ) • W5500 • Hardwired TCP/IP, 32Kb internal memory, 8 Socket, 80Mhz SPI Interface. • STM32F103VC • Cortex M3, 256Kb flash, 48Kb sram, LQFP100, Max 72Mhz. • FT2232D • USB to USART, USB to Jtag 2 channel virtual comport. • 22AA02E48T • 2K Serial EEPROM, Official Mac address, I2C interface. • Micro USB • Micro SD Card • External Pin Header
  15. 15. 3. 개발 비용 및 단가 산출 허 봉춘: 2만원에 맞출 수 있나? 단가를 알아 봐야겠네… ◈ USB 케이블은 검색해보면 440원, 랜 케이블은 280원 정도입니다. 봉춘씨 참고하세여~ 품 목 단 가 비 고 W5500 3,200원 STM32F103VC 3,200원 음 적당한 가격 같아! 아는 업체 견적 FT2232D 5,500원 헐 겁나 비싸! ㅠㅠ 아는 업체 견적 22AA02E48T 250원 오 이건 싸네! ㅎㅎ 아는 업체 견적 나머지 소자 3,000원 나머지 해봐야 한 3천원 넘겠어? PCB 2,250원 한판에 18만원 정도 했으니까.. 80장은 나오겠지? SMT 1,000원 잘 모르겠다. 한 천원 하지 않을까? 합 계 18,400원 오예~ 2만원 안 넘는다.~~
  16. 16. 4. 회로 설계 허 봉춘: 좋아! 이제 회로 설계를 해볼까? W5500부분부터 해야지~ 레퍼런스~ 랄라~ - http://wizwiki.net/wiki/doku.php?id=products:w5500:refschematic
  17. 17. 4. 회로 설계 허 봉춘: 이제 MCU쪽! 리셋, 부트 버튼도 달고~ VCC에 Decoupling CAP도 달고~ 룰루~
  18. 18. 4. 회로 설계 허 봉춘: FTDI USB! 이것도 Datasheet에 레퍼런스 회로가 똭! 이것도 똑같이 그려야징~ MICRO USB 3.3V REGULATOR EXTERNAL POWER SELECT
  19. 19. 4. 회로 설계 허 봉춘: 그리고 마지막으로 Output Pin좀 빼고~ 다양하게 Mount Hole 장착! 마무리! EXTERNAL OUTPUT W5500 : SPI PC0~PC3 : ADC PA0~PA3 : USART2 FULL PB8~PB9 : I2C1 OR CAN PB10~PB11 : I2C2/USART3 PB12~PB15 : SPI2/I2S PA11~PA12 : USB PD0~PD1 : CAN PD5~PD6 : USART2 PCB MOUNT HOLE EXTERNAL CONNECTOR
  20. 20. 아트웍시 주의사항 • TX+/-와 RX+/- 신호는 최대한 짧게 연결 하고, Trace의 길이를 최대한 같게 함. (25mm 이하) • TX+(or RX+)와 TX-(or RX-) 신호는 최대한 가깝게 나란히 지나가도록 연결.(간격 1mm) • TX+/-와 RX+/- 서로 크로스되지 않도록 연결. • TX+/-와 RX+/- 신호의 저항과 캐패시터는 트랜스포머와 W5500사이에 배치하고 연결. • TX+/-와 RX+/-는 서로 거리를 두고 연결. GND로 분리.(간격 0.7mm) • TX+/-와 RX+/- 다른 신호 및 전원과 거리를 두고 연결. GND로 분리. (간격 0.7mm) • RJ45 아래에는 CHGND를 깔거나 GND를 깔지 않음.
  21. 21. 아트웍 좋은 예
  22. 22. 5. 아트웍 허 봉춘: 지킬껀 지켜가면서 아트웍 완성 !! 허 봉춘: 자! 이제! 샘!플!발!주!!!!!!!!!!!!!!!!!!!!!!!! 슈웅~ 투쿵~ 철컥철컥! 출격! * Sample pcb 제작 가격은 업체마다 틀리지만 보통 5개 정도에 7~8만원 정도 합니다. 참고하시기 바랍니다.
  23. 23. 6. 샘플 납땜 및 디버깅. 허 봉춘: 아놔! ㅠㅠ RJ-45 핀이 다 같은게 아니었어. 레퍼런스 완전 똑같이 할 걸. ㅠㅠ 만신창이 ㅠㅠ • 봉춘씨의 IoT Sample 납땜 결과 - RJ-45를 레퍼런스와 다른 종류를 사용하였습니다. - Mac 주소 EEPROM의 NC핀과 VCC핀이 뒤바뀌었습니다. - 리셋 버튼과 Boot0핀이 너무 가깝습니다. - USB Port 고정용 Hole을 뚫지 않았습니다. - SD Card socket 고정용 Hole 사이즈가 너무 작습니다.
  24. 24. 6. 샘플 납땜 및 디버깅. 허 봉춘씨는 다시 한 번 회로와 아트웍을 수정하여 보드를 완성하였습니다. • 봉춘씨의 IoT EVB 디버그 - 레퍼런스와 같은 RJ-45를 사용했습니다. - EEPROM의 NC와 VCC를 정상적으로 연결했습니다. - 리셋 버튼과 Boot0 버튼의 거리를 벌렸습니다. - USB Port 고정용 Hole을 뚫었습니다. - SD Card socket 고정용 Hole 사이즈를 변경했습니다. - 기타 Mount Hole 위치 및 Copper거리를 변경했습니다. 자! 이제부터는 펌웨어 단계입니다. 지금부터는 여러분들이 허 봉춘씨입니다. 레드~썬!!
  25. 25. 7. 펌웨어 개발 환경. • CoIDE + gcc 사용. • GCC tool chain 설정. • Project->Select Toolchain Path • gcc가 설치된 디렉토리 중 bin 폴더 선택
  26. 26. 7. 펌웨어 – New Project. • Project->New Project 선택 -> 프로젝트 이름 입력. • Chip 선택
  27. 27. 7. 펌웨어 – New Project. • ST->STM32F103x->STM32F103VC 선택(OR 검색) • 완료!
  28. 28. 7. 펌웨어 – New Project. □ C Library □ Retarget printf □ CMSIS core □ CMSIS Boot □ RCC □ GPIO □ USART □ MISC
  29. 29. 7. 펌웨어 – New Project. 디버거 설정: Configuration tab -> Debugger tab
  30. 30. 7. 펌웨어 – New Project. 컴파일 후 다운로드 해 봅시다. 보드에 정상적으로 다운로드가 되나요?
  31. 31. 7. 펌웨어 – 실습 #1 LED ON/OFF • LED ON/OFF • 새로운 보드가 정상적으로 동작하는 것을 확인할 수 있는 가장 기본적인 펌웨어는 LED ON/OFF입니다. • GPIO를 이용해 LED를 ON/OFF를 스스로 할 수 있다면 50%는 끝난 거라는 말이 있을 정도로 기본 중에 기 본입니다.
  32. 32. 7. 펌웨어 – 실습 #2 W5500 포팅 • 포팅이란 단어만 나와도 머리가 아프시죠? 두통에 고생하시는 “허 봉춘”님들(?)을 위해서 선물을 준비했습니다. IoT 강의 -> PROJECT ->1. PORTING
  33. 33. 7. 펌웨어 – 실습 #2 W5500 포팅 • 사실 어렵지 않아요!!! • MCU와 연결 • SPI – 4 Lines • INTERRUPT – 1 Lines • RESET – 1 Lines MCU SPI CS RESET INT SPI, RESET, INT
  34. 34. 7. 펌웨어 – 실습 #2 W5500 포팅 GPIO Initialization • SPI Pin Enable • CS Pin Enable • Reset Pin Enable • INT Pin Enable SPI Initialization • SPI Configuration • SPI Enable Connect to MCU • SPI Read(), SPI Write() Registration. • CS Registration. W5500HardwareInitilize() W5500Initialze()
  35. 35. 7. 펌웨어 – 실습 #2 W5500 포팅 void W5500HardwareInitilize(void) { /*Initialize Structure*/ GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /*Enable clock related peripherals*/ RCC_APB2PeriphClockCmd(W5500_SPI_RCC,ENABLE); RCC_APB2PeriphClockCmd(W5500_GPIO_RCC,ENABLE); /*Initialize CLK Pin*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = W5500_CLK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(W5500_CLK_PORT,&GPIO_InitStructure); /*Initialize MOSI Pin*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = W5500_MOSI_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(W5500_MOSI_PORT,&GPIO_InitStructure); /*Initialize MISO Pin*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = W5500_MISO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(W5500_MISO_PORT,&GPIO_InitStructure); /*Initialize CS Pin*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = W5500_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(W5500_CS_PORT,&GPIO_InitStructure); /*Initialize Reset Pin*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = W5500_RESET_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(W5500_RESET_PORT,&GPIO_InitStructure); /*Initialize INT Pin*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = W5500_INT_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(W5500_INT_PORT,&GPIO_InitStructure); /*Initialize SPI*/ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(W5500_SPI, &SPI_InitStructure); SPI_Cmd(W5500_SPI, ENABLE); W5500HardwareReset(); }
  36. 36. 7. 펌웨어 – 실습 #2 W5500 포팅 GPIO Initialization • SPI Pin Enable • CS Pin Enable • Reset Pin Enable • INT Pin Enable SPI Initialization • SPI Configuration • SPI Enable Connect to MCU • SPI Read(), SPI Write() Registration. • CS Registration. W5500HardwareInitilize() W5500Initialze()
  37. 37. 7. 펌웨어 – 실습 #2 W5500 포팅 void W5500WriteByte(unsigned char byte) { while (SPI_I2S_GetFlagStatus(W5500_SPI, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(W5500_SPI, byte); while (SPI_I2S_GetFlagStatus(W5500_SPI, SPI_I2S_FLAG_RXNE) == RESET); SPI_I2S_ReceiveData(W5500_SPI); } unsigned char W5500ReadByte(void) { while (SPI_I2S_GetFlagStatus(W5500_SPI, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(W5500_SPI, 0xff); while (SPI_I2S_GetFlagStatus(W5500_SPI, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(W5500_SPI); } void W5500Select(void) { GPIO_ResetBits(W5500_CS_PORT,W5500_CS_PIN); } void W5500DeSelect(void) { GPIO_SetBits(W5500_CS_PORT,W5500_CS_PIN); } SPI Read Byte 함수 SPI Write Byte 함수 W5500 Select 함수 W5500 Deselect 함수
  38. 38. 7. 펌웨어 – 실습 #2 W5500 포팅 void W5500Initialze(void) { unsigned char temp; unsigned char W5500FifoSize[2][8] = {{2,2,2,2,2,2,2,2,},{2,2,2,2,2,2,2,2}}; W5500DeSelect(); /* spi function register */ reg_wizchip_spi_cbfunc(W5500ReadByte, W5500WriteByte); /* CS function register */ reg_wizchip_cs_cbfunc(W5500Select, W5500DeSelect); if(ctlwizchip(CW_INIT_WIZCHIP,(void*)W5500FifoSize) == -1) { printf("W5500 initialized fail.rn"); } do{//check phy status. if(ctlwizchip(CW_GET_PHYLINK,(void*)&temp) == -1){ printf("Unknown PHY link status.rn"); } }while(temp == PHY_LINK_OFF); } SPI Read Write 함수 등록 Chip Select 함수 등록
  39. 39. 7. 펌웨어 – 포팅 완료! 아싸!…… 근데 이제 뭐. 근데 이제 어떻게 뭘 해야 하지? • UDP는 어떻게 하지? 뭐 커넥션이 필요 없고… 뭐 설정하는 함수가 있나? • TCP는 어떻게 하지? 음… 커넥션이 필요하고… 이것도 이 정도만 알아.. ㅠㅠ • Socket을 열라고? Socket이 뭔데? 8개 까지 동시에 가능하다고는 했는데… • Port 번호가 필요하다고? Port가 뭔데?
  40. 40. 7. 펌웨어 – socket이 뭘까? • 상상해봐요. 지금 봉춘씨들은…… • 인터넷으로 음악을 들으면서 • 친구와 채팅도 하고 있습니다. • 그러다가 잠깐 인터넷 쇼핑도 좀 하고 • 아웃룩으로 온 E-mail도 확인 합니다. Internet 음악 카카오톡 채팅 인터넷 쇼핑 E-mail 확인 Internet 음악 주는 서버 카카오 서버 쇼핑몰 서버 E-mail 서버 PC
  41. 41. 7. 펌웨어 – socket이 뭘까? • 눈치 채셨죠? 네 맞습니다. Socket은 프로그램들의 연결 통로라고 보시면 됩니다. • 각각의 프로그램은 Socket으로 구분되고 Port는 그 Socket의 번호에 해당합니다. • 일반적으로 BSD 소켓이 사용되고 있고 Wiznet도 BSD 형식으로 코드를 제공합니다. Internet 음악 카카오톡 채팅 인터넷 쇼핑 E-mail 확인 Internet 음악 주는 서버 카카오 서버 쇼핑몰 서버 E-mail 서버 PC SOCKET SOCKET SOCKET SOCKET
  42. 42. 7. 펌웨어 모르시겠다구요? 좋습니다. 그럼 지금부터 맨땅에 헤딩 들어갑니다.
  43. 43. 7. 펌웨어 – 실습 #3 UDP echo SOCKET OPEN RECEIVE SEND socket(); 소켓 열기 recvfrom(); 데이터 받기 sendto(); 데이터 보내기
  44. 44. 7. 펌웨어 – 실습 #4 TCP LED ON/OFF SOCKET OPEN LISTEN ESTABLISH socket(); 소켓 열기 RECEIVE LED ON/OFF SEND listen(); 연결 듣기 getSn_SR(); 상태 확인 recv(); 데이터 받기 send(); LED 컨트롤 완료 보내기 led1Ctrl(); LED 온 오프

×