<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>마계툴즈의 작업실</title>
    <link>https://makeutil.tistory.com/</link>
    <description>마계툴즈의 작업실입니다. 
필자의 극히 개인적인 취미 개발 이나 활동을 위주로 가능한 모든 일들을 기록합니다. 
임베디드 시스템 관련 개발보드 관련 협찬, 강의 연락주시면 협의 가능하며,
도움이 되었다면 댓글, 응원, 구독등 해주시면 감사드리겠습니다.
</description>
    <language>ko</language>
    <pubDate>Wed, 8 Jul 2026 16:19:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Maketools</managingEditor>
    <image>
      <title>마계툴즈의 작업실</title>
      <url>https://tistory1.daumcdn.net/tistory/285399/attach/c7072ecf962c4290b2753e54ed6264a9</url>
      <link>https://makeutil.tistory.com</link>
    </image>
    <item>
      <title>[Windows 10/11] Windows에 GCC를 설치</title>
      <link>https://makeutil.tistory.com/336</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 컴파일러는 gcc나 g++을 주로 사용한다. 뭐 윈도우보다는 대부분 리눅스에서 개발을 하는 필자의 입장에서는 그렇다. 그마저도 요즘에는 프로젝트 관리만 하다보니 간혹 급할때만 하긴하지만 말이다. 그런데, 간혹 c 프로그래밍을 통한 확인 정도만 필요한데 Visual Studio를 쓰기에는 너무 무겁고, cigwin을 깔기에는 뭔가 좀 그렇고.. VMware나 Virtual Box는 더더 무거우니 라즈베리를 꺼내거나 아니면 컴파일 호스트를 켜고 테스트를 하는데... 그 조차도 귀찮기도 하고 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Windows에서 사용할 수 있도록 gcc를 설치하고, 패키지로 gdb도 설치해서 사용할 수 있는 방법을 찾아보았다. 생각보다 간단하게 셋팅이 된다. 뿐만 아니라 Visual Studio Code와 연동해서 gdb의 편리함도 같이 이용할 수 있으니 더 좋지 아니한가!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨋든 잊어버리기 전에 기록을 해둔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. MSYS2 설치&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 소프트웨어 디스트리뷰션 및 빌딩 플랫폼이다. 역시 세상에 있는 많은 개발자님들을 좋아할 수 밖에 없는게, 복잡한걸 간단하게 해주니 고마울 따름이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.msys2.org&quot;&gt;http://www.msys2.org&lt;/a&gt; 에서 msys2-x86-64-yyyymmdd.exe를 다운로드 받아서 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/er4B0F/dJMcafTYL5H/skSBusXHI76R8zpAJycYbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/er4B0F/dJMcafTYL5H/skSBusXHI76R8zpAJycYbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/er4B0F/dJMcafTYL5H/skSBusXHI76R8zpAJycYbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fer4B0F%2FdJMcafTYL5H%2FskSBusXHI76R8zpAJycYbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;584&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 다운로드가 완료되면, 파일 브라우저에서 download 폴더에 다운로드된 msys 실행파일을 더블클릭하여 설치를 진행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLnwf8/dJMcahRLpLk/c2lqjFkori7Z4OyqSIyork/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLnwf8/dJMcahRLpLk/c2lqjFkori7Z4OyqSIyork/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLnwf8/dJMcahRLpLk/c2lqjFkori7Z4OyqSIyork/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLnwf8%2FdJMcahRLpLk%2Fc2lqjFkori7Z4OyqSIyork%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;265&quot; height=&quot;284&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.1. MSYS2 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KhnZX/dJMcacQs1GX/ac4QzQ9manjDoZP5jH36tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KhnZX/dJMcacQs1GX/ac4QzQ9manjDoZP5jH36tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KhnZX/dJMcacQs1GX/ac4QzQ9manjDoZP5jH36tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKhnZX%2FdJMcacQs1GX%2Fac4QzQ9manjDoZP5jH36tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1273&quot; height=&quot;632&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuEq7T/dJMcafNeDhH/AGhkSgykkxFliqmg172Im0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuEq7T/dJMcafNeDhH/AGhkSgykkxFliqmg172Im0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuEq7T/dJMcafNeDhH/AGhkSgykkxFliqmg172Im0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuEq7T%2FdJMcafNeDhH%2FAGhkSgykkxFliqmg172Im0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;353&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.2. 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 터미널이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 패키지 업데이트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8u06f/dJMcacwb9qX/eclwh5IxKs3P31etYqfl7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8u06f/dJMcacwb9qX/eclwh5IxKs3P31etYqfl7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8u06f/dJMcacwb9qX/eclwh5IxKs3P31etYqfl7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8u06f%2FdJMcacwb9qX%2Feclwh5IxKs3P31etYqfl7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1804&quot; height=&quot;599&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 기본 패키지 설치시작&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bddamQ/dJMb997hKRz/SL8QwV1wJQgT76oRSQx3p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bddamQ/dJMb997hKRz/SL8QwV1wJQgT76oRSQx3p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bddamQ/dJMb997hKRz/SL8QwV1wJQgT76oRSQx3p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbddamQ%2FdJMb997hKRz%2FSL8QwV1wJQgT76oRSQx3p1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;469&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;899&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 설치 중간에 네트워크 및 몇몇 사정으로 설치가 오류 메시자가 표시되면, 시작 &amp;gt; msys2를 재실행후 위의 과정을 다시 진행하면 문제가 발생된 패키지를 다시 설치해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 개발관련 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 컴파일러와 GDB등 개발과 관련된 패키지를 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;1085&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LdGJi/dJMcai4ajow/6FvUoxg8dkJKemAbgRPOpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LdGJi/dJMcai4ajow/6FvUoxg8dkJKemAbgRPOpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LdGJi/dJMcai4ajow/6FvUoxg8dkJKemAbgRPOpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLdGJi%2FdJMcai4ajow%2F6FvUoxg8dkJKemAbgRPOpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;733&quot; height=&quot;598&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;1085&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 환경변수 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 환경변수에서 시스템의 path를 선택하여 컴파일러가 설치된 폴더를 넣어주도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 디폴트로 설치했다면 C:\msys64\ucrt64\bin 디렉터리가 설치 폴더이므로 [환경변수 편집] 윈도우에서 [새로 만들기]를 클릭하여 추가하자.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhA8Fv/dJMcabKP8Vn/aI9uKTRjYWghugvoBSKCf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhA8Fv/dJMcabKP8Vn/aI9uKTRjYWghugvoBSKCf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhA8Fv/dJMcabKP8Vn/aI9uKTRjYWghugvoBSKCf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhA8Fv%2FdJMcabKP8Vn%2FaI9uKTRjYWghugvoBSKCf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;381&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 테스트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 설정이 완료되었으면. 시작 메뉴에서 CMD를 입력하여 [명령프롬프트]를 실행한다. 그리고 gcc가 정상적으로 설치되었는지 gcc를 실행하여 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3nAm0/dJMcacbRYye/FLGK8RAo8L4nH570cUn4mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3nAm0/dJMcacbRYye/FLGK8RAo8L4nH570cUn4mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3nAm0/dJMcacbRYye/FLGK8RAo8L4nH570cUn4mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3nAm0%2FdJMcacbRYye%2FFLGK8RAo8L4nH570cUn4mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;316&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 실행된다면, 이제 제대로 컴파일 되는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 컴파일 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.1. edit 명령 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 오.. 에디터 명령은 쓴지 30년도 더된거 같은데..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEonbs/dJMcaarBvAb/rBTODiktUW3bepJHjl2lY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEonbs/dJMcaarBvAb/rBTODiktUW3bepJHjl2lY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEonbs/dJMcaarBvAb/rBTODiktUW3bepJHjl2lY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEonbs%2FdJMcaarBvAb%2FrBTODiktUW3bepJHjl2lY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;795&quot; height=&quot;109&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.2. hello world 소스코드 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 마우스를 사용할 수 잇으니, 메뉴에서 저장하고 정리하면 된다. 단축키는 저장은 Ctrl + S, 종료는 Ctrl + Q이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm25bC/dJMcacJJB6K/eUuaUbqMr6xn4Vl12UGDiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm25bC/dJMcacJJB6K/eUuaUbqMr6xn4Vl12UGDiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm25bC/dJMcacJJB6K/eUuaUbqMr6xn4Vl12UGDiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm25bC%2FdJMcacJJB6K%2FeUuaUbqMr6xn4Vl12UGDiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;202&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.3. 컴파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 컴파일은 다음과 같이 진행하면되는데, 만약 컴파일 했는데도 실행파일이 생성되지 않는 경우라면 V3 같은 백신에서 바이러스로 인식하여 차단한 경우가 된다. 그런경우 백신의 옵션에서 폴더를 허용하여 사용할 수 있도록 해주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4QVdp/dJMcabYlrlN/KnX1QsiqmitcrTpbNbcU81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4QVdp/dJMcabYlrlN/KnX1QsiqmitcrTpbNbcU81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4QVdp/dJMcabYlrlN/KnX1QsiqmitcrTpbNbcU81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4QVdp%2FdJMcabYlrlN%2FKnX1QsiqmitcrTpbNbcU81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;763&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.4. 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이제 다시 컴파일하여 실행 해 보도록 하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일후 파일이 생성되었는지 확인하고 실행하면된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WFEv2/dJMcajaXr2u/rYVnH03Wy6xVyKtBGVX810/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WFEv2/dJMcajaXr2u/rYVnH03Wy6xVyKtBGVX810/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WFEv2/dJMcajaXr2u/rYVnH03Wy6xVyKtBGVX810/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWFEv2%2FdJMcajaXr2u%2FrYVnH03Wy6xVyKtBGVX810%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;268&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제없이 잘 되는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음번에는 Visual Studio Code에서 간단히 연동해보도록 하겠다.&lt;/p&gt;</description>
      <category>Windows/Install and Operating</category>
      <category>Compiler</category>
      <category>c언어</category>
      <category>C언어 공부</category>
      <category>gcc</category>
      <category>gcc for windows</category>
      <category>MSYS2</category>
      <category>무료 c 컴파일러</category>
      <category>용돈생활자의 최애 컴파일러</category>
      <category>윈도우 gcc</category>
      <category>컴파일러</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/336</guid>
      <comments>https://makeutil.tistory.com/336#entry336comment</comments>
      <pubDate>Thu, 30 Apr 2026 02:04:55 +0900</pubDate>
    </item>
    <item>
      <title>[QWEN3-TTS] Text to speech 모델 테스트</title>
      <link>https://makeutil.tistory.com/335</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Qwen3-TTS는 텍스트를 매우 자연스럽고 인간처럼 들리는 음성으로 변환해 주는AI 텍스트-투-스피치(Text-to-Speech, TTS) 모델이라고 한다. 음성 클론, 목소리 디자인, 스트리밍 생성 등을 지원하는 프로덕션-레디(실사용급) TTS 시스템이라고 하는데... 필자가 뭘 잘못했는지는 모르겠지만, Clone의 기능은 아닌거 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OAyvG/dJMcahpJdAt/zQSPLdt8ggkpgZCPiEVa90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OAyvG/dJMcahpJdAt/zQSPLdt8ggkpgZCPiEVa90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OAyvG/dJMcahpJdAt/zQSPLdt8ggkpgZCPiEVa90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOAyvG%2FdJMcahpJdAt%2FzQSPLdt8ggkpgZCPiEVa90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;420&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사실 필자도 유튜브를 보다가 음성 클론 기능이 있는데, 쉽고 괜찮다고 해서 한번 설치해본거라. 필자가 놓쳐서 그랬을 수도 있지만, GPT와 Gemini를 통해서 진행하다보면 결론은 Clone은 아니라고 한다. 필자가 목소리를 10~20초간 녹음한후 소스로 입력하고 실행해본결과 화자의 호흡이나 말하는 속도나 특색 일부를 넣긴하지만, 기본적으로 사전 제공하는 목소리에 입혀져서 나오는 정도인것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고, 해보고 싶은 독자가 있을 수도 있고, 필자가 빠뜨린 부분을 찾아서 사용할 수 있도록 기록을 남긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. Python &lt;/span&gt;설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.1. &lt;/span&gt;파이선 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;아래의 사이트에서 파이선을 다운로드한다&lt;span&gt;. &lt;/span&gt;현재 &lt;span&gt;Qwen3-TTS &lt;/span&gt;관ㄹ녀하여 &lt;span&gt;3.10 ~ 3.11 &lt;/span&gt;버전을 우선시한다&lt;span&gt;. &lt;/span&gt;테스트 버전에서는 &lt;span&gt;3.11.9&lt;/span&gt;를 설치하였다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://www.python.org/downloads/windows/&quot;&gt;https://www.python.org/downloads/windows/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.2. &lt;/span&gt;설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별다른 것 없이 설치를 진행한다&lt;span&gt;. &lt;/span&gt;만약 설치버전에서 &lt;span&gt;Add python to PATH &lt;/span&gt;항목이 표시되면 체크하고 그렇지 않다면 그냥 설치를 진행하고&lt;span&gt;, &lt;/span&gt;완료되면 &lt;span&gt;Close&lt;/span&gt;를 눌러 설치를 종료한다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.3. &lt;/span&gt;테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 아래와 같이 입력하여 설치된 버전을 확인하자&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;python &amp;ndash;version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;py --version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;pip --version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.4. &lt;/span&gt;가상환경 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 이상의&lt;span&gt; python&lt;/span&gt;이 설치되어있다면 가상환경으로 특정 버전을 지정하여 사용할 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.4.1. &lt;/span&gt;가상환경 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;cd c:\tts &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mkdir venv_qwen&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;cd venv_qwen&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;py -3.11 &amp;ndash;m venv venv&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.4.2. &lt;/span&gt;가상환경 활성화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경은 다음과 같이 활성화가 가능하다&lt;span&gt;. &lt;/span&gt;정상적인 경우 프롬프트가 &lt;span&gt;(venv) &lt;/span&gt;가 추가되어 표시 된다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;venv\Scripts\activate &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.5. &lt;/span&gt;관련 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.5.1. &lt;/span&gt;패키지툴 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;python &amp;ndash;m pip install --upgrade pip&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.5.2. &lt;/span&gt;관련 패키지 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;향후 사용할 패키지를 설치한다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;pip install torch transformers accelerate soundfile numpy&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.6. &lt;/span&gt;트러블 슈팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.6.1. &lt;/span&gt;버전이 출력되지 않는경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이선 버전이 출력되지 않는경우는 패스가 설정되지 않았을 수 있다&lt;span&gt;. &lt;/span&gt;설치때 확인이 안되었기 때문에 다음 두 경로를 시스템 환경 변수&lt;span&gt;(path)&lt;/span&gt;를 추가해 주면된다&lt;span&gt;. &lt;/span&gt;파이선이 설치된 경로는 아래와 같고&lt;span&gt;, Scripts &lt;/span&gt;경로에는 &lt;span&gt;pip&lt;/span&gt;등이 포함되어있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;C:\Users\&amp;lt;USER_NAME&amp;gt;AppData\Local\Programs\Python\Python311\&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;C:\Users\&amp;lt;USER_NAME&amp;gt;AppData\Local\Programs\Python\Python311\Scripts\&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.6.2. &lt;/span&gt;앱스토어가 열리는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;만약 정상 설치되어있는 경우라도 선언 위치가 뒷에 있는경우 앱스토어가 먼저 열릴 수 있다&lt;span&gt;. &lt;/span&gt;이경우&lt;span&gt;, &lt;/span&gt;환경 변수에서 두 패스를&lt;span&gt; Appstore &lt;/span&gt;패스보다 위에 두면된다&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. Git &lt;/span&gt;설치&lt;span&gt; (Windows)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2.1. Git &lt;/span&gt;공식 사이트 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자가 설치한 버전은 서치일 기준 &lt;span&gt;2.52&lt;/span&gt;를 설치하였다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;a href=&quot;https://git-scm.com/download/win&quot;&gt;https://git-scm.com/download/win&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8IGEF/dJMcaaYqzvr/0MWg4mrZVqrp7kf8r4Zhq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8IGEF/dJMcaaYqzvr/0MWg4mrZVqrp7kf8r4Zhq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8IGEF/dJMcaaYqzvr/0MWg4mrZVqrp7kf8r4Zhq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8IGEF%2FdJMcaaYqzvr%2F0MWg4mrZVqrp7kf8r4Zhq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;492&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2.2. Select Component&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;설치때 아래의 항목이 나오면 선택&lt;span&gt;(Recommend)&lt;/span&gt;하는 것 제외하고 기본값으로 진행&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;[*] Git from the command line and also from 3rd-party software&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2.3. &lt;/span&gt;설치 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 확인을 위해 &lt;span&gt;cmd&lt;/span&gt;를 열어서 아래와 같이 &lt;span&gt;git &lt;/span&gt;명령을 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;git &amp;ndash;-version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;git version 2.52.0.windows.1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. QWEN3-TTS &lt;/span&gt;설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.1. SOX &lt;/span&gt;설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;아래의 경로에서 &lt;span&gt;SoX(Sound eXchange Files)&lt;/span&gt;를 다운로드한다&lt;span&gt;. &lt;/span&gt;다운로드 버전은 &lt;span&gt;14.4.2&lt;/span&gt;를 설치한다&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://sourceforge.net/projects/sox/files/sox/&quot;&gt;https://sourceforge.net/projects/sox/files/sox/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oan8Q/dJMcadOjx78/VOgz9gDGSNKKjuJKhwa14K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oan8Q/dJMcadOjx78/VOgz9gDGSNKKjuJKhwa14K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oan8Q/dJMcadOjx78/VOgz9gDGSNKKjuJKhwa14K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foan8Q%2FdJMcadOjx78%2FVOgz9gDGSNKKjuJKhwa14K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;442&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 환경변수 &lt;span&gt;path&lt;/span&gt;에 &lt;span&gt;SoX &lt;/span&gt;경로를 추가한다&lt;span&gt;. &lt;/span&gt;해당 소프트웨어는 &lt;span&gt;32&lt;/span&gt;비트만 있으므로&lt;span&gt;, &lt;/span&gt;아래의 경로가 기본 설치 경로가 된다&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;C:\Program Files (x86)\sox-14-4-2\&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 &lt;span&gt;sox --version&lt;/span&gt;을 입력하여 정상적으로 실행되는지 확인한다&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;sox &amp;ndash;version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.2. &lt;/span&gt;설치 디렉터리 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Tts&lt;/span&gt;와 관련하여 사용한 디렉터리&lt;span&gt;(&lt;/span&gt;폴더&lt;span&gt;)&lt;/span&gt;를 생성한다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;cd c:\&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mkdir tts&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;cd tts&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.3. Qwen3-tts &lt;/span&gt;다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;아래의 &lt;span&gt;git&lt;/span&gt;에서 &lt;span&gt;Qwen3-TTS&lt;/span&gt;를 다운로드 한다&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;git clone &lt;a href=&quot;https://github.com/QwenLM/Qwen3-TTS.git&quot;&gt;https://github.com/QwenLM/Qwen3-TTS.git&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.4. &lt;/span&gt;관련 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프로젝트 &lt;span&gt;root&lt;/span&gt;에서 다음과 같이 명령을 입력한다&lt;span&gt;. &lt;/span&gt;현재 프로젝트 경로는 &lt;span&gt;C:\tts\Qwen3-TTS&lt;/span&gt;로 설치가 되었을 것으로 예상되므로 개발을 위해서 아래와 같이 명령을 입력한다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(venv) c:\tts\Qwen3-TTS&amp;gt;pip3 install &amp;ndash;e .&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되었다면 &lt;span&gt;qwen_tts &lt;/span&gt;폴더가 생성되고&lt;span&gt;, &lt;/span&gt;내부에 파일이 있음을 확인할 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.5. &lt;/span&gt;예제 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이 예제는 &lt;span&gt;CPU &lt;/span&gt;기반으로 기존 예제를 수정하였다&lt;span&gt;. &lt;/span&gt;수정한 원본은 &lt;span&gt;custom_voice&lt;/span&gt;이다&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;601&quot;&gt;&lt;span&gt;&lt;span&gt;# coding=utf-8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# Copyright 2026 The Alibaba Qwen team.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# SPDX-License-Identifier: Apache-2.0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# you may not use this file except in compliance with the License.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# You may obtain a copy of the License at&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# Unless required by applicable law or agreed to in writing, software&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# See the License for the specific language governing permissions and&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;# limitations under the License.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;import time&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;import torch&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;import soundfile as sf&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;from qwen_tts import Qwen3TTSModel&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;def main():&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;device = &quot;cpu&quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MODEL_PATH = &quot;Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice&quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;tts = Qwen3TTSModel.from_pretrained(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MODEL_PATH,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;device_map=&quot;cpu&quot;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dtype=torch.float32,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;attn_implementation=&quot;eager&quot;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;# -------- Single (with instruct) --------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#torch.cuda.synchronize()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;t0 = time.time()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;wavs, sr = tts.generate_custom_voice(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;text=&quot;&lt;/span&gt;동해물과 백두산이 마르고 닳도록 하나님이 보우하사 우리 나라만세&lt;span&gt;.&quot;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;language=&quot;Korean&quot;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;speaker=&quot;Vivian&quot;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;instruct=&quot;&lt;/span&gt;부드럽게 말해&lt;span&gt;&quot;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#torch.cuda.synchronize()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;t1 = time.time()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;print(f&quot;[CustomVoice Single] time: {t1 - t0:.3f}s&quot;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;sf.write(&quot;qwen3_tts_test_custom_single.wav&quot;, wavs[0], sr)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;# -------- Batch (some empty instruct) --------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;texts = [&quot;&lt;/span&gt;其&lt;span&gt;实&lt;/span&gt;&lt;span&gt;我&lt;/span&gt;&lt;span&gt;真&lt;/span&gt;&lt;span&gt;的有&lt;/span&gt;&lt;span&gt;发现&lt;/span&gt;&lt;span&gt;，我是一&lt;/span&gt;&lt;span&gt;个&lt;/span&gt;&lt;span&gt;特&lt;/span&gt;&lt;span&gt;别&lt;/span&gt;&lt;span&gt;善于&lt;/span&gt;&lt;span&gt;观&lt;/span&gt;&lt;span&gt;察&lt;/span&gt;&lt;span&gt;别&lt;/span&gt;&lt;span&gt;人情&lt;/span&gt;&lt;span&gt;绪&lt;/span&gt;&lt;span&gt;的人。&lt;/span&gt;&lt;span&gt;&quot;, &quot;She said she would be here by noon.&quot;]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;languages = [&quot;Chinese&quot;, &quot;English&quot;]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;speakers = [&quot;Vivian&quot;, &quot;Ryan&quot;]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;instructs = [&quot;&quot;, &quot;Very happy.&quot;]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#torch.cuda.synchronize()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;t0 = time.time()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;wavs, sr = tts.generate_custom_voice(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;text=texts,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;language=languages,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;speaker=speakers,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;instruct=instructs,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;max_new_tokens=2048,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#torch.cuda.synchronize()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;t1 = time.time()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;print(f&quot;[CustomVoice Batch] time: {t1 - t0:.3f}s&quot;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;for i, w in enumerate(wavs):&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;sf.write(f&quot;qwen3_tts_test_custom_batch_{i}.wav&quot;, w, sr)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;if __name__ == &quot;__main__&quot;:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;main()&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행하면 중국어 같은 음성 &lt;span&gt;2&lt;/span&gt;개와&lt;span&gt;, &lt;/span&gt;애국가 앞소절 한글로 녹음된 파일이 생성된다&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;python test_model_12hz_custom_voice.py&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Windows/Install and Operating</category>
      <category>Python</category>
      <category>qwen</category>
      <category>qwen3</category>
      <category>text to speech</category>
      <category>TTS</category>
      <category>무료로 사용하는건 힘들다</category>
      <category>용돈생활자는 무료를 좋아해</category>
      <category>음성생성 AI</category>
      <category>음성생성 모델</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/335</guid>
      <comments>https://makeutil.tistory.com/335#entry335comment</comments>
      <pubDate>Thu, 29 Jan 2026 23:37:07 +0900</pubDate>
    </item>
    <item>
      <title>[Review] Inkel 페브릭 스피커 (품절템?) - 다이소</title>
      <link>https://makeutil.tistory.com/334</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 아시다시피 용돈으로 생활하는 용돈 생활자이므로 돈이 별로 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자가 어릴적 미디를 해보고 싶어서 SoundBlaster AWE 32나 AWE 64 Gold를 쓸때에도 사용하던 스피커는 친구가 새로 스피커를 사고 싸게 업어왔던 동방 CERN의 10만원대 제품, 그 뒤로 인스피어 2.1, 그담에 Sound Blaster에서 나온 T50 정도이다. 물론 새로 산건 아니고.. 다 업어와서..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자의 시력이 좋지 못한지라 귀는 조금더 뚤려있는편이지만, 이러한 형편에 쓰다가, 결혼하고 나서는 그런데 쓸돈 조차 없으므로, 보통 싸구려 3만원 내외 사운드바를 사다 쓰고 있었는데, 귀차니즘에 노트북으로 영상이나 음악을 듣다보니 이런 스피커는 사치로 느껴졌다. 그러다가 몇몇 유튜버의 후기에 중국산 8~10만원대 스피커이야기가 나오고.. 광군제를 기다렸지만 가격은 내려가지도 않고 해서 포기했다. 그러던중 다이소 품절템 쇼츠를 봤는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인켈의 옜날 역사 모두 다 나오면서 품절템이라고 무적건 사라고 해서 사봤다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;품절템이라 없을 수도 있겠다 했는데... 많이 있었다...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2962&quot; data-origin-height=&quot;1848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yfw4G/dJMcafk6rTL/NFf69pYmLEwU8Gi5kZfoK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yfw4G/dJMcafk6rTL/NFf69pYmLEwU8Gi5kZfoK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yfw4G/dJMcafk6rTL/NFf69pYmLEwU8Gi5kZfoK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyfw4G%2FdJMcafk6rTL%2FNFf69pYmLEwU8Gi5kZfoK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2962&quot; height=&quot;1848&quot; data-origin-width=&quot;2962&quot; data-origin-height=&quot;1848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USB와 볼륨조절 컨트롤 박스... 흠... 오디오 잭은 뭐 스테레오이고.... 5000원..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2533&quot; data-origin-height=&quot;1580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baKK6M/dJMcaihPis6/xvhE1iT4pYRW0428SUmnzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baKK6M/dJMcaihPis6/xvhE1iT4pYRW0428SUmnzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baKK6M/dJMcaihPis6/xvhE1iT4pYRW0428SUmnzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaKK6M%2FdJMcaihPis6%2FxvhE1iT4pYRW0428SUmnzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2533&quot; height=&quot;1580&quot; data-origin-width=&quot;2533&quot; data-origin-height=&quot;1580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USB 전원이고..&amp;nbsp; 출력은 5+5W흠. 출력 컨트롤 박스에 구명이 나있는거로 보아 발열이 있나 싶기도 하고.. 근데 장시간 써봐도 큰 발열은 없었다. 물론, 볼륨을 최대로 올리고 쓸수 없는 환경이니. 저항이나 이런건 볼려면 안을 뜯어야 되는거 같아서 그냥 넘어가기로 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;1788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN2vJ9/dJMcahpG7Ff/K7tm7oSlhpO8ycXFphSB7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN2vJ9/dJMcahpG7Ff/K7tm7oSlhpO8ycXFphSB7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN2vJ9/dJMcahpG7Ff/K7tm7oSlhpO8ycXFphSB7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN2vJ9%2FdJMcahpG7Ff%2FK7tm7oSlhpO8ycXFphSB7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2376&quot; height=&quot;1788&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;1788&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;박스 설명과 같이 전원용 USB, 스테레오 오디오 잭, 그리고 볼륨 조절기 박스.. 오래쓰면 지직 거릴거 같긴하다. 볼륨조절기 박스 하단에는 에어홀이 있다. 별열이 있을 수도 있겠다 싶다. 그런데, 케이블 길이가 130cm인데 스피커 볼륨조절기에서 스피커 유닛까지의 길이는 약 50cm 정도 되는것 같다. 줄을 잘 분리해서 쓰더라도 노트북 정도에서 쓰기 적합한 모델인것 같다. 물론 모니터 아래에 배치해놓고 쓰기에는 나쁨이 없어 보인다만 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;2147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhdmxN/dJMcacIGWrf/OyhmQ9e6Jw6BOrwOAYqfM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhdmxN/dJMcacIGWrf/OyhmQ9e6Jw6BOrwOAYqfM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhdmxN/dJMcacIGWrf/OyhmQ9e6Jw6BOrwOAYqfM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhdmxN%2FdJMcacIGWrf%2FOyhmQ9e6Jw6BOrwOAYqfM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1848&quot; height=&quot;2147&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;2147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스피커는 마감이 그럭저럭 괜찮다. 흠.. 뭐 중국산이고.. 필자가 궁금한건 OEM이나 ODM이냐의 차이인데.. 스피커에 별도로 잭이나 헤드셋을 꼽는 부분은 없다. 그건 맘에 든다. 깔끔해서 들고다니가에도 나쁘지 않아보인다. 그래도 고음역, 중음역, 저음역대 유닛을 들고있는 스피커가 아니니 필자는 필자기준에서 5000원의 가치가 있는지를 알아보고 싶어서 구매한거니까. 그리고 이왕 구매한거 잘 쓰면 장땡이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대 여섯시간 들어본 필자의 결론은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 왜 품절템이래? 정도의 느낌이다. 필자의 느낌에으로는 알리에서 구매한 1만원대의 음질 정도 되는것 같다. 스테레오 잭 문제는 아니겠지만 연결후에도 지지직하는 느낌은 있다. 하지만 잘 돌려주면 괜찮아진다. 그 말은 3.5파이 잭 중에서도 꽉차거나 가격이 조금 있는 잭은 아닌거 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 정리해보자. 필자 기준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 가격 : ■ ■ ■ ■ □ 좋음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 알리에서 1만원대 면, 유닛 2개에 나름 준수한 소리가 난다. 그에 반해서 쪼꼬많하긴 하지만.. 나쁘지 않은 소리가 난다. 물론, 모니터나 노트북 내장 스피커 대비해서 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 디자인 : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt; □ &lt;/span&gt;&lt;/span&gt;□ 보통.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 귀엽다면 귀엽고 깔끔하다면 깔끔한데... inkel 로고가 제품에 비해 너무 크다. 필자가 어렸을 때의 inkel이 지금의 포지션이 아니었으니 가만하더라도, 젊은 친구들한테는 이 이름이 도움이 안될것 같다. 동일 디자인에 좀더 큐트큐트 하게 나오고, 로고도잘 어울리게 배치하고 해야 될것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 마감 : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;■ □ 좋음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;제품 마감은 잘 다듬었다. 사출해서 조립하는 케이스 특성상 저가형들은 마감이 안좋은게 더러 있지만, 잘 다듬어놨다. 바리도 없고.. 마감을 보면서 확인한건 역시나 떼다가 파는 물건인것 같다. 제조사는 중국으로 수입판매원이 별도로 표시되어있다. 사실 그렇지 않고서야 마진까지 다 남겨서 5000원은 국내 생산으로는 말도 안되니까 말이다. 그리고 inkel이 지금 살아있다 한 들 자체 개발보다는 ODM이거나 OEM등을 주로 할것 같다. 대부분의 그정도 레벨의 회사들이 다 그렇게 되었듯말이다. 레인콤(아이리버)이나 PMP만들던 업체들이 다 그러하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 성능 : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;■&lt;span&gt; &lt;/span&gt;&lt;/span&gt;□ 보통.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;유닛 하나짜리 스피커에 큰거 바라기는 어렵고, 음역대의 기준을 어디로 잡았느냐 봐야되는데.. 이어폰도 4, 8, 16, 32옴 짜리가 주로 추구하는 음역대가 다르듯이 말이다. 이 스피커는 일반적인 용도로 쓰기 좋은 정도의 중간대 음역에 맞춰진것 같다. 그래서 그냥 일반적인 노트북이나 모니터의 내장된 스피커 보다는 소리가 괜찮지만, 고음이나 완전 저음은 바라면 안된다. 그래도 5000원대 국내에서 바로 쉽게 구할수 있는 스피커로는 나쁘지 않다고 생각한다. 특히, 5W 구라 앰프인줄 알았는데, 소리가 상당히 큰데도 유닛이 갈라지지 않았다. 필자도 놀라서 바로 소리를 내렸는데, 15초동안 최대치로 들었을 때, 지지지직 또는 프프프픅~ 하는 소리는 들리지 않았다. 물론, 음악에서 베이스가 큰게 들어왔거나 했을때를 봐야되는데, 너무 놀란지라... 그런 테스트는 안할란다. 아파트에서는 욕먹는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여행갈때 들고다닐 목적으로 한다면(노트북 이용시) 괜찮다. 다만, 분위기를 위한 LED는 없으니 가만하고, 노트북이나 스마트폰... 아 요즘에는 3.5파이가 거의 없으니.. 목적은 분명해지겠다. 야튼. 사무실에서 쓰기에는 좋을것 같다. 내장 스피커보다는 나으니까 말이다. 노이즈 가만하더라도 케이블을 별도로 분리할 수 있도록 모노 잭으로 해줬으면 더 좋았을것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 예전에 필자가 회사(11층)에서 일할 때, 주말에 일할 때 아무도 안오니까. 오디오를 2.1 + 2 로 Front + Rear로 셋팅해서 음이 부딧치는 위치를 잘 설정해서 음악을 틀어놓으면 심장이 바운스 하는 느낌을 느끼면서 일을 했었는데 말이다. 컵라면 사러 1층 내려왔는데.... 1층에서도 살짝 음악소리가 들렸다... 그 뒤로는 적당히 썼는데... 아.. 청춘.. &amp;gt;_&amp;lt;&lt;/p&gt;</description>
      <category>Gossip/Review</category>
      <category>INKEL</category>
      <category>다이소</category>
      <category>다이소 스피커</category>
      <category>다이소 품절템</category>
      <category>스피커</category>
      <category>용돈생활자는 오늘도 돈이없다</category>
      <category>인켈</category>
      <category>페브릭 스피커</category>
      <category>회사에서 써야겠다</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/334</guid>
      <comments>https://makeutil.tistory.com/334#entry334comment</comments>
      <pubDate>Sun, 25 Jan 2026 21:05:57 +0900</pubDate>
    </item>
    <item>
      <title>[Raspberry Pi] CANFD 모듈 테스트 - MCP2518FD + ATA6563</title>
      <link>https://makeutil.tistory.com/333</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필자가 이번에 ESP32에서 CANFD를 사용하려고 했는데. 루프백 까지만 되고, 실제 통신이 되지 않았다. 기존에사용하던 MCP2525등을 붙혀서 테스트를 하려다가 이왕 하는거 CANFD를 사용하는게 좀더 좋을 것 같아서 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨋거나 실제 통신이 되지 않아서 라즈베리파이에서 이 모듈이 정상적인지 아닌지 판단을 해야되는 상황에 이르러 테스트를 진행했다. 펌웨어로 동작시키는 것 보다는 훨씬 편하니까 말이다. 만약, 정상 동작이 된다면 다시 ESP32에 붙혀봐야겠다. 이런저런 것들을 해볼수 있을것 같아 기대가 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그러면 라즈베리파이에서 정상동작을 하는지 확인해보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 준비물&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 라즈베리파이 2대 물론, nCS로 나누면 1개만 있어도 될것 같지만, 확실한 테스트를 위해서 2개를 준비했다. 그리고 알리에서 구매한 CAN-FD 모듈 2대씩 준비하고, 점퍼케이블은 전원포함하여 라즈베리파이당 7개가 필요하다. 그리고 양 CAN을 연결하기 위한 연선 3줄을 준비하면 되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.1. 기본준비물&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 라즈베리파이 2대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 라즈베리파이 전원 2개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) 기타 필요한 것들...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.2. CANFD 관련&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) CANFD 모듈 2개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 라즈베리파이 연결용 점퍼 14개(2세트 분량, 가능하면 동일색상 페어로 준비)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) CAN 통신케이블 3개 (H, L, GND)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 모듈 연결정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.1. 모듈 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 다음은 구매한 모듈의 정보이다. MCP2518FD로 검색하면 저가형은 대부분 이 제품이 나오는 것같다. 가격은.. 흉폭스럽게 11000원이 넘는다. 큼.. 테스트 하려면 2개는 사야되니까...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 모듈형상 및 가격&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHkxq6/dJMcahwiFRe/9ScA2IvD7tb7NxikE5dwK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHkxq6/dJMcahwiFRe/9ScA2IvD7tb7NxikE5dwK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHkxq6/dJMcahwiFRe/9ScA2IvD7tb7NxikE5dwK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHkxq6%2FdJMcahwiFRe%2F9ScA2IvD7tb7NxikE5dwK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;808&quot; height=&quot;532&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 얻을 수 있는 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 얻을 수 잇는 정보는 핀 맵 정도이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRzybD/dJMcabbMD4N/uQpABHch1P1VR1cbglCmWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRzybD/dJMcabbMD4N/uQpABHch1P1VR1cbglCmWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRzybD/dJMcabbMD4N/uQpABHch1P1VR1cbglCmWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRzybD%2FdJMcabbMD4N%2FuQpABHch1P1VR1cbglCmWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;677&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.2. 라즈베리파이와 모듈의 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 라즈베리파이와 모듈은 다음과 같이 연결 하였다. 아쉽게도 구매한 모듈의 트랜시버는&amp;nbsp; 5v로 동작하고, mcp2518fd 는 3.3v로 동작하기 때문에 전원을 별도로 넣어주어야 한다. 만약, 아두이노 같은 5v 전원을 사용하는 MCU등에서는 모듈의 전원공급핀(필자가 구매한 모듈의 경우 P2)는 쇼트 시키지 않아야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4aJNb/dJMcabJDq6k/agi6sV6PTJUPKAvApzw3q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4aJNb/dJMcabJDq6k/agi6sV6PTJUPKAvApzw3q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4aJNb/dJMcabJDq6k/agi6sV6PTJUPKAvApzw3q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4aJNb%2FdJMcabJDq6k%2Fagi6sV6PTJUPKAvApzw3q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;412&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;잘 연결했다면 CAN모듈의 입출력 터미널에서 LED가 점등이 되었다. ESP32에서 진행할 때 5V를 따로 공급하지 않아서 문제가 있었던 것 같다. 테스트 끝나면 다시 해봐야겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.3. CANFD 모듈간 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CANFD 모듈과 CAN 모듈은 연선을 사용하여 H/L/GND를 모두 연결해준다. 그리고 1:1로 연결하여 테스트를 진행하는 상황이면 짧은 거리면 크게 문제가 되지 않을 수 있지만 종단저항 핀(P3)를 쇼트 시켜주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dq3aA/dJMcagKWcSr/EyAYttlALRKMu2AWfkOT0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dq3aA/dJMcagKWcSr/EyAYttlALRKMu2AWfkOT0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dq3aA/dJMcagKWcSr/EyAYttlALRKMu2AWfkOT0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDq3aA%2FdJMcagKWcSr%2FEyAYttlALRKMu2AWfkOT0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;811&quot; height=&quot;176&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 라즈베리파이 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 라즈베리파이는 라즈베리파이 OS를 적당히설치하면 된다. 테스트를 위한 장치 2대 모두 업데이트 해두도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.1. 기본 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 기본적인 업데이트는 해주도록 하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 업데이트 내용확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; # sudo apt update&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 업그레이드 할것 같으면 업그레이드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; # sudo apt upgrade&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.2. CAN/CANFD 관련 도구 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 캔 모듈을 통해 간단히 테스트하기 위한 도구를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;# sudo apt install can-utils vim&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.3. CAN 사용을 위한 라즈베리파이 환경설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 대부분 우리가 구매할 수 있는 CAN 모듈은 SPI 인터페이스를 사용한다. 따라서 SPI를 활성화 하고, CAN에 대한 환경을 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) SPI 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; SPI를 설정하려면, 터미널을 실행하거나 라즈베리파이 메뉴에서 raspberry pi configuration 항목을 선택하여 SPI를 On 시키면 된다. 필자가 오랜만에 확인해보니 메뉴 찾기가 귀찮아서 그냥 터미널에서 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# sudo raspi-config&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 화면이 표시되면 Interface Option &amp;gt; SPI 를 선택하고 SPI를 Enable로 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A5BIz/dJMcagjRayA/0XpxBIpQjYKFJVtAckEc4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A5BIz/dJMcagjRayA/0XpxBIpQjYKFJVtAckEc4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A5BIz/dJMcagjRayA/0XpxBIpQjYKFJVtAckEc4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA5BIz%2FdJMcagjRayA%2F0XpxBIpQjYKFJVtAckEc4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;241&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리부팅을 해도 되지만, 우선 수정할게 더 있으니 편하실 대로 하시고, 터미널에서 부트 설정을 수정해 주도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) CAN 모듈 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 라즈베리파이에 CANFD를 알아차릴 수 있도록 설정을 추가해 주도록 하자. 예전에는 /boot/config.txt 였지만 현재에는 /boot/fimrware/config.txt를 수정해야된다. 바뀐지 1년은 넘은것 같은데... 오랜만에 해보는 독자도 있을테니, 물론 /boot/config.txt를 열면 딴데가서 수정하라는 내용이 표시되어있다. 수정 할 파일을 열어서 앞서 진행결과로 추가된 dtparam=spi=on 아래에 아래의 값을 입력한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; dtoverlay라고 되어있으니 이 파일은 기존 라즈베리파이의 dtb에 특정 옵션을 추가하기 위해서 사용되는 파일임을 생각해볼수 있겠다. 뭐 중요한 것은 아니고, 그 아래 아래의 내용을 넣어주는데, 설명은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사용하는 칩은 mcp251xfd 칩이고, SPI0(cs도 0)이고 오실레이터는 필자가 확인한 바로는 H20.00으로 적혀있어, 20Mhz가 아닐까해서 해봤는데 잘되는걸로 봐서 맞는거 같다. 그리고 20Mhz까지 사용할 수 있을것 같은데, 필자는 점퍼 케이블을 사용했으니 안전빵으로 SPI는 10Mhz 로 설정해두었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dtoverlay=mcp251xfd,spi0-0,interrupt=25,oscillator=20000000,spi-max-frequency=10000000 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJl0pF/dJMcabQnOYm/NXk3BMNKkcAzcYvMRTPKQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJl0pF/dJMcabQnOYm/NXk3BMNKkcAzcYvMRTPKQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJl0pF/dJMcabQnOYm/NXk3BMNKkcAzcYvMRTPKQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJl0pF%2FdJMcabQnOYm%2FNXk3BMNKkcAzcYvMRTPKQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;273&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 저장하고 나와서 이제 리부팅을 하면 된다. 이 모듈을 항상 사용할 것이라면, 부트 스크립트에 넣어서 항상 초기화 되게 만들면 되고, 필자는 굳이 그럴필욘 없어서 그냥 커맨드를 입력하고 쓰기로 했다. 왜냐면 ESP32에서 사용할 녀석들이라 만ㄹ이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 통신 테스트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 자 이제 사용하고자 하는 두가지 모듈을 동일하게 설정하여 테스트를 진행하면 된다. 필자가 귀차니즘으로 하나만 표시하더라도 라즈베리파이 둘 모두 동일하게 테스트 해주면 되겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.1. 링크업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 리눅스에서는 CAN도 네트워크와 동일하게 처리되기 때문에 ip 명령으로 설정하고, ifconfig 명령으로 상태를 확인할 수 있다. 물론, can-utils를 더 많이 사용하겠지만 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 링크를 했었다면, CAN0의 링크를 내리고, CANFD로 설정한다. 그리고 링크를 붙히면 되겠다. bitrate와 dbitrate는 테스트를 진행하면서 어느정도 까지 되는지 직접 설정해서 결과를 얻기를 바란다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# sudo ip link set can0 down &lt;br /&gt;# sudo ip link set can0 type can bitrate 500000 dbitrate 1000000 fd on &lt;br /&gt;# sudo ip link set can0 up&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.2. 테스트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 라즈베리파이 두 모델에서 테스트를 진행하자.&amp;nbsp;터미널 2개를 띄우고 편의상 좌, 우 터미널이라 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) CAN-FD의 데이터 형식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 데이터 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예전에 cansend를 써서 테스트를 할 때는 &amp;lt;CAN ID&amp;gt;#[DATA(1~8Byte)] 형식으로 보냈다. CAN-FD에서는 다음과 같은 형식으로 데이터를 보내야 한다. DLC표기상 0~F까지로 표시할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;lt;CAN_ID&amp;gt;##&amp;lt;Flag&amp;gt;[Data(1~8, 12(9), 16(A), 20(B), 24(C), 32(D), 48(E), 64(F) Bytes)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 따라서 데이터를 몇바이트를 통해 통신을 할 지 선택해서 통신 프로그램을 만들어야 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 플래그&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;0 - 저속 : 중재구간과 같은 속도로 데이터를 송수신하여 저속 동작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1 - BRS(Bit Rate Switch) : 중재구간과 데이터구간의 비트레이트를 다르게 사용하여 고속 동작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2 - Error Passive : 에러 상태 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3 - BRS + Error Passive : FD에서 고속으로 동작하고 에러상태 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 첫번째 라즈베리파이 좌측 터미널&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CAN버스에 들어오는 모든 데이터를 출력하기 위해서 dump를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# candump can0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 첫번째 라즈베리파이 우측 터미널&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CAN버스를 통해서 데이터를 송신하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#&amp;nbsp; cansend can0 100##111223344556677888877665544332211&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령을 실행하면 실행한쪽 좌측 터미널 candump에 보낸 데이터가 출력되고, 두번째 라즈베리파이의 candump에도 먼저보낸 데이터가 출력된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 두번째 라즈베리파이 우측 터미널에서 동일하게 입력해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#&amp;nbsp; cansend can0 200##188776655443322111122334455667788&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령이 실행되면 두번째 라즈베리파이 좌측 터미널에는 우측터미널에서 입력한 데이터가 표시되고 첫번째 라즈베리파이 좌측 dump 터미널에 두번째 라즈베리파이가 보낸 데이터가 출력된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.3. 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 라즈베리파이 1번의 좌, 우 터미널&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2bDgh/dJMcabbMEVF/fF0nDpgUrGVDjzUI51z0Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2bDgh/dJMcabbMEVF/fF0nDpgUrGVDjzUI51z0Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2bDgh/dJMcabbMEVF/fF0nDpgUrGVDjzUI51z0Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2bDgh%2FdJMcabbMEVF%2FfF0nDpgUrGVDjzUI51z0Q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;370&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 라즈베리파이 2번의 좌우 터미널&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buKyu4/dJMcahpx5dN/6EDZ2FDJpNtyWdKV2XQy6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buKyu4/dJMcahpx5dN/6EDZ2FDJpNtyWdKV2XQy6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buKyu4/dJMcahpx5dN/6EDZ2FDJpNtyWdKV2XQy6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuKyu4%2FdJMcahpx5dN%2F6EDZ2FDJpNtyWdKV2XQy6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;370&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로서 정상적으로 통신이 되는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 기타 (조금 중요 ***)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 만약 클래식 CAN으로만 사용하고 싶다면 다음과 같이 설정하여 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.1. 장치 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 장치를 다음과 같이 설정하여 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; # sudo ip link set can0 down &lt;br /&gt;&amp;nbsp; # sudo ip link set can0 type can bitrate 500000 fd off &lt;br /&gt;&amp;nbsp; # sudo ip link set can0 up&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두개의 라즈베리를 모두 동일하게 하고 명령을 존송하면 양쪽 candump에 송수신한 모든 데이터가 표시된다. 그런데 말이다. 만약 한쪽은 FD이고 다른 한쪽은 Classic이면 어떻게 될까?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.2. 두 라즈베리파이중 하나만 Classic CAN인경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두 장치 모두가 아닌 하나의 장치만 Classic CAN으로 설정을 하고, 동일하게 터미널 2개를 실행하여 dump와 send로 전송을 하면, CANFD에는 정상적으로 데이터가 수신되지만, 반대로 CANFD에서 CAN형식 또는 CANFD 형식으로 데이터를 보내면, Classic CAN으로 설정된 장치에는 데이터가 수신되지 않는다. 보통 우리는 이런것을 하위호환 이라고 이야기 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접한번 해보시기 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Open Source Hardware/RaspberryPi  Series</category>
      <category>can</category>
      <category>CANFD</category>
      <category>CANFD 통신</category>
      <category>CAN통신</category>
      <category>MCP2518FD</category>
      <category>MCP251x CANFD</category>
      <category>Yes I can</category>
      <category>라즈베리파이</category>
      <category>라즈베리파이 CANFD</category>
      <category>용돈개발자는 돈이 필요하게 되었다. 병원비...</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/333</guid>
      <comments>https://makeutil.tistory.com/333#entry333comment</comments>
      <pubDate>Thu, 1 Jan 2026 22:20:21 +0900</pubDate>
    </item>
    <item>
      <title>[ESP32] Wiznet W5500 (SPI) 적용</title>
      <link>https://makeutil.tistory.com/332</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 블로그에 글을 남긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 지난 7월부터 12월 초까지 회사일과 집안일 때문에 정신이 없다가 이제 회사일은 끝내논 상태라 조금 여유가 생겼다. 그렇다고 해도 끊어지지 않는다. 이건 팔자에 가깝다고 본다. 어쨋든 틈틈히 진행한 것들은 많은데 정리를 어떻게 할지를 고민하고 있다. 퇴근하고 글을 적는게 그리 쉬운일이 아니고, 주말은 또 주말대로 너무 바쁘다. 그렇지만, 잊어버리지 않기 위해서 차근차근 업데이트를 하려고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중에서 최근 필자가 해보고 싶었던 ESP32에 Ethernet을 연결하여 사용하는 것이다. 그러면 뭐 간단하게는 유무선 공유기 같은 녀석으로도 만들수 있을 것같고 해서 말이다. 물론, 시중에서 싼걸 구매해서 쓰는게 훨씬 낫겠지만, 앞으로 필자가 개발하는 시스템에서 이러한 녀석이 필요할 지도 모른다는 생각이들어서 미리 진행해보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 개발환경&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 필자가 진행한 개발환경은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 하드웨어 : ESP32-S3-DevKitC-1 v 1.1 (정품)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 소프트웨어 : Visual Studio Code + ESP-IDF 5.4.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7U4Jk/dJMb99Zd1ou/H1HBVQKSpr48QKhsSbhQbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7U4Jk/dJMb99Zd1ou/H1HBVQKSpr48QKhsSbhQbk/img.png&quot; data-alt=&quot;필자가 플랙스한 espressif 정품 S3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7U4Jk/dJMb99Zd1ou/H1HBVQKSpr48QKhsSbhQbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7U4Jk%2FdJMb99Zd1ou%2FH1HBVQKSpr48QKhsSbhQbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;355&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필자가 플랙스한 espressif 정품 S3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 소스코드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 소스코드는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 95.814%; height: 36px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;#include&amp;nbsp;&amp;lt;string.h&amp;gt; &lt;br /&gt;#include&amp;nbsp;&quot;esp_log.h&quot; &lt;br /&gt;#include&amp;nbsp;&quot;esp_event.h&quot; &lt;br /&gt;#include&amp;nbsp;&quot;nvs_flash.h&quot; &lt;br /&gt;#include&amp;nbsp;&quot;esp_netif.h&quot; &lt;br /&gt;&lt;br /&gt;#include&amp;nbsp;&quot;driver/spi_master.h&quot; &lt;br /&gt;#include&amp;nbsp;&quot;driver/gpio.h&quot; &lt;br /&gt;&lt;br /&gt;#include&amp;nbsp;&quot;esp_eth.h&quot; &lt;br /&gt;#include&amp;nbsp;&quot;esp_eth_mac.h&quot; &lt;br /&gt;#include&amp;nbsp;&quot;esp_eth_phy.h&quot; &lt;br /&gt;#include&amp;nbsp;&quot;esp_eth_netif_glue.h&quot; &lt;br /&gt;&lt;br /&gt;#include&amp;nbsp;&quot;esp_system.h&quot; &lt;br /&gt;&lt;br /&gt;static&amp;nbsp;const&amp;nbsp;char&amp;nbsp;*TAG&amp;nbsp;=&amp;nbsp;&quot;W5500&quot;; &lt;br /&gt;&lt;br /&gt;// ESP32의 IP 설정 -----------------&lt;br /&gt;#define&amp;nbsp;PIN_MOSI&amp;nbsp;11 &lt;br /&gt;#define&amp;nbsp;PIN_MISO&amp;nbsp;13 &lt;br /&gt;#define&amp;nbsp;PIN_SCLK&amp;nbsp;12 &lt;br /&gt;#define&amp;nbsp;PIN_CS&amp;nbsp;&amp;nbsp;&amp;nbsp;10 &lt;br /&gt;#define&amp;nbsp;PIN_INT&amp;nbsp;&amp;nbsp;9 &lt;br /&gt;#define&amp;nbsp;PIN_RST&amp;nbsp;&amp;nbsp;3 &lt;br /&gt;&lt;br /&gt;#define&amp;nbsp;SPI_HOST&amp;nbsp;SPI2_HOST &lt;br /&gt;&lt;br /&gt;static esp_netif_t *s_eth_netif = NULL;&lt;br /&gt;static&amp;nbsp;esp_eth_handle_t&amp;nbsp;eth_handle&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// ESP32에서 링크가 붙으면 발생되는 이벤트에 대한 처리를 위함.&lt;br /&gt;static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t&amp;nbsp;event_id,&amp;nbsp;void&amp;nbsp;*event_data) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(event_id)&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;ETHERNET_EVENT_CONNECTED: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_LOGI(&quot;ETH&quot;,&amp;nbsp;&quot;Link&amp;nbsp;Up&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ESP32에서 SPI기반의 W5500 사용 시, Eth가 시작된 이후 DHCP가 진행되는 타이밍이 틀어지면 IP를 받지 못함&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 따라서, 이벤트에서 커넥트가 되면 바로 DHCP 클라이언트 기능을 시작시키도록 해야함.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_netif_dhcpc_start(s_eth_netif));&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;ETHERNET_EVENT_DISCONNECTED: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_LOGI(&quot;ETH&quot;,&amp;nbsp;&quot;Link&amp;nbsp;Down&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 링크가 끊어지면 DHCP Client도 중단.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp_netif_dhcpc_stop(s_eth_netif); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// ESP32에서 ip 이벤트가 발생시 처리를 위한 핸들러이다.&amp;nbsp;&lt;br /&gt;static void got_ip_event_handler(void *arg, esp_event_base_t event_base,&amp;nbsp;int32_t&amp;nbsp;event_id,&amp;nbsp;void&amp;nbsp;*event_data) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; // IP가 할당되면 할당된 IP를 출력한다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip_event_got_ip_t&amp;nbsp;*event&amp;nbsp;=&amp;nbsp;(ip_event_got_ip_t&amp;nbsp;*)&amp;nbsp;event_data; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_LOGI(TAG, &quot;Assigned IP from DHCPs : &quot; IPSTR, IP2STR(&amp;amp;event-&amp;gt;ip_info.ip)); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// ESP32의 main()으로 모든 장치를 초기화 하고&amp;nbsp; 이더넷 장치를 시스템에 등록한다.&lt;br /&gt;void&amp;nbsp;app_main(void) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(nvs_flash_init()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_netif_init()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_event_loop_create_default()); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(gpio_install_isr_service(0)); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;네트워크&amp;nbsp;인터페이스&amp;nbsp;생성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp_netif_config_t&amp;nbsp;netif_cfg&amp;nbsp;=&amp;nbsp;ESP_NETIF_DEFAULT_ETH(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s_eth_netif&amp;nbsp;=&amp;nbsp;esp_netif_new(&amp;amp;netif_cfg); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;핸들러&amp;nbsp;등록 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT,&amp;nbsp;ESP_EVENT_ANY_ID,&amp;nbsp;&amp;amp;eth_event_handler,&amp;nbsp;NULL)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT,&amp;nbsp;IP_EVENT_ETH_GOT_IP,&amp;nbsp;&amp;amp;got_ip_event_handler,&amp;nbsp;NULL)); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Wiznet&amp;nbsp;W5500&amp;nbsp;리셋&amp;nbsp;핀&amp;nbsp;설정&amp;nbsp;및&amp;nbsp;리셋&amp;nbsp;진행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpio_config_t&amp;nbsp;rst_cfg&amp;nbsp;=&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.pin_bit_mask&amp;nbsp;=&amp;nbsp;1ULL&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;PIN_RST, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.mode&amp;nbsp;=&amp;nbsp;GPIO_MODE_OUTPUT, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpio_config(&amp;amp;rst_cfg); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpio_set_level(PIN_RST,&amp;nbsp;0); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vTaskDelay(pdMS_TO_TICKS(100)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpio_set_level(PIN_RST,&amp;nbsp;1); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vTaskDelay(pdMS_TO_TICKS(100)); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;INT&amp;nbsp;핀을&amp;nbsp;풀업으로&amp;nbsp;설정한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpio_config_t&amp;nbsp;int_cfg&amp;nbsp;=&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.pin_bit_mask&amp;nbsp;=&amp;nbsp;1ULL&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;PIN_INT, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.mode&amp;nbsp;=&amp;nbsp;GPIO_MODE_INPUT, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.pull_up_en&amp;nbsp;=&amp;nbsp;GPIO_PULLUP_ENABLE, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpio_config(&amp;amp;int_cfg); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;SPI&amp;nbsp;버스&amp;nbsp;설정&amp;nbsp;및&amp;nbsp;초기화&amp;nbsp;진행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spi_bus_config_t&amp;nbsp;buscfg&amp;nbsp;=&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.mosi_io_num&amp;nbsp;=&amp;nbsp;PIN_MOSI, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.miso_io_num&amp;nbsp;=&amp;nbsp;PIN_MISO, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.sclk_io_num&amp;nbsp;=&amp;nbsp;PIN_SCLK, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.quadwp_io_num&amp;nbsp;=&amp;nbsp;-1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.quadhd_io_num&amp;nbsp;=&amp;nbsp;-1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.max_transfer_sz&amp;nbsp;=&amp;nbsp;4096, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(spi_bus_initialize(SPI_HOST,&amp;nbsp;&amp;amp;buscfg,&amp;nbsp;SPI_DMA_CH_AUTO)); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// SPI 디바이스 설정 - 길이가 긴 와이어로 했더니 20M는 정상동작이 안되는 문제가 있었다. 그래서 8M로 설정.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spi_device_interface_config_t&amp;nbsp;devcfg&amp;nbsp;=&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.clock_speed_hz&amp;nbsp;=&amp;nbsp;8&amp;nbsp;*&amp;nbsp;1000&amp;nbsp;*&amp;nbsp;1000, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.mode&amp;nbsp;=&amp;nbsp;0, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.spics_io_num&amp;nbsp;=&amp;nbsp;PIN_CS, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.queue_size&amp;nbsp;=&amp;nbsp;20, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eth_w5500_config_t&amp;nbsp;w5500_config&amp;nbsp;=&amp;nbsp;ETH_W5500_DEFAULT_CONFIG(SPI_HOST,&amp;nbsp;&amp;amp;devcfg); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w5500_config.int_gpio_num&amp;nbsp;=&amp;nbsp;PIN_INT; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;이더넷&amp;nbsp;및&amp;nbsp;맥&amp;nbsp;설정 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eth_mac_config_t&amp;nbsp;mac_config&amp;nbsp;=&amp;nbsp;ETH_MAC_DEFAULT_CONFIG(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eth_phy_config_t&amp;nbsp;phy_config&amp;nbsp;=&amp;nbsp;ETH_PHY_DEFAULT_CONFIG(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;설정된&amp;nbsp;맥&amp;nbsp;및&amp;nbsp;파이&amp;nbsp;적용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp_eth_mac_t&amp;nbsp;*mac&amp;nbsp;=&amp;nbsp;esp_eth_mac_new_w5500(&amp;amp;w5500_config,&amp;nbsp;&amp;amp;mac_config); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp_eth_phy_t&amp;nbsp;*phy&amp;nbsp;=&amp;nbsp;esp_eth_phy_new_w5500(&amp;amp;phy_config); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;맥과&amp;nbsp;파이등&amp;nbsp;정보를&amp;nbsp;이용하여&amp;nbsp;이더넷&amp;nbsp;설정&amp;nbsp;및&amp;nbsp;장치&amp;nbsp;설치 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp_eth_config_t&amp;nbsp;eth_config&amp;nbsp;=&amp;nbsp;ETH_DEFAULT_CONFIG(mac,&amp;nbsp;phy); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_eth_driver_install(&amp;amp;eth_config,&amp;nbsp;&amp;amp;eth_handle)); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;W5500의&amp;nbsp;경우&amp;nbsp;MAC&amp;nbsp;정보가&amp;nbsp;없는&amp;nbsp;경우가&amp;nbsp;대부분이다.&amp;nbsp;MAC이&amp;nbsp;없는경우,&amp;nbsp;공유기등에서 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;차단시킬&amp;nbsp;수&amp;nbsp;있으므로,&amp;nbsp;임의로&amp;nbsp;MAC을&amp;nbsp;지정해주어야&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;eth_mac[6]&amp;nbsp;=&amp;nbsp;{&amp;nbsp;0x12,&amp;nbsp;0x34,&amp;nbsp;0x56,&amp;nbsp;0x78,&amp;nbsp;0x90,&amp;nbsp;0xab&amp;nbsp;}; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_eth_ioctl(eth_handle,&amp;nbsp;ETH_CMD_S_MAC_ADDR,&amp;nbsp;eth_mac)&amp;nbsp;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_netif_attach(s_eth_netif,&amp;nbsp;esp_eth_new_netif_glue(eth_handle))); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;이더넷&amp;nbsp;장치를&amp;nbsp;시작한다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ESP_ERROR_CHECK(esp_eth_start(eth_handle)); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 실형결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 빌드를 진행하고 펌웨어를 다운로드(퓨징)하고, 터미널을 통해 확인된&amp;nbsp; 실행 결과는 아래와 같다. 크리티컬한 경고나 오류가 발생되지 않음을 확인할 수 있다. 그리고 맥어드레스도 12:34:56:78:90:ab로 설정된 것을 확인할 수 있고 말이다. 마지막으로 DHCP를 통해 할당받은 ip, mask, gw가 표시됨을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXC3v6/dJMcajgqhC4/KTiSNK8BAV0Nw0mXBi9KA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXC3v6/dJMcajgqhC4/KTiSNK8BAV0Nw0mXBi9KA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXC3v6/dJMcajgqhC4/KTiSNK8BAV0Nw0mXBi9KA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXC3v6%2FdJMcajgqhC4%2FKTiSNK8BAV0Nw0mXBi9KA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;252&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 PC에서 ESP32로 Ping을 보내보면 다음과 같이 정상적으로 전송되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mqlZo/dJMcafSGnHa/mqn1dIFAbNQs2d5V2Bw3L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mqlZo/dJMcafSGnHa/mqn1dIFAbNQs2d5V2Bw3L1/img.png&quot; data-alt=&quot;PC에서 Ping 테스트를 진행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mqlZo/dJMcafSGnHa/mqn1dIFAbNQs2d5V2Bw3L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmqlZo%2FdJMcafSGnHa%2Fmqn1dIFAbNQs2d5V2Bw3L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;273&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PC에서 Ping 테스트를 진행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이정도 했으면, 이제 무선으로 부터 데이터를 받아 유선 이더넷으로 보내거나. 반대의 경우도 충분히 만들수 있겠다. 전에 무선하고 웹 서버도 했었으니 다 합치면 간단한 AP장비를 만들어 사용할수 도 있고, 유무선 통신을 위해서 작은 소형장치가 필요하다면, 유선 장비를 무선장비로 쉽게 바꿀수 있다. 게다가 굳이 시리얼로 변경하지 않고 네트워크로 말이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Firmware/Micro Controller</category>
      <category>esp32</category>
      <category>esp32 펌웨어</category>
      <category>esp32-s3</category>
      <category>Ethernet</category>
      <category>Firmware</category>
      <category>SPI Ethernet</category>
      <category>W5500</category>
      <category>WIZnet</category>
      <category>용돈개발자의 저렴한 개발 이야기</category>
      <category>펌웨어</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/332</guid>
      <comments>https://makeutil.tistory.com/332#entry332comment</comments>
      <pubDate>Mon, 15 Dec 2025 00:49:29 +0900</pubDate>
    </item>
    <item>
      <title>[잡담] 같이 일할 사람이 없습니다.</title>
      <link>https://makeutil.tistory.com/331</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;올해 들어서 회사에 신입사원들이 많이 입사하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고, 퇴사도 있었고, 한명은 지원부서로 변경되었고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 맨날 바쁘다가 올해도 추석에도 일하게 생겼네요...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신입은 계속 뽑고있는데, 사실 큰거 바라지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성실함과 커뮤니케이션만 있으면 충분히 키워줄 수 있는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그게 맞는 사람이 드문가 봅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사는 계속 커가고, 일은 많아지는데 충원은 안되고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경력은 말도 안되는 연봉을 부르고..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대기업도아닌 중소기업에... 5-7년차 평균 희망연봉이 상식을 충분히 넘어가버려서..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴거면 대기업을 지원해야지..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년다니고 그만두고 이직하면서 4-500올리고, 또 1년다니고 이직하면서 4-500 올리고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 몇번 하다보니, 기존 이력은 망가져 있고, 제대로 일을 하지도 않은것 같은데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직전 연봉이 말도 안되게 높은분들도 많습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 그런분이 제대로 일이나 할 수 있을지 의문이기도 하고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 안뽑죠. 그 결과 신입이라도 제대로된 친구라면 키워서 다른데 보내는 상황이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연출되더라도 해보려고 하는데, 그 조차 녹녹치 않네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-3, 4년제 졸업하고 군대 다녀오고, 편의점 알바 6개월 하다가 국비학원에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 6개월해봐야.. 현업에 쓰지도 못할 분더러, 하루는 노력좀 하는게 어떻냐고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하니까, 학교에서도 학원에서도 &quot;회사들어가면 배웁니다.&quot; 라고 했다고 제대로 가르쳐주지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;않는 회사가 잘못되었다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 푸서리네요. 추석때 일해야되니까..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고향에도 못가고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아울러 우리 자라나는 새싹 신입들에게 한마디 한다면...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대기업 또는 네카라쿠배인지 뭐시긴지 거기 갈 능력 안되면 눈 높이 낮추시고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국비학원 다녀봐야 제대로 배우지도 못하고 시간날리고, 도움안되고, 이력서에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적어놔봐야 아무도 인정안해주니까..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인이 하고 싶은것 책 잘골라서 공부하고 유튜브나 동영상등 학습 사이트에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본은 갖추고, 포트폴리오 들고 다니시길 바랍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챗 지피티 쓰지말고 공부하세요. 코드 만들어줘도 디버깅을 못하면 의미가 없어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜히 그렇게 했다가 현업에서는 쌍코피 터집니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스스로 개발하는데 문제가 없는 사람이 챗 지피티로 개발 시간을 단축시키는데 이용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 쉽게 만들었다고 좋아하다가 통합 하면서 털리느니, 책사서 공부하면서 스스로 깨우치시길&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;최소한 배울때는 말이죠....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Gossip/Story</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/331</guid>
      <comments>https://makeutil.tistory.com/331#entry331comment</comments>
      <pubDate>Sat, 4 Oct 2025 20:20:01 +0900</pubDate>
    </item>
    <item>
      <title>Variscite i.MX8M-Mini 리비전에 따른 청천벽력!</title>
      <link>https://makeutil.tistory.com/330</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 2016년 i.MX6 Quad Plus부터 실질적으로 NXP(구, Freescale)의 ARM Core 프로세서의 BSP와 애플리케이션을 개발하기 시작했습니다. 그리고 반도체 장비업체에는 Samsung Artix와 i.MX8M Mini/Plus/Quad등 여러 유사 종류의 프로세서로 개발을 했지요. 그런데, 이번에 부품이 대단위로 단종되었는지 잘 사다 쓰던 SoM(System on Module)의 버전이 크게 변경되었습니다. Variscite사의 모듈이 크기도 작고, 필요한 내용은 자사에서 공개를 해놓은편이라 주로 썼었는데... 아... 이제 여기도 끝인가 봅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c37TXx/btsPHlsp633/M8a5AwBR3J6iuJX8W3nKh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c37TXx/btsPHlsp633/M8a5AwBR3J6iuJX8W3nKh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c37TXx/btsPHlsp633/M8a5AwBR3J6iuJX8W3nKh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc37TXx%2FbtsPHlsp633%2FM8a5AwBR3J6iuJX8W3nKh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;201&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Variscite SoM 모듈의 장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Variscite 사의 장점은 다음과 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 적당한 가격으로, 높은 퀄리티의 SoM을 구매할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) Industrial 등급의 SoM을 구매할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) 메모리(RAM) 및 저장소(EMMC)를 원하는데로 변경할 수 있다. 물론, 이 경우 최소구매수량(MOQ)는 존재한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4) 배송이 생각보다 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5) WiKi가 그나마 잘되어있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 단점은 뭐가 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 소량 구매자는 도움을 받을 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 지원을 받기위해서 홈페이지등에 가입하면, 가입확인 메일이 오지 않습니다. 필자가 예전에 반도체 업체에 다닐때에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 바로되었거든요. 1~2만개 구매 이력이 있기 때문인지 지원도 괜찮았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 변경사항에 대한 큰 범위의 업데이트 내용이 공개되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;메일로 왔습니다. 변경사항에 대한 주요 내용은 말이죠. 웹에서는 확인이 사실상 불가능하여, 버전이 올라가면 내가 무엇을 어떻게 게 더해야되는지는 알수가 없습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3) 이번에 느낀점입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위의 2번 항목에다가, WiKi도 이젠 대충처리하는 것으로 보입니다. SoM 버전이 올라가면서 브로드컴 WiFi에서 Mavell WiFi로 변경된것같습니다. 그런데 이리저리 알아보니, 이녀석 빌드해서 제대로 쓰려면, 컴파일러 버전을 올려야 됩니다. 게다가 커널 버전도 5.4나 5.10에서 6.6으로 심한 점프를 하였습니다. 이상한건 예전에는 git에서 중간 버전도 받아서 확인하고 했었는데, 그런 루트도 어디인지 잘 모르겠네요. 측히 데비안 버전도 오르면서 이것저것 많이 바뀌었습니다. 그런데 기존 제품 사용자들은 어떻게 해야되는지는 설명이 없습니다. 갑자기 버전을 다 올리라니...;; 물론, 이전 버전을 사용하면 되긴 하지만, 얼마지나지않아 Last Order나 EOL(단종) 통보를 받으면 어떻게든 호환 시켜야되는&amp;nbsp; 소프트웨어 개발자 입장으로서는 이건 뭐...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그나마 조금 일찍 알게되어서, 시간을 가지고 하나씩 고쳐서 다운포팅 할 예정인데... 어디가지 될지는 해봐야겠네요. 4일 정도 작업해서 WIFI까지는 처리했는데 Bluetooth가 문제가 있고, 간헐적 WIFI등에서 발생될만한 에러메시지가 발생됩니다. 통신은 잘 되는것 같은데.. 어떻게든 잡아봐야죠.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 내년초쯤에 다시 필요할 것같아서 이번에 하나 새로나온 SoM을 하나 얻어서 미리 해본거라...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. BSP 변경 후기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이렇게 BSP 작업을 진행해봤지만.. 앞으로 임베디드 쓰기는 더더욱 힘들어질 것같습니다. 이제 라즈베리파이 CM모듈 쓰는게 더 편할지도 모르겠네요. 어차피 시간이 많이 들어가면 안되는 현재 회사의 사정으로 봤을 때, 직접 개발보다는 러기드 개발이 더 많아 질것 같다는 슬픈 예감이 듭니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Variscite야.. 빨리 가입처리해주던지...&lt;/p&gt;</description>
      <category>Open Source Hardware/i.MX Series</category>
      <category>ARM Processor Module</category>
      <category>Embedded module</category>
      <category>i.MX8 Mini</category>
      <category>som</category>
      <category>System On Module</category>
      <category>Variscite</category>
      <category>시스템 온 모듈</category>
      <category>왜냐면 돈이 없으니까.</category>
      <category>용돈생활자는 빌려다 쓴다</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/330</guid>
      <comments>https://makeutil.tistory.com/330#entry330comment</comments>
      <pubDate>Mon, 4 Aug 2025 00:38:16 +0900</pubDate>
    </item>
    <item>
      <title>[Raspberry Pi4] 0.5 Inch OLED Sample Code</title>
      <link>https://makeutil.tistory.com/329</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 0.9인치 OLED를 마무리하고, 이번엔 다시 더 작은 0.5인치 LED 모듈을 테스트 하기로 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkK47c/btsPF2fOD2S/F2CxEJR3S2tSn9gHbTy0uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkK47c/btsPF2fOD2S/F2CxEJR3S2tSn9gHbTy0uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkK47c/btsPF2fOD2S/F2CxEJR3S2tSn9gHbTy0uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkK47c%2FbtsPF2fOD2S%2FF2CxEJR3S2tSn9gHbTy0uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;387&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.9인치보다 가격이 더 비싸서... 살짝 하지말까 했지만 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 이 제품은 상품제목부터 문제가 있습니다. 0.5인치는 맟는데 CH1115 컨트롤러가 아니었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 이용해서도 했는데, 동작이 전혀되지 않아서, 전에 했었던 CH1115 샘플을 기반으로도 작성해봤지만, 동작되지 않았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다가 실수로, 기존 0.9인치 샘플을 돌렸는데, 출력이 됩니다. 물론, 일정부분 문제가 있긴 했지만요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플파일은 아래에 등록하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/DiGwj/dJMb80OuQpF/Tc3ctHRcTYFqHMlSakRsa0/oled_num44x88_16.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;oled_num44x88_16.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 제품 정보 틀린것으로 인지하고 있습니다. 1115 샘플로 동작되지 않았으니까요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSD1306 코드로 출력하면, 문자가 출력됩니다. 단지 12345를 출력하면 12가 잘리고 345가 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 테스트에서 알게된게 그런경우밀려서 마지막에 출력될 수도 있어서, 크기에 맞게 345만 출력했지만 3이 반쯤 잘리고 뒤로 45가 출력 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;느낀게, 화면에 출력되는 부분보다. 실제 버퍼가 뒷쪽을 가리키는것 같아서, offset을 넣었습니다. 8픽셀 넣고 조금더 보이길레, 조금씩 더 넣어가면서 시작 위치를 찾았습니다. 그렇게 해서 만든 소스코드가 위에 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론, 제가 잘못이해했을 수도 있습니다. 오래 들여다 볼 시간이 없어서.. 그냥 동작하는 것으로 만족하기 위해서 할 수 있는 방법을 이용하여 처리했을 뿐입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 도움될 수 있으니까...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Open Source Hardware/RaspberryPi  Series</category>
      <category>I2C</category>
      <category>LCD</category>
      <category>OLED</category>
      <category>OLED 0.5인치</category>
      <category>SSD1306</category>
      <category>라즈베리파이</category>
      <category>라즈베리파이 i2c</category>
      <category>용돈생활자의 저렴한 개발 이야기</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/329</guid>
      <comments>https://makeutil.tistory.com/329#entry329comment</comments>
      <pubDate>Mon, 4 Aug 2025 00:17:25 +0900</pubDate>
    </item>
    <item>
      <title>[Raspberry Pi4] 0.9 Inch OLED Sample Code</title>
      <link>https://makeutil.tistory.com/328</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 글을 납김니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런저런 이슈가 있다보니, 정신없이 벌써 8월이 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알리를 돌아보다가 초소형 OLED가 눈에 띄어서 0.9인치와 0.5인치 모듈을 샀습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpcuZU/btsPDEubwCs/2m4ZLYD5zPo3Yahauh7RY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpcuZU/btsPDEubwCs/2m4ZLYD5zPo3Yahauh7RY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpcuZU/btsPDEubwCs/2m4ZLYD5zPo3Yahauh7RY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpcuZU%2FbtsPDEubwCs%2F2m4ZLYD5zPo3Yahauh7RY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;419&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 0.9인치 그림을 보고 샀는데.. 이거 포토샵입니다. 당했다 싶네요. 아랫쪽에 패널 두께가 넓기 때문에 위의 사진처럼 아래에 딱 들어 맞게 들어가지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플파일은 아래에 등록하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cxCRcX/dJMb9XKZa5B/2ttsYp4vHIrkpGR5npqVr1/oled_example.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;oled_example.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러가 SSD1306이라서 GPT를 이용하면 손쉽게 소스코드를 구할 수 있습니다. 물론, 원하는데로 구성하려면 데이터시트도 봐야되고 폰트도 만들어야되고 하지만 말이죠. 그 조차도 AI를 이용하면 그나마 손 쉽게 만들수 있습니다. 예전에는 이런 AI가 없을땐, 데이터시트 부터 하나하나씩 다 봐야되는데.. 그럴려면, 2~3일정도는 걸리지 않았을까 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세상 많이 편해졌네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Open Source Hardware/RaspberryPi  Series</category>
      <category>I2C</category>
      <category>LCD</category>
      <category>OLED</category>
      <category>OLED 0.9인치</category>
      <category>SSD1306</category>
      <category>라즈베리파이</category>
      <category>라즈베리파이 i2c</category>
      <category>용돈생활자의 저렴한 개발 이야기</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/328</guid>
      <comments>https://makeutil.tistory.com/328#entry328comment</comments>
      <pubDate>Mon, 4 Aug 2025 00:08:41 +0900</pubDate>
    </item>
    <item>
      <title>[ESP32] TFT-LCD</title>
      <link>https://makeutil.tistory.com/327</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 일반적으로 임베디드에서 많이 사용하는 그래픽 LCD들은 몇 가지 종류가 있는데 SPI, LVDS, MIPI-DSI, HDMI 등이 그러하다. 최근 고성능 장치에서는 DSI등을 제공하기도 하는데, ESP32와 같은 저속 MCU에서는 일반적으로 SPI LCD를 주로 사용한다. 그래서 국내에서 구매할랬더니, 너무 비싸서 알리익스프레스에서 2개를 구매했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 하나는 라즈베리파이에서 테스트를 했고, 동일한 칩을 사용한 다른 LCD는 ESP32에서 테스트 하기 위해서 구매한 것이다. 라즈베리용은 해상도는 좀 낮지만 크기가 큰걸 선택했다. 해당 제품이 5V가 기준인거 같아서 말이다. 전에도 언급했지만 ESP32의 경우 별도로 전원을 설계하지 않으면 4.5V정도 밖에 나오지 않기 때문에 조금 투박하고 큰 LCD는 라즈베리파이에 주고, 작고 귀여운 LCD는 ESP32에 적용한 것이다. 둘다 SPI니까... 뭐.. 괜찮겠지.. 하고 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c13CyX/btsNLSyUWy7/TWnyjMnrIFk34wo2xZzMiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c13CyX/btsNLSyUWy7/TWnyjMnrIFk34wo2xZzMiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c13CyX/btsNLSyUWy7/TWnyjMnrIFk34wo2xZzMiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc13CyX%2FbtsNLSyUWy7%2FTWnyjMnrIFk34wo2xZzMiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;573&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아랬족이 ESP32용으로 설정한건데... 나중에 보니 LCD 컨트롤러가 다른거였다,,, 뭐 어잿거나 그래서 간단하게 칼라바를 만들어 동작을 확ㅇ니해 보도록 하자. 그런데 이러한 LCD 나 카메라등은 MCU에서 제어하기가 쉽지가 않다. 데이터 시트가 너무 복잡하기 때문이다. 하지만 걱정하지 않아도 된다. 이런부분은 chatgpt를 이용하면 편리하다는 거슬~ 알고있잖은가. 원래는 데이터 시트를 확인해가면서 이것저것 건드리면서 해야되는데... 무섭다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 시스템 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이제 그림은 그릴 필요는 없을 것 같고.I/O 정보만 정리하고 가도록 하자. 아래는 구매한 제품이고, 컨트롤러는 ST7789이다. SPI 인터페이스를 사용하기 때문에 인터페이스는 아래와 같다. 게다가 출력장치이므로 입력핀 MISO는 생략되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYxEbw/btsNJVYfrNc/HefZu0TDWnsT1GTfkqCBuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYxEbw/btsNJVYfrNc/HefZu0TDWnsT1GTfkqCBuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYxEbw/btsNJVYfrNc/HefZu0TDWnsT1GTfkqCBuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYxEbw%2FbtsNJVYfrNc%2FHefZu0TDWnsT1GTfkqCBuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;418&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - GND는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ESP32 - GND핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - VCC는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ESP32 - 3.3V핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - CLK(SCL)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ESP32 - 18번 핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - MOSI(SDA)&amp;nbsp; &amp;nbsp; ESP32 - 11번 핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - RST는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ESP32 - 15번 핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - DC는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ESP32 - 5번 핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - CS는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ESP32 - 4번 핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - BL은&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ESP32 - 3.3V핀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 소스코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 소스코드는 아래와 같다. LCD 컨트롤러의 데이터시트는 alldatasheet에 들어가서 다운로드 받도록 하고, 기본 동작 설명은 주석으로 대체 하도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746291868471&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;freertos/FreeRTOS.h&quot;
#include &quot;freertos/task.h&quot;
#include &quot;driver/spi_master.h&quot;
#include &quot;driver/gpio.h&quot;
#include &quot;esp_log.h&quot;
#include &amp;lt;string.h&amp;gt;

#define LCD_HOST SPI2_HOST

#define PIN_NUM_MOSI 11     // MOSI (SDA)
#define PIN_NUM_CLK  18     // CLK (SCL)
#define PIN_NUM_RST  15     // RST
#define PIN_NUM_DC   5      // DC
#define PIN_NUM_CS   4      // CS

#define LCD_WIDTH  240      // 가로 해상도 
#define LCD_HEIGHT 240      // 세로 해상도

// 색상 설정을 위한 매크로 
#define RGB565(r, g, b) (((r &amp;amp; 0xF8) &amp;lt;&amp;lt; 8) | ((g &amp;amp; 0xFC) &amp;lt;&amp;lt; 3) | (b &amp;gt;&amp;gt; 3))

static const char *TAG = &quot;ST7789&quot;;

spi_device_handle_t spi;    // Soft SPI 핸들 

void lcd_cmd(uint8_t cmd) 
{
    spi_transaction_t t = 
    {
        .length = 8,
        .tx_buffer = &amp;amp;cmd,
    };
    gpio_set_level(PIN_NUM_DC, 0);
    spi_device_transmit(spi, &amp;amp;t);
}

void lcd_data(const uint8_t *data, int len) 
{
    if (len == 0) return;
    spi_transaction_t t = 
    {
        .length = len * 8,
        .tx_buffer = data,
    };
    gpio_set_level(PIN_NUM_DC, 1);
    spi_device_transmit(spi, &amp;amp;t);
}

void lcd_data_byte(uint8_t data) 
{
    lcd_data(&amp;amp;data, 1);
}

void lcd_reset() 
{
    gpio_set_level(PIN_NUM_RST, 0);   // RST를 0으로 설정
    vTaskDelay(pdMS_TO_TICKS(50));
    gpio_set_level(PIN_NUM_RST, 1);   // RST를 1로 설정
    vTaskDelay(pdMS_TO_TICKS(50));
}

void lcd_init() 
{
    ESP_LOGI(TAG, &quot;Initializing SPI and LCD&quot;);

    spi_bus_config_t buscfg = {
        .mosi_io_num = PIN_NUM_MOSI,
        .miso_io_num = -1,            // LCD이므로 입력은 필요없음.
        .sclk_io_num = PIN_NUM_CLK,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
    };
    spi_bus_initialize(LCD_HOST, &amp;amp;buscfg, SPI_DMA_CH_AUTO);

    spi_device_interface_config_t devcfg = 
    {
        .clock_speed_hz = 40 * 1000 * 1000,      // ST7789 는 최대 62.5Mhz를 지원
        .mode = 0,                               // ST7789 일반적으로 mode 0 또는 3 사용
        .spics_io_num = PIN_NUM_CS,              // CS핀 설정
        .queue_size = 7,                         // 큐 크기 (동시에 처리가능한 전송 카운트)
    };
    spi_bus_add_device(LCD_HOST, &amp;amp;devcfg, &amp;amp;spi);

    gpio_config_t io_conf = 
    {
        .pin_bit_mask = (1ULL &amp;lt;&amp;lt; PIN_NUM_DC) | (1ULL &amp;lt;&amp;lt; PIN_NUM_RST),   // DC와 RST GPIO 등록
        .mode = GPIO_MODE_OUTPUT,
    };
    gpio_config(&amp;amp;io_conf);

    gpio_set_level(PIN_NUM_DC, 1);     // DC를 HIGH로 설정
    gpio_set_level(PIN_NUM_RST, 1);    // RST를 HIGH로 설정

    lcd_reset();                       // RST를 흔들어줌

    // ST7789 초기화 시퀀스 - Porch 설정
    lcd_cmd(0x36); lcd_data_byte(0x70);            // 메모리 엑세스 컨트롤 (MY=1,MX=1,MV=0,ML=0,RGB=1 -&amp;gt; XY 180도 반전, RGB순서)
    lcd_cmd(0x3A); lcd_data_byte(0x05);            // 픽셀 포맷을 설정 (16bit/pixel - RGB565)
    // 프레임 간격 및 Back Porch 설정 : Front Porch = 12, Back Porch = 12, RTNB=0 (Unknown), VFP=0x33, VBP=0x33
    lcd_cmd(0xB2); uint8_t b2[] = {0x0C, 0x0C, 0x00, 0x33, 0x33}; lcd_data(b2, 5);
    lcd_cmd(0xB7); lcd_data_byte(0x35);            // Gate Control : 전압레벨 조정 (VGH=13.26V, VGL=-10.43V)
    lcd_cmd(0xBB); lcd_data_byte(0x19);            // 공통전압레벨 설정 : 0x19=1.325V 
    lcd_cmd(0xC0); lcd_data_byte(0x2C);            // AVDD(Positive Power Voltage) 설정 = 0x2c -&amp;gt; 4.6V (3.3v에서도 잘 동작)
    lcd_cmd(0xC2); lcd_data_byte(0x01);            // 디지털 전압 조정 활성화 0x01 -&amp;gt; VRH 설정 활성화
    lcd_cmd(0xC3); lcd_data_byte(0x12);            // VHR 설정 : 0x12--&amp;gt; 4.6V
    lcd_cmd(0xC4); lcd_data_byte(0x20);            // VDV 설정 : VCOM DC 저ㅗㄴ압 설정 Fine-tune -&amp;gt; 0x20 = 0.8v
    lcd_cmd(0xC6); lcd_data_byte(0x0F);            // 프레임 레이트 컨트롤 (노멀모드) : 0x0f -&amp;gt; 약 60Hz
    // 전원제어2 : AVDD, AVCL(0xA4) - 활성화, AVEE(0xA1) - Source/Gate Timing 조정 
    lcd_cmd(0xD0); lcd_data_byte(0xA4); lcd_data_byte(0xA1);   
    // Positive Gamma Cureve(E0), Negative Gamma Curve(E1)
    lcd_cmd(0xE0); uint8_t e0[] = {0xD0, 0x04, 0x0D, 0x11, 0x13, 0x2B, 0x3F, 0x54, 0x4C, 0x18, 0x0D, 0x0B, 0x1F, 0x23};
    lcd_data(e0, sizeof(e0));                      // 휘도, 대비, 색 표현관련 설정 적용
    lcd_cmd(0xE1); uint8_t e1[] = {0xD0, 0x04, 0x0C, 0x11, 0x13, 0x2C, 0x3F, 0x44, 0x51, 0x2F, 0x1F, 0x1F, 0x20, 0x23};
    lcd_data(e1, sizeof(e1));                      // 패널 특성에 따라 조정 필요

    lcd_cmd(0x21);                                 // Inversion ON -&amp;gt; 픽셀 색상 반전 활성화 (화면 깜빡임이나 특정 색이 보정됨)
    lcd_cmd(0x11);                                 // Sleep Out -&amp;gt; 슬립모드에서 정상모드로 복귀
    vTaskDelay(pdMS_TO_TICKS(120));                // 설정 지연시간 (데이터시트 명시)
    lcd_cmd(0x29);                                 // 화면표시 시작
}

// 영상 출력을 위한 영역 설정
void lcd_set_addr_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) 
{
    uint8_t data[4];

    lcd_cmd(0x2A);        // 컬럼 주소 설정 (가로)
    data[0] = x0 &amp;gt;&amp;gt; 8; data[1] = x0 &amp;amp; 0xFF;
    data[2] = x1 &amp;gt;&amp;gt; 8; data[3] = x1 &amp;amp; 0xFF;
    lcd_data(data, 4);

    lcd_cmd(0x2B);        // 페이지 어드레스 설정(세로)
    data[0] = y0 &amp;gt;&amp;gt; 8; data[1] = y0 &amp;amp; 0xFF;
    data[2] = y1 &amp;gt;&amp;gt; 8; data[3] = y1 &amp;amp; 0xFF;
    lcd_data(data, 4);

    lcd_cmd(0x2C);        // 메모리 기록 가능 설정
}

// 사각형 그리기 함수
void lcd_fill_rect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) 
{
    lcd_set_addr_window(x, y, x + w - 1, y + h - 1);

    uint32_t size = w * h;
    uint8_t hi = color &amp;gt;&amp;gt; 8;
    uint8_t lo = color &amp;amp; 0xFF;
    const int buf_len = 512;
    uint8_t buffer[buf_len];
    for (int i = 0; i &amp;lt; buf_len; i += 2) 
    {
        buffer[i] = hi;
        buffer[i + 1] = lo;
    }

    while (size &amp;gt; 0) 
    {
        int to_send = size &amp;gt; (buf_len / 2) ? (buf_len / 2) : size;
        lcd_data(buffer, to_send * 2);
        size -= to_send;
    }
}



void app_main() {
    lcd_init();

    ESP_LOGI(TAG, &quot;Drawing color bars...&quot;);
    uint16_t colors[] = 
    {
        RGB565(255, 0, 0),     // Red
        RGB565(0, 255, 0),     // Green
        RGB565(0, 0, 255),     // Blue
        RGB565(255, 255, 0),   // Yellow
        RGB565(0, 255, 255),   // Cyan
        RGB565(255, 0, 255),   // Magenta
        RGB565(255, 255, 255), // White
        RGB565(0, 0, 0),       // Black
    };

    int bar_height = LCD_HEIGHT / 8;
    for (int i = 0; i &amp;lt; 8; ++i) 
    {
        lcd_fill_rect(0, i * bar_height, LCD_WIDTH, bar_height, colors[i]);
    }

    ESP_LOGI(TAG, &quot;Done.&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 결과확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 컬러바 출력소스에 대해서 빌드하고 결과를 확인하면 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1779&quot; data-origin-height=&quot;2465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EcKTu/btsNJJRegIE/Ai9Eb1NWekEI4QEfHmgVJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EcKTu/btsNJJRegIE/Ai9Eb1NWekEI4QEfHmgVJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EcKTu/btsNJJRegIE/Ai9Eb1NWekEI4QEfHmgVJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEcKTu%2FbtsNJJRegIE%2FAi9Eb1NWekEI4QEfHmgVJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;814&quot; height=&quot;1128&quot; data-origin-width=&quot;1779&quot; data-origin-height=&quot;2465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 출력하고 나니까 뭔가 남는게 없는거 같은데.. ESP32 I2C하고 SPI는 별도로 뭔가를 해서 설명이 필요한것 같으니, ESP32 2개를 이용해서 실제 데이터가 어떻게 가는지 정리해서 올리도록 하겠다. 이번주는 휴일이 몇일 있어서 정리하기 딱 좋은 날이긴 한데..&amp;nbsp;&lt;/p&gt;</description>
      <category>Firmware/Micro Controller</category>
      <category>esp32</category>
      <category>esp32 firmware</category>
      <category>esp32 spi</category>
      <category>Firmware</category>
      <category>LCD</category>
      <category>SPI</category>
      <category>spi lcd</category>
      <category>용돈생활자의 저렴한 개발이야기</category>
      <category>펌웨어</category>
      <author>Maketools</author>
      <guid isPermaLink="true">https://makeutil.tistory.com/327</guid>
      <comments>https://makeutil.tistory.com/327#entry327comment</comments>
      <pubDate>Sun, 4 May 2025 02:23:09 +0900</pubDate>
    </item>
  </channel>
</rss>