<!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週目 — 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> »</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"><M5StickC.h></span></code> は、M5StickC用のコードです。 <strong>M5StickCPlus</strong> では、<code class="docutils literal notranslate"><span class="pre">#include</span> <span class="pre"><M5StickCPlus.h></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">"%d </span><span class="se">\n</span><span class="s">"</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">></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">"> from pc: "</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">'0'</span> <span class="o">&&</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(='0'), 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">"Reset num"</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">"%d </span><span class="se">\n</span><span class="s">"</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周り解析 <<a class="reference external" href="https://lang-ship.com/blog/work/m5stickc-display">https://lang-ship.com/blog/work/m5stickc-display</a>> が詳しいです。</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"><M5StickCPlus.h></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"><M5StickCPlus.h></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">"RED"</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">"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="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">"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="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">"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="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">"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">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">"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="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">"MAGENTA (2)"</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">"26pixel ASCII (4)"</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"><M5StickCPlus.h></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"><M5StickCPlus.h></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">"[A] was Pressed longer than 1s"</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">"[A] was Pressed"</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">"[B] was Pressed longer than 1s"</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">"[B] was Pressed"</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">"[Power] was Pressed"</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"><M5StickCPlus.h></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">"整数 または 6文字の16進数(RRGGBB)を入力してください。"</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">""</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">></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">" %02x %02x %02x </span><span class="se">\n</span><span class="s">"</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">" %d %d %d "</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"><</span> <span class="sc">'0'</span> <span class="o">||</span> <span class="sc">'9'</span> <span class="o"><</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">>></span> <span class="mi">3</span><span class="p">)</span> <span class="o"><<</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">>></span> <span class="mi">2</span><span class="p">)</span> <span class="o"><<</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">>></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"><</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">'0'</span> <span class="o"><=</span> <span class="n">tmp</span> <span class="o">&&</span> <span class="n">tmp</span> <span class="o"><=</span> <span class="sc">'9'</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">'0'</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span> <span class="sc">'a'</span> <span class="o"><=</span> <span class="n">tmp</span> <span class="o">&&</span> <span class="n">tmp</span> <span class="o"><=</span> <span class="sc">'f'</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">'a'</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">'A'</span> <span class="o"><=</span> <span class="n">tmp</span> <span class="o">&&</span> <span class="n">tmp</span> <span class="o"><=</span> <span class="sc">'F'</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">'A'</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"><M5StickCPlus.h></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"><</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"><</span> <span class="sc">'c'</span> <span class="o">||</span> <span class="sc">'z'</span> <span class="o"><</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">'c'</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">'c'</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"><</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">></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"><=</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">>=</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">"%04d</span><span class="se">\n</span><span class="s">"</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"><M5StickCPlus.h></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">""</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">&</span><span class="n">gyroX</span><span class="p">,</span> <span class="o">&</span><span class="n">gyroY</span><span class="p">,</span> <span class="o">&</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">&</span><span class="n">ax</span><span class="p">,</span> <span class="o">&</span><span class="n">ay</span><span class="p">,</span> <span class="o">&</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">"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">"</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">"%7.2f , %7.2f , %7.2f </span><span class="se">\n</span><span class="s">"</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">"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 "</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("%7.2f,%7.2f,%7.2f,", 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"><IRremoteESP8266.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><IRsend.h></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非公式日本語リファレンス <<a class="reference external" href="https://lang-ship.com/reference/unofficial/M5StickC">https://lang-ship.com/reference/unofficial/M5StickC</a>></https:></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> © 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>