Wednesday, September 16, 2015

[ARDUINO] 아두이노 Wifi 쉴드, SD CARD, TFT LCD SPI 통신 문제




이번에 얘기할 내용은 아두이노 공식 쉴드 들의 문제점에 대해서 얘기해 보고자 한다.

일단 위 사진의 두개 제품은 Wifi + microSD 모듈, TFT-LCD + microSD 제품들이다. 이 제품들의 공통점이 있는데 바로 아두이노의 MISO, MOSI, SCK 핀을 이용한 SPI 통신을 한다는 것이다.

사실 이 SPI 통신은 공용 버스로 물려서 Master 와 Slave 간에 통신이 가능한다 아두이노의 경우 라이브러리가 Master만 지원이되며(Slave 동작시킬려면 라이브러리 수정 필요) 다른 쉴드들은 Slave가 되어 서로 통신하게 되어있다.

이런 여러 Slave들과 통신하려면 CS(Chip Select) 또는 SS라는 핀을 LOW(HIGH신호가 동작 안함임) 로 만들어서 동작시켜야 하는데 기존에 라이브러리들은 모두 Slave가 동작할 때만 CS 신호가 동작하여 서로 겹치지 않게 코딩 되어 있다는 것이다.

그런데 문제는 여기서 발생한다. 바로 Wifi + TFT-LCD 는 잘 동작이 되나 microSD를 동작시키면 Wifi와 충돌이 일어나는 것!?

CS를 강제로 HIGH로 만들어 SD 카드를 멈추어도 일단 SD 카드가 init 되면 MISO 핀으로 동작되는 Wifi 모듈이 동작 되지 않는 것이다.

아.. 멘붕..  이후 구글신께 찾아봤는데 해외에서도 같은 문제로 질문올린 글들이 있었다. 우선 국내 유져의 블로그를 통해 봤는데 정품끼리 연결하면 안된다고 설명되어 있던것.
(http://coalamovement.tistory.com/entry/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-wifi-shield-%EA%B0%9C%EB%B0%9C-6-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-wifi%EC%89%B4%EB%93%9C-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-tft-lcd)

거기다 아두이노 정식 홈페이지에도 SD카드와 wifi 동시 사용시에는 거기에 맞는 라이브러리를 사용하라는데 희한하게 동시에 사용한 예제가 어디에도 없었다(신기...)

그리고 해외 싸이트에서 같은 문제로 질문 올린 애들의 답변에도 다들 SD_CS 핀을 HIGH로 만들면 되야 한다는 것...

여기서 또다시 멘붕... (이놈들 해보고나 하는 소린가?)

일단 여기까지 하루 정도 조사하고 삽질한 바로는

문제1. microSD와 Wifi 모듈을 동시에 동작시키면 안되는데 코드에서 wifi 먼저 초기화 하고 microSD 초기화하면 microSD가 됨. 이후 wifi 동작 안됨

문제2. microSD 먼저 초기화하고 wifi 모듈 초기화하면 wifi 초기화 안됨.

이것을 통해 우선 microSD가 문제라는 것을 알았고 해외블러거들을 통해서 이것이 microSD의 MISO 핀이 문제가 된다는 것을 알았다. 이후 스코프로 SD_CS를 찍어봐도 분명 HIGH 인데 MISO 핀이 Hi-Z 상태가 되지 않기 때문에 Wifi 모듈이 문제가 된다는 것을 예측!!

자.. 문제를 알았으니 반이상 온거다!!

그럼 어떻게 해결할 것이냐? microSD 카드의 spi 타이밍도와 데이타시트를 보기 시작 ...

그러다 문득 내가 가진 microSD 문제인가? 라는 생각에 다른 microSD를 꼽아 보았는데 ㅠ 어무니 ㅠ 되네?

안되던 microSD는 삼성모바일 Ultra XCI 16G.. 되는건 memorette HC 16G 희한하네.. 삼성이 구린건가 ㅎ

이제 잘되겠다 싶어서 TFT를 연결하였으나 TFT의 경우 회로상의 문제로 MISO 핀 때문에 또다시 안됨.

문제도 알고 해결책도 안다. 그러나 하드웨어적인 문제로 TFT, Wifi, SD는 서로 융합할 수 없는 문제 ㅠ

그래서! TFT-LCD 회로를 보니 이를 돌파할 수 있는 방법을 발견!!



정말 천운이다. TFT-LCD의 MISO 핀이 3-State Buffer 가 달려있는 것이 아닌가!!! ㅠㅠ 어무니

이게 무슨 말인고 하니 정리하자면

원래 spi 통신에서 slave로 잡히는 쪽은 cs핀이 HIGH 일 때 MISO 핀이 Hi-Z 상태가 되어야 하는 것이 맞다. 그러나 다른 모듈의 하드웨어 회로, 또는 microSD 장치의 문제로 인해서 cs핀이 HIGH임에도 불구하고 MISO가 이상하게 Hi-Z로 안빠지는 것!

TFT-LCD의 경우 MISO핀을 3-State Buffer로 잡아놨는데 아마 이것은 3.3V를 5V로 Level-shift 할려고 했던것 같다. 운좋게도 저기 1번핀이 /OE 핀인데 Active Low 라서 GND에 물려 있는상태... 이것을 바로 SD_CS에 물리면 서로 딱 맞아 떨어지는 천의 운이!!! (설마 TFT-LCD 설계자가 이것을 염두에 두고!?)

어쨋든 작은 패키지의 IC를 띄고 저 핀을 막은다음 SD_CS 핀으로 점퍼선을 날렸다.


확대해서 보이나 모르겠지만 포스트잇 작게짤라서 1번픽 막고 점퍼선 날림 ㅎㅎ

이후에 해봤는데 이건 MISO 핀을 원천적으로 SD_CS에 맞게 Hi-Z로 바꾸다 보니 어떤 microSD를 사용하건 상관 없다는 것~~

혹시나 나같은 고민을 하던 분에게 도움이 되길 바라고~

이후 SD카드에서 이미지를 여러번 읽다가 오류나면 아래 블로그 참조 하시길!
http://forum.arduino.cc/index.php?topic=168131.0

모두들 화이팅!

9 comments :

  1. 저기요 혹시 아두이노관련 뭐좀 여쭤보려고하는데 한달째 많은곳에 질문올리고 찾아봐도 안되서요 ...연락좀주실수있나요
    a611103@naver.com 으로 연락주시거나
    카톡 : a611103 으로 주시면 감사하겠습니다.

    ReplyDelete
    Replies
    1. 안녕하세요~
      이곳에 사용하시는 모듈 이름이랑 증상 간략히 적어주시면 답변 드리겠습니다~

      Delete
    2. 안녕하세요 제가 지금 아두이노 메가 2560 보드에 정품 와이파이 쉴드와 keyes사 usb쉴드를 같이 쌓아서 사용하려고하는데요 spi 통신때문인지 두 쉴드가 올라갈경우 아두이노 보드에 먼저올린 쉴드만 작동을해서요..ㅠ각 각 USB2.0라이브러리와 wifi는 스케치에 내장된 라이브러리를 사용하는데요, wifi는 spi_drv.cpp 에서 ss를 바꾸고 , usb는 usbcore에서 ss를 바꾸는데 서로 10,53을줘도 작동을안해서요 ..혹시 아시나해서요 ㅠ

      Delete
    3. 아.. 이거 제가 겪은 문제랑 같은 문제처럼 보이네요 ㅠ
      우선 개별동작은 문제 없으신걸로 검증하신걸로 보고 답변 드립니다.
      SS핀 각 모듈 동작할 때 ON/OFF 정상적으로 되는지 확인해보셔야 할 것 같구요.
      MISO 핀이 각 모듈마다 정상동작 하시는지 확인해보셔야 할 것 같아요 ㅠㅠ
      SPI 두개 모듈 겹쳤을 때 MISO 핀이 문제가 되더라구요.
      블로그에 나온 문제인데... 혹시 스코프 장비가 없다거나 Hi-Z에 대해서 감이 없으시다면 모듈 둘중에 하나는 SPI통신을 포기하셔야 할 것 같습니다.
      WiFi 속도가 문제 없는 어플리케이션이라면 spi 말고 uart 방식으로 사용하시길 권해드립니다.

      Delete
    4. 아 제가 아두이노가 아직 익숙치못해서요 오히려 ss핀 셋팅을 안해주면 실행이 되는데 쓰지않는 ss핀을 high 로 죽여주면 되던것도 안되더라고요 ..miso 핀 확인은 또 어떠케하는지..ㅠ그부분 코드만 대충 보내주실수있나요 사용함수라도 ..

      Delete
    5. 현재 문제는 하드웨어 miso 문제 인것 같구요. 저도 레퍼런스 코드 그대로 사용해서 ss 핀은 셋팅 해준 것 밖에 없습니다. 코드는 아두이노 sd카드 라이브러리 열어보시면 될 것 같구요.
      생각에는 빠른 아웃풋 낼려면 spi 겹치지 않게 모듈 하나를 다른 방식으로 변경하시고 아니면 하드웨어 기초부터 공부하시는게 좋을 것 같네요. SPI 통신 방식에 대해서 공부하시면 될 것 같습니다~
      그리고 MISO 핀 확인은 오실로스코프라는 장비를 이용하여 합니다.
      감사합니다.

      Delete
    6. 아 ㅠ 무튼 신경써주셔서 답글달아주셔서 감사합니다!!
      한번 확인해봐야겠네요

      Delete
    7. 잘 되시기를 바랄께요 ㅠ

      Delete
  2. 안녕하세요. 아두이노 고수 신거 같아서 한 수 배우려고 합니다.
    arducam esp8266으로 사진을 찍어서 제 개인 서버로 사진을 전송을 햇는데요. 캡쳐된 이미지 크기와 전송된 이미지 크기를 비교하면 이미지 크기는 같아요. 근데 서버로 전송된 이미지를 확인해보려고 하면 이미지가 손상되엇다고 볼 수 가 없습니다. 혹시 이 문제에 대해 알고 계신가요? ㅜㅜ

    ReplyDelete