Newer
Older
m5stickcplus / _build / html / week1.html
@Motoki Miura Motoki Miura on 4 Mar 2021 92 KB ir


<!DOCTYPE html>
<html class="writer-html4" lang="ja" >
<head>
  <meta charset="utf-8" />
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <title>1週目 &mdash; IoT Programming  ドキュメント</title>
  

  
  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="_static/copybutton.css" type="text/css" />

  
  

  
  

  

  
  <!--[if lt IE 9]>
    <script src="_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
        <script type="text/javascript" src="_static/jquery.js"></script>
        <script type="text/javascript" src="_static/underscore.js"></script>
        <script type="text/javascript" src="_static/doctools.js"></script>
        <script type="text/javascript" src="_static/language_data.js"></script>
        <script type="text/javascript" src="_static/clipboard.min.js"></script>
        <script type="text/javascript" src="_static/copybutton.js"></script>
        <script type="text/javascript" src="_static/translations.js"></script>
    
    <script type="text/javascript" src="_static/js/theme.js"></script>

    
    <link rel="index" title="索引" href="genindex.html" />
    <link rel="search" title="検索" href="search.html" />
    <link rel="next" title="2週目" href="week2.html" />
    <link rel="prev" title="事前準備" href="pre.html" /> 
</head>

<body class="wy-body-for-nav">

   
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search" >
          

          
            <a href="index.html" class="icon icon-home"> IoT Programming
          

          
          </a>

          
            
            
          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="intro.html">実験の目的</a></li>
<li class="toctree-l1"><a class="reference internal" href="intro.html#id2">実験のすすめかた</a></li>
<li class="toctree-l1"><a class="reference internal" href="intro.html#url">参考URL</a></li>
<li class="toctree-l1"><a class="reference internal" href="pre.html">事前準備</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">1週目</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id2">電源の切り方・入れ方</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">プログラムの書き込み方</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id4">コードを書くときのヒントと注意</a></li>
<li class="toctree-l2"><a class="reference internal" href="#serial">Serial通信</a></li>
<li class="toctree-l2"><a class="reference internal" href="#lcd">本体の液晶ディスプレイ(LCD)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id5">本体のボタン</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id7">文字列の扱い、16進数や10進数の変換</a></li>
<li class="toctree-l2"><a class="reference internal" href="#beep">ブザー(Beep)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#led">内蔵LED(赤・赤外)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id8">外部のLED等を接続</a></li>
<li class="toctree-l2"><a class="reference internal" href="#pwm-pulse-width-modulation">PWM (Pulse Width Modulation)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id9">サーボモータ(サーボハット利用)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#adc">外部のセンサを接続 (ADC)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id12">加速度センサ</a></li>
<li class="toctree-l2"><a class="reference internal" href="#infrared">赤外(InfraRed)リモコン</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id13">信号の読み取り</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id14">信号の送信</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id15">スプライト</a></li>
<li class="toctree-l2"><a class="reference internal" href="#wifi">Wifi 接続</a></li>
<li class="toctree-l2"><a class="reference internal" href="#ntp-network-time-protocol">NTPサーバ (Network Time Protocol) と時刻の取得</a></li>
<li class="toctree-l2"><a class="reference internal" href="#webclient">WebClient</a></li>
<li class="toctree-l2"><a class="reference internal" href="#webserver">WebServer</a></li>
<li class="toctree-l2"><a class="reference internal" href="#bluetooth-low-energy">Bluetooth Low Energy</a></li>
<li class="toctree-l2"><a class="reference internal" href="#bluetooth-serial-protocol-profile-spp">Bluetooth Serial Protocol Profile (SPP)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#preference">Preference</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id16">電力制御</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id17">その他</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id18">参考リンク</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="week2.html">2週目</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="index.html">IoT Programming</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        
          

















<div role="navigation" aria-label="breadcrumbs navigation">

  <ul class="wy-breadcrumbs">
    
      <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
        
      <li>1週目</li>
    
    
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="_sources/week1.rst.txt" rel="nofollow"> View page source</a>
          
        
      </li>
    
  </ul>

  
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
  <div class="section" id="id1">
<h1>1週目<a class="headerlink" href="#id1" title="このヘッドラインへのパーマリンク">¶</a></h1>
<div class="admonition note">
<p class="first admonition-title">注釈</p>
<p class="last">以下の項目について、全員がすべてを試す必要はありません。役割分担をして、確認と理解をすすめてください。</p>
</div>
<div class="section" id="id2">
<h2>電源の切り方・入れ方<a class="headerlink" href="#id2" title="このヘッドラインへのパーマリンク">¶</a></h2>
<ul class="simple">
<li>電源を切るには、電源ボタン(M5と書かれたAボタンの左側面)を、6秒間長押しします。</li>
<li>電源を入れるには、電源ボタンを、2秒間長押しします。</li>
<li><a class="reference external" href="https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/M5StickC_Guide_Japanese.pdf">M5StickCガイド</a> の、4ページ目、ハードウェアの概要が参考になります。</li>
</ul>
</div>
<div class="section" id="id3">
<h2>プログラムの書き込み方<a class="headerlink" href="#id3" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p><a class="reference internal" href="pre.html#writetom5"><span class="std std-ref">プログラムの書き込み</span></a> を参照してください。</p>
</div>
<div class="section" id="id4">
<h2>コードを書くときのヒントと注意<a class="headerlink" href="#id4" title="このヘッドラインへのパーマリンク">¶</a></h2>
<ul class="simple">
<li>以下のソースコード例は、右上のボタンを押すと、クリップボードに簡単にコピーできます。</li>
<li>ソースコードのインデントは、CTRL+T (Macの場合はCommand+T)キーで、自動整形できます。</li>
<li><code class="docutils literal notranslate"><span class="pre">#include</span> <span class="pre">&lt;M5StickC.h&gt;</span></code>  は、M5StickC用のコードです。 <strong>M5StickCPlus</strong> では、<code class="docutils literal notranslate"><span class="pre">#include</span> <span class="pre">&lt;M5StickCPlus.h&gt;</span></code> に変更しないと、表示がおかしくなることがあります。</li>
<li>大文字と小文字は厳密に区別されます。</li>
<li>画面をつかうプログラムを書き込んだあと、画面を使わないプログラムを書き込むと、前のプログラムの画面が残ることがあります。</li>
</ul>
</div>
<div class="section" id="serial">
<h2>Serial通信<a class="headerlink" href="#serial" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p><a class="reference internal" href="#serial01"><span class="std std-numref">リスト 1</span></a> は、シリアルモニタへ文字列を出力するシンプルな例です。グローバル変数 num を 0 に設定したうえで、setup()関数が1回実行されます。その後、loop()関数が繰り返し実行されます。
プログラムの出力をみるには、Arduino IDEで「シリアルモニタ」をひらいてください。コードエディタ右上の虫眼鏡アイコンボタンをおします。
Serialクラスには、print()関数、println()関数、 printf()関数があります。Serial通信を用いると、デバイス側の変数の値や状況を、PC側で確認するプログラムを書くことができます。</p>
<div class="literal-block-wrapper docutils container" id="serial01">
<div class="code-block-caption"><span class="caption-number">リスト 1 </span><span class="caption-text">src/serial01.ino</span><a class="headerlink" href="#serial01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kr">int</span> <span class="n">num</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="hll"><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
</span>  <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span> <span class="c1">// 通信速度をbpsで設定</span>
<span class="p">}</span>
<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d </span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">,</span> <span class="n">num</span><span class="p">);</span>
  <span class="n">num</span><span class="o">++</span><span class="p">;</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span> <span class="c1">// 500ミリ秒待つ</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<p>シリアルモニタは、デバイスからの出力を確認するだけではなく、デバイスに文字を送信することもできます。<a class="reference internal" href="#serial02"><span class="std std-numref">リスト 2</span></a> は、シリアルモニタを介して、PCからデバイスに文字を送信する例です。シリアルモニタ上部のテキストエリアから 0 を送信すると、カウンタ num をリセットします。10〜14行目で、PCから送信された文字を、1文字ずつ <code class="docutils literal notranslate"><span class="pre">Serial.read()</span></code> で読み取って、配列 <code class="docutils literal notranslate"><span class="pre">buf</span></code> に格納しています。PCから複数の文字を1回で送信すると、 <code class="docutils literal notranslate"><span class="pre">Serial.available()</span></code> は連続して 1 (=true) を返しますので、1回に送信された文字をすべて <code class="docutils literal notranslate"><span class="pre">buf</span></code> に格納することができます。ちなみに、シリアルモニタで送信された文字列の最後は、改行コード(10)が付与されます。</p>
<div class="literal-block-wrapper docutils container" id="serial02">
<div class="code-block-caption"><span class="caption-number">リスト 2 </span><span class="caption-text">src/serial02.ino</span><a class="headerlink" href="#serial02" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kr">int</span> <span class="n">num</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kr">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span> <span class="c1">// 通信速度をbpsで設定</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="kr">int</span> <span class="n">pos</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="hll">  <span class="k">while</span> <span class="p">(</span><span class="nf">Serial</span><span class="p">.</span><span class="nf">available</span><span class="p">())</span> <span class="p">{</span> <span class="c1">//PCから送信された文字があるあいだ、くりかえす</span>
</span><span class="hll">    <span class="kr">char</span> <span class="n">c</span> <span class="o">=</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">read</span><span class="p">();</span> <span class="c1">// 1バイト読み取る</span>
</span><span class="hll">    <span class="n">buf</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="p">;</span>           <span class="c1">// 配列buf に格納</span>
</span><span class="hll">    <span class="n">pos</span><span class="o">++</span><span class="p">;</span>    <span class="c1">// 格納位置をひとつ右へ</span>
</span><span class="hll">  <span class="p">}</span>
</span>  <span class="k">if</span> <span class="p">(</span><span class="n">pos</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">buf</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// さいごに Null (文字列の終端)を追加(これを忘れるとどうなる?)</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;&gt; from pc: &quot;</span><span class="p">);</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span> <span class="n">buf</span> <span class="p">);</span> <span class="c1">// 格納しておいた文字列を表示</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">buf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;0&#39;</span> <span class="o">&amp;&amp;</span> <span class="n">pos</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// buf={ 48(=&#39;0&#39;), 10(=改行) } のとき</span>
      <span class="n">num</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>  <span class="c1">// num を 0 にする</span>
      <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span> <span class="s">&quot;Reset num&quot;</span> <span class="p">);</span>
    <span class="p">}</span>
    <span class="nf">delay</span><span class="p">(</span><span class="mi">2000</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="nf">Serial</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d </span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">,</span> <span class="n">num</span> <span class="p">);</span>
  <span class="n">num</span><span class="o">++</span><span class="p">;</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<div class="admonition note">
<p class="first admonition-title">注釈</p>
<p class="last">16行目の処理を忘れると、どうなるでしょうか? また、buf が溢れると、なにが起きるでしょうか?プログラムを書くときは、常に例外的な事象がおきる可能性を考えておきましょう。ただし、全ての例外的な事象に対処するのは困難な場合が多いです。</p>
</div>
</div>
<div class="section" id="lcd">
<h2>本体の液晶ディスプレイ(LCD)<a class="headerlink" href="#lcd" title="このヘッドラインへのパーマリンク">¶</a></h2>
<ul class="simple">
<li>M5StickCのDisplay周り解析 &lt;<a class="reference external" href="https://lang-ship.com/blog/work/m5stickc-display">https://lang-ship.com/blog/work/m5stickc-display</a>&gt; が詳しいです。</li>
<li><a class="reference internal" href="#lcd01"><span class="std std-numref">リスト 3</span></a> のサンプルでは、外側から内側に向かって、10ピクセルずつ余白を残しながら、色を変えて塗りつぶしています。その後、8,16,26ピクセルフォント(それぞれ1,2,4番)をsetCursor()関数で指定して、print()関数で文字列を描画しています。</li>
<li>M5StickCPlusの機能である液晶ディスプレイ(LCD)を使用するため、 <code class="docutils literal notranslate"><span class="pre">#include</span> <span class="pre">&lt;M5StickCPlus.h&gt;</span></code> を指定し、<code class="docutils literal notranslate"><span class="pre">M5.begin()</span></code> を呼び出しています。</li>
</ul>
<div class="literal-block-wrapper docutils container" id="lcd01">
<div class="code-block-caption"><span class="caption-number">リスト 3 </span><span class="caption-text">src/lcd01.ino</span><a class="headerlink" href="#lcd01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;M5StickCPlus.h&gt;</span><span class="cp"></span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">M5</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setRotation</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">135</span><span class="p">,</span> <span class="n">RED</span><span class="p">);</span> 
  <span class="c1">//M5StickCPlusの画面サイズは、240 x 135</span>

  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillRect</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">220</span><span class="p">,</span> <span class="mi">115</span><span class="p">,</span> <span class="n">ORANGE</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillRect</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">95</span><span class="p">,</span> <span class="n">YELLOW</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillRect</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">180</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="n">GREENYELLOW</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillRect</span><span class="p">(</span><span class="mi">40</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">160</span><span class="p">,</span> <span class="mi">55</span><span class="p">,</span> <span class="n">CYAN</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillRect</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="n">BLUE</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillRect</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="n">MAGENTA</span><span class="p">);</span>

  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setTextFont</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="c1">// 8pixel ASCII font</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setTextSize</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="c1">// Magnify (x1-7)</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setTextColor</span><span class="p">(</span><span class="n">WHITE</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;RED&quot;</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setTextColor</span><span class="p">(</span><span class="n">BLACK</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">11</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;ORANGE&quot;</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span><span class="mi">21</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;YELLOW&quot;</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">40</span><span class="p">,</span><span class="mi">31</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;GREENYELLOW&quot;</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span><span class="mi">41</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;CYAN&quot;</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setTextColor</span><span class="p">(</span><span class="n">WHITE</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span><span class="mi">51</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;BLUE&quot;</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">70</span><span class="p">,</span><span class="mi">60</span><span class="p">,</span><span class="mi">2</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;MAGENTA (2)&quot;</span><span class="p">);</span>
  <span class="c1">// setCursorの第3引数は、TextFont番号</span>

  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setTextColor</span><span class="p">(</span><span class="n">BLACK</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span><span class="mi">90</span><span class="p">,</span><span class="mi">4</span><span class="p">);</span> <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&quot;26pixel ASCII (4)&quot;</span><span class="p">);</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<p>画面の向きは、setRotation() 関数で、設定します。0〜3までの整数で、指定します。</p>
<div class="figure">
<a class="reference internal image-reference" href="_images/setRotation.gif"><img alt="_images/setRotation.gif" src="_images/setRotation.gif" style="width: 400.0px; height: 400.0px;" /></a>
</div>
<div class="admonition note">
<p class="first admonition-title">注釈</p>
<p class="last">フォントの種類を設定するときは、setTextFont() や、setCursor()の第3引数をつかいます。setTextSize()は、指定したフォントを何倍に引き伸ばして表示するか?なので、基本は1を指定することが多いです。倍率を増やすと、ギザギザが目立ちます。</p>
</div>
</div>
<div class="section" id="id5">
<h2>本体のボタン<a class="headerlink" href="#id5" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p>本体には、3つのボタンがあります。
(参考:<a class="reference external" href="https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/M5StickC_Guide_Japanese.pdf">M5StickCガイド</a> の、4ページ目、ハードウェアの概要)</p>
<p><a class="reference internal" href="#button01"><span class="std std-numref">リスト 4</span></a> に、ボタンをおしたらシリアルモニタに表示する例を示します。ボタンも、M5StickC/CPlusの機能なので、 <code class="docutils literal notranslate"><span class="pre">#include</span> <span class="pre">&lt;M5StickCPlus.h&gt;</span></code> を指定し、<code class="docutils literal notranslate"><span class="pre">M5.begin()</span></code> を呼び出しておく必要があります。また、ボタンの状態を読み出して、ボタンオブジェクト(BtnA,BtnB)に設定するために、 <code class="docutils literal notranslate"><span class="pre">M5.update()</span></code> を、ループのなかに入れておく必要があります( <a class="reference external" href="https://github.com/m5stack/M5StickC-Plus/blob/master/src/M5StickCPlus.cpp">update()の定義</a> )。長押しと普通押しを区別したい場合は、ifで確認する順番(長押しを先に判定する)が重要です。</p>
<div class="literal-block-wrapper docutils container" id="button01">
<div class="code-block-caption"><span class="caption-number">リスト 4 </span><span class="caption-text">src/button01.ino</span><a class="headerlink" href="#button01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;M5StickCPlus.h&gt;</span><span class="cp"></span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">M5</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setRotation</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">update</span><span class="p">();</span> <span class="c1">// 各ボタンの状態を(読み取って)更新する:ボタンを判定するときは必須。</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">M5</span><span class="p">.</span><span class="n">BtnA</span><span class="p">.</span><span class="n">wasReleasefor</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&quot;[A] was Pressed longer than 1s&quot;</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">M5</span><span class="p">.</span><span class="n">BtnA</span><span class="p">.</span><span class="n">wasReleased</span><span class="p">())</span> <span class="p">{</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&quot;[A] was Pressed&quot;</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">M5</span><span class="p">.</span><span class="n">BtnB</span><span class="p">.</span><span class="n">wasReleasefor</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&quot;[B] was Pressed longer than 1s&quot;</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">M5</span><span class="p">.</span><span class="n">BtnB</span><span class="p">.</span><span class="n">wasReleased</span><span class="p">())</span> <span class="p">{</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&quot;[B] was Pressed&quot;</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">M5</span><span class="p">.</span><span class="n">Axp</span><span class="p">.</span><span class="n">GetBtnPress</span><span class="p">()</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&quot;[Power] was Pressed&quot;</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<div class="admonition note">
<p class="first admonition-title">注釈</p>
<p class="last"><a class="reference external" href="https://lang-ship.com/reference/unofficial/M5StickC/Class/Button">非公式リファレンスの「ボタン管理(Button)」</a> も参考になります。</p>
</div>
</div>
<div class="section" id="id7">
<h2>文字列の扱い、16進数や10進数の変換<a class="headerlink" href="#id7" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p><a class="reference internal" href="#str01"><span class="std std-numref">リスト 5</span></a> に、文字列から整数に変換したり、16進数表現の文字列を10進数に変換する例を示します。
Stringクラスを用いると、char配列 / byte配列 / 小文字変換や、空白改行の削除(ただし文字列の前後のみ)、部分文字列の取得などができます。
元のデータが保持されるメソッドと、破壊されるメソッドがあることに注意しましょう。
M5系デバイスのLCDでは、色を16ビット値(赤5bit/緑6bit/青5bit)で表現しています。 <code class="docutils literal notranslate"><span class="pre">M5.Lcd.color565()</span></code> という関数もありますが、ここではビット演算の理解を深めるため、関数を定義しています。
C言語のポインタや、シフト演算などを理解していると、このような処理を円滑に記述できるようになります。</p>
<div class="literal-block-wrapper docutils container" id="str01">
<div class="code-block-caption"><span class="caption-number">リスト 5 </span><span class="caption-text">src/str01.ino</span><a class="headerlink" href="#str01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;M5StickCPlus.h&gt;</span><span class="cp"></span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setRotation</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&quot;整数 または 6文字の16進数(RRGGBB)を入力してください。&quot;</span><span class="p">);</span>
<span class="p">}</span>

<span class="kr">String</span> <span class="n">str</span> <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="p">;</span> <span class="c1">// String: 可変長の文字列クラス</span>
<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="kr">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">100</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
  <span class="kr">int</span> <span class="n">pos</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">while</span> <span class="p">(</span><span class="nf">Serial</span><span class="p">.</span><span class="nf">available</span><span class="p">())</span> <span class="p">{</span> <span class="c1">//PCから送信された文字があるあいだ、くりかえす</span>
    <span class="kr">char</span> <span class="n">c</span> <span class="o">=</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">read</span><span class="p">();</span> <span class="c1">// 1バイト読み取る</span>
    <span class="n">buf</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="p">;</span>           <span class="c1">// 配列buf に格納</span>
    <span class="n">pos</span><span class="o">++</span><span class="p">;</span>    <span class="c1">// 格納位置をひとつ右へ</span>
  <span class="p">}</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">pos</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">buf</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="kr">String</span> <span class="n">sbuf</span> <span class="o">=</span> <span class="n">buf</span><span class="p">;</span>
    <span class="n">sbuf</span><span class="p">.</span><span class="n">trim</span><span class="p">();</span> <span class="c1">//文字列の前と後の空白と改行を取り除く(破壊的メソッド)</span>
    <span class="n">str</span><span class="p">.</span><span class="n">concat</span><span class="p">(</span><span class="n">sbuf</span><span class="p">);</span> <span class="c1">// 文字列の連結 (意味としては、str = str + sbuf)</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="nf">isDigit</span><span class="p">(</span><span class="n">sbuf</span><span class="p">))</span> <span class="p">{</span>
      <span class="kr">int</span> <span class="n">num</span> <span class="o">=</span> <span class="n">sbuf</span><span class="p">.</span><span class="n">toInt</span><span class="p">();</span>
      <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span> <span class="n">num</span> <span class="o">*</span> <span class="n">num</span> <span class="p">);</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">sbuf</span><span class="p">.</span><span class="n">length</span><span class="p">()</span> <span class="o">==</span> <span class="mi">6</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// RRGGBBとして、LCD画面の背景を塗りつぶす</span>
      <span class="n">sbuf</span><span class="p">.</span><span class="n">toLowerCase</span><span class="p">();</span>
      <span class="kr">uint8_t</span> <span class="n">r</span> <span class="o">=</span> <span class="n">hexToDec</span><span class="p">(</span> <span class="n">sbuf</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="p">);</span>
      <span class="kr">uint8_t</span> <span class="n">g</span> <span class="o">=</span> <span class="n">hexToDec</span><span class="p">(</span> <span class="n">sbuf</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">);</span>
      <span class="kr">uint8_t</span> <span class="n">b</span> <span class="o">=</span> <span class="n">hexToDec</span><span class="p">(</span> <span class="n">sbuf</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="p">);</span>
      <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">fillScreen</span><span class="p">(</span> <span class="n">getColorUInt16</span><span class="p">(</span> <span class="n">r</span> <span class="p">,</span> <span class="n">g</span> <span class="p">,</span> <span class="n">b</span> <span class="p">)</span> <span class="p">);</span>
      <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
      <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot; %02x %02x %02x </span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
      <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot; %d %d %d &quot;</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">//全ての文字が0〜9なら、1(true)を返す</span>
<span class="kr">bool</span> <span class="nf">isDigit</span><span class="p">(</span><span class="kr">String</span> <span class="n">s</span><span class="p">)</span> <span class="p">{</span>
  <span class="kr">bool</span> <span class="n">isAllDigit</span> <span class="o">=</span> <span class="kr">true</span><span class="p">;</span>
  <span class="kr">const</span> <span class="kr">char</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span> <span class="n">s</span><span class="p">.</span><span class="n">c_str</span><span class="p">();</span> <span class="c1">// String.c_str() は、NULLで終端されたchar配列の先頭アドレスを返す</span>
  <span class="k">while</span> <span class="p">(</span> <span class="o">*</span><span class="n">p</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="n">p</span> <span class="o">&lt;</span> <span class="sc">&#39;0&#39;</span> <span class="o">||</span> <span class="sc">&#39;9&#39;</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">p</span><span class="p">)</span> <span class="n">isAllDigit</span> <span class="o">=</span> <span class="kr">false</span><span class="p">;</span>
    <span class="n">p</span><span class="o">++</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">isAllDigit</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// M5 用の、16ビットカラー値に変換 引用:https://qiita.com/nnn112358/items/ea6b5e81623ba690343c</span>
<span class="kr">uint16_t</span> <span class="nf">getColorUInt16</span><span class="p">(</span><span class="kr">uint8_t</span> <span class="n">red</span><span class="p">,</span> <span class="kr">uint8_t</span> <span class="n">green</span><span class="p">,</span> <span class="kr">uint8_t</span> <span class="n">blue</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="p">((</span><span class="n">red</span> <span class="o">&gt;&gt;</span> <span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">11</span><span class="p">)</span> <span class="o">|</span> <span class="p">((</span><span class="n">green</span> <span class="o">&gt;&gt;</span> <span class="mi">2</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">5</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">blue</span> <span class="o">&gt;&gt;</span> <span class="mi">3</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// 引数hex が16進表記の文字列だと仮定して、10進の値を返す</span>
<span class="kr">uint8_t</span> <span class="nf">hexToDec</span><span class="p">(</span><span class="kr">String</span> <span class="n">hex</span><span class="p">)</span> <span class="p">{</span>
  <span class="kr">int</span> <span class="n">dec</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="kr">int</span> <span class="n">tmp</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for</span> <span class="p">(</span><span class="kr">int</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">p</span> <span class="o">&lt;</span> <span class="n">hex</span><span class="p">.</span><span class="n">length</span><span class="p">();</span> <span class="n">p</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="kr">int</span><span class="p">(</span><span class="n">hex</span><span class="p">.</span><span class="n">charAt</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
    <span class="k">if</span> <span class="p">(</span> <span class="sc">&#39;0&#39;</span> <span class="o">&lt;=</span> <span class="n">tmp</span> <span class="o">&amp;&amp;</span> <span class="n">tmp</span> <span class="o">&lt;=</span> <span class="sc">&#39;9&#39;</span> <span class="p">)</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">-</span> <span class="sc">&#39;0&#39;</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span> <span class="sc">&#39;a&#39;</span> <span class="o">&lt;=</span> <span class="n">tmp</span> <span class="o">&amp;&amp;</span> <span class="n">tmp</span> <span class="o">&lt;=</span> <span class="sc">&#39;f&#39;</span> <span class="p">)</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">-</span> <span class="sc">&#39;a&#39;</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span> <span class="sc">&#39;A&#39;</span> <span class="o">&lt;=</span> <span class="n">tmp</span> <span class="o">&amp;&amp;</span> <span class="n">tmp</span> <span class="o">&lt;=</span> <span class="sc">&#39;F&#39;</span> <span class="p">)</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">-</span> <span class="sc">&#39;A&#39;</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="nf">constrain</span><span class="p">(</span><span class="n">tmp</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">15</span><span class="p">);</span> <span class="c1">//例外処理</span>
    <span class="n">dec</span> <span class="o">=</span> <span class="p">(</span><span class="n">dec</span> <span class="o">*</span> <span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">tmp</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">dec</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<div class="admonition note">
<p class="first admonition-title">注釈</p>
<p class="last">参考:<a class="reference external" href="https://qiita.com/nnn112358/items/ea6b5e81623ba690343c">https://qiita.com/nnn112358/items/ea6b5e81623ba690343c</a></p>
</div>
</div>
<div class="section" id="beep">
<h2>ブザー(Beep)<a class="headerlink" href="#beep" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p><a class="reference internal" href="#sound01"><span class="std std-numref">リスト 6</span></a> は、内蔵Beepを鳴らすサンプルです。音の周波数は、最初の1オクターブ (f[0]〜f[6]) のみを配列宣言時に指定し、残りの3オクターブはsetup()内で、倍数を計算して配列に設定しています。</p>
<p><code class="docutils literal notranslate"><span class="pre">setBeep()</span></code> と <code class="docutils literal notranslate"><span class="pre">beep()</span></code> を使うと、同じビープ音を使い回すときは記述が短くて便利ですが、通常は <code class="docutils literal notranslate"><span class="pre">tone()</span></code> のほうが簡潔です。
どちらの記法でも、命令実行のあと、音の停止を待たずに、すぐに次の処理に移行します(ノンブロッキング)。
継続ミリ秒数(ms)は、 <code class="docutils literal notranslate"><span class="pre">M5.Beep.update()</span></code> が周期的に呼び出せるときに指定し、それ以外は省略するとよいでしょう。(結局、 <code class="docutils literal notranslate"><span class="pre">delay()</span></code> と <code class="docutils literal notranslate"><span class="pre">mute()</span></code> が必要になるため)</p>
<div class="literal-block-wrapper docutils container" id="sound01">
<div class="code-block-caption"><span class="caption-number">リスト 6 </span><span class="caption-text">src/sound01.ino</span><a class="headerlink" href="#sound01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;M5StickCPlus.h&gt;</span><span class="cp"></span>

<span class="kr">int</span> <span class="n">f</span><span class="p">[</span><span class="mi">28</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">262</span><span class="p">,</span> <span class="mi">294</span><span class="p">,</span> <span class="mi">330</span><span class="p">,</span> <span class="mi">349</span><span class="p">,</span> <span class="mi">392</span><span class="p">,</span> <span class="mi">440</span><span class="p">,</span> <span class="mi">494</span> <span class="p">};</span> <span class="c1">// 配列のサイズは4オクターブ分</span>
<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setRotation</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
  <span class="k">for</span> <span class="p">(</span><span class="kr">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">7</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">f</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">7</span><span class="p">]</span>  <span class="o">=</span> <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
    <span class="n">f</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">14</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="mi">4</span><span class="p">;</span>
    <span class="n">f</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">21</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="mi">8</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="c1">// setBeep( Hz, ms) でビープ音を設定して、beep()で鳴らす。</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Beep</span><span class="p">.</span><span class="n">setBeep</span><span class="p">(</span><span class="mi">523</span><span class="p">,</span> <span class="mi">500</span><span class="p">);</span>  <span class="n">M5</span><span class="p">.</span><span class="n">Beep</span><span class="p">.</span><span class="nf">beep</span><span class="p">();</span>  <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
  <span class="c1">// tone( Hz, ms ) で鳴らす方法</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Beep</span><span class="p">.</span><span class="nf">tone</span><span class="p">(</span><span class="mi">1046</span><span class="p">,</span> <span class="mi">500</span><span class="p">);</span>  <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
  <span class="c1">// msを省略し、tone( Hz ) で鳴らす(結局、delayが必要になるので)</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Beep</span><span class="p">.</span><span class="nf">tone</span><span class="p">(</span><span class="mi">2092</span><span class="p">);</span>  <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
  <span class="c1">// ここはmsを指定するとよい (loopのM5.Beep.updateが停めてくれるので、delayを省略できる)</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Beep</span><span class="p">.</span><span class="nf">tone</span><span class="p">(</span><span class="mi">2092</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Beep</span><span class="p">.</span><span class="n">update</span><span class="p">();</span> <span class="c1">//tone()やsetBeep()で指定した時間を過ぎていたら音を止める。</span>
  <span class="c1">//                  M5.Beep.mute() とすると、すぐに停止する。</span>

  <span class="k">while</span> <span class="p">(</span><span class="nf">Serial</span><span class="p">.</span><span class="nf">available</span><span class="p">())</span> <span class="p">{</span>
    <span class="kr">char</span> <span class="n">c</span> <span class="o">=</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">read</span><span class="p">();</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">c</span> <span class="o">&lt;</span> <span class="sc">&#39;c&#39;</span> <span class="o">||</span> <span class="sc">&#39;z&#39;</span> <span class="o">&lt;</span> <span class="n">c</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span> <span class="c1">// c〜zの文字以外なら、以降のwhile内処理をスキップ</span>
    <span class="n">M5</span><span class="p">.</span><span class="n">Beep</span><span class="p">.</span><span class="nf">tone</span><span class="p">(</span> <span class="n">f</span><span class="p">[</span><span class="n">c</span> <span class="o">-</span> <span class="sc">&#39;c&#39;</span><span class="p">]</span> <span class="p">,</span> <span class="mi">1000</span><span class="p">);</span> <span class="c1">// 1秒鳴らす</span>
    <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span> <span class="n">f</span><span class="p">[</span><span class="n">c</span> <span class="o">-</span> <span class="sc">&#39;c&#39;</span><span class="p">]</span> <span class="p">);</span>
  <span class="p">}</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
</div>
<div class="section" id="led">
<h2>内蔵LED(赤・赤外)<a class="headerlink" href="#led" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p>M5StickCPlusには、2つのLEDランプが内蔵されています。GPIO(General Purpose I/O)10 には、赤色LED、GPIO9 には、赤外LEDが接続されています。
場所は、USBケーブルを挿す面の反対側の面にある、小さな穴2つの内側です。</p>
<p><a class="reference internal" href="#led01"><span class="std std-numref">リスト 7</span></a> は、赤色LEDを点滅させるシンプルなプログラムです。</p>
<div class="literal-block-wrapper docutils container" id="led01">
<div class="code-block-caption"><span class="caption-number">リスト 7 </span><span class="caption-text">src/led01.ino</span><a class="headerlink" href="#led01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kr">int</span> <span class="n">PIN</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">// 赤色LED G10</span>
<span class="c1">//int PIN = 9; // Ir LED (カメラには映りますが、肉眼では見えません) G9</span>
<span class="c1">// その他、G0 (0) , G25 (25), G26 (26) がつかえます。</span>
<span class="c1">// https://lang-ship.com/blog/work/m5stickc-io/</span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">pinMode</span><span class="p">(</span><span class="n">PIN</span><span class="p">,</span> <span class="kr">OUTPUT</span><span class="p">);</span> <span class="c1">// PINのモード設定</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">digitalWrite</span><span class="p">(</span><span class="n">PIN</span><span class="p">,</span> <span class="kr">HIGH</span><span class="p">);</span> <span class="c1">// HIGH = 1</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
  <span class="nf">digitalWrite</span><span class="p">(</span><span class="n">PIN</span><span class="p">,</span> <span class="kr">LOW</span><span class="p">);</span> <span class="c1">// LOW = 0</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
</div>
<div class="section" id="id8">
<h2>外部のLED等を接続<a class="headerlink" href="#id8" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p>外部のLED等は、 G0, G25, G26 に接続します。
サンプルプログラムは、<a class="reference internal" href="#led01"><span class="std std-numref">リスト 7</span></a> と同様です。PIN 番号を、0 / 25 / 26 に変更してください。</p>
<p>ブレッドボードに、抵抗とLEDを直列に接続します。
LEDの長い足のほうに、G0 (or G25 or G26) をジャンパワイヤで接続し、反対側(短い足)のほうを、GND (グランド)に接続します。
ポートを「HIGH」にすると、3.3Vの電圧がかかります。</p>
<div class="figure">
<a class="reference internal image-reference" href="_images/SimpleLED_m5s.png"><img alt="_images/SimpleLED_m5s.png" src="_images/SimpleLED_m5s.png" style="width: 291.59999999999997px; height: 606.6px;" /></a>
</div>
<div class="admonition warning">
<p class="first admonition-title">警告</p>
<p class="last">LEDのみで回路を構成しないよう注意!一般に、LEDは抵抗をつないで使用しないと、故障したり、最悪の場合破裂したりして危険です。ただし、抵抗入りLEDであれば問題ありません。</p>
</div>
</div>
<div class="section" id="pwm-pulse-width-modulation">
<h2>PWM (Pulse Width Modulation)<a class="headerlink" href="#pwm-pulse-width-modulation" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p>パルス幅変調とは、信号の周期Tに対する、パルスの幅を変化させる方法です。
直流モータの速度制御や、サーボモータの制御、LEDの明度調整などに使われます。</p>
<p><a class="reference internal" href="#pwm01"><span class="std std-numref">リスト 8</span></a> は、赤色LEDを点滅させるシンプルなプログラムです。 <code class="docutils literal notranslate"><span class="pre">ledcSetup(チャンネル,</span> <span class="pre">周波数,</span> <span class="pre">分解能)</span></code> で、PWMチャンネル(0〜3)に対する周波数と分解能設定をし、 <code class="docutils literal notranslate"><span class="pre">lecAttachPin(ピン番号,</span> <span class="pre">チャンネル)</span></code> で、PWMチャンネルを適用する出力ピンを選択します。そのあと、 <code class="docutils literal notranslate"><span class="pre">ledcWrite(チャンネル,</span> <span class="pre">値)</span></code> で、分解能で設定したビットで表現できる最大値+1以下の値を指定することで、デューティー比を設定します。<a class="reference internal" href="#pwm01"><span class="std std-numref">リスト 8</span></a> の場合、分解能で8bitを指定したので、0〜256 の値が、デューティー比 0〜1 のパルス生成に対応します。</p>
<div class="literal-block-wrapper docutils container" id="pwm01">
<div class="code-block-caption"><span class="caption-number">リスト 8 </span><span class="caption-text">src/pwm01.ino</span><a class="headerlink" href="#pwm01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kr">int</span> <span class="n">PIN</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">// 内蔵LED</span>
<span class="kr">int</span> <span class="n">PWM_CH</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// 0~3で指定する。0にすると高音が鳴って耳障り?</span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">pinMode</span><span class="p">(</span><span class="n">PIN</span><span class="p">,</span> <span class="kr">OUTPUT</span><span class="p">);</span> <span class="c1">// PINのモード設定</span>
<span class="hll">  <span class="n">ledcSetup</span><span class="p">(</span><span class="n">PWM_CH</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> <span class="c1">// CH, 周波数(Hz) 【小さくするとどうなる?】, 分解能(bit)</span>
</span><span class="hll">  <span class="n">ledcAttachPin</span><span class="p">(</span><span class="n">PIN</span><span class="p">,</span> <span class="n">PWM_CH</span><span class="p">);</span>
</span>  <span class="c1">// https://lang-ship.com/reference/unofficial/M5StickC/Peripherals/LED_Control/</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="kr">int</span> <span class="n">i</span><span class="p">;</span>

  <span class="k">for</span> <span class="p">(</span><span class="kr">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">256</span> <span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="hll">    <span class="n">ledcWrite</span><span class="p">(</span><span class="n">PWM_CH</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
</span>    <span class="nf">delay</span><span class="p">(</span> <span class="mi">5</span> <span class="p">);</span>
  <span class="p">}</span>
  <span class="k">for</span> <span class="p">(</span><span class="kr">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">256</span> <span class="p">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
<span class="hll">    <span class="n">ledcWrite</span><span class="p">(</span><span class="n">PWM_CH</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
</span>    <span class="nf">delay</span><span class="p">(</span> <span class="mi">5</span> <span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<div class="admonition note">
<p class="first admonition-title">注釈</p>
<p class="last">ソースコードのコメントにも書いていますが、周波数を小さくする(20〜30程度)と、どうなるでしょうか?ぜひやってみてください。</p>
</div>
</div>
<div class="section" id="id9">
<h2>サーボモータ(サーボハット利用)<a class="headerlink" href="#id9" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p><a class="reference internal" href="#servohat01"><span class="std std-numref">リスト 9</span></a> は、<a class="reference external" href="https://www.switch-science.com/catalog/6076/">サーボハット</a> のサーボモータを動かすサンプルです。サーボモータの制御はPWMですので、基本的に、上のPWMとやっていることは同じです。おまけとして、LEDも点灯させました。<code class="docutils literal notranslate"><span class="pre">map関数</span></code> は、Arduinoで使える関数で、範囲に対応する値を変換するときに使います。ここでは、サーボ制御で用いる5〜33の値を、LED制御の値0〜256に変換しています。</p>
<div class="literal-block-wrapper docutils container" id="servohat01">
<div class="code-block-caption"><span class="caption-number">リスト 9 </span><span class="caption-text">src/servohat01.ino</span><a class="headerlink" href="#servohat01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="cp">#define MLOW 5</span>
<span class="cp">#define MHIGH 33</span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">ledcSetup</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span> <span class="c1">//サーボハット CH1</span>
  <span class="n">ledcAttachPin</span><span class="p">(</span><span class="mi">26</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>

  <span class="nf">pinMode</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="kr">OUTPUT</span><span class="p">);</span>
  <span class="n">ledcSetup</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span><span class="c1">//LED CH2</span>
  <span class="n">ledcAttachPin</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">for</span> <span class="p">(</span><span class="kr">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">MLOW</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MHIGH</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">ledcWrite</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
    <span class="kr">int</span> <span class="n">v</span> <span class="o">=</span> <span class="nf">map</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">MLOW</span><span class="p">,</span> <span class="n">MHIGH</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">256</span><span class="p">);</span> <span class="c1">// 範囲5〜33に対するiの値を、範囲0〜256に変換</span>
    <span class="n">ledcWrite</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">v</span><span class="p">);</span>
    <span class="nf">delay</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>
  <span class="k">for</span> <span class="p">(</span><span class="kr">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">MHIGH</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="n">MLOW</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">ledcWrite</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
    <span class="kr">int</span> <span class="n">v</span> <span class="o">=</span> <span class="nf">map</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">MLOW</span><span class="p">,</span> <span class="n">MHIGH</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">256</span><span class="p">);</span>
    <span class="n">ledcWrite</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">v</span><span class="p">);</span>
    <span class="nf">delay</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
</div>
<div class="section" id="adc">
<h2>外部のセンサを接続 (ADC)<a class="headerlink" href="#adc" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p>ADCは、Analog to Digital Converter の意味です。
<code class="docutils literal notranslate"><span class="pre">analogRead(PIN)</span></code> は、PIN番ピンの電圧(0~3.3V)を、0〜4095 の値で返します。一般に、抵抗値が変化するタイプのセンサは、この方法をつかって、読み取ることができます。</p>
<div class="admonition warning">
<p class="first admonition-title">警告</p>
<p class="last"><a class="reference external" href="https://lang-ship.com/reference/unofficial/M5StickC/Peripherals/ADC/">ADC</a> にかいてあるように、G26, G32, G33, G36のみ使えます。G26は、無線利用時には使えません。</p>
</div>
<p><a class="reference internal" href="#cds01"><span class="std std-numref">リスト 10</span></a> はCdSセル(照度センサ) の値を読み取るサンプルです。</p>
<div class="literal-block-wrapper docutils container" id="cds01">
<div class="code-block-caption"><span class="caption-number">リスト 10 </span><span class="caption-text">src/cds01.ino</span><a class="headerlink" href="#cds01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kr">int</span> <span class="n">PIN</span> <span class="o">=</span> <span class="mi">26</span><span class="p">;</span>

<span class="c1">// +--- 15kΩ抵抗 --+-- CdSセル --+</span>
<span class="c1">// |              |             |</span>
<span class="c1">// GND           G26           3V3</span>
<span class="c1">// https://www.storange.jp/2012/03/arduinocds.html</span>

<span class="c1">// 注意点: https://lang-ship.com/reference/unofficial/M5StickC/Peripherals/ADC/</span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">pinMode</span><span class="p">(</span><span class="n">PIN</span><span class="p">,</span> <span class="n">ANALOG</span><span class="p">);</span> <span class="c1">// PINのモード設定</span>
  <span class="c1">// https://lang-ship.com/blog/work/m5stickc-io/</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;%04d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="nf">analogRead</span><span class="p">(</span><span class="n">PIN</span><span class="p">)</span> <span class="p">);</span> <span class="c1">// 暗 0 〜 4095 明</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<p>圧力センサや、曲げセンサも、同様の方法で利用することができます。</p>
</div>
<div class="section" id="id12">
<h2>加速度センサ<a class="headerlink" href="#id12" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p><a class="reference internal" href="#accgyro01"><span class="std std-numref">リスト 11</span></a> は、内蔵されている加速度センサ(MPU6886) の値を表示するサンプルです。ちなみに、IMUとは、Inertial Measurement Unit: 慣性計測装置 の略です。
「ツール」→「シリアルプロッタ」をひらくと、値をグラフでみることができます。
ジャイロセンサの値も取得可能です。</p>
<div class="literal-block-wrapper docutils container" id="accgyro01">
<div class="code-block-caption"><span class="caption-number">リスト 11 </span><span class="caption-text">src/accgyro.ino</span><a class="headerlink" href="#accgyro01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1">// 参考にしたサイト: https://qiita.com/kitazaki/items/1ce671532270cd44fabf</span>

<span class="cp">#include</span> <span class="cpf">&lt;M5StickCPlus.h&gt;</span><span class="cp"></span>

<span class="kr">float</span> <span class="n">gyroX</span><span class="p">,</span> <span class="n">gyroY</span><span class="p">,</span> <span class="n">gyroZ</span><span class="p">;</span>  <span class="c1">// ジャイロデータ </span>
<span class="kr">float</span> <span class="n">ax</span><span class="p">,</span> <span class="n">ay</span><span class="p">,</span> <span class="n">az</span><span class="p">;</span>  <span class="c1">// 加速度データ</span>

<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">M5</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">setRotation</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">IMU</span><span class="p">.</span><span class="n">Init</span><span class="p">();</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">IMU</span><span class="p">.</span><span class="n">getGyroData</span><span class="p">(</span><span class="o">&amp;</span><span class="n">gyroX</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">gyroY</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">gyroZ</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">IMU</span><span class="p">.</span><span class="n">getAccelData</span><span class="p">(</span><span class="o">&amp;</span><span class="n">ax</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ay</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">az</span><span class="p">);</span>
  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="nf">setCursor</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>

  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;aX :%7.2f  </span><span class="se">\n</span><span class="s">aY :%7.2f  </span><span class="se">\n</span><span class="s">aZ :%7.2f mg  </span><span class="se">\n\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ax</span> <span class="p">,</span> <span class="n">ay</span> <span class="p">,</span> <span class="n">az</span> <span class="p">);</span>
  <span class="nf">Serial</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;%7.2f , %7.2f , %7.2f </span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ax</span> <span class="p">,</span> <span class="n">ay</span> <span class="p">,</span> <span class="n">az</span><span class="p">);</span> <span class="c1">//シリアルプロッタ用の出力</span>

  <span class="n">M5</span><span class="p">.</span><span class="n">Lcd</span><span class="p">.</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;gX :%7.2f  </span><span class="se">\n</span><span class="s">gY :%7.2f  </span><span class="se">\n</span><span class="s">gZ :%7.2f mg  &quot;</span><span class="p">,</span> <span class="n">gyroX</span> <span class="o">*</span> <span class="n">M5</span><span class="p">.</span><span class="n">IMU</span><span class="p">.</span><span class="n">gRes</span><span class="p">,</span> <span class="n">gyroY</span> <span class="o">*</span> <span class="n">M5</span><span class="p">.</span><span class="n">IMU</span><span class="p">.</span><span class="n">gRes</span><span class="p">,</span> <span class="n">gyroZ</span> <span class="o">*</span> <span class="n">M5</span><span class="p">.</span><span class="n">IMU</span><span class="p">.</span><span class="n">gRes</span><span class="p">);</span>
  <span class="c1">// Serial.printf(&quot;%7.2f,%7.2f,%7.2f,&quot;, gyroX * M5.IMU.gRes, gyroY * M5.IMU.gRes, gyroZ * M5.IMU.gRes);</span>

  <span class="nf">delay</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
</div>
<div class="section" id="infrared">
<h2>赤外(InfraRed)リモコン<a class="headerlink" href="#infrared" title="このヘッドラインへのパーマリンク">¶</a></h2>
<div class="section" id="id13">
<h3>信号の読み取り<a class="headerlink" href="#id13" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>赤外線リモコン受信モジュールが必要です。ここでは、<a class="reference external" href="https://akizukidenshi.com/catalog/g/gI-06487/">GP1UXC41QS</a> を前提に、話をすすめます。</p>
<p>また、準備として、ライブラリマネージャにて、IRremoteESP8266 をインストールします。ちなみに、テストしたバージョンは2.7.15でした。</p>
<p>ファイルメニュー → スケッチ例 → IRremoteESP8266 → IRrecvDumpV2 を選択します。</p>
<p>ブレッドボードに、以下の図のように配線します。Pとかいてある面が、受光器が出っ張っている面です。47Ωの抵抗を、5Vとの間に入れます。
赤外線リモコン受信モジュールに接続したピンを <code class="docutils literal notranslate"><span class="pre">const</span> <span class="pre">uint16_t</span> <span class="pre">kRecvPin</span> <span class="pre">=</span> <span class="pre">36;</span></code> として設定します。
受光器にリモコンを向けて、ボタンを押すと、シリアルモニタに情報が表示されます。ここでは、Protocol : NEC , Code 0x2FD48B7 (32 Bits) と表示されたとします。</p>
<div class="figure">
<a class="reference internal image-reference" href="_images/ir_sensor_47owm.png"><img alt="_images/ir_sensor_47owm.png" src="_images/ir_sensor_47owm.png" style="width: 291.59999999999997px; height: 590.4px;" /></a>
</div>
</div>
<div class="section" id="id14">
<h3>信号の送信<a class="headerlink" href="#id14" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>内蔵の赤外LEDを用いて、信号を送信する例を <a class="reference internal" href="#irsend01"><span class="std std-numref">リスト 12</span></a> に示します。
赤外光が弱いため、かなり近づかないと(50cm程度)反応しない場合があります。
外部の赤外LEDを用いると、距離を伸ばすことができます。</p>
<div class="literal-block-wrapper docutils container" id="irsend01">
<div class="code-block-caption"><span class="caption-number">リスト 12 </span><span class="caption-text">src/irsend01.ino</span><a class="headerlink" href="#irsend01" title="このコードへのパーマリンク">¶</a></div>
<div class="highlight-arduino notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;IRremoteESP8266.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;IRsend.h&gt;</span><span class="cp"></span>

<span class="kr">uint16_t</span> <span class="n">kIrLed</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span> <span class="c1">// 内蔵IrLED</span>
<span class="n">IRsend</span> <span class="nf">irsend</span><span class="p">(</span><span class="n">kIrLed</span><span class="p">);</span>

<span class="kr">uint32_t</span> <span class="n">code</span> <span class="o">=</span> <span class="mh">0x2FD48B7</span><span class="p">;</span> <span class="c1">// Toshiba TV Power</span>
<span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">irsend</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span>
<span class="p">}</span>

<span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">irsend</span><span class="p">.</span><span class="n">sendNEC</span><span class="p">(</span> <span class="n">code</span> <span class="p">,</span> <span class="mi">32</span><span class="p">);</span>
  <span class="nf">delay</span><span class="p">(</span><span class="mi">5000</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
</div>
</div>
<div class="section" id="id15">
<h2>スプライト<a class="headerlink" href="#id15" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p>画面のちらつき防止</p>
</div>
<div class="section" id="wifi">
<h2>Wifi 接続<a class="headerlink" href="#wifi" title="このヘッドラインへのパーマリンク">¶</a></h2>
</div>
<div class="section" id="ntp-network-time-protocol">
<h2>NTPサーバ (Network Time Protocol) と時刻の取得<a class="headerlink" href="#ntp-network-time-protocol" title="このヘッドラインへのパーマリンク">¶</a></h2>
</div>
<div class="section" id="webclient">
<h2>WebClient<a class="headerlink" href="#webclient" title="このヘッドラインへのパーマリンク">¶</a></h2>
</div>
<div class="section" id="webserver">
<h2>WebServer<a class="headerlink" href="#webserver" title="このヘッドラインへのパーマリンク">¶</a></h2>
</div>
<div class="section" id="bluetooth-low-energy">
<h2>Bluetooth Low Energy<a class="headerlink" href="#bluetooth-low-energy" title="このヘッドラインへのパーマリンク">¶</a></h2>
<p>アドバータイズ</p>
</div>
<div class="section" id="bluetooth-serial-protocol-profile-spp">
<h2>Bluetooth Serial Protocol Profile (SPP)<a class="headerlink" href="#bluetooth-serial-protocol-profile-spp" title="このヘッドラインへのパーマリンク">¶</a></h2>
</div>
<div class="section" id="preference">
<h2>Preference<a class="headerlink" href="#preference" title="このヘッドラインへのパーマリンク">¶</a></h2>
</div>
<div class="section" id="id16">
<h2>電力制御<a class="headerlink" href="#id16" title="このヘッドラインへのパーマリンク">¶</a></h2>
</div>
<div class="section" id="id17">
<h2>その他<a class="headerlink" href="#id17" title="このヘッドラインへのパーマリンク">¶</a></h2>
<ul class="simple">
<li>CO2 (CCS811)</li>
<li>RCS-620S (Felica)</li>
<li>JJYClock</li>
<li>RTC(BM8563)</li>
<li>OTA</li>
</ul>
</div>
<div class="section" id="id18">
<h2>参考リンク<a class="headerlink" href="#id18" title="このヘッドラインへのパーマリンク">¶</a></h2>
<ul class="simple">
<li>M5StickC非公式日本語リファレンス &lt;<a class="reference external" href="https://lang-ship.com/reference/unofficial/M5StickC">https://lang-ship.com/reference/unofficial/M5StickC</a>&gt;&lt;/https:&gt;</li>
</ul>
</div>
</div>


           </div>
           
          </div>
          <footer>
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
        <a href="week2.html" class="btn btn-neutral float-right" title="2週目" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
        <a href="pre.html" class="btn btn-neutral float-left" title="事前準備" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>
        &#169; Copyright 2021, Motoki Miura.

    </p>
  </div>
    
    
    
    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
    
    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
    
    provided by <a href="https://readthedocs.org">Read the Docs</a>. 

</footer>
        </div>
      </div>

    </section>

  </div>
  

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>