<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Lee pro</title>
    <link>https://ythouse.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 16:12:26 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>게임교수</managingEditor>
    <item>
      <title>전력반도체 신뢰성의 핵심, H3TRB&amp;middot;HTRB&amp;middot;HTGB 1nA 미세전류 실시간 모니터링 시스템</title>
      <link>https://ythouse.tistory.com/233</link>
      <description>&lt;!-- 블로그 전체 가독성을 위한 스타일 정의 (기본 서체 및 줄간격 최적화) --&gt;
&lt;div&gt;
&lt;style&gt;
    .tech-post { line-height: 1.8; color: #333333; font-family: 'Noto Sans KR', sans-serif; font-size: 16px; word-break: keep-all; }
    .tech-post h2 { color: #0F2C59; font-size: 26px; border-left: 6px solid #0F2C59; padding-left: 12px; margin-top: 40px; margin-bottom: 20px; font-weight: 700; line-height: 1.4; }
    .tech-post h3 { color: #1F4E79; font-size: 20px; margin-top: 35px; margin-bottom: 15px; font-weight: 600; }
    .tech-post h4 { color: #2E75B6; font-size: 17px; margin-top: 25px; margin-bottom: 10px; font-weight: 600; }
    .tech-post p { margin-bottom: 20px; text-align: justify; }
    .tech-post strong { color: #D61355; } /* 핵심 키워드 강조 색상 */
    .tech-post .highlight-box { background-color: #F0F4F8; border-radius: 6px; padding: 20px; margin: 25px 0; border-left: 4px solid #1F4E79; }
    .tech-post .quote-box { background-color: #FAF6F0; border: 1px dashed #DFA878; border-radius: 6px; padding: 20px; margin: 25px 0; font-style: italic; font-weight: 500; text-align: center; color: #555; }
    .tech-post ul, .tech-post ol { margin-bottom: 20px; padding-left: 20px; }
    .tech-post li { margin-bottom: 10px; }
    .tech-post table { width: 100%; border-collapse: collapse; margin: 25px 0; font-size: 15px; }
    .tech-post th { background-color: #0F2C59; color: #ffffff; padding: 12px; font-weight: 600; border: 1px solid #e0e0e0; white-space: nowrap; }
    .tech-post td { padding: 12px; border: 1px solid #e0e0e0; text-align: center; vertical-align: middle; }
    .tech-post tr:nth-child(even) { background-color: #f9f9f9; }
&lt;/style&gt;
&lt;/div&gt;
&lt;div class=&quot;tech-post&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 전력반도체 신뢰성 평가(HTGB, HTRB), 단순 결과 확인으로는 부족합니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 전기차(EV), 신재생에너지, 고속 충전기 등 고전압 시스템 시장이 급성장하면서 &lt;b&gt;SiC, GaN, MOSFET, IGBT와 같은 전력반도체의 신뢰성&lt;/b&gt;이 그 어느 때보다 중요해졌습니다. 이를 검증하기 위해 필수적으로 진행하는 시험이 바로 &lt;b&gt;HTGB&lt;/b&gt;(고온 게이트 바이어스), &lt;b&gt;HTRB&lt;/b&gt;(고온 역바이어스), 그리고 &lt;b&gt;H3TRB&lt;/b&gt;(고온 고습 역바이어스)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 많은 R&amp;amp;D 센터에서 1,000시간이 넘는 긴 시험 종료 후, 시료를 꺼내어 단순 Pass/Fail 여부만 확인하는 전통적인 &lt;b&gt;Post-test 측정 방식&lt;/b&gt;을 고수하고 있습니다. 이 방식은 치명적인 한계(Blind Spot)를 가집니다.&lt;/p&gt;
&lt;div class=&quot;highlight-box&quot;&gt;&lt;b&gt;⚠️ 기존 계측 방식의 치명적 한계: 'Recovery Effect (회복 효과)'&lt;/b&gt;
&lt;p style=&quot;margin-top: 10px; margin-bottom: 0;&quot; data-ke-size=&quot;size16&quot;&gt;고온(150℃~175℃) 및 고전압(1000V 이상)의 스트레스 챔버 안에서 발생하던 미세한 누설전류 증가나 계면 트랩 현상은, 시험이 끝나고 시료를 상온의 계측기로 옮기는 과정에서 일시적으로 '회복(Recovery)'되어 정상처럼 보일 수 있습니다. 불량이 언제, 어떤 패턴으로 발생했는지 전혀 알 수 없는 &lt;b&gt;'고장 메커니즘의 블랙박스화'&lt;/b&gt;가 발생합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보이지 않는 결함을 잡아내고 완벽한 소자를 설계하기 위해서는, 스트레스가 인가되는 챔버 내부 그 자체에서 &lt;b&gt;1nA(나노암페어) 해상도의 초정밀 실시간(In-situ) 모니터링&lt;/b&gt;이 반드시 수반되어야 합니다.&lt;/p&gt;
&lt;!-- 첫 번째 애드센스 광고 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt; (adsbygoogle = window.adsbygoogle || []).push({}); &lt;/script&gt;
&lt;/div&gt;
&lt;!-- // 첫 번째 애드센스 광고 끝 --&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 1nA 초정밀 모니터링이 HTRB / HTGB 시험에 가져오는 혁신&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 실제 FT(Final Test) 데이터를 챔버 내부에서 실시간 취득&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수백에서 수천 시간 진행되는 HTGB/HTRB 시험 도중 특성 변화를 보려면 시험을 중단하고 시료를 꺼내야 하는 번거로움과 데이터 오차가 따릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 1nA 분해능을 갖춘 모니터링 시스템을 도입하면, 극한의 고온&amp;middot;고전압 조건이 유지되는 &lt;b&gt;챔버 내부에서 Gate 누설전류(Igss)와 Drain/Collector 누설전류(Idss/Ices)의 변화를 초&amp;middot;분 단위로 연속 기록&lt;/b&gt;합니다. 이는 시료를 챔버에서 꺼내지 않고도 양산 라인의 계측을 무한 반복하는 것과 동일한 효과를 주며, 측정 오차율을 극적으로 낮춥니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 시료가 죽어가는 '열화(Degradation) 과정'의 완벽한 가시화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전력반도체는 갑자기 파괴(Hard Breakdown)되기보다, 지속적인 스트레스에 의해 절연막이나 접합부 내부에 결함이 누적되면서 서서히 성능이 떨어지는 &lt;b&gt;소프트 페일(Soft Fail)&lt;/b&gt; 징후를 먼저 보입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HTGB 모니터링:&lt;/b&gt; 게이트 산화막(Gate Oxide)의 전하 포집으로 인한 미세한 열화나, TDDB(시간종속 절연파괴)가 발생하기 전 전류가 스멀스멀 증가하는 궤적을 1nA 단위로 포착합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTRB / H3TRB 모니터링:&lt;/b&gt; 칩 내부 혹은 패키지 몰딩을 타고 들어온 수분과 이온성 불순물에 의해 메인 정션(Junction)이나 가드링 영역에서 누설전류가 급증(Spike)하는 시점을 정확히 눈으로 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 정확한 '개선 포인트' 획득으로 R&amp;amp;D 비용 획기적 절감&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간 누설전류 그래프를 보면 불량 분석(FA)의 차원이 달라집니다. 단순히 1,000시간 뒤에 &quot;불량 났네&quot;가 아니라, &lt;b&gt;&quot;시험 340시간째에 역바이어스 누설전류가 10nA에서 500nA로 급증하기 시작했다&quot;&lt;/b&gt;는 명확한 팩트를 얻게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 데이터는 설계 및 공정 엔지니어에게 막강한 무기가 됩니다. 어느 공정 파라미터(산화막 두께, 메탈 배선, 패키징 재질 등)를 수정해야 할지 단번에 &lt;b&gt;정확한 타겟팅(개선 포인트 확정)&lt;/b&gt;이 가능해지며, 의미 없는 반복 시험을 줄여 개발 기간과 막대한 챔버 가동 비용을 절반 이하로 줄일 수 있습니다.&lt;/p&gt;
&lt;!-- 두 번째 애드센스 광고 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt; (adsbygoogle = window.adsbygoogle || []).push({}); &lt;/script&gt;
&lt;/div&gt;
&lt;!-- // 두 번째 애드센스 광고 끝 --&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 1nA 실시간 모니터링 vs 기존 측정 방식 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SiC, GaN 등 차세대 와이드 밴드갭(WBG) 소자일수록 누설전류의 거동 파악이 곧 소자 수명 예측의 핵심입니다. 두 방식의 차이는 부품의 품질 신뢰도를 결정짓습니다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;비교 항목&lt;/th&gt;
&lt;th&gt;기존 HTGB / HTRB (Post-test)&lt;/th&gt;
&lt;th&gt;1nA 실시간 In-situ 모니터링&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;누설전류 모니터링&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시험 전/후 또는 중간 점검 시 단발성&lt;/td&gt;
&lt;td&gt;스트레스 인가 중 &lt;b&gt;연속적 실시간 모니터링&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;계측 분해능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;일반적으로 &amp;micro;A 단위 수준&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1nA (나노암페어) 단위의 초정밀 추적&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;열화 시점 포착&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;파악 불가 (구간 추정만 가능)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;정확한 열화 시작 시간(Time-to-Fail) 파악&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;데이터 신뢰성 (오류)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;상온 노출 시 Recovery 효과로 정상 오판 우려&lt;/td&gt;
&lt;td&gt;가혹 온도/전압 상태 그대로 측정하여 &lt;b&gt;오차 제로&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;R&amp;amp;D 효율성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;원인 불명으로 인한 맹목적 반복 시험 유발&lt;/td&gt;
&lt;td&gt;정확한 개선 포인트 피드백으로 &lt;b&gt;개발 기간 단축&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;quote-box&quot;&gt;&quot;진정한 신뢰성 평가는 고장 난 시료를 찾아내는 것이 아니라, 고장으로 향하는 '미세전류 1nA의 징후'를 누구보다 먼저 포착하여 완벽한 설계 개선 방안을 도출해 내는 것입니다.&quot;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 결론: 가장 확실한 품질 경쟁력, '정밀도'가 결정합니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동차, 우주항공, 하이엔드 서버 등 극한의 환경에서 동작하는 전력 시스템은 단 하나의 소자 불량도 허용하지 않습니다. 고전압과 고온 스트레스가 가해지는 HTRB, HTGB 환경에서 1nA의 미세한 누설전류 흐름조차 놓치지 않는 실시간 모니터링 시스템의 구축은 단순한 장비 업그레이드가 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 제품의 &lt;b&gt;잠재적 리스크를 개발 단계에서 원천 차단하고, 막대한 필드 클레임 비용을 방어하는 가장 확실한 투자&lt;/b&gt;입니다. 보이지 않던 열화 메커니즘, 이제 1nA 정밀도로 투명하게 확인하십시오.&lt;/p&gt;
&lt;hr style=&quot;border: 0; height: 1px; background: #e0e0e0; margin: 40px 0;&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;!-- 깔끔하고 세련된 문의처 명함 정보 카드 블록 --&gt;
&lt;div style=&quot;background: linear-gradient(135deg, #f5f7fa 0%, #e4e8f0 100%); border: 1px solid #cbd5e1; border-radius: 10px; padding: 30px; font-size: 16px; box-shadow: 0 4px 6px rgba(0,0,0,0.05); margin: 35px 0;&quot;&gt;
&lt;h4 style=&quot;margin-top: 0; color: #0f2c59; font-size: 19px; border-bottom: 2px solid #0F2C59; padding-bottom: 12px; font-weight: bold; letter-spacing: -0.5px;&quot; data-ke-size=&quot;size20&quot;&gt;  시험 진행 및 기타 기술 문의&lt;/h4&gt;
&lt;div style=&quot;margin-top: 20px;&quot;&gt;
&lt;p style=&quot;margin: 0 0 8px 0; font-size: 18px; color: #1e293b;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라온솔루션 반도체 신뢰성 R&amp;amp;D센터&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0 0 15px 0; font-size: 16px; color: #475569;&quot; data-ke-size=&quot;size16&quot;&gt;센터장 &lt;span style=&quot;font-size: 18px; color: #0f2c59; font-weight: bold;&quot;&gt;이연태&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; border-radius: 6px; padding: 12px 15px; display: inline-block; border: 1px solid #e2e8f0;&quot;&gt;&lt;span style=&quot;color: #64748b; font-weight: 500; margin-right: 10px;&quot;&gt;  문의 이메일&lt;/span&gt; &lt;a style=&quot;color: #0f2c59; font-weight: bold; text-decoration: none; border-bottom: 1px solid #0F2C59;&quot; href=&quot;mailto:ytlee@raonsolution.com&quot;&gt;ytlee@raonsolution.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- // 문의처 명함 블록 끝 --&gt; &lt;!-- 세 번째 애드센스 광고 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt; (adsbygoogle = window.adsbygoogle || []).push({}); &lt;/script&gt;
&lt;/div&gt;
&lt;!-- // 세 번째 애드센스 광고 끝 --&gt;&lt;/div&gt;</description>
      <category>반도체 신뢰성분석 R&amp;amp;D센터</category>
      <category>#미세전류모니터링 #1nA #반도체신뢰성 #GaN #누설전류 #LeakageCurrent #실시간모니터링 #전력반도체 신뢰성 전문센터 #열화분석 #AQG-324#전력반도체 #수명시험 #HTRB #HTGB #H3TRB #전력반도체 신뢰성 #절연파괴 #차량용반도체 #SiC #신뢰성센터</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/233</guid>
      <comments>https://ythouse.tistory.com/233#entry233comment</comments>
      <pubDate>Wed, 17 Jun 2026 21:23:33 +0900</pubDate>
    </item>
    <item>
      <title>[아두이노 + TinyML] 손 제스처 인식 컨트롤러 만들기 &amp;ndash; Arduino Nano 33 BLE Sense 활용법 완전 정복</title>
      <link>https://ythouse.tistory.com/229</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;아두이노 + AI 제스처 인식 컨트롤러 만들기 &amp;ndash; TinyML로 스마트한 손짓 제어&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  프로젝트 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 &lt;b&gt;아두이노 나노 33 BLE Sense&lt;/b&gt; 보드와 &lt;b&gt;TinyML (Edge Impulse)&lt;/b&gt; 플랫폼을 활용하여 &lt;b&gt;손 제스처로 사물을 제어하는 시스템&lt;/b&gt;을 구축하는 방법을 단계별로 안내드립니다. 본문만 따라 하셔도 충분히 구현 가능하도록 구성되어 있으며, 아두이노 기초가 있는 분이라면 누구나 진행하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;완성 목표:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위아래 손 흔들기, 좌우 제스처 등을 감지하여&lt;/li&gt;
&lt;li&gt;LED 점등, 모터 회전 등 다양한 동작으로 연결하는 제스처 인식 컨트롤러 제작&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 준비물 목록&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Arduino Nano 33 BLE Sense 보드 1개&lt;/li&gt;
&lt;li&gt;Micro USB 케이블&lt;/li&gt;
&lt;li&gt;인터넷 연결이 가능한 PC (Windows/macOS)&lt;/li&gt;
&lt;li&gt;Edge Impulse 계정 (무료 가입)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선택 사항:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브레드보드 + LED (출력 확인용)&lt;/li&gt;
&lt;li&gt;조도 안정적인 실내 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ 개발 환경 구성&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Arduino IDE 설치 및 보드 설정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공식 홈페이지에서 IDE 설치: &lt;a href=&quot;https://www.arduino.cc/en/software&quot;&gt;https://www.arduino.cc/en/software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;보드 매니저에서 Arduino Mbed OS Nano Boards 추가&lt;/li&gt;
&lt;li&gt;보드 선택: Arduino Nano 33 BLE Sense&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 필수 라이브러리 설치&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Arduino_LSM9DS1 (IMU 센서용)&lt;/li&gt;
&lt;li&gt;Arduino_BLE (BLE 통신용 &amp;ndash; 선택사항)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;#include &amp;lt;Arduino_LSM9DS1.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Step 1: Edge Impulse로 제스처 데이터 수집&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://studio.edgeimpulse.com&quot;&gt;https://studio.edgeimpulse.com&lt;/a&gt; 접속 후 회원가입 및 로그인&lt;/li&gt;
&lt;li&gt;새 프로젝트 생성 (예: Gesture Controller)&lt;/li&gt;
&lt;li&gt;'Data acquisition' 메뉴에서 아두이노 연결 &amp;rarr; IMU 센서로 실시간 제스처 데이터 수집&lt;/li&gt;
&lt;li&gt;다양한 손동작을 반복적으로 기록 (3~5초씩, 다수 수집 권장)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rYNaq/btsNxzhdNwt/WL7rHWiyTvIHY0JvyvXhc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rYNaq/btsNxzhdNwt/WL7rHWiyTvIHY0JvyvXhc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rYNaq/btsNxzhdNwt/WL7rHWiyTvIHY0JvyvXhc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrYNaq%2FbtsNxzhdNwt%2FWL7rHWiyTvIHY0JvyvXhc1%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; alt=&quot;제스처 인식 모델 성능 개선 전후 정확도 비교 그래프&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Step 2: 머신러닝 모델 설계 및 학습&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;수집된 데이터를 'Impulse Design' 메뉴에서 처리&lt;/li&gt;
&lt;li&gt;Processing Block: 'Spectral Features' 선택&lt;/li&gt;
&lt;li&gt;Learning Block: 'Classification (Keras)' 선택&lt;/li&gt;
&lt;li&gt;간단한 NN 구조 설정 (Dense layer 1~2개면 충분)&lt;/li&gt;
&lt;li&gt;학습 실행 및 정확도 확인 (80% 이상 목표)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnERtY/btsNzcrg69m/4jZEsKSkYD9FyPYIdVCuh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnERtY/btsNzcrg69m/4jZEsKSkYD9FyPYIdVCuh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnERtY/btsNzcrg69m/4jZEsKSkYD9FyPYIdVCuh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnERtY%2FbtsNzcrg69m%2F4jZEsKSkYD9FyPYIdVCuh1%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; alt=&quot;손 제스처에 반응하여 LED가 점등되는 아두이노 제어 장면&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Step 3: 아두이노용 라이브러리 다운로드&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;'Deployment' 탭으로 이동&lt;/li&gt;
&lt;li&gt;Format: &lt;b&gt;Arduino Library (.zip)&lt;/b&gt; 선택 후 다운로드&lt;/li&gt;
&lt;li&gt;Arduino IDE에서 ZIP 파일로 라이브러리 추가&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jc31p/btsNy5eQvWL/JLwgWIgwKj8l9JNk2q5ik0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jc31p/btsNy5eQvWL/JLwgWIgwKj8l9JNk2q5ik0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jc31p/btsNy5eQvWL/JLwgWIgwKj8l9JNk2q5ik0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJc31p%2FbtsNy5eQvWL%2FJLwgWIgwKj8l9JNk2q5ik0%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; alt=&quot;Edge Impulse에서 Arduino용 라이브러리를 .zip 형식으로 다운로드하는 화면&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;zwj;  Step 4: 모델을 적용한 아두이노 코드 작성&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;#include &amp;lt;Arduino_LSM9DS1.h&amp;gt;
#include &amp;lt;YourModel_inferencing.h&amp;gt; // Edge Impulse 라이브러리명

void setup() {
  Serial.begin(115200);
  if (!IMU.begin()) {
    Serial.println(&quot;IMU 초기화 실패!&quot;);
    while (1);
  }
  Serial.println(&quot;제스처 인식 시작&quot;);
}

void loop() {
  float x, y, z;
  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(x, y, z);
    // 여기에 run_classifier() 함수 등 추론 로직 삽입
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Step 5: 출력 및 응용 확장&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LED 점등, 서보모터 제어, 블루투스 연동 등 다양한 액션 설정 가능&lt;/li&gt;
&lt;li&gt;각 제스처에 특정 이벤트를 매핑하여 홈오토메이션에도 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JVuoc/btsNzzNi2Re/jZWRnkfOj6fIEfn7veCVn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JVuoc/btsNzzNi2Re/jZWRnkfOj6fIEfn7veCVn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JVuoc/btsNzzNi2Re/jZWRnkfOj6fIEfn7veCVn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJVuoc%2FbtsNzzNi2Re%2FjZWRnkfOj6fIEfn7veCVn0%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; alt=&quot;Edge Impulse에서 제스처 인식 모델을 학습하고 정확도를 확인하는 화면&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  팁 &amp;amp; 문제 해결&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제스처 데이터는 충분하고 다양한 조건에서 수집해야 정확도가 향상됩니다&lt;/li&gt;
&lt;li&gt;조도, 진동 등 외부 환경에 민감하므로 테스트 환경을 일정하게 유지하는 것이 좋습니다&lt;/li&gt;
&lt;li&gt;정확도 낮을 시: 데이터 보강, NN 구조 재설계, Epoch 수 조절 등 시도 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t8A85/btsNxxDIOVO/W2OAfFKCVeOrItkvkXdMJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t8A85/btsNxxDIOVO/W2OAfFKCVeOrItkvkXdMJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t8A85/btsNxxDIOVO/W2OAfFKCVeOrItkvkXdMJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft8A85%2FbtsNxxDIOVO%2FW2OAfFKCVeOrItkvkXdMJ0%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; alt=&quot;제스처 인식 시 LED가 켜지는 아두이노 나노 33 BLE Sense 실습 예시&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  관련 프로젝트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ythouse.tistory.com/226&quot;&gt;아두이노 + RTC 모듈로 디지털 시계만들기 - DS3231&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;text-align: start;&quot; href=&quot;https://ythouse.tistory.com/183&quot; data-tiara-id=&quot;/183&quot; data-tiara-plink=&quot;/183&quot; data-tiara-provider=&quot;Lee pro&quot; data-tiara-name=&quot;아두이노 전자 도어락 시스템 만들기 &amp;ndash; RFID + 부저 + 서보모터로 출입 제어 구현하기&quot; data-tiara-click_url=&quot;https://ythouse.tistory.com//183&quot; data-tiara-image=&quot;&quot; data-tiara-copy=&quot;아두이노 전자 도어락 시스템 만들기 &amp;ndash; RFID + 부저 + 서보모터로 출입 제어 구현하기&quot; data-tiara-action-kind=&quot;ClickContent&quot; data-tiara-action-name=&quot;블로그글_클릭&quot;&gt;&lt;b&gt;아두이노 전자 도어락 시스템 만들기 &amp;ndash; RFID + 부저 + 서보모터로 출입 제어 구현하기&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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 제스처 인식 컨트롤러 제작 과정을 모두 마쳤습니다. 본 시스템은 BLE 연동, 클라우드 데이터 전송, 앱 기반 원격 제어 등 다양한 방향으로 확장할 수 있으며, 다음 글에서 이를 단계적으로 소개드릴 예정입니다.&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>Arduino Nano 33 BLE Sense</category>
      <category>edge impulse</category>
      <category>IoT 프로젝트</category>
      <category>TinyML</category>
      <category>머신러닝</category>
      <category>스마트 홈</category>
      <category>아두이노</category>
      <category>인공지능</category>
      <category>임베디드 개발</category>
      <category>제스처 인식</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/229</guid>
      <comments>https://ythouse.tistory.com/229#entry229comment</comments>
      <pubDate>Fri, 25 Apr 2025 07:22:50 +0900</pubDate>
    </item>
    <item>
      <title>Unity 2D 게임 만들기 3편 &amp;ndash; 스프라이트 불러오기와 캐릭터 이동 구현 완전정복</title>
      <link>https://ythouse.tistory.com/228</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Unity 2D 게임 만들기 3편 &amp;ndash; 스프라이트 불러오기와 캐릭터 이동 구현 완전정복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  들어가며 이번 3편에서는 드디어 플레이어(캐릭터)를 화면에 등장시키고, 키보드 입력으로 이동하는 로직까지 구현합니다. 2D 게임의 시작을 알리는 &lt;b&gt;스프라이트 리소스 불러오기 &amp;rarr; 배치 &amp;rarr; 이동&lt;/b&gt;이라는 핵심 단계를 순서대로 따라해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  본 글은 Unity 2022.3 LTS 기준으로 작성되었으며, 유니티 기본 Sprite Editor 사용을 전제로 합니다.&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 스프라이트 리소스 불러오기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶ 이미지 파일 준비&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PNG 형식의 투명 배경 캐릭터 이미지를 준비합니다.&lt;/li&gt;
&lt;li&gt;Assets &amp;gt; Sprites 폴더 생성 후 해당 이미지 드래그 앤 드롭&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶ Import 설정 변경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 클릭 후 Inspector에서 Texture Type을 Sprite (2D and UI)로 변경&lt;/li&gt;
&lt;li&gt;Pixels Per Unit: 기본값 100 유지 또는 캐릭터 크기에 맞게 조정&lt;/li&gt;
&lt;li&gt;Apply 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boDMza/btsNw4uXJoo/vz1F5TVrJgLw9OjlChWxC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boDMza/btsNw4uXJoo/vz1F5TVrJgLw9OjlChWxC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boDMza/btsNw4uXJoo/vz1F5TVrJgLw9OjlChWxC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboDMza%2FbtsNw4uXJoo%2Fvz1F5TVrJgLw9OjlChWxC1%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; alt=&quot;Unity에서 Sprite 이미지를 Hierarchy 창으로 드래그하여 캐릭터 오브젝트를 생성하는 장면&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  팁: 한 이미지에 여러 동작이 들어간 Sprite Sheet의 경우, Sprite Mode를 Multiple로 설정한 뒤 Sprite Editor에서 자를 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 캐릭터 씬 배치하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶ Hierarchy에 캐릭터 추가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Project 창에서 Sprite 이미지를 Hierarchy로 드래그&lt;/li&gt;
&lt;li&gt;자동으로 GameObject가 생성되고, 이름을 Player로 변경&lt;/li&gt;
&lt;li&gt;위치 조절: Transform &amp;gt; Position을 (0, 0, 0)으로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶ SpriteRenderer 구성 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Player 오브젝트 클릭 &amp;rarr; SpriteRenderer 컴포넌트 확인&lt;/li&gt;
&lt;li&gt;Sorting Layer: Main으로 변경 (2편에서 만들었을 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1tgot/btsNyHdZkRl/fr9l9ljLkdRkEptnT2pbHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1tgot/btsNyHdZkRl/fr9l9ljLkdRkEptnT2pbHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1tgot/btsNyHdZkRl/fr9l9ljLkdRkEptnT2pbHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1tgot%2FbtsNyHdZkRl%2Ffr9l9ljLkdRkEptnT2pbHK%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; alt=&quot;Unity Inspector에서 SpriteRenderer 컴포넌트를 확인하고 Sorting Layer를 설정하는 화면&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 지금까지 하면: 씬에 캐릭터가 배치되고 카메라에도 잘 보입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 캐릭터 이동 스크립트 작성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶ PlayerMovement.cs 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Assets &amp;gt; Scripts 폴더 생성&lt;/li&gt;
&lt;li&gt;우클릭 &amp;rarr; Create &amp;gt; C# Script &amp;rarr; 이름: PlayerMovement&lt;/li&gt;
&lt;li&gt;아래 코드를 입력합니다:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;

    void Update()
    {
        float moveX = Input.GetAxis(&quot;Horizontal&quot;);
        float moveY = Input.GetAxis(&quot;Vertical&quot;);

        transform.position += new Vector3(moveX, moveY, 0) * moveSpeed * Time.deltaTime;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶ 스크립트 연결&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Player 오브젝트에 PlayerMovement 스크립트를 드래그하여 붙입니다.&lt;/li&gt;
&lt;li&gt;Inspector에서 Move Speed 값을 적절히 조정 (예: 5)&lt;/li&gt;
&lt;/ul&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CfPaa/btsNzx9wAIa/KBqf1YAUBftU7icjlKGrc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CfPaa/btsNzx9wAIa/KBqf1YAUBftU7icjlKGrc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CfPaa/btsNzx9wAIa/KBqf1YAUBftU7icjlKGrc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCfPaa%2FbtsNzx9wAIa%2FKBqf1YAUBftU7icjlKGrc1%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; alt=&quot;Unity에서 PlayerMovement 스크립트를 Player 오브젝트에 연결하고 Move Speed 값을 설정하는 화면&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 작동 테스트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;▶ 버튼 클릭하여 실행&lt;/li&gt;
&lt;li&gt;방향키 또는 WASD로 캐릭터를 상하좌우로 이동 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  참고: Input.GetAxis는 키를 누르고 있을 때 부드러운 움직임을 구현해 줍니다.&lt;/p&gt;
&lt;/blockquote&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;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 중간광고 --&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;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 &lt;b&gt;2D 게임의 진짜 시작점&lt;/b&gt;인 스프라이트 처리와 캐릭터 이동을 완성했습니다. 다음 4편에서는 &lt;b&gt;충돌 처리 및 맵 만들기&lt;/b&gt;로 넘어가며, 벽, 바닥, 오브젝트 등과 상호작용하는 방법을 소개합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: ythouse.tistory.com&lt;/p&gt;</description>
      <category>Unity</category>
      <category>2d캐릭터이동</category>
      <category>unity2d게임</category>
      <category>unitymovement</category>
      <category>unitysprite</category>
      <category>unity게임개발</category>
      <category>게임프로그래밍</category>
      <category>스프라이트불러오기</category>
      <category>유니티강좌</category>
      <category>유니티스크립트</category>
      <category>유니티입문</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/228</guid>
      <comments>https://ythouse.tistory.com/228#entry228comment</comments>
      <pubDate>Thu, 24 Apr 2025 19:27:27 +0900</pubDate>
    </item>
    <item>
      <title>FTP 서버를 로컬 드라이브처럼! RaiDrive 사용법 총정리</title>
      <link>https://ythouse.tistory.com/227</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;FTP 서버를 로컬 드라이브처럼! RaiDrive 사용법 총정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 FTP 서버를 쓰는데 윈도우 탐색기처럼 쉽게 다룰 순 없을까? 홈페이지 파일을 직접 수정해야 하는데, 매번 FTP 클라이언트 켜고 로그인하긴 귀찮은데?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 때 딱 필요한 프로그램이 바로 **RaiDrive(라이드라이브)**입니다. 이 툴 하나만 있으면 FTP 서버를 마치 &lt;b&gt;내 PC의 드라이브처럼 연결&lt;/b&gt;해서 쓸 수 있어요. 별다른 어려운 설정도 없고, 클릭 몇 번이면 끝. 이번 글에서는 &lt;b&gt;RaiDrive를 활용해 FTP를 내 PC에 마운트하는 방법&lt;/b&gt;을 전체 흐름과 함께 정리해드릴게요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  RaiDrive란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RaiDrive는 클라우드 저장소나 FTP 서버를 윈도우 로컬 드라이브처럼 마운트해주는 무료 프로그램입니다. 원래는 Google Drive, Dropbox, OneDrive 같은 서비스를 로컬처럼 쓰기 위해 만들어졌지만, &lt;b&gt;FTP/SFTP/웹DAV 서버도 지원&lt;/b&gt;하기 때문에 서버 관리자나 웹디자이너에게도 인기 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점은 단순함. 설치하고, 계정만 입력하면 바로 드라이브처럼 열립니다. 윈도우 탐색기에서 바로 작업할 수 있기 때문에 별도 FTP 클라이언트를 띄우지 않아도 돼요.&lt;/p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  설치 및 준비&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;RaiDrive 공식 사이트로 이동:&lt;br /&gt; &lt;a href=&quot;https://www.raidrive.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; &lt;b&gt;RaiDrive 다운로드 페이지&amp;nbsp;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;접속 후 RaiDrive 다운로드 클릭&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;운영체제에 맞게 설치 파일 다운로드 후 실행&lt;/li&gt;
&lt;li&gt;설치가 완료되면 바탕화면에 아이콘 생성됨&lt;/li&gt;
&lt;li&gt;프로그램 실행 후 우측 상단 로그인 (회원가입 필요)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dynoeF/btsNxu0CUeF/qtuCz760Hdo9Fx9oEPxWu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dynoeF/btsNxu0CUeF/qtuCz760Hdo9Fx9oEPxWu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dynoeF/btsNxu0CUeF/qtuCz760Hdo9Fx9oEPxWu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdynoeF%2FbtsNxu0CUeF%2FqtuCz760Hdo9Fx9oEPxWu1%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;1124&quot; height=&quot;660&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  회원가입은 무료이며, 기본 기능만 사용한다면 유료 결제 없이 충분히 쓸 수 있어요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  FTP 서버 연결 설정 방법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;RaiDrive 실행 후 좌측 상단의 &lt;b&gt;[연결 추가]&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 선택&lt;/b&gt; &amp;rarr; FTP 또는 FTPS(보안 FTP)&lt;/li&gt;
&lt;li&gt;아래 항목들을 입력:&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&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&gt;주소&lt;/td&gt;
&lt;td&gt;ftp.myserver.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;포트&lt;/td&gt;
&lt;td&gt;21 또는 990 (FTPS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용자 이름&lt;/td&gt;
&lt;td&gt;yourID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비밀번호&lt;/td&gt;
&lt;td&gt;yourPassword&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;드라이브 문자 선택 (예: Z:)&lt;/li&gt;
&lt;li&gt;연결 버튼 클릭 &amp;rarr; 인증 성공 시 탐색기 열림&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이후부터는 매번 FTP 접속 안 해도 됩니다. 탐색기에서 드라이브만 클릭하면 자동 연결돼요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  탐색기처럼 FTP 서버 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결이 완료되면 &lt;b&gt;탐색기 내 내 PC 항목에 새로운 드라이브가 생성&lt;/b&gt;되어 있어요. 여기에 들어가면 FTP 서버 안의 디렉토리 구조가 그대로 보이고, 복사/붙여넣기, 새 폴더 만들기, 파일 수정도 전부 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치 D드라이브나 외장하드 쓰듯이 사용할 수 있기 때문에, FTP 관리나 유지보수가 훨씬 쉬워집니다. 웹서버 폴더에 CSS 수정 후 바로 저장하거나, 대용량 파일을 끌어다 놓기만 해도 자동 업로드가 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ 고급 설정 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자동 재연결&lt;/b&gt;: 네트워크 끊겼다가 재연결되면 자동 복구됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;읽기 전용 모드&lt;/b&gt;: 실수로 파일 삭제를 방지하고 싶을 때 켜두면 좋아요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;캐시 설정&lt;/b&gt;: 속도 향상을 위해 캐시 경로를 변경하거나 비활성화 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 접속(FTPS)&lt;/b&gt;: 반드시 사용하세요. FTP는 기본적으로 암호화되지 않기 때문에 보안상 취약합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  활용 아이디어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;회사 서버에 쉽게 접근&lt;/b&gt;: FTP로 관리하는 웹 호스팅 파일들을 드래그&amp;amp;드롭으로 편하게 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;라즈베리파이와 연결&lt;/b&gt;: 라즈베리파이에 FTP 서버 구성 후, PC에서 로컬처럼 접근&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NAS 장치 마운트&lt;/b&gt;: 집에서 쓰는 NAS에 FTP 기능이 있다면, RaiDrive로 접근 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹디자이너 협업&lt;/b&gt;: 디자이너도 복잡한 FTP 없이 폴더 드래그로 배포 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 마무리하며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RaiDrive는 FTP를 마치 로컬 드라이브처럼 다룰 수 있게 해주는 가성비 최강 툴입니다. 특히 초보자도 어렵지 않게 사용할 수 있다는 점에서 웹디자인, 개발, 서버 유지보수 쪽에서 활용도가 매우 높습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹서버가 FTP 기반이라면, 이제는 굳이 별도 파일질라(FileZilla) 없이도 관리가 가능해졌어요. 윈도우 탐색기 하나로 모든 걸 해결할 수 있다는 건 정말 큰 장점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: ythouse.tistory.com&lt;/p&gt;</description>
      <category>개발이야기</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/227</guid>
      <comments>https://ythouse.tistory.com/227#entry227comment</comments>
      <pubDate>Thu, 24 Apr 2025 16:08:26 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 + RTC 모듈로 디지털 시계 만들기 &amp;ndash; DS3231 연결부터 LCD 출력까지 완벽 정리</title>
      <link>https://ythouse.tistory.com/226</link>
      <description>&lt;p data-end=&quot;250&quot; data-start=&quot;59&quot; data-ke-size=&quot;size16&quot;&gt;매일 아침 스마트폰 대신 아두이노로 만든 시계가 시간을 알려준다면 어떨까요?&lt;br /&gt;RTC(Real Time Clock) 모듈을 활용하면, 아두이노가 전원이 꺼졌다 켜져도 시간을 기억하게 할 수 있습니다.&lt;br /&gt;이번 글에서는 DS3231 RTC 모듈을 사용하여 디지털 시계를 만드는 방법을 &lt;b&gt;회로 연결부터 LCD 출력까지&lt;/b&gt; 상세하게 소개합니다.&lt;/p&gt;
&lt;hr data-end=&quot;255&quot; data-start=&quot;252&quot; data-ke-style=&quot;style1&quot; /&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;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQJAk/btsNwMtbfzN/q2vaxztUP9UJsl7dbTpg41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQJAk/btsNwMtbfzN/q2vaxztUP9UJsl7dbTpg41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQJAk/btsNwMtbfzN/q2vaxztUP9UJsl7dbTpg41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQJAk%2FbtsNwMtbfzN%2Fq2vaxztUP9UJsl7dbTpg41%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;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;273&quot; data-start=&quot;257&quot; data-ke-size=&quot;size23&quot;&gt;1. RTC 모듈이란?&lt;/h3&gt;
&lt;p data-end=&quot;433&quot; data-start=&quot;275&quot; data-ke-size=&quot;size16&quot;&gt;RTC는 Real Time Clock, 즉 &lt;b&gt;실시간 시계 모듈&lt;/b&gt;입니다.&lt;br /&gt;아두이노 자체는 시간이 흐르는 것을 기억하지 못하기 때문에, 전원이 꺼지면 현재 시간이 초기화됩니다.&lt;br /&gt;하지만 RTC 모듈을 사용하면, 내장된 배터리 덕분에 전원이 꺼져도 시간을 계속 기억할 수 있어요.&lt;/p&gt;
&lt;p data-end=&quot;472&quot; data-start=&quot;435&quot; data-ke-size=&quot;size16&quot;&gt;그중에서도 &lt;b&gt;DS3231&lt;/b&gt;은 다음과 같은 장점을 갖고 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;558&quot; data-start=&quot;474&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;503&quot; data-start=&quot;474&quot;&gt;I2C 방식 통신 (SDA, SCL 2핀만 사용)&lt;/li&gt;
&lt;li data-end=&quot;527&quot; data-start=&quot;504&quot;&gt;&lt;b&gt;온도 보정 기능&lt;/b&gt;으로 정확도 높음&lt;/li&gt;
&lt;li data-end=&quot;558&quot; data-start=&quot;528&quot;&gt;&lt;b&gt;CR2032 배터리&lt;/b&gt;로 수년간 시간 유지 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;563&quot; data-start=&quot;560&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;575&quot; data-start=&quot;565&quot; data-ke-size=&quot;size23&quot;&gt;2. 준비물&lt;/h3&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;710&quot; data-start=&quot;577&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;710&quot; data-start=&quot;605&quot;&gt;
&lt;tr data-end=&quot;630&quot; data-start=&quot;605&quot;&gt;
&lt;td data-end=&quot;621&quot; data-start=&quot;605&quot;&gt;아두이노 UNO/Nano&lt;/td&gt;
&lt;td data-end=&quot;630&quot; data-start=&quot;621&quot;&gt;메인 보드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;660&quot; data-start=&quot;631&quot;&gt;
&lt;td data-end=&quot;647&quot; data-start=&quot;631&quot;&gt;DS3231 RTC 모듈&lt;/td&gt;
&lt;td data-end=&quot;660&quot; data-start=&quot;647&quot;&gt;실시간 시계 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;688&quot; data-start=&quot;661&quot;&gt;
&lt;td data-end=&quot;678&quot; data-start=&quot;661&quot;&gt;I2C LCD (16x2)&lt;/td&gt;
&lt;td data-end=&quot;688&quot; data-start=&quot;678&quot;&gt;시간 출력용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;710&quot; data-start=&quot;689&quot;&gt;
&lt;td data-end=&quot;703&quot; data-start=&quot;689&quot;&gt;브레드보드 &amp;amp; 점퍼선&lt;/td&gt;
&lt;td data-end=&quot;710&quot; data-start=&quot;703&quot;&gt;연결용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;778&quot; data-start=&quot;712&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;778&quot; data-start=&quot;714&quot; data-ke-size=&quot;size16&quot;&gt;  참고: LCD 없이도 시리얼 모니터로 확인 가능하지만, LCD를 활용하면 시계 느낌을 제대로 낼 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;783&quot; data-start=&quot;780&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;797&quot; data-start=&quot;785&quot; data-ke-size=&quot;size23&quot;&gt;3. 회로 연결&lt;/h3&gt;
&lt;h4 data-end=&quot;817&quot; data-start=&quot;799&quot; data-ke-size=&quot;size20&quot;&gt;DS3231 &amp;harr; 아두이노&lt;/h4&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;DS3231 핀아두이노 핀
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;981&quot; data-start=&quot;819&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;981&quot; data-start=&quot;870&quot;&gt;
&lt;tr data-end=&quot;898&quot; data-start=&quot;870&quot;&gt;
&lt;td data-end=&quot;882&quot; data-start=&quot;870&quot;&gt;VCC&lt;/td&gt;
&lt;td data-end=&quot;898&quot; data-start=&quot;882&quot;&gt;5V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;927&quot; data-start=&quot;899&quot;&gt;
&lt;td data-end=&quot;911&quot; data-start=&quot;899&quot;&gt;GND&lt;/td&gt;
&lt;td data-end=&quot;927&quot; data-start=&quot;911&quot;&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;954&quot; data-start=&quot;928&quot;&gt;
&lt;td data-end=&quot;940&quot; data-start=&quot;928&quot;&gt;SDA&lt;/td&gt;
&lt;td data-end=&quot;954&quot; data-start=&quot;940&quot;&gt;A4 (UNO 기준)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;981&quot; data-start=&quot;955&quot;&gt;
&lt;td data-end=&quot;967&quot; data-start=&quot;955&quot;&gt;SCL&lt;/td&gt;
&lt;td data-end=&quot;981&quot; data-start=&quot;967&quot;&gt;A5 (UNO 기준)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1007&quot; data-start=&quot;983&quot; data-ke-size=&quot;size20&quot;&gt;LCD &amp;harr; 아두이노 (I2C 방식)&lt;/h4&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;LCD 핀아두이노 핀
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1152&quot; data-start=&quot;1009&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1152&quot; data-start=&quot;1053&quot;&gt;
&lt;tr data-end=&quot;1077&quot; data-start=&quot;1053&quot;&gt;
&lt;td data-end=&quot;1062&quot; data-start=&quot;1053&quot;&gt;VCC&lt;/td&gt;
&lt;td data-end=&quot;1077&quot; data-start=&quot;1062&quot;&gt;5V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1102&quot; data-start=&quot;1078&quot;&gt;
&lt;td data-end=&quot;1087&quot; data-start=&quot;1078&quot;&gt;GND&lt;/td&gt;
&lt;td data-end=&quot;1102&quot; data-start=&quot;1087&quot;&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1127&quot; data-start=&quot;1103&quot;&gt;
&lt;td data-end=&quot;1112&quot; data-start=&quot;1103&quot;&gt;SDA&lt;/td&gt;
&lt;td data-end=&quot;1127&quot; data-start=&quot;1112&quot;&gt;A4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1152&quot; data-start=&quot;1128&quot;&gt;
&lt;td data-end=&quot;1137&quot; data-start=&quot;1128&quot;&gt;SCL&lt;/td&gt;
&lt;td data-end=&quot;1152&quot; data-start=&quot;1137&quot;&gt;A5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1205&quot; data-start=&quot;1154&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1205&quot; data-start=&quot;1156&quot; data-ke-size=&quot;size16&quot;&gt;  DS3231과 LCD 모두 I2C 방식을 사용하므로 &lt;b&gt;병렬 연결&lt;/b&gt;이 가능합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1210&quot; data-start=&quot;1207&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1227&quot; data-start=&quot;1212&quot; data-ke-size=&quot;size23&quot;&gt;4. 라이브러리 설치&lt;/h3&gt;
&lt;p data-end=&quot;1256&quot; data-start=&quot;1229&quot; data-ke-size=&quot;size16&quot;&gt;아두이노 IDE에서 아래 라이브러리를 설치하세요:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1301&quot; data-start=&quot;1258&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1279&quot; data-start=&quot;1258&quot;&gt;RTClib (Adafruit)&lt;/li&gt;
&lt;li data-end=&quot;1301&quot; data-start=&quot;1280&quot;&gt;LiquidCrystal_I2C&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설치 경로&lt;/b&gt;:&lt;br /&gt;메뉴 &amp;gt; 스케치 &amp;gt; 라이브러리 포함하기 &amp;gt; 라이브러리 관리&lt;br /&gt;검색창에 RTClib, LiquidCrystal_I2C 입력 후 설치&lt;/p&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size16&quot;&gt;#include&amp;nbsp;&amp;lt;Wire.h&amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;lt;RTClib.h&amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;lt;LiquidCrystal_I2C.h&amp;gt; &lt;br /&gt;&lt;br /&gt;RTC_DS3231&amp;nbsp;rtc; &lt;br /&gt;LiquidCrystal_I2C&amp;nbsp;lcd(0x27,&amp;nbsp;16,&amp;nbsp;2);&amp;nbsp;//&amp;nbsp;LCD&amp;nbsp;주소는&amp;nbsp;0x27&amp;nbsp;또는&amp;nbsp;0x3F일&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;&lt;br /&gt;void&amp;nbsp;setup()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;Serial.begin(9600); &lt;br /&gt;&amp;nbsp;&amp;nbsp;Wire.begin(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;rtc.begin(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.begin(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.backlight(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(rtc.lostPower())&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Serial.println(&quot;RTC&amp;nbsp;전원&amp;nbsp;초기화:&amp;nbsp;시간&amp;nbsp;설정&amp;nbsp;필요&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rtc.adjust(DateTime(F(__DATE__),&amp;nbsp;F(__TIME__)));&amp;nbsp;//&amp;nbsp;컴파일된&amp;nbsp;시간으로&amp;nbsp;설정 &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.setCursor(0,&amp;nbsp;0); &lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.print(&quot;RTC&amp;nbsp;Clock&amp;nbsp;Start&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;delay(2000); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;void&amp;nbsp;loop()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;DateTime&amp;nbsp;now&amp;nbsp;=&amp;nbsp;rtc.now(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;timeStr[20]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(timeStr,&amp;nbsp;&quot;%02d:%02d:%02d&quot;,&amp;nbsp;now.hour(),&amp;nbsp;now.minute(),&amp;nbsp;now.second()); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.clear(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.setCursor(0,&amp;nbsp;0); &lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.print(&quot;Time:&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.setCursor(6,&amp;nbsp;0); &lt;br /&gt;&amp;nbsp;&amp;nbsp;lcd.print(timeStr); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Serial.print(&quot;현재&amp;nbsp;시각:&amp;nbsp;&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;Serial.println(timeStr); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;delay(1000); &lt;br /&gt;}&lt;/p&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;text-align: center; margin: 20px 0;&quot;&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
       (adsbygoogle = window.adsbygoogle || []).push({});
  &lt;/script&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2454&quot; data-start=&quot;2439&quot; data-ke-size=&quot;size23&quot;&gt;6. 출력 방식 응용&lt;/h3&gt;
&lt;h4 data-end=&quot;2470&quot; data-start=&quot;2456&quot; data-ke-size=&quot;size20&quot;&gt;✅ OLED 출력&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2538&quot; data-start=&quot;2472&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2491&quot; data-start=&quot;2472&quot;&gt;0.96&quot; I2C OLED 사용&lt;/li&gt;
&lt;li data-end=&quot;2538&quot; data-start=&quot;2492&quot;&gt;Adafruit_SSD1306 및 Adafruit_GFX 라이브러리 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;2558&quot; data-start=&quot;2540&quot; data-ke-size=&quot;size20&quot;&gt;✅ 블루투스로 시간 전송&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2612&quot; data-start=&quot;2560&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2592&quot; data-start=&quot;2560&quot;&gt;SoftwareSerial로 HC-06 모듈과 연결&lt;/li&gt;
&lt;li data-end=&quot;2612&quot; data-start=&quot;2593&quot;&gt;스마트폰 앱으로 시간 수신 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;2633&quot; data-start=&quot;2614&quot; data-ke-size=&quot;size20&quot;&gt;✅ 부저로 알람 기능 추가&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2670&quot; data-start=&quot;2635&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2670&quot; data-start=&quot;2635&quot;&gt;특정 시간 조건에서 tone() 함수로 알림음 재생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2675&quot; data-start=&quot;2672&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2694&quot; data-start=&quot;2677&quot; data-ke-size=&quot;size23&quot;&gt;7. 실전 활용 아이디어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2811&quot; data-start=&quot;2696&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2726&quot; data-start=&quot;2696&quot;&gt;&lt;b&gt;시계 겸 온습도 모니터링&lt;/b&gt; (DHT11 추가)&lt;/li&gt;
&lt;li data-end=&quot;2755&quot; data-start=&quot;2727&quot;&gt;&lt;b&gt;알람 시계 만들기&lt;/b&gt; (버튼 + 부저 활용)&lt;/li&gt;
&lt;li data-end=&quot;2783&quot; data-start=&quot;2756&quot;&gt;&lt;b&gt;SD카드와 연결하여 시간별 데이터 기록&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2811&quot; data-start=&quot;2784&quot;&gt;&lt;b&gt;재실 감지 + 시간대별 자동 조명 제어&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2816&quot; data-start=&quot;2813&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2832&quot; data-start=&quot;2818&quot; data-ke-size=&quot;size23&quot;&gt;8. 문제 해결 팁&lt;/h3&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;문제원인/해결
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3037&quot; data-start=&quot;2834&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3037&quot; data-start=&quot;2871&quot;&gt;
&lt;tr data-end=&quot;2926&quot; data-start=&quot;2871&quot;&gt;
&lt;td data-end=&quot;2888&quot; data-start=&quot;2871&quot;&gt;LCD에 아무것도 안 나옴&lt;/td&gt;
&lt;td data-end=&quot;2926&quot; data-start=&quot;2888&quot;&gt;I2C 주소가 다를 수 있음 &amp;rarr; I2C Scanner 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2968&quot; data-start=&quot;2927&quot;&gt;
&lt;td data-end=&quot;2940&quot; data-start=&quot;2927&quot;&gt;시간 설정이 안 됨&lt;/td&gt;
&lt;td data-end=&quot;2968&quot; data-start=&quot;2940&quot;&gt;rtc.lostPower() 조건 확인 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3037&quot; data-start=&quot;2969&quot;&gt;
&lt;td data-end=&quot;2990&quot; data-start=&quot;2969&quot;&gt;시리얼엔 나오는데 LCD만 안 됨&lt;/td&gt;
&lt;td data-end=&quot;3037&quot; data-start=&quot;2990&quot;&gt;lcd.begin() 또는 lcd.backlight() 누락 여부 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3042&quot; data-start=&quot;3039&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;text-align: center; margin: 20px 0;&quot;&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
       (adsbygoogle = window.adsbygoogle || []).push({});
  &lt;/script&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3059&quot; data-start=&quot;3056&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3072&quot; data-start=&quot;3061&quot; data-ke-size=&quot;size23&quot;&gt;9. 마무리&lt;/h3&gt;
&lt;p data-end=&quot;3207&quot; data-start=&quot;3074&quot; data-ke-size=&quot;size16&quot;&gt;DS3231 RTC 모듈을 이용한 디지털 시계 만들기는 아두이노 입문자에게 아주 훌륭한 프로젝트입니다.&lt;br /&gt;단순히 시간을 출력하는 것에 그치지 않고, &lt;b&gt;다양한 모듈과 연계하여 시계 이상의 기능&lt;/b&gt;을 구현할 수 있다는 점이 큰 매력입니다.&lt;/p&gt;
&lt;p data-end=&quot;3316&quot; data-start=&quot;3209&quot; data-ke-size=&quot;size16&quot;&gt;이제 단순한 시간 표시를 넘어서, 여러분만의 스마트 시계를 만들어보세요.&lt;br /&gt;다음 글에서는 &lt;b&gt;SD카드 로그 기록&lt;/b&gt;과 &lt;b&gt;웹에 시간 표시하기&lt;/b&gt; 기능도 이어서 다룰 예정입니다. 기대해주세요!&lt;/p&gt;
&lt;p data-end=&quot;3414&quot; data-start=&quot;3323&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DIY프로젝트</category>
      <category>ds3231</category>
      <category>I2C통신</category>
      <category>LCD</category>
      <category>rtc모듈</category>
      <category>디지털시계</category>
      <category>아두이노</category>
      <category>아두이노강좌</category>
      <category>전자시계</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/226</guid>
      <comments>https://ythouse.tistory.com/226#entry226comment</comments>
      <pubDate>Wed, 23 Apr 2025 08:31:11 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 블로그 시리즈 &amp;ndash; 블루투스로 모터 제어하기 (HC-06)</title>
      <link>https://ythouse.tistory.com/225</link>
      <description>&lt;h1 data-end=&quot;114&quot; data-start=&quot;76&quot;&gt;  블루투스로 모터 제어하기 &amp;ndash; 아두이노 + HC-06 모듈&lt;/h1&gt;
&lt;h3 data-end=&quot;144&quot; data-start=&quot;115&quot; data-ke-size=&quot;size23&quot;&gt;스마트폰에서 명령을 보내면, 모터가 회전한다!&lt;/h3&gt;
&lt;hr data-end=&quot;149&quot; data-start=&quot;146&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;160&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;  준비물&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;317&quot; data-start=&quot;162&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;185&quot; data-start=&quot;162&quot;&gt;아두이노 UNO (또는 호환 보드)&lt;/li&gt;
&lt;li data-end=&quot;203&quot; data-start=&quot;186&quot;&gt;HC-06 블루투스 모듈&lt;/li&gt;
&lt;li data-end=&quot;216&quot; data-start=&quot;204&quot;&gt;DC 모터 1개&lt;/li&gt;
&lt;li data-end=&quot;237&quot; data-start=&quot;217&quot;&gt;트랜지스터 (TIP120 등)&lt;/li&gt;
&lt;li data-end=&quot;260&quot; data-start=&quot;238&quot;&gt;다이오드 1개 (1N4007 등)&lt;/li&gt;
&lt;li data-end=&quot;272&quot; data-start=&quot;261&quot;&gt;220&amp;Omega; 저항&lt;/li&gt;
&lt;li data-end=&quot;304&quot; data-start=&quot;273&quot;&gt;스마트폰 + Bluetooth Terminal 앱&lt;/li&gt;
&lt;li data-end=&quot;317&quot; data-start=&quot;305&quot;&gt;점퍼선, 브레드보드&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;322&quot; data-start=&quot;319&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;335&quot; data-start=&quot;324&quot; data-ke-size=&quot;size26&quot;&gt;  개념 요약&lt;/h2&gt;
&lt;p data-end=&quot;430&quot; data-start=&quot;337&quot; data-ke-size=&quot;size16&quot;&gt;HC-06 모듈은 시리얼 통신 방식으로 아두이노와 연결됩니다.&lt;br /&gt;우리는 스마트폰에서 &amp;ldquo;1&amp;rdquo; 또는 &amp;ldquo;0&amp;rdquo;을 전송해&lt;br /&gt;모터를 ON/OFF 시키는 시스템을 만들 겁니다.&lt;/p&gt;
&lt;p data-end=&quot;434&quot; data-start=&quot;432&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;469&quot; data-start=&quot;436&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;469&quot; data-start=&quot;438&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스마트폰 &amp;rarr; HC-06 &amp;rarr; 아두이노 &amp;rarr; 모터 제어&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;474&quot; data-start=&quot;471&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;491&quot; data-start=&quot;476&quot; data-ke-size=&quot;size26&quot;&gt;  회로 연결도 설명&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;구성 요소아두이노 핀비고
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;816&quot; data-start=&quot;493&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;816&quot; data-start=&quot;563&quot;&gt;
&lt;tr data-end=&quot;613&quot; data-start=&quot;563&quot;&gt;
&lt;td data-end=&quot;580&quot; data-start=&quot;563&quot;&gt;HC-06 TX&lt;/td&gt;
&lt;td data-end=&quot;594&quot; data-start=&quot;580&quot;&gt;D0 (RX)&lt;/td&gt;
&lt;td data-end=&quot;613&quot; data-start=&quot;594&quot;&gt;아두이노의 RX는 입력 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;672&quot; data-start=&quot;614&quot;&gt;
&lt;td data-end=&quot;631&quot; data-start=&quot;614&quot;&gt;HC-06 RX&lt;/td&gt;
&lt;td data-end=&quot;656&quot; data-start=&quot;631&quot;&gt;D1 (TX &amp;rarr; 1k&amp;Omega; &amp;rarr; 2k&amp;Omega; 분압)&lt;/td&gt;
&lt;td data-end=&quot;672&quot; data-start=&quot;656&quot;&gt;5V &amp;rarr; 3.3V 분압&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;707&quot; data-start=&quot;673&quot;&gt;
&lt;td data-end=&quot;690&quot; data-start=&quot;673&quot;&gt;HC-06 VCC&lt;/td&gt;
&lt;td data-end=&quot;707&quot; data-start=&quot;690&quot;&gt;5V&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;742&quot; data-start=&quot;708&quot;&gt;
&lt;td data-end=&quot;725&quot; data-start=&quot;708&quot;&gt;HC-06 GND&lt;/td&gt;
&lt;td data-end=&quot;742&quot; data-start=&quot;725&quot;&gt;GND&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;786&quot; data-start=&quot;743&quot;&gt;
&lt;td data-end=&quot;760&quot; data-start=&quot;743&quot;&gt;모터 + 트랜지스터 베이스&lt;/td&gt;
&lt;td data-end=&quot;774&quot; data-start=&quot;760&quot;&gt;D9&lt;/td&gt;
&lt;td data-end=&quot;786&quot; data-start=&quot;774&quot;&gt;PWM 제어 핀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;816&quot; data-start=&quot;787&quot;&gt;
&lt;td data-end=&quot;801&quot; data-start=&quot;787&quot;&gt;다이오드&lt;/td&gt;
&lt;td data-end=&quot;816&quot; data-start=&quot;801&quot;&gt;모터 역전류 방지&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7E9i/btsNujLgf8e/ZgXckWRYskr7nkupFCqIBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7E9i/btsNujLgf8e/ZgXckWRYskr7nkupFCqIBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7E9i/btsNujLgf8e/ZgXckWRYskr7nkupFCqIBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7E9i%2FbtsNujLgf8e%2FZgXckWRYskr7nkupFCqIBK%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;550&quot; height=&quot;473&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;1575&quot; data-start=&quot;1557&quot; data-ke-size=&quot;size26&quot;&gt;  스마트폰 앱 설정 방법&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1733&quot; data-start=&quot;1577&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1639&quot; data-start=&quot;1577&quot;&gt;Google Play 또는 App Store에서 &lt;b&gt;Bluetooth Terminal&lt;/b&gt; 검색 후 설치&lt;/li&gt;
&lt;li data-end=&quot;1676&quot; data-start=&quot;1640&quot;&gt;앱 실행 후 &amp;lsquo;Connect&amp;rsquo; &amp;rarr; &lt;b&gt;HC-06 선택&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1712&quot; data-start=&quot;1677&quot;&gt;연결되면 상단 텍스트창에 &quot;1&quot; &amp;rarr; 전송 &amp;rarr; 모터 ON&lt;/li&gt;
&lt;li data-end=&quot;1733&quot; data-start=&quot;1713&quot;&gt;&quot;0&quot; 전송 시 &amp;rarr; 모터 OFF&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-end=&quot;1824&quot; data-start=&quot;1735&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1824&quot; data-start=&quot;1737&quot; data-ke-size=&quot;size16&quot;&gt;터미널 앱은 HC-06에 문자열 명령을 보내는 역할만 합니다.&lt;br /&gt;다양한 앱 대체도 가능 (e.g. Arduino Bluetooth Controller)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1829&quot; data-start=&quot;1826&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1841&quot; data-start=&quot;1831&quot; data-ke-size=&quot;size26&quot;&gt;⚠️ 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2003&quot; data-start=&quot;1843&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1925&quot; data-start=&quot;1843&quot;&gt;&lt;b&gt;HC-06은 3.3V 전압 기준의 RX 입력만 받습니다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1925&quot; data-start=&quot;1885&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1925&quot; data-start=&quot;1885&quot;&gt;1K&amp;Omega; / 2K&amp;Omega; 저항으로 전압 분할 회로 구성해야 안정적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1959&quot; data-start=&quot;1926&quot;&gt;모터에는 &lt;b&gt;역전류 방지용 다이오드&lt;/b&gt; 반드시 연결!&lt;/li&gt;
&lt;li data-end=&quot;2003&quot; data-start=&quot;1960&quot;&gt;전원 부족 시 모터가 돌지 않을 수 있으니 &lt;b&gt;외부 전원&lt;/b&gt;도 고려하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2008&quot; data-start=&quot;2005&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-end=&quot;2021&quot; data-start=&quot;2018&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2034&quot; data-start=&quot;2023&quot; data-ke-size=&quot;size26&quot;&gt;✅ 마무리 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2110&quot; data-start=&quot;2036&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2061&quot; data-start=&quot;2036&quot;&gt;스마트폰으로 &amp;lsquo;1&amp;rsquo; 문자 &amp;rarr; 모터 ON&lt;/li&gt;
&lt;li data-end=&quot;2081&quot; data-start=&quot;2062&quot;&gt;&amp;lsquo;0&amp;rsquo; 문자 &amp;rarr; 모터 OFF&lt;/li&gt;
&lt;li data-end=&quot;2110&quot; data-start=&quot;2082&quot;&gt;시리얼 통신만 이해하면 다양한 명령 확장 가능!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2123&quot; data-start=&quot;2112&quot; data-ke-size=&quot;size23&quot;&gt;확장 아이디어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2226&quot; data-start=&quot;2125&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2156&quot; data-start=&quot;2125&quot;&gt;&amp;ldquo;2&amp;rdquo; 입력 시 반대방향 회전 (H-브릿지 추가)&lt;/li&gt;
&lt;li data-end=&quot;2195&quot; data-start=&quot;2157&quot;&gt;속도 제어: &amp;ldquo;1~9&amp;rdquo; &amp;rarr; PWM 값으로 바꿔 모터 속도 조절&lt;/li&gt;
&lt;li data-end=&quot;2226&quot; data-start=&quot;2196&quot;&gt;온도 센서와 결합 &amp;rarr; 특정 온도 이상 시 자동 작동&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>아두이노</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/225</guid>
      <comments>https://ythouse.tistory.com/225#entry225comment</comments>
      <pubDate>Tue, 22 Apr 2025 08:43:14 +0900</pubDate>
    </item>
    <item>
      <title>나도 AI를 만들어볼 수 있을까? &amp;ndash; 직접 체험해보는 인공지능 입문 실습 가이드</title>
      <link>https://ythouse.tistory.com/219</link>
      <description>&lt;p data-end=&quot;106&quot; data-start=&quot;81&quot; data-ke-size=&quot;size16&quot;&gt;  나도 AI를 만들어볼 수 있을까?&lt;/p&gt;
&lt;h3 data-end=&quot;136&quot; data-start=&quot;107&quot; data-ke-size=&quot;size23&quot;&gt;&amp;ndash; 직접 체험해보는 인공지능 입문 실습 가이드&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVLypM/btsNxnNchcG/VhKVB1GdbH2tyUhPF980fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVLypM/btsNxnNchcG/VhKVB1GdbH2tyUhPF980fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVLypM/btsNxnNchcG/VhKVB1GdbH2tyUhPF980fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVLypM%2FbtsNxnNchcG%2FVhKVB1GdbH2tyUhPF980fk%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; alt=&quot;나도 AI를 만들어볼 수 있을까? 직접 체험해보는 인공지능 입문 실습 가이드 &amp;ndash; 로봇과 뉴럴넷 심볼이 있는 이미지, 출처 ythouse.tistory.com&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;306&quot; data-start=&quot;279&quot; data-ke-size=&quot;size26&quot;&gt;  AI, 보기만 하지 말고 한번 만져보자&lt;/h2&gt;
&lt;p data-end=&quot;365&quot; data-start=&quot;308&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 우리는 AI의 개념, 방식, 실제 사례까지 함께 살펴봤습니다.&lt;br /&gt;그럼 이제 드는 생각 하나:&lt;/p&gt;
&lt;blockquote data-end=&quot;393&quot; data-start=&quot;367&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;393&quot; data-start=&quot;369&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나도 한번 만들어보고 싶은데&amp;hellip; 가능할까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;461&quot; data-start=&quot;395&quot; data-ke-size=&quot;size16&quot;&gt;정답은 YES입니다.&lt;br /&gt;심지어 &lt;b&gt;코딩을 하나도 몰라도&lt;/b&gt; 가능한 방법이 있어요.&lt;br /&gt;바로 오늘 소개할 도구들입니다.&lt;/p&gt;
&lt;hr data-end=&quot;466&quot; data-start=&quot;463&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;509&quot; data-start=&quot;468&quot; data-ke-size=&quot;size26&quot;&gt;  Teachable Machine &amp;ndash; 구글이 만든 AI 체험 도구&lt;/h2&gt;
&lt;p data-end=&quot;593&quot; data-start=&quot;511&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://teachablemachine.withgoogle.com&quot;&gt;https://teachablemachine.withgoogle.com&lt;/a&gt;&lt;/p&gt;
&lt;p data-end=&quot;617&quot; data-start=&quot;595&quot; data-ke-size=&quot;size16&quot;&gt;이 사이트에서는 &lt;b&gt;웹캠만 있으면&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;675&quot; data-start=&quot;618&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;632&quot; data-start=&quot;618&quot;&gt;내 얼굴 표정 인식&lt;/li&gt;
&lt;li data-end=&quot;642&quot; data-start=&quot;633&quot;&gt;물체 분류&lt;/li&gt;
&lt;li data-end=&quot;675&quot; data-start=&quot;643&quot;&gt;동작 인식&lt;br /&gt;등을 전부 쉽게 테스트해볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;707&quot; data-start=&quot;677&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;707&quot; data-start=&quot;679&quot; data-ke-size=&quot;size16&quot;&gt;완전 비전공자용, 클릭 몇 번이면 내 AI가 탄생!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-end=&quot;726&quot; data-start=&quot;723&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;759&quot; data-start=&quot;728&quot; data-ke-size=&quot;size26&quot;&gt;  실습 예시 &amp;ndash; 웹캠으로 표정 분류 AI 만들기&lt;/h2&gt;
&lt;h3 data-end=&quot;770&quot; data-start=&quot;761&quot; data-ke-size=&quot;size23&quot;&gt;준비물&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;803&quot; data-start=&quot;771&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;782&quot; data-start=&quot;771&quot;&gt;크롬 브라우저&lt;/li&gt;
&lt;li data-end=&quot;803&quot; data-start=&quot;783&quot;&gt;웹캠 (노트북 내장 카메라 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;816&quot; data-start=&quot;805&quot; data-ke-size=&quot;size23&quot;&gt;실습 과정&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;956&quot; data-start=&quot;817&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;844&quot; data-start=&quot;817&quot;&gt;사이트 접속 후 &amp;ldquo;이미지 프로젝트&amp;rdquo; 선택&lt;/li&gt;
&lt;li data-end=&quot;878&quot; data-start=&quot;845&quot;&gt;클래스 2개 생성 (예: 웃는 얼굴, 찡그린 얼굴)&lt;/li&gt;
&lt;li data-end=&quot;911&quot; data-start=&quot;879&quot;&gt;각 표정에 대해 웹캠 데이터 수집 (10~20장)&lt;/li&gt;
&lt;li data-end=&quot;941&quot; data-start=&quot;912&quot;&gt;Train 클릭 (몇 초만에 AI가 학습함)&lt;/li&gt;
&lt;li data-end=&quot;956&quot; data-start=&quot;942&quot;&gt;실시간 테스트 시작!&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-end=&quot;997&quot; data-start=&quot;958&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;997&quot; data-start=&quot;960&quot; data-ke-size=&quot;size16&quot;&gt;놀랍게도, &lt;b&gt;직접 만든 AI가 내 표정을 인식하고 반응&lt;/b&gt;합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1002&quot; data-start=&quot;999&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1029&quot; data-start=&quot;1004&quot; data-ke-size=&quot;size26&quot;&gt;  확장 예시 &amp;ndash; 소리로 작동하는 AI&lt;/h2&gt;
&lt;p data-end=&quot;1058&quot; data-start=&quot;1031&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;소리를 들으면 반응하는 AI도 만들 수 있어?&amp;rdquo;&lt;/p&gt;
&lt;p data-end=&quot;1112&quot; data-start=&quot;1060&quot; data-ke-size=&quot;size16&quot;&gt;Teachable Machine에서는 &lt;b&gt;소리(마이크 입력)&lt;/b&gt; 기반 AI도 만들 수 있어요.&lt;/p&gt;
&lt;p data-end=&quot;1122&quot; data-start=&quot;1114&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1155&quot; data-start=&quot;1123&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1134&quot; data-start=&quot;1123&quot;&gt;&amp;ldquo;박수 소리&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1145&quot; data-start=&quot;1135&quot;&gt;&amp;ldquo;쉿 소리&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1155&quot; data-start=&quot;1146&quot;&gt;&amp;ldquo;음~ 소리&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1213&quot; data-start=&quot;1157&quot; data-ke-size=&quot;size16&quot;&gt;이런 소리를 클래스별로 수집하고 훈련시키면,&lt;br /&gt;AI가 소리를 들을 때마다 어떤 소리인지 판단합니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1239&quot; data-start=&quot;1215&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1239&quot; data-start=&quot;1217&quot; data-ke-size=&quot;size16&quot;&gt;마치 &lt;b&gt;AI 귀&lt;/b&gt;를 만들어보는 느낌!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1244&quot; data-start=&quot;1241&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1270&quot; data-start=&quot;1246&quot; data-ke-size=&quot;size26&quot;&gt;  결과는 어떻게 써먹을 수 있을까?&lt;/h2&gt;
&lt;p data-end=&quot;1284&quot; data-start=&quot;1272&quot; data-ke-size=&quot;size16&quot;&gt;훈련한 AI 모델은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1357&quot; data-start=&quot;1285&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1306&quot; data-start=&quot;1285&quot;&gt;웹사이트로 바로 테스트 가능하고&lt;/li&gt;
&lt;li data-end=&quot;1357&quot; data-start=&quot;1307&quot;&gt;Tensorflow.js 또는 Python으로 &lt;b&gt;내 프로그램에 넣을 수도 있습니다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1367&quot; data-start=&quot;1359&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1431&quot; data-start=&quot;1368&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1386&quot; data-start=&quot;1368&quot;&gt;웃으면 자동으로 음악 재생&lt;/li&gt;
&lt;li data-end=&quot;1408&quot; data-start=&quot;1387&quot;&gt;박수치면 조명이 켜지는 프로젝트&lt;/li&gt;
&lt;li data-end=&quot;1431&quot; data-start=&quot;1409&quot;&gt;&amp;ldquo;시작&amp;rdquo;이라는 음성에 반응하는 앱 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1472&quot; data-start=&quot;1433&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;간단한 센서나 키트 + 이 모델만 있으면 직접 연동 가능&lt;/b&gt;합니다.&lt;/p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-end=&quot;1491&quot; data-start=&quot;1488&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1511&quot; data-start=&quot;1493&quot; data-ke-size=&quot;size26&quot;&gt;✅ 체험 추천 플랫폼 총정리&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;플랫폼특징주소
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2045&quot; data-start=&quot;1513&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2045&quot; data-start=&quot;1636&quot;&gt;
&lt;tr data-end=&quot;1724&quot; data-start=&quot;1636&quot;&gt;
&lt;td data-end=&quot;1657&quot; data-start=&quot;1636&quot;&gt;Teachable Machine&lt;/td&gt;
&lt;td data-end=&quot;1681&quot; data-start=&quot;1657&quot;&gt;이미지/소리/포즈로 AI 만들기&lt;/td&gt;
&lt;td data-end=&quot;1724&quot; data-start=&quot;1681&quot;&gt;&lt;a href=&quot;https://teachablemachine.withgoogle.com&quot;&gt;https://teachablemachine.withgoogle.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1806&quot; data-start=&quot;1725&quot;&gt;
&lt;td data-end=&quot;1746&quot; data-start=&quot;1725&quot;&gt;QuickDraw&lt;/td&gt;
&lt;td data-end=&quot;1770&quot; data-start=&quot;1746&quot;&gt;낙서로 AI와 그림 맞추기 게임&lt;/td&gt;
&lt;td data-end=&quot;1806&quot; data-start=&quot;1770&quot;&gt;&lt;a href=&quot;https://quickdraw.withgoogle.com&quot;&gt;https://quickdraw.withgoogle.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1876&quot; data-start=&quot;1807&quot;&gt;
&lt;td data-end=&quot;1828&quot; data-start=&quot;1807&quot;&gt;Runway ML&lt;/td&gt;
&lt;td data-end=&quot;1852&quot; data-start=&quot;1828&quot;&gt;생성형 AI 영상/이미지 만들기&lt;/td&gt;
&lt;td data-end=&quot;1876&quot; data-start=&quot;1852&quot;&gt;&lt;a href=&quot;https://runwayml.com&quot;&gt;https://runwayml.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1958&quot; data-start=&quot;1877&quot;&gt;
&lt;td data-end=&quot;1898&quot; data-start=&quot;1877&quot;&gt;HuggingFace Space&lt;/td&gt;
&lt;td data-end=&quot;1925&quot; data-start=&quot;1898&quot;&gt;다양한 AI 데모 실습 가능&lt;/td&gt;
&lt;td data-end=&quot;1958&quot; data-start=&quot;1925&quot;&gt;&lt;a href=&quot;https://huggingface.co/spaces&quot;&gt;https://huggingface.co/spaces&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2045&quot; data-start=&quot;1959&quot;&gt;
&lt;td data-end=&quot;1985&quot; data-start=&quot;1959&quot;&gt;Scratch + ML Extensions&lt;/td&gt;
&lt;td data-end=&quot;2008&quot; data-start=&quot;1985&quot;&gt;초등학생도 가능한 블록 코딩 + AI&lt;/td&gt;
&lt;td data-end=&quot;2045&quot; data-start=&quot;2008&quot;&gt;&lt;a href=&quot;https://llk.github.io/scratch-ai/&quot;&gt;https://llk.github.io/scratch-ai/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2050&quot; data-start=&quot;2047&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2063&quot; data-start=&quot;2052&quot; data-ke-size=&quot;size26&quot;&gt;  마무리하며&lt;/h2&gt;
&lt;p data-end=&quot;2122&quot; data-start=&quot;2065&quot; data-ke-size=&quot;size16&quot;&gt;AI는 더 이상 전문가들만의 기술이 아닙니다.&lt;br /&gt;우리는 이제 &lt;b&gt;직접 해보는 시대&lt;/b&gt;에 살고 있어요.&lt;/p&gt;
&lt;p data-end=&quot;2138&quot; data-start=&quot;2124&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습 편을 통해,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2203&quot; data-start=&quot;2139&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2161&quot; data-start=&quot;2139&quot;&gt;AI가 데이터를 어떻게 학습하는지&lt;/li&gt;
&lt;li data-end=&quot;2181&quot; data-start=&quot;2162&quot;&gt;어떤 방식으로 결과를 내는지&lt;/li&gt;
&lt;li data-end=&quot;2203&quot; data-start=&quot;2182&quot;&gt;내가 만든 모델이 어떻게 반응하는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2220&quot; data-start=&quot;2205&quot; data-ke-size=&quot;size16&quot;&gt;직접 경험해보셨길 바랍니다.&lt;/p&gt;
&lt;hr data-end=&quot;2225&quot; data-start=&quot;2222&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2240&quot; data-start=&quot;2227&quot; data-ke-size=&quot;size26&quot;&gt;  연재를 마치며&lt;/h2&gt;
&lt;p data-end=&quot;2315&quot; data-start=&quot;2242&quot; data-ke-size=&quot;size16&quot;&gt;이번 시리즈에서는 AI에 대해&lt;br /&gt;&amp;ldquo;이해 &amp;rarr; 구분 &amp;rarr; 방식 &amp;rarr; 사례 &amp;rarr; 체험&amp;rdquo;까지&lt;br /&gt;비전공자도 따라갈 수 있도록 구성해보았습니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2376&quot; data-start=&quot;2317&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2376&quot; data-start=&quot;2319&quot; data-ke-size=&quot;size16&quot;&gt;&quot;AI를 무서워하지 말고, 도구로 바라보자&quot;&lt;br /&gt;이 말로 5편을, 그리고 전체 연재를 마무리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2384&quot; data-start=&quot;2378&quot; data-ke-size=&quot;size16&quot;&gt;고맙습니다!&lt;/p&gt;</description>
      <category>AI 란</category>
      <category>ai 블로그</category>
      <category>ai 실습</category>
      <category>ai 실험</category>
      <category>ai 입문 실습</category>
      <category>ai 체험 플랫폼</category>
      <category>Teachable Machine</category>
      <category>비전공자 ai 체험</category>
      <category>인공지능 따라하기</category>
      <category>인공지능 체험</category>
      <category>코딩 없이 ai</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/219</guid>
      <comments>https://ythouse.tistory.com/219#entry219comment</comments>
      <pubDate>Tue, 22 Apr 2025 08:13:36 +0900</pubDate>
    </item>
    <item>
      <title>AI는 실제로 어디에 쓰일까? &amp;ndash; 일상, 산업, 의료, 교통, 콘텐츠 속 인공지능 활용 사례</title>
      <link>https://ythouse.tistory.com/218</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;AI는 실제로 어디에 쓰일까? &amp;ndash; 우리가 몰랐던 곳곳의 인공지능 활용 사례&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZpLoT/btsNvC5Eg9n/kI5LyjltzcdR0po53pk11k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZpLoT/btsNvC5Eg9n/kI5LyjltzcdR0po53pk11k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZpLoT/btsNvC5Eg9n/kI5LyjltzcdR0po53pk11k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZpLoT%2FbtsNvC5Eg9n%2FkI5LyjltzcdR0po53pk11k%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; alt=&quot;AI는 실제로 어디에 쓰일까? 라는 질문에 대해 일상, 산업, 의료, 교통, 콘텐츠 분야에서의 활용을 한눈에 보여주는 인포그래픽 이미지. 중앙의 로봇 아이콘을 중심으로 각 분야를 상징하는 아이콘이 배치되어 있음. 출처: ythouse.tistory.com&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  인공지능은 이미 우리 삶의 일부입니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능이라는 단어는 어렵고 기술적인 느낌이 들 수도 있지만, 사실은 그렇지 않습니다. 우리가 스마트폰을 들여다보는 순간부터 잠들기 전까지, 하루 대부분의 시간 동안 인공지능은 우리 곁에서 조용히 움직이고 있습니다. 이 글에서는 'AI'라는 단어 대신, '스마트 기술'이라는 표현으로 바꾸어, 우리가 일상에서 얼마나 많이 이 기술을 접하고 있는지를 알기 쉽게 풀어보려 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  1. 우리 집에서 매일 마주치는 스마트 기술들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날 아침, 알람 소리에 눈을 떴습니다. 그 소리는 단순히 시간을 알려주는 것이 아니라, 평소 내 기상 시간을 분석해 가장 적절한 시점에 울렸습니다. 바로 이게 스마트 기술입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;음성 명령 스피커&lt;/b&gt;: &quot;오늘 날씨 어때?&quot;라는 질문에 대답하는 기기. 알고 보니, 질문자의 과거 패턴을 바탕으로 관심 있는 뉴스까지 같이 전해주기도 하죠.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;음악 추천 시스템&lt;/b&gt;: 출근길에 이어폰을 꽂으면, 어제와 다른 느낌의 음악이 재생됩니다. 어제 기분이 우울했던 걸 시스템이 알고 있었던 걸까요?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스마트 가전&lt;/b&gt;: 에어컨은 내가 집에 가까워지면 미리 켜지고, 로봇청소기는 외출 시간에 맞춰 작동합니다. 냉장고는 유통기한을 알려주기도 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스마트폰의 숨겨진 기술&lt;/b&gt;: 타이핑 예측, 사진 자동 분류, 위치 기반 알림까지&amp;hellip; 전부 스마트한 기술의 결과입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2. 우리가 소비하는 제품들은 어떻게 만들어질까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마트에 진열된 물건들, 택배로 도착한 상품들. 그 과정에도 수많은 스마트 기술이 개입되어 있다는 걸 알고 있었나요?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자동화 생산 시스템&lt;/b&gt;: 공장에서는 사람 대신 기계가 물건을 조립합니다. 이 기계들은 각 공정별로 데이터를 수집하고 분석해 스스로 실수를 줄이고 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;품질 검사 시스템&lt;/b&gt;: 눈으로 보고 판별하던 제품의 불량 여부를 이제는 카메라와 시스템이 맡습니다. 미세한 결함까지 잡아내는 건 사람보다 정확하죠.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;물류창고 로봇&lt;/b&gt;: 물건을 집어 들고, 위치를 파악하고, 가장 빠른 경로로 이동합니다. 덕분에 주문한 다음 날 바로 배송이 가능한 세상이 되었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에너지 절감 관리&lt;/b&gt;: 전력 소비를 스스로 분석해 필요한 전력만 사용하는 생산 설비도 생겼습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  3. 진료실 안 보이는 곳에서 일어나는 기술들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병원에 가서 의사에게 진료를 받는 일이 무척 인간적인 순간처럼 느껴지지만, 그 뒤에는 수많은 기술이 작동 중입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의료 영상 판독 시스템&lt;/b&gt;: 엑스레이, CT, MRI에서 촬영한 이미지를 수천 개의 사례와 비교해 결과를 예측합니다. 의사는 그 정보를 참고하여 더욱 정확한 진단을 내립니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;건강 예측 앱&lt;/b&gt;: 스마트워치나 앱을 통해 심박수, 수면 패턴 등을 모니터링합니다. 이상 징후가 있으면 알려주는 건 물론, 생활습관을 개선하도록 조언도 해주죠.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;신약 개발 보조 도구&lt;/b&gt;: 실험 데이터를 분석하고 조합해 가능성 있는 신약 후보를 제시합니다. 사람이 일일이 계산하던 걸 시스템이 도와주는 셈이죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  4. 도시의 흐름을 바꾸는 기술들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 이동할 때마다 도시 전체가 조금 더 똑똑해지고 있습니다. 예전에는 불가능했던 일들이 가능해지고 있죠.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;차량 경로 추천 시스템&lt;/b&gt;: 내비게이션은 실시간 교통정보를 분석해 빠른 길을 안내합니다. 이전에는 불가능했던 일입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;신호등 제어 시스템&lt;/b&gt;: 특정 지역의 교통 체증을 미리 감지해 신호 체계를 조정합니다. 덕분에 출퇴근 시간대 정체가 줄어들기도 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자율주행 차량 개발&lt;/b&gt;: 아직은 시험 중이지만, 도로 위의 자동차들이 스스로 주변을 인식하고 판단해 움직이게 되는 날도 머지않았습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대중교통 데이터 분석&lt;/b&gt;: 사람들이 많이 몰리는 시간대를 분석해 버스 배차 간격을 조정합니다. 불필요한 대기 시간이 줄어드는 효과가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  5. 우리가 즐기는 콘텐츠, 그 뒤의 기술들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 보는 영상, 듣는 음악, 플레이하는 게임은 이제 기술의 힘으로 더 풍부해지고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;영상 추천 시스템&lt;/b&gt;: 유튜브나 넷플릭스에서 우리가 좋아할 만한 콘텐츠를 미리 띄워주는 건, 이전의 시청 기록을 기반으로 작동하는 기술 덕분입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실시간 번역 및 자막 자동 생성&lt;/b&gt;: 영상에 자막이 자동으로 붙거나, 다른 언어로 더빙이 되는 것도 시스템의 힘입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;게임 내 적응형 난이도&lt;/b&gt;: 게임이 너무 어렵거나 쉬울 때, 알아서 난이도를 조정하는 시스템도 있죠. 사용자의 플레이 스타일을 분석해 변화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지&amp;middot;음악 생성 도구&lt;/b&gt;: 이제는 프로그램을 통해 그림을 그리거나 음악을 만드는 것도 가능해졌습니다. 창작자의 상상력을 확장해주는 도구가 되고 있죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  우리가 느끼지 못하는 사이 기술은 진화한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 스마트 기술은 우리 주변 곳곳에서 작동 중입니다. 기술은 점점 더 조용하게, 자연스럽게, 사람 곁에 스며들고 있습니다. 우리는 때로 그 존재조차 느끼지 못할 만큼 기술에 익숙해졌고, 그 덕분에 더 편리하고 효율적인 삶을 살아가고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 기술이 발전할수록 중요한 것은 그것을 사용하는 사람의 의지와 가치관입니다. 기술은 도구일 뿐, 그 도구로 무엇을 할지는 결국 우리에게 달려 있으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: ythouse.tistory.com&lt;/p&gt;</description>
      <category>AI 란</category>
      <category>ai 기술 응용</category>
      <category>ai 블로그</category>
      <category>ai 실제 적용</category>
      <category>ai 어디에 쓰이나요</category>
      <category>Ai 활용</category>
      <category>산업용 ai</category>
      <category>생활 속 ai</category>
      <category>인공지능 사례</category>
      <category>인공지능 입문</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/218</guid>
      <comments>https://ythouse.tistory.com/218#entry218comment</comments>
      <pubDate>Tue, 22 Apr 2025 08:11:57 +0900</pubDate>
    </item>
    <item>
      <title>AI는 어떻게 공부할까? &amp;ndash; 지도학습, 비지도학습, 강화학습까지 비전공자도 이해하는 AI 학습 방식</title>
      <link>https://ythouse.tistory.com/217</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;AI는 실제로 어디에 쓰일까? &amp;ndash; 우리가 몰랐던 기술 이야기, 사람 이야기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMlJOv/btsNwrQWCRa/fkDFfnaDIE2fgFhpZKNchk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMlJOv/btsNwrQWCRa/fkDFfnaDIE2fgFhpZKNchk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMlJOv/btsNwrQWCRa/fkDFfnaDIE2fgFhpZKNchk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMlJOv%2FbtsNwrQWCRa%2FfkDFfnaDIE2fgFhpZKNchk%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;1024&quot; height=&quot;1536&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 기술이 아닌 이야기로 시작해볼까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;얘야, 옛날엔 말이야, 길 찾으려면 종이 지도 들고 다녔단다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날 할아버지가 해준 이 말에 깜짝 놀랐다. 종이 지도? 지금은 스마트폰이 다 해주는데! 심지어 실시간 교통까지 알려주는 시대 아닌가. 우리는 언제부터 이렇게 편해졌을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 어려운 기술 설명이 아니다. 우리가 모르게 내 삶에 들어온 '기술 친구들'에 대한 이야기다. 주인공은 인공지능(AI)이지만, 이름만 들으면 멀게 느껴지는 그 녀석이 사실은 우리 삶에 가장 가까이 있는 존재라는 걸 알려주고 싶었다. 그럼 이야기를 시작해보자.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  아침 7시 30분, 내 방에서 시작된 이야기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴대폰 알람이 울린다. 어제보다 10분 늦게 울렸다. 왜? 내가 최근에 매일 늦게 잤다는 걸 스마트폰이 파악했기 때문이다.&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;ldquo;우유 유통기한이 이틀 남았어요&amp;rdquo;라고 알림이 뜬다. 아무 말도 안 했는데 왜 이렇게 다 알고 있는 거지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 내가 하고 있는 이 모든 행동 뒤에는, 조용히 나를 관찰하던 '기술 친구'가 있다. 이름도 멋있게 인공지능이라고 부르지만, 사실은 나를 잘 이해해주는 조용한 비서 같은 존재다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  회사 가기 전, 편의점 앞에서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편의점에 들러 커피를 사려는데 계산대에 직원이 없다. 대신, 셀프 계산대 옆에서 이상하게 생긴 기계가 나를 빤히 바라본다. 상품을 대니 자동으로 금액이 찍히고, 결제를 완료하자 &quot;감사합니다&quot;라는 목소리가 들린다. 누군가 뒤에서 말하는 줄 알고 돌아봤는데 아무도 없다.&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;그건 바로 계산을 대신해주는 인공지능이다. 상품 인식, 재고 파악, 고객 패턴 분석까지 이 친구는 혼자서 모든 걸 해낸다. 게다가 피곤하지도 않다. 인간이 몇 시간 동안 교대하며 하던 일을 이 녀석은 24시간 해낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간광고자리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  공장의 하루 &amp;ndash; 기계도 보고, 생각도 한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 현장에서 일하는 친구가 말했다. &quot;요즘은 불량품 찾는 것도 AI가 다 해줘. 눈으로 일일이 안 봐도 돼.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라로 찍은 이미지를 AI가 실시간 분석해 결함 여부를 판단한다. 눈으로 보면 지나칠 수도 있는 미세한 흠집도 잡아낸다. 이 기술 덕분에 불량률이 낮아지고, 손실도 줄었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이건 단지 시작일 뿐이다. 생산량 예측, 원자재 수급 시기 계산, 날씨에 따른 출하 일정 조정까지. 이젠 '생각하는 공장'이 되어가고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계가 손 대신 눈을, 눈 대신 머리를 쓰게 된 것.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  병원의 복도 &amp;ndash; 무심코 지나친 그 안내판&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병원 로비에 있는 전광판에 환자의 번호가 뜨고, 진료실을 안내한다. 사실 이 전광판도 단순한 화면이 아니다. 수백 명의 예약자 정보를 기반으로 최적의 동선과 대기 순서를 계산하는 알고리즘이 작동 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 의사 선생님이 환자 진단을 내리기 전, 컴퓨터 화면을 유심히 들여다본다. 그 안에는 AI가 분석한 환자의 검사 결과와 유사 사례 데이터가 담겨 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 어떤 병원은 AI가 암세포를 조기에 찾아내기도 한다. 그것도 사람이 놓칠 수 있는 초미세 단위까지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의사는 이제 혼자가 아니다. AI라는 든든한 조수와 함께 진료하고 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  퇴근길 &amp;ndash; 붐비는 도로에서 길을 찾다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 나와 차에 오르니, 내비게이션이 말한다. &quot;예상 소요 시간은 47분입니다. 더 빠른 경로를 안내할까요?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 사고가 있었나 보다. 실시간 도로 상황을 파악한 뒤 대체 경로까지 알려준다. 예전 같았으면 라디오 듣거나 직접 전화를 돌려가며 알아봐야 했던 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 수천 대의 차량이 서로 정보를 공유하고, 교통 시스템이 그 정보를 바탕으로 '길을 설계'한다. 사람이 아니라, 시스템이 '길을 계산'하는 시대가 온 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간광고자리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  밤 10시, 유튜브와 게임 속의 마법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집에 돌아와 소파에 앉는다. 유튜브를 켜자마자 &quot;추천 영상&quot;이 뜬다. 어젯밤에 본 다큐멘터리 때문인지, 오늘은 비슷한 주제의 영상이 자동으로 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임을 켰더니 난이도가 자동으로 조정된다. 내가 계속 죽으면 쉬워지고, 잘하면 더 어려워진다. 누가 조절하는 걸까? 정답은 'AI 게임 마스터'.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 어제 찍었던 사진들 중, 누가 찍은지도 모르게 보정된 이미지가 자동으로 정리돼 있다. 심지어 '강아지'라고 검색하면 내 강아지 사진만 쏙쏙 골라준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이쯤 되면 이제 AI는 마법에 가깝다. 단지 우리가 &quot;기술&quot;이라는 단어로 포장해두었을 뿐.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  마무리하며 &amp;ndash; 기술은 도구다, 이야기의 조력자다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 '사람을 대체하는 무서운 기술'이 아니다. 오히려 사람을 도와주는 조용한 조력자다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 주인공이라면, AI는 무대 뒤에서 조명을 조절하고, 배경음악을 깔고, 흐름을 정리해주는 연출가 같은 존재다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 건 우리가 어떻게 이 도구를 사용하는가에 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나를 더 편하게 만들기 위해서?&lt;/li&gt;
&lt;li&gt;남을 속이기 위해서?&lt;/li&gt;
&lt;li&gt;아니면 모두를 위한 사회적 가치를 만들기 위해서?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술은 점점 더 똑똑해진다. 하지만 그 기술을 움직이는 손과 방향은 여전히 인간의 몫이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: ythouse.tistory.com&lt;/p&gt;</description>
      <category>AI 란</category>
      <category>ai 개념 설명</category>
      <category>ai 블로그</category>
      <category>ai 학습 방식</category>
      <category>강화학습</category>
      <category>딥러닝 교육</category>
      <category>머신러닝 학습</category>
      <category>비전공자 AI</category>
      <category>비지도학습</category>
      <category>인공지능 입문</category>
      <category>지도학습</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/217</guid>
      <comments>https://ythouse.tistory.com/217#entry217comment</comments>
      <pubDate>Tue, 22 Apr 2025 08:09:43 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝과 딥러닝, 뭐가 다른 건데? &amp;ndash; 비전공자도 이해하는 AI 핵심 개념 구분법</title>
      <link>https://ythouse.tistory.com/216</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  머신러닝과 딥러닝, 뭐가 다른 건데? &amp;ndash; 비전공자도 이해하는 AI 핵심 개념 구분법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GIL6C/btsNvC5EA4u/w4Yw7jaafK29jC9Lk6ANIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GIL6C/btsNvC5EA4u/w4Yw7jaafK29jC9Lk6ANIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GIL6C/btsNvC5EA4u/w4Yw7jaafK29jC9Lk6ANIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGIL6C%2FbtsNvC5EA4u%2Fw4Yw7jaafK29jC9Lk6ANIk%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;1024&quot; height=&quot;1536&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  왜 이 글이 필요할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;AI가 뭔진 알겠는데, 머신러닝이랑 딥러닝은 또 뭐야?&amp;rdquo; &amp;ldquo;이거 다 같은 거 아니야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 AI에 관심을 갖는 사람이라면 누구나 이런 질문을 합니다. 책이나 뉴스, 유튜브 영상에서는 &amp;ldquo;AI 기반의 머신러닝 알고리즘에 딥러닝 구조를 활용해&amp;hellip;&amp;rdquo;라는 말을 어렵지 않게 보게 되죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 글 하나로 당신도 완벽하게 구분할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 다음 내용을 담고 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI, 머신러닝, 딥러닝의 상하 관계&lt;/li&gt;
&lt;li&gt;비전공자도 이해할 수 있는 비유 설명&lt;/li&gt;
&lt;li&gt;실제 사례 중심으로 개념 비교&lt;/li&gt;
&lt;li&gt;헷갈리는 개념들을 깔끔하게 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  1. AI, 머신러닝, 딥러닝의 관계부터 보자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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&gt;&lt;b&gt;AI&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인공지능. 사람처럼 판단하고 행동할 수 있는 컴퓨터 시스템&lt;/td&gt;
&lt;td&gt;음성 인식, 자율주행, 추천 알고리즘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;머신러닝&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;AI의 하위 분야. 데이터를 보고 스스로 규칙을 학습함&lt;/td&gt;
&lt;td&gt;스팸 메일 분류, 수요 예측&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;딥러닝&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;머신러닝의 하위 분야. 뇌를 모방한 인공신경망 기반의 고도 학습법&lt;/td&gt;
&lt;td&gt;이미지 인식, 음성 합성, 챗봇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  공식처럼 외우자: &lt;b&gt;딥러닝 &amp;sub; 머신러닝 &amp;sub; AI&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간광고자리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2. 비유로 쉽게 이해하자 &amp;ndash; 요리사 이야기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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&gt;&lt;b&gt;AI&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;요리를 할 수 있는 모든 요리사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;머신러닝&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;레시피를 보고 배운 요리사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;딥러닝&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;레시피 없이 맛과 재료를 스스로 조합해 요리하는 천재 요리사&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝은 복잡한 데이터도 스스로 조합해 새로운 결과를 만들어낼 수 있습니다. 바로 그 점이 기존 머신러닝과의 가장 큰 차이입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  3. 기술 예시로 구분하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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&gt;스팸 메일 분류&lt;/td&gt;
&lt;td&gt;&amp;ldquo;무료&amp;rdquo; 포함 여부로 필터링&lt;/td&gt;
&lt;td&gt;과거 메일 패턴 학습&lt;/td&gt;
&lt;td&gt;수천만 건 이메일 전체 구조 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이미지 분류&lt;/td&gt;
&lt;td&gt;색상, 비율 조건 직접 입력&lt;/td&gt;
&lt;td&gt;특징(귀, 눈, 배경 등) 학습&lt;/td&gt;
&lt;td&gt;이미지 전체를 보고 스스로 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자율주행&lt;/td&gt;
&lt;td&gt;센서 조건 수동 입력&lt;/td&gt;
&lt;td&gt;도로/신호 패턴 인식&lt;/td&gt;
&lt;td&gt;영상 기반 실시간 판단 및 예측&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  4. 구조적으로 살펴보기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ AI: 가장 넓은 개념&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 인간의 지능적인 행동을 컴퓨터가 흉내 낼 수 있도록 만드는 모든 기술을 의미합니다. 과거에는 조건문으로만 구성되었지만, 지금은 학습 능력을 갖춘 모델들이 발전하고 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 머신러닝: AI를 실제로 구현하는 방법 중 하나&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝은 데이터에서 규칙을 찾아내고, 그 규칙을 기반으로 미래를 예측하는 기술입니다. &quot;if A then B&quot;가 아니라 &quot;과거 데이터를 통해 A일 때 대부분 B였다&quot;라는 확률 기반 예측입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 딥러닝: 데이터를 더 많이, 더 깊게 이해하기 위한 진화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝은 신경망 구조를 통해 수많은 변수와 관계를 자동으로 파악합니다. 학습이 많을수록 더 정교한 예측이 가능하고, 사람이 직접 피처를 추출하지 않아도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간광고자리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  5. 머신러닝 vs 딥러닝 &amp;ndash; 실제 비교 포인트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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&gt;데이터 요구량&lt;/td&gt;
&lt;td&gt;적은 양으로도 가능&lt;/td&gt;
&lt;td&gt;매우 많은 데이터 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;해석 가능성&lt;/td&gt;
&lt;td&gt;모델이 왜 그런 결과를 내는지 비교적 명확&lt;/td&gt;
&lt;td&gt;블랙박스 구조 &amp;ndash; 내부 동작이 복잡함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;학습 속도&lt;/td&gt;
&lt;td&gt;상대적으로 빠름&lt;/td&gt;
&lt;td&gt;GPU 필요, 느릴 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특징 추출&lt;/td&gt;
&lt;td&gt;사람이 지정해야 함&lt;/td&gt;
&lt;td&gt;자동으로 특징 추출 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  6. 어떤 기술을 언제 써야 할까?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;머신러닝&lt;/b&gt;이 유리한 경우:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가 적을 때&lt;/li&gt;
&lt;li&gt;결과의 해석 가능성이 중요할 때&lt;/li&gt;
&lt;li&gt;단순한 예측 모델을 빠르게 만들고자 할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝&lt;/b&gt;이 유리한 경우:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지, 음성, 자연어 등 비정형 데이터 처리 시&lt;/li&gt;
&lt;li&gt;복잡한 패턴을 스스로 학습해야 할 때&lt;/li&gt;
&lt;li&gt;예측 정확도가 매우 중요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  정리하자면&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI는 사람처럼 판단하고 행동하는 모든 기술&lt;/li&gt;
&lt;li&gt;머신러닝은 AI를 실현하는 대표적 방법&lt;/li&gt;
&lt;li&gt;딥러닝은 머신러닝 중에서도 가장 강력한 학습 능력을 가진 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 = 인공신경망을 통해 수많은 변수를 자동으로 조합해 고도화된 예측을 가능하게 만드는 기술&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 3가지 개념은 헷갈릴 일 없겠죠?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  다음 편 예고: AI는 어떻게 공부할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지도학습, 비지도학습, 강화학습&amp;hellip; 말은 들어봤는데 무슨 차이야?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는 AI가 &lt;b&gt;지식을 쌓는 방식&lt;/b&gt;, 즉 학습 유형에 대해 아주 쉽게 설명해드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비전공자도 완전히 이해할 수 있도록 사례 + 그림 + 비유로 설명할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: ythouse.tistory.com&lt;/p&gt;</description>
      <category>AI 란</category>
      <category>ai 개념 설명</category>
      <category>AI 교육</category>
      <category>ai 기초 강의</category>
      <category>ai 블로그</category>
      <category>기초 인공지능</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <category>머신러닝과 딥러닝 차이</category>
      <category>비전공자 AI</category>
      <category>인공지능 입문</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/216</guid>
      <comments>https://ythouse.tistory.com/216#entry216comment</comments>
      <pubDate>Tue, 22 Apr 2025 08:07:42 +0900</pubDate>
    </item>
    <item>
      <title>AI는 어떻게 사람처럼 생각할까?&amp;quot;</title>
      <link>https://ythouse.tistory.com/215</link>
      <description>&lt;h1 data-end=&quot;363&quot; data-start=&quot;338&quot;&gt;  AI는 어떻게 사람처럼 생각할까?&lt;/h1&gt;
&lt;h3 data-end=&quot;396&quot; data-start=&quot;364&quot; data-ke-size=&quot;size23&quot;&gt;&amp;ndash; 인공지능의 진짜 정체 (비전공자용 입문 가이드)&lt;/h3&gt;
&lt;hr data-end=&quot;401&quot; data-start=&quot;398&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;428&quot; data-start=&quot;403&quot; data-ke-size=&quot;size26&quot;&gt;  AI 입문 블로그 연재 시리즈 안내&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;회차제목주요 내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;714&quot; data-start=&quot;430&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;714&quot; data-start=&quot;478&quot;&gt;
&lt;tr data-end=&quot;527&quot; data-start=&quot;478&quot;&gt;
&lt;td data-end=&quot;483&quot; data-start=&quot;478&quot;&gt;1편&lt;/td&gt;
&lt;td data-end=&quot;504&quot; data-start=&quot;483&quot;&gt;AI는 어떻게 사람처럼 생각할까?&lt;/td&gt;
&lt;td data-end=&quot;527&quot; data-start=&quot;504&quot;&gt;AI 개념, 오해, 실제 사용 사례&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;578&quot; data-start=&quot;528&quot;&gt;
&lt;td data-end=&quot;533&quot; data-start=&quot;528&quot;&gt;2편&lt;/td&gt;
&lt;td data-end=&quot;556&quot; data-start=&quot;533&quot;&gt;머신러닝과 딥러닝, 뭐가 다른 건데?&lt;/td&gt;
&lt;td data-end=&quot;578&quot; data-start=&quot;556&quot;&gt;용어 구분, 비유 중심 개념 설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;623&quot; data-start=&quot;579&quot;&gt;
&lt;td data-end=&quot;584&quot; data-start=&quot;579&quot;&gt;3편&lt;/td&gt;
&lt;td data-end=&quot;600&quot; data-start=&quot;584&quot;&gt;AI는 어떻게 공부할까?&lt;/td&gt;
&lt;td data-end=&quot;623&quot; data-start=&quot;600&quot;&gt;학습 방식, 지도/비지도 학습 소개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;667&quot; data-start=&quot;624&quot;&gt;
&lt;td data-end=&quot;629&quot; data-start=&quot;624&quot;&gt;4편&lt;/td&gt;
&lt;td data-end=&quot;645&quot; data-start=&quot;629&quot;&gt;실제로 어디에 쓰이나요?&lt;/td&gt;
&lt;td data-end=&quot;667&quot; data-start=&quot;645&quot;&gt;산업, 의료, 일상 속 사례 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;714&quot; data-start=&quot;668&quot;&gt;
&lt;td data-end=&quot;673&quot; data-start=&quot;668&quot;&gt;5편&lt;/td&gt;
&lt;td data-end=&quot;693&quot; data-start=&quot;673&quot;&gt;나도 AI 만들어볼 수 있을까?&lt;/td&gt;
&lt;td data-end=&quot;714&quot; data-start=&quot;693&quot;&gt;간단한 실습과 체험 플랫폼 안내&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;719&quot; data-start=&quot;716&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;747&quot; data-start=&quot;721&quot; data-ke-size=&quot;size26&quot;&gt;  우리는 정말 'AI'를 알고 있을까?&lt;/h2&gt;
&lt;p data-end=&quot;810&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;AI가 사람보다 똑똑해진대.&amp;rdquo;&lt;br /&gt;&amp;ldquo;AI가 사람을 대체할 거야.&amp;rdquo;&lt;br /&gt;&amp;ldquo;AI가 노래를 만들고 그림도 그려.&amp;rdquo;&lt;/p&gt;
&lt;p data-end=&quot;864&quot; data-start=&quot;812&quot; data-ke-size=&quot;size16&quot;&gt;그런데, 누가 갑자기 &amp;ldquo;AI가 뭔데요?&amp;rdquo;라고 물으면,&lt;br /&gt;딱 10초 안에 설명할 수 있을까요?&lt;/p&gt;
&lt;p data-end=&quot;881&quot; data-start=&quot;866&quot; data-ke-size=&quot;size16&quot;&gt;머릿속에 뭔가 막 떠오르죠.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;920&quot; data-start=&quot;883&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;888&quot; data-start=&quot;883&quot;&gt;알파고&lt;/li&gt;
&lt;li data-end=&quot;895&quot; data-start=&quot;889&quot;&gt;챗GPT&lt;/li&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;896&quot;&gt;로봇청소기&lt;/li&gt;
&lt;li data-end=&quot;911&quot; data-start=&quot;904&quot;&gt;자율주행차&lt;/li&gt;
&lt;li data-end=&quot;920&quot; data-start=&quot;912&quot;&gt;유튜브 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1012&quot; data-start=&quot;922&quot; data-ke-size=&quot;size16&quot;&gt;이 모든 게 AI가 맞습니다.&lt;br /&gt;하지만&amp;hellip; 이게 전부는 아니에요.&lt;br /&gt;&amp;lsquo;AI&amp;rsquo;라는 단어, &lt;b&gt;우리가 얼마나 피상적으로 알고 있었는지&lt;/b&gt; 지금부터 함께 알아볼게요.&lt;/p&gt;
&lt;hr data-end=&quot;1017&quot; data-start=&quot;1014&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1040&quot; data-start=&quot;1019&quot; data-ke-size=&quot;size26&quot;&gt;  AI란, 생각하는 기계입니다&lt;/h2&gt;
&lt;p data-end=&quot;1076&quot; data-start=&quot;1042&quot; data-ke-size=&quot;size16&quot;&gt;AI = 인공지능(Artificial Intelligence)&lt;/p&gt;
&lt;p data-end=&quot;1196&quot; data-start=&quot;1078&quot; data-ke-size=&quot;size16&quot;&gt;사람처럼 &amp;ldquo;생각하고 판단하고 행동할 수 있게 만든 컴퓨터 프로그램&amp;rdquo;입니다.&lt;br /&gt;우리가 시키는 대로만 움직이는 컴퓨터와 달리,&lt;br /&gt;&lt;b&gt;AI는 스스로 학습해서 더 나은 판단을 하도록 설계된 뇌와 같은 시스템&lt;/b&gt;이죠.&lt;/p&gt;
&lt;p data-end=&quot;1254&quot; data-start=&quot;1198&quot; data-ke-size=&quot;size16&quot;&gt;즉, 단순 계산기가 아니라&lt;br /&gt;&amp;ldquo;이전 경험을 통해 성장하는 시스템&amp;rdquo;이라는 점에서 큰 차이가 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1259&quot; data-start=&quot;1256&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1282&quot; data-start=&quot;1261&quot; data-ke-size=&quot;size26&quot;&gt;  지금도 당신 옆에 있는 AI&lt;/h2&gt;
&lt;p data-end=&quot;1334&quot; data-start=&quot;1284&quot; data-ke-size=&quot;size16&quot;&gt;우리가 AI를 잘 모르더라도,&lt;br /&gt;&lt;b&gt;AI는 우리 곁에 이미 깊숙하게 들어와 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1342&quot; data-start=&quot;1336&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1479&quot; data-start=&quot;1344&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1369&quot; data-start=&quot;1344&quot;&gt;유튜브가 취향에 맞는 영상을 추천해줘요&lt;/li&gt;
&lt;li data-end=&quot;1403&quot; data-start=&quot;1370&quot;&gt;넷플릭스가 당신이 좋아할 만한 영화 리스트를 띄워줘요&lt;/li&gt;
&lt;li data-end=&quot;1427&quot; data-start=&quot;1404&quot;&gt;스마트폰에서 음성으로 문자를 보내고&lt;/li&gt;
&lt;li data-end=&quot;1453&quot; data-start=&quot;1428&quot;&gt;사진 속 인물 얼굴을 자동으로 인식해요&lt;/li&gt;
&lt;li data-end=&quot;1479&quot; data-start=&quot;1454&quot;&gt;쇼핑몰이 내가 살 것 같은 상품을 띄워줘요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1513&quot; data-start=&quot;1481&quot; data-ke-size=&quot;size16&quot;&gt;이 모든 기능 뒤에는 &lt;b&gt;보이지 않는 AI&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1518&quot; data-start=&quot;1515&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-end=&quot;1537&quot; data-start=&quot;1534&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1561&quot; data-start=&quot;1539&quot; data-ke-size=&quot;size26&quot;&gt;  AI는 데이터를 먹고 자랍니다&lt;/h2&gt;
&lt;p data-end=&quot;1642&quot; data-start=&quot;1563&quot; data-ke-size=&quot;size16&quot;&gt;AI는 말 그대로, 데이터를 먹고 자라는 존재입니다.&lt;br /&gt;사람이 경험을 통해 배우듯, AI는 &lt;b&gt;데이터를 통해 세상을 이해하고 판단&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;1650&quot; data-start=&quot;1644&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1727&quot; data-start=&quot;1652&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1669&quot; data-start=&quot;1652&quot;&gt;고양이 사진 5만 장과&lt;/li&gt;
&lt;li data-end=&quot;1692&quot; data-start=&quot;1670&quot;&gt;강아지 사진 5만 장을 보여주고&lt;/li&gt;
&lt;li data-end=&quot;1727&quot; data-start=&quot;1693&quot;&gt;각각 &amp;ldquo;이건 고양이야&amp;rdquo;, &amp;ldquo;이건 강아지야&amp;rdquo; 라고 알려주면&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1806&quot; data-start=&quot;1729&quot; data-ke-size=&quot;size16&quot;&gt;AI는 이 둘의 차이점을 찾아냅니다.&lt;br /&gt;다음에 새로운 사진이 들어오면&lt;br /&gt;&amp;ldquo;이건 고양이일 확률이 92%입니다!&amp;rdquo; 이렇게 판단하는 거예요.&lt;/p&gt;
&lt;p data-end=&quot;1867&quot; data-start=&quot;1808&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 우리는 머신러닝(Machine Learning)이라고 부릅니다.&lt;br /&gt;(자세한 설명은 2편에서!)&lt;/p&gt;
&lt;hr data-end=&quot;1872&quot; data-start=&quot;1869&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1892&quot; data-start=&quot;1874&quot; data-ke-size=&quot;size26&quot;&gt;❗ AI = 로봇이라는 착각&lt;/h2&gt;
&lt;p data-end=&quot;1935&quot; data-start=&quot;1894&quot; data-ke-size=&quot;size16&quot;&gt;많은 사람들이 &amp;ldquo;AI = 로봇&amp;rdquo;이라고 생각해요.&lt;br /&gt;하지만 둘은 다릅니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1990&quot; data-start=&quot;1937&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1965&quot; data-start=&quot;1937&quot;&gt;&lt;b&gt;AI는 &amp;lsquo;두뇌&amp;rsquo;입니다. (소프트웨어)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1990&quot; data-start=&quot;1966&quot;&gt;&lt;b&gt;로봇은 &amp;lsquo;몸&amp;rsquo;입니다. (하드웨어)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2039&quot; data-start=&quot;1992&quot; data-ke-size=&quot;size16&quot;&gt;AI는 컴퓨터 안에서만 작동해도 충분하고,&lt;br /&gt;로봇은 단순 반복 기계일 수도 있어요.&lt;/p&gt;
&lt;p data-end=&quot;2051&quot; data-start=&quot;2041&quot; data-ke-size=&quot;size16&quot;&gt;예: 자율주행차&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2100&quot; data-start=&quot;2052&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2065&quot; data-start=&quot;2052&quot;&gt;차체는 로봇이지만&lt;/li&gt;
&lt;li data-end=&quot;2100&quot; data-start=&quot;2066&quot;&gt;&amp;ldquo;지금 속도를 줄여야 해!&amp;rdquo; 라고 판단하는 건 AI입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2105&quot; data-start=&quot;2102&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2139&quot; data-start=&quot;2107&quot; data-ke-size=&quot;size26&quot;&gt;  AI는 무서운 게 아니라, 알아야 할 도구입니다&lt;/h2&gt;
&lt;p data-end=&quot;2191&quot; data-start=&quot;2141&quot; data-ke-size=&quot;size16&quot;&gt;AI가 무섭다는 말도 많이 들리죠.&lt;br /&gt;일자리를 빼앗는다는 둥, 인간을 지배할 거라는 둥&amp;hellip;&lt;/p&gt;
&lt;p data-end=&quot;2279&quot; data-start=&quot;2193&quot; data-ke-size=&quot;size16&quot;&gt;그럴 수도 있지만, 그건 &lt;b&gt;AI를 이해하지 못할 때&lt;/b&gt; 생기는 공포예요.&lt;br /&gt;우리가 제대로 알고 있다면,&lt;br /&gt;AI는 &lt;b&gt;굉장히 강력한 도구&lt;/b&gt;가 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;2333&quot; data-start=&quot;2281&quot; data-ke-size=&quot;size16&quot;&gt;기술을 통제하는 건 결국 사람이고,&lt;br /&gt;우리는 지금부터라도 이 도구를 이해하고 익혀야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;2355&quot; data-start=&quot;2335&quot; data-ke-size=&quot;size16&quot;&gt;그게 미래를 준비하는 첫걸음이니까요.&lt;/p&gt;
&lt;hr data-end=&quot;2360&quot; data-start=&quot;2357&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-end=&quot;2379&quot; data-start=&quot;2376&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2416&quot; data-start=&quot;2381&quot; data-ke-size=&quot;size26&quot;&gt;  다음 편 예고: 머신러닝과 딥러닝, 뭐가 다른 건데?&lt;/h2&gt;
&lt;p data-end=&quot;2452&quot; data-start=&quot;2418&quot; data-ke-size=&quot;size16&quot;&gt;비전공자가 가장 헷갈려하는 두 가지,&lt;br /&gt;&amp;ldquo;머신러닝과 딥러닝&amp;rdquo;&lt;/p&gt;
&lt;p data-end=&quot;2490&quot; data-start=&quot;2454&quot; data-ke-size=&quot;size16&quot;&gt;둘 다 똑똑한 AI처럼 들리지만,&lt;br /&gt;사실 꽤나 다른 개념입니다.&lt;/p&gt;
&lt;p data-end=&quot;2599&quot; data-start=&quot;2492&quot; data-ke-size=&quot;size16&quot;&gt;다음 편에서는&lt;br /&gt;&lt;b&gt;두 개념의 차이를 가장 쉽게 이해할 수 있는 비유와 사례&lt;/b&gt;로 정리해드릴게요.&lt;br /&gt;&quot;딥러닝이 뭐야?&quot; &quot;그건 뇌를 흉내 내는 컴퓨터야!&quot;&lt;br /&gt;&amp;hellip;자세한 얘기는 다음 편에서!&lt;/p&gt;
&lt;hr data-end=&quot;2604&quot; data-start=&quot;2601&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2616&quot; data-start=&quot;2606&quot; data-ke-size=&quot;size26&quot;&gt;✨ 마무리하며&lt;/h2&gt;
&lt;p data-end=&quot;2720&quot; data-start=&quot;2618&quot; data-ke-size=&quot;size16&quot;&gt;지금 우리가 사용하는 스마트폰, TV, 자동차, 심지어 냉장고까지&lt;br /&gt;AI는 이미 우리 곁에 들어와 있고,&lt;br /&gt;이해하려는 사람과 그렇지 않은 사람 사이의 격차는 점점 커지고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;2748&quot; data-start=&quot;2722&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 읽은 당신은 이미 한 발 앞선 겁니다.&lt;/p&gt;
&lt;p data-end=&quot;2785&quot; data-start=&quot;2750&quot; data-ke-size=&quot;size16&quot;&gt;다음 편에서 또 만나요.&lt;br /&gt;댓글과 구독, 큰 힘이 됩니다  &lt;/p&gt;</description>
      <category>AI 란</category>
      <category>AI 강의</category>
      <category>ai 블로그</category>
      <category>AI란</category>
      <category>기술 이해</category>
      <category>딥러닝 설명</category>
      <category>머신러닝 기초</category>
      <category>비전공자 AI</category>
      <category>생활 속 ai</category>
      <category>인공지능 개념</category>
      <category>인공지능 입문</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/215</guid>
      <comments>https://ythouse.tistory.com/215#entry215comment</comments>
      <pubDate>Tue, 22 Apr 2025 07:57:15 +0900</pubDate>
    </item>
    <item>
      <title>[AI 앱 배포 완성] Inno Setup으로 딥러닝 프로그램 설치파일 만들기 &amp;ndash; 클릭 한 번 설치로 끝내는 PyQt5 + PyTorch 앱</title>
      <link>https://ythouse.tistory.com/214</link>
      <description>&lt;h1&gt;Inno Setup으로 딥러닝 프로그램 설치파일 만들기 – 클릭 한 번 설치로 끝내는 PyQt5 + PyTorch 앱&lt;/h1&gt;

&lt;p&gt;이 글은 인공지능 프로젝트 블로그 연재의 마지막 5편입니다. 지금까지 PyTorch 딥러닝 모델을 실행하는 데스크탑 앱을 만들고, PyInstaller를 통해 실행파일로 패키징하는 과정까지 마쳤습니다. 이번에는 그 실행파일을 &lt;strong&gt;설치 프로그램(Setup.exe)&lt;/strong&gt;으로 만들어 다른 사용자에게 더 쉽게 배포할 수 있는 방법을 설명합니다.&lt;/p&gt;

&lt;!-- 광고 1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;설치 프로그램을 왜 써야 할까?&lt;/h2&gt;
&lt;p&gt;PyInstaller로 생성한 .exe 파일은 그 자체로 실행 가능하지만, 사용자 입장에서는 다음과 같은 불편이 있습니다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;모델 파일, 출력 폴더 등 추가 파일을 직접 복사해야 함&lt;/li&gt;
  &lt;li&gt;디렉토리 구조를 맞춰야 오류 없이 실행됨&lt;/li&gt;
  &lt;li&gt;아이콘, 바탕화면 바로가기 등 편의 기능 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;설치 마법사를 이용하면 이러한 문제를 모두 해결할 수 있습니다.&lt;/p&gt;

&lt;h2&gt;Inno Setup이란?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://jrsoftware.org/isinfo.php&quot; target=&quot;_blank&quot;&gt;Inno Setup&lt;/a&gt;은 Windows용 설치 프로그램을 쉽게 만들 수 있게 해주는 무료 툴입니다. NSIS와 함께 가장 많이 사용되는 인스톨러 생성 도구이며, 배우기 쉽고 문서도 풍부합니다.&lt;/p&gt;

&lt;h2&gt;Inno Setup 설치&lt;/h2&gt;
&lt;p&gt;아래 사이트에서 최신 버전을 다운로드하여 설치합니다:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jrsoftware.org/isdl.php&quot; target=&quot;_blank&quot;&gt;https://jrsoftware.org/isdl.php&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;폴더 구조 예시&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;release/
├── myapp.exe
├── weights/
│   └── gopro_generator.pth
├── output/
├── icon.ico
└── setup_script.iss      # 설치 스크립트
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;기본 설치 스크립트 (.iss) 예제&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;; Inno Setup Script
[Setup]
AppName=AI 이미지 복원기
AppVersion=1.0
DefaultDirName={pf}\\AI_Deblur_App
DefaultGroupName=AI Deblur
OutputBaseFilename=AI_Deblur_Setup
Compression=lzma
SolidCompression=yes
SetupIconFile=icon.ico

[Files]
Source: \&quot;myapp.exe\&quot;; DestDir: \&quot;{app}\&quot;; Flags: ignoreversion
Source: \&quot;weights\\gopro_generator.pth\&quot;; DestDir: \&quot;{app}\\weights\&quot;; Flags: ignoreversion
Source: \&quot;output\\*\&quot;; DestDir: \&quot;{app}\\output\&quot;; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: \&quot;{group}\\AI 이미지 복원기\&quot;; Filename: \&quot;{app}\\myapp.exe\&quot;
Name: \&quot;{userdesktop}\\AI 이미지 복원기\&quot;; Filename: \&quot;{app}\\myapp.exe\&quot;; Tasks: desktopicon

[Tasks]
Name: \&quot;desktopicon\&quot;; Description: \&quot;바탕화면에 바로가기 생성\&quot;; GroupDescription: \&quot;추가 아이콘:\&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;스크립트 각 줄 설명:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;[Setup]&lt;/code&gt;: 앱 이름, 버전, 설치 경로 설정&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;[Files]&lt;/code&gt;: 실행파일 및 모델 파일 복사 대상 지정&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;[Icons]&lt;/code&gt;: 시작메뉴와 바탕화면 바로가기 생성&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;[Tasks]&lt;/code&gt;: 설치 과정 중 사용자 선택 항목 제공&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;설치파일 만들기&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;Inno Setup 실행&lt;/li&gt;
  &lt;li&gt;setup_script.iss 열기&lt;/li&gt;
  &lt;li&gt;상단 메뉴에서 [Compile] 클릭&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;몇 초 후, 동일한 폴더에 &lt;code&gt;AI_Deblur_Setup.exe&lt;/code&gt; 파일이 생성됩니다. 이 파일만으로도 완전한 설치 프로그램이 완성됩니다.&lt;/p&gt;

&lt;h2&gt;실행 확인&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;setup.exe 파일 실행&lt;/li&gt;
  &lt;li&gt;설치 마법사에 따라 설치 경로 선택&lt;/li&gt;
  &lt;li&gt;설치 완료 후 바탕화면에 바로가기 생성됨&lt;/li&gt;
  &lt;li&gt;더블 클릭 시 딥러닝 기반 복원 프로그램 실행됨&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- 광고 2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;NSIS를 대안으로 쓸 수도 있음&lt;/h2&gt;
&lt;p&gt;NSIS는 스크립트 기반의 또 다른 설치 프로그램 생성 도구입니다. 더 커스터마이징이 필요하거나, 더 작은 용량의 인스톨러를 원한다면 선택해볼 수 있습니다.&lt;/p&gt;

&lt;h2&gt;마무리하며&lt;/h2&gt;
&lt;p&gt;이로써 인공지능 기반 흔들림 보정 프로그램 개발에서 배포까지의 전 과정을 모두 마쳤습니다. 1편에서는 프로젝트 개요와 설계를, 2편에서는 모델 실행 실습, 3편에서는 GUI 통합, 4편에서는 실행파일 생성, 그리고 마지막 5편에서는 설치파일로의 패키징까지 진행했습니다.&lt;/p&gt;
&lt;p&gt;여기서 다룬 내용을 응용하면 다른 AI 프로젝트들도 완성도 있는 프로그램으로 발전시킬 수 있습니다. 실제 서비스나 상용화도 가능한 구조이므로 여러분의 프로젝트에도 적용해보시길 바랍니다.&lt;/p&gt;

&lt;p&gt;그동안 이 연재를 따라와 주셔서 감사합니다!&lt;/p&gt;</description>
      <category>AI 프로젝트 실습</category>
      <category>ai 배포</category>
      <category>exe 패키지</category>
      <category>Inno Setup</category>
      <category>NSIS</category>
      <category>pyinstaller</category>
      <category>pyqt5 앱</category>
      <category>딥러닝 프로그램</category>
      <category>설치파일 만들기</category>
      <category>인공지능 설치 프로그램</category>
      <category>프로그램 배포</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/214</guid>
      <comments>https://ythouse.tistory.com/214#entry214comment</comments>
      <pubDate>Tue, 22 Apr 2025 07:53:55 +0900</pubDate>
    </item>
    <item>
      <title>[AI 앱 배포] PyInstaller로 PyQt5 + PyTorch 실행파일 만들기 &amp;ndash; 딥러닝 데스크탑 앱 완성하기</title>
      <link>https://ythouse.tistory.com/213</link>
      <description>&lt;h1&gt;PyInstaller로 PyQt5 + PyTorch 실행파일 만들기 – 딥러닝 데스크탑 앱 완성하기&lt;/h1&gt;

&lt;p&gt;이 글은 인공지능 앱을 완성형 프로그램으로 배포하기 위한 4번째 포스트입니다. 지난 편에서 PyQt5 GUI를 통해 흔들린 이미지를 복원하는 기능을 구현했는데, 이번에는 그 코드를 &lt;strong&gt;하나의 실행파일(.exe)&lt;/strong&gt;로 만들어 누구나 설치 없이 사용할 수 있도록 만드는 방법을 다룹니다.&lt;/p&gt;

&lt;!-- 광고 1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;왜 PyInstaller를 사용하는가?&lt;/h2&gt;
&lt;p&gt;일반적으로 PyQt5나 PyTorch를 사용하는 프로그램은 많은 종속 라이브러리를 포함하고 있어 설치가 복잡합니다. PyInstaller는 이러한 코드를 하나의 실행파일로 묶어주는 도구로, 파이썬이 설치되어 있지 않은 컴퓨터에서도 실행할 수 있습니다. 배포와 공유가 훨씬 쉬워지죠.&lt;/p&gt;

&lt;h2&gt;사전 준비&lt;/h2&gt;
&lt;p&gt;아래 환경을 갖추고 있어야 합니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Python 3.8 또는 3.9&lt;/li&gt;
  &lt;li&gt;PyQt5, torch, torchvision, opencv-python 등이 설치된 상태&lt;/li&gt;
  &lt;li&gt;Windows 운영체제 (exe 빌드용)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PyInstaller 설치:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install pyinstaller&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;기본 명령어 설명&lt;/h2&gt;
&lt;p&gt;단일 실행파일을 만드는 기본 명령어는 다음과 같습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pyinstaller --noconfirm --onefile --windowed gui.py&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;각 옵션에 대한 의미:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;--noconfirm : 기존 빌드 결과가 있어도 덮어쓰기&lt;/li&gt;
  &lt;li&gt;--onefile : 하나의 실행파일(.exe)로 만들기&lt;/li&gt;
  &lt;li&gt;--windowed : 콘솔 창 없이 GUI만 띄움&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;실행 예제 코드 주석 포함&lt;/h2&gt;
&lt;p&gt;실제 실행 코드를 주석과 함께 정리해보면 다음과 같습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# PyInstaller 실행 명령어
pyinstaller \\
    --noconfirm \\           # 빌드할 때 기존 파일 덮어쓰기 자동 확인
    --onefile \\             # 모든 파일을 하나의 exe로 압축
    --windowed \\            # 콘솔창 숨기기 (GUI 앱일 경우 필수)
    --add-data \&quot;weights/gopro_generator.pth;weights\&quot; \\  # 모델 파일 포함
    --add-data \&quot;output/;output\&quot; \\                      # 출력 폴더 포함
    gui.py                   # 메인 실행 스크립트 지정
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;주의: --add-data 옵션은 세미콜론(;)으로 구분합니다. 윈도우에서는 ;, 리눅스/mac에서는 : 사용&lt;/p&gt;

&lt;h2&gt;빌드 결과 위치&lt;/h2&gt;
&lt;p&gt;빌드가 완료되면 프로젝트 폴더에 다음과 같은 구조가 생성됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dist/
└── gui.exe               # 우리가 원하는 실행파일
build/
└── ...                   # 빌드 중간 생성물
gui.spec                  # 설정 파일
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이 중 dist 폴더에 있는 exe 파일만 다른 PC에 배포하면 됩니다.&lt;/p&gt;

&lt;h2&gt;실행 확인&lt;/h2&gt;
&lt;p&gt;빌드된 gui.exe 파일을 더블 클릭하면, 이전 PyQt5 앱이 그대로 실행됩니다. 사용자는 복잡한 환경 설정 없이도 이미지를 불러오고 흔들림 복원 기능을 사용할 수 있습니다.&lt;/p&gt;

&lt;!-- 광고 2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;문제 해결 팁&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;ImportError 발생 시: 숨겨진 모듈을 spec 파일에 수동 추가&lt;/li&gt;
  &lt;li&gt;폰트나 이미지 경로 누락: --add-data 옵션으로 직접 지정&lt;/li&gt;
  &lt;li&gt;실행시 오류 발생: GUI 파일에 절대 경로 대신 상대경로 사용 권장&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;다음 글 예고&lt;/h2&gt;
&lt;p&gt;5편에서는 이 실행파일을 &lt;strong&gt;설치형 패키지로 포장&lt;/strong&gt;하는 과정, 즉 NSIS 또는 Inno Setup 등을 이용하여 사용자가 더블 클릭 한 번으로 설치할 수 있도록 만드는 설치 마법사 구성법을 소개합니다.&lt;/p&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;이제 우리는 딥러닝 기반 흔들림 보정 앱을 개발하는 것을 넘어, 실제 실행파일로 만들어 누구나 사용할 수 있도록 배포할 수 있게 되었습니다. 인공지능 모델을 제품화하는 과정은 이처럼 패키징과 배포 단계를 통해 완성됩니다. 다음 글에서 설치형 프로그램으로 발전시켜봅시다.&lt;/p&gt;</description>
      <category>AI 프로젝트 실습</category>
      <category>.exe 배포</category>
      <category>ai 배포</category>
      <category>ai 프로젝트 완성</category>
      <category>pyinstaller</category>
      <category>pyqt5</category>
      <category>pytorch</category>
      <category>딥러닝 앱</category>
      <category>실행파일 만들기</category>
      <category>인공지능 프로그램</category>
      <category>패키징</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/213</guid>
      <comments>https://ythouse.tistory.com/213#entry213comment</comments>
      <pubDate>Tue, 22 Apr 2025 07:51:55 +0900</pubDate>
    </item>
    <item>
      <title>[AI 앱 만들기] PyQt5로 딥러닝 모델 실행 &amp;ndash; DeblurGAN을 활용한 이미지 복원 GUI 앱 개발</title>
      <link>https://ythouse.tistory.com/212</link>
      <description>&lt;h1&gt;PyQt5로 딥러닝 모델 실행 – DeblurGAN을 활용한 이미지 복원 GUI 앱 개발&lt;/h1&gt;

&lt;p&gt;이 글은 인공지능으로 이미지 흔들림을 보정하는 프로젝트의 세 번째 편입니다. 1편에서는 전체 구조를, 2편에서는 DeblurGANv2 모델을 실행하는 실습을 다뤘습니다. 이번에는 실제 데스크탑 GUI 애플리케이션에서 버튼 클릭만으로 딥러닝 모델을 실행하고 이미지를 복원하는 프로그램을 만들어보겠습니다.&lt;/p&gt;

&lt;!-- 광고 1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;프로젝트 개요&lt;/h2&gt;
&lt;p&gt;이번 글에서 구현할 핵심 기능은 다음과 같습니다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;PyQt5로 데스크탑 GUI 구성&lt;/li&gt;
  &lt;li&gt;사용자가 이미지 파일 선택&lt;/li&gt;
  &lt;li&gt;버튼 클릭 시 DeblurGAN 모델 실행&lt;/li&gt;
  &lt;li&gt;복원된 이미지를 GUI에 표시 및 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;딥러닝 모델이 실제 GUI와 통합되는 과정을 통해 AI 앱의 실용적인 활용법을 익힐 수 있습니다.&lt;/p&gt;

&lt;h2&gt;필요 패키지 설치&lt;/h2&gt;
&lt;p&gt;다음 패키지를 설치합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install pyqt5 opencv-python torch torchvision pillow&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;프로그램 전체 구조&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;image_deblur_gui/
├── gui.py              # PyQt5 GUI 메인 파일
├── deblur_model.py     # DeblurGAN 모델 불러오기 및 추론 코드
├── weights/            # gopro_generator.pth 모델 파일 위치
└── output/             # 복원된 이미지 저장 폴더
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;모델 처리 모듈: deblur_model.py&lt;/h2&gt;
&lt;p&gt;딥러닝 모델을 불러와 추론하는 기능을 함수로 분리해 둡니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import torch
from torchvision import transforms
from PIL import Image
import numpy as np
import cv2
from models import generator

def deblur_image(image_path, weight_path='weights/gopro_generator.pth'):
    model = generator.GPNet()
    checkpoint = torch.load(weight_path, map_location='cpu')
    model.load_state_dict(checkpoint['model_state_dict'])
    model.eval()

    image = Image.open(image_path).convert('RGB')
    transform = transforms.Compose([
        transforms.Resize((720, 1280)),
        transforms.ToTensor()
    ])
    input_tensor = transform(image).unsqueeze(0)

    with torch.no_grad():
        output = model(input_tensor)
    
    output_image = output.squeeze().permute(1, 2, 0).numpy()
    output_image = (output_image * 255).clip(0, 255).astype(np.uint8)
    return output_image
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;PyQt5 GUI 메인: gui.py&lt;/h2&gt;
&lt;p&gt;버튼 클릭 시 모델을 실행하고 복원된 이미지를 출력하는 GUI를 구성합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QFileDialog, QVBoxLayout
from PyQt5.QtGui import QPixmap, QImage
import cv2
from deblur_model import deblur_image

class DeblurApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('AI 이미지 흔들림 보정')
        self.setGeometry(100, 100, 800, 600)

        self.label = QLabel('이미지를 불러와 주세요', self)
        self.label.setFixedSize(720, 480)

        self.load_button = QPushButton('이미지 불러오기', self)
        self.process_button = QPushButton('보정 시작', self)
        self.process_button.setEnabled(False)

        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.load_button)
        layout.addWidget(self.process_button)
        self.setLayout(layout)

        self.load_button.clicked.connect(self.load_image)
        self.process_button.clicked.connect(self.run_deblurring)

        self.image_path = None

    def load_image(self):
        path, _ = QFileDialog.getOpenFileName(self, '이미지 선택', '', 'Images (*.png *.jpg *.jpeg)')
        if path:
            self.image_path = path
            pixmap = QPixmap(path).scaled(720, 480)
            self.label.setPixmap(pixmap)
            self.process_button.setEnabled(True)

    def run_deblurring(self):
        if self.image_path:
            result = deblur_image(self.image_path)
            output_path = os.path.join('output', 'restored.jpg')
            os.makedirs('output', exist_ok=True)
            cv2.imwrite(output_path, cv2.cvtColor(result, cv2.COLOR_RGB2BGR))
            image = QImage(result, result.shape[1], result.shape[0], QImage.Format_RGB888)
            self.label.setPixmap(QPixmap.fromImage(image).scaled(720, 480))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DeblurApp()
    window.show()
    sys.exit(app.exec_())
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;결과 확인&lt;/h2&gt;
&lt;p&gt;프로그램을 실행하면 이미지 선택 버튼과 보정 버튼이 표시됩니다. 흔들린 이미지를 선택하고, 보정 시작 버튼을 클릭하면 복원된 이미지가 화면에 출력되며, output 폴더에도 저장됩니다.&lt;/p&gt;

&lt;!-- 광고 2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;다음 글 예고&lt;/h2&gt;
&lt;p&gt;다음 4편에서는 이 앱을 PyInstaller로 패키징하여 하나의 실행파일로 만들고, 실제 배포 가능한 형태로 만드는 과정을 다룹니다. 설치 없이 실행 가능한 인공지능 앱을 만들 수 있도록 도와드립니다.&lt;/p&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;이번 글에서는 딥러닝 모델과 PyQt5 GUI를 통합해 실제 동작하는 흔들림 보정 데스크탑 앱을 만들어보았습니다. 버튼 하나로 AI 모델을 실행하고 이미지가 복원되는 과정을 통해 AI 기술이 어떻게 사용자 중심 앱으로 발전할 수 있는지를 경험할 수 있습니다. 다음 글에서 실행파일로 포장하여 완성된 배포형 프로그램으로 발전시켜보겠습니다.&lt;/p&gt;</description>
      <category>AI 프로젝트 실습</category>
      <category>ai 실습</category>
      <category>ai 프로젝트</category>
      <category>deblurgan</category>
      <category>pyqt5</category>
      <category>pytorch</category>
      <category>데스크탑 프로그램</category>
      <category>딥러닝 앱</category>
      <category>이미지 복원</category>
      <category>인공지능 gui</category>
      <category>흔들림 제거</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/212</guid>
      <comments>https://ythouse.tistory.com/212#entry212comment</comments>
      <pubDate>Tue, 22 Apr 2025 07:49:57 +0900</pubDate>
    </item>
    <item>
      <title>[AI 실습] DeblurGANv2로 이미지 흔들림 복원하기 &amp;ndash; PyTorch 모델 실행부터 추론까지</title>
      <link>https://ythouse.tistory.com/211</link>
      <description>&lt;h1&gt;DeblurGANv2로 이미지 흔들림 복원하기 – PyTorch 모델 실행부터 추론까지&lt;/h1&gt;

&lt;p&gt;이 글은 인공지능으로 사진 흔들림을 제거하는 실전 프로젝트의 두 번째 단계입니다. 지난 글에서는 전체 구조와 프로그램 개발 흐름을 소개했는데, 이번에는 실제로 AI 모델을 다운로드하고 흔들린 이미지를 복원해보는 실습을 진행합니다.&lt;/p&gt;

&lt;!-- 광고 1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;DeblurGANv2란 무엇인가?&lt;/h2&gt;
&lt;p&gt;DeblurGAN은 흔들린 이미지를 원래처럼 선명하게 복원하는 GAN 기반의 딥러닝 모델입니다. GAN은 생성자와 판별자가 경쟁하면서 고품질 이미지를 생성할 수 있게 하는 구조입니다. DeblurGANv2는 이전 버전에 비해 더 빠르고 정확하게 개선된 구조이며, 다양한 데이터셋에서 높은 성능을 입증했습니다.&lt;/p&gt;

&lt;h2&gt;모델 다운로드 방법&lt;/h2&gt;
&lt;p&gt;DeblurGANv2는 GitHub에서 오픈소스로 제공됩니다. 아래 명령어로 저장소를 복제하세요.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone https://github.com/VITA-Group/DeblurGANv2.git
cd DeblurGANv2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;필요한 사전학습 모델은 다음 링크에서 받을 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;GoPro dataset용 모델 (사용 권장): https://drive.google.com/file/d/1JpZeiD3dzyx_Zk1PZn-L7xNnpln6-Qdc/view&lt;/li&gt;
  &lt;li&gt;다운로드 후 weights 폴더에 저장: weights/gopro_generator.pth&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;환경 설정&lt;/h2&gt;
&lt;p&gt;Python 3.8 기준, 아래 패키지를 설치하세요.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pip install torch torchvision opencv-python matplotlib tqdm&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;DeblurGANv2에서는 CUDA GPU 환경을 권장하지만, CPU로도 실행은 가능합니다. 다만 속도는 느립니다.&lt;/p&gt;

&lt;h2&gt;입력 이미지 준비&lt;/h2&gt;
&lt;p&gt;복원 테스트를 위한 이미지 파일을 하나 준비해, 아래 폴더에 넣습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DeblurGANv2/test_images/sample_blurred.jpg&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;참고로 여러 장의 이미지가 아니라 단일 이미지를 복원하는 방식입니다. 멀티 프레임 정합은 별도로 구현이 필요합니다.&lt;/p&gt;

&lt;h2&gt;모델 실행 코드&lt;/h2&gt;
&lt;p&gt;아래는 PyTorch를 이용해 사전학습된 DeblurGANv2 모델을 불러오고, 이미지를 복원하는 예시 코드입니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import torch
import torchvision.transforms as transforms
from PIL import Image
import cv2
import numpy as np
import os
from models import generator

# 모델 로드
model = generator.GPNet()
ckpt = torch.load('weights/gopro_generator.pth', map_location='cpu')
model.load_state_dict(ckpt['model_state_dict'])
model.eval()

# 이미지 로드
image = Image.open('test_images/sample_blurred.jpg').convert('RGB')
transform = transforms.Compose([
    transforms.Resize((720, 1280)),
    transforms.ToTensor()
])
input_tensor = transform(image).unsqueeze(0)

# 추론
with torch.no_grad():
    output_tensor = model(input_tensor)

# 결과 저장
output_image = output_tensor.squeeze().permute(1, 2, 0).numpy()
output_image = np.clip(output_image * 255, 0, 255).astype(np.uint8)
cv2.imwrite('test_images/output_restored.jpg', cv2.cvtColor(output_image, cv2.COLOR_RGB2BGR))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이 코드를 실행하면 test_images 폴더에 복원된 이미지가 생성됩니다.&lt;/p&gt;

&lt;h2&gt;결과 확인&lt;/h2&gt;
&lt;p&gt;실행 결과는 일반적인 흐릿한 이미지보다 확연히 선명한 결과를 확인할 수 있습니다. 모델이 한계는 있지만, 사전학습 데이터와 유사한 흔들림 조건에서는 매우 효과적으로 작동합니다.&lt;/p&gt;

&lt;h2&gt;커스터마이징 팁&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;입력 크기 수정: transforms.Resize() 크기를 카메라 해상도에 맞게 조정&lt;/li&gt;
  &lt;li&gt;멀티 프레임 입력을 위해 정합 후 평균 입력 시도&lt;/li&gt;
  &lt;li&gt;PyQt5와 연동하여 GUI에서 추론 결과를 바로 보여주도록 구성 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- 광고 2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;다음 글 예고&lt;/h2&gt;
&lt;p&gt;3편에서는 PyQt5 GUI 프로그램에 이 모델을 통합하여 사용자가 직접 이미지를 불러오고 복원할 수 있는 데스크탑 앱으로 발전시키는 과정을 다룰 예정입니다.&lt;/p&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;이번 글에서는 DeblurGANv2 모델을 다운로드하고, PyTorch로 흔들린 이미지를 복원하는 전체 과정을 살펴보았습니다. AI 모델은 그 자체로도 유용하지만, 이렇게 직접 실행해보고 결과를 확인하며 확장해나가는 과정에서 실질적인 역량이 쌓입니다. 다음 글에서 GUI와의 통합을 통해 완성도 있는 프로그램으로 발전시켜보겠습니다.&lt;/p&gt;</description>
      <category>AI 프로젝트 실습</category>
      <category>ai 실습</category>
      <category>deblurgan</category>
      <category>Gan</category>
      <category>pytorch</category>
      <category>pytorch 실습</category>
      <category>딥러닝 실습</category>
      <category>오픈소스 ai</category>
      <category>이미지 복원</category>
      <category>인공지능 프로젝트</category>
      <category>흔들림 제거</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/211</guid>
      <comments>https://ythouse.tistory.com/211#entry211comment</comments>
      <pubDate>Tue, 22 Apr 2025 07:48:48 +0900</pubDate>
    </item>
    <item>
      <title>인공지능으로 사진 흔들림 제거하기 &amp;ndash; PyTorch + PyQt5로 만드는 AI 이미지 복원 앱 개발기</title>
      <link>https://ythouse.tistory.com/210</link>
      <description>&lt;h1&gt;인공지능으로 사진 흔들림 제거하기 – PyTorch + PyQt5로 만드는 AI 이미지 복원 앱 개발기&lt;/h1&gt;

&lt;p&gt;스마트폰, 디지털 카메라, 현미경, 드론… 사진은 일상과 산업 전반에서 활용됩니다. 하지만 조금만 손이 떨려도, 사진은 쉽게 흐려지고 맙니다. 일반 사용자는 이럴 때 포토샵을 쓰거나, 그냥 사진을 다시 찍습니다. 하지만 여러 장을 한 번에 촬영해놓았을 경우, AI를 활용해서 가장 선명한 이미지를 복원할 수 있습니다.&lt;/p&gt;

&lt;p&gt;그래서 저는 딥러닝 모델을 이용해 다수의 흔들린 이미지를 한 장의 선명한 이미지로 복원하는 프로그램을 직접 개발해보기로 했습니다. 이 글은 그 첫 번째 기록입니다.&lt;/p&gt;

&lt;!-- 광고 1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;프로젝트 개요 및 목표&lt;/h2&gt;
&lt;p&gt;이번 프로젝트의 핵심은 다음과 같습니다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;PyTorch를 사용해 딥러닝 모델 DeblurGANv2를 불러온다&lt;/li&gt;
  &lt;li&gt;OpenCV를 통해 여러 장의 이미지를 정렬하고 모델에 전달한다&lt;/li&gt;
  &lt;li&gt;보정된 결과물을 이미지 파일로 저장한다&lt;/li&gt;
  &lt;li&gt;PyQt5를 활용한 데스크탑 GUI에서 이 전체 과정을 쉽게 수행할 수 있게 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, 이건 단순한 모델 테스트가 아니라, 실제 유저가 사용할 수 있는 앱을 만드는 것이다.&lt;/p&gt;

&lt;h2&gt;프로젝트 폴더 구조&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;image_deblur_ai/
├── gui/
├── model/
├── input/
├── output/
├── main.py
├── requirements.txt
└── build/
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;DeblurGANv2란?&lt;/h2&gt;
&lt;p&gt;DeblurGAN은 GAN 구조를 기반으로 흐릿한 이미지를 복원하는 모델이다. 일반적인 이미지 복원 방식은 손실된 정보를 복원하기 어렵지만, GAN은 학습된 데이터를 바탕으로 결측된 세부 정보를 생성해낼 수 있다.&lt;/p&gt;
&lt;p&gt;DeblurGANv2는 속도와 성능을 개선한 버전으로, 실시간 성능에 가까우며 고해상도 이미지도 처리할 수 있다. GitHub에서 오픈소스로 제공되고 있어 누구나 사용할 수 있다.&lt;/p&gt;

&lt;h2&gt;이미지 입력 및 처리 방식&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;사용자는 GUI를 통해 여러 장의 이미지를 선택한다&lt;/li&gt;
  &lt;li&gt;OpenCV를 이용해 첫 번째 이미지를 기준으로 나머지를 정렬한다&lt;/li&gt;
  &lt;li&gt;정렬된 이미지를 모델에 입력한다&lt;/li&gt;
  &lt;li&gt;모델은 한 장의 선명한 이미지를 출력한다&lt;/li&gt;
  &lt;li&gt;GUI에서 결과를 확인하고 저장할 수 있다&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;PyQt5를 이용한 GUI 구성&lt;/h2&gt;
&lt;p&gt;사용자의 편의를 위해 PyQt5 기반의 GUI를 제작했다. 주요 기능은 다음과 같다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;이미지 다중 선택&lt;/li&gt;
  &lt;li&gt;선택한 이미지 미리보기&lt;/li&gt;
  &lt;li&gt;보정 시작 버튼&lt;/li&gt;
  &lt;li&gt;결과 이미지 확인 및 저장&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;PyInstaller로 실행파일 만들기&lt;/h2&gt;
&lt;p&gt;아무리 좋은 AI도 코드로만 실행된다면 일반인은 사용하기 어렵다. 그래서 PyInstaller를 통해 이 프로젝트를 실행파일로 패키징한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pyinstaller --noconfirm --onefile --windowed main.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 하면 하나의 실행파일로 묶여 누구나 다운로드 받아 바로 실행할 수 있다.&lt;/p&gt;

&lt;h2&gt;왜 이 프로젝트가 의미 있는가?&lt;/h2&gt;
&lt;p&gt;이 프로젝트는 단순히 모델을 불러와서 이미지를 처리하는 실험이 아니다. 다음을 학습하고 구현하게 된다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;오픈소스 AI 모델의 활용법&lt;/li&gt;
  &lt;li&gt;멀티 프레임 정합 기술&lt;/li&gt;
  &lt;li&gt;PyQt5를 통한 GUI 프로그래밍&lt;/li&gt;
  &lt;li&gt;최종 배포를 위한 PyInstaller 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이러한 기술은 산업용 영상처리, 보안카메라 보정, 의학 영상 강화 등 다양한 분야에 직접 활용될 수 있다.&lt;/p&gt;

&lt;!-- 광고 2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;다음 글 예고&lt;/h2&gt;
&lt;p&gt;다음 포스트에서는 다음 내용을 다룰 예정이다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;DeblurGANv2 모델 다운로드 방법&lt;/li&gt;
  &lt;li&gt;Python으로 모델을 불러와 실행하는 코드 작성&lt;/li&gt;
  &lt;li&gt;샘플 이미지로 추론 결과 확인하기&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;마무리하며&lt;/h2&gt;
&lt;p&gt;사진이 흔들렸다고 해서 포기하지 말자. 인공지능은 이제 손상된 이미지를 복원하고, 흐릿한 순간을 다시 선명하게 되살릴 수 있는 도구가 되었다. 앞으로 이 시리즈를 통해 누구나 AI를 활용한 실전 프로젝트를 완성할 수 있을 것이다.&lt;/p&gt;
&lt;p&gt;계속해서 실습 중심의 AI 프로젝트를 블로그로 연재할 예정이니, 즐겨찾기 추가와 댓글 부탁드린다.&lt;/p&gt;</description>
      <category>AI 프로젝트 실습</category>
      <category>ai 프로젝트</category>
      <category>deblurgan</category>
      <category>OpenCV</category>
      <category>pyqt5</category>
      <category>pytorch</category>
      <category>데스크탑 앱</category>
      <category>딥러닝</category>
      <category>이미지 복원</category>
      <category>인공지능 예제</category>
      <category>흔들림 보정</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/210</guid>
      <comments>https://ythouse.tistory.com/210#entry210comment</comments>
      <pubDate>Tue, 22 Apr 2025 07:46:51 +0900</pubDate>
    </item>
    <item>
      <title>AI 흔들림 보정 앱 만들기 &amp;ndash; PyTorch + PyQt5로 이미지 선명하게 복원하는 데스크탑 프로그램 개발기</title>
      <link>https://ythouse.tistory.com/209</link>
      <description>&lt;h2&gt;  인공지능으로 이미지 흔들림을 보정할 수 있을까?&lt;/h2&gt;
&lt;p&gt;스마트폰으로 사진을 찍을 때, 혹은 현미경이나 드론처럼 미세한 흔들림이 존재하는 환경에서는 이미지가 흔들려서 중요한 디테일이 손실되곤 합니다. 과거에는 이러한 문제를 포토샵 같은 도구로 수동 보정해야 했지만, &lt;strong&gt;요즘은 딥러닝 기반의 AI 모델로 자동 보정이 가능합니다&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;이번 글에서는 &lt;strong&gt;여러 장의 흔들린 사진을 이용해 한 장의 선명한 이미지를 복원하는 프로그램&lt;/strong&gt;을 직접 만드는 과정을 소개합니다. PyTorch로 구현된 DeblurGAN 계열의 딥러닝 모델을 기반으로 하고, &lt;strong&gt;PyQt5로 GUI를 제공하는 데스크탑 프로그램&lt;/strong&gt;을 완성하는 것이 목표입니다.&lt;/p&gt;

&lt;!-- 광고 1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;  프로젝트 개요 및 구성&lt;/h2&gt;
&lt;p&gt;이 프로젝트는 다음과 같은 흐름으로 구성됩니다:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;입력&lt;/strong&gt;: 흔들린 사진 여러 장을 사용자가 선택&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;정합&lt;/strong&gt;: 각 사진들을 기준 이미지에 정렬&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;보정&lt;/strong&gt;: 딥러닝 모델로 흔들림 제거 및 선명도 개선&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;GUI&lt;/strong&gt;: PyQt5로 사용자가 클릭 몇 번만으로 실행 가능하게 구성&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;우리는 이 과정을 통해 흔들림을 줄이고, 이미지의 품질을 극대화하는 방법을 배웁니다.&lt;/p&gt;

&lt;h2&gt;  사용된 기술 스택&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Python 3.x&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;PyTorch&lt;/strong&gt; – 딥러닝 모델 로딩 및 추론&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;OpenCV&lt;/strong&gt; – 이미지 정합 및 전처리&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;PyQt5&lt;/strong&gt; – GUI 애플리케이션 제작&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;PyInstaller&lt;/strong&gt; – 데스크탑 실행파일(.exe)로 패키징&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  DeblurGAN이란?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;DeblurGAN&lt;/strong&gt;은 이미지의 모션 블러(흔들림)를 제거하기 위해 GAN(Generative Adversarial Network) 구조를 사용하는 모델입니다. 특히 &lt;strong&gt;DeblurGAN-v2&lt;/strong&gt;는 성능이 개선되어 실시간에도 사용할 수 있는 구조로 바뀌었고, 저해상도부터 고해상도까지 다양한 입력을 지원합니다.&lt;/p&gt;
&lt;p&gt;기존에는 하나의 이미지만 가지고 보정을 했다면, 우리는 여기에 &lt;strong&gt;멀티 프레임 기반 정합&lt;/strong&gt;을 추가해 여러 장의 이미지를 통합하여 더 나은 결과를 만들어낼 것입니다.&lt;/p&gt;

&lt;h2&gt; ️ 사용자 인터페이스 구성&lt;/h2&gt;
&lt;p&gt;GUI는 PyQt5로 구성되며, 주요 기능은 다음과 같습니다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;✅ 이미지 불러오기 (여러 장 선택 가능)&lt;/li&gt;
  &lt;li&gt;✅ 이미지 미리보기 (처리 전후)&lt;/li&gt;
  &lt;li&gt;✅ 보정 시작 버튼&lt;/li&gt;
  &lt;li&gt;✅ 결과 저장 버튼&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;최대한 간단하면서도 기능적인 UI로 구성하여, 비개발자도 쉽게 사용할 수 있도록 구현합니다.&lt;/p&gt;

&lt;h2&gt;  폴더 구조 예시&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;image_deblur_ai/
├── gui/                  # PyQt5 GUI 소스
├── model/                # DeblurGANv2 학습된 모델 파일
├── input/                # 입력 이미지 폴더
├── output/               # 보정 결과 이미지 저장 폴더
├── main.py               # 전체 앱 실행 파일
├── requirements.txt      # 필요한 패키지 리스트
└── build/                # PyInstaller로 만든 실행 파일 폴더
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  실제 처리 과정 흐름&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;사용자가 input 폴더에 여러 장의 흔들린 이미지를 넣습니다.&lt;/li&gt;
  &lt;li&gt;GUI를 통해 '보정 시작' 버튼을 클릭하면, 내부적으로 다음 단계가 실행됩니다:&lt;/li&gt;
  &lt;li&gt;OpenCV로 이미지 정렬 (정합) → DeblurGAN 모델에 입력 → 출력 이미지 생성&lt;/li&gt;
  &lt;li&gt;결과 이미지는 output 폴더에 저장되며, GUI에서도 확인 가능&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;  이 프로젝트의 의의&lt;/h2&gt;
&lt;p&gt;단순히 AI 모델을 구동하는 데 그치지 않고, &lt;strong&gt;GUI와 함께 실제 사용자용 애플리케이션으로 구성하는 것&lt;/strong&gt;이 이 프로젝트의 핵심입니다. 이런 방식은 현업에서도 많이 사용되며, 자신만의 AI 기반 소프트웨어를 만들고자 할 때 필수적인 과정입니다.&lt;/p&gt;

&lt;!-- 광고 2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h2&gt;  앞으로의 계획&lt;/h2&gt;
&lt;p&gt;이번 글은 전체 시리즈의 시작입니다. 다음 글에서는 실제 PyTorch로 DeblurGANv2 모델을 실행해보며, 학습된 가중치를 어디서 어떻게 다운로드하고, 어떤 방식으로 추론을 수행하는지 구체적으로 다룰 예정입니다.&lt;/p&gt;
&lt;p&gt;또한, 이후에는 이 모델을 PyQt5 앱과 통합하는 방법, PyInstaller로 실행 파일을 만드는 방법, 나아가 설치 파일로 패키징하는 방법까지 순차적으로 설명할 예정입니다.&lt;/p&gt;

&lt;h2&gt;  마무리하며&lt;/h2&gt;
&lt;p&gt;지금까지 &lt;strong&gt;AI를 이용한 이미지 흔들림 보정 프로그램&lt;/strong&gt;을 만드는 전체 흐름과 핵심 구성요소를 정리해보았습니다. 이 시리즈를 따라가다 보면, 단순한 모델 실행이 아닌 ‘&lt;strong&gt;완성된 프로그램을 만드는 개발자&lt;/strong&gt;’로 성장하게 될 것입니다.&lt;/p&gt;
&lt;p&gt;다음 편에서는 &lt;strong&gt;DeblurGAN 모델 다운로드 및 실행 실습&lt;/strong&gt;으로 이어갑니다. 기대해주세요!&lt;/p&gt;</description>
      <category>AI 프로젝트 실습</category>
      <category>ai 앱 개발</category>
      <category>ai 프로젝트</category>
      <category>deblurgan</category>
      <category>pyqt5</category>
      <category>pytorch</category>
      <category>데스크탑 프로그램</category>
      <category>딥러닝 실습</category>
      <category>오픈소스 ai</category>
      <category>이미지 복원</category>
      <category>흔들림 보정</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/209</guid>
      <comments>https://ythouse.tistory.com/209#entry209comment</comments>
      <pubDate>Tue, 22 Apr 2025 07:43:38 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 UART 디버깅 콘솔 확장 &amp;ndash; 설정값 EEPROM에 저장하기</title>
      <link>https://ythouse.tistory.com/208</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  아두이노 UART 디버깅 콘솔 확장 &amp;ndash; 설정값 EEPROM에 저장하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Pkl2/btsNxZSCXNw/iFDx8tRF3T8kpjQVh0BWUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Pkl2/btsNxZSCXNw/iFDx8tRF3T8kpjQVh0BWUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Pkl2/btsNxZSCXNw/iFDx8tRF3T8kpjQVh0BWUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Pkl2%2FbtsNxZSCXNw%2FiFDx8tRF3T8kpjQVh0BWUK%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;1024&quot; height=&quot;1536&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UART 디버깅 콘솔에서 명령어를 통해 설정값을 바꾸는 것만으로는 부족합니다. 왜냐하면 전원을 껐다 켜면 값이 초기화되기 때문입니다. 실전에서는 반드시 &lt;b&gt;설정을 저장하고 유지하는 구조&lt;/b&gt;가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 사용자가 설정한 값을 EEPROM에 저장하고 불러오는 기능을 UART 명령어 기반으로 구현해 보겠습니다. 목표는 시스템 재시작 후에도 설정이 그대로 유지되는 &lt;b&gt;지속 가능한 설정 시스템&lt;/b&gt;을 만드는 것입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 1. 구현할 기능 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SET SPEED 100 &amp;rarr; 현재 속도 설정&lt;/li&gt;
&lt;li&gt;SAVE &amp;rarr; 현재 속도 EEPROM에 저장&lt;/li&gt;
&lt;li&gt;LOAD &amp;rarr; EEPROM에서 속도 불러오기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2. 필요한 라이브러리&lt;/h3&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt; // 내장 EEPROM 라이브러리 사용
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 라이브러리는 아두이노 IDE에서 기본 포함되어 있어 별도 설치 없이 사용 가능합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  3. 전체 예제 코드 (주석 포함)&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt;

char buffer[64];
int index = 0;
int speedValue = 0; // 현재 속도 값 (설정값)
const int addr = 0; // EEPROM 주소 0번에 저장

void setup() {
  Serial.begin(9600);
  Serial.println(&quot;EEPROM 콘솔 시작&quot;);
  loadSpeed(); // 부팅 시 EEPROM에서 불러오기
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();
    if (c == '\n') {
      buffer[index] = '\0';
      parseCommand(buffer);
      index = 0;
    } else {
      buffer[index++] = c;
    }
  }
}

void parseCommand(char* cmd) {
  char* token = strtok(cmd, &quot; &quot;);
  if (!token) return;

  if (strcmp(token, &quot;SET&quot;) == 0) {
    char* key = strtok(NULL, &quot; &quot;);
    char* val = strtok(NULL, &quot; &quot;);
    if (key &amp;amp;&amp;amp; val &amp;amp;&amp;amp; strcmp(key, &quot;SPEED&quot;) == 0) {
      speedValue = atoi(val);
      Serial.print(&quot;속도 설정됨: &quot;);
      Serial.println(speedValue);
    }
  } else if (strcmp(token, &quot;SAVE&quot;) == 0) {
    EEPROM.put(addr, speedValue);
    Serial.println(&quot;EEPROM 저장 완료&quot;);
  } else if (strcmp(token, &quot;LOAD&quot;) == 0) {
    loadSpeed();
    Serial.print(&quot;EEPROM 로드됨, 속도: &quot;);
    Serial.println(speedValue);
  } else {
    Serial.println(&quot;알 수 없는 명령&quot;);
  }
}

void loadSpeed() {
  EEPROM.get(addr, speedValue);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  EEPROM.put()은 구조체 형태도 저장할 수 있어 다양한 설정 확장에 적합합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간광고자리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  4. 테스트 방법 요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;시리얼 모니터 실행&lt;/b&gt; (속도 9600bps)&lt;/li&gt;
&lt;li&gt;SET SPEED 80 입력 &amp;rarr; 속도 설정됨 출력 확인&lt;/li&gt;
&lt;li&gt;SAVE 입력 &amp;rarr; EEPROM 저장 완료 출력 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보드 리셋 후&lt;/b&gt; LOAD 입력 &amp;rarr; EEPROM에서 저장된 속도 불러오기 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 설정값이 꺼졌다 켜져도 유지되는 구조가 확인됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ 5. 확장 활용 가능성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;속도&lt;/b&gt;뿐만 아니라 다음과 같은 설정에도 응용할 수 있습니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PID 제어값 저장 (KP, KI, KD)&lt;/li&gt;
&lt;li&gt;사용자 모드 / 기능 활성화 여부&lt;/li&gt;
&lt;li&gt;장치 고유 ID&lt;/li&gt;
&lt;li&gt;사용자의 커스터마이징 상태 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 임베디드 펌웨어 설정 인터페이스에서 가장 많이 쓰이는 패턴입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간광고자리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  6. 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 만든 UART 콘솔 기반 설정 + EEPROM 저장 구조는 단순한 디버깅 도구를 넘어서, 실전 장비에 적용할 수 있는 &lt;b&gt;설정 저장 시스템&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 응용하면 다음과 같은 발전이 가능합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부팅 시 자동으로 설정값 반영&lt;/li&gt;
&lt;li&gt;시리얼 입력 외에도 버튼, 앱 등 다양한 입력 방식과 연결 가능&lt;/li&gt;
&lt;li&gt;OLED와 같은 출력장치와 결합해 실시간 피드백 UI 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  다음 편 예고: &lt;b&gt;센서값 + 설정값을 OLED에 표시하는 실시간 디버깅 인터페이스 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: ythouse.tistory.com&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>cli 시스템</category>
      <category>EEPROM</category>
      <category>uart 디버깅</category>
      <category>명령어 파싱</category>
      <category>설정값 보존</category>
      <category>시리얼 명령어</category>
      <category>시리얼 통신</category>
      <category>아두이노</category>
      <category>아두이노 EEPROM</category>
      <category>펌웨어 설정</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/208</guid>
      <comments>https://ythouse.tistory.com/208#entry208comment</comments>
      <pubDate>Mon, 21 Apr 2025 08:00:14 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 UART 디버깅 콘솔 만들기 &amp;ndash; 시리얼 명령어 처리 시스템 완전 구현</title>
      <link>https://ythouse.tistory.com/207</link>
      <description>&lt;style&gt;
.article-container {
  max-width: 760px;
  margin: auto;
  line-height: 1.8;
  font-size: 17px;
  color: #222;
}
.article-container h2, .article-container h3 {
  text-align: center;
  margin-top: 40px;
}
.code-box {
  background: #f4f4f4;
  padding: 14px;
  font-family: monospace;
  white-space: pre-wrap;
  border-left: 5px solid #999;
}
.ads-wrapper {
  margin: 40px 0;
  text-align: center;
}
&lt;/style&gt;

&lt;div class=&quot;article-container&quot;&gt;
  &lt;h2&gt;아두이노 UART 디버깅 콘솔 만들기 – 시리얼 명령어 처리 시스템 완전 구현&lt;/h2&gt;

  &lt;p&gt;임베디드 개발자라면 반드시 한 번쯤 만들어보는 도구가 바로 &lt;strong&gt;UART 디버깅 콘솔&lt;/strong&gt;입니다.  
  시리얼 통신을 통해 장치에 명령을 보내고, 상태를 조회하며, 직접 LED를 제어하거나 센서값을 확인할 수 있는 &lt;strong&gt;CLI(Command Line Interface)&lt;/strong&gt;는 디버깅 도구의 핵심입니다.&lt;/p&gt;

  &lt;p&gt;이번 글에서는 아두이노에서 &lt;strong&gt;시리얼 명령어를 파싱하고 처리하는 콘솔 시스템&lt;/strong&gt;을 직접 구축하는 방법을 소개합니다.&lt;/p&gt;

  &lt;h3&gt;1. 무엇을 만들 것인가?&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;시리얼로 명령어 입력 → 처리 → 결과 응답&lt;/li&gt;
    &lt;li&gt;예: &lt;code&gt;LED ON&lt;/code&gt;, &lt;code&gt;LED OFF&lt;/code&gt;, &lt;code&gt;STATUS?&lt;/code&gt;, &lt;code&gt;SET SPEED 50&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;파싱 방식 → 문자열 비교 vs 문자열 분할 방식&lt;/li&gt;
  &lt;/ul&gt;

  &lt;div class=&quot;ads-wrapper&quot;&gt;
    &lt;ins class=&quot;adsbygoogle&quot;
         style=&quot;display:block&quot;
         data-ad-client=&quot;ca-pub-8362837465904837&quot;
         data-ad-slot=&quot;5674748480&quot;
         data-ad-format=&quot;auto&quot;
         data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;
         (adsbygoogle = window.adsbygoogle || []).push({});
    &lt;/script&gt;
  &lt;/div&gt;

  &lt;h3&gt;2. 기본 하드웨어 구성&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;아두이노 Uno/Nano&lt;/li&gt;
    &lt;li&gt;LED (13번 핀 기본 사용)&lt;/li&gt;
    &lt;li&gt;시리얼 통신 (9600bps)&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;하드웨어 연결 없이도 동작 확인 가능 (13번 핀 LED 내장)&lt;/p&gt;

  &lt;h3&gt;3. 예제 코드 – 기본 명령어 처리&lt;/h3&gt;
  &lt;p&gt;먼저 간단한 &lt;strong&gt;문자열 비교 방식&lt;/strong&gt; 예제를 봅시다.&lt;/p&gt;

  &lt;div class=&quot;code-box&quot;&gt;
String input = &quot;&quot;;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.println(&quot;UART 명령어 콘솔 시작&quot;);
}

void loop() {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == '\n' || c == '\r') {
      processCommand(input);
      input = &quot;&quot;;
    } else {
      input += c;
    }
  }
}

void processCommand(String cmd) {
  cmd.trim();
  cmd.toUpperCase();

  if (cmd == &quot;LED ON&quot;) {
    digitalWrite(13, HIGH);
    Serial.println(&quot;LED ON&quot;);
  } else if (cmd == &quot;LED OFF&quot;) {
    digitalWrite(13, LOW);
    Serial.println(&quot;LED OFF&quot;);
  } else if (cmd == &quot;STATUS?&quot;) {
    Serial.print(&quot;LED 상태: &quot;);
    Serial.println(digitalRead(13) ? &quot;ON&quot; : &quot;OFF&quot;);
  } else {
    Serial.println(&quot;알 수 없는 명령&quot;);
  }
}
  &lt;/div&gt;

  &lt;p&gt;  위 코드는 &lt;strong&gt;줄 단위 입력&lt;/strong&gt;을 받아서 LED 제어 및 상태 확인이 가능한 구조입니다.&lt;/p&gt;

  &lt;h3&gt;4. 고급 예제 – 인자 포함 명령 처리&lt;/h3&gt;
  &lt;p&gt;문자열을 &lt;code&gt;strtok()&lt;/code&gt; 또는 &lt;code&gt;split&lt;/code&gt; 방식으로 분해하면 파라미터 처리도 가능합니다.&lt;/p&gt;

  &lt;div class=&quot;code-box&quot;&gt;
char buffer[64];
int index = 0;

void loop() {
  while (Serial.available()) {
    char c = Serial.read();
    if (c == '\n') {
      buffer[index] = '\0';
      parseCommand(buffer);
      index = 0;
    } else {
      buffer[index++] = c;
    }
  }
}

void parseCommand(char* cmd) {
  char* token = strtok(cmd, &quot; &quot;);
  if (strcmp(token, &quot;SET&quot;) == 0) {
    char* what = strtok(NULL, &quot; &quot;);
    char* value = strtok(NULL, &quot; &quot;);
    if (what &amp;&amp; value) {
      if (strcmp(what, &quot;SPEED&quot;) == 0) {
        int v = atoi(value);
        Serial.print(&quot;속도 설정: &quot;);
        Serial.println(v);
      }
    }
  }
}
  &lt;/div&gt;

  &lt;p&gt;  구조화된 파싱 방식은 &lt;strong&gt;센서 설정, PID 조정, EEPROM 저장&lt;/strong&gt; 등의 고급 기능으로 쉽게 확장됩니다.&lt;/p&gt;

  &lt;div class=&quot;ads-wrapper&quot;&gt;
    &lt;ins class=&quot;adsbygoogle&quot;
         style=&quot;display:block&quot;
         data-ad-client=&quot;ca-pub-8362837465904837&quot;
         data-ad-slot=&quot;5674748480&quot;
         data-ad-format=&quot;auto&quot;
         data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;
         (adsbygoogle = window.adsbygoogle || []).push({});
    &lt;/script&gt;
  &lt;/div&gt;

  &lt;h3&gt;5. 응용 확장 방향&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;EEPROM에 설정 저장/불러오기&lt;/li&gt;
    &lt;li&gt;센서 ON/OFF, 데이터 로깅 시작/정지&lt;/li&gt;
    &lt;li&gt;모드 전환, 속도 설정, 캘리브레이션 명령&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;시리얼 명령어 시스템은 &lt;strong&gt;GUI 없는 펌웨어의 가장 강력한 UI&lt;/strong&gt;가 됩니다.  
  보드를 바꿔도, 하드웨어가 달라도 이 구조는 계속 쓸 수 있어요.&lt;/p&gt;

  &lt;h3&gt;6. 마무리&lt;/h3&gt;
  &lt;p&gt;펌웨어를 처음 시작하는 개발자라면 반드시 익혀야 할 구조 중 하나가  
  바로 &lt;strong&gt;시리얼 명령어 인터페이스&lt;/strong&gt;입니다.&lt;/p&gt;

  &lt;p&gt;LED On/Off로 시작해 속도 설정, PID 조정, EEPROM 저장까지 확장해보세요.  
  아두이노를 넘어 실제 임베디드 개발에서도 이 패턴은 널리 쓰이고 있습니다.&lt;/p&gt;

  &lt;p&gt;다음 글에서는 &lt;strong&gt;EEPROM 저장 기능 추가&lt;/strong&gt;나 &lt;strong&gt;센서 연동 명령어 제어 시스템&lt;/strong&gt;으로 발전시켜 보겠습니다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>아두이노</category>
      <category>cli 시스템</category>
      <category>uart 디버깅</category>
      <category>디버깅 도구</category>
      <category>명령어 파싱</category>
      <category>시리얼 명령어</category>
      <category>시리얼 콘솔 제어</category>
      <category>시리얼 통신</category>
      <category>아두이노</category>
      <category>아두이노 시리얼 명령어</category>
      <category>펌웨어 입문</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/207</guid>
      <comments>https://ythouse.tistory.com/207#entry207comment</comments>
      <pubDate>Mon, 21 Apr 2025 07:58:34 +0900</pubDate>
    </item>
    <item>
      <title>IR 리모컨으로 OLED 화면 제어하기 &amp;ndash; 아두이노로 만든 무선 UI 시스템</title>
      <link>https://ythouse.tistory.com/206</link>
      <description>&lt;style&gt;
.article-container {
  max-width: 760px;
  margin: auto;
  line-height: 1.8;
  font-size: 17px;
  color: #222;
}
.article-container h2, .article-container h3 {
  text-align: center;
  margin-top: 40px;
}
.code-box {
  background: #f8f8f8;
  padding: 14px;
  font-family: monospace;
  white-space: pre-wrap;
  border-left: 5px solid #666;
}
.ads-wrapper {
  margin: 40px 0;
  text-align: center;
}
&lt;/style&gt;

&lt;div class=&quot;article-container&quot;&gt;
  &lt;h2&gt;IR 리모컨으로 OLED 화면 제어하기 – 아두이노로 만든 무선 UI 시스템&lt;/h2&gt;

  &lt;p&gt;IR 리모컨을 이용하면 아두이노에서 버튼 하나 없이도 다양한 동작을 제어할 수 있습니다.  
  특히 OLED 디스플레이와 결합하면 무선으로 메뉴를 전환하거나 값을 조절하는 &lt;strong&gt;작은 인터페이스 시스템&lt;/strong&gt;을 구축할 수 있죠.&lt;/p&gt;

  &lt;p&gt;이번 글에서는 IR 수신 모듈과 SSD1306 OLED 디스플레이를 이용해,  
  &lt;strong&gt;리모컨 입력에 따라 텍스트, 아이콘, 메뉴 등을 전환&lt;/strong&gt;하는 시스템을 구축해보겠습니다.&lt;/p&gt;

  &lt;h3&gt;1. 준비물&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;아두이노 Uno 또는 Nano&lt;/li&gt;
    &lt;li&gt;0.96인치 OLED (SSD1306, I2C 방식)&lt;/li&gt;
    &lt;li&gt;IR 수신기 모듈 (TSOP1838 등)&lt;/li&gt;
    &lt;li&gt;적외선 리모컨&lt;/li&gt;
    &lt;li&gt;점퍼 케이블&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h3&gt;2. 회로 연결&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;OLED (I2C)&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;VCC → 5V&lt;/li&gt;
    &lt;li&gt;GND → GND&lt;/li&gt;
    &lt;li&gt;SDA → A4&lt;/li&gt;
    &lt;li&gt;SCL → A5&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;&lt;strong&gt;IR 수신기&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;OUT → D2&lt;/li&gt;
    &lt;li&gt;VCC → 5V&lt;/li&gt;
    &lt;li&gt;GND → GND&lt;/li&gt;
  &lt;/ul&gt;

  &lt;div class=&quot;ads-wrapper&quot;&gt;
    &lt;ins class=&quot;adsbygoogle&quot;
         style=&quot;display:block&quot;
         data-ad-client=&quot;ca-pub-8362837465904837&quot;
         data-ad-slot=&quot;5674748480&quot;
         data-ad-format=&quot;auto&quot;
         data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;
         (adsbygoogle = window.adsbygoogle || []).push({});
    &lt;/script&gt;
  &lt;/div&gt;

  &lt;h3&gt;3. 라이브러리 설치&lt;/h3&gt;
  &lt;p&gt;두 가지 라이브러리가 필요합니다.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;IRremote by shirriff (버전 3.x 이상)&lt;/li&gt;
    &lt;li&gt;U8g2 by olikraus&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Arduino IDE → &lt;strong&gt;스케치 → 라이브러리 포함 → 라이브러리 관리&lt;/strong&gt;에서 설치하세요.&lt;/p&gt;

  &lt;h3&gt;4. 전체 예제 코드&lt;/h3&gt;
  &lt;div class=&quot;code-box&quot;&gt;
#include &amp;lt;IRremote.h&amp;gt;
#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;U8g2lib.h&amp;gt;

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
const int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

int menuIndex = 0;

void setup() {
  u8g2.begin();
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&amp;results)) {
    long key = results.value;
    if (key == 0xFFA25D) { // CH- 버튼
      menuIndex = (menuIndex - 1 + 3) % 3;
    } else if (key == 0xFF629D) { // CH+ 버튼
      menuIndex = (menuIndex + 1) % 3;
    }
    irrecv.resume();
  }

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);

  if (menuIndex == 0) {
    u8g2.drawStr(10, 30, &quot;메뉴 1: 센서값&quot;);
  } else if (menuIndex == 1) {
    u8g2.drawStr(10, 30, &quot;메뉴 2: 시스템정보&quot;);
  } else {
    u8g2.drawStr(10, 30, &quot;메뉴 3: 설정&quot;);
  }

  u8g2.sendBuffer();
  delay(100);
}
  &lt;/div&gt;

  &lt;p&gt;  위 예제는 CH+ / CH- 버튼을 눌러 메뉴를 순차적으로 전환하는 구조입니다.  
  리모컨의 키코드는 모델마다 다르므로 &lt;strong&gt;직접 Serial.print(results.value, HEX);&lt;/strong&gt;로 확인하세요.&lt;/p&gt;

  &lt;h3&gt;5. 사용자 정의 메뉴 확장 팁&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;리모컨 숫자 버튼 → 특정 페이지 바로가기&lt;/li&gt;
    &lt;li&gt;OK 버튼 → 동작 실행 (LED On/Off, 서보 제어 등)&lt;/li&gt;
    &lt;li&gt;좌우 버튼 → 값 조절 (밝기, 속도 등)&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;OLED는 단순 출력이 아닌 &lt;strong&gt;UI 시스템 구축용 패널&lt;/strong&gt;로 활용할 수 있습니다.  
  리모컨과 결합하면 버튼 하나 없이도 다양한 인터랙션이 가능하죠.&lt;/p&gt;

  &lt;div class=&quot;ads-wrapper&quot;&gt;
    &lt;ins class=&quot;adsbygoogle&quot;
         style=&quot;display:block&quot;
         data-ad-client=&quot;ca-pub-8362837465904837&quot;
         data-ad-slot=&quot;5674748480&quot;
         data-ad-format=&quot;auto&quot;
         data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;
         (adsbygoogle = window.adsbygoogle || []).push({});
    &lt;/script&gt;
  &lt;/div&gt;

  &lt;h3&gt;6. 마무리&lt;/h3&gt;
  &lt;p&gt;IR 리모컨을 활용하면 별도의 버튼, 터치스크린 없이도  
  OLED 기반 인터페이스를 만들 수 있습니다.&lt;/p&gt;

  &lt;p&gt;다음 글에서는 ‘DHT11 온습도 센서’나 ‘버튼으로 메뉴 전환’ 기능과 연계해  
  &lt;strong&gt;진짜 완성도 높은 미니 UI 시스템&lt;/strong&gt;을 만들어볼 수 있어요.&lt;/p&gt;

  &lt;p&gt;직접 다양한 키코드를 매핑해보며 나만의 리모컨 UI를 만들어보세요!&lt;/p&gt;
&lt;/div&gt;</description>
      <category>아두이노</category>
      <category>i2c 디스플레이</category>
      <category>ir 리모컨</category>
      <category>IRremote</category>
      <category>oled 제어</category>
      <category>u8g2</category>
      <category>메뉴 전환</category>
      <category>무선 제어</category>
      <category>아두이노</category>
      <category>아두이노 리모컨</category>
      <category>아두이노 프로젝트</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/206</guid>
      <comments>https://ythouse.tistory.com/206#entry206comment</comments>
      <pubDate>Mon, 21 Apr 2025 07:55:32 +0900</pubDate>
    </item>
    <item>
      <title>I2C OLED 디스플레이 출력하기 &amp;ndash; SSD1306 &amp;amp; U8g2 라이브러리 완전 활용법</title>
      <link>https://ythouse.tistory.com/205</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;I2C OLED 디스플레이 출력하기 &amp;ndash; SSD1306 &amp;amp; U8g2 라이브러리 완전 활용법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKYU1/btsNvFnKAff/Z4lLEaiyDS3Xw3ksKYN1Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKYU1/btsNvFnKAff/Z4lLEaiyDS3Xw3ksKYN1Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKYU1/btsNvFnKAff/Z4lLEaiyDS3Xw3ksKYN1Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKYU1%2FbtsNvFnKAff%2FZ4lLEaiyDS3Xw3ksKYN1Rk%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; alt=&quot;SSD1306 I2C OLED 디스플레이를 아두이노에 연결하여 텍스트와 그래픽을 출력하는 과정을 설명한 인포그래픽. 회로도, U8g2 설정 흐름, 텍스트 출력 결과 등이 시각적으로 정리되어 있음. 출처: ythouse.tistory.com&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1536&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작고 가벼우며 전력 소모도 적은 OLED 디스플레이는 아두이노 사용자에게 매우 유용한 출력 장치입니다. 특히 0.96인치 SSD1306 I2C OLED 모듈은 저렴하면서도 활용도가 높아 센서값 출력, UI 시각화, 메시지 알림 등에 널리 쓰입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 SSD1306 OLED 모듈을 아두이노와 I2C 방식으로 연결하고, U8g2 라이브러리를 이용해 다양한 텍스트와 그래픽을 출력하는 과정을 실전 위주로 상세히 다룹니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  1. 준비물&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아두이노 Uno 또는 Nano&lt;/li&gt;
&lt;li&gt;0.96인치 OLED 디스플레이 (SSD1306, I2C 방식)&lt;/li&gt;
&lt;li&gt;점퍼 케이블&lt;/li&gt;
&lt;li&gt;Arduino IDE&lt;/li&gt;
&lt;li&gt;U8g2 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2. 회로 연결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 OLED 모듈은 I2C 통신을 사용하므로 총 4핀만 연결하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OLED 핀 아두이노 연결&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&gt;VCC&lt;/td&gt;
&lt;td&gt;5V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCL&lt;/td&gt;
&lt;td&gt;A5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDA&lt;/td&gt;
&lt;td&gt;A4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Mega 보드 사용 시 SCL/SDA는 20번, 21번 핀입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  3. U8g2 라이브러리 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U8g2는 폰트, 한글, 다양한 그래픽까지 지원하는 강력한 OLED 라이브러리입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Arduino IDE 실행&lt;/li&gt;
&lt;li&gt;상단 메뉴 &amp;rarr; [스케치] &amp;rarr; [라이브러리 포함하기] &amp;rarr; [라이브러리 관리]&lt;/li&gt;
&lt;li&gt;&quot;U8g2&quot; 검색 &amp;rarr; &quot;U8g2 by olikraus&quot; 설치&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  4. 기본 텍스트 출력 예제 코드&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;U8g2lib.h&amp;gt;

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
  u8g2.begin();
}

void loop() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(10, 30, &quot;Hello, OLED!&quot;);
  u8g2.sendBuffer();
  delay(1000);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 OLED에 &quot;Hello, OLED!&quot;를 표시하는 기본 예제입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  5. 다양한 그래픽 출력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U8g2는 텍스트뿐 아니라 박스, 원, 프레임 등 다양한 그래픽 그리기도 지원합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;u8g2.drawBox(5, 5, 30, 10);       // 사각형
u8g2.drawCircle(60, 30, 10);      // 원
u8g2.drawFrame(10, 40, 50, 20);   // 테두리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글 출력도 지원하며 폰트 설정만 바꾸면 됩니다:&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;u8g2.setFont(u8g2_font_unifont_t_korean);
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  RAM 사용량이 늘어날 수 있으니, 코드 최적화 필요&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  6. 실전 예제: 센서 데이터 시각화&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;DHT.h&amp;gt;
#include &amp;lt;U8g2lib.h&amp;gt;

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
  dht.begin();
  u8g2.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);

  u8g2.setCursor(0, 20);
  u8g2.print(&quot;Temp: &quot;); u8g2.print(t); u8g2.print(&quot; C&quot;);
  u8g2.setCursor(0, 40);
  u8g2.print(&quot;Humi: &quot;); u8g2.print(h); u8g2.print(&quot; %&quot;);

  u8g2.sendBuffer();
  delay(2000);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예제는 온도, 습도 데이터를 2초 간격으로 OLED에 출력합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 중간광고 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  7. 활용 아이디어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;실시간 데이터 모니터링&lt;/b&gt; (DHT11, MQ2, 초음파 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;미니 UI 만들기&lt;/b&gt; (메뉴 전환, 선택 항목 출력)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 알림&lt;/b&gt; (WiFi 연결 상태, 배터리 잔량 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시계, 타이머, 알람 인터페이스&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 8. 마무리하며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I2C 방식의 SSD1306 OLED 디스플레이는 간단한 회로 연결과 강력한 라이브러리 덕분에 매우 활용도 높은 출력 장치입니다. U8g2는 폰트, 그래픽, 한글까지 다양한 표현이 가능해 초보자에게도 적극 추천할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 센서값 그래프화, 터치 UI 대응 등 고급 응용 예제도 다뤄보겠습니다. 댓글이나 메일로 원하는 기능도 제안해 주세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: ythouse.tistory.com&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>I2C 통신</category>
      <category>oled 디스플레이</category>
      <category>SSD1306</category>
      <category>u8g2 라이브러리</category>
      <category>아두이노</category>
      <category>아두이노 oled</category>
      <category>아두이노 초보</category>
      <category>아두이노 프로젝트</category>
      <category>아두이노 화면 출력</category>
      <category>전자부품 활용</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/205</guid>
      <comments>https://ythouse.tistory.com/205#entry205comment</comments>
      <pubDate>Mon, 21 Apr 2025 07:53:39 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 프로젝트 시리즈 목차 &amp;ndash; 입문부터 응용까지 완성형 가이드</title>
      <link>https://ythouse.tistory.com/188</link>
      <description>&lt;h1&gt;아두이노 프로젝트 시리즈 목차 – 입문부터 응용까지 완성형 가이드&lt;/h1&gt;

&lt;p&gt;
이 블로그에서는 아두이노 입문자부터 실전 응용까지 단계별로 정리된 &lt;strong&gt;완성형 시리즈&lt;/strong&gt;를 제공합니다.&lt;br&gt;
각 글에는 실전 예제, 회로 설명, 소스 코드, 광고 포함 및 SEO 최적화까지 완료되어 있으며&lt;br&gt;
아두이노를 처음 시작하는 분들에게도 확실한 가이드가 됩니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  입문/기초 편&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;1편 링크&quot;&gt;1편 – 아두이노 소개와 개발환경&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;2편 링크&quot;&gt;2편 – LED 제어 기본&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;3편 링크&quot;&gt;3편 – 버튼 입력과 디지털 입력&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;4편 링크&quot;&gt;4편 – 아날로그 입력과 가변저항&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;5편 링크&quot;&gt;5편 – PWM을 이용한 LED 밝기 조절&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;⚙️ 센서/모듈 제어 편&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;6편 링크&quot;&gt;6편 – 초음파 거리 측정 (HC-SR04)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;7편 링크&quot;&gt;7편 – DHT11 온습도 센서 출력&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;8편 링크&quot;&gt;8편 – 서보모터(SG90) 제어&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;9편 링크&quot;&gt;9편 – 조도 센서를 이용한 자동 조명&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;10편 링크&quot;&gt;10편 – 가스 센서를 이용한 가스 누출 감지&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  시스템 프로젝트 편&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;11편 링크&quot;&gt;11편 – RFID 카드 인식 시스템 만들기&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;12편 링크&quot;&gt;12편 – 타이머 + 릴레이 전원 제어&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;13편 링크&quot;&gt;13편 – TJC HMI LCD로 UI 연동&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;14편 링크&quot;&gt;14편 – Nextion + 아두이노 명령어 종합 가이드&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;15편 링크&quot;&gt;15편 – 블루투스(HC-06)로 스마트폰 앱 제어&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  정리/추천&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;16편 링크&quot;&gt;Nextion vs TJC – HMI LCD 선택 가이드&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;17편 링크&quot;&gt;아두이노로 자동화 시스템 만들기 TOP 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;  업데이트: 2025년 4월 기준 | 작성자: YT&lt;/em&gt;&lt;/p&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>hmi lcd</category>
      <category>nextion</category>
      <category>tjc</category>
      <category>센서</category>
      <category>아두이노</category>
      <category>아두이노 강의</category>
      <category>아두이노 목차</category>
      <category>아두이노 입문</category>
      <category>아두이노 프로젝트</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/188</guid>
      <comments>https://ythouse.tistory.com/188#entry188comment</comments>
      <pubDate>Sat, 19 Apr 2025 18:02:09 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 + 타이머 + 릴레이 제어 &amp;ndash; 시간 설정으로 전원 자동 ON/OFF 구현하기</title>
      <link>https://ythouse.tistory.com/187</link>
      <description>&lt;h1&gt;아두이노 + 타이머 + 릴레이 제어 – 시간 설정으로 전원 자동 ON/OFF 구현하기&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;정해진 시간에 전기를 켜거나 끄는 시스템, 어렵지 않을까요?&lt;/strong&gt;&lt;br&gt;
이번 글에서는 아두이노와 릴레이 모듈을 이용해 &lt;b&gt;시간 설정 기반 자동 ON/OFF 제어&lt;/b&gt; 시스템을 만들어보겠습니다.&lt;br&gt;
예를 들어, &lt;mark&gt;1분에 한 번씩 전원을 켰다 끄거나&lt;/mark&gt;, &lt;mark&gt;사용자가 설정한 시간만큼 릴레이를 동작&lt;/mark&gt;시키는 방식입니다.&lt;br&gt;
스마트 팜, 자동 조명, 펌프 제어, 환풍기 자동화 등 다양한 분야에 활용할 수 있습니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO 또는 나노&lt;/li&gt;
  &lt;li&gt;5V 릴레이 모듈 (1채널 또는 다채널)&lt;/li&gt;
  &lt;li&gt;LED 또는 220V 부하 장치 (테스트용은 LED 추천)&lt;/li&gt;
  &lt;li&gt;브레드보드, 점퍼 와이어&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  릴레이 모듈 작동 원리&lt;/h2&gt;
&lt;p&gt;
릴레이는 &lt;b&gt;아두이노의 디지털 출력 신호로 고전압 전원을 On/Off&lt;/b&gt;할 수 있게 해주는 스위치입니다.&lt;br&gt;
디지털 핀을 HIGH 또는 LOW로 전환함으로써 릴레이를 작동시킬 수 있습니다.
&lt;/p&gt;

&lt;h2&gt;⏱️ 타이머 제어 방식&lt;/h2&gt;
&lt;p&gt;
아두이노에서 시간 제어는 2가지 방식으로 구현할 수 있습니다.
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;b&gt;delay()&lt;/b&gt; 함수: 간단하지만 블로킹 방식&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;millis()&lt;/b&gt; 함수: 논블로킹 방식, 실시간 처리에 적합&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;  기본 코드 예제 (millis 기반, 5초 ON → 5초 OFF 반복)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;const int relayPin = 7;
unsigned long previousMillis = 0;
const long interval = 5000; // 5초

bool relayState = false;

void setup() {
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW); // 릴레이 꺼짐 상태
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis &gt;= interval) {
    previousMillis = currentMillis;
    relayState = !relayState; // 상태 반전
    digitalWrite(relayPin, relayState ? HIGH : LOW);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  예제 설명&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;millis()는 프로그램 시작 이후 경과한 시간(ms)을 반환합니다&lt;/li&gt;
  &lt;li&gt;5초마다 릴레이 상태를 반전시켜 ON/OFF 반복 제어&lt;/li&gt;
  &lt;li&gt;delay() 방식보다 정확하고 다른 처리와 동시에 사용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  실전 활용 팁&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;스마트 조명: 밤 10시 자동 소등&lt;/li&gt;
  &lt;li&gt;펌프 제어: 1시간마다 10분간 작동&lt;/li&gt;
  &lt;li&gt;팬 제어: 일정 온도 이상 시 타이머 작동&lt;/li&gt;
  &lt;li&gt;센서와 연동: PIR + 릴레이 + 타이머 조합&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
릴레이와 타이머를 조합하면 매우 간단한 방식으로 &lt;strong&gt;자동 전원 제어 시스템&lt;/strong&gt;을 만들 수 있습니다.&lt;br&gt;
지금까지의 예제를 바탕으로 스마트 홈, 자동화 기기 등 다양한 분야에 적용해보세요.&lt;br&gt;
향후에는 RTC 모듈(실시간 시계)과 결합하여 더 정교한 시간 기반 제어도 구현할 수 있습니다.
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 자동화 시리즈 – 릴레이 타이머 제어편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>릴레이모듈</category>
      <category>릴레이스위치</category>
      <category>시간제어</category>
      <category>아두이노</category>
      <category>자동onoff</category>
      <category>자동화제어</category>
      <category>타이머제어</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/187</guid>
      <comments>https://ythouse.tistory.com/187#entry187comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:57:29 +0900</pubDate>
    </item>
    <item>
      <title>TJC3224T124-011R HMI LCD 아두이노 연동 가이드 &amp;ndash; 중국 Nextion 유사 LCD 개발부터 통신까지</title>
      <link>https://ythouse.tistory.com/186</link>
      <description>&lt;h1&gt;TJC3224T124-011R HMI LCD 아두이노 연동 가이드 – 중국 Nextion 유사 LCD 개발부터 통신까지&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;Nextion보다 저렴한 중국산 터치 LCD로 UI를 구현할 수 없을까?&lt;/strong&gt;&lt;br&gt;
이번 글에서는 &lt;mark&gt;TJC3224T124-011R&lt;/mark&gt;와 같은 &lt;b&gt;Nextion 유사 LCD&lt;/b&gt;를 사용하여&lt;br&gt;
아두이노와 시리얼 통신으로 제어하는 방법을 정리해보겠습니다.&lt;br&gt;
UI 디자인은 중국 전용 툴을 사용하지만, &lt;b&gt;명령어 구조는 Nextion과 100% 유사&lt;/b&gt;합니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;TJC3224T124-011R LCD (2.4인치 HMI 디스플레이)&lt;/li&gt;
  &lt;li&gt;아두이노 UNO 또는 MEGA&lt;/li&gt;
  &lt;li&gt;USB-TTL 변환기 (펌웨어 업로드용)&lt;/li&gt;
  &lt;li&gt;중국 전용 HMI Editor (아래에서 다운로드)&lt;/li&gt;
  &lt;li&gt;SoftwareSerial 라이브러리&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  TJC HMI Editor 다운로드&lt;/h2&gt;
&lt;p&gt;
TJC 시리즈 전용 UI 디자인 툴입니다.&lt;br&gt;
Nextion Editor와 거의 유사하지만, 반드시 이 툴로 .tft 파일을 만들어야 합니다.
&lt;/p&gt;
&lt;a href=&quot;https://drive.google.com/uc?id=1DCH-o4gIiIs_MQNeGDR26gJ1pedSt2lH&amp;export=download&quot; target=&quot;_blank&quot; style=&quot;display:inline-block; padding:10px 20px; background:#0078D7; color:#fff; border-radius:5px; text-decoration:none; font-weight:bold;&quot;&gt;▶ TJC HMI Editor 다운로드&lt;/a&gt;

&lt;h2&gt;  UI 구성 방법 요약&lt;/h2&gt;
&lt;p&gt;
TJC 전용 에디터는 중국어로 되어 있어 처음엔 낯설 수 있지만,&lt;br&gt;
&lt;strong&gt;Nextion Editor와 UI 배치 구조, 속성 설정 방식이 거의 동일&lt;/strong&gt;하기 때문에&lt;br&gt;
기존 Nextion 사용 경험이 있다면 쉽게 익힐 수 있습니다.
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;툴에서 새 프로젝트 생성&lt;/li&gt;
  &lt;li&gt;버튼(b0), 텍스트(t0), 슬라이더 등 원하는 컴포넌트 배치&lt;/li&gt;
  &lt;li&gt;버튼 이벤트에 &lt;code&gt;print &quot;BTN1&quot;&lt;/code&gt; 입력&lt;/li&gt;
  &lt;li&gt;컴파일하여 .tft 파일 생성 → SD카드에 넣고 LCD에 업로드&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;  아두이노와 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;TJC LCD 핀&lt;/th&gt;&lt;th&gt;아두이노 핀&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;TX&lt;/td&gt;&lt;td&gt;D10&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;RX&lt;/td&gt;&lt;td&gt;D11 (저항 분배 권장)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;5V&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  기본 코드 예제 (텍스트 변경 + 버튼 읽기)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
SoftwareSerial lcd(10, 11); // RX, TX

void setup() {
  Serial.begin(9600);
  lcd.begin(9600);
}

void loop() {
  if (lcd.available()) {
    String input = &quot;&quot;;
    while (lcd.available()) {
      char c = lcd.read();
      input += c;
    }
    Serial.println(&quot;LCD 입력: &quot; + input);

    if (input.indexOf(&quot;BTN1&quot;) != -1) {
      sendText(&quot;t0&quot;, &quot;확인됨&quot;);
    }
  }
}

void sendText(String obj, String msg) {
  lcd.print(obj + &quot;.txt=\&quot;&quot; + msg + &quot;\&quot;&quot;);
  lcd.write(0xFF); lcd.write(0xFF); lcd.write(0xFF);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  팁과 주의사항&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;TX ↔ RX 교차 연결 필수&lt;/li&gt;
  &lt;li&gt;3바이트 &lt;code&gt;0xFF&lt;/code&gt; 종료코드는 반드시 추가&lt;/li&gt;
  &lt;li&gt;전송 속도는 9600bps 권장&lt;/li&gt;
  &lt;li&gt;버튼에는 &lt;code&gt;print &quot;BTN1&quot;&lt;/code&gt;을 이벤트로 삽입&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
TJC3224T124-011R LCD는 가격이 저렴하면서도 Nextion과 유사한 기능을 제공하여&lt;br&gt;
비용 대비 성능이 뛰어난 GUI 터치 솔루션입니다.&lt;br&gt;
이번 글의 예제를 참고하여 &lt;strong&gt;직접 제작한 UI&lt;/strong&gt;를 아두이노와 연동해보세요!
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 확장 시리즈 – TJC HMI LCD 제어편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>gui제어</category>
      <category>hmi lcd</category>
      <category>nextion</category>
      <category>tjc3224t124-011r</category>
      <category>usart통신</category>
      <category>시리얼lcd</category>
      <category>아두이노</category>
      <category>중국lcd</category>
      <category>터치ui</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/186</guid>
      <comments>https://ythouse.tistory.com/186#entry186comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:52:47 +0900</pubDate>
    </item>
    <item>
      <title>Nextion + 아두이노 통신 명령어 종합 가이드 &amp;ndash; 텍스트, 버튼, 페이지 전환까지 완벽 정리</title>
      <link>https://ythouse.tistory.com/185</link>
      <description>&lt;h1&gt;Nextion + 아두이노 통신 명령어 종합 가이드 – 텍스트, 버튼, 페이지 전환까지 완벽 정리&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;Nextion HMI LCD는 직관적인 GUI를 만들 수 있는 강력한 터치 디스플레이입니다.&lt;/strong&gt;&lt;br&gt;
하지만 진짜 프로젝트에 활용하려면 &lt;b&gt;아두이노 ↔ Nextion 간의 통신 명령어&lt;/b&gt;를 정확히 아는 게 중요하죠.&lt;br&gt;
이 글에서는 &lt;strong&gt;실제로 사용하는 주요 명령어&lt;/strong&gt;와 &lt;strong&gt;통신 포맷&lt;/strong&gt;, 그리고 &lt;strong&gt;실전 예제 코드&lt;/strong&gt;까지 정리해드립니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  모든 명령어는 끝에 반드시 붙여야 할 것&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;0xFF 0xFF 0xFF&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Nextion LCD는 모든 명령어가 3개의 종료 바이트(0xFF)를 받아야 유효하므로,  
&lt;code&gt;Serial.write(0xFF)&lt;/code&gt; × 3은 필수입니다.
&lt;/p&gt;

&lt;h2&gt;  주요 명령어 정리&lt;/h2&gt;

&lt;h3&gt;1. 텍스트 변경&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;t0.txt=&quot;Hello World&quot;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;2. 숫자 값 변경&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;n0.val=123&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;3. 버튼 속성 변경&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;b0.txt=&quot;ON&quot;
b0.bco=63488    // 배경색 (빨강)
b0.pco=65535    // 글자색 (흰색)&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;4. 페이지 전환&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;page 1
page main&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;5. 그래픽 오브젝트 제어&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;z0.val=75       // 게이지
j0.val=50       // 슬라이더
x0.pic=2        // 이미지 변경&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;6. 시스템 명령어&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dim=80          // 밝기 조절 (0~100)
clearscreen     // 전체 초기화
ref t0          // 객체 다시 그리기&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;7. 전역 변수 활용&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;x=5             // 변수 선언
get x           // 값 요청&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  터치 이벤트 – Nextion → 아두이노&lt;/h2&gt;
&lt;p&gt;버튼 눌렀을 때 아두이노가 받는 코드 예시:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;65 00 01 FF FF FF&lt;/code&gt;&lt;/pre&gt;
- `65`: 터치 이벤트  
- `00`: 객체 ID  
- `01`: 눌림(1), 뗌(0)

  Nextion Editor에서 버튼에 `print &quot;BTN1&quot;` 명령을 넣어두면  
&lt;pre&gt;&lt;code&gt;42 54 4E 31 FF FF FF&lt;/code&gt;&lt;/pre&gt;  
(ASCII로 &quot;BTN1&quot;)가 아두이노로 전송됩니다.

&lt;h2&gt;  실전 함수 예제 (아두이노 → Nextion)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;void sendText(String obj, String txt) {
  Serial.print(obj + &quot;.txt=\&quot;&quot; + txt + &quot;\&quot;&quot;);
  Serial.write(0xFF); Serial.write(0xFF); Serial.write(0xFF);
}

void changePage(String pageName) {
  Serial.print(&quot;page &quot; + pageName);
  Serial.write(0xFF); Serial.write(0xFF); Serial.write(0xFF);
}

void setVal(String obj, int val) {
  Serial.print(obj + &quot;.val=&quot; + String(val));
  Serial.write(0xFF); Serial.write(0xFF); Serial.write(0xFF);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  통신 팁 &amp; 트러블슈팅&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;  RX → TX, TX → RX 교차 연결&lt;/li&gt;
  &lt;li&gt;  Nextion TX는 5V TTL 호환, RX는 저항 분배로 3.3V 보호&lt;/li&gt;
  &lt;li&gt;  명령어 끝에 0xFF 3개가 없으면 무반응 발생&lt;/li&gt;
  &lt;li&gt;⏱ SoftwareSerial 쓰면 속도는 9600bps 권장&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
Nextion은 단순히 LCD 그 이상으로 &lt;strong&gt;완전한 터치 기반 UI 시스템&lt;/strong&gt;입니다.&lt;br&gt;
제대로 쓰기 위해서는 아두이노와 통신하는 명령 체계를 정확히 알아야 실전에서 오류 없이 사용 가능합니다.&lt;br&gt;
이제 여러분도 원하는 데이터를 띄우고, 터치로 장치를 제어하는 고급형 아두이노 프로젝트를 시작해보세요!
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Nextion + Arduino 통신 종합편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>hmi lcd</category>
      <category>nextion</category>
      <category>USART</category>
      <category>시리얼통신</category>
      <category>아두이노</category>
      <category>아두이노통신</category>
      <category>터치이벤트</category>
      <category>텍스트변경</category>
      <category>페이지전환</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/185</guid>
      <comments>https://ythouse.tistory.com/185#entry185comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:43:02 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 + USART HMI LCD 사용법 &amp;ndash; Nextion LCD로 터치 UI 만들기</title>
      <link>https://ythouse.tistory.com/184</link>
      <description>&lt;h1&gt;아두이노 + USART HMI LCD 사용법 – Nextion LCD로 터치 UI 만들기&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;아두이노 프로젝트에 고급스러운 터치 디스플레이를 달고 싶다면?&lt;/strong&gt;&lt;br&gt;
&lt;mark&gt;Nextion HMI LCD&lt;/mark&gt;를 이용하면 시리얼 통신만으로 손쉽게 터치 기반 GUI를 구현할 수 있습니다.&lt;br&gt;
이번 글에서는 Nextion LCD와 아두이노를 USART(UART)로 연결하여 버튼, 텍스트, 센서값을 디스플레이하는 방법을 설명합니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Nextion LCD (2.4&quot;, 2.8&quot;, 3.2&quot; 등)&lt;/li&gt;
  &lt;li&gt;아두이노 UNO 또는 MEGA&lt;/li&gt;
  &lt;li&gt;SoftwareSerial 라이브러리&lt;/li&gt;
  &lt;li&gt;USB-TTL 변환기 (Nextion 프로그램 업로드용)&lt;/li&gt;
  &lt;li&gt;Nextion Editor (공식 GUI 디자인 툴)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  기본 연결 (UNO 기준)&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;Nextion 핀&lt;/th&gt;&lt;th&gt;아두이노 핀&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;TX&lt;/td&gt;&lt;td&gt;D10&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;RX&lt;/td&gt;&lt;td&gt;D11 (1kΩ 저항을 통해)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;5V&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  Nextion UI 만들기&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Nextion Editor&lt;/strong&gt;를 설치&lt;/li&gt;
  &lt;li&gt;페이지에 버튼(Button), 텍스트(Text) 컴포넌트 배치&lt;/li&gt;
  &lt;li&gt;버튼의 이름을 &lt;code&gt;b0&lt;/code&gt;, 텍스트를 &lt;code&gt;t0&lt;/code&gt;로 설정&lt;/li&gt;
  &lt;li&gt;이벤트 창에 &lt;code&gt;print &quot;BTN&quot;&lt;/code&gt; 명령 추가&lt;/li&gt;
  &lt;li&gt;UI 완성 후 .tft 파일을 SD카드로 넣어 Nextion에 업로드&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;  아두이노 코드 예제 (SoftwareSerial 기반)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
SoftwareSerial nextion(10, 11); // RX, TX

void setup() {
  Serial.begin(9600);
  nextion.begin(9600);
  Serial.println(&quot;Nextion 초기화 완료&quot;);
}

void loop() {
  if (nextion.available()) {
    String data = &quot;&quot;;
    while (nextion.available()) {
      char c = nextion.read();
      data += c;
    }
    Serial.println(&quot;터치 입력: &quot; + data);
    
    if (data.indexOf(&quot;BTN&quot;) != -1) {
      sendText(&quot;Hello, Nextion!&quot;);
    }
  }
}

void sendText(String msg) {
  nextion.print(&quot;t0.txt=\&quot;&quot;);
  nextion.print(msg);
  nextion.print(&quot;\&quot;&quot;);
  nextion.write(0xFF);
  nextion.write(0xFF);
  nextion.write(0xFF);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  실전 활용 팁&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt; ️ 센서 값을 t0에 실시간 표시 가능 (온도, 습도 등)&lt;/li&gt;
  &lt;li&gt;  터치 버튼으로 LED 제어, 모터 ON/OFF 가능&lt;/li&gt;
  &lt;li&gt;  통신 에러 방지를 위해 3바이트 0xFF 종료 필수&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
Nextion HMI는 아두이노 프로젝트의 UI 수준을 한 단계 끌어올릴 수 있는 강력한 장치입니다.&lt;br&gt;
UART 기반이라 연결도 간단하고, GUI는 PC에서 드래그앤드롭으로 제작할 수 있어 진입 장벽도 낮습니다.&lt;br&gt;
이번 예제를 기반으로 여러분만의 스마트 컨트롤 패널을 구현해보세요!
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 확장 시리즈 – Nextion HMI LCD 제어편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>GUI</category>
      <category>hmi lcd</category>
      <category>nextion</category>
      <category>USART</category>
      <category>시리얼 lcd</category>
      <category>아두이노</category>
      <category>터치디스플레이</category>
      <category>터치스크린</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/184</guid>
      <comments>https://ythouse.tistory.com/184#entry184comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:40:40 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 전자 도어락 시스템 만들기 &amp;ndash; RFID + 부저 + 서보모터로 출입 제어 구현하기</title>
      <link>https://ythouse.tistory.com/183</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;h1&amp;gt;아두이노&amp;nbsp;전자&amp;nbsp;도어락&amp;nbsp;시스템&amp;nbsp;만들기&amp;nbsp;&amp;ndash;&amp;nbsp;RFID&amp;nbsp;+&amp;nbsp;부저&amp;nbsp;+&amp;nbsp;서보모터로&amp;nbsp;출입&amp;nbsp;제어&amp;nbsp;구현하기&amp;lt;/h1&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt; &lt;br /&gt;&amp;lt;strong&amp;gt;현관문도&amp;nbsp;아두이노로&amp;nbsp;제어할&amp;nbsp;수&amp;nbsp;있을까?&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;이번&amp;nbsp;글에서는&amp;nbsp;&amp;lt;strong&amp;gt;RC522&amp;nbsp;RFID&amp;nbsp;카드&amp;nbsp;리더&amp;lt;/strong&amp;gt;,&amp;nbsp;&amp;lt;strong&amp;gt;피에조&amp;nbsp;부저&amp;lt;/strong&amp;gt;,&amp;nbsp;&amp;lt;strong&amp;gt;SG90&amp;nbsp;서보모터&amp;lt;/strong&amp;gt;를&amp;nbsp;이용해&amp;nbsp;&amp;nbsp; &lt;br /&gt;실제처럼&amp;nbsp;작동하는&amp;nbsp;전자식&amp;nbsp;도어락&amp;nbsp;시스템을&amp;nbsp;만들어보겠습니다.&amp;lt;br&amp;gt; &lt;br /&gt;RFID&amp;nbsp;카드가&amp;nbsp;등록된&amp;nbsp;UID와&amp;nbsp;일치하면&amp;nbsp;서보모터가&amp;nbsp;회전하며&amp;nbsp;&quot;문&amp;nbsp;열림&quot;을&amp;nbsp;구현하고,&amp;nbsp;&amp;nbsp; &lt;br /&gt;그&amp;nbsp;외&amp;nbsp;카드는&amp;nbsp;거부음과&amp;nbsp;함께&amp;nbsp;출입이&amp;nbsp;차단됩니다. &lt;br /&gt;&amp;lt;/p&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;!--&amp;nbsp;광고&amp;nbsp;영역&amp;nbsp;1&amp;nbsp;--&amp;gt; &lt;br /&gt;&amp;lt;div&amp;nbsp;style=&quot;margin:&amp;nbsp;30px&amp;nbsp;0;&amp;nbsp;text-align:&amp;nbsp;center;&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;async&amp;nbsp;src=&quot;&lt;a href=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&lt;/a&gt;&quot;&amp;nbsp;crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;ins&amp;nbsp;class=&quot;adsbygoogle&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;style=&quot;display:block&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-ad-client=&quot;ca-pub-8362837465904837&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-ad-slot=&quot;5674748480&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-ad-format=&quot;auto&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-full-width-responsive=&quot;true&quot;&amp;gt;&amp;lt;/ins&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;gt;(adsbygoogle&amp;nbsp;=&amp;nbsp;window.adsbygoogle&amp;nbsp;||&amp;nbsp;[]).push({});&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/div&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt; &amp;nbsp;준비물&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;lt;ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;아두이노&amp;nbsp;UNO&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;RC522&amp;nbsp;RFID&amp;nbsp;리더기&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;RFID&amp;nbsp;카드&amp;nbsp;또는&amp;nbsp;키태그&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;SG90&amp;nbsp;서보모터&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;피에조&amp;nbsp;부저&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;점퍼&amp;nbsp;와이어,&amp;nbsp;브레드보드&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;lt;/ul&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt; &amp;nbsp;시스템&amp;nbsp;구성도&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;lt;ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;✔️&amp;nbsp;RFID&amp;nbsp;카드&amp;nbsp;인식&amp;nbsp;&amp;rarr;&amp;nbsp;UID&amp;nbsp;확인&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;✔️&amp;nbsp;등록된&amp;nbsp;UID면&amp;nbsp;서보모터&amp;nbsp;90도&amp;nbsp;(문&amp;nbsp;열림)&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;✖️&amp;nbsp;미등록&amp;nbsp;UID면&amp;nbsp;부저&amp;nbsp;울림&amp;nbsp;(출입&amp;nbsp;차단)&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;lt;/ul&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;⚙️&amp;nbsp;핀&amp;nbsp;연결&amp;nbsp;요약&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;lt;table&amp;nbsp;border=&quot;1&quot;&amp;nbsp;cellpadding=&quot;5&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;thead&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;모듈&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;핀&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;아두이노&amp;nbsp;핀&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/thead&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;tbody&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;RC522&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SDA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SCK&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D13&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;MOSI&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D11&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;MISO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D12&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D9&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;서보모터&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Signal&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D6&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;부저&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;+&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D5&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/tbody&amp;gt; &lt;br /&gt;&amp;lt;/table&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt; &amp;nbsp;전체&amp;nbsp;코드&amp;nbsp;예제&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;#include&amp;nbsp;&amp;amp;lt;SPI.h&amp;amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;amp;lt;MFRC522.h&amp;amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;amp;lt;Servo.h&amp;amp;gt; &lt;br /&gt;&lt;br /&gt;#define&amp;nbsp;SS_PIN&amp;nbsp;10 &lt;br /&gt;#define&amp;nbsp;RST_PIN&amp;nbsp;9 &lt;br /&gt;#define&amp;nbsp;BUZZER_PIN&amp;nbsp;5 &lt;br /&gt;#define&amp;nbsp;SERVO_PIN&amp;nbsp;6 &lt;br /&gt;&lt;br /&gt;MFRC522&amp;nbsp;rfid(SS_PIN,&amp;nbsp;RST_PIN); &lt;br /&gt;Servo&amp;nbsp;servo; &lt;br /&gt;String&amp;nbsp;masterUID&amp;nbsp;=&amp;nbsp;&quot;F1043B2A&quot;;&amp;nbsp;//&amp;nbsp;여러분&amp;nbsp;카드의&amp;nbsp;UID를&amp;nbsp;여기&amp;nbsp;입력하세요 &lt;br /&gt;&lt;br /&gt;void&amp;nbsp;setup()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;Serial.begin(9600); &lt;br /&gt;&amp;nbsp;&amp;nbsp;SPI.begin(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;rfid.PCD_Init(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;pinMode(BUZZER_PIN,&amp;nbsp;OUTPUT); &lt;br /&gt;&amp;nbsp;&amp;nbsp;servo.attach(SERVO_PIN); &lt;br /&gt;&amp;nbsp;&amp;nbsp;servo.write(0);&amp;nbsp;//&amp;nbsp;기본&amp;nbsp;잠금&amp;nbsp;상태 &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;void&amp;nbsp;loop()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!rfid.PICC_IsNewCardPresent()&amp;nbsp;||&amp;nbsp;!rfid.PICC_ReadCardSerial())&amp;nbsp;return; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;String&amp;nbsp;uid&amp;nbsp;=&amp;nbsp;&quot;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(byte&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;amp;lt;&amp;nbsp;rfid.uid.size;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uid&amp;nbsp;+=&amp;nbsp;String(rfid.uid.uidByte[i],&amp;nbsp;HEX); &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;uid.toUpperCase(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;Serial.println(&quot;UID:&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;uid); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uid&amp;nbsp;==&amp;nbsp;masterUID)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Serial.println(&quot;▶&amp;nbsp;출입&amp;nbsp;허용&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tone(BUZZER_PIN,&amp;nbsp;1000,&amp;nbsp;200); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;servo.write(90);&amp;nbsp;//&amp;nbsp;문&amp;nbsp;열림 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delay(3000); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;servo.write(0);&amp;nbsp;&amp;nbsp;//&amp;nbsp;문&amp;nbsp;닫힘 &lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Serial.println(&quot;✖&amp;nbsp;출입&amp;nbsp;거부&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;amp;lt;&amp;nbsp;3;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tone(BUZZER_PIN,&amp;nbsp;300,&amp;nbsp;150); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delay(150); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;noTone(BUZZER_PIN); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delay(100); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;rfid.PICC_HaltA(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;delay(1000); &lt;br /&gt;} &lt;br /&gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;!--&amp;nbsp;광고&amp;nbsp;영역&amp;nbsp;2&amp;nbsp;--&amp;gt; &lt;br /&gt;&amp;lt;div&amp;nbsp;style=&quot;margin:&amp;nbsp;30px&amp;nbsp;0;&amp;nbsp;text-align:&amp;nbsp;center;&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;async&amp;nbsp;src=&quot;&lt;a href=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&lt;/a&gt;&quot;&amp;nbsp;crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;ins&amp;nbsp;class=&quot;adsbygoogle&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;style=&quot;display:block&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-ad-client=&quot;ca-pub-8362837465904837&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-ad-slot=&quot;5674748480&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-ad-format=&quot;auto&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data-full-width-responsive=&quot;true&quot;&amp;gt;&amp;lt;/ins&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;gt;(adsbygoogle&amp;nbsp;=&amp;nbsp;window.adsbygoogle&amp;nbsp;||&amp;nbsp;[]).push({});&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/div&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt; &amp;nbsp;확장&amp;nbsp;아이디어&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;lt;ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt; &amp;nbsp;EEPROM에&amp;nbsp;여러&amp;nbsp;UID&amp;nbsp;등록&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt; &amp;nbsp;RTC&amp;nbsp;모듈&amp;nbsp;연동&amp;nbsp;&amp;rarr;&amp;nbsp;시간&amp;nbsp;제한&amp;nbsp;출입&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt; &amp;nbsp;블루투스/앱&amp;nbsp;연동으로&amp;nbsp;출입&amp;nbsp;기록&amp;nbsp;확인&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt; &amp;nbsp;서보모터&amp;nbsp;대신&amp;nbsp;전자자석&amp;nbsp;자물쇠&amp;nbsp;사용&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;lt;/ul&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;✅&amp;nbsp;마무리&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;lt;p&amp;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;lt;br&amp;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;훨씬&amp;nbsp;완성도&amp;nbsp;높은&amp;nbsp;시스템이&amp;nbsp;됩니다.&amp;lt;br&amp;gt; &lt;br /&gt;이제&amp;nbsp;여러분도&amp;nbsp;집&amp;nbsp;문에&amp;nbsp;직접&amp;nbsp;만든&amp;nbsp;RFID&amp;nbsp;도어락을&amp;nbsp;설치해보세요! &lt;br /&gt;&amp;lt;/p&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;hr&amp;gt; &lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Arduino&amp;nbsp;시리즈&amp;nbsp;21편&amp;nbsp;|&amp;nbsp;작성자:&amp;nbsp;YT&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt; &lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>RC522</category>
      <category>rfid카드</category>
      <category>보안시스템</category>
      <category>서보모터</category>
      <category>아두이노</category>
      <category>자동문</category>
      <category>전자도어락</category>
      <category>피에조부저</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/183</guid>
      <comments>https://ythouse.tistory.com/183#entry183comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:38:47 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 시프트 레지스터 74HC165 입력 확장 가이드 &amp;ndash; 버튼 8개 이상 제어하는 법</title>
      <link>https://ythouse.tistory.com/182</link>
      <description>&lt;h1&gt;아두이노 시프트 레지스터 74HC165 입력 확장 가이드 – 버튼 8개 이상 제어하는 법&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;아두이노로 버튼 입력을 10개 이상 받고 싶을 때, 핀이 부족하다면?&lt;/strong&gt;&lt;br&gt;
이럴 때 사용하는 부품이 바로 &lt;strong&gt;74HC165 시프트 레지스터&lt;/strong&gt;입니다.&lt;br&gt;
이 IC는 8개의 병렬 입력을 &lt;strong&gt;시리얼 데이터로 변환해주는 입력 확장 칩&lt;/strong&gt;으로, 아두이노의 핀 3개만으로도 다수의 버튼을 제어할 수 있게 해줍니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;74HC165&lt;/li&gt;
  &lt;li&gt;푸시버튼 8개&lt;/li&gt;
  &lt;li&gt;10kΩ 저항 (풀업용) 또는 INPUT_PULLUP 사용&lt;/li&gt;
  &lt;li&gt;브레드보드, 점퍼 와이어&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  74HC165란?&lt;/h2&gt;
&lt;p&gt;
74HC165는 병렬 입력을 시리얼 데이터로 변환해주는 8비트 시프트 레지스터입니다.  
LOAD(또는 SH/LD) 핀을 통해 외부 입력을 캡처하고, CLOCK과 함께 데이터핀으로 한 비트씩 읽어올 수 있습니다.&lt;br&gt;
&lt;code&gt;shiftIn()&lt;/code&gt; 함수를 통해 아두이노에서 손쉽게 값을 받을 수 있습니다.
&lt;/p&gt;

&lt;h2&gt;⚙️ 핀 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;74HC165 핀&lt;/th&gt;&lt;th&gt;기능&lt;/th&gt;&lt;th&gt;아두이노 연결&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;1 - SH/LD&lt;/td&gt;&lt;td&gt;데이터 로드 (LOW에서 캡처)&lt;/td&gt;&lt;td&gt;D8&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;2 - CLK&lt;/td&gt;&lt;td&gt;시프트 클럭&lt;/td&gt;&lt;td&gt;D13&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;9 - QH&lt;/td&gt;&lt;td&gt;데이터 출력&lt;/td&gt;&lt;td&gt;D12&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;15 - CE&lt;/td&gt;&lt;td&gt;클럭 활성화&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;D0~D7&lt;/td&gt;&lt;td&gt;버튼 연결&lt;/td&gt;&lt;td&gt;푸시버튼 + 풀업저항&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;VCC / GND&lt;/td&gt;&lt;td&gt;전원&lt;/td&gt;&lt;td&gt;5V / GND&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  아두이노 코드 예제 (8개 버튼 읽기)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int loadPin = 8;
int clockPin = 13;
int dataPin  = 12;

void setup() {
  Serial.begin(9600);
  pinMode(loadPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, INPUT);
}

void loop() {
  digitalWrite(loadPin, LOW);  // 데이터 캡처
  delayMicroseconds(5);
  digitalWrite(loadPin, HIGH); // 시프트 시작

  byte buttons = shiftIn(dataPin, clockPin, MSBFIRST);

  Serial.print(&quot;입력값: &quot;);
  Serial.println(buttons, BIN);
  delay(500);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  멀티 연결로 입력 확장하기&lt;/h2&gt;
&lt;p&gt;
QH’ 핀(핀 7)을 다음 74HC165의 QH(핀 9)에 연결하면 16개 이상의 입력도 가능합니다.&lt;br&gt;
&lt;code&gt;shiftIn()&lt;/code&gt;을 2번 호출하거나, 직접 SPI 방식으로 데이터를 더 빠르게 읽을 수도 있습니다.
&lt;/p&gt;

&lt;h2&gt;  활용 아이디어&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;  아케이드 버튼판 입력 처리&lt;/li&gt;
  &lt;li&gt; ️ 키패드 매트릭스 입력&lt;/li&gt;
  &lt;li&gt;  보드 설정용 DIP 스위치 입력&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;❓ 자주 묻는 질문&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; 버튼이 눌렸는데 값이 안 바뀝니다.&lt;br&gt;&lt;strong&gt;A:&lt;/strong&gt; 풀업 저항이 빠지거나, SH/LD 핀 신호가 없을 수 있습니다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; shiftIn으로 읽는 값이 거꾸로예요.&lt;br&gt;&lt;strong&gt;A:&lt;/strong&gt; MSBFIRST vs LSBFIRST 설정을 확인하세요.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
74HC165는 아두이노의 입력 확장을 위해 매우 유용한 IC입니다.&lt;br&gt;
버튼 입력이 많은 프로젝트에서 포트를 절약하면서도 효율적으로 제어할 수 있으며,  
74HC595와 함께 조합하면 완전한 입출력 확장 시스템을 만들 수 있습니다.
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 | 74HC165 제어 편 – 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>74hc165</category>
      <category>arduino</category>
      <category>shiftin</category>
      <category>디지털입력</category>
      <category>멀티입력</category>
      <category>버튼확장</category>
      <category>시프트레지스터입력</category>
      <category>아두이노</category>
      <category>회로제어</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/182</guid>
      <comments>https://ythouse.tistory.com/182#entry182comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:36:51 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 시프트 레지스터 74HC595 제어 가이드 &amp;ndash; LED 출력 확장과 멀티 연결 완벽 설명</title>
      <link>https://ythouse.tistory.com/181</link>
      <description>&lt;h1&gt;아두이노 시프트 레지스터 74HC595 제어 가이드 – LED 출력 확장과 멀티 연결 완벽 설명&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;아두이노 출력 핀 부족 문제, 어떻게 해결하시나요?&lt;/strong&gt;&lt;br&gt;
프로젝트에서 여러 개의 LED나 7세그먼트를 제어하려고 할 때, 아두이노의 디지털 핀이 부족해지는 문제가 자주 발생합니다.&lt;br&gt;
이럴 때 &lt;strong&gt;시프트 레지스터 74HC595&lt;/strong&gt;를 사용하면 단 3개의 핀만으로 원하는 만큼 출력을 확장할 수 있습니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;74HC595 시프트 레지스터 1~2개&lt;/li&gt;
  &lt;li&gt;LED × 8~16개&lt;/li&gt;
  &lt;li&gt;330Ω 저항 × LED 수만큼&lt;/li&gt;
  &lt;li&gt;브레드보드 및 점퍼 와이어&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  74HC595란?&lt;/h2&gt;
&lt;p&gt;
74HC595는 8비트 시프트 레지스터로 &lt;strong&gt;시리얼 입력을 병렬 출력으로 변환&lt;/strong&gt;하는 IC입니다.  
아두이노에서 shiftOut() 함수를 이용해 8비트 데이터를 전송하면, Q0~Q7 핀을 통해 해당 상태가 출력됩니다.
&lt;/p&gt;

&lt;h2&gt;⚙️ 핀 연결 요약 (단일 595)&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;74HC595 핀&lt;/th&gt;&lt;th&gt;기능&lt;/th&gt;&lt;th&gt;아두이노 핀&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;DS (14)&lt;/td&gt;&lt;td&gt;데이터 입력&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;SH_CP (11)&lt;/td&gt;&lt;td&gt;시프트 클럭&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;ST_CP (12)&lt;/td&gt;&lt;td&gt;저장 클럭&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;OE (13)&lt;/td&gt;&lt;td&gt;출력 활성&lt;/td&gt;&lt;td&gt;GND에 연결&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;MR (10)&lt;/td&gt;&lt;td&gt;리셋&lt;/td&gt;&lt;td&gt;5V에 연결&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Q0~Q7&lt;/td&gt;&lt;td&gt;출력 핀&lt;/td&gt;&lt;td&gt;LED 연결&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;VCC / GND&lt;/td&gt;&lt;td&gt;전원&lt;/td&gt;&lt;td&gt;5V / GND&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  기본 제어 코드 (8비트 출력)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int latchPin = 8;
int clockPin = 12;
int dataPin  = 11;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  for (int i = 0; i &amp;lt; 256; i++) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, i);
    digitalWrite(latchPin, HIGH);
    delay(200);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  여러 개 직렬 연결하기&lt;/h2&gt;
&lt;p&gt;
Q7’(핀 9)을 다음 74HC595의 DS(핀 14)에 연결하면 여러 개를 직렬로 연결할 수 있습니다.&lt;br&gt;
두 개를 연결하면 16개의 출력, 세 개면 24개까지도 가능합니다.
&lt;/p&gt;

&lt;h3&gt;멀티 제어 예제 코드 (2개 연결)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;byte data[] = {0b10101010, 0b11001100};

void loop() {
  digitalWrite(latchPin, LOW);
  for (int i = 1; i &amp;gt;= 0; i--) {
    shiftOut(dataPin, clockPin, MSBFIRST, data[i]);
  }
  digitalWrite(latchPin, HIGH);
  delay(500);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  활용 아이디어&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;LED 점등 패턴 제어&lt;/li&gt;
  &lt;li&gt;7세그먼트 디스플레이 구동&lt;/li&gt;
  &lt;li&gt;릴레이 모듈 다중 제어&lt;/li&gt;
  &lt;li&gt;음향 시각화(LED VU 미터)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;❓ 자주 묻는 질문&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; shiftOut 속도 느린데 빠르게 못하나요?&lt;br&gt;&lt;strong&gt;A:&lt;/strong&gt; 직접 SPI 방식으로 제어하면 훨씬 빠르게 제어할 수 있습니다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; shiftOut 값이 바뀌는데 LED가 반응을 안 해요.&lt;br&gt;&lt;strong&gt;A:&lt;/strong&gt; latchPin을 꼭 LOW → shiftOut → HIGH 순서로 조작해야 합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
74HC595는 적은 핀으로 출력을 확장할 수 있는 최고의 부품 중 하나입니다.&lt;br&gt;
단일로도 충분히 유용하지만, 직렬 연결하면 무제한으로 출력 수를 늘릴 수 있어&lt;br&gt;
LED 매트릭스, 디지털 디스플레이, 릴레이 확장 등에서 핵심적인 역할을 합니다.&lt;br&gt;
오늘 배운 내용을 바탕으로 다양한 프로젝트에 적용해보세요!
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 | 74HC595 제어 편 – 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>74hc595</category>
      <category>arduino</category>
      <category>LED제어</category>
      <category>ShiftOut</category>
      <category>디지털출력</category>
      <category>멀티제어</category>
      <category>시프트레지스터</category>
      <category>아두이노</category>
      <category>포트확장</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/181</guid>
      <comments>https://ythouse.tistory.com/181#entry181comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:32:30 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 + MAX31855로 K-Type 써모커플 온도 측정하기 &amp;ndash; SPI 방식 온도 센서 예제</title>
      <link>https://ythouse.tistory.com/180</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고온 환경에서 온도를 측정하려면?&lt;/b&gt;&lt;br /&gt;바로 &lt;b&gt;써모커플(Thermocouple) + MAX31855&lt;/b&gt; 조합이 답입니다.&lt;br /&gt;MAX31855는 K타입 써모커플의 미세한 전압을 읽어 **SPI 통신으로 디지털 온도로 변환**해주는 센서입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg8Vi4/btsNvCp1VXA/n8nNEwYo7PxA4MoS01X8h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg8Vi4/btsNvCp1VXA/n8nNEwYo7PxA4MoS01X8h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg8Vi4/btsNvCp1VXA/n8nNEwYo7PxA4MoS01X8h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg8Vi4%2FbtsNvCp1VXA%2Fn8nNEwYo7PxA4MoS01X8h0%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; alt=&quot;MAX31855 모듈과 K타입 써모커플 센서를 이용한 아두이노 온도 측정 회로 구성 이미지&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  준비물&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아두이노 UNO&lt;/li&gt;
&lt;li&gt;MAX31855 모듈&lt;/li&gt;
&lt;li&gt;K-type 써모커플 센서&lt;/li&gt;
&lt;li&gt;점퍼 와이어&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚙️ 핀 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MAX31855 핀&lt;/th&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;아두이노 핀&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VCC&lt;/td&gt;
&lt;td&gt;3.3V&lt;/td&gt;
&lt;td&gt;3.3V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;td&gt;그라운드&lt;/td&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CS&lt;/td&gt;
&lt;td&gt;Chip Select&lt;/td&gt;
&lt;td&gt;D10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCK&lt;/td&gt;
&lt;td&gt;SPI Clock&lt;/td&gt;
&lt;td&gt;D13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SO&lt;/td&gt;
&lt;td&gt;SPI Data Out (MISO)&lt;/td&gt;
&lt;td&gt;D12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  아두이노 코드 예제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adafruit MAX31855 라이브러리를 사용하면 간편하게 데이터를 읽을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;Adafruit_MAX31855.h&amp;gt;

int thermoCLK = 13;
int thermoCS = 10;
int thermoDO = 12;

Adafruit_MAX31855 thermocouple(thermoCLK, thermoCS, thermoDO);

void setup() {
  Serial.begin(9600);
  delay(500);
  Serial.println(&quot;MAX31855 시작&quot;);
}

void loop() {
  double tempC = thermocouple.readCelsius();
  double tempF = thermocouple.readFahrenheit();

  if (isnan(tempC)) {
    Serial.println(&quot;센서 연결 오류!&quot;);
  } else {
    Serial.print(&quot;섭씨: &quot;);
    Serial.print(tempC);
    Serial.print(&quot; &amp;deg;C  /  화씨: &quot;);
    Serial.print(tempF);
    Serial.println(&quot; &amp;deg;F&quot;);
  }
  delay(1000);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  활용 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  &lt;b&gt;화덕, 히터, 고온 장비의 실시간 온도 모니터링&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;정밀 실험 장비 온도 기록&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;LCD, SD카드, IoT 모듈과 연계한 로깅 시스템&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MAX31855는 K타입 써모커플의 전압을 직접 증폭하고 디지털로 변환해주는 고급 센서입니다.&lt;br /&gt;SPI 통신 기반으로 동작하므로 아두이노와의 연결도 간단하며, 실시간 고온 모니터링 시스템 구현에 적합합니다.&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>k타입센서</category>
      <category>max31855</category>
      <category>spi온도센서</category>
      <category>고온측정</category>
      <category>써모커플</category>
      <category>아두이노</category>
      <category>온도센서예제</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/180</guid>
      <comments>https://ythouse.tistory.com/180#entry180comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:30:37 +0900</pubDate>
    </item>
    <item>
      <title>아두이노로 MCP3202 SPI ADC 제어하기 &amp;ndash; 12비트 아날로그 입력 읽기 예제</title>
      <link>https://ythouse.tistory.com/179</link>
      <description>&lt;h1&gt;아두이노로 MCP3202 SPI ADC 제어하기 – 12비트 아날로그 입력 읽기 예제&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;MCP3202는 Microchip에서 만든 2채널, 12비트 분해능의 SPI 기반 ADC(Analog-to-Digital Converter)&lt;/strong&gt;입니다.&lt;br&gt;
아두이노 UNO의 기본 아날로그 입력보다 더 높은 해상도가 필요한 경우, 외부 ADC로 사용하기 좋습니다.
&lt;/p&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;MCP3202&lt;/li&gt;
  &lt;li&gt;10kΩ 가변저항 (테스트용 아날로그 입력)&lt;/li&gt;
  &lt;li&gt;점퍼 와이어, 브레드보드&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;⚙️ 핀 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;MCP3202 핀&lt;/th&gt;&lt;th&gt;기능&lt;/th&gt;&lt;th&gt;아두이노 핀&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;1 - CH0&lt;/td&gt;&lt;td&gt;아날로그 입력 0&lt;/td&gt;&lt;td&gt;가변저항 중간핀&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;2 - CH1&lt;/td&gt;&lt;td&gt;아날로그 입력 1&lt;/td&gt;&lt;td&gt;미사용&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;3 - AGND&lt;/td&gt;&lt;td&gt;아날로그 GND&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;4 - VREF&lt;/td&gt;&lt;td&gt;기준 전압&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;5 - DGND&lt;/td&gt;&lt;td&gt;디지털 GND&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;6 - CLK&lt;/td&gt;&lt;td&gt;SPI Clock&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;7 - DOUT&lt;/td&gt;&lt;td&gt;MISO&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;8 - DIN&lt;/td&gt;&lt;td&gt;MOSI&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;9 - CS/SHDN&lt;/td&gt;&lt;td&gt;Chip Select&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;10 - VDD&lt;/td&gt;&lt;td&gt;전원&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  아두이노 코드 예제 (채널 0만 사용)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;SPI.h&amp;gt;

const int CS_PIN = 10;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  pinMode(CS_PIN, OUTPUT);
  digitalWrite(CS_PIN, HIGH);
}

int readMCP3202(int channel) {
  byte command = 0b00000110 | ((channel &amp; 0x01) &amp;lt;&amp;lt; 1); // Single-ended mode
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(command);               // Start + Single-Ended + D2
  byte highByte = SPI.transfer(0x00); // Receive high byte
  byte lowByte = SPI.transfer(0x00);  // Receive low byte
  digitalWrite(CS_PIN, HIGH);

  int result = ((highByte &amp; 0x0F) &amp;lt;&amp;lt; 8) | lowByte; // 12비트 데이터 조합
  return result;
}

void loop() {
  int adcValue = readMCP3202(0);
  float voltage = adcValue * (5.0 / 4095.0);
  Serial.print(&quot;ADC: &quot;);
  Serial.print(adcValue);
  Serial.print(&quot; | Voltage: &quot;);
  Serial.print(voltage);
  Serial.println(&quot; V&quot;);
  delay(500);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
MCP3202는 간단하면서도 고해상도의 아날로그 입력 측정을 가능하게 해주는 유용한 SPI 기반 외부 ADC입니다.&lt;br&gt;
이 글의 예제를 기반으로 다양한 센서 데이터를 정밀하게 측정할 수 있습니다.
&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>mcp3202</category>
      <category>SPI통신</category>
      <category>고해상도측정</category>
      <category>센서데이터</category>
      <category>아날로그입력</category>
      <category>아두이노</category>
      <category>외부adc</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/179</guid>
      <comments>https://ythouse.tistory.com/179#entry179comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:29:58 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 RFID 카드 인식 시스템 만들기 &amp;ndash; RC522 모듈로 출입 인증 구현하기</title>
      <link>https://ythouse.tistory.com/178</link>
      <description>&lt;h1&gt;아두이노 RFID 카드 인식 시스템 만들기 – RC522 모듈로 출입 인증 구현하기&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;카드 한 장으로 문을 여는 출입 시스템, 직접 만들 수 있습니다!&lt;/strong&gt;&lt;br&gt;
이번 글에서는 &lt;strong&gt;아두이노와 RC522 RFID 리더 모듈&lt;/strong&gt;을 이용해 RFID 태그(카드)를 인식하고, 특정 UID에 따라 동작을 수행하는 시스템을 구현합니다.  
이 방식은 출입 인증, 출석 체크, 스마트 잠금장치 등에 널리 사용되는 기술입니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;RC522 RFID 리더기&lt;/li&gt;
  &lt;li&gt;RFID 카드 or 키태그&lt;/li&gt;
  &lt;li&gt;점퍼 와이어&lt;/li&gt;
  &lt;li&gt;브레드보드 (옵션)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  RC522 RFID 모듈이란?&lt;/h2&gt;
&lt;p&gt;
RC522는 13.56MHz 주파수 대역의 RFID를 읽을 수 있는 SPI 기반 모듈입니다.  
전송 속도도 빠르고, 가격도 저렴해 가장 많이 쓰이는 RFID 리더 중 하나입니다.
&lt;/p&gt;

&lt;h2&gt;⚙️ 핀 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;RC522 핀&lt;/th&gt;&lt;th&gt;아두이노 핀&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;SDA&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;SCK&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;MOSI&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;MISO&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;IRQ&lt;/td&gt;&lt;td&gt;사용 안함&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;RST&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;3.3V&lt;/td&gt;&lt;td&gt;3.3V&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  기본 코드 – UID 출력&lt;/h2&gt;
&lt;p&gt;
RFID 태그의 UID(고유 ID)를 읽어와 시리얼 모니터에 출력하는 기본 예제입니다.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;MFRC522.h&amp;gt;

#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  Serial.println(&quot;RFID 리더 시작&quot;);
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;

  Serial.print(&quot;UID: &quot;);
  for (byte i = 0; i &amp;lt; rfid.uid.size; i++) {
    Serial.print(rfid.uid.uidByte[i] &lt; 0x10 ? &quot;0&quot; : &quot;&quot;);
    Serial.print(rfid.uid.uidByte[i], HEX);
  }
  Serial.println();
  delay(1000);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  UID 기반 인증 예제&lt;/h2&gt;
&lt;p&gt;특정 카드 UID에 따라 승인/거부 메시지를 출력해봅니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String masterUID = &quot;F1043B2A&quot;; // 카드 UID를 시리얼로 읽고 이 값으로 설정

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;

  String tagID = &quot;&quot;;
  for (byte i = 0; i &amp;lt; rfid.uid.size; i++) {
    tagID += String(rfid.uid.uidByte[i], HEX);
  }

  tagID.toUpperCase();
  if (tagID == masterUID) {
    Serial.println(&quot;▶ 인증 성공: 출입 허용&quot;);
  } else {
    Serial.println(&quot;✖ 인증 실패: 출입 거부&quot;);
  }

  rfid.PICC_HaltA();
  delay(1500);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  활용 팁&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;  &lt;strong&gt;릴레이와 연동해 전자문 잠금 해제&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;SD카드에 출입 로그 저장&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;RTC 모듈과 결합해 출입 시간 기록&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
RFID를 이용한 카드 인식 시스템은 단순하면서도 실용적인 프로젝트입니다.  
보안 시스템, 출석 체크, 도서 대여 등 실생활 곳곳에 응용이 가능합니다.&lt;br&gt;&lt;br&gt;
이제 여러분도 나만의 출입 인증 시스템을 직접 구현해보세요!
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 20편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>RC522</category>
      <category>rfid예제</category>
      <category>rfid카드</category>
      <category>보안시스템</category>
      <category>아두이노</category>
      <category>전자공작</category>
      <category>출입통제</category>
      <category>카드인식</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/178</guid>
      <comments>https://ythouse.tistory.com/178#entry178comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:28:14 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 전자식 가변저항 제어 가이드 &amp;ndash; MCP41010 SPI 통신으로 디지털 저항 조절하기</title>
      <link>https://ythouse.tistory.com/177</link>
      <description>&lt;h1&gt;아두이노 전자식 가변저항 제어 가이드 – MCP41010 SPI 통신으로 디지털 저항 조절하기&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;손으로 돌리지 않아도 되는 가변저항이 있다면?&lt;/strong&gt;&lt;br&gt;
바로 &lt;strong&gt;전자식 가변저항(Digital Potentiometer)&lt;/strong&gt;입니다. 이번 글에서는 &lt;strong&gt;MCP41010&lt;/strong&gt;을 아두이노와 SPI 통신으로 연결하여 원하는 저항 값을 코드로 제어하는 방법을 설명합니다.  
이 기술은 자동 볼륨 조절, 센서 감도 설정, LED 밝기 조절 등 정밀 제어에 매우 유용합니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;MCP41010 디지털 가변저항&lt;/li&gt;
  &lt;li&gt;10kΩ 고정저항 (테스트용)&lt;/li&gt;
  &lt;li&gt;LED + 330Ω&lt;/li&gt;
  &lt;li&gt;브레드보드, 점퍼 와이어&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  MCP41010 소개&lt;/h2&gt;
&lt;p&gt;
MCP41010은 8핀 IC로, 내부에 256 단계로 조절 가능한 전자식 저항을 포함하고 있습니다.  
아두이노와의 통신은 &lt;strong&gt;SPI (Serial Peripheral Interface)&lt;/strong&gt;로 이루어지며,  
SCK / MOSI / CS 핀을 통해 원하는 저항 값을 설정할 수 있습니다.
&lt;/p&gt;

&lt;h2&gt;⚙️ 핀 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;MCP41010 핀&lt;/th&gt;&lt;th&gt;아두이노 연결&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;1 - CS&lt;/td&gt;&lt;td&gt;D10&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;2 - SCK&lt;/td&gt;&lt;td&gt;D13&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;3 - SDI (MOSI)&lt;/td&gt;&lt;td&gt;D11&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;4 - GND&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;5 - PW0&lt;/td&gt;&lt;td&gt;(LED 연결)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;6 - PW1&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;7 - NC&lt;/td&gt;&lt;td&gt;없음&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;8 - VDD&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  아두이노 코드 예제&lt;/h2&gt;
&lt;p&gt;
아래 코드는 MCP41010의 저항값을 점점 줄이며 LED 밝기를 조절하는 예제입니다.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;SPI.h&amp;gt;

const int CS_PIN = 10;

void setup() {
  SPI.begin();
  pinMode(CS_PIN, OUTPUT);
}

void setResistance(byte value) {
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(0x11); // Command byte (write to pot 0)
  SPI.transfer(value); // 0 ~ 255
  digitalWrite(CS_PIN, HIGH);
}

void loop() {
  for (int i = 0; i &amp;lt;= 255; i++) {
    setResistance(i);
    delay(20);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  활용 아이디어&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;  자동 볼륨 조절 시스템 (앰프 제어)&lt;/li&gt;
  &lt;li&gt;  조도 감도 조절 (센서 보정)&lt;/li&gt;
  &lt;li&gt;  상태 저장형 저항 설정 (EEPROM과 연동)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
전자식 가변저항은 아두이노를 활용한 정밀 제어 시스템에서 매우 강력한 도구입니다.  
특히 SPI 프로토콜을 통해 제어가 가능하므로, 다른 SPI 기반 장치와 함께 활용하는 고급 프로젝트로 확장할 수 있습니다.  
이제 손으로 조절하지 않아도, 코딩으로 저항값을 마음껏 제어하세요!
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 19편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DIY</category>
      <category>mcp41010</category>
      <category>SPI통신</category>
      <category>고급예제</category>
      <category>디지털포텐쇼미터</category>
      <category>아두이노</category>
      <category>전자식가변저항</category>
      <category>회로제어</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/177</guid>
      <comments>https://ythouse.tistory.com/177#entry177comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:26:31 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 통합 프로젝트 완성 &amp;ndash; 버튼으로 LCD 메뉴 전환 + 센서 제어 시스템 만들기</title>
      <link>https://ythouse.tistory.com/176</link>
      <description>&lt;h1&gt;아두이노 통합 프로젝트 완성 &amp;ndash; 버튼으로 LCD 메뉴 전환 + 센서 제어 시스템 만들기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금까지 배운 모든 아두이노 기술을 하나로!&lt;/b&gt;&lt;br /&gt;이번 글에서는 아두이노 기반으로 &lt;b&gt;LCD 메뉴를 전환하고, 센서를 선택 제어하는 종합 프로젝트&lt;/b&gt;를 소개합니다.&lt;br /&gt;I2C LCD를 이용해 메뉴를 출력하고, 버튼으로 항목을 전환하면서 DHT11 온습도 센서, 초음파 거리 센서, 서보모터, 부저 등을 선택적으로 동작시킵니다.&lt;/p&gt;
&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  구성 요소&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아두이노 UNO&lt;/li&gt;
&lt;li&gt;I2C LCD (1602)&lt;/li&gt;
&lt;li&gt;버튼 1~2개 (입력용)&lt;/li&gt;
&lt;li&gt;DHT11 온습도 센서&lt;/li&gt;
&lt;li&gt;HC-SR04 초음파 센서&lt;/li&gt;
&lt;li&gt;SG90 서보모터&lt;/li&gt;
&lt;li&gt;피에조 부저&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  메뉴 설계 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LCD에 표시되는 메뉴 항목은 다음과 같이 구성합니다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 온습도 보기
2. 거리 측정
3. 서보 제어
4. 알람 테스트&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  기본 회로 구성 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버튼 1: 메뉴 전환&lt;/li&gt;
&lt;li&gt;LCD: I2C (A4-SDA, A5-SCL)&lt;/li&gt;
&lt;li&gt;DHT11: D2&lt;/li&gt;
&lt;li&gt;초음파 센서: Trig-D8, Echo-D9&lt;/li&gt;
&lt;li&gt;서보모터: D10&lt;/li&gt;
&lt;li&gt;부저: D11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  주요 코드 구조 (간략 예)&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;
#include &amp;lt;DHT.h&amp;gt;
#include &amp;lt;Servo.h&amp;gt;

LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(2, DHT11);
Servo servo;

int menu = 0;
int buttonPin = 4;

void setup() {
  lcd.begin(); lcd.backlight();
  pinMode(buttonPin, INPUT_PULLUP);
  servo.attach(10);
  dht.begin();
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    menu = (menu + 1) % 4;
    delay(300);
  }

  lcd.clear();
  switch (menu) {
    case 0:
      lcd.print(&quot;온습도 측정&quot;);
      lcd.setCursor(0,1);
      lcd.print(dht.readTemperature());
      lcd.print(&quot;C &quot;);
      lcd.print(dht.readHumidity());
      lcd.print(&quot;%&quot;);
      break;

    case 1:
      lcd.print(&quot;거리 측정&quot;);
      // 초음파 거리 측정 코드 삽입
      break;

    case 2:
      lcd.print(&quot;서보 90도&quot;);
      servo.write(90);
      break;

    case 3:
      lcd.print(&quot;부저 알림&quot;);
      tone(11, 1000, 500);
      break;
  }
  delay(1000);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8362837465904837&quot; data-ad-slot=&quot;5674748480&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실전 활용 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;⏳ &lt;b&gt;menuTimeout 변수&lt;/b&gt;로 자동 초기화 기능 추가 가능&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;블루투스 입력으로 메뉴 전환&lt;/b&gt;도 확장 가능&lt;/li&gt;
&lt;li&gt;  &lt;b&gt;EEPROM에 마지막 메뉴 저장&lt;/b&gt; 기능 추가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 하나의 버튼으로 다양한 기능을 제어할 수 있는 아두이노 종합 시스템을 만들었습니다! LCD 메뉴 기반의 구조는 앞으로 블루투스 제어, IoT 확장에도 큰 도움이 됩니다. &lt;b&gt;다음 편에서는 전자식 가변저항(SPI 제어 방식)을 다루는 고급 주제&lt;/b&gt;로 넘어갑니다!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Arduino 시리즈 18편 | 작성자: YT&lt;/i&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DHT11</category>
      <category>lcd메뉴</category>
      <category>부저알람</category>
      <category>서보모터제어</category>
      <category>센서연동</category>
      <category>아두이노</category>
      <category>초음파센서</category>
      <category>통합프로젝트</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/176</guid>
      <comments>https://ythouse.tistory.com/176#entry176comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:25:22 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 피에조 부저 알람 만들기 &amp;ndash; tone() 함수로 소리 제어하는 완벽 가이드</title>
      <link>https://ythouse.tistory.com/175</link>
      <description>&lt;h1&gt;아두이노 피에조 부저 알람 만들기 – tone() 함수로 소리 제어하는 완벽 가이드&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;소리로 피드백을 주는 가장 쉬운 방법, 바로 부저(Buzzer)입니다!&lt;/strong&gt;&lt;br&gt;
이번 글에서는 &lt;strong&gt;피에조(Piezo) 부저&lt;/strong&gt;를 사용해 아두이노에서 경고음이나 알림음을 만들어보는 방법을 소개합니다.  
tone() 함수의 기본 사용법부터 다양한 음 조합, 버튼과의 연동까지 쉽게 따라할 수 있도록 설명드릴게요.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;피에조 부저 (Passive 타입 권장)&lt;/li&gt;
  &lt;li&gt;브레드보드&lt;/li&gt;
  &lt;li&gt;점퍼 와이어&lt;/li&gt;
  &lt;li&gt;버튼 (옵션)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  피에조 부저란?&lt;/h2&gt;
&lt;p&gt;
피에조 부저는 전압을 가하면 진동하며 소리를 내는 소형 음향 장치입니다.  
&lt;b&gt;Active&lt;/b&gt; 부저는 전원을 공급하면 자동으로 소리가 나지만,  
&lt;b&gt;Passive&lt;/b&gt; 부저는 &lt;code&gt;tone()&lt;/code&gt; 함수를 이용해 다양한 주파수의 음을 직접 제어할 수 있어 유용합니다.
&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Piezo_Buzzer.jpg/640px-Piezo_Buzzer.jpg&quot; alt=&quot;아두이노용 피에조 부저 이미지&quot; width=&quot;400&quot;&gt;
&lt;/p&gt;

&lt;h2&gt;⚙️ 회로 구성&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;부저 핀&lt;/th&gt;&lt;th&gt;아두이노 연결&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;+ (긴 다리)&lt;/td&gt;&lt;td&gt;디지털 8번&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  기본 코드 – tone()으로 소리 내기&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int buzzer = 8;

void setup() {
  tone(buzzer, 1000); // 1kHz 톤 발생
  delay(1000);
  noTone(buzzer);     // 소리 끄기
}

void loop() {
  // 반복 없음
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  멜로디 예제: 도레미&lt;/h2&gt;
&lt;p&gt;여러 주파수를 조합하면 멜로디도 만들 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int buzzer = 8;

void setup() {
  tone(buzzer, 262); delay(300);  // 도
  tone(buzzer, 294); delay(300);  // 레
  tone(buzzer, 330); delay(300);  // 미
  noTone(buzzer);
}

void loop() {}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  버튼과 부저 연동 예제&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int buzzer = 8;
int button = 7;

void setup() {
  pinMode(buzzer, OUTPUT);
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(button) == LOW) {
    tone(buzzer, 1000);
  } else {
    noTone(buzzer);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  활용 아이디어&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;  &lt;strong&gt;문 열림 알람&lt;/strong&gt;: 도어 센서와 연결&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;가스/화재 경고 시스템&lt;/strong&gt;: 센서와 연계&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;주차 센서 소리 피드백&lt;/strong&gt;: 초음파 거리 감지와 연동&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
부저는 단순하지만 프로젝트의 완성도를 높이는 데 큰 역할을 합니다.  
사용자가 시스템의 동작 여부를 소리로 직관적으로 알 수 있기 때문이죠.&lt;br&gt;&lt;br&gt;
다음 글에서는 지금까지 배운 내용을 통합한 &lt;strong&gt;아두이노 종합 프로젝트&lt;/strong&gt;로 이어집니다. 감사합니다  
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 17편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DIY</category>
      <category>tone함수</category>
      <category>부저제어</category>
      <category>소리센서</category>
      <category>아두이노</category>
      <category>알림음</category>
      <category>전자공작</category>
      <category>피에조부저</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/175</guid>
      <comments>https://ythouse.tistory.com/175#entry175comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:24:20 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 가변저항 입력 완벽 가이드 &amp;ndash; Potentiometer로 아날로그 값 읽기와 응용까지</title>
      <link>https://ythouse.tistory.com/174</link>
      <description>&lt;h1&gt;아두이노 가변저항 입력 완벽 가이드 – Potentiometer로 아날로그 값 읽기와 응용까지&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;센서 값을 제어하는 기본 중의 기본, 가변저항(Potentiometer)!&lt;/strong&gt;&lt;br&gt;
이번 글에서는 아두이노로 가변저항 값을 읽고, 이를 다양한 장치 제어에 활용하는 방법을 배워봅니다.  
아날로그 입력의 개념, 회로 구성, 시리얼 출력, LED 밝기 조절, 서보 제어 등 다양한 예제를 포함합니다.
&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;가변저항 (10kΩ)&lt;/li&gt;
  &lt;li&gt;브레드보드&lt;/li&gt;
  &lt;li&gt;점퍼 와이어&lt;/li&gt;
  &lt;li&gt;시리얼 모니터 또는 LED (응용 시)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  가변저항이란?&lt;/h2&gt;
&lt;p&gt;
가변저항(Potentiometer)은 회전 또는 슬라이드 방식으로 저항 값을 변경할 수 있는 부품입니다.  
가운데 핀(Vout)은 가변 출력이고, 양쪽은 GND와 5V에 연결하여 분압 회로를 구성합니다.  
이를 통해 아날로그 값을 0~1023 범위로 측정할 수 있습니다.
&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Potentiometer.jpg/640px-Potentiometer.jpg&quot; alt=&quot;가변저항 Potentiometer 이미지&quot; width=&quot;400&quot;&gt;
&lt;/p&gt;

&lt;h2&gt;⚙️ 회로 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;가변저항 핀&lt;/th&gt;&lt;th&gt;아두이노 핀&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;왼쪽 (GND)&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;오른쪽 (VCC)&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;중앙 (Vout)&lt;/td&gt;&lt;td&gt;A0 (아날로그 핀)&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  기본 코드 – 시리얼 모니터로 값 출력&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;void setup() {
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(A0);
  Serial.print(&quot;가변저항 값: &quot;);
  Serial.println(value);
  delay(300);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  응용 예제: LED 밝기 제어&lt;/h2&gt;
&lt;p&gt;가변저항 값을 활용해 LED 밝기를 조절해볼 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int led = 9;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  int value = analogRead(A0); // 0~1023
  int brightness = map(value, 0, 1023, 0, 255); // PWM 값으로 변환
  analogWrite(led, brightness);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  실전 활용 팁&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt; ️ &lt;strong&gt;서보모터 각도 제어:&lt;/strong&gt; 가변저항 → 서보 각도로 변환&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;부저 음높이 조절:&lt;/strong&gt; tone() 함수의 주파수 조절 가능&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;아날로그 조이스틱 입력 기초:&lt;/strong&gt; 가변저항 2개 조합&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
아두이노에서 가변저항을 활용하는 방법은 아날로그 입력의 핵심을 배우는 좋은 기회입니다.&lt;br&gt;
이번 예제를 바탕으로 다양한 센서와의 결합, 제어 시스템 확장 등으로 실력을 키워보세요!  
다음 편에서는 &lt;strong&gt;부저(피에조)로 알림음을 내는 방법&lt;/strong&gt;을 다룹니다.
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 16편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DIY</category>
      <category>potentiometer</category>
      <category>가변저항</category>
      <category>센서입력</category>
      <category>아날로그입력</category>
      <category>아두이노</category>
      <category>전자공작</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/174</guid>
      <comments>https://ythouse.tistory.com/174#entry174comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:23:31 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 서보모터 제어 완벽 가이드 &amp;ndash; SG90으로 각도 제어부터 응용까지</title>
      <link>https://ythouse.tistory.com/173</link>
      <description>&lt;h1&gt;아두이노 서보모터 제어 완벽 가이드 – SG90으로 각도 제어부터 응용까지&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;움직이는 프로젝트를 만들고 싶다면, 서보모터 제어부터 배워야 합니다!&lt;/strong&gt;&lt;br&gt;
이번 포스트에서는 가장 널리 사용되는 마이크로 서보모터 &lt;strong&gt;SG90&lt;/strong&gt;을 이용하여 아두이노에서 각도를 제어하고, 실제로 회전하는 시스템을 구현해봅니다. 서보모터의 동작 원리부터 제어 코드, 회로 구성, 다양한 응용 예제까지 모두 정리했습니다.&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO&lt;/li&gt;
  &lt;li&gt;SG90 서보모터&lt;/li&gt;
  &lt;li&gt;브레드보드&lt;/li&gt;
  &lt;li&gt;점퍼 와이어&lt;/li&gt;
  &lt;li&gt;전원 공급 (USB or 외부 배터리)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  SG90 서보모터란?&lt;/h2&gt;
&lt;p&gt;
SG90은 &lt;strong&gt;180도 회전 가능한 마이크로 서보모터&lt;/strong&gt;입니다. 일반적으로 PWM(Pulse Width Modulation) 신호를 사용하여 회전 각도를 제어합니다.  
&lt;code&gt;0도 ~ 180도&lt;/code&gt; 사이에서 원하는 각도로 회전시킬 수 있으며, 로봇 팔, 문 개폐 시스템, 팬 제어 등 다양한 곳에 사용됩니다.
&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/SG90_servo_motor.jpg/320px-SG90_servo_motor.jpg&quot; alt=&quot;SG90 서보모터 사진&quot; width=&quot;300&quot;&gt;
&lt;/p&gt;

&lt;h2&gt;⚙️ SG90 회로 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;서보모터 핀&lt;/th&gt;&lt;th&gt;아두이노 연결&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;갈색 (GND)&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;빨간색 (VCC)&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;주황색 (신호)&lt;/td&gt;&lt;td&gt;디지털 9번&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;  아두이노 코드 예제&lt;/h2&gt;
&lt;p&gt;아래는 서보모터를 0도, 90도, 180도로 움직이는 기본 예제입니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;Servo.h&amp;gt;

Servo myservo;

void setup() {
  myservo.attach(9);
}

void loop() {
  myservo.write(0);
  delay(1000);
  myservo.write(90);
  delay(1000);
  myservo.write(180);
  delay(1000);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt; ️ 서보모터 제어 팁&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;전원 공급은 안정적으로:&lt;/strong&gt; SG90은 전류 소모가 꽤 있으므로, 외부 전원(예: 배터리 팩) 사용 시 더 안정적입니다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;정밀 제어:&lt;/strong&gt; &lt;code&gt;writeMicroseconds()&lt;/code&gt; 함수를 사용하면 더 세밀한 각도 제어도 가능합니다.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;소음 줄이기:&lt;/strong&gt; idle 시에도 잡음이 날 경우, PWM을 중단하거나 write 후 detach()로 해제하는 방법도 있습니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  실전 응용 아이디어&lt;/h2&gt;
&lt;p&gt;서보모터는 다양한 프로젝트에 활용할 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;  &lt;strong&gt;자동 문 개폐 시스템&lt;/strong&gt; – 센서를 통해 문이 자동으로 열리고 닫힘&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;로봇 팔 구현&lt;/strong&gt; – 관절마다 서보를 연결해 동작 구현&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;레이저 포인터 조준기&lt;/strong&gt; – XY축 서보로 조준 방향 제어&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
이번 글에서는 SG90 서보모터를 아두이노에서 제어하는 방법을 배워보았습니다.  
기본적인 코드로부터 회전 동작을 확인하고, 다양한 아이디어에 활용할 수 있는 기반을 다졌습니다.  
다음에는 **센서와 서보를 결합한 자동 시스템**도 만들어보면 흥미로울 거예요!  
계속해서 아두이노 시리즈로 재미있고 유익한 프로젝트 이어갑니다. 감사합니다  
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 14편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DIY</category>
      <category>sg90</category>
      <category>각도제어</category>
      <category>모터제어</category>
      <category>서보모터</category>
      <category>서보모터예제</category>
      <category>아두이노</category>
      <category>전자공작</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/173</guid>
      <comments>https://ythouse.tistory.com/173#entry173comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:21:47 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 초음파 센서 거리 측정 완벽 가이드 &amp;ndash; HC-SR04 연결부터 코드까지</title>
      <link>https://ythouse.tistory.com/172</link>
      <description>&lt;h1&gt;아두이노 초음파 센서 거리 측정 완벽 가이드 – HC-SR04 연결부터 코드까지&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;아두이노로 사물과의 거리를 측정할 수 있다는 사실, 알고 계셨나요?&lt;/strong&gt;&lt;br&gt;
이번 글에서는 초음파 센서인 &lt;strong&gt;HC-SR04&lt;/strong&gt;를 사용하여 간단한 거리 측정 시스템을 구현해봅니다. 이 센서는 자동차의 주차 감지기, 로봇 장애물 회피, 스마트 쓰레기통 등 다양한 프로젝트에 활용할 수 있는 매우 인기 있는 센서입니다.&lt;/p&gt;

&lt;!-- 광고 영역 1 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;  준비물&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO 보드&lt;/li&gt;
  &lt;li&gt;HC-SR04 초음파 센서&lt;/li&gt;
  &lt;li&gt;점퍼 와이어&lt;/li&gt;
  &lt;li&gt;브레드보드&lt;/li&gt;
  &lt;li&gt;USB 케이블&lt;/li&gt;
  &lt;li&gt;시리얼 모니터 또는 LCD 모듈 (선택)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;  HC-SR04 센서 원리&lt;/h2&gt;
&lt;p&gt;
HC-SR04는 초음파를 발사한 후 반사되어 돌아오는 시간을 측정해 물체까지의 거리를 계산합니다. 소리의 속도가 약 340m/s임을 활용하여 다음과 같은 공식으로 거리를 구할 수 있습니다.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;거리(cm) = (왕복 시간 * 0.034) / 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trig 핀에서 짧은 초음파 펄스를 보내고, Echo 핀으로 반사된 신호를 받아 측정합니다. 거리가 가까우면 시간도 짧고, 멀수록 길어지게 되죠.&lt;/p&gt;

&lt;h2&gt;  회로 연결&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;HC-SR04 핀&lt;/th&gt;&lt;th&gt;아두이노 핀&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;VCC&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Trig&lt;/td&gt;&lt;td&gt;9번&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Echo&lt;/td&gt;&lt;td&gt;10번&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/HC-SR04_ultrasonic_sensor.jpg/640px-HC-SR04_ultrasonic_sensor.jpg&quot; alt=&quot;HC-SR04 초음파 센서 이미지&quot; width=&quot;400&quot;&gt;
&lt;/p&gt;

&lt;h2&gt;  아두이노 코드 예제&lt;/h2&gt;
&lt;p&gt;기본적인 거리 측정 코드는 아래와 같습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#define trigPin 9
#define echoPin 10

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  long duration;
  int distance;

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;

  Serial.print(&quot;거리: &quot;);
  Serial.print(distance);
  Serial.println(&quot; cm&quot;);

  delay(500);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;  테스트 &amp; 실전 팁&lt;/h2&gt;
&lt;p&gt;코드를 업로드하고 시리얼 모니터(9600bps)를 열면 실시간으로 거리 값이 출력됩니다. 물체를 가까이 움직이면 숫자가 줄고, 멀어지면 늘어나는 걸 확인할 수 있어요.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt; ️ &lt;strong&gt;오차 보정:&lt;/strong&gt; 가까운 거리(10cm 이하)에서는 초음파 간섭이 발생할 수 있습니다. 펌웨어에서 최소 거리를 설정하거나 평균값을 사용하면 안정성이 높아집니다.&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;LCD 출력:&lt;/strong&gt; I2C LCD(1602/2004)를 함께 연결하면 거리값을 실시간 표시할 수 있습니다. 사용자 인터페이스가 필요할 때 매우 유용합니다.&lt;/li&gt;
  &lt;li&gt;  &lt;strong&gt;응용:&lt;/strong&gt; 장애물 감지, 거리 기반 자동 문 열림, 스마트 주차 센서 등 다양하게 활용 가능합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- 광고 영역 2 --&gt;
&lt;div style=&quot;margin: 30px 0; text-align: center;&quot;&gt;
  &lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;

&lt;h2&gt;✅ 마무리&lt;/h2&gt;
&lt;p&gt;
HC-SR04 초음파 센서는 저렴하면서도 매우 실용적인 센서입니다. 거리 측정을 통해 환경을 인식하거나, 반응하는 자동화 시스템을 만드는 데 꼭 필요한 요소죠.&lt;br&gt;
오늘 배운 내용을 바탕으로 다양한 센서와 결합해보며 프로젝트를 확장해보세요!
&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Arduino 시리즈 13편 | 작성자: YT&lt;/em&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DIY</category>
      <category>HC-SR04</category>
      <category>거리측정</category>
      <category>센서프로젝트</category>
      <category>아두이노</category>
      <category>전자공작</category>
      <category>초음파센서</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/172</guid>
      <comments>https://ythouse.tistory.com/172#entry172comment</comments>
      <pubDate>Sat, 19 Apr 2025 17:16:35 +0900</pubDate>
    </item>
    <item>
      <title>아두이노와 앱의 양방향 통신 &amp;mdash; 설정값을 앱에서 전송하고, 센서로 조건 판단하기</title>
      <link>https://ythouse.tistory.com/171</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  아두이노와 앱의 양방향 통신 — 설정값을 앱에서 전송하고, 센서로 조건 판단하기&lt;/h2&gt;

&lt;p&gt;이번 실습에서는 스마트폰 앱에서 사용자가 입력한 **임계 온도값**을  
&lt;strong&gt;아두이노로 전송&lt;/strong하고,  
&lt;strong&gt;DHT11 센서로 측정된 온도와 비교하여 자동 제어&lt;/strong&gt;하는 구조를 구성합니다.&lt;/p&gt;

&lt;p&gt;이것이 바로 **IoT의 핵심 구조** 중 하나인 &lt;strong&gt;양방향 통신&lt;/strong&gt;입니다.  
센서 데이터를 보는 것뿐만 아니라, 사용자 입력을 받아 **제어 기준을 실시간으로 반영**하는 것이죠.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;아두이노 UNO 또는 Nano&lt;/li&gt;
  &lt;li&gt;DHT11 온습도 센서&lt;/li&gt;
  &lt;li&gt;HC-06 블루투스 모듈&lt;/li&gt;
  &lt;li&gt;앱 인벤터로 제작한 앱&lt;/li&gt;
  &lt;li&gt;LED (또는 부저)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  연결 구성&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;DHT11 DATA → D2&lt;/li&gt;
  &lt;li&gt;HC-06 TX → RX, RX → TX&lt;/li&gt;
  &lt;li&gt;LED → D8 (경고 출력용)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  아두이노 코드: 앱에서 기준 온도 입력 → 자동 판단&lt;/h3&gt;

&lt;pre&gt;
#include &amp;lt;DHT.h&amp;gt;

#define DHTPIN 2
#define DHTTYPE DHT11
#define LEDPIN 8

DHT dht(DHTPIN, DHTTYPE);
String input = &quot;&quot;;
float threshold = 30.0;

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(LEDPIN, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == '\n') {
      threshold = input.toFloat();
      Serial.print(&quot;기준 온도 변경: &quot;);
      Serial.println(threshold);
      input = &quot;&quot;;
    } else {
      input += c;
    }
  }

  float temp = dht.readTemperature();
  if (!isnan(temp)) {
    Serial.print(&quot;현재온도: &quot;);
    Serial.println(temp);

    if (temp &gt;= threshold) {
      digitalWrite(LEDPIN, HIGH);
    } else {
      digitalWrite(LEDPIN, LOW);
    }
  }

  delay(2000);
}
&lt;/pre&gt;

&lt;h3&gt;  앱 구성: 사용자 입력값 전송&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;TextBox + Button&lt;/strong&gt;: 숫자 입력 후 &quot;\n&quot; 붙여 전송&lt;/li&gt;
  &lt;li&gt;예: “31\n” → 아두이노가 기준 온도 31도로 변경&lt;/li&gt;
  &lt;li&gt;BluetoothClient.SendText 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  구조 흐름&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;앱에서 임계값(예: 30.5)을 입력하고 전송&lt;/li&gt;
  &lt;li&gt;아두이노가 문자열을 받아 &lt;code&gt;float&lt;/code&gt;으로 파싱&lt;/li&gt;
  &lt;li&gt;DHT11 센서값과 비교 → 조건 만족 시 LED ON&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 실습 확인 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;앱에서 &quot;28&quot; 입력 → 기준온도 28도 설정&lt;/li&gt;
  &lt;li&gt;DHT11 값이 28도 이상 → LED 켜짐&lt;/li&gt;
  &lt;li&gt;기준값 바꾸면 바로 반영됨 → 실시간 반응 확인!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 아두이노와 스마트폰이 단방향이 아닌  
&lt;strong&gt;양방향 통신 구조&lt;/strong&gt;를 갖춘 IoT 시스템을 구현해봤습니다.&lt;/p&gt;

&lt;p&gt;이 구조를 활용하면 사용자가 앱에서 직접 제어값을 입력하고,  
센서 데이터를 실시간으로 판단해 제어하는 똑똑한 환경 시스템을 만들 수 있습니다.&lt;/p&gt;

&lt;p&gt;다음 편에서는 이 데이터를 &lt;strong&gt;ESP8266이나 SD 카드에 저장&lt;/strong하거나,  
&lt;strong&gt;웹서버 연동&lt;/strong도 진행할 수 있어요. IoT의 진짜 실전 단계입니다  &lt;/p&gt;</description>
      <category>아두이노</category>
      <category>appinventor</category>
      <category>arduinobluetooth</category>
      <category>DHT11</category>
      <category>HC06</category>
      <category>iot기초</category>
      <category>블루투스제어</category>
      <category>센서조건제어</category>
      <category>스마트폰앱</category>
      <category>아두이노</category>
      <category>양방향통신</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/171</guid>
      <comments>https://ythouse.tistory.com/171#entry171comment</comments>
      <pubDate>Fri, 18 Apr 2025 08:08:57 +0900</pubDate>
    </item>
    <item>
      <title>아두이노로 온습도 측정 시스템 만들기 &amp;ndash; DHT11 센서 완전 정복</title>
      <link>https://ythouse.tistory.com/169</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;아두이노로 온습도 측정 시스템 만들기 &amp;ndash; DHT11 센서 완전 정복&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날씨가 변덕스러운 요즘, 실내 환경을 스스로 관리하고 싶다는 생각, 해보셨나요? DHT11 센서를 활용하면 아두이노로 손쉽게 온도와 습도를 측정하고, 이를 다양한 방식으로 출력하거나 전송할 수 있습니다. 이 글에서는 DHT11을 중심으로 아두이노와 연결하여 온습도 데이터를 측정, 출력, 응용하는 방법까지 단계별로 안내합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. DHT11 센서란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DHT11은 저가형 온습도 센서로, 온도(0&lt;s&gt;50도)와 습도(20&lt;/s&gt;90%)를 측정할 수 있으며, 디지털 신호로 값을 전달합니다. 3핀 또는 4핀 모델이 있으며, 5V 전원과 GND, 그리고 데이터 핀으로 구성되어 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 준비물 리스트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아두이노 UNO 또는 Nano&lt;/li&gt;
&lt;li&gt;DHT11 온습도 센서&lt;/li&gt;
&lt;li&gt;점퍼선&lt;/li&gt;
&lt;li&gt;브레드보드&lt;/li&gt;
&lt;li&gt;(선택) 16x2 LCD, 블루투스(HC-06), OLED&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 회로 연결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DHT11 핀 연결 대상&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&gt;VCC&lt;/td&gt;
&lt;td&gt;5V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATA&lt;/td&gt;
&lt;td&gt;D2 (예시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 코드 작성 및 설명&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;DHT.h&amp;gt;

#define DHTPIN 2     // DHT 데이터 핀 연결
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
  Serial.println(&quot;DHT11 센서 시작...&quot;);
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println(&quot;센서 읽기 실패&quot;);
    return;
  }

  Serial.print(&quot;온도: &quot;);
  Serial.print(t);
  Serial.print(&quot; *C\t습도: &quot;);
  Serial.print(h);
  Serial.println(&quot; %&quot;);

  delay(2000);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 시리얼 모니터를 통해 2초마다 온도와 습도를 출력하는 기본 예제입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;text-align:center; margin: 20px 0;&quot;&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;
       (adsbygoogle = window.adsbygoogle || []).push({});
  &lt;/script&gt;
&lt;/div&gt;

&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 출력 방식 확장&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;a. LCD로 출력하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I2C 방식의 LCD를 사용하면 연결 핀 수를 줄일 수 있어 간단합니다. LiquidCrystal_I2C 라이브러리를 사용하며, 기본 회로에 LCD를 추가로 연결합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;b. OLED 출력&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 세련된 디스플레이를 원한다면 0.96&quot; OLED 디스플레이(SPI 또는 I2C)를 사용할 수 있습니다. Adafruit_SSD1306 라이브러리가 필요합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;c. 스마트폰으로 전송 (HC-06 블루투스)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SoftwareSerial을 이용해 HC-06 모듈로 데이터를 전송하면 스마트폰 앱에서 실시간으로 확인할 수 있습니다. 이 경우 블루투스 통신 속도는 9600bps로 맞추어야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 활용 아이디어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환기 시스템 자동화 (온도/습도 기준 팬 제어)&lt;/li&gt;
&lt;li&gt;실내 공기질 모니터링 시스템&lt;/li&gt;
&lt;li&gt;어린이방/반려동물 공간 온습도 관리&lt;/li&gt;
&lt;li&gt;스마트홈 IoT 기초 프로젝트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 주의사항 및 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DHT11은 반응 속도가 느리고 정밀도가 낮기 때문에, 더 정밀한 용도에는 DHT22를 고려하세요.&lt;/li&gt;
&lt;li&gt;센서 데이터가 NaN일 경우 전원이나 연결상태를 점검하세요.&lt;/li&gt;
&lt;li&gt;실내외 환경 차이에 따라 센서 반응이 달라질 수 있으니, 실사용 위치에서 일정 시간 켜두고 안정화 후 사용하는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;text-align:center; margin: 20px 0;&quot;&gt;
  &lt;ins class=&quot;adsbygoogle&quot;
       style=&quot;display:block&quot;
       data-ad-client=&quot;ca-pub-8362837465904837&quot;
       data-ad-slot=&quot;5674748480&quot;
       data-ad-format=&quot;auto&quot;
       data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
  &lt;script&gt;
       (adsbygoogle = window.adsbygoogle || []).push({});
  &lt;/script&gt;
&lt;/div&gt;

&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DHT11을 활용한 온습도 측정 시스템은 입문자에게 매우 적합한 프로젝트입니다. 단순히 온도를 측정하는 것을 넘어서, 다양한 디스플레이나 무선 통신 모듈과의 연계를 통해 충분히 확장 가능한 기초 인프라가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여러분도 직접 실내 환경을 제어할 수 있는 기초 시스템을 구성해보세요. 다음 글에서는 DHT11 데이터를 웹으로 전송하거나, 로깅하는 방법도 다뤄볼 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함께 성장하는 아두이노 블로그, 다음 편에서 또 만나요!&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>arduino</category>
      <category>DHT11</category>
      <category>dht센서사용법</category>
      <category>센서연결</category>
      <category>습도센서</category>
      <category>시리얼모니터</category>
      <category>아두이노</category>
      <category>아두이노기초</category>
      <category>온도센서</category>
      <category>온습도센서</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/169</guid>
      <comments>https://ythouse.tistory.com/169#entry169comment</comments>
      <pubDate>Fri, 18 Apr 2025 08:04:28 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision10편: DHT11 센서로 온도/습도 측정 &amp;rarr; LCD에 출력하기</title>
      <link>https://ythouse.tistory.com/168</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt; ️ A31G123ML + Keil uVision — DHT11 온습도 센서 출력하기&lt;/h2&gt;

&lt;p&gt;이번 편에서는 &lt;strong&gt;DHT11 디지털 온습도 센서&lt;/strong&gt;를 이용해  
온도와 습도 데이터를 측정하고,  
&lt;strong&gt;LCD에 실시간으로 출력&lt;/strong하는 환경 모니터링 시스템을 구성해봅니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;DHT11 온습도 센서&lt;/li&gt;
  &lt;li&gt;16x2 HD44780 캐릭터 LCD&lt;/li&gt;
  &lt;li&gt;10kΩ 풀업 저항&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  회로 연결&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;DHT11 DATA → P2.2&lt;/li&gt;
  &lt;li&gt;VCC → 5V / GND → GND&lt;/li&gt;
  &lt;li&gt;LCD → P1.0~P1.5 (4-bit 모드)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: DHT11 읽고 LCD에 출력&lt;/h3&gt;

&lt;pre&gt;
// dht11.h, lcd.h 포함
#include &quot;A31G123.h&quot;
#include &quot;dht11.h&quot;
#include &quot;lcd.h&quot;
#include &lt;stdio.h&gt;

char buffer[20];

int main(void)
{
    lcd_init();
    dht11_init();

    while (1) {
        uint8_t temp = 0, hum = 0;

        if (dht11_read(&amp;temp, &amp;hum) == 0) {
            lcd_gotoxy(0, 0);
            sprintf(buffer, &quot;Temp: %d C&quot;, temp);
            lcd_puts(buffer);

            lcd_gotoxy(0, 1);
            sprintf(buffer, &quot;Humi: %d %%&quot;, hum);
            lcd_puts(buffer);
        } else {
            lcd_gotoxy(0, 0);
            lcd_puts(&quot;DHT11 Error    &quot;);
        }

        for (volatile int i = 0; i &lt; 1000000; i++);
    }
}
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;dht11.c&lt;/strong&gt; 파일은 타이밍 제어 기반으로  
1-wire 프로토콜을 구현해줘야 해요. 타이머/비트 처리 필요.&lt;/p&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 확인 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;DHT11 값 정상 수신 시, LCD에 온도/습도 출력&lt;/li&gt;
  &lt;li&gt;수신 실패 시 &quot;DHT11 Error&quot; 출력&lt;/li&gt;
  &lt;li&gt;1초 간격으로 화면 갱신&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 &lt;strong&gt;디지털 환경 센서(DHT11)를 MCU에 연동&lt;/strong&gt;하고,  
&lt;strong&gt;LCD로 실시간 상태를 시각화&lt;/strong&gt;하는 실습을 해보았습니다.&lt;br&gt;
다음은 이 데이터를 &lt;strong&gt;조건에 따라 알림/제어&lt;/strong하거나  
&lt;strong&gt;UART, 블루투스, WiFi 연동&lt;/strong으로 발전시킬 수 있어요  &lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>cortexm0</category>
      <category>DHT11</category>
      <category>keil</category>
      <category>lcd디스플레이</category>
      <category>lcd출력</category>
      <category>mcu센서</category>
      <category>온습도센서</category>
      <category>환경센서</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/168</guid>
      <comments>https://ythouse.tistory.com/168#entry168comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:55:42 +0900</pubDate>
    </item>
    <item>
      <title>캐릭터 LCD로 메뉴 전환하기 &amp;mdash; 버튼으로 UI 구성</title>
      <link>https://ythouse.tistory.com/167</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  캐릭터 LCD로 메뉴 전환하기 — 버튼 UI 구성&lt;/h2&gt;

&lt;p&gt;이번 실습에서는 버튼을 누를 때마다  
&lt;strong&gt;LCD 화면의 내용을 순차적으로 변경&lt;/strong&gt;하는 메뉴 시스템을 구현해봅니다.&lt;/p&gt;

&lt;p&gt;이런 방식은 &lt;strong&gt;간단한 디바이스 UI 구성&lt;/strong&gt;에 자주 사용되는 기초 구조입니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;16x2 캐릭터 LCD (HD44780)&lt;/li&gt;
  &lt;li&gt;푸시버튼 1개&lt;/li&gt;
  &lt;li&gt;10kΩ 풀다운 저항&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  핀 연결&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;LCD: RS~D7 → P1.0 ~ P1.5&lt;/li&gt;
  &lt;li&gt;버튼: P2.1 (입력)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: 버튼으로 메뉴 순환&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;
#include &quot;lcd.h&quot;

volatile int menu = 0;

void delay_ms(int ms) {
    for (volatile int i = 0; i &lt; ms * 800; i++);
}

void lcd_show_menu(int index) {
    lcd_clear();
    switch (index) {
        case 0: lcd_puts(&quot;  Temp Display&quot;); break;
        case 1: lcd_puts(&quot;  Brightness View&quot;); break;
        case 2: lcd_puts(&quot;  System Info&quot;); break;
    }
}

int main(void)
{
    lcd_init();

    PORT2-&gt;MODE &amp;= ~(1 &lt;&lt; 1);     // P2.1 입력
    PORT2-&gt;PULLUP |= (1 &lt;&lt; 1);    // 풀업 (또는 외부 풀다운)

    lcd_show_menu(menu);

    while (1) {
        if (!(PORT2-&gt;IN &amp; (1 &lt;&lt; 1))) { // 버튼 눌림 (Low)
            menu = (menu + 1) % 3;
            lcd_show_menu(menu);
            delay_ms(300); // 디바운싱
        }
    }
}
&lt;/pre&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 확인 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;버튼 누를 때마다 LCD 화면 전환&lt;/li&gt;
  &lt;li&gt;3개 메뉴 순환: 온도, 밝기, 시스템 정보&lt;/li&gt;
  &lt;li&gt;향후 각 메뉴에 기능 연동 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이제 &lt;strong&gt;버튼 기반 LCD 메뉴 시스템&lt;/strong&gt;을 구현할 수 있게 되었어요.&lt;br&gt;
다음은 각 메뉴에 &lt;strong&gt;센서 연동&lt;/strong&gt; 또는 &lt;strong&gt;설정 조절&lt;/strong 기능을 추가해  
진짜 UI 구조로 발전시켜볼 수 있습니다  &lt;/p&gt;</description>
      <category>ARM</category>
      <category>ABOV</category>
      <category>hd44780</category>
      <category>keil</category>
      <category>lcd메뉴</category>
      <category>lcd인터페이스</category>
      <category>lcd화면전환</category>
      <category>mcu입출력</category>
      <category>메뉴구성</category>
      <category>버튼UI</category>
      <category>임베디드UI</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/167</guid>
      <comments>https://ythouse.tistory.com/167#entry167comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:55:10 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision : 센서값을 캐릭터 LCD에 실시간 출력하기 &amp;mdash; ADC + LCD 통합</title>
      <link>https://ythouse.tistory.com/166</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  A31G123ML + Keil uVision — 센서값을 LCD에 실시간 출력하기&lt;/h2&gt;

&lt;p&gt;이번 실습에서는 이전에 구현했던 &lt;strong&gt;ADC(센서값 읽기)&lt;/strong&gt;와  
&lt;strong&gt;LCD 출력&lt;/strong&gt;을 결합하여,  
센서 데이터를 &lt;strong&gt;실시간으로 캐릭터 LCD에 표시&lt;/strong&gt;하는 시스템을 만들어봅니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;16x2 HD44780 캐릭터 LCD&lt;/li&gt;
  &lt;li&gt;가변저항 또는 조도센서 (ADC 입력)&lt;/li&gt;
  &lt;li&gt;브레드보드, 점퍼선&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  회로 연결&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;LCD: RS~D7 → P1.0~1.5 (이전 편과 동일)&lt;/li&gt;
  &lt;li&gt;센서 출력 → AIN0 (P2.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: ADC + LCD&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;
#include &quot;lcd.h&quot;
#include &lt;stdio.h&gt;

void adc_init(void) {
    SYSCON-&gt;SYSAHBCLKCTRL |= (1 &lt;&lt; 24); // ADC CLK enable
    ADC-&gt;CR = (1 &lt;&lt; 0);                 // AIN0 선택
    ADC-&gt;CTRL = (1 &lt;&lt; 0);               // ADC Enable
}

uint16_t adc_read(void) {
    ADC-&gt;CR |= (1 &lt;&lt; 24);               // Start conversion
    while (!(ADC-&gt;STAT &amp; 0x01));        // Wait for DONE
    return ADC-&gt;DR &amp; 0x3FF;             // 10-bit result
}

char buffer[20];

int main(void)
{
    lcd_init();
    adc_init();

    while (1) {
        uint16_t val = adc_read();
        sprintf(buffer, &quot;ADC: %4d     &quot;, val);

        lcd_gotoxy(0, 0);
        lcd_puts(&quot;Sensor Reading:&quot;);
        lcd_gotoxy(0, 1);
        lcd_puts(buffer);

        for (volatile int i = 0; i &lt; 500000; i++); // 간단한 딜레이
    }
}
&lt;/pre&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 확인 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;LCD에 &quot;Sensor Reading:&quot; 고정 출력&lt;/li&gt;
  &lt;li&gt;두 번째 줄에 ADC 값 실시간 출력&lt;/li&gt;
  &lt;li&gt;가변저항을 돌리거나 조도 변화에 따라 숫자 반응&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 &lt;strong&gt;센서 입력과 LCD 출력의 통합&lt;/strong&gt;을 통해  
실시간 데이터 시각화 장치를 구성했습니다.&lt;br&gt;
다음은 버튼이나 UART 입력을 이용해  
&lt;strong&gt;LCD 메뉴 전환&lt;/strong 기능을 구현해볼 수 있어요!  &lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>ADC</category>
      <category>hd44780</category>
      <category>keil</category>
      <category>lcd디스플레이</category>
      <category>lcd센서출력</category>
      <category>lcd제어</category>
      <category>mcu센서표시</category>
      <category>실시간데이터표시</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/166</guid>
      <comments>https://ythouse.tistory.com/166#entry166comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:54:21 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision : 캐릭터 LCD (HD44780)로 문자 출력하기</title>
      <link>https://ythouse.tistory.com/165</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt; ️ A31G123ML + Keil uVision — 캐릭터 LCD(HD44780) 출력하기&lt;/h2&gt;

&lt;p&gt;이번 편에서는 ABOV A31G123ML MCU를 사용하여  
16x2 캐릭터 LCD에 텍스트를 출력해보겠습니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HD44780 기반 LCD는 병렬 방식&lt;/strong&gt;으로 작동하며,  
간단한 UI를 구현할 때 매우 유용하게 활용됩니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;16x2 캐릭터 LCD (HD44780 호환)&lt;/li&gt;
  &lt;li&gt;10kΩ 가변저항 (밝기 조절)&lt;/li&gt;
  &lt;li&gt;브레드보드, 점퍼선&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  핀 연결 (4-bit 모드)&lt;/h3&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;LCD 핀&lt;/th&gt;&lt;th&gt;MCU 핀&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RS&lt;/td&gt;&lt;td&gt;P1.0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;EN&lt;/td&gt;&lt;td&gt;P1.1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;D4~D7&lt;/td&gt;&lt;td&gt;P1.2 ~ P1.5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RW&lt;/td&gt;&lt;td&gt;GND (쓰기전용)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;VSS&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;VDD&lt;/td&gt;&lt;td&gt;5V&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;VO&lt;/td&gt;&lt;td&gt;가변저항 중간핀&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: Hello LCD 출력&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;
#include &quot;lcd.h&quot;

int main(void)
{
    lcd_init();  // LCD 초기화
    lcd_clear();
    lcd_gotoxy(0, 0);
    lcd_puts(&quot;A31G123ML Ready&quot;);
    lcd_gotoxy(0, 1);
    lcd_puts(&quot;Hello LCD!&quot;);

    while (1);
}
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;※ lcd.h / lcd.c&lt;/strong&gt;는 직접 구현하거나 오픈소스를 사용해도 됩니다.&lt;/p&gt;

&lt;h4&gt;  예시: lcd.h에 들어갈 함수들&lt;/h4&gt;
```c
void lcd_init(void);
void lcd_clear(void);
void lcd_gotoxy(uint8_t x, uint8_t y);
void lcd_puts(const char *str);</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>cortexm0</category>
      <category>hd44780</category>
      <category>keil</category>
      <category>lcd제어</category>
      <category>lcd출력</category>
      <category>mcu디스플레이</category>
      <category>임베디드lcd</category>
      <category>캐릭터LCD</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/165</guid>
      <comments>https://ythouse.tistory.com/165#entry165comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:53:04 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision : PWM 출력으로 LED 밝기/부저 음 조절하기 &amp;mdash; TIMER16 활용</title>
      <link>https://ythouse.tistory.com/164</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  A31G123ML + Keil uVision — PWM으로 LED 밝기 &amp; 부저 제어하기&lt;/h2&gt;

&lt;p&gt;이번 실습에서는 ABOV A31G123ML의 &lt;strong&gt;TIMER16&lt;/strong&gt;을 이용하여  
&lt;strong&gt;PWM(Pulse Width Modulation) 신호&lt;/strong&gt;를 생성하고,  
LED 밝기 조절이나 부저 음 조절에 활용해보겠습니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;LED or 부저 (Passive)&lt;/li&gt;
  &lt;li&gt;220Ω 저항 (LED)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  회로 연결&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;P1.0 → LED(애노드) → 220Ω → GND&lt;/li&gt;
  &lt;li&gt;혹은 부저 + GND 연결 (PWM 제어 가능)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: PWM 듀티 변경&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;

void pwm_init(void)
{
    // P1.0 = TIMER16_0 PWM 출력
    PORT1-&gt;MODE |= (1 &lt;&lt; 0);
    PORT1-&gt;OUTEN |= (1 &lt;&lt; 0);
    PORT1-&gt;AFSR1 |= (1 &lt;&lt; 0);  // ALT func
    PORT1-&gt;AFSR2 &amp;= ~(1 &lt;&lt; 0);

    SYSCON-&gt;SYSAHBCLKCTRL |= (1 &lt;&lt; 7); // Timer16_0 enable

    TIMER16_0-&gt;TCR = 0x02;    // Reset
    TIMER16_0-&gt;PR = 0;        // Prescaler
    TIMER16_0-&gt;MR0 = 1000;    // 주기 (PWM 주기)
    TIMER16_0-&gt;MR1 = 300;     // 듀티비 (30%)
    TIMER16_0-&gt;MCR = (1 &lt;&lt; 1); // Reset on MR0
    TIMER16_0-&gt;EMR = (1 &lt;&lt; 6) | (3 &lt;&lt; 4); // PWM mode on MR1
    TIMER16_0-&gt;PWMC = (1 &lt;&lt; 1); // PWM enable on MR1

    TIMER16_0-&gt;TCR = 0x01;    // Enable
}
int main(void)
{
    pwm_init();
    while (1) {
        // 딜레이 없이 PWM 자동 출력 중
    }
}
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;MR1 값을 조절&lt;/strong&gt;하면 밝기나 음 높이를 바꿀 수 있어요.&lt;br&gt;
ex) &lt;code&gt;MR1 = 900;&lt;/code&gt; → 밝게 / &lt;code&gt;MR1 = 100;&lt;/code&gt; → 어둡게&lt;/p&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 확인 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;LED 밝기 또는 부저 음 높이가 조절됨&lt;/li&gt;
  &lt;li&gt;MR0 = 전체 주기, MR1 = 듀티(ON 시간)&lt;/li&gt;
  &lt;li&gt;MR1 값 바꿔서 실시간 밝기 변화 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 실습에서는 A31G123ML의 &lt;strong&gt;TIMER16을 이용한 PWM 출력&lt;/strong&gt;을 배워봤습니다.&lt;br&gt;
다음은 이 PWM 신호를 센서값에 따라 자동 조정하거나,  
&lt;strong&gt;LCD/OLED 등 출력 장치와 결합&lt;/strong해서 더 복잡한 UI도 만들 수 있어요!&lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>keil</category>
      <category>led밝기조절</category>
      <category>mcu개발</category>
      <category>pwm출력</category>
      <category>timer16</category>
      <category>부저제어</category>
      <category>임베디드강좌</category>
      <category>타이머pwm</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/164</guid>
      <comments>https://ythouse.tistory.com/164#entry164comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:52:27 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision : ADC로 아날로그 센서값 읽기 &amp;mdash; 가변저항/조도센서 측정</title>
      <link>https://ythouse.tistory.com/163</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  A31G123ML + Keil uVision — ADC로 아날로그 센서값 읽기&lt;/h2&gt;

&lt;p&gt;이번 편에서는 ABOV A31G123ML의 &lt;strong&gt;내장 ADC&lt;/strong&gt;를 활용해  
가변저항이나 조도센서(LDR) 등의 &lt;strong&gt;아날로그 입력값을 읽고&lt;/strong&gt;,  
그 결과를 &lt;strong&gt;UART로 시리얼 출력&lt;/strong&gt;하는 실습을 진행합니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;가변저항 또는 LDR 조도센서&lt;/li&gt;
  &lt;li&gt;10kΩ 저항&lt;/li&gt;
  &lt;li&gt;USB to UART 모듈&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  회로 연결&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;센서 출력 → AIN0 (P2.0)&lt;/li&gt;
  &lt;li&gt;GND → 센서 하단&lt;/li&gt;
  &lt;li&gt;5V → 센서 상단&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: ADC 값 읽고 UART로 출력&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;

void uart_send(char c) {
    while (!(UART1-&gt;STAT &amp; (1 &lt;&lt; 1)));
    UART1-&gt;TXD = c;
}

void uart_print(const char* str) {
    while (*str) uart_send(*str++);
}

void uart_print_num(uint16_t value) {
    char buf[10];
    sprintf(buf, &quot;%d\r\n&quot;, value);
    uart_print(buf);
}

void uart_init(void) {
    SYSCON-&gt;SYSAHBCLKCTRL |= (1 &lt;&lt; 12);
    UART1-&gt;BAUD = 52;
    UART1-&gt;CTRL = (1 &lt;&lt; 0) | (1 &lt;&lt; 2);
}

void adc_init(void) {
    SYSCON-&gt;SYSAHBCLKCTRL |= (1 &lt;&lt; 24); // ADC CLK enable
    ADC-&gt;CR = (1 &lt;&lt; 0);                 // AIN0 선택
    ADC-&gt;CTRL = (1 &lt;&lt; 0);               // Enable ADC
}

uint16_t adc_read(void) {
    ADC-&gt;CR |= (1 &lt;&lt; 24); // Start
    while (!(ADC-&gt;STAT &amp; (1 &lt;&lt; 0))); // 완료 대기
    return ADC-&gt;DR &amp; 0x3FF; // 10비트 결과
}

int main(void) {
    uart_init();
    adc_init();

    while (1) {
        uint16_t value = adc_read();
        uart_print(&quot;ADC Value: &quot;);
        uart_print_num(value);
        for (volatile int i = 0; i &lt; 800000; i++);
    }
}
&lt;/pre&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 결과 확인&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;터미널(9600bps)에서 &quot;ADC Value: xxxx&quot; 형태로 출력됨&lt;/li&gt;
  &lt;li&gt;조도 변화 or 가변저항 회전에 따라 값이 변화함&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 &lt;strong&gt;ADC를 사용하여 센서값을 측정하고&lt;/strong&gt;,  
이를 &lt;strong&gt;UART로 실시간 출력&lt;/strong&gt;하는 흐름을 익혔습니다.&lt;br&gt;
다음은 이 값을 &lt;strong&gt;기준값과 비교해 동작 제어&lt;/strong&gt;하거나,  
&lt;strong&gt;PWM 출력으로 응용&lt;/strong하는 실습으로 이어질 수 있어요!&lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>ADC</category>
      <category>cortexm0</category>
      <category>keil</category>
      <category>mcuadc</category>
      <category>가변저항</category>
      <category>센서읽기</category>
      <category>아날로그입력</category>
      <category>조도센서</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/163</guid>
      <comments>https://ythouse.tistory.com/163#entry163comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:51:52 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision : UART 통신으로 PC와 시리얼 데이터 주고받기</title>
      <link>https://ythouse.tistory.com/162</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  A31G123ML + Keil uVision — UART로 시리얼 통신하기&lt;/h2&gt;

&lt;p&gt;이번 편에서는 ABOV A31G123ML MCU를 사용해  
&lt;strong&gt;UART 시리얼 통신&lt;/strong&gt;을 구현하고,  
PC의 시리얼 터미널과 데이터를 주고받는 예제를 실습해봅니다.&lt;/p&gt;

&lt;p&gt;UART는 MCU와 외부 장치(PC, 모듈 등)를 연결하는 가장 기본적인 통신 방식입니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;USB to UART (FTDI, CP210x 등)&lt;/li&gt;
  &lt;li&gt;시리얼 터미널 (TeraTerm, RealTerm, PuTTY 등)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  연결 방법&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;TX(P1.4) → USB-UART RX&lt;/li&gt;
  &lt;li&gt;RX(P1.5) → USB-UART TX&lt;/li&gt;
  &lt;li&gt;GND → GND&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: &quot;Hello UART!&quot; 출력&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;

void uart_init(void) {
    // P1.4 → TXD, P1.5 → RXD 설정
    PORT1-&gt;MODE |= (1 &lt;&lt; 4);       // P1.4 출력
    PORT1-&gt;OUTEN |= (1 &lt;&lt; 4);      // Push-pull
    PORT1-&gt;AFSR1 |= (1 &lt;&lt; 4);      // ALT func
    PORT1-&gt;AFSR2 &amp;= ~(1 &lt;&lt; 4);

    PORT1-&gt;AFSR1 |= (1 &lt;&lt; 5);      // RX
    PORT1-&gt;AFSR2 &amp;= ~(1 &lt;&lt; 5);

    // Clock enable
    SYSCON-&gt;SYSAHBCLKCTRL |= (1 &lt;&lt; 12); // UARTCLK

    UART1-&gt;BAUD = 52;  // 9600bps (8MHz 기준)
    UART1-&gt;CTRL = (1 &lt;&lt; 0) | (1 &lt;&lt; 2); // TXEN + RXEN
}

void uart_send(char c) {
    while (!(UART1-&gt;STAT &amp; (1 &lt;&lt; 1))); // TXRDY
    UART1-&gt;TXD = c;
}

void uart_print(const char* str) {
    while (*str) {
        uart_send(*str++);
    }
}

int main(void) {
    uart_init();

    while (1) {
        uart_print(&quot;Hello UART!\r\n&quot;);
        for (volatile int i = 0; i &lt; 800000; i++); // 약 0.5초 딜레이
    }
}
&lt;/pre&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 결과 확인&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;터미널 실행 → COM 포트 연결 (9600bps)&lt;/li&gt;
  &lt;li&gt;주기적으로 &quot;Hello UART!&quot; 문자열 출력&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 A31G123ML의 UART를 직접 초기화하고  
시리얼 데이터를 전송하는 방법을 실습했습니다.&lt;br&gt;
다음 편에서는 UART로 &lt;strong&gt;데이터 수신 → 조건 동작&lt;/strong&gt;도 확장해볼 수 있어요  &lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>cortexm0</category>
      <category>keil</category>
      <category>mcu통신</category>
      <category>uart통신</category>
      <category>USART</category>
      <category>시리얼통신</category>
      <category>터미널출력</category>
      <category>펌웨어개발</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/162</guid>
      <comments>https://ythouse.tistory.com/162#entry162comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:51:15 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision : 외부 인터럽트로 버튼 누르기 &amp;mdash; EXINT 설정과 토글 제어</title>
      <link>https://ythouse.tistory.com/161</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  A31G123ML + Keil uVision — 외부 인터럽트로 버튼 누르기&lt;/h2&gt;

&lt;p&gt;이번 실습에서는 &lt;strong&gt;버튼을 누르면 인터럽트가 발생&lt;/strong&gt;하고,  
그에 따라 &lt;strong&gt;LED가 토글되는 구조&lt;/strong&gt;를 구성해보겠습니다.&lt;/p&gt;

&lt;p&gt;이는 &lt;strong&gt;CPU가 대기 없이 이벤트에 반응하는 구조&lt;/strong&gt;이기 때문에,  
실시간 시스템 개발에 매우 중요합니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;푸시버튼 1개&lt;/li&gt;
  &lt;li&gt;LED 1개&lt;/li&gt;
  &lt;li&gt;풀다운 저항 (10kΩ)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  회로 연결&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;버튼: P1.0 (입력 핀) → 5V / GND → 풀다운&lt;/li&gt;
  &lt;li&gt;LED: P0.0 (출력 핀)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: 버튼 누르면 LED 토글&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;

volatile uint8_t led_state = 0;

void EXINT0_IRQHandler(void)
{
    if (EXINT-&gt;PEND &amp; (1 &lt;&lt; 0)) {
        EXINT-&gt;PEND = (1 &lt;&lt; 0); // 인터럽트 플래그 클리어
        led_state ^= 1;
        if (led_state)
            PORT0-&gt;OUT |= (1 &lt;&lt; 0);
        else
            PORT0-&gt;OUT &amp;= ~(1 &lt;&lt; 0);
    }
}

void exint0_init(void)
{
    PORT1-&gt;MODE &amp;= ~(1 &lt;&lt; 0);     // P1.0 입력
    PORT1-&gt;PULLUP |= (1 &lt;&lt; 0);    // 내부 풀업 사용 가능 (또는 외부 풀다운)
    EXINT-&gt;CFG &amp;= ~(0x03 &lt;&lt; 0);   // Falling edge
    EXINT-&gt;MASK |= (1 &lt;&lt; 0);      // Mask 해제
    EXINT-&gt;PEND = (1 &lt;&lt; 0);       // Pending clear
    NVIC_EnableIRQ(EXINT0_IRQn);  // NVIC 활성화
}

int main(void)
{
    PORT0-&gt;MODE |= (1 &lt;&lt; 0);   // P0.0 출력
    PORT0-&gt;OUTEN |= (1 &lt;&lt; 0);  // Push-pull
    PORT0-&gt;OUT &amp;= ~(1 &lt;&lt; 0);   // 초기값 OFF

    exint0_init();

    while (1) {
        // 메인 루프는 아무 것도 하지 않음 (인터럽트만 사용)
    }
}
&lt;/pre&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 확인 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;버튼을 누를 때마다 LED가 토글됨&lt;/li&gt;
  &lt;li&gt;main 루프는 대기 없이 인터럽트만으로 동작&lt;/li&gt;
  &lt;li&gt;EXINT 설정에 따라 rising/falling edge 전환 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 &lt;strong&gt;외부 입력 이벤트에 반응하는 인터럽트 기반 구조&lt;/strong&gt;를 실습했습니다.&lt;br&gt;
다음 편에서는 &lt;strong&gt;UART 시리얼 통신&lt;/strong&gt;으로 PC와 메시지를 주고받아보겠습니다  &lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>cortexm0</category>
      <category>exint</category>
      <category>keil</category>
      <category>버튼입력</category>
      <category>외부인터럽트</category>
      <category>인터럽트실습</category>
      <category>임베디드강좌</category>
      <category>펌웨어개발</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/161</guid>
      <comments>https://ythouse.tistory.com/161#entry161comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:50:32 +0900</pubDate>
    </item>
    <item>
      <title>A31G123ML + Keil uVision - 타이머를 이용한 정밀 딜레이 만들기</title>
      <link>https://ythouse.tistory.com/160</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;⏱️ ABOV A31G123ML 타이머로 정밀 딜레이 만들기&lt;/h2&gt;

&lt;p&gt;이전 편에서는 &lt;strong&gt;소프트웨어 루프를 이용한 단순 딜레이&lt;/strong&gt;를 구현했었죠.&lt;br&gt;
이번에는 ABOV A31G123의 &lt;strong&gt;16비트 타이머(TIMER16)&lt;/strong&gt;를 사용해  
&lt;strong&gt;1ms 정밀 타이머 기반 딜레이 함수&lt;/strong&gt;를 만들어볼 거예요.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML MCU 보드&lt;/li&gt;
  &lt;li&gt;Keil uVision5 개발환경&lt;/li&gt;
  &lt;li&gt;ABOV CMSIS Device Pack&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  타이머 기본 개념&lt;/h3&gt;
&lt;p&gt;타이머는 내부 클럭을 이용해 일정 주기마다 값을 증가시키는 하드웨어입니다.&lt;br&gt;
우리는 이걸 &lt;strong&gt;1ms 단위 인터럽트 발생&lt;/strong&gt;용으로 구성할 거예요.&lt;/p&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  코드 예시: Timer16 기반 1ms 딜레이&lt;/h3&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;

volatile uint32_t tick = 0;

void TIMER16_0_IRQHandler(void)
{
    if (TIMER16_0-&gt;INTFLAGS &amp; 0x01) {
        TIMER16_0-&gt;INTFLAGS = 0x01; // clear match flag
        tick++; // 1ms 증가
    }
}

void delay_ms(uint32_t ms)
{
    tick = 0;
    while (tick &lt; ms);
}

void timer16_init(void)
{
    // PCLK 8MHz 기준, 1ms마다 인터럽트
    SYSCON-&gt;SYSAHBCLKCTRL |= (1 &lt;&lt; 7); // Timer16_0 Clock Enable
    TIMER16_0-&gt;TCR = 0x02; // Reset
    TIMER16_0-&gt;PR = 7999;  // (8000-1) = 1ms
    TIMER16_0-&gt;MR0 = 1;
    TIMER16_0-&gt;MCR = 0x03; // Interrupt &amp; Reset on MR0
    NVIC_EnableIRQ(TIMER16_0_IRQn);
    TIMER16_0-&gt;TCR = 0x01; // Enable
}
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;main 함수에서는 다음과 같이 사용합니다:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
int main(void)
{
    timer16_init();

    PORT0-&gt;MODE |= (1 &lt;&lt; 0);
    PORT0-&gt;OUTEN |= (1 &lt;&lt; 0);

    while (1) {
        PORT0-&gt;OUT ^= (1 &lt;&lt; 0);
        delay_ms(500);
    }
}
&lt;/pre&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;✅ 확인 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;LED가 정확한 간격으로 깜빡이는지 확인&lt;/li&gt;
  &lt;li&gt;딜레이가 NOP 루프보다 훨씬 정확함&lt;/li&gt;
  &lt;li&gt;타이머 인터럽트를 활용한 구조 이해&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 ABOV A31G123ML MCU의 &lt;strong&gt;TIMER16&lt;/strong&gt;을 활용하여  
&lt;strong&gt;정밀한 1ms 단위 딜레이 함수&lt;/strong&gt;를 만들어보았습니다.&lt;/p&gt;

&lt;p&gt;다음 편에서는 버튼을 눌렀을 때 반응하는  
&lt;strong&gt;외부 인터럽트(EXINT)를 구성&lt;/strong&gt;해볼게요!&lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>cortexm0</category>
      <category>keil</category>
      <category>Timer</category>
      <category>uvision</category>
      <category>딜레이함수</category>
      <category>정밀딜레이</category>
      <category>타이머인터럽트</category>
      <category>펌웨어강좌</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/160</guid>
      <comments>https://ythouse.tistory.com/160#entry160comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:49:51 +0900</pubDate>
    </item>
    <item>
      <title>Keil uVision으로 ABOV A31G123ML 첫 LED 깜빡이기</title>
      <link>https://ythouse.tistory.com/159</link>
      <description>&lt;style&gt;
  h2, h3 {
    color: #2c3e50;
    font-weight: 700;
    margin-top: 30px;
  }
  p {
    font-size: 16px;
    line-height: 1.7em;
  }
  ul {
    line-height: 1.7em;
  }
  pre {
    background-color: #f9f9f9;
    padding: 15px;
    border-left: 5px solid #3498db;
    font-family: monospace;
    font-size: 15px;
    white-space: pre-wrap;
  }
  .divider {
    border-top: 1px solid #ddd;
    margin: 40px 0;
  }
&lt;/style&gt;

&lt;h2&gt;  Keil uVision으로 ABOV A31G123ML 첫 LED 깜빡이기&lt;/h2&gt;

&lt;p&gt;이번 시리즈에서는 ABOV사의 &lt;strong&gt;A31G123ML MCU&lt;/strong&gt;를 사용해  
&lt;strong&gt;Keil uVision5&lt;/strong&gt; 환경에서 직접 펌웨어를 작성하는 과정을 다룹니다.&lt;/p&gt;

&lt;p&gt;1편에서는 &lt;strong&gt;LED 깜빡이기&lt;/strong&gt;를 통해 기본 GPIO 레지스터 제어와 프로젝트 세팅을 익혀봅니다.&lt;/p&gt;

&lt;h3&gt;  준비물&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;ABOV A31G123ML 보드&lt;/li&gt;
  &lt;li&gt;USB to UART 또는 JTAG 디버거&lt;/li&gt;
  &lt;li&gt;Keil uVision5&lt;/li&gt;
  &lt;li&gt;ABOV Device Pack (Keil Pack Installer에서 설치)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  프로젝트 생성&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Keil → New Project → Device 선택: A31G123&lt;/li&gt;
  &lt;li&gt;Startup 코드 자동 생성 또는 ABOV SDK 참고&lt;/li&gt;
  &lt;li&gt;main.c 파일 추가&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 1 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  main.c 코드 예시&lt;/h3&gt;
&lt;p&gt;P00 포트에 연결된 LED를 0.5초 간격으로 깜빡이게 만드는 코드:&lt;/p&gt;

&lt;pre&gt;
#include &quot;A31G123.h&quot;

void delay_ms(int ms) {
    for (int i = 0; i &lt; ms * 1000; i++) {
        __NOP(); // 아주 간단한 소프트웨어 딜레이
    }
}

int main(void) {
    // P0.0을 출력 모드로 설정
    PORT0-&gt;MODE |= (1 &lt;&lt; 0);     // Output Mode
    PORT0-&gt;OUTEN |= (1 &lt;&lt; 0);    // Push-pull
    PORT0-&gt;OUT &amp;= ~(1 &lt;&lt; 0);     // 초기 상태 Low

    while (1) {
        PORT0-&gt;OUT ^= (1 &lt;&lt; 0);  // Toggle LED
        delay_ms(500);
    }
}
&lt;/pre&gt;

&lt;h3&gt;✅ 빌드 &amp; 업로드&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Build 후, JTAG 디버거 또는 ISP를 통해 업로드&lt;/li&gt;
  &lt;li&gt;보드의 P00에 연결된 LED가 깜빡이면 성공  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;  팁&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;레지스터 이름은 ABOV 헤더파일(&lt;code&gt;A31G123.h&lt;/code&gt;) 기준&lt;/li&gt;
  &lt;li&gt;딜레이 정확도가 중요할 경우 타이머를 사용하는 편이 좋음 (다음 편에서 다룰 예정)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;

&lt;!-- 광고 2 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8362837465904837&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8362837465904837&quot;
     data-ad-slot=&quot;5674748480&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;

&lt;h3&gt;  마무리&lt;/h3&gt;
&lt;p&gt;이번 편에서는 Keil 프로젝트 생성부터, A31G123의 &lt;strong&gt;GPIO 레지스터를 직접 제어&lt;/strong&gt;하여  
LED를 깜빡이게 만들었습니다.&lt;/p&gt;

&lt;p&gt;다음 편에서는 타이머를 사용한 정밀한 딜레이 제어나,  
&lt;strong&gt;버튼 인터럽트&lt;/strong&gt;를 통해 진짜 마이컴 제어에 다가가볼게요  &lt;/p&gt;</description>
      <category>ARM</category>
      <category>a31g123ml</category>
      <category>ABOV</category>
      <category>abov프로젝트</category>
      <category>armcortexm0</category>
      <category>gpio제어</category>
      <category>keil</category>
      <category>LED제어</category>
      <category>mcu개발</category>
      <category>uvision</category>
      <category>임베디드강좌</category>
      <author>게임교수</author>
      <guid isPermaLink="true">https://ythouse.tistory.com/159</guid>
      <comments>https://ythouse.tistory.com/159#entry159comment</comments>
      <pubDate>Fri, 18 Apr 2025 07:47:25 +0900</pubDate>
    </item>
  </channel>
</rss>