スイッチサイエンス 開発者ブログ 2021-04-14T08:54:48+09:00 switch-education Hatena::Blog hatenablog://blog/17391345971658327124 RaspberryPi-PicoをArduinoで動かす hatenablog://entry/26006613715900398 2021-04-14T08:54:48+09:00 2021-04-14T08:54:48+09:00 現在の状況 執筆時点(2021-04-13)で公式のArduinoCoreサポートにRaspberryPi-Picoが追加されまています。その環境のセットアップとサンプルコードを動かしてみます。 サンプルコード int led = LED_BUILTIN; void setup() { Serial.begin(115200); pinMode(led, OUTPUT); } void loop() { digitalWrite(led, 1); delay(200); digitalWrite(led, 0); delay(200); } arduino-cliを使う方法 macOSの場合で… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210414/20210414085437.png" alt="f:id:irieda:20210414085437p:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>現在の状況</h1> <p>執筆時点(2021-04-13)で公式のArduinoCoreサポートにRaspberryPi-Picoが追加されまています。その環境のセットアップとサンプルコードを動かしてみます。</p> <h2>サンプルコード</h2> <pre class="code lang-cpp" data-lang="cpp" data-unlink><span class="synType">int</span> led = LED_BUILTIN; <span class="synType">void</span> setup() { Serial.begin(<span class="synConstant">115200</span>); pinMode(led, OUTPUT); } <span class="synType">void</span> loop() { digitalWrite(led, <span class="synConstant">1</span>); delay(<span class="synConstant">200</span>); digitalWrite(led, <span class="synConstant">0</span>); delay(<span class="synConstant">200</span>); } </pre> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>を使う方法</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>の場合で解説しますが、その他の環境でもほとんど同じ操作です。 マウントパス名がドライブレターになったりシリアルポート名の表現が違うくらいです。</p> <p>あらかじめ以下の2ツールをインストールしましょう。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/brew">brew</a> install <a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>)</li> <li>pyserial(python3 -m pip install pyserial)</li> </ul> <h3>ボードサポートインストール</h3> <pre class="code" data-lang="" data-unlink>arduino-cli core update-index arduino-cli core install arduino:mbed_rp2040</pre> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a></h3> <pre class="code" data-lang="" data-unlink>arduino-cli compile -b arduino:mbed_rp2040:pico sample</pre> <h3>アップロード</h3> <p>BOOTSEL押しながらRUN端子を一瞬LowにするかUSB給電を入れ直します。 /Volumes/RPI-RP2がマウントされるのを確認して以下のコマンドを実行します。</p> <pre class="code" data-lang="" data-unlink>arduino-cli upload -b arduino:mbed_rp2040:pico -p /Volumes/RPI-RP2 sample</pre> <h3>シリアルモニター</h3> <pre class="code" data-lang="" data-unlink>pyserial-miniterm /dev/tty.usbmodem#### 115200</pre> <h1>まとめ</h1> <ul> <li>やっと公式版の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>対応がでました</li> <li>USBマスストレージ方式なので書き込みのクチとログモニターのクチが分かれています</li> <li>BOOTSELリセットがやや面倒ですね</li> <li>mbedベース+pico-<a class="keyword" href="http://d.hatena.ne.jp/keyword/sdk">sdk</a>で実装されていますのでそれぞれの機能の利用は可能かも(未調査)</li> </ul> irieda AlpineLinuxをRaspberryPiに簡単インストール hatenablog://entry/26006613715234229 2021-04-12T14:50:17+09:00 2021-04-12T14:56:06+09:00 https://tech.144lab.com/entry/2020/08/21/alpine-headless-install この記事の内容だと失敗するケースが見つかったので改訂版としてこの記事を書きます。 AlpineLinuxはRaspberryPi用に公式イメージを配布しています。 執筆時点(2021−04−10)の最新バージョンはv3.13.4です RaspberryPiのBIOSが持っている機能で 「FAT32のSDカードのルートに特定のファイルがあればブートできる」 というのを利用してtar.gz形式のブータブルイメージを配布しているのが特徴的です。 この配布形式の良いところは… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210412/20210412144834.png" alt="f:id:irieda:20210412144834p:plain" title="" class="hatena-fotolife" itemprop="image"></span> <a href="https://tech.144lab.com/entry/2020/08/21/alpine-headless-install">https://tech.144lab.com/entry/2020/08/21/alpine-headless-install</a> この記事の内容だと失敗するケースが見つかったので改訂版としてこの記事を書きます。</p> <p>AlpineLinuxはRaspberryPi用に公式イメージを配布しています。 執筆時点(2021−04−10)の最新バージョンはv3.13.4です</p> <p>RaspberryPiの<a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>が持っている機能で 「<a class="keyword" href="http://d.hatena.ne.jp/keyword/FAT32">FAT32</a>のSDカードのルートに特定のファイルがあればブートできる」 というのを利用してtar.gz形式のブータブルイメージを配布しているのが特徴的です。</p> <p>この配布形式の良いところはややこしい仕掛けを使わずに任意の容量のSDカードにインストールできること。数十個の合計100MB前後ファイルを書き込めばブート可能になるというお手軽さ。</p> <p>さらに、そのブータブルなSDカードをバックアップしたりリストアするのも通常のファイル操作だけで行えます。</p> <p>つまり、インストールもバックアップ・リストアも2〜3分でできちゃうというお手軽<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">Linuxディストリビューション</a>なのです。また、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%AF%A5%EC%A5%B9">ディスクレス</a>モード」を持っており、突然の電源切りでディスクが壊れないという特徴もあります。</p> <h2>有線LANを使う最短のインストール方法</h2> <p>手元で最低限のセットアップを行ったAlpineLinux(aarch64)-v3.13.4のイメージを<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a>におきました。以下の手順でインストールすることができます。</p> <ul> <li>マイクロSDカードを<a class="keyword" href="http://d.hatena.ne.jp/keyword/FAT32">FAT32</a>でフォーマット。</li> <li><code>git clone https://github.com/144lab/rpi64-alpine-image.git</code></li> <li><code>git -C rpi64-alpine-image archive main | tar xv -C &lt;マウントSDカードパス&gt;</code></li> <li><code>curl https://github.com/&lt;GitHubアカウントID&gt;.keys &gt; &lt;マウントSDカードパス&gt;/authorized_keys</code></li> <li>マイクロSDカードを取り出してラズパイ(3or4)に挿す</li> <li>ラズパイには<a class="keyword" href="http://d.hatena.ne.jp/keyword/DHCP">DHCP</a>でつながる有線LANケーブルを繋ぐ</li> <li>ラズパイの電源を供給開始</li> </ul> <p>ラズパイの<a class="keyword" href="http://d.hatena.ne.jp/keyword/HDMI">HDMI</a>出力に以下のような表示が1〜2分後に表示されます。(確認しなくても良い)</p> <pre class="code" data-lang="" data-unlink>* Starting firstboot ... [ ok ] * Starting local ... [ ok ] Welcome to Alpine Linux 3.13</pre> <p>以下のコマンドで同じLANに参加しているPCから接続</p> <pre class="code" data-lang="" data-unlink>ssh root@raspberrypi.local</pre> <h2>イメージを作成するユーティリティ</h2> <p>あらかじめ必要なツール</p> <ul> <li>go 1.16.x以降</li> </ul> <pre class="code" data-lang="" data-unlink>go install github.com/144lab/rpi-alpine-installer@latest</pre> <p>マイクロSDカードを<a class="keyword" href="http://d.hatena.ne.jp/keyword/FAT32">FAT32</a>でフォーマットしておき、以下のコマンドを実行</p> <pre class="code" data-lang="" data-unlink>curl https://github.com/&lt;GitHubアカウントID&gt;.keys &gt; authorized_keys rpi-alpine-installer -version=v3.13.4 -arch=aarch64 \ -authorized_keys=authorized_keys \ -ssid=&lt;Wi-Fi SSID&gt; -passphrase=&lt;Wi-Fiパスフレーズ&gt; \ -dist=&lt;マウントSDカードパス&gt;</pre> <ul> <li><code>-authorized_keys</code>は指定があればそのファイルをrootユーザーの<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>設定に投げ込みます。</li> <li><code>-ssid</code>指定をしない場合、有線LANを使って初期化します。指定した場合は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C0%FELAN">無線LAN</a>を使って初期化します。</li> <li><code>-version</code>に指定可能なものは<a href="https://alpinelinux.org/releases/">こちら</a>で確認してください(ただし、あまり古いと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>ドライバがバンドルされていないなどの問題があったりします。)</li> <li><code>-arch</code>に指定可能なのはarmv7/armhf/aarch64の3種類</li> <li><code>-dist</code>指定を省略した場合は<code>カレントフォルダ/dist</code>にイメージファイル群を出力します。</li> </ul> <p>これで直接SDカードに書き込むやり方で「RaspberryPi 4」、「RaspberryPi Zero W」のブータブルイメージが作れることを確認しました。Zero Wの場合は<code>-arch=armhf</code>指定です。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>を設定する場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%D5%A5%EC%A1%BC%A5%BA">パスフレーズ</a>が関わるので<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a>の公開側に入れたりしてはいけません)</p> <h2>ヘッドレスインストールの仕組みとハマりどころ</h2> <p>初回起動時にだけ起動する「local」という名前のサービスをAlpine配布イメージに追加します。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%AF%A5%EC%A5%B9">ディスクレス</a>モードのためのオーバーレイファイルを初期投入することで実現しています。</p> <p>headless.apkovl.tar.gzの中身</p> <ul> <li>etc/ <ul> <li>.default_boot_services</li> <li>local.d/ <ul> <li>headless.start // インストールシナリオ</li> </ul> </li> <li>runlevels/ <ul> <li>default/ <ul> <li>local // -> headless.startへの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%DC%A5%EA%A5%C3%A5%AF%A5%EA%A5%F3%A5%AF">シンボリックリンク</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> <p>headless.startの中身</p> <pre class="code shell:headless.start" data-lang="shell:headless.start" data-unlink>#!/bin/sh __create_eni() { cat &lt;&lt;-EOF &gt; /etc/network/interfaces auto lo iface lo inet loopback auto ${iface} iface ${iface} inet dhcp hostname ${hostname} EOF } __create_eww() { cat &lt;&lt;-EOF &gt; /etc/wpa_supplicant/wpa_supplicant.conf ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid=&#34;${ssid}&#34; psk=&#34;${psk}&#34; } EOF } __edit_ess() { cat &lt;&lt;-EOF &gt;&gt; /etc/ssh/sshd_config PermitRootLogin yes IPQoS 0x00 EOF } __find_wint() { for dev in /sys/class/net/* do if [ -e &#34;${dev}&#34;/wireless -o -e &#34;${dev}&#34;/phy80211 ] then echo &#34;${dev##*/}&#34; fi done } ovlpath=$(find /media -name *.apkovl.tar.gz -exec dirname {} \; | head -n1) read ssid psk &lt; &#34;${ovlpath}/wifi.txt&#34; if [ ${ssid} ] then iface=$(__find_wint) apk add wpa_supplicant __create_eww rc-service wpa_supplicant start else iface=&#34;eth0&#34; fi hostname=raspberrypi setup-hostname ${hostname} hostname ${hostname} __create_eni rc-service networking start /sbin/setup-sshd -c openssh __edit_ess install -m 700 -d /root/.ssh install -m 600 /dev/null /root/.ssh/authorized_keys if [ -e &#34;${ovlpath}/authorized_keys&#34; ] then cat &#34;${ovlpath}/authorized_keys&#34; &gt;&gt; /root/.ssh/authorized_keys fi rc-service sshd restart setup-ntp -c chrony chronyc -a makestep setup-apkrepos -1 setup-lbu mmcblk0p1 setup-apkcache /media/mmcblk0p1/cache apk add rng-tools dbus avahi rc-update add rngd boot rc-update add wpa_supplicant boot rc-update add urandom boot rc-update add dbus rc-update add avahi-daemon rc-service rngd start rc-service wpa_supplicant start rc-service urandom start rc-service dbus start rc-service avahi-daemon start mount -o remount,rw ${ovlpath} rm ${ovlpath}/*.apkovl.tar.gz rm ${ovlpath}/wifi.txt rm ${ovlpath}/authorized_keys rc-update del local default lbu add /root/.ssh/authorized_keys lbu commit -d</pre> <p>このシナリオの大まかな手順は以下の通り</p> <ul> <li>hostnameに「raspberrypi」をセット</li> <li>ネットワーキングをスタート</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/sshd">sshd</a>をセットアップ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/sshd">sshd</a>_configにいくつか設定を追加</li> <li>SDカードにauthorized_keysファイルがあればその内容を/root/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a>/authorized_keysに追記</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/sshd">sshd</a>をリスタート</li> <li>ntp同期デーモン(chirony)のセットアップ</li> <li><strong>強制時刻同期</strong>(chronyc -a makestep)</li> <li>apk<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>URLの設定とインデックス更新</li> <li>lbu(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%AF%A5%EC%A5%B9">ディスクレス</a>モード)のセットアップ</li> <li>apk-cacheのセットアップ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>、avahi関連パッケージのインストール</li> <li>各種デーモンの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C6%B0%B5%AF%C6%B0">自動起動</a>設定</li> <li>各種サービスの開始</li> <li>SDカードを読み書き可能にして再マウント</li> <li>初回起動用ファイルの削除</li> <li>「local」サービス(このシナリオ)の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C6%B0%B5%AF%C6%B0">自動起動</a>無効化</li> <li>/root/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a>/authorized_keysをlbuに追加</li> <li>lbu commitにてこれまでの構成変更を永続化</li> </ul> <p>この中で原案のシナリオにも対策がなかったハマりどころは、ラズパイの時計があってなくて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%C8%BE%DA%CC%C0%BD%F1">ルート証明書</a>の有効期間の範囲外のために<a class="keyword" href="http://d.hatena.ne.jp/keyword/HTTPS">HTTPS</a>通信に失敗するという現象。 それまでうまく動いたり動かなかったりがあったんですが<strong>強制時刻同期</strong>を追加することでやっと安定しました。</p> <p>もう一つのはまりどころは以下の記述でheadコマンドへのパイプを追加しました。</p> <pre class="code" data-lang="" data-unlink>ovlpath=$(find /media -name *.apkovl.tar.gz -exec dirname {} \; | head -n1)</pre> <p>これなしの時、SDカードの「headless.apkovl.tar.gz」を削除とかするとSDカードルートに「.Trush」フォルダが作られそこに一時保管されます。消し忘れにしろovlpathが意図する単一のパスにならなくなっていてうまく動かなくなるということもありました。</p> <p>イメージ作成ユーティリティは以下のファイルセットを指定フォルダに出力するだけです</p> <ul> <li>Alpineイメージ解凍ファイル群(元の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6">アーカイブ</a>は該当の外部URLから自動ダウンロードします)</li> <li>headless.apkovl.tar.gz(インストールシナリオが入ったオーバーレイファイル)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>.txt(<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssid">ssid</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%D5%A5%EC%A1%BC%A5%BA">パスフレーズ</a>)</li> <li>authorized_keys(<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a>用公開鍵一覧)</li> </ul> irieda M5Stack Core2で複数の音を鳴らす hatenablog://entry/26006613708569716 2021-03-26T10:25:07+09:00 2021-03-29T17:30:09+09:00 144Labの入江田です。 今回はM5Stack Core2で複数の音素材を同時に鳴らす方法をまとめてみました。 素材の入手 音素材の入手はフリー素材を公開しているサイトから。 素材の利用規約をよく読んで利用しましょう。 サンプリングレートは44.1KHzのものを入手しましょう。 (異なる場合はAudacityなどでサンプリングレートのリサンプルで変換を) ffmpeg -i sound1.wav -f s16le -acodec pcm_s16le sound1.raw xxd -i sound1.raw sound1.h xxd -iはバイナリファイルをCコンパイラで解釈可能なunsign… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210326/20210326102443.png" alt="f:id:irieda:20210326102443p:plain" title="" class="hatena-fotolife" itemprop="image"></span> 144Labの入江田です。 今回はM5Stack Core2で複数の音素材を同時に鳴らす方法をまとめてみました。</p> <h2>素材の入手</h2> <p>音素材の入手はフリー素材を公開しているサイトから。 素材の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%F8%CD%D1%B5%AC%CC%F3">利用規約</a>をよく読んで利用しましょう。 サンプリングレートは44.1KHzのものを入手しましょう。 (異なる場合は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Audacity">Audacity</a>などでサンプリングレートのリサンプルで変換を)</p> <pre class="code shell" data-lang="shell" data-unlink>ffmpeg -i sound1.wav -f s16le -acodec pcm_s16le sound1.raw xxd -i sound1.raw sound1.h</pre> <p><code>xxd -i</code>はバイナリファイルをC<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>で解釈可能な<code>unsigned char</code>配列定義の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>に変換してくれます。</p> <p>出力されたヘッダに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%F8%BA%EE%B8%A2">著作権</a>表示と<code>const</code>指定を追加します。</p> <pre class="code cpp:sound.h" data-lang="cpp:sound.h" data-unlink>// Copyright NHK const unsigned char sound1_raw[] = {...}</pre> <p>constを付けない場合<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>がRAM領域にこのデータを置こうとしてサイズがでかい場合すぐにメモリが不足します。constをつけておくとコード領域(<a class="keyword" href="http://d.hatena.ne.jp/keyword/FLASH">FLASH</a>メモリ)に置くのでこちらは比較的容量に余裕があります。上記の手法で2〜3サンプル用意しましょう。</p> <h2>M5Core2用<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>環境をセットアップ</h2> <ul> <li><a href="https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json">https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json</a> をパッケージURLsに追加</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>の場合: <code>M5Stack by M5Stack official</code>サポートをインストールします。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>版の場合: <a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a> core update-index; <a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a> core install m5stack:esp32</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>の場合: M5Core2ライブラリをインストール</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>の場合: <a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a> lib update-index;<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a> lib install M5Core2</li> </ul> <h2>サンプルコード</h2> <p>InitI2SSpeakOrMic関数や定数宣言のほとんどはM5Core2のSpeakerサンプルのコードそのままです。今回のキモになるのはSourceクラスの定義と<a class="keyword" href="http://d.hatena.ne.jp/keyword/spk">spk</a>_output関数の処理です。 sourcesに複数のSource<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を初期化していますが、これが最大同時発音数になっています。</p> <ul> <li>SourceのNext()メソッドは次のサンプルデータを取り出す処理。</li> <li>SourceのStart()メソッドはptrを音素材の先頭に巻き戻して音の再生を開始します。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/spk">spk</a>_outputでは3つのSoundのNext()結果を加算合成して32サンプルの出力波形をbuffに詰め込んでそれをi2s_writeで出力します。</li> <li>SourceのNext()では音素材を全て出力し終えたらゼロを返します(無音になる)。</li> </ul> <pre class="code cpp:audioSample.ino" data-lang="cpp:audioSample.ino" data-unlink>#include &lt;M5Core2.h&gt; #include &lt;driver/i2s.h&gt; #include &#34;sound1.h&#34; #include &#34;sound2.h&#34; #include &#34;sound3.h&#34; #define CONFIG_I2S_BCK_PIN 12 #define CONFIG_I2S_LRCK_PIN 0 #define CONFIG_I2S_DATA_PIN 2 #define CONFIG_I2S_DATA_IN_PIN 34 #define Speak_I2S_NUMBER I2S_NUM_0 #define SAMPLE_RATE 44100 #define MODE_MIC 0 #define MODE_SPK 1 #define DATA_SIZE 32 bool InitI2SSpeakOrMic(int mode) { esp_err_t err = ESP_OK; i2s_driver_uninstall(Speak_I2S_NUMBER); i2s_config_t i2s_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER), .sample_rate = SAMPLE_RATE, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT, .communication_format = I2S_COMM_FORMAT_I2S, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 2, .dma_buf_len = 128, }; if (mode == MODE_MIC) { i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_PDM); } else { i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX); i2s_config.use_apll = false; i2s_config.tx_desc_auto_clear = true; } err += i2s_driver_install(Speak_I2S_NUMBER, &amp;i2s_config, 0, NULL); i2s_pin_config_t tx_pin_config; tx_pin_config.bck_io_num = CONFIG_I2S_BCK_PIN; tx_pin_config.ws_io_num = CONFIG_I2S_LRCK_PIN; tx_pin_config.data_out_num = CONFIG_I2S_DATA_PIN; tx_pin_config.data_in_num = CONFIG_I2S_DATA_IN_PIN; err += i2s_set_pin(Speak_I2S_NUMBER, &amp;tx_pin_config); err += i2s_set_clk(Speak_I2S_NUMBER, SAMPLE_RATE, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO); return true; } class Source { const int16_t *start; int length; int16_t *ptr; int remain; public: Source(const unsigned char *buff, int length) { this-&gt;start = (const int16_t *)(buff); this-&gt;length = length / sizeof(int16_t); this-&gt;remain = 0; }; int16_t Next() { int16_t res = 0; if (this-&gt;remain &gt; 0) { res = (*(this-&gt;ptr++)) / 2; this-&gt;remain--; } return res; }; void Start() { this-&gt;ptr = (int16_t *)(this-&gt;start); this-&gt;remain = this-&gt;length; }; }; Source *sources[] = { new Source(sound1_raw, sound1_raw_len), new Source(sound2_raw, sound2_raw_len), new Source(sound3_raw, sound3_raw_len), }; void spk_output() { static int16_t buff[DATA_SIZE]; for (int i = 0; i &lt; DATA_SIZE; i++) { int16_t output = 0; for (int n = 0; n &lt; 3; n++) { output += sources[n]-&gt;Next(); } buff[i] = output; } size_t bytes_written = 0; i2s_write(Speak_I2S_NUMBER, buff, DATA_SIZE, &amp;bytes_written, portMAX_DELAY); } void setup() { Serial.begin(115200); M5.begin(true, true, true, true); M5.Axp.SetSpkEnable(true); InitI2SSpeakOrMic(MODE_SPK); M5.Lcd.setTextSize(3); M5.Lcd.print(&#34;Audio Example&#34;); } void loop() { M5.update(); if (M5.BtnA.wasPressed()) sources[0]-&gt;Start(); if (M5.BtnB.wasPressed()) sources[1]-&gt;Start(); if (M5.BtnC.wasPressed()) sources[2]-&gt;Start(); spk_output(); }</pre> <h2>発展</h2> <ul> <li>今回は3つの素材で3つの同時発音を固定で紐づけて簡略化しています</li> <li>本来は同時発音数を決めて、Sourceと素材との紐付けは動的に行うのが理想です</li> <li>最終出力波形には不連続なものを出してはいけません</li> <li>音素材は鳴った後、無音になるまでの波形が含まれるのでフェードアウトの処理を省略しています</li> <li>素材鳴動を中断する要件がある場合フェードアウトする処理が必須です</li> <li>素材鳴動を途中から再開する必要があるならフェードインする処理が必要です</li> </ul> <h2>動作例</h2> <iframe src="https://drive.google.com/file/d/1TVGDSItQ07ge-KxXoNe3pqZrmh-DawUR/preview" width="640" height="480"></iframe> <p><em>音素材は <a href="https://www.nhk.or.jp/archives/creative/material/">NHKクリエイティブ・ライブラリー</a>より</em></p> irieda 2軸加速度センサーIIS2ICLXブレイクアウトをTinyGo(nRF52840)で動かす hatenablog://entry/26006613708326331 2021-03-25T17:40:21+09:00 2021-03-26T10:14:51+09:00 144Labの入江田です。 2軸加速度センサーIIS2ICLXブレイクアウトをArduino(nRF52840)で動かすの内容をArduinoではなくTinyGoで実装するときの方法を紹介します。 あらかじめ必要なもの Go v1.16.0以降(Goのインストール方法) TinyGo v0.17.0以降(TinyGoのインストール方法) あとターゲットによっては追加インストールが必要になったりしますが、今回の事例では不要です。 プロジェクトの構成 プロジェクト名フォルダを作成し、Goモジュールを初期化します。 mkdir sampleProject cd sampleProject go mo… <p>144Labの入江田です。</p> <p><a href="https://tech.144lab.com/entry/2021/03/25/IIS2ICLX_Arduino">2軸加速度センサーIIS2ICLXブレイクアウトをArduino(nRF52840)で動かす</a>の内容を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>ではなくTinyGoで実装するときの方法を紹介します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210325/20210325173843.png" alt="f:id:irieda:20210325173843p:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2>あらかじめ必要なもの</h2> <ul> <li>Go v1.16.0以降(<a href="https://golang.org/doc/install">Goのインストール方法</a>)</li> <li>TinyGo v0.17.0以降(<a href="https://tinygo.org/getting-started/">TinyGoのインストール方法</a>)</li> </ul> <p>あとターゲットによっては追加インストールが必要になったりしますが、今回の事例では不要です。</p> <h2>プロジェクトの構成</h2> <p>プロジェクト名フォルダを作成し、Goモジュールを初期化します。</p> <pre class="code" data-lang="" data-unlink>mkdir sampleProject cd sampleProject go mod init sampleProject</pre> <p>以下のIIS2ICLX用のドライバー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>の「iis2iclx_reg.c」と「iis2iclx_reg.h」をプロジェクトフォルダにダウンロードします。 <a href="https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/6788aa613bd11340767f691c77e306fc95c05555/iis2iclx_STdC">https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/6788aa613bd11340767f691c77e306fc95c05555/iis2iclx_STdC</a></p> <h2>Goラッパーの実装</h2> <p>iis2iclx_go.cを作成します。 <code>stmdev_ctx_t *dev_ctx</code>を初期化してそれを引き出せる関数を用意するだけです。 platform_readとplatform_writeはGo側の実装を参照します。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&quot;iis2iclx_go.h&quot;</span> <span class="synType">extern</span> <span class="synType">int32_t</span> platform_read(<span class="synType">void</span> *handle, <span class="synType">uint8_t</span> reg, <span class="synType">uint8_t</span> *bufp, <span class="synType">uint16_t</span> len); <span class="synType">extern</span> <span class="synType">int32_t</span> platform_write(<span class="synType">void</span> *handle, <span class="synType">uint8_t</span> reg, <span class="synType">uint8_t</span> *bufp, <span class="synType">uint16_t</span> len); <span class="synType">static</span> stmdev_ctx_t *dev_ctx = &amp;(stmdev_ctx_t){.write_reg = platform_write, .read_reg = platform_read}; stmdev_ctx_t *getContext() { <span class="synStatement">return</span> dev_ctx; } </pre> <p>iis2iclx_go.hを作成します。 getContext()をexternするだけです。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#ifndef IIS2ICLX_GO_H</span> <span class="synPreProc">#define IIS2ICLX_GO_H</span> <span class="synPreProc">#include </span><span class="synConstant">&quot;iis2iclx_reg.h&quot;</span> <span class="synType">extern</span> stmdev_ctx_t *getContext(); <span class="synPreProc">#endif</span> <span class="synComment">// IIS2ICLX_GO_H</span> </pre> <p>iis2iclx.goを作成します。 platform_writeとplatform_readの関数定義をCの参照宣言に合うようにGoで書いてexportします。</p> <pre class="code lang-go" data-lang="go" data-unlink><span class="synStatement">package</span> main <span class="synComment">/*</span> <span class="synComment">#include &quot;iis2iclx_go.h&quot;</span> <span class="synComment">#include &quot;string.h&quot;</span> <span class="synComment">*/</span> <span class="synStatement">import</span> <span class="synConstant">&quot;C&quot;</span> <span class="synStatement">import</span> ( <span class="synConstant">&quot;log&quot;</span> <span class="synConstant">&quot;machine&quot;</span> <span class="synConstant">&quot;time&quot;</span> <span class="synConstant">&quot;unsafe&quot;</span> ) <span class="synStatement">var</span> ( p33 = machine.Pin(<span class="synConstant">2</span>) <span class="synComment">// power 3.3V</span> gnd = machine.Pin(<span class="synConstant">3</span>) <span class="synComment">// power gnd</span> io4 = machine.Pin(<span class="synConstant">31</span>) <span class="synComment">// io4</span> sda = machine.Pin(<span class="synConstant">30</span>) <span class="synComment">// i2c sda</span> scl = machine.Pin(<span class="synConstant">29</span>) <span class="synComment">// i3c scl</span> ) <span class="synComment">//export platform_write</span> <span class="synStatement">func</span> platform_write(handle <span class="synType">unsafe.Pointer</span>, reg <span class="synType">uint8</span>, buf *<span class="synType">uint8</span>, length <span class="synType">uint16</span>) <span class="synType">int32</span> { b := <span class="synStatement">make</span>([]<span class="synType">byte</span>, length) C.memcpy(<span class="synType">unsafe.Pointer</span>(&amp;b[<span class="synConstant">0</span>]), <span class="synType">unsafe.Pointer</span>(buf), C.<span class="synType">uint</span>(length)) machine.I2C1.WriteRegister(C.IIS2ICLX_I2C_ADD_L&gt;&gt;<span class="synConstant">1</span>, reg, b) <span class="synStatement">return</span> <span class="synConstant">0</span> } <span class="synComment">//export platform_read</span> <span class="synStatement">func</span> platform_read(handle <span class="synType">unsafe.Pointer</span>, reg <span class="synType">uint8</span>, buf *<span class="synType">uint8</span>, length <span class="synType">uint16</span>) <span class="synType">int32</span> { b := <span class="synStatement">make</span>([]<span class="synType">byte</span>, length) machine.I2C1.ReadRegister(C.IIS2ICLX_I2C_ADD_L&gt;&gt;<span class="synConstant">1</span>, reg, b) C.memcpy(<span class="synType">unsafe.Pointer</span>(buf), <span class="synType">unsafe.Pointer</span>(&amp;b[<span class="synConstant">0</span>]), C.<span class="synType">uint</span>(<span class="synStatement">len</span>(b))) <span class="synStatement">return</span> <span class="synConstant">0</span> } <span class="synComment">// Device ...</span> <span class="synStatement">type</span> Device <span class="synStatement">struct</span> { ctx *C.stmdev_ctx_t x, y <span class="synType">float32</span> temperature <span class="synType">float32</span> } <span class="synStatement">func</span> Setup() *Device { p33.Configure(machine.PinConfig{Mode: machine.PinOutput}) gnd.Configure(machine.PinConfig{Mode: machine.PinOutput}) gnd.Low() p33.High() machine.I2C1.Configure(machine.I2CConfig{ Frequency: machine.TWI_FREQ_100KHZ, SCL: scl, SDA: sda, }) time.Sleep(<span class="synConstant">20</span> * time.Millisecond) dev := &amp;Device{ctx: C.getContext()} C.iis2iclx_bus_mode_set(dev.ctx, C.IIS2ICLX_SEL_BY_HW) <span class="synStatement">if</span> dev.GetWhoAmI() != C.IIS2ICLX_ID { log.Println(<span class="synConstant">&quot;get who am i failed&quot;</span>) } C.iis2iclx_reset_set(dev.ctx, C.PROPERTY_ENABLE) rst := C.uint8_t(<span class="synConstant">1</span>) <span class="synStatement">for</span> rst != <span class="synConstant">0</span> { C.iis2iclx_reset_get(dev.ctx, &amp;rst) time.Sleep(<span class="synConstant">10</span> * time.Millisecond) } <span class="synComment">/* Enable Block Data Update */</span> C.iis2iclx_block_data_update_set(dev.ctx, C.PROPERTY_ENABLE) <span class="synComment">/* Set Output Data Rate */</span> C.iis2iclx_xl_data_rate_set(dev.ctx, C.IIS2ICLX_XL_ODR_12Hz5) <span class="synComment">/* Set full scale */</span> C.iis2iclx_xl_full_scale_set(dev.ctx, C.IIS2ICLX_2g) <span class="synComment">/* Configure filtering chain(No aux interface)</span> <span class="synComment"> * Accelerometer - LPF1 + LPF2 path</span> <span class="synComment"> */</span> C.iis2iclx_xl_hp_path_on_out_set(dev.ctx, C.IIS2ICLX_LP_ODR_DIV_100) C.iis2iclx_xl_filter_lp2_set(dev.ctx, C.PROPERTY_ENABLE) log.Println(<span class="synConstant">&quot;setup completed&quot;</span>) <span class="synStatement">return</span> dev } <span class="synStatement">func</span> (d *Device) GetWhoAmI() <span class="synType">byte</span> { b := <span class="synStatement">make</span>([]<span class="synType">byte</span>, <span class="synConstant">1</span>) C.iis2iclx_device_id_get(d.ctx, (*<span class="synType">uint8</span>)(<span class="synType">unsafe.Pointer</span>(&amp;b[<span class="synConstant">0</span>]))) <span class="synStatement">return</span> b[<span class="synConstant">0</span>] } <span class="synStatement">func</span> (d *Device) Update() <span class="synType">error</span> { reg := <span class="synType">uint8</span>(<span class="synConstant">1</span>) C.iis2iclx_xl_flag_data_ready_get(d.ctx, &amp;reg) <span class="synStatement">if</span> reg != <span class="synConstant">0</span> { <span class="synComment">/* Read acceleration field data */</span> accel := [<span class="synConstant">2</span>]<span class="synType">int16</span>{} C.iis2iclx_acceleration_raw_get(d.ctx, &amp;accel[<span class="synConstant">0</span>]) d.x = <span class="synType">float32</span>(accel[<span class="synConstant">0</span>]) * <span class="synConstant">0.061</span> <span class="synComment">//C.iis2iclx_from_fs2g_to_mg(accel[0])</span> d.y = <span class="synType">float32</span>(accel[<span class="synConstant">1</span>]) * <span class="synConstant">0.061</span> <span class="synComment">//C.iis2iclx_from_fs2g_to_mg(accel[1])</span> } C.iis2iclx_temp_flag_data_ready_get(d.ctx, &amp;reg) <span class="synStatement">if</span> reg != <span class="synConstant">0</span> { <span class="synComment">/* Read temperature data */</span> tmp := <span class="synType">int16</span>(<span class="synConstant">0</span>) C.iis2iclx_temperature_raw_get(d.ctx, &amp;tmp) d.temperature = (<span class="synType">float32</span>(tmp) / <span class="synConstant">256.0</span>) + <span class="synConstant">25.0</span> <span class="synComment">//C.iis2iclx_from_lsb_to_celsius(tmp)</span> } <span class="synStatement">return</span> <span class="synStatement">nil</span> } <span class="synStatement">func</span> (d *Device) Accel() (x, y <span class="synType">float32</span>) { <span class="synStatement">return</span> d.x, d.y } <span class="synStatement">func</span> (d *Device) Temperature() <span class="synType">float32</span> { <span class="synStatement">return</span> d.temperature } </pre> <h2>アプリケーションの実装</h2> <p>ここまで用意できたら、mainの実装は以下のように書けばOKです。</p> <pre class="code lang-go" data-lang="go" data-unlink><span class="synStatement">package</span> main <span class="synStatement">import</span> ( <span class="synConstant">&quot;fmt&quot;</span> <span class="synConstant">&quot;machine&quot;</span> <span class="synConstant">&quot;time&quot;</span> ) <span class="synStatement">func</span> main() { dev := Setup() fmt.Println(<span class="synConstant">&quot;Setup Completed&quot;</span>) fmt.Printf(<span class="synConstant">&quot;WhoAmI: %X</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>, dev.GetWhoAmI()) machine.UART0.Configure(machine.UARTConfig{BaudRate: <span class="synConstant">115200</span>}) <span class="synStatement">for</span> { dev.Update() x, y := dev.Accel() fmt.Printf(<span class="synConstant">&quot;Accel: %6.1f, %6.1f &quot;</span>, x, y) fmt.Printf(<span class="synConstant">&quot;Temp.: %5.2f</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>, dev.Temperature()) time.Sleep(<span class="synConstant">300</span> * time.Millisecond) } } </pre> <h2>TinyGoでのターゲット指定方法</h2> <p>TinyGoはfeather-nrf52840(nRF52840開発ボード)をサポートしているのでそれを継承して以下のようなconfig.<a class="keyword" href="http://d.hatena.ne.jp/keyword/json">json</a>を書きます。</p> <pre class="code json:config.json" data-lang="json:config.json" data-unlink>{ &#34;inherits&#34;: [&#34;feather-nrf52840&#34;], &#34;flash-method&#34;: &#34;msd&#34;, &#34;msd-volume-name&#34;: &#34;NRF52BOOT&#34;, &#34;msd-firmware-name&#34;: &#34;firmware.uf2&#34; }</pre> <h2>ファイル一覧とビルド方法</h2> <p>以上でファイル一覧は以下のようになります。</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; ls -1 config.json go.mod iis2iclx_go.c iis2iclx_go.h iis2iclx.go iis2iclx_reg.c iis2iclx_reg.h main.go</pre> <p>以下のコマンドでビルドできます。</p> <pre class="code shell" data-lang="shell" data-unlink>tinygo build -target config.json -o app.uf2 .</pre> <p>書き込みには以下のコマンドで。</p> <pre class="code shell" data-lang="shell" data-unlink>tinygo flash -target config.json .</pre> <p><code>pip3 install pyserial</code>すると<code>pyserial-miniterm</code>というツールが使えます。 <code>pyserial-miniterm ポート名 115200</code>するとターゲットのログ出力が見れます。</p> <p>冒頭の元記事とほぼ同じ出力が得られます。</p> <h2>まとめ</h2> <ul> <li>TinyGoによる組み込み開発はだいぶ実用レベルになってきています。</li> <li>USBまわりや<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>も利用可能になっています。</li> <li>未サポートのボードでもCPUがコンパチならこの記事のようにすぐに対応実装を書き始めることができます。</li> <li>CGOという機能を経由してCの資産を取り込んで利用することができます。</li> <li>ただし、本家GoのCGOに比べると細かいいくつかの機能はまだありません。</li> <li>Cの資産を取り込めるという点で<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>による組み込み開発よりは実用に向いています。</li> <li>TinyGoは<a class="keyword" href="http://d.hatena.ne.jp/keyword/llvm">llvm</a>を利用するので出力がコンパクトです。今回の事例でも成果物バイナリは70KiB弱で済みます。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>はTinyGoと連携していくことが<a href="https://blog.arduino.cc/2019/08/23/tinygo-on-arduino/">公表</a>済みです。</li> </ul> irieda 2軸加速度センサーIIS2ICLXブレイクアウトをArduino(nRF52840)で動かす hatenablog://entry/26006613708325414 2021-03-25T17:37:35+09:00 2021-03-25T17:42:13+09:00 144Labの入江田です。 今後スイッチサイエンスから発売する予定の傾斜センサブレイクアウトボードをnRF52840ボードとArduinoで駆動してみました。 STMicro社製の産業向け加速度センサIIS2ICLX「Tilt Sensor Module」(発売予定) STMicroが公開しているサンプル コード例はここにあります。 https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/6788aa613bd11340767f691c77e306fc95c05555/iis2iclx_STdC IIS2ICLX… <p>144Labの入江田です。</p> <p>今後スイッチサイエンスから発売する予定の傾斜センサ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EC%A5%A4%A5%AF%A5%A2%A5%A6%A5%C8">ブレイクアウト</a>ボードをnRF52840ボードと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>で駆動してみました。</p> <p><strong>STMicro社製の産業向け加速度センサIIS2ICLX「Tilt Sensor Module」(発売予定)</strong></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210325/20210325173415.jpg" alt="f:id:irieda:20210325173415j:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2>STMicroが公開しているサンプル</h2> <p>コード例はここにあります。 <a href="https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/6788aa613bd11340767f691c77e306fc95c05555/iis2iclx_STdC">https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/6788aa613bd11340767f691c77e306fc95c05555/iis2iclx_STdC</a></p> <p>IIS2ICLXのスペックシートPDFはこちら。 <a href="https://www.st.com/resource/en/datasheet/iis2iclx.pdf">https://www.st.com/resource/en/datasheet/iis2iclx.pdf</a></p> <h2>SparkFun Pro nRF52840 Mini(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>用ボード)</h2> <p>I2Cが使える環境なら何でも良いのですが、ピンの引き出しが容易な「<a href="https://www.switch-science.com/catalog/5508/">SparkFun Pro nRF52840 Mini</a>」を使って駆動させてみました。</p> <h3>結線について</h3> <p>トップ写真のようにシングルラインヘッダコネクタをつければ結線状況は以下のようになります。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210325/20210325173418.png" alt="f:id:irieda:20210325173418p:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <table> <thead> <tr> <th>信号名</th> <th>向き</th> <th>ボードピン番号</th> <th>コード内シンボル</th> </tr> </thead> <tbody> <tr> <td>SCL</td> <td>&lt;-</td> <td>29</td> <td>SCL_PIN</td> </tr> <tr> <td>SDA</td> <td>&lt;-></td> <td>30</td> <td>SDA_PIN</td> </tr> <tr> <td>IO4</td> <td>-></td> <td>31</td> <td>INT_PIN</td> </tr> <tr> <td>GND</td> <td>&lt;-</td> <td>3</td> <td>GND_PIN</td> </tr> <tr> <td>3.3V</td> <td>&lt;-</td> <td>2</td> <td>P33_PIN</td> </tr> </tbody> </table> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>プロジェクトの開始</h2> <p>ArduinoIDEの場合はFile->New->Saveにてプロジェクト名をつけて保存します。 すると、「~/Documents/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>/プロジェクト名/」というフォルダに「プロジェクト名.ino」が保存されます(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>ユーザーは「/」を「\(バックスラッシュまたは¥)」に読み換えてください)。</p> <p>STMicroが公開しているサンプルから「iis2iclx_reg.c」「iis2iclx_reg.h」をダウンロードして、「~/Documents/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>/プロジェクト名/」フォルダに保存します。(つまりプロジェクト名.inoと同じフォルダに置きます)</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>を使う場合は任意の作業フォルダに「プロジェクト名/プロジェクト名.ino」ファイルを作製して「プロジェクト名/」フォルダに「iis2iclx_reg.c」「iis2iclx_reg.h」を保存してください。</p> <h3>「プロジェクト名.ino」の内容</h3> <p>ボード依存なコードは「platform_write」「platform_read」関数に集約され、それを「stmdev_ctx_t ctx」に関数ポインタをセットすることでセットアップする仕掛けになっています。</p> <p>P33_PINを出力にしてHighレベル出力、GND_PINも出力にしてLowレベル出力することでこの加速度センサーの電源として利用します。</p> <p>その他はSTMicroの公開しているexampleそのままです。</p> <pre class="code lang-cpp" data-lang="cpp" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;Wire.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;stdint.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&quot;iis2iclx_reg.h&quot;</span> <span class="synPreProc">#define P33_PIN </span><span class="synConstant">2</span> <span class="synPreProc">#define GND_PIN </span><span class="synConstant">3</span> <span class="synPreProc">#define INT_PIN </span><span class="synConstant">31</span> <span class="synPreProc">#define SDA_PIN </span><span class="synConstant">30</span> <span class="synPreProc">#define SCL_PIN </span><span class="synConstant">29</span> <span class="synPreProc">#define II2ICLX_ADDR (IIS2ICLX_I2C_ADD_L &gt;&gt; </span><span class="synConstant">1</span><span class="synPreProc">)</span> TwoWire wire(NRF_TWIM1, NRF_TWIS1, SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn, SDA_PIN, SCL_PIN); <span class="synType">static</span> <span class="synType">int32_t</span> platform_write(<span class="synType">void</span> *handle, <span class="synType">uint8_t</span> reg, <span class="synType">uint8_t</span> *bufp, <span class="synType">uint16_t</span> len) { wire.beginTransmission(II2ICLX_ADDR); wire.write(reg); wire.write(bufp, len); <span class="synStatement">return</span> wire.endTransmission(<span class="synConstant">false</span>); } <span class="synType">static</span> <span class="synType">int32_t</span> platform_read(<span class="synType">void</span> *handle, <span class="synType">uint8_t</span> reg, <span class="synType">uint8_t</span> *bufp, <span class="synType">uint16_t</span> len) { byte rc; <span class="synType">uint8_t</span> cnt; wire.beginTransmission(II2ICLX_ADDR); wire.write(reg); rc = wire.endTransmission(<span class="synConstant">false</span>); <span class="synStatement">if</span> (rc == <span class="synConstant">0</span>) { wire.requestFrom((<span class="synType">int32_t</span>)II2ICLX_ADDR, (<span class="synType">int32_t</span>)len, <span class="synConstant">true</span>); cnt = <span class="synConstant">0</span>; <span class="synStatement">while</span> (wire.available()) { bufp[cnt] = wire.read(); cnt++; } <span class="synStatement">if</span> (cnt &lt; len) { rc = <span class="synConstant">4</span>; } } <span class="synStatement">return</span> rc; } stmdev_ctx_t ctx = stmdev_ctx_t{ .write_reg = platform_write, .read_reg = platform_read}; <span class="synType">void</span> setup() { pinMode(P33_PIN, OUTPUT); <span class="synComment">// 3.3V</span> digitalWrite(P33_PIN, <span class="synConstant">1</span>); pinMode(GND_PIN, OUTPUT); <span class="synComment">// GND</span> digitalWrite(GND_PIN, <span class="synConstant">0</span>); Serial.begin(<span class="synConstant">115200</span>); wire.begin(); wire.setClock(<span class="synConstant">100000</span>); delay(<span class="synConstant">100</span>); iis2iclx_bus_mode_set(&amp;ctx, IIS2ICLX_SEL_BY_HW); <span class="synType">uint8_t</span> whoamI; iis2iclx_device_id_get(&amp;ctx, &amp;whoamI); Serial.print(<span class="synConstant">&quot;whoamI: &quot;</span>); Serial.printBuffer(&amp;whoamI, <span class="synConstant">1</span>); Serial.println(<span class="synConstant">&quot;&quot;</span>); iis2iclx_reset_set(&amp;ctx, PROPERTY_ENABLE); <span class="synType">uint8_t</span> rst = <span class="synConstant">1</span>; <span class="synStatement">while</span> (rst) { iis2iclx_reset_get(&amp;ctx, &amp;rst); delay(<span class="synConstant">20</span>); } <span class="synComment">/* Enable Block Data Update */</span> iis2iclx_block_data_update_set(&amp;ctx, PROPERTY_ENABLE); <span class="synComment">/* Set Output Data Rate */</span> iis2iclx_xl_data_rate_set(&amp;ctx, IIS2ICLX_XL_ODR_12Hz5); <span class="synComment">/* Set full scale */</span> iis2iclx_xl_full_scale_set(&amp;ctx, IIS2ICLX_2g); <span class="synComment">/* Configure filtering chain(No aux interface)</span> <span class="synComment"> * Accelerometer - LPF1 + LPF2 path</span> <span class="synComment"> */</span> iis2iclx_xl_hp_path_on_out_set(&amp;ctx, IIS2ICLX_LP_ODR_DIV_100); iis2iclx_xl_filter_lp2_set(&amp;ctx, PROPERTY_ENABLE); Serial.println(<span class="synConstant">&quot;setup completed&quot;</span>); } <span class="synType">void</span> loop() { <span class="synType">uint8_t</span> reg; <span class="synType">float</span> x = <span class="synConstant">0</span>; <span class="synType">float</span> y = <span class="synConstant">0</span>; <span class="synType">float</span> temperature = <span class="synConstant">0</span>; iis2iclx_xl_flag_data_ready_get(&amp;ctx, &amp;reg); <span class="synStatement">if</span> (reg) { <span class="synComment">/* Read acceleration field data */</span> <span class="synType">int16_t</span> accel[<span class="synConstant">2</span>]; iis2iclx_acceleration_raw_get(&amp;ctx, &amp;accel[<span class="synConstant">0</span>]); x = iis2iclx_from_fs2g_to_mg(accel[<span class="synConstant">0</span>]); y = iis2iclx_from_fs2g_to_mg(accel[<span class="synConstant">1</span>]); } iis2iclx_temp_flag_data_ready_get(&amp;ctx, &amp;reg); <span class="synStatement">if</span> (reg) { <span class="synComment">/* Read temperature data */</span> <span class="synType">int16_t</span> tmp; iis2iclx_temperature_raw_get(&amp;ctx, &amp;tmp); temperature = iis2iclx_from_lsb_to_celsius(tmp); } Serial.printf(<span class="synConstant">&quot;Accel: </span><span class="synSpecial">%6.1f</span><span class="synConstant">, </span><span class="synSpecial">%6.1f</span><span class="synConstant"> Temp.: </span><span class="synSpecial">%5.2f\n</span><span class="synConstant">&quot;</span>, x, y, temperature); delay(<span class="synConstant">100</span>); } </pre> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>ボード関連設定</h2> <h3>「Adafruit nRF52」ボードサポート</h3> <p>ArduinoIDEも<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>も以下の手順で「Adafruit nRF52」ボードサポートをインストールします。</p> <p>Additional boards manager URLsに以下のURLを追加します。</p> <p><a href="https://www.adafruit.com/package_adafruit_index.json">https://www.adafruit.com/package_adafruit_index.json</a></p> <p>「Adafruit nRF52(v0.21.0以降)」のボードサポートをインストールしてください。</p> <p>以下は<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>でボードサポートをインストールする方法です。</p> <pre class="code shell" data-lang="shell" data-unlink>arduino-cli core update-index &amp;&amp; arduino-cli core install adafruit:nrf52</pre> <h3>ボード選択</h3> <p>ArduinoIDEでは以下のボードを選んでください。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210325/20210325173516.png" alt="f:id:irieda:20210325173516p:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a> では「FQBN=adafruit:nrf52:pca10056」とします。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>とボードへのアップロードは以下のコマンドで</p> <pre class="code shell" data-lang="shell" data-unlink>arduino-cli compile -b adafruit:nrf52:pca10056 プロジェクト名 arduino-cli upload -b adafruit:nrf52:pca10056 -p シリアルポート名 プロジェクト名</pre> <h2>出力例</h2> <p><code>pip3 install pyserial</code>すると<code>pyserial-miniterm</code>というツールが使えます。 <code>pyserial-miniterm ポート名 115200</code>するとターゲットのログ出力が見れます。 ArduinoIDEの場合はSerial Monitorで。</p> <pre class="code" data-lang="" data-unlink>whoamI: 6B setup completed Accel: 0.0, 0.0 Temp.: 22.21 Accel: 23.7, 1.2 Temp.: 20.54 Accel: 30.2, 0.1 Temp.: 20.68 Accel: 143.7, 0.2 Temp.: 20.64 Accel: 195.1, 0.3 Temp.: 20.66 Accel: 243.3, 0.4 Temp.: 20.69 Accel: 331.0, 0.5 Temp.: 20.66 Accel: 370.8, 0.6 Temp.: 20.66 Accel: 408.0, 0.7 Temp.: 20.71 Accel: 475.7, 0.7 Temp.: 20.69 Accel: 506.4, 0.8 Temp.: 20.70 Accel: 535.2, 0.9 Temp.: 20.68 Accel: 587.5, 0.9 Temp.: 20.70 Accel: 611.2, 1.0 Temp.: 20.68 Accel: 633.4, 1.0 Temp.: 20.68</pre> <h2>まとめ</h2> <p>IIS2ILXシリーズは内部にフィルタ処理を持ちノイズが少なく、温度変動が少ない、動作可能温度範囲が広いなど産業用途に向いた特徴を持っています。温度も測れるため温度変動の補正もやろうと思えばできます。<code>platform_??</code>関数さえ環境に応じた実装を書けばいろんな環境で動作させられます。</p> <p>nRF52840シリーズの乗った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EC%A5%A4%A5%AF%A5%A2%A5%A6%A5%C8">ブレイクアウト</a>ボードはUSB機能やBluetooth5.0機能および任意のピンをI2Cとして利用可能なのでこういった実験をするのに向いています。</p> <p>ひとつのハマりポイントを紹介しておくと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>のI2Cは7bitアドレス表記を期待していて、STMicroのドライバは8bitアドレス表記になっているところです。</p> <p>なのでコードの冒頭で1bit左シフトした値を再定義しています。</p> <pre class="code" data-lang="" data-unlink>#define II2ICLX_ADDR (IIS2ICLX_I2C_ADD_L &gt;&gt; 1)</pre> irieda RaspberryPi-PicoをTinyGoでLチカする方法 hatenablog://entry/26006613704822704 2021-03-18T20:14:28+09:00 2021-03-18T20:31:33+09:00 144Labの入江田です。 TinyGoでRaspberryPi-Picoの実装を作れるらしいので試してみました。 現状、rp2040チップサポートはjeffmhastings氏によって試験的に作られたばかり。ソースコードからのビルドが必要ですのでclangかgccおよびmake、git、cmake、 ninjaコマンドなどが必要です。あと最新のGo(現時点で1.16.2)も必要です。 TinyGoのビルド git clone --recursive https://github.com/jeffmhastings/tinygo.git cd tinygo git switch rp2040 … <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210318/20210318201908.jpg" alt="f:id:irieda:20210318201908j:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>144Labの入江田です。</p> <p>TinyGoでRaspberryPi-Picoの実装を作れるらしいので試してみました。</p> <p>現状、rp2040チップサポートはjeffmhastings氏によって試験的に作られたばかり。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>からのビルドが必要ですのでclangか<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>およびmake、git、cmake、 ninjaコマンドなどが必要です。あと最新のGo(現時点で1.16.2)も必要です。</p> <h2>TinyGoのビルド</h2> <pre class="code" data-lang="" data-unlink>git clone --recursive https://github.com/jeffmhastings/tinygo.git cd tinygo git switch rp2040 make gen-device-rp2040 make llvm-build make cp build/tinygo $(go env GOPATH)/bin/tinygo-rp2040</pre> <p><code>make llvm-build</code>はマシンによって2時間〜数時間コースなので注意してください。</p> <h2>サンプルコード</h2> <pre class="code lang-go" data-lang="go" data-unlink><span class="synStatement">package</span> main <span class="synStatement">import</span> ( <span class="synConstant">&quot;machine&quot;</span> <span class="synConstant">&quot;time&quot;</span> ) <span class="synStatement">func</span> main() { machine.LED.Configure(machine.PinConfig{Mode: machine.PinOutput}) <span class="synStatement">for</span> { machine.LED.High() time.Sleep(<span class="synConstant">100</span> * time.Millisecond) machine.LED.Low() time.Sleep(<span class="synConstant">200</span> * time.Millisecond) } } </pre> <h2>ビルドと書き込み</h2> <pre class="code shell" data-lang="shell" data-unlink>tinygo-rp2040 build -target raspberrypi-pico -o sample.uf2 .</pre> <p>以上でビルドできることがわかれば、以下の手動操作で書き込むことができます。</p> <ol> <li>リセットを押しながらPicoにUSB給電すると書きこみモードになります。</li> <li>sample.uf2ファイルを「RPI-RP2」ドライブに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E9%A5%C3%A5%B0%26amp%3B%A5%C9%A5%ED%A5%C3%A5%D7">ドラッグ&amp;ドロップ</a>します。</li> <li>正常に書き込みができると強制アンマウントされます。</li> </ol> <p>以下の表示が出るのは無視しましょう。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20210318/20210318201307.png" alt="f:id:irieda:20210318201307p:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>Pico基板上の緑LEDがチカチカすれば成功です!</p> <h2>tinygo <a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>対応</h2> <p>現状のrp2040ブランチは<a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>サブコマンドサポートがまだ入っていません。 こういうとき、以下のconfig.<a class="keyword" href="http://d.hatena.ne.jp/keyword/json">json</a>を書けば追加対応が可能です。</p> <pre class="code json:config.json" data-lang="json:config.json" data-unlink>{ &#34;inherits&#34;: [&#34;raspberrypi-pico&#34;], &#34;flash-method&#34;: &#34;msd&#34;, &#34;msd-volume-name&#34;: &#34;RPI-RP2&#34;, &#34;msd-firmware-name&#34;: &#34;firmware.uf2&#34; }</pre> <ol> <li>リセットを押しながらPicoにUSB給電すると書きこみモードになります。</li> <li>targetにconfig.<a class="keyword" href="http://d.hatena.ne.jp/keyword/json">json</a>を指定して以下のようにすると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>と書き込みを行います。</li> </ol> <pre class="code shell" data-lang="shell" data-unlink>tinygo-rp2040 flash -target config.json .</pre> <h2>まとめ</h2> <ul> <li>USBまわり、DMA、PIOフルサポートはまだ</li> <li>いろんな機能を叩くのにはコア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%BF">レジスタ</a>を直接叩く必要があります</li> <li>tinygo <a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>サブコマンドはまだ未対応</li> <li>TinyGoの現行バージョンはv0.17.0です。</li> <li>Picoサポートはとりあえずのお試しレベルですが、次のバージョンv0.18.0くらいでサポートが追加されそう?</li> </ul> irieda ArduinoでBLEアプリケーション(2) hatenablog://entry/26006613663547704 2020-12-11T14:44:42+09:00 2020-12-11T15:12:41+09:00 144Labの入江田です。 今回はもうちょっと便利なものをBLEデバイスで作ってみます。 Google Meet 省エネミュートボタン Google Meetは以下のショートカットキーでマイクミュートをON/OFFできます。 WindowsまたはLinuxの場合: Ctrl+D macOSの場合: Cmd+D この操作だけができるキーボードデバイスをArduinoのBLE機能を使って実装してみよう! 以下の実装でミュート操作キーボードとして動作させるBLE-HIDデバイスにできます。 #include <bluefruit.h> #define button 28 // <- ターゲットに合わ… <p>144Labの入江田です。 今回はもうちょっと便利なものをBLEデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>で作ってみます。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a> Meet 省エネミュートボタン</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a> Meetは以下のショートカットキーでマイクミュートをON/OFFできます。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>または<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>の場合: Ctrl+D</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>の場合: Cmd+D</li> </ul> <p>この操作だけができるキーボードデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>のBLE機能を使って実装してみよう!</p> <p>以下の実装でミュート操作キーボードとして動作させるBLE-HIDデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>にできます。</p> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>#include &lt;bluefruit.h&gt; #define button 28 // &lt;- ターゲットに合わせてください。 BLEDis bledis; BLEHidAdafruit blehid; bool hasKeyPressed = false; void callback() { uint32_t last = 0; hid_keyboard_report_t report; varclr(&amp;report); // for Windows or Linux report.modifier = KEYBOARD_MODIFIER_LEFTCTRL; // for macOS report.modifier = KEYBOARD_MODIFIER_LEFTGUI; report.keycode[0] = HID_KEY_D; uint8_t key = digitalRead(button); Serial.print(&#34;button: &#34;); Serial.println(key); if (key == 0 &amp;&amp; millis() - last &gt; 100) { last = millis(); blehid.keyboardReport(&amp;report); blehid.keyRelease(); } } void setup() { pinMode(button, INPUT_PULLUP); Serial.begin(115200); Bluefruit.autoConnLed(false); Bluefruit.begin(); Bluefruit.setTxPower(4); // Check bluefruit.h for supported values Bluefruit.setName(&#34;BtnDevice&#34;); // Configure and Start Device Information Service bledis.setManufacturer(&#34;144Lab, Inc.&#34;); bledis.setModel(&#34;BT Btn&#34;); bledis.begin(); blehid.begin(); attachInterrupt(button, callback, ISR_DEFERRED | CHANGE); startAdv(); } void startAdv(void) { // Advertising packet Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); Bluefruit.Advertising.addTxPower(); Bluefruit.Advertising.addAppearance(BLE_APPEARANCE_HID_KEYBOARD); // Include BLE HID service Bluefruit.Advertising.addService(blehid); // There is enough room for the dev name in the advertising packet Bluefruit.Advertising.addName(); Bluefruit.Advertising.restartOnDisconnect(true); Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode Bluefruit.Advertising.start(0); // 0 = Don&#39;t stop advertising after n seconds } void loop() { delay(20); }</pre> <p>BLEデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>による開発・ビルド・書き込みについては<a href="/entry/arduino-ble1">こちら</a>を参考に。</p> <h2>ペアリング(<a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>例)</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20201211/20201211142409.png" alt="f:id:irieda:20201211142409p:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>「キーボードの認識」ダイアログは閉じて構いません。</p> <h2>動作例</h2> <iframe src="https://drive.google.com/file/d/18phSSIU4AkjXzIjqW2DVZGuwyzGP38zD/preview" width="640" height="480"></iframe> <h2>まとめ</h2> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>ベースでHID on BLEデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>は簡単に作れます</li> <li>頑張れば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>のフルキーボードの実装も可能かも</li> <li>もちろんマウスにもなれますよ!</li> </ul> irieda ArduinoでBLEアプリケーション(1) hatenablog://entry/26006613661601173 2020-12-07T11:41:10+09:00 2020-12-07T11:41:10+09:00 144Labの入江田です。 BLEアプリケーションをArduinoを使って開発するための細かいノウハウを 何回かの記事にまとめてみます。 おすすめのターゲット ノルディックのnRF52シリーズをMPUとして持つボードがお勧めです。 Cortex-M4Fを搭載しておりfloat型計算もそこそこがんばれます。 BLEは無線を扱うので技適が取得済みである製品を選択しましょう。 SOC/モジュール InsightSiP社のiSP1507,1807シリーズのSOC Raytac社のMDBT42,50シリーズのモジュール Layrd社のBL652/654シリーズのモジュール Minew社のMS50SF/M… <p>144Labの入江田です。 BLEアプリケーションを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を使って開発するための細かいノウハウを 何回かの記事にまとめてみます。</p> <h2>おすすめのターゲット</h2> <p>ノルディックのnRF52シリーズを<a class="keyword" href="http://d.hatena.ne.jp/keyword/MPU">MPU</a>として持つボードがお勧めです。 Cortex-M4Fを搭載しておりfloat型計算もそこそこがんばれます。 BLEは無線を扱うので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>が取得済みである製品を選択しましょう。</p> <p><strong>SOC/モジュール</strong></p> <ul> <li>InsightSiP社のiSP1507,1807シリーズのSOC</li> <li>Raytac社のMDBT42,50シリーズのモジュール</li> <li>Layrd社のBL652/654シリーズのモジュール</li> <li>Minew社のMS50SF/MS88SFモジュール</li> </ul> <p>以上のSOC/モジュール(アンテナ内蔵)搭載の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EC%A5%A4%A5%AF%A5%A2%A5%A6%A5%C8">ブレイクアウト</a>ボードであれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>取得済みです(一部のモデルや新製品は要確認)。</p> <h2>BLEサポートした<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>コアライブラリ</h2> <p><a href="https://github.com/adafruit/Adafruit_nRF52_Arduino">https://github.com/adafruit/Adafruit_nRF52_Arduino</a></p> <p>これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>ボードサポートにadafruitのnrf52シリーズ対応をインストールした時に 一緒にインストールされます。</p> <p>BLEには<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>役とセントラル役の2つがあり、一般に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>になり、PCや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>がセントラルという役割分担が多いです。 コネクションタイプとノンコネクションタイプという使い分けも決めておきます。</p> <p>主にビーコンを作る場合はノンコネクションタイプで、 一般的なデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>はコネクションタイプになるかと思います。</p> <h3>各抽象名と包含関係</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>は機能提供側でセントラルは機能利用側です。 以下の名称とツリー構造はBLEライブラリで抽象的に構築されています。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>(サーバー) <ul> <li>プライマリサービス(主たる提供サービス) <pre><code>- キャラクタリスティックa - キャラクタリスティックb - ... </code></pre></li> <li>オプショナルサービスA</li> <li>オプショナルサービスB</li> <li>...</li> </ul> </li> </ul> <p>サービスとキャ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タリスティックには識別用にUUIDをもちます。</p> <p>サービスにはプライマリか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%AB%A5%F3%A5%C0%A5%EA">セカンダリ</a>以降か、 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%A7%A5%CD%A5%EA%A5%C3%A5%AF">ジェネリック</a>サービスかカスタムサービスか、という区別があります。</p> <p>カスタムサービスはプライマリサービスだけがアドバタイズにUUIDを載せることができるという特徴があり、接続前にプライマリサービスだけはセントラルが識別可能です。その他のカスタムサービスは接続後にしか識別できません。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%A7%A5%CD%A5%EA%A5%C3%A5%AF">ジェネリック</a>サービスの場合はUUIDの長さが2バイトです(カスタムは16バイト)。また、そこにぶら下がっているキャ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タリスティック群は既定のものが定義済みかつUUIDが2バイトです。</p> <p>特性(キャ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タリスティック)ごとの通信のやり方は以下の3通り</p> <ul> <li>セントラルが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>に書き込み(Write)</li> <li>セントラルが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>から読み出し(Read)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>からセントラルへ通知(Notify)</li> </ul> <p>それぞれ通信上のACKは返すけれどレスポンスデータを返したりはできないので注意が必要です。</p> <h2>BLE共通のセットアップ</h2> <ol> <li>ヘッダインクルード</li> </ol> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>#include &lt;bluefruit.h&gt;</pre> <ol> <li>自動LED制御をオフ このコードを入れておかないとターゲットのLED1の制御をBLEドライバーに奪われてしまいます。(もちろん任せても問題ないなら不要です)</li> </ol> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>Bluefruit.autoConnLed(false);</pre> <ol> <li>送信出力電力とデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>名をセット</li> </ol> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>Bluefruit.setTxPower(4); // default: 4 dBm Bluefruit.setName(&#34;DeviceName&#34;);</pre> <ol> <li>BLEドライバーの動作開始</li> </ol> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>Bluefruit.begin();</pre> <h2>BLEボタン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>の実装</h2> <p>もっとも一般的な形であるコネクション型の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>でボタン機能提供デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を作ってみます。コネクション型<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>はセントラルと1対1で接続され、セントラルと接続されていない間のみ「アドバタイズ」という自身の名称やサービス情報を周辺にばら撒きます。セントラルは多くの「アドバタイズ」を受信してその中から目的のデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を探し出して接続を試みるというような挙動を採るのが一般的です。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%A7%A5%CD%A5%EA%A5%C3%A5%AF">ジェネリック</a>な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>は<a href="https://www.bluetooth.com/ja-jp/specifications/gatt/">ここの一覧</a>をみて当てはまるものがある場合はそちらのサービスや特性と同じ形にすると良いでしょう。 ボタンに関する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%A7%A5%CD%A5%EA%A5%C3%A5%AF">ジェネリック</a>なサービスは定義されていないのでユーザーカスタムなサービスUUIDを決めます。</p> <ol> <li>プライマリサービスのセットアップ</li> </ol> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%A7%A5%CD%A5%EA%A5%C3%A5%AF">ジェネリック</a>なサービスや特性に使われるユニークID識別子は16bitsですが、ユーザーカスタムな識別子は128bits幅のUUID形式が必要です。 ユーザーカスタムなサービスのUUIDは<code>uuidgen</code>コマンド等で作成しましょう。</p> <p>ただし、これが一般的かどうかは賛否が分かれますが、 仮に<code>{ccddeeff-0011-2233-4455-66778899aabb}</code>というUUIDが生成された場合、 3〜4オクテット目の値をゼロにします。結果としてサービスのUUIDは<code>{ccdd0000-0011-2233-4455-66778899aabb}</code>とします。(理由は後述)</p> <p>UUIDの表記はビッグ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%C7%A5%A3%A5%A2%A5%F3">エンディアン</a>だけど、メモリにバイト列としておく時はリ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EB%A5%A8%A5%F3">トルエン</a>ディアンである必要があります(BLE<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>の多くはリ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EB%A5%A8%A5%F3">トルエン</a>ディアンを想定しているものがほとんどです)。</p> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>const uint8_t PrimaryServiceUUID[] = { // ccdd0000-0011-2233-4455-66778899aabb 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0xdd, 0xcc, }; BLEService PrimaryService(PrimaryServiceUUID);</pre> <p>セットアップ処理</p> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>PrimaryService.begin();</pre> <ol> <li>サービスに特性(キャ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タリスティック)を付与</li> </ol> <p>オリジナルな特性のUUIDを付与する必要があり、<code>uuidgen</code>で作成しても良いのですがBLE仕様が歴史的に識別子がその前身のANT仕様の16bits幅から128bits幅に拡張された経緯もあり、nRFシリーズではBLEハードの基本は16bits幅のIDでサービスや特性を識別します。</p> <p>そして16bitsのIDと128bitsのUUIDの対応メモリをsoftdevice用に確保していますがコンパクトな領域しかないので、保持できる128bitsのUUIDの数に限界があります。極力、一つのサービスには一つの128bits幅UUIDをベースにして16bitsの値だけを変化させて割り当てます。</p> <p>サービスのUUIDが{ccdd<strong>0000</strong>-0011-2233-4455-66778899aabb}であったので太字(3〜4オクテット目)のところを特性ごとに連番で指定します。こうすることで128bitsUUIDメモリの利用数を節約することができます。 (特にたくさんのサービスや特性を提供しようとする場合には必須となります)</p> <ul> <li>特性A<code>{ccdd0001-0011-2233-4455-66778899aabb}</code></li> <li>特性B<code>{ccdd0002-0011-2233-4455-66778899aabb}</code></li> <li>特性C<code>{ccdd0003-0011-2233-4455-66778899aabb}</code></li> <li>...</li> </ul> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>const uint8_t BtnCharacteristicUUID[] = { // ccdd0001-0011-2233-4455-66778899aabb 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, 0x01, 0x00, 0xdd, 0xcc, }; BLECharacteristic BtnCharacteristic(BtnCharacteristicUUID);</pre> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>// リードと通知を利用する設定(ライトはできない) BtnCharacteristic.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY); // セキュリティモードに関する設定 BtnCharacteristic.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); // セントラルへ送るデータ長(ここでは1オクテット) BtnCharacteristic.setFixedLen(1); BtnCharacteristic.begin();</pre> <ol> <li>アドバタイズのセットアップ</li> </ol> <p>アドバタイズ開始処理(これ以降セントラルから発見可能になる)</p> <pre class="code lang-cpp" data-lang="cpp" data-unlink><span class="synComment">// アドバタイズパケットのフラグ</span> Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); <span class="synComment">// 電力とデバイス名とプライマリサービスUUIDをアドバタイズ情報に載せる</span> Bluefruit.Advertising.addTxPower(); Bluefruit.ScanResponse.addName(); Bluefruit.Advertising.addService(PrimaryService); <span class="synComment">// 接続を切ったらアドバタイズを再開する設定</span> Bluefruit.Advertising.restartOnDisconnect(<span class="synConstant">true</span>); <span class="synComment">// アドバタイズはファストモードー>スローモードー>ストップという状態遷移</span> <span class="synComment">// ファストモードの時間を指定する(30秒)</span> Bluefruit.Advertising.setFastTimeout(<span class="synConstant">30</span>); <span class="synComment">// number of seconds in fast</span> <span class="synComment">// 何秒間アドバタイズするか(ゼロの場合はノンストップ)</span> Bluefruit.Advertising.start(<span class="synConstant">0</span>); </pre> <ol> <li>ボタン操作に対しボタン特性の更新</li> </ol> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>void callback() { uint8_t newState = (uint8_t)(1 - digitalRead(button)); // button is active LOW // only notify if button state chagnes if (newState != buttonState) { buttonState = newState; BtnCharacteristic.write8(buttonState); BtnCharacteristic.notify8(buttonState); } } attachInterrupt(button, callback, ISR_DEFERRED | CHANGE);</pre> <h2>コード全体</h2> <pre class="code cpp:sample.ino" data-lang="cpp:sample.ino" data-unlink>#include &lt;bluefruit.h&gt; #define button 28 const uint8_t PrimaryServiceUUID[] = { // ccdd0000-0011-2233-4455-66778899aabb 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0xdd, 0xcc, }; BLEService PrimaryService(PrimaryServiceUUID); const uint8_t BtnCharacteristicUUID[] = { // ccdd0001-0011-2233-4455-66778899aabb 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, 0x01, 0x00, 0xdd, 0xcc, }; BLECharacteristic BtnCharacteristic(BtnCharacteristicUUID); void startAdvertize() { // アドバタイズパケットのフラグ Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); // 電力とデバイス名とプライマリサービスUUIDをアドバタイズ情報に載せる Bluefruit.Advertising.addTxPower(); Bluefruit.ScanResponse.addName(); Bluefruit.Advertising.addService(PrimaryService); // 接続を切ったらアドバタイズを再開する設定 Bluefruit.Advertising.restartOnDisconnect(true); // アドバタイズはファストモードー>スローモードー>ストップという状態遷移 // ファストモードの時間を指定する(30秒) Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast // 何秒間アドバタイズするか(ゼロの場合はノンストップ) Bluefruit.Advertising.start(0); } uint8_t buttonState; void callback() { uint8_t newState = (uint8_t)(1 - digitalRead(button)); // button is active LOW // only notify if button state chagnes if (newState != buttonState) { buttonState = newState; BtnCharacteristic.write8(buttonState); BtnCharacteristic.notify8(buttonState); } } void setup() { pinMode(button, INPUT_PULLUP); buttonState = digitalRead(button); Bluefruit.begin(); Bluefruit.autoConnLed(false); Bluefruit.setTxPower(4); // default: 4 dBm Bluefruit.setName(&#34;BtnPeripheral&#34;); PrimaryService.begin(); BtnCharacteristic.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY); BtnCharacteristic.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); BtnCharacteristic.setFixedLen(1); BtnCharacteristic.write8(buttonState); BtnCharacteristic.begin(); attachInterrupt(button, callback, ISR_DEFERRED | CHANGE); startAdvertize(); } void loop() { delay(20); }</pre> <p>この実装例では全ての処理を割り込みで行なっており、loop関数内をdelayのみでCPU時間のほとんどをdelayで過ごすようにしてあります。</p> <h2>消費電力について</h2> <p>コアライブラリは<strong>FreeRTOSベース</strong>で作られており、delayはCPUをアイドル状態に遷移させます。 この形を取るとBLEの電波送信の時だけ消費電力が大きく、それ以外はかなり消費電力を下げることができます。</p> <p>あとは消費電力量はBLE電波送信の頻度でほぼ決まります。</p> <ul> <li>アドバタイズ(ファストフェーズ)は送信頻度が細かく消費電力大</li> <li>アドバタイズ(スローフェーズ)は送信頻度が少なく消費電力中</li> <li>接続状態は接続キープのための送信頻度+アプリの送信頻度だけなので</li> <li>アプリではボタン操作した時のみであれば消費電力はかなり小さい</li> </ul> <h2>動作の確認</h2> <p>私はよく<a class="keyword" href="http://d.hatena.ne.jp/keyword/Chrome">Chrome</a>系ブラウザのWebBluetoothを利用します。 (ただし、現状のWebBluetoothはBLEのセントラルにしかなれません) 以下のような内容の<code>index.html</code>を作成し、<code>python3 -m http.server</code>などして</p> <p><a href="http://localhost:8000">http://localhost:8000</a> を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Chrome">Chrome</a>系ブラウザ(新EdgeでもOK)で開きます。</p> <pre class="code html:index.html" data-lang="html:index.html" data-unlink>&lt;script&gt; const serviceUuid = &#34;ccdd0000-0011-2233-4455-66778899aabb&#34;; const characteristicUuid = &#34;ccdd0001-0011-2233-4455-66778899aabb&#34;; const filter = { filters: [{ services: [serviceUuid] }] }; async function connect() { const device = await navigator.bluetooth.requestDevice(filter); const server = await device.gatt.connect(); const service = await server.getPrimaryService(serviceUuid); const btnCh = await service.getCharacteristic(characteristicUuid); btnCh.addEventListener(&#34;characteristicvaluechanged&#34;, (ev) =&gt; { let value = event.target.value; if (value.getUint8(0)) { document.getElementById(&#34;state&#34;).innerText = &#34;push!&#34;; } else { document.getElementById(&#34;state&#34;).innerText = &#34;&#34;; } }); await btnCh.startNotifications(); console.log(btnCh); } &lt;/script&gt; &lt;body&gt; &lt;button onclick=&#34;connect()&#34;&gt;Connect&lt;/button&gt;&lt;label id=&#34;state&#34;&gt;&lt;/label&gt; &lt;/body&gt;</pre> <p>connectを押すとユーザーサービスにマッチする<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>一覧が表示されます。そのひとつを選択してペアリングを行うとデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>に接続し、デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>のボタンを押すと通知を受け取ります。上記のコードではボタンの状態に合わせてラベルの表記を変更しています。</p> <p>ここで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>ユーザーは注意が必要なんですが、ペアリングをOSの設定画面から一度行なっておく必要があります。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>,<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>,<a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Chrome">Chrome</a>はもちろん、ChromeOSも大丈夫でした。また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iOS">iOS</a>の場合<a href="https://apps.apple.com/jp/app/webble/id1193531073">WebBLE</a>(有料)というブラウザアプリで利用可能です。</p> <h2>まとめ</h2> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>ベースでもBLEデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の開発はかなり高い品質で作れます!</li> <li>BLEを扱いたいのならnRF52シリーズがおすすめです!</li> <li>WebBluetoothはBLEクロス対応環境の唯一に近い選択肢でセントラル役をさせるのに適しています。</li> <li>WebBluetoothが動かせる人口カバー率は実はかなり高いのです。</li> </ul> irieda ESP32-WROOM32のNRNDから考える、32と32Dと32Eの違い hatenablog://entry/26006613659492196 2020-12-07T11:00:00+09:00 2020-12-07T16:18:53+09:00 ESP32-WROOM32とESP32-WROOM32DとESP32-WROOM32Eそれぞれの特徴や違いをまとめました。 <p>ESP32-WROOM32がNRNDになってました。NRNDというのはNot Recommended for New Designsの略で、新規製品にはおすすめしないという意味です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20201202/20201202131245.png" alt="f:id:ohki_s:20201202131245p:plain" title="" class="hatena-fotolife" itemprop="image"></span> <a href="https://www.espressif.com/en/products/modules">https://www.espressif.com/en/products/modules</a></p> <p>新規製品には勧めないというだけでまだ製造終了ではないので既存の製品の生産には(まだ)問題ないのですが、今後開発する製品については考える必要があります。また、量産の仕様検討などで使われることを考えると最新の部品を使う必要があります。</p> <p>後継品としてESP32-WROOM-32Eというのがあります(ESP32-WROOM-32Dというのもありましたが、これもNRNDになりました)。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20201202/20201202134836.jpg" alt="f:id:ohki_s:20201202134836j:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>調べたところ、それぞれの特長は</p> <ul> <li>32D<br /> モジュール上の部品が更新されただけで核になるESP32のチップは同じ、モジュールのピン配置なども同じ製品</li> <li>32E<br /> ESP32チップが更新されており、チップのバグが取れている。モジュールで使うことが推奨されていなかったピンが未接続になったため、ピン互換性が完全ではなくなった。未接続になったピン以外は互換。</li> </ul> <p>未接続になったピンはSDカードがつながる6つのピンで、すでに内部でSPI <a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a>がつながっているため、32の時から外部で何かに使うのが非推奨になっていました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20201202/20201202135640.jpg" alt="f:id:ohki_s:20201202135640j:plain" title="" class="hatena-fotolife" itemprop="image"></span> Espressifが提供しているSDカードライブラリ <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fespressif%2Farduino-esp32%2Ftree%2Fmaster%2Flibraries%2FSD" title="espressif/arduino-esp32" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/espressif/arduino-esp32/tree/master/libraries/SD">github.com</a></cite> でこのピンを使っていないこともあり、この6つのピンを使っている例は見かけられませんでした。</p> <p>さて、さっきのピン配置図を見てヤバいと思った方はいるでしょうか。ピン配置自体はいいんですが、真ん中のGNDパッドの位置がずれています。このままだと従来の基板やCADのシンボルが使えないので、再度データシートで確認しました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20201202/20201202140120.jpg" alt="f:id:ohki_s:20201202140120j:plain" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>どうやら同じのようで、安心できました。</p> <p>スイッチサイエンスの製品も、今後の新製品ではESP32-WROOM32Eを搭載するよていです(先日発売した<a href="https://www.switch-science.com/catalog/6364/">ESPr® Developer 32 Type-C</a>はESP32-WROOM32です)。32Eのモジュールは入手済みで現在評価中です。来年になるかもしれませんが発売時はまたお知らせしますのでお楽しみにー。</p> ohki_s arduino-cliによるArduinoアプリケーションの開発 hatenablog://entry/26006613636807177 2020-10-05T16:41:47+09:00 2020-10-05T16:43:30+09:00 144Labの入江田です。 Arduinoの開発にはArduinoIDEを使う方法が主流ですが、 今回はまだマイナーな「arduino-cli」を使った開発方法を紹介します。 2020/09/14にarduino-cliのv0.13.0がリリースされました。 初期にあった不具合もほとんど解消され安定してきたのでそろそろ実用フェーズに組み込んでもいいんじゃないかという状況になってきました。 ArduinoIDEのツラミ GUI操作でボードサポートや依存ライブラリのインストールや更新ができCUIを一切使わずに済むことに関してはよく考えられた環境ではありますが、 内包されたエディタがnotepadに… <p>144Labの入江田です。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の開発にはArduinoIDEを使う方法が主流ですが、 今回はまだマイナーな「<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>」を使った開発方法を紹介します。</p> <p>2020/09/14に<a href="https://github.com/arduino/arduino-cli/releases/tag/0.13.0">arduino-cliのv0.13.0</a>がリリースされました。</p> <p>初期にあった不具合もほとんど解消され安定してきたのでそろそろ実用フェーズに組み込んでもいいんじゃないかという状況になってきました。</p> <h2>ArduinoIDEのツラミ</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>操作でボードサポートや依存ライブラリのインストールや更新ができ<a class="keyword" href="http://d.hatena.ne.jp/keyword/CUI">CUI</a>を一切使わずに済むことに関してはよく考えられた環境ではありますが、</p> <ul> <li>内包されたエディタがnotepadにほんの少し機能追加したレベル</li> <li>複数ファイルの取り扱いがわかりにくい</li> <li>世の中には<a class="keyword" href="http://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>に関する便利なツールがあるがそのほとんどは使えない</li> <li>今時の<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>のように複数のプロジェクトを横断する機能はない</li> <li>他人の起こした環境と同じ環境を構築するのが手間がかかる(見比べて合わせる必要がある)</li> <li>成果物を保存する機能や保存した成果物を書き込むだけなどが簡単にはできず、開発ではない関係者であっても同じように開発環境を整えてもらう必要がある</li> </ul> <p>手慣れた開発者は新規プロジェクトをArduinoIDEで起こして、慣れたエディタを使ってコードを編集し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>にもどって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>やターゲットへの書き込みを行うという操作を行っています。</p> <p>これはつまり「開発環境の構築」、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>」、「フラッシュ」さえできれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>である必要はないということなのです。</p> <h2>そこで「<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>」</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>陣営が開発した「<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>」というツールがあります。これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>コア機能を提供する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>ツールです。</p> <p>ArduinoIDEと<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>は互いにボードサポートやライブラリの保存場所を共有していますので、ArduinoIDEで環境構築しておいてその他の機能は<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>を利用することもできますし、逆もまた可能です。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>はArduinoIDEにあるエディタとシリアルモニタ以外の機能は全てあります。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>インストール</h3> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>ユーザー</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">&gt;</span> brew install arduino-cli </pre> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>ユーザー</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">&gt;</span> <span class="synStatement">mkdir</span> ~/bin <span class="synStatement">&gt;</span> curl <span class="synSpecial">-fsSL</span> https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | <span class="synIdentifier">BINDIR</span>=~/bin sh </pre> <p><code>PATH=$HOME/bin:$PATH</code>をお使いのシェルのprofileファイルに追記してください。(例:<code>~/.bash_profile</code>など)</p> <h4>Windows10ユーザー</h4> <ol> <li>ダウンロード <a href="https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_64bit.zip">https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_64bit.zip</a></li> <li>展開して<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>.exeをパスの通ったフォルダに移動</li> </ol> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>インストールの確認</h3> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">&gt;</span> arduino-cli version arduino-cli Version: <span class="synConstant">0</span>.<span class="synConstant">13</span>.<span class="synConstant">0</span> Commit: 693a045eea420c29ca7027e668eee31bce37365d </pre> <h3>ターゲットサポートの追加</h3> <p>設定ファイルの初期化(すでにある場合は以下を実行しても何もしません)</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli config init Config file written to: /Users/USERNAME/Library/Arduino15/arduino-cli.yaml</pre> <p>上記の<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>.<a class="keyword" href="http://d.hatena.ne.jp/keyword/yaml">yaml</a>に以下のURLを追記(開発に使うボードのガイドに書かれたURLなど)</p> <pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">board_manager</span><span class="synSpecial">:</span> <span class="synIdentifier">additional_urls</span><span class="synSpecial">:</span> <span class="synStatement">- </span>https://www.adafruit.com/package_adafruit_index.json </pre> <p>インデックスの更新とターゲットサポートの検索</p> <pre class="code" data-lang="" data-unlink>&gt; arduino-cli core update-index Downloading missing tool builtin:ctags@5.8-arduino11... builtin:ctags@5.8-arduino11 downloaded Installing builtin:ctags@5.8-arduino11... builtin:ctags@5.8-arduino11 installed Downloading missing tool builtin:serial-discovery@1.0.0... builtin:serial-discovery@1.0.0 downloaded Installing builtin:serial-discovery@1.0.0... builtin:serial-discovery@1.0.0 installed Updating index: library_index.json downloaded Updating index: package_index.json downloaded Updating index: package_index.json.sig downloaded Updating index: package_adafruit_index.json downloaded Updating index: package_index.json downloaded Updating index: package_index.json.sig downloaded Updating index: package_adafruit_index.json downloaded &gt; arduino-cli core search nrf52 ID Version Name adafruit:nrf52 0.21.0 Adafruit nRF52 arduino:mbed 1.1.6 Arduino nRF528x Boards (Mbed OS) arduino:nrf52 1.0.2 Arduino nRF52 Boards </pre> <p>ターゲットサポートのインストール</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli core install adafruit:nrf52</pre> <p>このインストール状況はArduinoIDEにも反映されるし、 ArduinoIDEの方が探したり入れたりしやすいと思う場合は ArduinoIDEでインストールしてもらっても構いません。</p> <h2>ライブラリのインストール</h2> <p>サーチ</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli lib search --names ArduinoJson Name: &#34;ArduinoJson&#34; Name: &#34;CTBot&#34; Name: &#34;Constellation&#34; Name: &#34;DarkSkySevenDay&#34; Name: &#34;Effortless-SPIFFS&#34; Name: &#34;IFTTTMaker&#34; Name: &#34;Kaa IoT Platform&#34; Name: &#34;OpenWeatherOneCall&#34; Name: &#34;cloud4rpi-esp-arduino&#34; Name: &#34;jsonlib&#34; Name: &#34;weatherLocation&#34;</pre> <p>インストール</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli lib install ArduinoJson ArduinoJson depends on ArduinoJson@6.16.1 Downloading ArduinoJson@6.16.1... ArduinoJson@6.16.1 downloaded Installing ArduinoJson@6.16.1... Installed ArduinoJson@6.16.1</pre> <p>このインストール状況はArduinoIDEにも反映されるし、 ArduinoIDEの方が探したり入れたりしやすいと思う場合は ArduinoIDEでインストールしてもらっても構いません。</p> <h2>アプリケーション開発</h2> <p>以下のようなフォルダツリーを起こしましょう。</p> <ul> <li>プロジェクトルート <ul> <li>APP_NAME/ <ul> <li>APP_NAME.ino</li> </ul> </li> </ul> </li> </ul> <p>APP_NAMEはドットを含まない任意のアプリケーション名です。 守るべき注意事項として親フォルダ名とメインのAPP_NAME.inoの名前は一致している必要があります。</p> <p>APP_NAME.ino</p> <pre class="code cpp " data-lang="cpp " data-unlink>void setup() { ... } void loop() { ... }</pre> <h4>ターゲットボード名、ポート名の調べ方</h4> <p>ターゲットをUSB接続した状態で以下のコマンドを実行すると 適合するボード名のリストが表示されます。</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli board list Port Type Board Name FQBN Core /dev/tty.usbmodem1422401 Serial Port (USB) Nordic nRF52840DK (PCA10056) adafruit:nrf52:pca10056 adafruit:nrf52</pre> <p>または対応可能ボードの全てを表示または検索することもできます。</p> <pre class="code" data-lang="" data-unlink>&gt; $ arduino-cli board listall nrf52 Board Name FQBN Adafruit Bluefruit Metro nRF52840 Express adafruit:nrf52:metro52840 Adafruit Feather nRF52832 adafruit:nrf52:feather52832 Adafruit Feather nRF52840 Express adafruit:nrf52:feather52840 Adafruit ItsyBitsy nRF52840 Express adafruit:nrf52:itsybitsy52840 Nordic nRF52840DK (PCA10056) adafruit:nrf52:pca10056 </pre> <h2>ピン番号について</h2> <p>ピン番号はターゲットボードサポートライブラリ側とターゲットボードの組み合わせで決まります。異なる組み合わせで利用する場合やCPU互換な別のボードを利用する場合は自前でピン番号割当をする必要があります。</p> <p>あと、CPUモジュールのスペックシートみると、ピンに名称をつけている場合があったりするので番号との対応は確認する必要があったりします。</p> <p>一例としてはnRF51/nRF52シリーズでは「P0<em>##」「P1</em>##」というような名称が付与されています。名称と番号の関係は以下の通り。 <code>Pm_nn</code> に対し <code>32*m+nn</code>という計算で番号が決められています。</p> <ul> <li>P0_00: 0</li> <li>P0_01: 1</li> <li>P0_31: 31</li> <li>P1_00: 32</li> <li>P1_01: 33</li> </ul> <p>nRFシリーズは概ねこの形になっていますが、ボードによってはボードのシルクに従う必要があったりしますので、ボードごとのサンプルを参考にしてください。</p> <h2>アプリケーション例</h2> <p>いわゆるLチカです。APP_NAMEを仮に「sample1」とします。 この場合、親フォルダも「sample1」という名前である必要があります。</p> <p>sample1/sample1.ino</p> <pre class="code lang-cpp" data-lang="cpp" data-unlink> <span class="synPreProc">#define LED1 </span><span class="synConstant">6</span><span class="synPreProc"> </span><span class="synComment">// ターゲットによってピン番号は異なります。</span> <span class="synType">void</span> setup() { pinMode(LED1, OUTPUT); } <span class="synType">void</span> loop() { Serial.println(<span class="synConstant">&quot;loop&quot;</span>); digitalWrite(LED1, <span class="synConstant">0</span>); delay(<span class="synConstant">500</span>); digitalWrite(LED1, <span class="synConstant">1</span>); delay(<span class="synConstant">500</span>); } </pre> <h3>ビルド</h3> <p>sample1.inoのあるフォルダにて以下のコマンドでビルドできます。</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli compile -b adafruit:nrf52:pca10056 . Sketch uses 38404 bytes (4%) of program storage space. Maximum is 815104 bytes. Global variables use 6756 bytes (2%) of dynamic memory, leaving 230812 bytes for local variables. Maximum is 237568 bytes.</pre> <p>この場合、「build/」フォルダが作られ、成果物一式はその配下に出力されます。</p> <ul> <li>sample1/build/adafruit.nrf52.pca10056/ <ul> <li>sample1.ino.elf</li> <li>sample1.ino.map</li> <li>sample1.ino.hex</li> <li>sample1.ino.zip</li> </ul> </li> </ul> <p>elfがバイナリ、mapはマップファイルという<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>情報ファイルです。 hexやzipがファーム書きこみ用のファイルです。</p> <h3>書き込み</h3> <p>開発の際はターゲットボードをPCと接続しておき、 以下のコマンドで書き込みを実行します。</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli upload -b adafruit:nrf52:pca10056 -p /dev/tty.usbmodem142101 . Upgrading target on /dev/cu.usbmodem142101 with DFU package /Users/nobo/Dropbox/Work/Articles/arduino-cli/sample1/build/adafruit.nrf52.pca10056/sample1.ino.zip. Flow control is disabled, Single bank, Touch disabled ######################################## #################################### Activating new firmware Device programmed.</pre> <p>もし成果物だけを配布して<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>を書き換えたい場合は以下のコマンドのように「-i 成果物.ino.zip」で書き換えができます。</p> <pre class="code shell" data-lang="shell" data-unlink>&gt; arduino-cli upload -b adafruit:nrf52:pca10056 -p /dev/tty.usbmodem142101 -i build/adafruit.nrf52.pca10056/sample1.ino.zip </pre> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a></h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>開発の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>は主にシリアルモニターによるプリント<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>を行います。</p> <p>APP_NAME.inoのsetup関数の冒頭に<code>Serial.begin(115200);</code>を入れておきましょう。</p> <pre class="code lang-cpp" data-lang="cpp" data-unlink><span class="synType">void</span> setup() { Serial.begin(<span class="synConstant">115200</span>); } </pre> <p>以下のようにして<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>プリントをする場合、シリアルモニターには「param: &lt;paramの値>」というようなログが出力されます。</p> <pre class="code lang-cpp" data-lang="cpp" data-unlink>Serial.print(<span class="synConstant">&quot;param: &quot;</span>); Serial.println(param); </pre> <p>シリアルモニタを入手しましょう。以下のどちらかがお勧めです。 (もちろん使い慣れたシリ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%BF%A1%BC">アルター</a>ミナルソフトを使っても構いません)</p> <ul> <li>miniterm.py(All platform)</li> <li>Go言語を使った自作コマンド</li> </ul> <p>python3およびpipコマンドが環境に利用可能であれば、「pip3 install pyserial」にて「miniterm.py」というコマンドが利用可能になります。</p> <p>使い方: ポート名とボーレート指定を引数に指定します。</p> <pre class="code shell" data-lang="shell" data-unlink>miniterm.py /dev/tty.usbmodem142101 115200</pre> <p>モニターの止め方は「Ctrl+[」を押します。</p> <p>Go言語を利用可能な環境であれば「go get <a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>.com/144lab/miniterm」にて「miniterm」というコマンドが利用可能になります。 使い方:ポート名を指定します(ボーレートは115200固定です)</p> <pre class="code shell" data-lang="shell" data-unlink>miniterm /dev/tty.usbmodem142101</pre> <p>モニターの止め方は「Ctrl+C」を押します。</p> <h2>まとめ</h2> <p>単一のinoファイルだけでアプリケーションを構築する形を紹介しました。 この形が基本なので、なにか試したいことなどはこの形で試すと間違いにくいのでお勧めです。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>スタイルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>は模索する動作には向きますが、反復や再現する必要が出た時に効率が落ちます。こう言った<a class="keyword" href="http://d.hatena.ne.jp/keyword/CUI">CUI</a>なツールは最初のとっつきは悪いですが、慣れれば慣れるほどに効率が上がっていきますので是非挑戦してみてください。また、エディタはお気に入りのものを使えば良いので開発効率自体も上がるはずです。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>はesp8266やesp32の開発も問題なくできるようになりました。 M5Stackシリーズの開発にもどうぞ!</p> irieda ラズパイにAlpine-Linuxを画面なしインストール hatenablog://entry/26006613617473116 2020-08-21T09:45:53+09:00 2021-04-05T09:17:50+09:00 RaspberryPi 3 or 4 にAlpine-Linux(arm64)を画面とキーボードなしでインストールする方法。 144Labの入江田です。 alpine-linuxのインストールにはこれまで、画面とキーボードが必須だったのでインストールが結構面倒でした。 今回、ヘッドレスインストールに関する情報がAlpine-LinuxのWiKiに投稿されましたのでそれを試してみました。 情報元 https://wiki.alpinelinux.org/wiki/Raspberry_Pi-Headless_Installation 予めダウンロード http://www.sodface.com/… <p><figure class="figure-image figure-image-fotolife" title="alpine-linuxをさっくりインストール"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20200821/20200821094919.jpg" alt="f:id:irieda:20200821094919j:plain" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>RaspberryPi 3 or 4 にAlpine-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>(arm64)を画面とキーボードなしでインストールする方法。</figcaption></figure></p> <p>144Labの入江田です。</p> <p>alpine-<a class="keyword" href="http://d.hatena.ne.jp/keyword/linux">linux</a>のインストールにはこれまで、画面とキーボードが必須だったのでインストールが結構面倒でした。 今回、ヘッドレスインストールに関する情報がAlpine-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiKi">WiKi</a>に投稿されましたのでそれを試してみました。</p> <h2>情報元</h2> <p><a href="https://wiki.alpinelinux.org/wiki/Raspberry_Pi_-_Headless_Installation">https://wiki.alpinelinux.org/wiki/Raspberry_Pi<em>-</em>Headless_Installation</a></p> <h2>予めダウンロード</h2> <ul> <li><a href="http://www.sodface.com/repo/headless.apkovl.tar.gz">http://www.sodface.com/repo/headless.apkovl.tar.gz</a></li> <li><a href="http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/aarch64/alpine-rpi-3.12.0-aarch64.tar.gz">alpine-rpi-3.12.0-aarch64.tar.gz</a></li> </ul> <h2>基本のインストール手順</h2> <ol> <li>マイクロSDカード8~32GBを<a class="keyword" href="http://d.hatena.ne.jp/keyword/FAT32">FAT32</a>でフォーマットします。ラベルは「ALPINE」で。</li> <li>上記のalpine-rpi-3.12.0-aarch64.tar.gzをALPINEディスクに展開します</li> <li>上記のheadless.apkovl.tar.gzを解凍せずにALPINEディスクにコピーします</li> <li>ALPINEディスクルートに<a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>.txtを書く(「<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssid">ssid</a> WPA-PSK pass-phrase」の3単語を書いておきます)</li> <li>ALPINEディスクを取り外し操作をします</li> </ol> <h2>for <a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a></h2> <pre class="code shell" data-lang="shell" data-unlink>sudo diskutil eraseDisk FAT32 ALPINE MBRFormat /dev/disk2 tar xzvf alpine-rpi-3.12.0-aarch64.tar.gz -C /Volumes/ALPINE/ cp headless.apkovl.tar.gz /Volumes/ALPINE/ echo &lt;無線SSID&gt; WPA-PSK &lt;パスフレーズ&gt; &gt; /Volumes/ALPINE/wifi.txt find /Volumes/ALPINE \( -name &#34;.DS_Store&#34; -or -name &#34;._*&#34; \) -delete sudo diskutil unmountDisk /dev/disk2</pre> <h2>初回ログイン方法</h2> <ol> <li>前述の方法で作成したマイクロSDをRaspberryPiに差し込んで電源ONします</li> <li>RaspberryPiはブート後、<a class="keyword" href="http://d.hatena.ne.jp/keyword/wifi">wifi</a>.txtにしたがって無線接続します</li> <li>無線<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/localhost">localhost</a>という名称で繋ぎにきてるデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>を確認します</li> <li>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a> root@上記の<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>」にてノーパスワードでログインできます</li> </ol> <p>唯一環境に依存して難度が変わるのは、「ラズパイの動的<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>の確認方法」です。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/DHCP">DHCP</a>でアドレス払い出している状況を確認する必要があります。(一般的な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>は管理画面で確認できます)</p> <h2>初回ログイン後に必要な作業</h2> <pre class="code shell" data-lang="shell" data-unlink>setup-ntp -c chrony setup-keymap jp jp setup-hostname &lt;ホスト名&gt; setup-timezone -z UTC setup-apkrepos -1 hostname $(cat /etc/hostname) setup-lbu mmcblk0p1 setup-apkcache /media/mmcblk0p1/cache apk add rng-tools rc-update add rngd boot rc-update add wpa_supplicant boot rc-update add urandom boot mount -o remount,rw /media/mmcblk0p1 rm /media/mmcblk0p1/*.apkovl.tar.gz rm /media/mmcblk0p1/wifi.txt rc-update del local default rm /etc/local.d/headless.start apk add dbus avahi curl cd /root install -d .ssh -m 700 cd .ssh curl -L http://github.com/&lt;GitHubユーザーID&gt;.keys &gt; authorized_keys chmod go-r authorized_keys rc-update add dbus rc-update add avahi-daemon echo IPQoS 0x00 &gt;&gt; /etc/ssh/sshd_config lbu add /root/.ssh/authorized_keys lbu commit -d reboot</pre> <p>このあと、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a> root@&lt;ホスト名>.local」でログインできるようになってます。</p> <h2>この方法の特徴</h2> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>が<a class="keyword" href="http://d.hatena.ne.jp/keyword/FAT32">FAT32</a>をそのまま利用します</li> <li>そのため、SDカードに予め書いておいたファイルを読むこともできます</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%AF%A5%EC%A5%B9">ディスクレス</a>モード動作のためSDカードへの書き込み頻度が非常に少ない(ユーザーが操作した時だけ)</li> <li>「mount -o remount,rw /media/mmcblk0p1」コマンドにてSDカードに大量のファイルを書き込むこともできます</li> <li>SDカードのサイズに依存せずにインストールでき、SDカードの容量をフルに利用できます</li> <li>インストール作業がとにかく短時間で済みます(SDへの書き込みは100MB以下)</li> </ul> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%AF%A5%EC%A5%B9">ディスクレス</a>モードについて</h2> <ul> <li>SDカード、電源の切ったり入れたりが乱暴な運用に向いています</li> <li>apk経由インストールバイナリのみディスク負担がSDカードのFAT<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A1%BC%A5%C6%A5%A3%A5%B7%A5%E7%A5%F3">パーティション</a>にオフロードします</li> <li>RAMの容量で書き込み量の上限が決まっています(特にRAM1GiB以下モデルは要注意)</li> <li>apk以外のディスク消費の大きな作業をするとすぐディスクフルになってしまう</li> <li>lbu add/lbu commitして初めてそれまでに積み上げた変更が永続化されます</li> <li>commitされていない変更はリブート時に破棄されます</li> <li>基本<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a>でログインしての作業は最小限の操作しかしないようにしましょう</li> <li>ターゲット上でビルド作業とかはしてはいけません</li> <li>ホストマシンのdocker(arm64ベース)でビルド作業をするか、Go言語のクロスビルドを使いましょう</li> </ul> <h2>dockerのススメ</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>版のdockerは標準で別<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>CPUのイメージを実行することができます。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>版はいくつか追加作業が必要かも?)</p> <pre class="code shell" data-lang="shell" data-unlink>docker run -it aarch64/alpine</pre> <p>以上の環境でビルドなり開発作業を行い、成果物だけをRaspberryPiに置いて使います。成果物がかなり巨大な場合はSDカードのFAT領域に置くこともアリです。</p> irieda リモート会議のあれこれ hatenablog://entry/26006613530505871 2020-03-05T19:17:45+09:00 2020-03-05T20:13:11+09:00 144Labの大木です。ここのところの新型コロナウイルス(COVID-19)がらみの影響で、144Labとスイッチサイエンス、スイッチエデュケーションは「無理して出社しない」勤務になっています。 そこで社内の打ち合わせもリモート会議(オンライン会議、テレカン)になっているので、そこでの経験を書き留めておきます。 <p>144Labの大木です。ここのところの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%B7%B7%BF%A5%B3%A5%ED%A5%CA%A5%A6%A5%A4%A5%EB%A5%B9">新型コロナウイルス</a>(COVID-19)がらみの影響で、144Labとスイッチサイエンス、スイッチエデュケーションは「無理して出社しない」勤務になっています。 そこで社内の打ち合わせもリモート会議(オンライン会議、テレカン)になっているので、そこでの経験を書き留めておきます。</p> <h3>会議の前提</h3> <ul> <li>全員個々にオンライン参加</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a> Hangouts Meetを使用</li> </ul> <h3>ヘッドセット</h3> <p>今時<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>でつながるヘッドセット(マイク付きヘッドフォン)はいくらでもあるのでそれでつなげばいいやと思っていたのですが、Backspace.fmの第331回を聞いたら有線がよいということだったので早速安いやつを買ってきました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fbackspace.fm%2Fepisode%2F331%2F" title="#331:リモートワーク必須時代の遠隔会議術" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://backspace.fm/episode/331/">backspace.fm</a></cite> この回、他にもリモート会議についてのノウハウがたくさん出てくるのでおすすめです(3時間ありますが……)</p> <p>確かに有線接続のほうが明かに安定しているので会議中に切れるなどのストレスがなく、おすすめです。</p> <p>今回購入したのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%EC%A5%B3%A5%E0">エレコム</a>の<a href="https://www.elecom.co.jp/products/HS-HP28UBK.html">HS-HP28UBK</a>というヘッドセットで、選んだ理由は安いからです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E8%A5%C9%A5%D0%A5%B7%A5%AB%A5%E1%A5%E9">ヨドバシカメラ</a>で1,500円くらいでした。安いのはいいんですが1時間くらい会議が続くと耳が痛くなってくるので、もう少し高いのにした方がいいかもしれないです。</p> <p>Bluretooth接続のヘッドセットではこんな記事があるので気になっています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnote.com%2Finukai%2Fn%2Fnd05a09085a41" title="オンラインカンファレンス用のヘッドセット2018/10|Hiroshi Inukai 犬飼 博士|note" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://note.com/inukai/n/nd05a09085a41">note.com</a></cite></p> <h3>ウェブカメラ</h3> <p>ノートパソコンだったら内蔵のもので済ませるのですが、デスクトップ機だとそうもいかないので調達します。たまたま会社で使っていなかった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%C3%A5%D5%A5%A1%A5%ED%A1%BC">バッファロー</a>の<a href="https://www.buffalo.jp/product/detail/bsw200mbk.html">BSW200MBK</a>というカメラを持って帰って使っています。</p> <p>このカメラ、もともと画角が広く会議室などで使いやすいからと買ったのですが、それが災いして部屋の隅々まで写ってしまうのでちょっとこまりました。これから買うのでしたらなるべく広角でないやつを買うのをおすすめします。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>だったらFaceRigを使って…とかZOOMだったら背景入れ替えができて…とかあるのですが、残念ながら<a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>でMeetなので別の方法を考えます。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>にはいにしえから<a href="http://camtwiststudio.com/">CamTwist</a>というソフトウェアがあり、カメラとOSの間に入ってフィルタをかけることができます。これを使ってカメラ画像をトリミングしてやれば(擬似的にですが)画角を狭くすることができます。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fcamtwiststudio.com%2F" title="CamTwist" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://camtwiststudio.com/">camtwiststudio.com</a></cite></p> <p>ImageResizeというフィルタを足して適当に数値を設定していい感じにしました。</p> <p><figure class="figure-image figure-image-fotolife" title="CamTwist設定画面"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20200305/20200305184001.png" alt="f:id:ohki_s:20200305184001p:plain" title="f:id:ohki_s:20200305184001p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>CamTwist設定画面</figcaption></figure></p> <p>これで自分の部屋で安心して会議に参加できます。ちなみに単なるトリミング&amp;拡大なので画質は下がりますが表情はわかるので問題ないと考えています。</p> <p>ヘッドセットとカメラは以前展示会でもらった小型のUSBハブにつないで、会議の時にまとめてPCにつないでいます。</p> <h3>ノイズキャンセル</h3> <p>今日の会議からKrispというソフトウェアを試用し始めました。マイクやスピーカーのノイズをキャンセルしてくれるソフトウェアだそうです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fkrisp.ai%2F" title="Krisp | Noise Cancelling App" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://krisp.ai/">krisp.ai</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjp.vcube.com%2Fservice%2Fkrisp" title="Krisp | ノイズキャンセリングアプリケーション | テレワークで日本を変える | Web会議・テレビ会議(TV会議)のブイキューブ" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://jp.vcube.com/service/krisp">jp.vcube.com</a></cite></p> <p>マイクで拾った音のノイズキャンセルは14日間無料で試せるということで使ってみたところ、自分ではわからないのですが同僚によるとかなり効果はあるとのことでした。 14日間の無料期間後は1ヶ月500円の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%D6%A5%B9%A5%AF%A5%EA%A5%D7%A5%B7%A5%E7%A5%F3">サブスクリプション</a>ということなので、その時が来たらまた考えたいと思います。通常はそこまで頻繁にないんですよねオンライン会議。上に挙げた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>ヘッドセットのノイズキャンセルが強力ならそれでもいいような気もしています。</p> <h3>参考</h3> <p>最後に参考になるページを並べておきます。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.niid.go.jp%2Fniid%2Fja%2Fdiseases%2Fka%2Fcorona-virus%2F2019-ncov.html" title="新型コロナウイルス(2019-nCoV)関連情報ページ" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.niid.go.jp/niid/ja/diseases/ka/corona-virus/2019-ncov.html">www.niid.go.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.itmedia.co.jp%2Fnews%2Farticles%2F2003%2F02%2Fnews149.html" title="1200人以上の全社員がリモートワーク GitLabが公開する「リモートワークマニフェスト」は何を教えているか?" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.itmedia.co.jp/news/articles/2003/02/news149.html">www.itmedia.co.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fcybozu-remotework.qloba.com%2F" title="サイボウズの「テレワーク」に関する情報を公開します" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://cybozu-remotework.qloba.com/">cybozu-remotework.qloba.com</a></cite></p> <p><a href="https://www.lenovojp.com/business/solution/download/002/pdf/terework_startguide.pdf">始めよう!テレワークスタートガイド Lenovo(PDF)</a></p> ohki_s CES 2020 Arduinoブースレポート hatenablog://entry/26006613495799649 2020-01-10T18:54:16+09:00 2020-01-10T18:54:16+09:00 現在(2020/01/07〜10)ラスベガスで開催中のCES 2020に来ています。みなさんおなじみArduinoのブースレポートです。 今回の目玉は2つ、Arduino ProブランドとArduino Portenta H7基板の発表です。 Arduino Pro Proと名がついて何がProなのかというのが最初の疑問でした。Arduinoと言えば電子工作や学習向けのブランドという印象が強いのですが、そのArduinoをプロフェッショナルなIoT分野でも使ってもらおう、と作られたブランドだということです。 www.arduino.cc 具体的には、Arduino Pro IoT Cloudと… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20200110/20200110175847.jpg" alt="f:id:ohki_s:20200110175847j:plain" title="f:id:ohki_s:20200110175847j:plain" class="hatena-fotolife" itemprop="image"></span> 現在(2020/01/07〜10)ラスベガスで開催中のCES 2020に来ています。みなさんおなじみ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>のブースレポートです。</p> <p>今回の目玉は2つ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Proブランドと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Portenta H7基板の発表です。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro</h2> <p>Proと名がついて何がProなのかというのが最初の疑問でした。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>と言えば電子工作や学習向けのブランドという印象が強いのですが、その<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>をプロフェッショナルなIoT分野でも使ってもらおう、と作られたブランドだということです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.arduino.cc%2Fpro" title="Arduino Pro" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.arduino.cc/pro">www.arduino.cc</a></cite></p> <p>具体的には、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro IoT Cloudと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>が提供されることが発表されています。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro IoT Cloud</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro IoT Cloudはすでに<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> IoT Cloudとして公開されているもので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>からのデータをセキュアに蓄積、ビジュアライズすることができます。無償プラン以外に有償プランも提供され、台数の増加と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>以外のデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>からのデータ送信が可能になります。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.arduino.cc%2Fen%2FIoT%2FHomePage" title="Arduino - HomePage" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.arduino.cc/en/IoT/HomePage">www.arduino.cc</a></cite></p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a></h3> <p>以前から<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a> 2.0と言われていた開発環境です。今の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>を使っている方ならわかると思いますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>はお世辞にも大規模なプログラムを作るのに向いている作りにはなっていません。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>ではデバッガを搭載していて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EC%A1%BC%A5%AF%A5%DD%A5%A4%A5%F3%A5%C8">ブレークポイント</a>を設定したりステップ実行したりできるようになりました。また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>のコードにも対応しています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Farduino%2Farduino-pro-ide%2F" title="arduino/arduino-pro-ide" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/arduino/arduino-pro-ide/">github.com</a></cite></p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Protenta H7</h2> <p>新しいボード、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Protenta H7はSTマイクロのSTM32H747プロセッサとUSB Type-Cコネクタ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>を搭載した高性能<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>の推論などもできるようになりました。USB Type-Cコネクタは電源とUSBの通信だけではなく、DisplayPortにも対応して画像出力もできます。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fstore.arduino.cc%2Fusa%2Fportenta-h7" title="Portenta H7" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://store.arduino.cc/usa/portenta-h7">store.arduino.cc</a></cite></p> <div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20200110/20200110183748.jpg" alt="f:id:ohki_s:20200110183748j:plain" title="f:id:ohki_s:20200110183748j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20200110/20200110183647.jpg" alt="f:id:ohki_s:20200110183647j:plain" title="f:id:ohki_s:20200110183647j:plain" class="hatena-fotolife" itemprop="image"></span></div> <p>基板の両端には2.54mmピッチの端子が並んでおり、MKRシリーズと互換性があります。また基板裏面には80ピンの高密度コネクタが2つついており、ここにつながるオプションボードも用意されます。</p> <div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20200110/20200110184912.jpg" alt="f:id:ohki_s:20200110184912j:plain" title="f:id:ohki_s:20200110184912j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20200110/20200110184905.jpg" alt="f:id:ohki_s:20200110184905j:plain" title="f:id:ohki_s:20200110184905j:plain" class="hatena-fotolife" itemprop="image"></span></div> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>のチップは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%BC%C5%C4%C0%BD%BA%EE%BD%EA">村田製作所</a>製なので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>対応もそんなに大変じゃないのではないかと考えています。その辺は販売時期や価格などと一緒に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> LLCと相談していくことになると思います。また進捗がありましたら随<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%FE%CA%F3">時報</a>告しますので、しばらくお待ちください。</p> ohki_s ハードウェアのデバッグについて hatenablog://entry/26006613478338960 2019-12-08T13:49:12+09:00 2019-12-11T03:29:27+09:00 先日、IoT開発を始めたばかりという方から「ハードウェアのデバッグはどうやるんですか?」と質問を受けました。デバッグというか動作確認には各種測定器を使うわけですが、どういう手順でどういう測定器を使うかはあまり解説されていないと思ったので、まとめてみます。 既存のマイコンボードやブレークアウトボードにはんだ付けされたデバイス(ICチップ)をジャンパワイヤを使ってつないで使っていることを前提としています。 テスター(デジタルマルチメータ) まず使ってほしいのがテスターです。そもそも電源が供給されているか、その電圧はデバイスが必要としている電圧かを確認しましょう。HiまたはLoに固定されているべき端… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191208/20191208134146.jpg" alt="f:id:ohki_s:20191208134146j:plain" title="f:id:ohki_s:20191208134146j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>先日、IoT開発を始めたばかりという方から「ハードウェアの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>はどうやるんですか?」と質問を受けました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>というか動作確認には各種測定器を使うわけですが、どういう手順でどういう測定器を使うかはあまり解説されていないと思ったので、まとめてみます。 既存の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードやブレークアウトボードにはんだ付けされたデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>(ICチップ)をジャンパワイヤを使ってつないで使っていることを前提としています。</p> <h3>テスター(デジタルマルチメータ)</h3> <p>まず使ってほしいのがテスターです。そもそも電源が供給されているか、その電圧はデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>が必要としている電圧かを確認しましょう。HiまたはLoに固定されているべき端子が本当にそうなっているか、変化しているはずの端子がHiやLoになりっぱなしになってしまっていることもわかります。</p> <p>何をやっても値が返ってこないデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>があったのでテスターで各端子の電圧を調べてみたらそのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>のリセットがかかりっぱなしだった、ということも過去にありました。</p> <p>スイッチサイエンスで取り扱っている製品では、テスターとしては多機能でちょっと高いのですが <a href="https://www.switch-science.com/catalog/5759/">pokitMeter</a> を挙げておきます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>を画面として使えるかわいい測定器です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.switch-science.com%2Fcatalog%2F5759%2F" title="pokitMeter - スイッチサイエンス" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.switch-science.com/catalog/5759/">www.switch-science.com</a></cite></p> <p>もちろん、もっと安価なデジタルテスターでも大丈夫です。安いものほど測定数値の更新頻度が低いのですが、まあないよりはずっとよいです。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a></h3> <p>どうやらデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>に正しい電圧がかかっているということがわかったら、次は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>とデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>間の通信内容を見てみます。そのためには<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>という測定器を使います。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>は、配線にかかっている電圧がHiなのかLoなのかの時間変化を測定する測定器です(えらくまどろっこしい書き方をしている理由は後で書きます)。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>を使うと「正しい値を書き込んでいる<b>つもり</b>なのになぜか想定した値が返ってこない」といった状況で、何が起こっているかを調べることができます。</p> <p>また、最近の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%C8%A5%B3%A5%EB">プロトコル</a>アナライザの機能も入っている物も多く、てシリアル通信やI2C、SPIは解析してくれるので、単にビット列を見るよりも格段に楽に動作を確認することができます。 I2Cのアドレス間違いや返ってきた値の解釈間違いなどよくあります。</p> <p>スイッチサイエンスで取り扱っている製品では<a href="https://www.switch-science.com/catalog/5194/">USBロジックアナライザ - 24 MHz/8チャンネル</a> がいいです。お安いです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.switch-science.com%2Fcatalog%2F5194%2F" title="USBロジックアナライザ - 24 MHz/8チャンネル - スイッチサイエンス" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.switch-science.com/catalog/5194/">www.switch-science.com</a></cite></p> <p>パソコンとUSBケーブルでつないで使うタイプの測定器で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>の測定ソフトPulseViewに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%C8%A5%B3%A5%EB">プロトコル</a>アナライザ機能もあります。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a></h3> <p>と、ここまではある程度デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>が信用できる時の話です。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>という測定器は、測定している信号がHiかLoかであるという前提で測定結果を出力するので、本当はHiは5Vになっているはずなのに3Vしか出ていない時もHiとして表示してしまう可能性があるのです。</p> <p>なので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>では動作しているように見えるのに実機ではうまく動かない時は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a>を使ってどういう信号が流れているかを測定しましょう。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a>にはアナログとデジタルがあって、という話を書き始めるとまた長くなるので書かないでおきます。簡単に手に入るのはいわゆる「デジタルストレージ方式の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a>」です。信号の波形をサンプリングして表示します。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>と違って多段階(256段階とか)で電圧の変化を見ることができるので、先に書いた「5Vのつもりが3V」などもわかります。</p> <p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>では時間をかけずに信号が変化しているように見えますが、実際の信号はある程度の時間をかけて変化しています。ゆっくりと変化するとデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>が信号の変化を認識できず誤動作することがあるので、それを見つけるのにも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a>を使います。</p> <p>スイッチサイエンスで取り扱っている製品の中では<a href="https://www.switch-science.com/catalog/1163/">DSO Quad - アルミ合金ケース(シルバー)</a>がよいでしょう。DSO nanoやpokitMeterは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>の信号を見るには力不足です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.switch-science.com%2Fcatalog%2F1163%2F" title="DSO Quad - アルミ合金ケース(シルバー) - スイッチサイエンス" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.switch-science.com/catalog/1163/">www.switch-science.com</a></cite></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>の前に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a>だろ、という意見があるのはもちろんわかります。つまるところ、何をどこまで信用するか、ということにつきます。今回はんだ付けは信頼するという前提で考えたのでこのような順序で紹介しました。自分で基板設計して実装したのなら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a>のほうが先でしょう。</p> <p>動作を確認する際に重要なのは、この「何をどこまで信用するか」ということです。無条件に正しいと信じ込んで確認の対象から外してしまうと、そこに問題があったときに永久に解決しなくなってしまいます。どこまで信用してどこを疑っているのか、常に意識しながら動作確認することを忘れないようにしましょう。</p> ohki_s 「技適未取得機器を用いた実験等」の届出をしてみた hatenablog://entry/26006613468635414 2019-11-21T10:00:23+09:00 2019-11-24T01:18:44+09:00 144Lab/スイッチサイエンスの菊地です。 昨日11月20日より改正電波法の一部が施行され、総務省電波利用ホームページ内に「技適未取得機器を用いた実験等の特例制度」のページが開設されました。 これは「技適」相当の技術基準を満たす無線機器については、実験・試験・調査等の目的を届け出ることにより「技適マーク」がなくても180日以内の間使用できるというものです。 総務省電波利用ホームページ 対象となる無線機器 対象となる無線機器はWi-Fi (IEEE802.11a/b/g/n/ac/ad/ax draft), Bluetooth (2.1〜5.1), LoRaWAN (AS923), Sigfo… <p>144Lab/スイッチサイエンスの菊地です。</p> <p>昨日11月<a class="keyword" href="http://d.hatena.ne.jp/keyword/20%C6%FC">20日</a>より改正電波法の一部が施行され、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>電波利用ホームページ内に「<b><a href="https://www.tele.soumu.go.jp/j/sys/others/exp-sp/index.htm">技適未取得機器を用いた実験等の特例制度</a>」</b>のページが開設されました。</p> <p>これは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>」相当の技術基準を満たす無線機器については、<b>実験・試験・調査等の目的を届け出ることにより「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>マーク」がなくても180日以内の間使用できる</b>というものです。</p> <p><figure class="figure-image figure-image-fotolife" title="総務省電波利用ホームページ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191121/20191121012931.png" alt="f:id:kiku_144:20191121012931p:plain" title="f:id:kiku_144:20191121012931p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>電波利用ホームページ</figcaption></figure></p> <h3>対象となる無線機器</h3> <p>対象となる無線機器は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a> (<a class="keyword" href="http://d.hatena.ne.jp/keyword/IEEE802.11a">IEEE802.11a</a>/b/g/n/ac/ad/ax draft), <a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a> (2.1〜5.1), LoRaWAN (AS923), Sigfox(RC3), <a class="keyword" href="http://d.hatena.ne.jp/keyword/IEEE802">IEEE802</a>.15.4(<a class="keyword" href="http://d.hatena.ne.jp/keyword/ZigBee">ZigBee</a>など)等の各規格に準拠したものです。なお、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>機器は5.2GHz帯・5.3GHz帯は屋内のみ、5.8GHz帯は使用不可など、機器の仕様が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>令に合致しているかの確認が必要になります。</p> <p><b>無線機器のパッケージやデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>上に<a class="keyword" href="http://d.hatena.ne.jp/keyword/FCC">FCC</a> IDや<a class="keyword" href="http://d.hatena.ne.jp/keyword/CE%A5%DE%A1%BC%A5%AF">CEマーク</a>があるか、また、取扱説明書や仕様書から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>の指定する無線規格に合致しているか、を実験を行うものが確認して、自ら届出する必要がある</b>というわけです。</p> <p><a href="https://www.tele.soumu.go.jp/j/sys/others/exp-sp/index.htm#law">技適未取得機器を用いた実験等の特例制度 関係法令</a></p> <p>また、実験等は180日以内の短期間の実験・試験・調査である必要があり、<b>同一目的の実験等で再度届け出ることは出来ません。</b>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>マークを取得し無線機器に表示するか、無線局を廃止する必要があります)</p> <h3>端末の仕様を確認する</h3> <p>では、実際に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>電波利用ホームページから届出をしてみましょう。 今回は米国出張時に入手した <a href="https://www.particle.io/">Particle</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>開発ボード <a href="https://store.particle.io/products/argon-kit">Argon</a>と、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>開発ボード <a href="https://store.particle.io/collections/bluetooth/products/xenon-kit">Xenon</a>を組み合わせた検証について届出をしたいと思います。<a href="#f-ff370f55" name="fn-ff370f55" title="なお、今回の電波法改正以前より、海外から持ち込まれたWi-Fi/Bluetooth端末等は訪日観光客等の入国の日から90日以内に限って利用可能です。 https://www.tele.soumu.go.jp/j/sys/others/inbound/index.htm">*1</a></p> <p><figure class="figure-image figure-image-fotolife" title="Particle"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191121/20191121094609.jpg" alt="f:id:kiku_144:20191121094609j:plain" title="f:id:kiku_144:20191121094609j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>Particle ArgonとXenon</figcaption></figure></p> <p>まず、Argon/Xenonのパッケージやホームページのデータシートから<a class="keyword" href="http://d.hatena.ne.jp/keyword/FCC">FCC</a>マークが確認できます。また、Particleホームページにある<a class="keyword" href="http://d.hatena.ne.jp/keyword/FCC">FCC</a> IDの情報(<a class="keyword" href="http://d.hatena.ne.jp/keyword/FCC">FCC</a> ID: 2AEMI-ARGN, 2AEMI-XENN)から<a class="keyword" href="http://d.hatena.ne.jp/keyword/FCC">FCC</a>認証のときの詳細情報が確認できます。 日本の基準にも合致していそうです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>規格は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a> 5で、心配だった<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>は5GHz帯は使っていないようです。<a href="#f-ea8b95e6" name="fn-ea8b95e6" title="Particleの過去の製品では、Wi-Fiの出力の関係で日本専用ファームウェアを焼き込まないと日本では使用できないという事例がありました。[https://docs.particle.io/datasheets/certifications/certification/#telec]">*2</a></p> <p><figure class="figure-image figure-image-fotolife" title="出典:Particleホームページ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191121/20191121013949.png" alt="f:id:kiku_144:20191121013949p:plain" title="f:id:kiku_144:20191121013949p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>出典:Particleホームページ</figcaption></figure></p> <p><figure class="figure-image figure-image-fotolife" title="FCC IDの情報"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191121/20191121014026.png" alt="f:id:kiku_144:20191121014026p:plain" title="f:id:kiku_144:20191121014026p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/FCC">FCC</a> IDの情報</figcaption></figure></p> <h3>届出の手順</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>ホームページに届出用のメールアドレスを入力し、メールが届くのを待ちます。届いたメールから届出書作成ページに遷移し、まずは届出者の情報を入力します。</p> <p><figure class="figure-image figure-image-fotolife" title="申請項目1"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191120/20191120180257.png" alt="f:id:kiku_144:20191120180257p:plain" title="f:id:kiku_144:20191120180257p:plain" class="hatena-fotolife" itemprop="image"></span></figure></p> <p>次に、実験等の目的と先ほど調べた無線機器の規格を記載します。</p> <p><figure class="figure-image figure-image-fotolife" title="申請項目2"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191120/20191120173745.png" alt="f:id:kiku_144:20191120173745p:plain" title="f:id:kiku_144:20191120173745p:plain" class="hatena-fotolife" itemprop="image"></span></figure></p> <p>その後、運用開始の予定期日、無線局ごとの情報(シリアルナンバーや機器の形式、設置場所など)を記載して届出書印刷ページを表示し、プリンターで印刷します。</p> <p><figure class="figure-image figure-image-fotolife" title="完成した申請書"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191121/20191121013558.png" alt="f:id:kiku_144:20191121013558p:plain" title="f:id:kiku_144:20191121013558p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>完成した申請書</figcaption></figure></p> <h3>いざ、関東<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%B9%E7%C4%CC%BF%AE%B6%C9">総合通信局</a>へ</h3> <p>今年度内にはオンライン届出システムが整備される予定ですが、当初は届出者の<a href="https://www.tele.soumu.go.jp/j/sys/fees/other/commtab1/index.htm">都道府県を管轄する総合通信局</a>の電波利用企画課に届出書を郵送、または直接持ち込む必要があります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191121/20191121093727.jpg" alt="f:id:kiku_144:20191121093727j:plain" title="f:id:kiku_144:20191121093727j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>3分ほどで無事届出が受理されましたが、その場では届出番号は出されず、後日メールアドレス宛に連絡が来るとのことです。</p> <h4>11/23 追記</h4> <p>翌朝11/22の始業前に受け付けた旨のメールが届きました。 廃止期限は届出から180日後の2020年5月18日です。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20191124/20191124011536.jpg" alt="f:id:kiku_144:20191124011536j:plain" title="f:id:kiku_144:20191124011536j:plain" class="hatena-fotolife" itemprop="image"></span></p> <h3>おわりに</h3> <p>届出手続き自体はさほど難しくはありませんが、実験対象となる機器が「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>」相当の技術基準を満たすことを確認するハードルが一般の人々には高いのではないかと感じました。</p> <p>例えば、中国・深圳で購入したスマート家電等の場合には必ずしもWi−Fiや<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>のマーキングがされているとは限りません。この場合、無線従事者免許を持つ者(無線従事者)が、当該技術基準及び電波法の技術基準に適合する旨を確認し、その旨を届出書に記載する必要があります。</p> <p>144Labグループ各社では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>、LoRaWAN、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Zigbee">Zigbee</a>の各種機器や開発ボードのお取り扱いがございますが、<b>日本の法規制に適合した(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>マーク付きの)製品をお客さまに販売していく原則に変わりはございません</b>。</p> <p>なお、<b>本特例制度の利用を検討されるお客さまにつきましては、お取り寄せも承っております</b>。実験検討段階でお取り寄せ希望の無線機器が本特例制度の対象となるかについて調査いただいたうえで、弊社営業までご相談いただけますと幸いです。よろしくお願いいたします。</p> <div class="footnote"> <p class="footnote"><a href="#fn-ff370f55" name="f-ff370f55" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">なお、今回の電波法改正以前より、海外から持ち込まれた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>端末等は訪日観光客等の入国の日から90日以内に限って利用可能です。 <a href="https://www.tele.soumu.go.jp/j/sys/others/inbound/index.htm">https://www.tele.soumu.go.jp/j/sys/others/inbound/index.htm</a></span></p> <p class="footnote"><a href="#fn-ea8b95e6" name="f-ea8b95e6" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">Particleの過去の製品では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>の出力の関係で日本専用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>を焼き込まないと日本では使用できないという事例がありました。<a href="https://docs.particle.io/datasheets/certifications/certification/#telec">https://docs.particle.io/datasheets/certifications/certification/#telec</a></span></p> </div> kiku_144 nRF52シリーズをArduinoで開発する方法 hatenablog://entry/26006613467600083 2019-11-18T11:57:38+09:00 2019-11-18T17:52:40+09:00 144Labの入江田です。 Adafruit_nRF52_Bootloaderですが、そのままArduino環境構築して利用可能なのを発見しました。 「Adafruit nRF52 by Adafruit(adafruit:nrf52) version:0.14.6」 というボードサポートを追加するだけでarduinoコードの実行とシリアルモニタが利用可能でした。 ここではnRF52840やその互換チップorモジュールでの開発にArduinoを使う方法を解説します。 セットアップ ターゲットにはAdafruit_nRF52_Bootloaderが書き込み済みであることが前提です。 書き込み済み… <p>144Labの入江田です。</p> <p><a href="https://github.com/adafruit/Adafruit_nRF52_Bootloader">Adafruit_nRF52_Bootloader</a>ですが、<strong>そのまま<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>環境構築して利用可能なのを発見しました。</strong></p> <p>「Adafruit nRF52 by Adafruit(adafruit:nrf52) version:0.14.6」 というボードサポートを追加するだけで<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>コードの実行とシリアルモニタが利用可能でした。</p> <p>ここではnRF52840やその互換チップorモジュールでの開発に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を使う方法を解説します。</p> <h2>セットアップ</h2> <p>ターゲットには<a href="https://github.com/adafruit/Adafruit_nRF52_Bootloader">Adafruit_nRF52_Bootloader</a>が書き込み済みであることが前提です。 書き込み済みの製品(例えばSparkfan nRF52840 miniなど)を入手するか、 JLink、DAPLink、OpenOCD、nrfjprogなどの<a class="keyword" href="http://d.hatena.ne.jp/keyword/JTAG">JTAG</a>/SWD系ツールでnRF52840のターゲットに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーを書き込んでおきます。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>の場合、</p> <p>予めPCにインストールするもの</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a></li> <li>adafruit-nrfutil</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>.<a class="keyword" href="http://d.hatena.ne.jp/keyword/yaml">yaml</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>: <HOME>/Library/Arduino15/<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>.<a class="keyword" href="http://d.hatena.ne.jp/keyword/yaml">yaml</a>)</p> <pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">proxy_type</span><span class="synSpecial">:</span> auto <span class="synIdentifier">sketchbook_path</span><span class="synSpecial">:</span> &lt;HOME&gt;/Documents/Arduino <span class="synIdentifier">arduino_data</span><span class="synSpecial">:</span> &lt;HOME&gt;/Library/Arduino15 <span class="synIdentifier">board_manager</span><span class="synSpecial">:</span> <span class="synIdentifier">additional_urls</span><span class="synSpecial">:</span> <span class="synStatement">- </span>https://www.adafruit.com/package_adafruit_index.json </pre> <pre class="code lang-sh" data-lang="sh" data-unlink>arduino-cli core update-index arduino-cli core install adafruit:nrf52 </pre> <p>ターゲットボードに「Nordic nRF52840DK(PCA10056)」を選べば、 とりあえずUSBにつながっているnRF52840互換チップでファーム開発ができます。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Makefile">Makefile</a>例</h2> <pre class="code lang-make" data-lang="make" data-unlink><span class="synIdentifier">NAME </span>:= &lt;アプリフォルダ名&gt; <span class="synIdentifier">FQBN </span>:= adafruit:nrf52:pca10056 <span class="synIdentifier">PORT </span>:= /dev/tty.usbmodem<span class="synComment">####&lt;-USB-CDCデバイス名</span> <span class="synIdentifier">depends:</span> <span class="synConstant"> pip3 install --user adafruit-nrfutil</span> <span class="synIdentifier">build:</span> <span class="synConstant"> arduino-cli compile -b </span><span class="synIdentifier">$(FQBN)</span><span class="synConstant"> </span><span class="synIdentifier">$(NAME)</span> <span class="synConstant"> adafruit-nrfutil dfu genpkg --dev-type 0x0052 </span><span class="synSpecial">\</span> <span class="synConstant"> --application </span><span class="synIdentifier">$(NAME)</span><span class="synConstant">/</span><span class="synIdentifier">$(NAME)</span><span class="synConstant">.</span><span class="synIdentifier">$(</span><span class="synStatement">subst</span><span class="synIdentifier"> :,.,$(FQBN))</span><span class="synConstant">.hex </span><span class="synSpecial">\</span> <span class="synConstant"> </span><span class="synIdentifier">$(NAME)</span><span class="synConstant">/</span><span class="synIdentifier">$(NAME)</span><span class="synConstant">.</span><span class="synIdentifier">$(</span><span class="synStatement">subst</span><span class="synIdentifier"> :,.,$(FQBN))</span><span class="synConstant">.zip</span> <span class="synIdentifier">upload:</span> <span class="synConstant"> arduino-cli upload -b </span><span class="synIdentifier">$(FQBN)</span><span class="synConstant"> -p </span><span class="synIdentifier">$(PORT)</span><span class="synConstant"> </span><span class="synIdentifier">$(NAME)</span> </pre> <p>利用例</p> <pre class="code console" data-lang="console" data-unlink>&gt; make build ... Zip created at ???/???.adafruit.nrf52.pca10056.ino.zip &gt; make upload ... ######################################## ######################################## ### Activating new firmware Device programmed.</pre> <p>個人的には<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>よりも<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/cli">cli</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Makefile">Makefile</a>の方が再現性が高く便利だと思います。 (そのままDockerfileに書いても動作させやすいですし、TravisCIやCircleCIに載せるのも簡単です)</p> <h2>nRF52を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>で開発してみて辛かったところ</h2> <ul> <li>メジャーではないターゲットの情報源は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>のみ</li> <li>コア機能がターゲット別に<strong>結構</strong>差異がある <ul> <li>特に割り込み関連</li> <li>要するに抽象化の仕組みがほとんどない</li> </ul> </li> <li>SPIまわりがターゲットごとにハードコードされていて、類似ターゲットで動かそうとするとちょっとした<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%A2%A5%E9%A5%A6%A5%F3%A5%C9">ワークアラウンド</a>が必要 <ul> <li>これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の方針の問題かな。一通りの機能を有効化してユーザーアプリケーションを起動するスタイル。しかしライブラリはそうではなく、活性化用の関数がある。後者で統一してほしいところ。</li> </ul> </li> </ul> <h2>今のところ把握している<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%A2%A5%E9%A5%A6%A5%F3%A5%C9">ワークアラウンド</a></h2> <h3>ピン割り込みの罠</h3> <p>LOWとかいてるところ、nRF52の場合LOWとHIGHを指定すると黙って失敗します。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>には対応してるのはRISINGとCHANGEとFALLINGのみと書いていました。</p> <pre class="code arduino" data-lang="arduino" data-unlink>attachInterrupt(GPIO, handler, LOW);</pre> <p>状況に応じて割り込みを保留してあとで割り込み発生させたい事例の場合、 「LOW」を指定する代わりに「FALLING|ISR_DEFERRED」を指定すると良いでしょう。</p> <h3>タイマー割り込み</h3> <p>タイマー割り込みは実質ターゲット<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>別のライブラリが必要です。 Cortex-M(ARM)系は決まった名前の割り込みハンドラを上書き宣言すればOKというのは共通です。</p> <pre class="code arduino" data-lang="arduino" data-unlink>extern &#34;C&#34; void TIMER2_IRQHandler(void) { if ((NRF_TIMER2-&gt;EVENTS_COMPARE[0] != 0) &amp;&amp; ((NRF_TIMER2-&gt;INTENSET &amp; TIMER_INTENSET_COMPARE0_Msk) != 0)) { NRF_TIMER2-&gt;EVENTS_COMPARE[0] = 0; // Clear compare register 0 event } ...TODO implement } void startTimer(unsigned long us) { NRF_TIMER2-&gt;TASKS_STOP = 1; NRF_TIMER2-&gt;MODE = TIMER_MODE_MODE_Timer; // Set the timer in Counter Mode NRF_TIMER2-&gt;TASKS_CLEAR = 1; // clear the task first to be usable for later NRF_TIMER2-&gt;PRESCALER = 4; // Set prescaler. Higher number gives slower // timer. NRF_TIMER2-&gt;BITMODE = TIMER_BITMODE_BITMODE_32Bit &lt;&lt; TIMER_BITMODE_BITMODE_Pos; NRF_TIMER2-&gt;CC[0] = us; // Set value for TIMER2 compare register 0 // Enable interrupt on Timer 2, both for CC[0] and CC[1] compare match events NRF_TIMER2-&gt;INTENSET = TIMER_INTENSET_COMPARE0_Enabled &lt;&lt; TIMER_INTENSET_COMPARE0_Pos; // Clear the timer when COMPARE0 event is triggered NRF_TIMER2-&gt;SHORTS = TIMER_SHORTS_COMPARE0_CLEAR_Enabled &lt;&lt; TIMER_SHORTS_COMPARE0_CLEAR_Pos; NRF_TIMER2-&gt;TASKS_START = 1; // Start TIMER NVIC_EnableIRQ(TIMER2_IRQn); }</pre> <h3>I2CをカスタムPINで使う方法</h3> <p>ほとんどのボードではI2Cは一つしか使われないのを利用して、 二つ目のI2Cをセットアップする形で利用可能です。 (一つ目を再定義し直すことは簡単にはできなかった。できる方法がある?) ただし、利用する側は下記コードにある「Wire1」<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を使う必要があります。</p> <pre class="code arduino" data-lang="arduino" data-unlink>TwoWire Wire1(NRF_TWIM1, NRF_TWIS1, SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn, SDA_PIN, SCL_PIN); extern &#34;C&#34; void SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler(void) { //Serial.println(F(&#34;Wire1.onService()&#34;)); Wire1.onService(); }</pre> <h2>まとめ</h2> <ul> <li>USBデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>タイプのシリアルポートは利用可能にするまでのハードルが高く、扱いにくい面があったけれど、この手法の場合<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーがセットアップ済みのUSB-CDCデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を引き継いで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>用の入出力機構として利用可能です。</li> <li>シリアルモニタが最初から使えるのは大きなアドバンテージです。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の豊富なライブラリのうちCPU<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>に依存のない物が利用可能です。</li> <li>一部標準の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の機能が利用できないがそのうちの一部はここに書いた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%A2%A5%E9%A5%A6%A5%F3%A5%C9">ワークアラウンド</a>で利用可能です。</li> <li>とにかくシリアルポートさえ確保できれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーが実装可能なのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の強みですね。</li> </ul> irieda Scratch2.0 オフラインエディター Windows版で拡張機能の追加ができない時に試してほしいこと hatenablog://entry/26006613415947842 2019-11-05T19:10:05+09:00 2019-11-05T19:10:05+09:00 Scratch2.0 オフラインエディター Windows版で拡張機能の追加ができない時に試してみてほしいことを書きます。 すでにScratch 3.0が登場しているので多くの人には無用の記事の可能性が高いのですが、弊社で開発、販売している(いた)Nekoboard2がScratch2.0までしか対応していないので、記録として残しておきます。 <p>Scratch2.0 オフラインエディター <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>版で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>の追加ができない時に試してみてほしいことを書きます。</p> <p>すでにScratch 3.0が登場しているので多くの人には無用の記事の可能性が高いのですが、弊社で開発、販売している(いた)<a href="http://ssci.to/2700">Nekoboard2</a>がScratch2.0までしか対応していないので、記録として残しておきます。</p> <p>Scratch2.0でNekoboard2を使うためには、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>を追加する必要があります。Scratch2の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>タブの中の「その他」を選択して「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>を追加」するとどの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>を追加するか選ぶ画面が出るので、Picoboardを選んでOKを押せば追加できます。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20190902/20190902130817.jpg" alt="f:id:ohki_s:20190902130817j:plain" title="f:id:ohki_s:20190902130817j:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20190902/20190902130837.png" alt="f:id:ohki_s:20190902130837p:plain" title="f:id:ohki_s:20190902130837p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>が、この追加ができない場合があります。具体的には選んでOKを押しても何も追加されないのです。これはNekoboard(Picoboard)に限らず、隣の<a class="keyword" href="http://d.hatena.ne.jp/keyword/LEGO">LEGO</a> WeDo1.0や2.0でも同じですので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>のどれかに問題があるのではなく、Scratch2.0側に問題があるのではないかと考えられます。</p> <p>Scratchのディスカッションフォーラムでも<a href="https://scratch.mit.edu/discuss/topic/74392/?page=28#post-2765434">2017年に話題になっていました</a>が、結局原因不明で未解決のままのようです。</p> <p>しかし先日お客様からのサポート依頼が来たのを皮切りにいろいろ調べてみたところ、もしかしてこれが原因なのでは?という対処方法を見つけたので、これで100%解決するかどうかはわかりませんが上記症状で困っている方は試してみてください。</p> <p>その対処方法とは<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>のユーザー名(ローカルアカウント)を半角英数のみにする</b>です。</p> <p>現在漢字やかなや全角の英数字、記号などが含まれたユーザー名を使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>にサインインしている場合、そのユーザー名を半角英数のみに変更するだけではだめなので、新しく半角英数のみでユーザーアカウントを作って、そのアカウントでサインインしてからScratch2.0で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD">拡張機能</a>の追加を試してみてください。新しくユーザーアカウントを作る方法は<a href="https://support.microsoft.com/ja-jp/help/4026923/windows-10-create-a-local-user-or-administrator-account">Windows 10 でローカルのユーザー アカウントまたは管理者アカウントを作成する</a>に説明があります。</p> <p>ここからは推測ですが、ユーザー名自体に全角文字が使われていることに問題があるわけではなく、ユーザー名が入ったユーザーフォルダが作られ、その中にScratch2.0の何かが保存されることが問題なのではないかと思います。いろいろ面倒なことが起こりそうなので試していないのですが、ユーザーフォルダ名を変えるだけでも追加できるようになるのかもしれません。</p> <p>なお、Scratch3.0ではNekoboard2は使えないのですが<a href="http://ssci.to/5263">micro:bit</a>が使えますので、今後購入される方は<a class="keyword" href="http://d.hatena.ne.jp/keyword/micro%3Abit">micro:bit</a>をご検討いただいた方がよさそうです。</p> ohki_s M5Stack用MusicIFで作るシンセサイザー hatenablog://entry/26006613458577030 2019-10-31T18:02:45+09:00 2019-11-01T14:48:32+09:00 M5Stack用のMusicインターフェースボード(2019年冬発売予定)でシンセサイザーのデモを作りました。 ソースコード: https://github.com/144lab/M5Stack-MusicIF-Demo 以下はその実装の解説です。 USB-MIDIキーボード 以下の記述のspiRead関数でUSB-MIDIキーボードからのメッセージを読めます。 (MusicIF側のSTMマイコンのファームにUSB-MIDIキーボードのハンドリング機能が実装済み) #include <SPI.h> SPIClass *vspi = NULL; void setup() { // initial… <p>M5Stack用のMusicインターフェースボード(2019年冬発売予定)で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%BB%A5%B5%A5%A4%A5%B6%A1%BC">シンセサイザー</a>のデモを作りました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190820/20190820190435.jpg" alt="f:id:irieda:20190820190435j:plain" title="f:id:irieda:20190820190435j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>: <a href="https://github.com/144lab/M5Stack-MusicIF-Demo">https://github.com/144lab/M5Stack-MusicIF-Demo</a></p> <p>以下はその実装の解説です。</p> <h2>USB-<a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>キーボード</h2> <p>以下の記述のspiRead関数でUSB-<a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>キーボードからのメッセージを読めます。 (MusicIF側のSTM<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>のファームにUSB-<a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>キーボードのハンドリング機能が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%C2%C1%F5%BA%D1">実装済</a>み)</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;SPI.h&gt;</span> SPIClass *vspi = <span class="synConstant">NULL</span>; <span class="synType">void</span> setup() { <span class="synComment">// initialise vspi with default pins</span> digitalWrite(<span class="synConstant">5</span>, HIGH); pinMode(<span class="synConstant">5</span>, OUTPUT); <span class="synComment">// SCLK = 18, MISO = 19, MOSI = 23, SS = 5</span> vspi = new SPIClass(VSPI); vspi-&gt;begin(); } <span class="synType">uint8_t</span> spiRead() { <span class="synType">uint8_t</span> v; vspi-&gt;beginTransaction(SPISettings(<span class="synConstant">1000000</span>, MSBFIRST, SPI_MODE1)); digitalWrite(<span class="synConstant">5</span>, LOW); <span class="synComment">// pull SS slow to prep other end for transfer</span> v = vspi-&gt;transfer(<span class="synConstant">0xFE</span>); digitalWrite(<span class="synConstant">5</span>, HIGH); <span class="synComment">// pull ss high to signify end of data transfer</span> vspi-&gt;endTransaction(); delayMicroseconds(<span class="synConstant">300</span>); <span class="synStatement">return</span> v; } </pre> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>メッセージの概要</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>メッセージは先頭データだけ最上位ビットが1。追加のデータは7bit値が1つまたは2つ続く。</p> <ul> <li>「0x90,0x40,0x7f」というデータは64(0x40)番ノートオン、速度(強度)は最大(0x7f)という意味のメッセージ</li> <li>「0x80,0x40,0x7f」というデータは64(0x40)番ノートオフ、速度(強度)は最大(0x7f)という意味のメッセージ</li> <li>「0xb0,0x40,0x7f」というデータはコン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>パラメータの変更で、サステインペダルを最大限踏んだという意味のメッセージ</li> <li>「0xe0,0x00,0x40」というデータはピッチベンド操作で、ピッチベンドを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%E5%A1%BC%A5%C8%A5%E9">ニュートラ</a>ルに戻したという意味のメッセージ</li> </ul> <table> <thead> <tr> <th>ノート番号</th> <th>周波数</th> <th>音階</th> <th>オクターブ</th> </tr> </thead> <tbody> <tr> <td> 57</td> <td>440.0</td> <td>A</td> <td>4</td> </tr> <tr> <td> 69</td> <td>880.0</td> <td>A</td> <td>5</td> </tr> <tr> <td> 81</td> <td>1760.0</td> <td>A</td> <td>6</td> </tr> <tr> <td> 93</td> <td>3520.0</td> <td>A</td> <td>7</td> </tr> </tbody> </table> <p>ノート番号(i)に対し、周波数(f)は以下の式で算出できます。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=f%20%3D%20440%20%2A%202%20%5E%20%7B%28i%20-%2057%29%20%2F%2012%7D" alt="f = 440 * 2 ^ {(i - 57) / 12}"/></p> <p>が、こんな計算をCPUにさせるのは荷が重いので、予め計算したものをテーブルにもたせておきます。(-> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>中のtoneMap)</p> <p>詳しくは<a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>-Standardを参照してください。</p> <p>今回のデモではノートオンとノートオフ、ピッチベンド、サステインペダルだけハンドルしています。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%BB%A5%B5%A5%A4%A5%B6%A1%BC">シンセサイザー</a>の論理構造</h2> <ul> <li>波形メモリ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a>ジェネレータ</li> <li>波形合成</li> <li>複数ソースのマルチプレクサ</li> </ul> <p>それぞれ出力が「-1.0〜+1.0」になるように処理します。</p> <ul> <li>ドの音の波形合成 × <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a></li> <li>レの音の波形合成 × <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a></li> <li>ミの音の波形合成 × <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a></li> <li>ファの音の波形合成 × <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a></li> <li>ソの音の波形合成 × <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a></li> <li>ラの音の波形合成 × <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a></li> <li>シの音の波形合成 × <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a></li> <li>・・・</li> </ul> <p>上記の結果を加算するマルチプレクサを通した結果もまた 「-1.0〜+1.0」で得られるのでこれをオーディオ出力機構に合わせて出力します。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a>ジェネレータ</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>キーボードのノートオン、ノートオフの情報を受け取り、 音のエネルギー遷移を生成します。最終的には各音階の音量ゲインを出力します。</p> <p>以下の疑似パラメータで作ります。</p> <ul> <li>アタックレート</li> <li>ディケイレート</li> <li>サステインレベル</li> <li>サステインレート</li> <li>リリースレート</li> </ul> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20191101/20191101101304.png" alt="f:id:irieda:20191101101304p:plain" title="f:id:irieda:20191101101304p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>アタックレートが大きいものは打楽器的になり、サステインレートが小さいものは管楽器っぽくなります。ピアノなどは鍵を離す(リリースする)とフェルトが弦に当てられ発音レベルは急峻に減衰します。サステインペダルを踏むとこのフェルトが当てられなくなり鍵を離しても長く発音が続きます。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synType">float</span> envelope(<span class="synType">struct</span> Note *n) { <span class="synStatement">if</span> (n-&gt;gain == <span class="synConstant">0.0</span> &amp;&amp; n-&gt;vel == <span class="synConstant">0</span>) { n-&gt;top = <span class="synConstant">false</span>; n-&gt;phase = <span class="synConstant">0</span>; <span class="synStatement">return</span> <span class="synConstant">0.0</span>; } <span class="synType">float</span> topLevel = <span class="synType">float</span>(n-&gt;vel) / <span class="synConstant">127.0</span>; <span class="synStatement">if</span> (n-&gt;on) { <span class="synStatement">if</span> (!n-&gt;top) { n-&gt;gain += params.attack; <span class="synStatement">if</span> (n-&gt;gain &gt; topLevel) { n-&gt;top = <span class="synConstant">true</span>; n-&gt;gain = topLevel; } } <span class="synStatement">else</span> { <span class="synStatement">if</span> (n-&gt;gain &gt; params.sustainLevel * topLevel) { n-&gt;gain -= params.decay; } <span class="synStatement">else</span> { n-&gt;gain -= params.sustain; } <span class="synStatement">if</span> (n-&gt;gain &lt; <span class="synConstant">0.0</span>) { n-&gt;gain = <span class="synConstant">0.0</span>; n-&gt;vel = <span class="synConstant">0.0</span>; n-&gt;phase = <span class="synConstant">0</span>; } } } <span class="synStatement">else</span> { n-&gt;top = <span class="synConstant">false</span>; <span class="synStatement">if</span> (n-&gt;gain &gt; params.sustainLevel * topLevel) { n-&gt;gain -= params.decay; } <span class="synStatement">else</span> { <span class="synType">float</span> release = params.release / (<span class="synConstant">1.0</span> + <span class="synType">float</span>(control[<span class="synConstant">64</span>]) * params.sustainRate / <span class="synConstant">127.0</span>); n-&gt;gain -= release; } <span class="synStatement">if</span> (n-&gt;gain &lt; <span class="synConstant">0.0</span>) { n-&gt;gain = <span class="synConstant">0.0</span>; n-&gt;vel = <span class="synConstant">0.0</span>; n-&gt;phase = <span class="synConstant">0</span>; } } <span class="synStatement">return</span> n-&gt;gain; } </pre> <p>「control[64]」はサステインペダルの踏み込み強度で0〜127の範囲の整数です。 また、音量ゲインがゼロになったときに位相をリセットしています。 (次回の音の鳴り始めのため)</p> <h3>波形メモリと波形合成</h3> <p>任意の数(今回は128点としました)の波形データを用意して波形合成で利用して指定の周波数で合成出力します。</p> <p>以下の記述で位相(n->phase)と波形データ(form)から指定の周波数(f)の波形を合成します。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synType">float</span> operate(<span class="synType">struct</span> Note *n, <span class="synType">float</span> f) { <span class="synStatement">if</span> (n-&gt;gain == <span class="synConstant">0.0</span> &amp;&amp; n-&gt;vel == <span class="synConstant">0</span>) { <span class="synStatement">return</span> <span class="synConstant">0.0</span>; } <span class="synType">int</span> i = <span class="synType">int</span>(<span class="synType">float</span>(formLen) * n-&gt;phase); <span class="synType">float</span> p = n-&gt;phase * <span class="synType">float</span>(params-&gt;formLen) - <span class="synType">float</span>(i); <span class="synType">float</span> v = n-&gt;gain * ( form[i % formLen] * (<span class="synConstant">1</span> - p) + form[(i + <span class="synConstant">1</span>) % formLen] * (p) ); n-&gt;phase += f / SampleRate; n-&gt;phase = n-&gt;phase - <span class="synType">float</span>(<span class="synType">int</span>(n-&gt;phase)); <span class="synStatement">if</span> (v &gt; <span class="synConstant">1.0</span>) { <span class="synStatement">return</span> <span class="synConstant">1.0</span>; } <span class="synStatement">if</span> (v &lt; -<span class="synConstant">1.0</span>) { <span class="synStatement">return</span> -<span class="synConstant">1.0</span>; } <span class="synStatement">return</span> v; } </pre> <ul> <li>「n->phase」に応じて波形データの該当データと該当データの次のデータを取り出して線形補間します。</li> <li>その結果に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a>ジェネレータの出力である「n->gain」をかけ合わせたものを出力します。</li> <li>n->phaseは0.0〜1.0のスケールで、1サンプルデータごとに「f/SampleRate」分だけ進めます。</li> <li>n->phaseは0.0〜1.0のスケールに収まるよう実数部は常にゼロにします。</li> <li>大きすぎる出力は頭打ちにしておきます(後段の安全のため)。</li> </ul> <p>線形補間は以下のような方法です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190820/20190820190442.jpg" alt="f:id:irieda:20190820190442j:plain" title="f:id:irieda:20190820190442j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>波形メモリを連続展開したものと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a>をかけ合わせた結果は以下のようなイメージです。(実際は周波数がもっと細かい)</p> <p>波形メモリ内容</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20191031/20191031175555.png" alt="f:id:irieda:20191031175555p:plain" title="f:id:irieda:20191031175555p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>連続展開</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20191031/20191031175558.png" alt="f:id:irieda:20191031175558p:plain" title="f:id:irieda:20191031175558p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a>と掛け算</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20191031/20191031175601.png" alt="f:id:irieda:20191031175601p:plain" title="f:id:irieda:20191031175601p:plain" class="hatena-fotolife" itemprop="image"></span></p> <h3>マルチプレクサ</h3> <p>各音階ごとに算出した出力をすべて足し合わせてマスターゲインをかけたものを最終出力とします。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synType">float</span> total = <span class="synConstant">0.0</span>; <span class="synStatement">for</span> (<span class="synType">int</span> i = BeginNote; i &lt; EndNote; i++) { envelope(&amp;notes[i]); <span class="synType">float</span> n = toneMap[i]; <span class="synType">float</span> m = toneMap[i + <span class="synConstant">2</span>]; <span class="synType">float</span> p = pitch; <span class="synStatement">if</span> (pitch &lt; <span class="synConstant">0</span>) { p = -<span class="synConstant">1</span> * pitch; <span class="synType">int</span> i2 = i - <span class="synConstant">2</span>; <span class="synStatement">if</span> (i2 &lt; <span class="synConstant">0</span>) { i2 = <span class="synConstant">0</span>; } m = toneMap[i2]; } <span class="synType">float</span> f = n * (<span class="synConstant">1</span> - p) + m * (p); total += operate(&amp;notes[i], f); } <span class="synStatement">if</span> (total &gt; <span class="synConstant">1.0</span>) { total = <span class="synConstant">1.0</span>; } <span class="synStatement">if</span> (total &lt; -<span class="synConstant">1.0</span>) { total = -<span class="synConstant">1.0</span>; } total *= MasterGain; </pre> <p>途中にpitchに応じて音階をシフトしているのはピッチベンドの処理です。</p> <h2>オーディオ出力</h2> <p>MusicIFには<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%B0%B2%BD%C0%AE">旭化成</a>のオーディオコーデックAK4954Aが搭載されています。</p> <p>ここに前述の最終出力(total)を加工して投げ込むことで実際の音声を出力することが出来ます。</p> <h3>AK4954Aのセットアップ</h3> <p>AK4954AはI2Cによる設定<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%BF">レジスタ</a>アクセスとI2Sによる音声データ入出力機能があります。 今回のデモでは音声データの出力を行ったのでそのやり方について解説します。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;Wire.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&quot;driver/i2s.h&quot;</span> <span class="synType">const</span> <span class="synType">uint16_t</span> I2CSlaveAddr = <span class="synConstant">0x12</span>; <span class="synType">uint8_t</span> i2cWrite(<span class="synType">uint8_t</span> addr, <span class="synType">uint8_t</span> data) { Wire.beginTransmission(I2CSlaveAddr); Wire.write(addr); Wire.write(data); <span class="synStatement">return</span> Wire.endTransmission(); } <span class="synType">void</span> setup() { Wire.begin(); <span class="synComment">// リセット解除</span> i2cWrite(<span class="synConstant">0x00</span>, <span class="synConstant">0x00</span>); delay(<span class="synConstant">10</span>); <span class="synComment">// クロックセットアップ</span> i2cWrite(<span class="synConstant">0x01</span>, <span class="synConstant">0x08</span>); i2cWrite(<span class="synConstant">0x05</span>, <span class="synConstant">0x21</span>); i2cWrite(<span class="synConstant">0x06</span>, <span class="synConstant">0x09</span>); delay(<span class="synConstant">10</span>); i2cWrite(<span class="synConstant">0x01</span>, <span class="synConstant">0x0c</span>); delay(<span class="synConstant">10</span>); <span class="synComment">// コーデック設定</span> i2cWrite(<span class="synConstant">0x00</span>, <span class="synConstant">0x64</span>); i2cWrite(<span class="synConstant">0x01</span>, <span class="synConstant">0x30</span>); i2cWrite(<span class="synConstant">0x04</span>, <span class="synConstant">0x34</span>); i2cWrite(<span class="synConstant">0x12</span>, <span class="synConstant">0x00</span>); i2cWrite(<span class="synConstant">0x13</span>, <span class="synConstant">0x0c</span>); i2cWrite(<span class="synConstant">0x14</span>, <span class="synConstant">0x0c</span>); i2cWrite(<span class="synConstant">0x1d</span>, <span class="synConstant">0x03</span>); <span class="synComment">// BEEP音設定</span> i2cWrite(<span class="synConstant">0x16</span>, <span class="synConstant">0x05</span>); i2cWrite(<span class="synConstant">0x17</span>, <span class="synConstant">0x05</span>); i2cWrite(<span class="synConstant">0x18</span>, <span class="synConstant">0x01</span>); <span class="synComment">// 2 times</span> i2cWrite(<span class="synConstant">0x19</span>, <span class="synConstant">0x88</span>); <span class="synComment">// i2sセットアップ</span> i2s_config_t i2s_config_dac = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), .sample_rate = SampleRate, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_LSB), .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, <span class="synComment">// lowest interrupt priority</span> .dma_buf_count = DMABufCount, .dma_buf_len = DMABufLength, .use_apll = <span class="synConstant">true</span>, <span class="synComment">// Use audio PLL</span> .tx_desc_auto_clear = <span class="synConstant">false</span>, .fixed_mclk = SampleRate * <span class="synConstant">16</span> * <span class="synConstant">16</span>, }; i2s_driver_install((i2s_port_t)I2S_NUM_0, &amp;i2s_config_dac, <span class="synConstant">0</span>, <span class="synConstant">NULL</span>); i2s_pin_config_t pins = {.bck_io_num = GPIO_NUM_12, .ws_io_num = GPIO_NUM_13, .data_out_num = GPIO_NUM_15, .data_in_num = I2S_PIN_NO_CHANGE}; i2s_set_pin((i2s_port_t)I2S_NUM_0, &amp;pins); i2s_zero_dma_buffer((i2s_port_t)I2S_NUM_0); <span class="synComment">// マスタークロック出力を有効にする</span> PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1); WRITE_PERI_REG(PIN_CTRL, READ_PERI_REG(PIN_CTRL) &amp; <span class="synConstant">0xFFFFFFF0</span>); } </pre> <p>MusicIFではAK4954Aはスレーブモードでマスタークロックが必要なデザインで実装されていますので、ESP32側でマスタークロックの出力が必須です。</p> <h3>オーディオデータの出力</h3> <p>上記セットアップが終わればあとは以下の記述でサンプリングデータを書き込み続ければ音がMusicIFのステレオミニジャックから得られます。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synType">size_t</span> wrote; <span class="synType">int16_t</span> data[<span class="synConstant">2</span>] = {<span class="synType">int16_t</span>(<span class="synConstant">32767</span> * total), <span class="synType">int16_t</span>(<span class="synConstant">32767</span> * total)}; i2s_write((i2s_port_t)I2S_NUM_0, data, <span class="synConstant">4</span>, &amp;wrote, <span class="synConstant">100</span>); </pre> <p>dataの構造はLSBファーストの符号付き16bit整数を右、左の順番としたデータです。 (I2CもI2Sもセットアップ時にそうなるようにした)</p> <h2>画面表示</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a>ジェネレータの出力をバーグラフで出力。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synStatement">for</span> (<span class="synType">int</span> i = BeginNote; i &lt; EndNote; i++) { <span class="synType">int</span> h = <span class="synType">int</span>(notes[i].gain * <span class="synConstant">128</span>); M5.Lcd.fillRect(i * <span class="synConstant">2</span>, <span class="synConstant">10</span>, <span class="synConstant">2</span>, <span class="synConstant">128</span> - h, TFT_BLACK); M5.Lcd.fillRect(i * <span class="synConstant">2</span>, <span class="synConstant">138</span> - h, <span class="synConstant">2</span>, h, TFT_WHITE); } </pre> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190820/20190820190419.jpg" alt="f:id:irieda:20190820190419j:plain" title="f:id:irieda:20190820190419j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>各鍵の立ち上がりや減衰具合が見れて良い感じ。</p> <h2>実際の実装で必要になった調整</h2> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>メッセージハンドリング、表示、ボタン操作ハンドリングはメインコアで処理、音声出力処理はサブコアで処理するように<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%EB%A5%C1%A5%BF%A5%B9%A5%AF">マルチタスク</a>機能で分散した。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%EB%A5%C1%A5%BF%A5%B9%A5%AF">マルチタスク</a>化にあわせて共有メモリを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%E5%A1%BC%A5%C6%A5%C3%A5%AF%A5%B9">ミューテックス</a>で排他処理を入れた。</li> <li>処理集中によりDMAバッファのアンダーフローはどうしても起こりうるのでその際にバッファのクリア処理をする設定にした。</li> <li>i2s_driverのESP-IDF実装単体ではマスタークロック(MCLK)出力は得られなかった。ESP32の仕様書をめっちゃ読み込まないと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%BF">レジスタ</a>の設定に自力ではたどり着けない。CLK_OUT1が関係しているあたりでググってやっと関連情報にたどり着いた感じ。</li> <li>DMAのアンダーフローを繰り返すと音声出力処理でCPUコアを専有しきってしまう。この状態だとウォッチドッグタイマがリセットをかけてくる。基本はDMAバッファを埋めきって空き待ちが発生する状態を維持しなければならない。</li> <li>同時発音数を8つに制限すればサンプリング周波数22KHzで駆動できるようになった。</li> </ul> <h2>まとめ</h2> <ul> <li>オーディオ処理の鉄則は<strong>出力波形に不連続な波形を出さない</strong>こと</li> <li>波形メモリと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%D9%A5%ED%A1%BC%A5%D7">エンベロープ</a>、位相による操作これらが連携することで間違って角のある波形を出力することがない</li> <li>結構いい音だせたし、波形データをいじるだけでもかなり特殊な音色が出せる。</li> <li>M5StackのESP32はfloat型のままでもそこそこ処理早いですね。</li> <li>それでも音合成しながらだとサンプリング周波数<del>16K程度が限界だった</del>。<strong>&lt;-同時発音数の制限を加えると22KHzまでいけた!</strong></li> <li>ボリュームコン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>も実装した。</li> <li>自分の声から周期性波形を切り出して入れてみたりしたら猫っぽくなった。</li> <li>波形合成にビブラート、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A5%E2%A5%ED">トレモロ</a>、リ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%D6">バーブ</a>などを加えればもっと複雑な表現の音が出せる。</li> </ul> <p><strong>この拡張「M5Stack用MusicIF拡張ボード」はスイッチサイエンスにて今冬発売に向けて鋭意設計中です。</strong></p> irieda サンノゼのジャンク屋さんに行ってきました hatenablog://entry/26006613457620822 2019-10-30T16:04:03+09:00 2019-10-30T16:04:03+09:00 Arm TechConのためにサンノゼに行ったわけですが、それだけというのもなんなので近くにあった大きなジャンク屋さんに行ってきました。 デイリーポータルZにサンタクララのHSC Electronic Supplyというジャンク屋さんの記事がありまして dailyportalz.jp 5月のMaker Faire Bay Areaの時に行きたいと思って調べたのですが、Excess Solutionsという別のジャンク屋さんに身売りしてしまっているという事がわかりました。そしてそのExcess SolutionsはサンノゼだったのでMaker Faireの時は行くのを諦めたのですが、今回サンノゼ… <p>Arm TechConのために<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%CE%A5%BC">サンノゼ</a>に行ったわけですが、それだけというのもなんなので近くにあった大きなジャンク屋さんに行ってきました。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A4%A5%EA%A1%BC%A5%DD%A1%BC%A5%BF%A5%EBZ">デイリーポータルZ</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%BF%A5%AF%A5%E9%A5%E9">サンタクララ</a>のHSC Electronic Supplyというジャンク屋さんの記事がありまして <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdailyportalz.jp%2Fkiji%2F180529202997" title="若きジョブズも来たという、アメリカのでかいジャンク屋に行く" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://dailyportalz.jp/kiji/180529202997">dailyportalz.jp</a></cite> 5月の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a> Bay Areaの時に行きたいと思って調べたのですが、<a href="http://www.excesssolutions.com/">Excess Solutions</a>という別のジャンク屋さんに身売りしてしまっているという事がわかりました。そしてそのExcess Solutionsは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%CE%A5%BC">サンノゼ</a>だったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a>の時は行くのを諦めたのですが、今回<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%CE%A5%BC">サンノゼ</a>に来たので行ってみました。</p> <p>位置関係はこんな感じで、直線距離でざっくり1.5kmくらいでしょうか。 <figure class="figure-image figure-image-fotolife" title="© OpenStreetMap contributors"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191029/20191029183331.png" alt="f:id:ohki_s:20191029183331p:plain" title="f:id:ohki_s:20191029183331p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>© <a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenStreetMap">OpenStreetMap</a> contributors</figcaption></figure> マップアプリによると歩いて40分くらいということだったので、TechConのセッションがなかった午後にてくてく歩いていきました。</p> <p>途中でくじけてLimeという電動キックボードに乗ろうかと思ったのですが、決済方法の登録でうまくいかずあきらめて歩きました。直前にスーパーマーケットの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A9%A5%EB%A5%DE%A1%BC%A5%C8">ウォルマート</a>があって一休みできたのでよかったですが、なかったらきつかったです。</p> <p>Excess Solutionsに着いて中に入ると、完全に倉庫でした。HSC Electronic Supplyもそうだったようですが、ここも倉庫です。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030150830.jpg" alt="f:id:ohki_s:20191030150830j:plain" title="f:id:ohki_s:20191030150830j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030150841.jpg" alt="f:id:ohki_s:20191030150841j:plain" title="f:id:ohki_s:20191030150841j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>電子部品はうなるほどあったのですが、それ以外にPCやプロッタプリンタやオフィス家具なども相当な量ありました。電子部品部分がHSC Electronic Supplyで、大物がExcess Solutionsの元々の在庫なのかもしれません。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151232.jpg" alt="f:id:ohki_s:20191030151232j:plain" title="f:id:ohki_s:20191030151232j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151422.jpg" alt="f:id:ohki_s:20191030151422j:plain" title="f:id:ohki_s:20191030151422j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030152451.jpg" alt="f:id:ohki_s:20191030152451j:plain" title="f:id:ohki_s:20191030152451j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>電子部品の在庫はこんなでした。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151256.jpg" alt="f:id:ohki_s:20191030151256j:plain" title="f:id:ohki_s:20191030151256j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030152204.jpg" alt="f:id:ohki_s:20191030152204j:plain" title="f:id:ohki_s:20191030152204j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030152555.jpg" alt="f:id:ohki_s:20191030152555j:plain" title="f:id:ohki_s:20191030152555j:plain" class="hatena-fotolife" itemprop="image"></span> 74Sとか74SC(Standard <a class="keyword" href="http://d.hatena.ne.jp/keyword/CMOS">CMOS</a>?)とかPALとか懐かしいですね。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151509.jpg" alt="f:id:ohki_s:20191030151509j:plain" title="f:id:ohki_s:20191030151509j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151519.jpg" alt="f:id:ohki_s:20191030151519j:plain" title="f:id:ohki_s:20191030151519j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151530.jpg" alt="f:id:ohki_s:20191030151530j:plain" title="f:id:ohki_s:20191030151530j:plain" class="hatena-fotolife" itemprop="image"></span> 棚はこんな感じでジャンルごとに分かれていました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151836.jpg" alt="f:id:ohki_s:20191030151836j:plain" title="f:id:ohki_s:20191030151836j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191030/20191030151826.jpg" alt="f:id:ohki_s:20191030151826j:plain" title="f:id:ohki_s:20191030151826j:plain" class="hatena-fotolife" itemprop="image"></span> 寄って見るとLEDの棚はこんな感じです。</p> <p>帰りは薄暗くなってきたこともあって、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A9%A5%EB%A5%DE%A1%BC%A5%C8">ウォルマート</a>で買い物して<a class="keyword" href="http://d.hatena.ne.jp/keyword/Uber">Uber</a>で帰りました。</p> <p>どうしてもほしいけどもう手に入らない部品があったり、みんなでわいわい行くのならいいと思います。前述の通り近くに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A9%A5%EB%A5%DE%A1%BC%A5%C8">ウォルマート</a>や(普通の)<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B4%EF%B2%B0">電器屋</a>さんや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%BF%A1%BC%A5%D0%A5%C3%A5%AF%A5%B9">スターバックス</a>があるので、買い出しついでに行くのでもいいかも。</p> ohki_s Arm TechCon 2019感想など hatenablog://entry/26006613448731077 2019-10-28T15:52:27+09:00 2019-10-28T15:52:27+09:00 Arm TechCon 2019が終わったので、感じたことなどを書きます。 IoT機器のセキュリティはもはや当然 昨年の記事でも書きましたが、IoT機器のセキュリティはすでに必須のものになっているようでした。それだけ実運用されているということなんでしょう。「Root of Trust(RoT)」という言葉が頻繁に出てきました。マイコンをセキュアにブートするためのしくみのようです。重要なキーワードのようなので覚えておくといいかも。 もちろん個人で開発するものまでセキュリティを強要されるわけではありませんが(実際セキュリティ用の回路が入っていないマイコンは引き続き作られますし)、プロセスがシュリン… <p>Arm TechCon 2019が終わったので、感じたことなどを書きます。</p> <h3>IoT機器のセキュリティはもはや当然</h3> <p><a href="https://tech.144lab.com/entry/2018/10/18/Arm_TechCon_2018">昨年の記事</a>でも書きましたが、IoT機器のセキュリティはすでに必須のものになっているようでした。それだけ実運用されているということなんでしょう。「Root of Trust(RoT)」という言葉が頻繁に出てきました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>をセキュアにブートするためのしくみのようです。重要なキーワードのようなので覚えておくといいかも。 もちろん個人で開発するものまでセキュリティを強要されるわけではありませんが(実際セキュリティ用の回路が入っていない<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>は引き続き作られますし)、プロセスが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%E5%A5%EA%A5%F3%A5%AF">シュリンク</a>して余った面積にもろもろのセキュリティ回路が入るのは順当かなと思います。</p> <h3>AIというか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B3%D8%BD%AC">機械学習</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%E5%A1%BC%A5%E9%A5%EB%A5%CD%A5%C3%A5%C8%A5%EF%A1%BC%A5%AF">ニューラルネットワーク</a>などが基本機能に</h3> <p>これも昨年の記事に書いたのですが、今回は「NPU」「CMSIS-NN」などの単語をよく見かけました(ただし昨年はCortex-Aのセッションには出席していないので、すでに出ていたのかもしれません)。NPUはハイエンド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>のプロセッサには珍しくなくなった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%E5%A1%BC%A5%E9%A5%EB%A5%CD%A5%C3%A5%C8%A5%EF%A1%BC%A5%AF">ニューラルネットワーク</a>計算用のプロセッサのことで、<a href="https://www.keil.com/pack/doc/CMSIS/NN/html/index.html">CMSIS-NN</a>は開発環境メーカーのKeilが提供している<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%E5%A1%BC%A5%E9%A5%EB%A5%CD%A5%C3%A5%C8%A5%EF%A1%BC%A5%AF">ニューラルネットワーク</a>用のライブラリのことです。反対に去年はところどころで見た「uTensor」は聞かなくなりました。Tensoflow Liteが出ちゃいましたし。 今はまだCortex-MシリーズにはNPUは入っていませんが、エンドポイントAIの流行やプロセスの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%E5%A5%EA%A5%F3%A5%AF">シュリンク</a>のことを考えると近いうちに入る事もあるのかもしれないですね。</p> <p>あと余談ですが、こんなに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%E2%C6%B0%BE%AE%BF%F4">浮動小数</a>点型が大きく取り上げられているのを初めて見ました(右側の人の大きさと比較してみてください)。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191027/20191027185749.jpg" alt="f:id:ohki_s:20191027185749j:plain" title="f:id:ohki_s:20191027185749j:plain" class="hatena-fotolife" itemprop="image"></span></p> <h3>Cortex-Mのカスタム命令の話</h3> <p>追加で少し詳しいセッションを聞けたので書いておきます。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5">コプロセッサ</a>を内蔵することと比較して、</p> <ul> <li>プロセッサと密につながって、標準<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%BF">レジスタ</a>にもさわれる</li> <li>低レイテンシ向けの処理に最適</li> <li>Armの標準命令とのインターリーブ可能</li> <li>ソフトウェアの断裂(fragmentation)はない</li> </ul> <p>だそうです。まぁどうなろうともあんまりチップ買って使うユーザには関係なさそうですけど、特色あるカスタム命令が入った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>が市販されるようになると面白いかもしれないです。出てくるのは2021年になりそうですし楽しみにしていましょう。</p> <h3>以下おもしろネタ</h3> <ul> <li><p>自動運転のレベルの話で出たスライドですが、やっぱり今でも自動運転の代表と言うと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%E1%A5%EA">アメリ</a>カでも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CA%A5%A4%A5%C8%A5%E9%A5%A4%A5%C0%A1%BC">ナイトライダー</a>なんだー、と思いました。1982年開始のテレビドラマですよ <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191027/20191027195757.jpg" alt="f:id:ohki_s:20191027195757j:plain" title="f:id:ohki_s:20191027195757j:plain" class="hatena-fotolife" itemprop="image"></span></p></li> <li><p>これはわかりました(ネタとして) <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191027/20191027195805.jpg" alt="f:id:ohki_s:20191027195805j:plain" title="f:id:ohki_s:20191027195805j:plain" class="hatena-fotolife" itemprop="image"></span></p></li> <li><p>Mapboxの人のスライドですが、日本好きそう <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191027/20191027195751.jpg" alt="f:id:ohki_s:20191027195751j:plain" title="f:id:ohki_s:20191027195751j:plain" class="hatena-fotolife" itemprop="image"></span></p></li> <li><p>展示会場より、Mouserの孫の手とデバッガメーカーのハエたたき(去年もいました) <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191027/20191027195748.jpg" alt="f:id:ohki_s:20191027195748j:plain" title="f:id:ohki_s:20191027195748j:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191027/20191027195800.jpg" alt="f:id:ohki_s:20191027195800j:plain" title="f:id:ohki_s:20191027195800j:plain" class="hatena-fotolife" itemprop="image"></span></p></li> <li><p>書き込みケーブルで有名なTag Connectのブースで新製品の<a href="http://www.tag-connect.com/catalog/14">Edge-Connect</a>のサンプルを見せてもらいました。今回は基板の端を使うのでさらに面積を食わなくなっているそうです。すでに購入可能とのこと。</p></li> </ul> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fwww.tag-connect.com%2F" title="- Tag Connect" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://www.tag-connect.com/">www.tag-connect.com</a></cite> 写真の基板の左側にあるのが2.54mmピッチのスルーホールです。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191027/20191027195754.jpg" alt="f:id:ohki_s:20191027195754j:plain" title="f:id:ohki_s:20191027195754j:plain" class="hatena-fotolife" itemprop="image"></span></p> ohki_s Arm TechCon 2019に来ています hatenablog://entry/26006613446617648 2019-10-09T05:06:16+09:00 2019-10-09T05:06:16+09:00 144Labの大木です。去年も来ていたArm TechConに今年も来ています。 tech.144lab.com 今年は2019/10/8から10/10までの開催で、場所は去年と同じサンノゼのSan Jose McEnery Convention Centerです。去年と同じなのでホテルを取るのが楽でよかったです。 それはそうと基調講演を聴き終わってランチを食べたところなので、ざっくりですがまとめておきます。把握できていない部分も相当あると思うので、間違っていたり聞き飛ばしていたらご勘弁を。 今年は「The New Era of Compute」というタイトルの基調講演でした。去年はNeove… <p>144Labの大木です。去年も来ていたArm TechConに今年も来ています。 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftech.144lab.com%2Fentry%2F2018%2F10%2F18%2FArm_TechCon_2018" title="Arm TechCon 2018に来ています - 144Labグループ開発者ブログ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://tech.144lab.com/entry/2018/10/18/Arm_TechCon_2018">tech.144lab.com</a></cite></p> <p>今年は2019/10/8から10/10までの開催で、場所は去年と同じ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%CE%A5%BC">サンノゼ</a>のSan Jose McEnery Convention Centerです。去年と同じなのでホテルを取るのが楽でよかったです。</p> <p>それはそうと基調講演を聴き終わってランチを食べたところなので、ざっくりですがまとめておきます。把握できていない部分も相当あると思うので、間違っていたり聞き飛ばしていたらご勘弁を。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045127.jpg" alt="f:id:ohki_s:20191009045127j:plain" title="f:id:ohki_s:20191009045127j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>今年は「The New Era of Compute」というタイトルの基調講演でした。去年はNeoverseというサーバ向けのプロセッサ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>が発表されましたが、今年はもっと地道な感じの内容でした。</p> <p>詳細を書くと筆者のボロが出るのでやめときますが、大まかに言って</p> <ul> <li>エンドポイントAIの話<br/> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボード上で推論する、いわゆるエッジAIの話です。ArmでエッジAIというとエッジサーバでのAIになるのでエンドポイントAIという表現になってます <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045439.jpg" alt="f:id:ohki_s:20191009045439j:plain" title="f:id:ohki_s:20191009045439j:plain" class="hatena-fotolife" itemprop="image"></span></li> <li>プロセッサ開発者がライブラリにアクセスできるようになったり、プロセッサのライセンスについての話<br/> プロセッサ開発者向けなのでチップを買ってきて使っているユーザーにはほとんど関係ない話ではありますが、IPコアを参照できるよという話でした(たぶん)</li> </ul> <div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045508.jpg" alt="f:id:ohki_s:20191009045508j:plain" title="f:id:ohki_s:20191009045508j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045522.jpg" alt="f:id:ohki_s:20191009045522j:plain" title="f:id:ohki_s:20191009045522j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045534.jpg" alt="f:id:ohki_s:20191009045534j:plain" title="f:id:ohki_s:20191009045534j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045547.jpg" alt="f:id:ohki_s:20191009045547j:plain" title="f:id:ohki_s:20191009045547j:plain" class="hatena-fotolife" itemprop="image"></span></div> <ul> <li>カスタム命令を追加できるようになる話<br/> Cortex-M33(2020年発売予定)から、プロセッサ開発者がカスタム命令を追加できるようになるそうです。</li> </ul> <div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045721.jpg" alt="f:id:ohki_s:20191009045721j:plain" title="f:id:ohki_s:20191009045721j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045738.jpg" alt="f:id:ohki_s:20191009045738j:plain" title="f:id:ohki_s:20191009045738j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045815.jpg" alt="f:id:ohki_s:20191009045815j:plain" title="f:id:ohki_s:20191009045815j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009045827.jpg" alt="f:id:ohki_s:20191009045827j:plain" title="f:id:ohki_s:20191009045827j:plain" class="hatena-fotolife" itemprop="image"></span></div> <p>がありました。ライセンスやカスタム命令の話が基調講演で出てくるというのは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>-Vの盛り上がりの影響があるのかなー、と思いながら聞いていました。</p> <p>続く基調講演ではオートモーティブとコンピュータの話とか、UnityとArmが組む話とか、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Facebook">Facebook</a>が研究中のARメガネの話とかあって面白かったです。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009050216.jpg" alt="f:id:ohki_s:20191009050216j:plain" title="f:id:ohki_s:20191009050216j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20191009/20191009050443.jpg" alt="f:id:ohki_s:20191009050443j:plain" title="f:id:ohki_s:20191009050443j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>展示会場は明日から開くそうなので、そしたらまたなんか書きます。</p> ohki_s CircuitPythonの紹介 hatenablog://entry/26006613443266202 2019-10-01T17:17:29+09:00 2019-10-01T17:20:02+09:00 144Labの入江田です。 https://tech.144lab.com/entry/papyr にも書きましたが、 最近、CircuitPythonをいろんなデバイスで試しています。 CircuitPythonリポジトリ なぜCircuitPythonは作られたの? 組み込み向けPythonとしてpython-on-a-chipを始めとしてMicroPythonという歴史ある実装があるにもかかわらずMicroPythonをフォークしてCircuitPythonは生まれました。 CircuitPythonはボードベンダであるAdafruitが作りました。 Adafruitは自社製品向けに調整… <p>144Labの入江田です。</p> <p><a href="https://tech.144lab.com/entry/papyr">https://tech.144lab.com/entry/papyr</a> にも書きましたが、 最近、CircuitPythonをいろんなデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>で試しています。</p> <p><a href="https://github.com/adafruit/circuitpython">CircuitPythonリポジトリ</a></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20191001/20191001171911.png" alt="f:id:irieda:20191001171911p:plain" title="f:id:irieda:20191001171911p:plain" class="hatena-fotolife" itemprop="image"></span></p> <h2>なぜCircuitPythonは作られたの?</h2> <p>組み込み向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>として<code>python-on-a-chip</code>を始めとして<code>MicroPython</code>という歴史ある実装があるにもかかわらず<code>MicroPython</code>をフォークして<code>CircuitPython</code>は生まれました。</p> <p>CircuitPythonはボードベンダであるAdafruitが作りました。 Adafruitは自社製品向けに調整済みのCircuitPythonをリリースすることで より教育に優しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>による開発環境を提供していく考えのようです。</p> <ul> <li>これまでの類似製品よりもより組み込み初心者をターゲットにしています</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%AD%A5%E5%A5%E1%A5%F3%A5%C6%A1%BC%A5%B7%A5%E7%A5%F3">ドキュメンテーション</a>の一元化で初心者への教育に優しい</li> <li>ボードサポートやドライバーの関係を単<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%E3%B2%BD">純化</a>しサポートボードの追加を効率化しました</li> <li>USBマスストレージ疑似<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>経由で開発できるものを中心にサポートボードを強化していきます</li> <li>ATSAMDシリーズおよびUSBサポート付き<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>への対応を強化、AdafruitのExpressシリーズなどがそれに該当します</li> <li>シリアル経由でコードを書き込む(ampyサポート)しかないものは順次廃止(v4にてESP8266サポートは廃止されました)</li> </ul> <p>要するに<strong>つまづきにくい<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>開発環境を提供することにフォーカスしたMicroPythonの派生バージョン</strong>ということなのです。</p> <h2>CircuitPythonはなにが嬉しいの?</h2> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>以前の組み込み開発ってどうしても面倒なところがなくせなかった <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ごとに電話帳のようなスペックシートを片手に開発</li> <li>似て異なる部分が山のようにあるのでパターンのように見えて実際は細かい調整を開発者ごとに手でやっていた</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ターゲット、ボード、デバッガ、開発環境、開発言語処理系が別々のベンダが提供していてバラバラのドキュメントを読み合わせる必要があった</li> <li>必要な場合、専用OS、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%C9%A5%EB%A5%A6%A5%A7%A5%A2">ミドルウェア</a>、ドライバーも別ドキュメント</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>はボードにArduinoCore<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーさえ入っていてシリアルポートドライバーさえあればあとは全部用意してくれたのが画期的だった</li> <li>MycroPythonは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の利点に加えて疑似<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>(以下「疑似FS」)を持ち、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>言語で書けるという利便性を提供します</li> <li>CircuitPythonではさらにシリアルポートドライバーも不要でUSBストレージの形で疑似FSへのアクセス機能を提供します <ul> <li>ドキュメントはボード専用部分からCircuitPythonの使い方までをトータルでAdafruitのドキュメントで統一されてる</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>コードをUSBストレージに見えるフォルダに投げ込むだけ</li> <li>開発環境は好みのエディタで十分</li> <li>もちろん<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B9%E7%B3%AB%C8%AF%B4%C4%B6%AD">統合開発環境</a>を使うのも良い</li> <li>複数ファイルを利用する際の関係性は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>を学べば単純で理解しやすいし、それをほとんどそのまま疑似<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>に置くだけで動いちゃう</li> <li>ボードサポートから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB">チュートリアル</a>まで一つのドキュメントサイトで追うことができます</li> <li>BLEサポートを追加してきたので比較的容易にBLEアプリケーションが書けちゃう</li> <li>また、<a href="https://github.com/adafruit">AdafruitのGitHubリポジトリ</a>には豊富なドライバーやライブラリ、サンプルコードがあるのでとても参考になる</li> </ul> </li> </ul> <p>まとめると開発速度は</p> <pre><code>従来の組み込み開発手法 &lt;&lt;&lt; Arduino &lt;&lt; MicroPython &lt; CircuitPython </code></pre> <p>といったところでしょうか。 カバーされているフィーチャーは</p> <pre><code>従来の組み込み開発手法(100%) &gt; Arduino(90%) &gt;&gt;&gt; MicroPython = CircuitPython </code></pre> <p>で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>系では手続き的に書けるというところに主眼をおいたフィーチャーだけをサポートします。割り込み(DMAなど)や電源制御といったあたりはサポートしません。また、アウトプットの性能(パフォーマンス、省サイズともに)は</p> <pre><code>従来の組み込み開発手法 &gt; Arduino &gt; MicroPython = CircuitPython </code></pre> <p>こんな感じですね。足りない性能はワンランク上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>をチョイスすることである程度カバーできます。</p> <p>従来の組み込み開発手法の最大のメリットは苦労する代わりに「ターゲット<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>選定の自由度に制約がない」というところですね。(もちろん不慣れなターゲットを選べばそれだけ苦労も増えるのですが)</p> <p>入門のしやすさから評価されつつあって、すこしづつですが、サポートボードもAdafruitだけじゃなくなってきています。</p> <p><a href="https://circuitpython.org/downloads">https://circuitpython.org/downloads</a></p> <p>SparkFun, Electronut Labsなどが参入しています。</p> <h2>CircuitPythonのコアモジュール構成</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/https">https</a>://circuitpython.readthedocs.io/en/latest/shared-bindings/index.html</p> <h3>PC向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>と似た役割のモジュール</h3> <ul> <li><code>sys</code></li> <li><code>os</code></li> <li><code>time</code></li> <li><code>math</code></li> <li><code>random</code></li> </ul> <h3>ハード依存のモジュール</h3> <ul> <li><code>microcontroller</code></li> <li><code>board</code></li> </ul> <p>microcontrollerは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>チップ依存定義のモジュール。 boardはmicrocontrollerをベースにしたボード依存定義モジュール。</p> <h3>入出力用モジュール</h3> <ul> <li><code>digitalio</code></li> <li><code>analogio</code></li> <li><code>pulseio</code></li> <li><code>frequencyio</code></li> <li><code>bitbangio</code></li> <li><code>busio</code></li> <li><code>bleio</code></li> <li><code>terminalio</code></li> <li><code>displayio</code></li> <li><code>fontio</code></li> <li><code>etc...</code></li> </ul> <p><code>bitbangio</code>と<code>busio</code>は同じ目的でI2CやSPIバス機能のモジュールですが、前者はCPUパワーでバスエミュレーションし、後者はハードウェアサポートがある場合のみ利用可能です。</p> <h3>その他のモジュール</h3> <p>ここに周辺装置向けライブラリ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6">アーカイブ</a>があります。 <a href="https://circuitpython.org/libraries">https://circuitpython.org/libraries</a></p> <p>これらの必要なライブラリだけをターゲットの /lib/フォルダ配下に入れることで利用可能になります。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>モード</h2> <p>接続方法</p> <pre class="code shell" data-lang="shell" data-unlink>$ screen /dev/tty.usbserial#### 115200</pre> <p>コードが動作中ならCtrl+Cで止めれます。その時Enterキーを押すことで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>モードに入ることができます。</p> <pre class="code shell" data-lang="shell" data-unlink>Auto-reload is on. Simply save files over USB to run them or enter REPL to disable. Press any key to enter the REPL. Use CTRL-D to reload. Adafruit CircuitPython 4.0.1 on 2019-05-22; SparkFun Pro nRF52840 Mini with nRF52840 &gt;&gt;&gt; import sys &gt;&gt;&gt; sys.path [&#39;&#39;, &#39;/&#39;, &#39;.frozen&#39;, &#39;/lib&#39;] &gt;&gt;&gt; </pre> <p>sys.pathを確認してもらえば、<code>CIRCUITPYボリューム(ドライブ)</code>のルートやその直下のlibフォルダがライブラリを探す対象になっていることが確認できます。 ちなみに<code>frozen</code>というのはCircuitPythonの標準ライブラリを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6">アーカイブ</a>したものです。</p> <h2>サンプルを動かす</h2> <p><a href="https://github.com/adafruit/circuitpython">CircuitPython</a>は4.0.1安定版を前提にしています。</p> <p>ble<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%D5%A5%A7%A5%E9%A5%EB">ペリフェラル</a>サンプル</p> <p><code>CIRCUITPY/ble_sample.py</code></p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> bleio <span class="synComment"># Create a Characteristic.</span> characteristic = bleio.Characteristic(bleio.UUID(<span class="synConstant">0x2919</span>), read=<span class="synIdentifier">True</span>, notify=<span class="synIdentifier">True</span>) <span class="synComment"># Create a Service providing that one Characteristic.</span> service = bleio.Service(bleio.UUID(<span class="synConstant">0x180F</span>), [characteristic]) <span class="synComment"># Create a peripheral and start it up.</span> periph = bleio.Peripheral([service]) <span class="synStatement">while</span> <span class="synIdentifier">True</span>: periph.start_advertising() <span class="synStatement">while</span> <span class="synStatement">not</span> periph.connected: <span class="synStatement">pass</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;connected&quot;</span>) <span class="synStatement">while</span> periph.connected: <span class="synStatement">pass</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;disconnected&quot;</span>) periph.stop_advertising() </pre> <h4>動作確認</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>モードで動作確認できます。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">&gt;</span> import ble_sample </pre> <p>この状態で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>からnRF Connectアプリ等でスキャン&接続してみたり切断してみたりすることができると思います。</p> <h2>便利なライブラリ</h2> <p><a href="https://github.com/adafruit/Adafruit_CircuitPython_Bundle">https://github.com/adafruit/Adafruit_CircuitPython_Bundle</a></p> <p><a href="https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases">リリースファイルページ</a> にてライブラリとライブラリを使ったサンプルがあります。</p> <p><code>CIRCUITPY/lib</code>フォルダを作成してその配下に必要なライブラリを入れておくと起動<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>からimport可能になります。</p> <p>BME280デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>をつないで環境センサデータを読み出す例 <code>CIRCUITPY/lib/adafruit_bme280.mpy</code>をおいておき、 以下のようなコードをおいておくと、 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>モードで動作確認できます。</p> <p><code>CIRCUITPY/sample.py</code></p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> time <span class="synPreProc">import</span> board <span class="synPreProc">import</span> busio <span class="synPreProc">import</span> adafruit_bme280 i2c = busio.I2C(board.SCL, board.SDA) bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c) bme280.sea_level_pressure = <span class="synConstant">1013.25</span> bme280.mode = adafruit_bme280.MODE_NORMAL bme280.standby_period = adafruit_bme280.STANDBY_TC_500 bme280.iir_filter = adafruit_bme280.IIR_FILTER_X16 bme280.overscan_pressure = adafruit_bme280.OVERSCAN_X16 bme280.overscan_humidity = adafruit_bme280.OVERSCAN_X1 bme280.overscan_temperature = adafruit_bme280.OVERSCAN_X2 time.sleep(<span class="synConstant">1.0</span>) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Temperature: %0.1f C&quot;</span> % bme280.temperature) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Humidity: %0.1f %%&quot;</span> % bme280.humidity) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Pressure: %0.1f hPa&quot;</span> % bme280.pressure) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Altitude = %0.2f meters&quot;</span> % bme280.altitude) </pre> <h4>動作確認</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">&gt;</span> import sample Temperature: <span class="synConstant">20</span>.<span class="synConstant">0</span> C Humidity: <span class="synConstant">40</span>.<span class="synConstant">0</span> % Pressure: <span class="synConstant">999</span>.<span class="synConstant">0</span> hPa Altitude <span class="synStatement">=</span> <span class="synConstant">50</span>.<span class="synConstant">0</span> meters </pre> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C6%B0%B5%AF%C6%B0">自動起動</a></h2> <p>給電したときに自動的に起動するようにするには 起動対象の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>ファイル名を「code.py」か「main.py」にします。 その状態から動作を止めるのは若干コツがいります。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>モードからCtrl+Cを送る</li> <li>ファイル名を書き換えてリセット</li> </ul> <p>以上でも止まらないような場合は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a>ストレージを初期化する必要があったりします。</p> <h2>Adafruit-Blinka</h2> <p><a href="https://pypi.org/project/Adafruit-Blinka/">https://pypi.org/project/Adafruit-Blinka/</a></p> <p>こちらを使うと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>ベースのマシンでCircuitPythonの互換モジュールを利用できます。 つまり、RaspberryPiやDockerエミュレーションコンテナなどでPoCを作成し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ターゲットのCircuitPython上に移植するという形を取れば、最小の修正で移植可能になる。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>の検証をDocker上で済ましておくという手法が使えます。</p> <h2>ポーティングのコスト</h2> <p>nRF52840派生モジュールやATSAMD21/51を載せたボードは近年たくさんリリースされていますが、これらはチップコア単体の機能でCircuitPythonの要件を満たせているので、殆どの場合既存のリリース済みのCircuitPythonをインストールして動作させることができます。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーの専有する1〜2ボタン、ボードのアセットの差分くらいしか異なる点はなく、ちゃんとした調整もそんなに大きくコストが掛かりません。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>がサポート済みと同じものであるうちはボードサポート程度であれば大きく調整コストがかからないということです。 (また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーさえ適合するのならCircuitPython自体は完全に整合するものでなくとも動作します。ボードサポート部分をアプリケーション毎に書くという方法で。)</p> <h2>Cによる拡張</h2> <ul> <li>Cによる拡張ができれば割り込みやDMA利用や電源制御なども可能です</li> <li>CircuitPython本体ごと追加拡張モジュールと一緒にビルドが必須です</li> <li>そうなってくるとCircuitPythonのお手軽さ自体は無意味になるのでおすすめはしません</li> <li>あくまで用意された機能セットだけでPoCを作るのに向いています</li> <li>機能不足を感じたら早めに<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>やmbed、PlatformIO、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%C3%A5%D7%A5%BB%A5%C3%A5%C8">チップセット</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>利用などに切り替えていくのが良いでしょう</li> </ul> <h3>まとめ</h3> <p>CircuitPythonはハードウェア制御の入門やPoC作成に向いています。導入も対応ボードであればほとんど躓くことはないでしょう。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>自体もプログラミング入門者にやさしいので、取っ掛かりでとにかく動くところまでを追うのには最適だと思います。</p> irieda Maker Faire Bangkokで展示した「10sec Game」について hatenablog://entry/10257846132711205011 2019-08-22T18:15:35+09:00 2019-08-22T18:15:35+09:00 先日(2019/01/18-19)タイのバンコクで開催されたMaker Faire Bangkokに、スイッチサイエンスも出展しました。 真ん中へんが消えてるのは接触不良っぽいです 出展するからには何か展示しないと、ということで、2017、18年にMaker Faire Tokyoで展示したLEDパネルを利用した簡単なゲームを作ろうということになりました。あまり凝ったことは性能的にも時間的にもできないので、ボタンを連打してスコアを出すゲームにしました。プレイ時間は、短いと繰り返し遊ぶ人が出てきますし長いとダレるので10秒にしました。 何を作るかが決まれば、次は部品調達です。 連打されるものなの… <p>先日(2019/01/18-19)タイの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%F3%A5%B3%A5%AF">バンコク</a>で開催された<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Bangkok">Bangkok</a>に、スイッチサイエンスも出展しました。</p> <p><figure class="figure-image figure-image-fotolife" title="真ん中へんが消えてるのは接触不良っぽいです"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20190725/20190725171413.jpg" alt="f:id:ohki_s:20190725171413j:plain" title="f:id:ohki_s:20190725171413j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>真ん中へんが消えてるのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%DC%BF%A8">接触</a>不良っぽいです</figcaption></figure></p> <p>出展するからには何か展示しないと、ということで、2017、18年に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire%20Tokyo">Maker Faire Tokyo</a>で展示したLEDパネルを利用した簡単なゲームを作ろうということになりました。あまり凝ったことは性能的にも時間的にもできないので、ボタンを連打してスコアを出すゲームにしました。プレイ時間は、短いと繰り返し遊ぶ人が出てきますし長いとダレるので10秒にしました。</p> <p>何を作るかが決まれば、次は部品調達です。 連打されるものなので、ボタンは業務用のゲーム機でも使われるセ​イ​ミ​ツ​工​業のΦ30mmの物にしました。一個だけだと不安なのでたくさん買いました。機材を入れる箱はタカチの汎用金属(アルミ)ケースにしました。アルミなら加工も比較的簡単にできます。</p> <p>制御用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>基板は、MFTの機材から流用して<a href="http://ssci.to/837">Arduino Mega 2560 R3</a>を使いました。大したことやらないのになぜ<a href="http://ssci.to/789">Uno</a>にしないんだと思われるかもしれませんが、RAM上にLEDパネルの表示データを置く必要があるのでUnoだとRAMが足らないのでした。また会場ではなぜ<a href="http://ssci.to/5263">micro:bit</a>の方が高性能なのになぜ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を使うのかと聞かれたんですが(学生さんで、今<a class="keyword" href="http://d.hatena.ne.jp/keyword/micro%3Abit">micro:bit</a>でプログラミングを勉強中と言っていた気がします)、前述の通り過去の資産があるのと、ビジュアルプログラミング環境で長いプログラムを書くのはつらいのと、なにより枯れた環境でさっさと作ってしまいたかったからです。特に3番目が重要ですね。</p> <p>LEDパネルはAdafruitがNeoPixelと呼んでいるWS2812 RGB LEDのテープを敷き詰めたもので、解像度は横30×縦20の計600<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D4%A5%AF%A5%BB%A5%EB">ピクセル</a>です。色は(見て認識できるかどうかは別として)1677万7216色出せます。パネルには電源(DCジャック)とLED制御信号コネクタがつながるようになっていて、ACアダプタから電源を供給すればLED制御信号コネクタから電源が取れるので、ここから<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mega 2560 R3の電源を取ることにしました。そのままだと見にくいので、ホームセンターで窓に貼るスモークフィルムを買ってきて貼りました。おかげで炎天下でも数字を読めました。 <figure class="figure-image figure-image-fotolife" title="シャッタースピードのせいかちゃんと写ってませんが"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20190725/20190725172238.jpg" alt="f:id:ohki_s:20190725172238j:plain" title="f:id:ohki_s:20190725172238j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%E3%A5%C3%A5%BF%A1%BC%A5%B9%A5%D4%A1%BC%A5%C9">シャッタースピード</a>のせ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%A4%A4%AB%A4%C1%A4%E3%A4%F3">いかちゃん</a>と写ってませんが</figcaption></figure></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mega 2560 R3とLEDパネルをつなぐために、<a href="http://ssci.to/990">バニラシールド</a>を加工して接続用のシールド基板を作りました。動作試験程度ならブレッドボードでよいのですが、実際に使う時には面倒でもはんだ付けした基板を作った方が安心ですね。ボタンともこの基板で接続するのですが、コネクタを介することにしてボタンの交換ができるようにしました。コネクタは手元にいっぱいあったのでLEDパネルと同じコネクタです。ただLEDパネルとはオスメスを逆にして、間違ってつながないようにしました。さらにボタンを半透明のものにしたのでシールドにもLEDを取り付けました。</p> <p>また、アルミケースにボタンの穴とケーブルを引き出す穴を開けました。ボタンの穴はΦ30mm、ケーブルの穴はACアダプタとLEDパネルのコネクタが通るよう、だいたいΦ20mmくらいで適当に開けました。手で触れるところではないですし見た目も関係ないので、精度は気にせず。</p> <p>LEDパネルと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mega 2560 R3をつなぐハーネス(ケーブル)も作りました。2mで作ったら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mega 2560 R3が起動しなくなったので(おそらく線が長くて電圧が下がりすぎたんだと思います)、1mで作りました。</p> <p>ACアダプタはいろいろ試してみて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A9%B7%EE%C5%C5%BB%D2">秋月電子</a>の5V/4Aのものがちょうどよかったので採用となりました。LEDテープのACソケット部分との接続がぐらぐらしているとここが発熱して恐いので、ちょうどいいものを探すのは大事です。</p> <p>ソフトで苦労したことは、LEDパネルはLEDテープがつづら折り状に繋がっているので、0〜29番目の直下のLEDは59〜30番だということです。このままだと大変使いにくいので変換する関数を作って対応しました。以前作ったプログラムを改造というか建て増しして作ったので他にも全画面塗りつぶしとかスクロールとかいろいろ関数があって見通しは悪くなってしまいましたが、ともかく完成したのでよしとします。</p> ohki_s M5StickVの6軸センサについて hatenablog://entry/26006613376943068 2019-07-24T15:17:02+09:00 2019-07-24T17:06:57+09:00 M5StickVの6軸センサですが、当初から公開されていたMPU6886ではなくSH200Qが搭載されている個体があると発表されています。 There are two versions of IMU sensors available at the current M5StickV (MPU6886 and SH200Q.)To identify the IMU sensor, you can use python code to scan the I2C address MPU6886(0x68)/SH200Q(0x6c) https://docs.m5stack.com/#/en/core… <p><a href="http://ssci.to/5700">M5StickV</a>の6軸センサですが、当初から公開されていたMPU6886ではなくSH200Qが搭載されている個体があると発表されています。</p> <pre class="code" data-lang="" data-unlink>There are two versions of IMU sensors available at the current M5StickV (MPU6886 and SH200Q.)To identify the IMU sensor, you can use python code to scan the I2C address MPU6886(0x68)/SH200Q(0x6c)</pre> <p><a href="https://docs.m5stack.com/#/en/core/m5stickv">https://docs.m5stack.com/#/en/core/m5stickv</a></p> <p>どちらのチップもピン互換ですので動作には問題ないのですが、I2Cのアドレスが違うのでプログラムで判別して切り替える必要があります。また、データシートをざっと見た限りでは両者の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%BF">レジスタ</a>に互換性はないので、読み出しプログラムも違う物が必要そうです。</p> <p>最初のロットではSH200Qが搭載されているとのことで、社内にある2台(最初に入荷した物と2回目に入荷した物)はどちらもSH200Qでした。</p> <p>I2Cバスにつながっているデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>は以下のMicroPython<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で一覧できます。</p> <pre class="code" data-lang="" data-unlink>from machine import I2C i2c = I2C(I2C.I2C0, freq=100000, scl=28, sda=29) devices = i2c.scan() print(devices)</pre> <p>おそらく[52, 108]と表示されると思います。出力は10進数で、52(0x34)がAXP192という電源管理ICで、108(0x6c)がSH200Qです。MPU6886では104になるはずです。</p> <p>M5Stackでは、現在AXP192のMicroPython対応作業中で、それが終わったら6軸センサのMicroPython対応をするとのことです。気になる方は<a href="https://github.com/sipeed/MaixPy">sipeed/MaixPy</a>を見てみるとよいでしょう。</p> <p>以下参考に - <a href="https://github.com/m5stack/M5-Schematic/blob/master/datasheet/MPU-6886-000193%2Bv1.1_GHIC.PDF.pdf">MPU6886データシート</a> - <a href="https://github.com/m5stack/M5-Schematic/blob/master/Core/SH200Q.pdf">SH200Qデータシート</a></p> ohki_s InsightSiPのデバイス関連情報セミナー hatenablog://entry/17680117127215894943 2019-07-09T16:53:14+09:00 2019-07-09T16:53:14+09:00 144Labのメカトロソフトエンジニアの入江田です。 2019年6月12日にInsightSiPのPresidentであるNick Wood氏による 「InsightSiPデバイスセミナー」 を弊社会議室にて開催しました。 私を含め弊社の技術・営業およびInsightSiPのデバイスに関心のある数社のメンバーを招きまして合計10人強が参加しました。 Nick氏には午前はセールス向けの情報、午後は新製品を含めテクニカルな情報に関してプレゼンテーションをしていただきました。 InsightSiPのデバイスの特徴 10年前、世界で初めてBLEデバイスをSiPにして出荷した SiP=ウェハーレベルで複… <p>144Labのメカトロソフトエンジニアの入江田です。</p> <p>2019年6月12日に<strong>InsightSiP</strong>の<strong>President</strong>である<strong>Nick Wood</strong>氏による <strong>「InsightSiPデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%DF">セミ</a>ナー」</strong> を弊社会議室にて開催しました。</p> <p>私を含め弊社の技術・営業およびInsightSiPのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>に関心のある数社のメンバーを招きまして合計10人強が参加しました。</p> <p>Nick氏には午前はセールス向けの情報、午後は新製品を含めテクニカルな情報に関してプレゼンテーションをしていただきました。</p> <h2>InsightSiPのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の特徴</h2> <ul> <li>10年前、世界で初めてBLEデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/SiP">SiP</a>にして出荷した</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SiP">SiP</a>=ウェハーレベルで複数素子をチップサイズにパッケージした構造</li> <li>10年前のこのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>は未だに購入することができる</li> <li>高品質を保ちつつ製品寿命を重視した製品戦略</li> <li>立体的にモールドした中に発振器やアンテナなどを内包した構造</li> <li>外付けのパーツをほとんど必要としない(オプショナルな機能を使うときだけ)</li> <li>立体的なアンテナ構造の最適化によりRF特性に指向性偏りが少ない</li> <li>ほぼすべてのラインナップにnordicコアチップを採用している</li> <li>標準的な値付けで競合と比較しても高くはないし、周辺部品が不要なのでトータルコストは抑えられる</li> <li>日本向けにおいても積極的にTELEC認証とパッケージに表示をする方針</li> </ul> <h2>なぜnordicなの?</h2> <ul> <li>nordicは長い製品寿命のBLE/ANT+統合型SoCをInsightSiPを含むいくつかの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%C9%A5%D1%A1%BC%A5%C6%A5%A3">サードパーティ</a>の会社に提供している</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%C9%A5%D1%A1%BC%A5%C6%A5%A3">サードパーティ</a>含めBLE分野で50%以上のシェアを握っている</li> <li>nordicが最近のnRFシリーズに採用しているARMのCortex M4Fコア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>は性能バランスがこの適用分野にマッチしている</li> </ul> <h2>その他</h2> <ul> <li>新製品群の解説 <ul> <li>LoRa統合製品群 <ul> <li>JP対応ももうすぐリリース</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/LTE">LTE</a>-M統合製品群</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/UWB">UWB</a>統合製品群</li> </ul> </li> <li>BLEと旧<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>が別物という話</li> <li>BLEデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の省電力運用のコツ</li> <li>Bluetooth5.1</li> <li>メッシュ技術の比較 <ul> <li>BLE-Mesh</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Zigbee">Zigbee</a></li> <li>Thread</li> <li>ANT+</li> </ul> </li> <li>BT5.1のAoA、AoDの話</li> <li>カスタムパッケージも作るよ!</li> </ul> <p>というようなお話でした。 一部の製品のデモなどもあり、やはり実際に動くものをみるとみなさん声を上げて盛り上がっていました。</p> <h2>感想</h2> <p>個人的に思うnordicのnRFシリーズの良さ</p> <ul> <li>BLEかANTが必要ならnordicというくらい定番</li> <li>SoCとsoftdeviceの分担型の機能提供により製品寿命が長い</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>規格のバージョンはどんどん更新されていくが、デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を変更することなくsoftdeviceファームの更新である程度追従できる</li> <li>softdeviceにより<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%C9%A5%EB%A5%A6%A5%A7%A5%A2">ミドルウェア</a>開発者が容易にフルフィーチャーを引き出しやすく、後継製品になってもコンパチビリティが高い</li> <li>nRFシリーズにはLoRa統合や<a class="keyword" href="http://d.hatena.ne.jp/keyword/LTE">LTE</a>-M統合などの製品群も次々に投入されている</li> <li>SoCベンダがsoftdeviceをリリースして同じフィーチャーは同じ使い方で良いという状態を維持し続けているのが素晴らしい</li> </ul> <p>というような有能なコアを周辺必須部品と一緒にパッケージしてくれているInsightSiPの<a class="keyword" href="http://d.hatena.ne.jp/keyword/iSP">iSP</a>シリーズのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>は日本の法律に適合してるし、ハード設計者も楽だし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>開発者も楽ができる良いデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>だなぁと思いました。</p> <p>そして、今後同じ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>のノウハウ+アルファでLoRaやNB-IoT方面に対応したアプリケーション開発も可能になるのは嬉しいですね。</p> irieda 組み込み開発奮闘記(1) hatenablog://entry/17680117127207011854 2019-06-25T10:39:22+09:00 2019-06-25T10:39:22+09:00 最近、組み込み開発に寄っている144Labの入江田です。 組み込み向け開発を始めるにあたってどんなことを検討しているかなどをご紹介します。 組み込み開発といっても大きく2種に分かれます。 RaspberryPiなどのLinuxカーネルを載せたPC-OS上にアプリケーションを置くもの 組込み用OSまたはOSなしでもっと省電力分野に向いたマイコンベースの上にアプリケーションを置くもの ここでは後者をターゲットにする場合を解説します。 アーキテクチャ選択肢 いまどきのオープンハードウェア向きな選択肢は以下の7シリーズ AVRシリーズ オープンハードウェアの火付け役Arduinoで採用 素直なアーキテ… <p>最近、組み込み開発に寄っている144Labの入江田です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190625/20190625103805.png" alt="f:id:irieda:20190625103805p:plain" title="f:id:irieda:20190625103805p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>組み込み向け開発を始めるにあたってどんなことを検討しているかなどをご紹介します。</p> <p>組み込み開発といっても大きく2種に分かれます。</p> <ul> <li>RaspberryPiなどの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>を載せたPC-OS上にアプリケーションを置くもの</li> <li>組込み用OSまたはOSなしでもっと省電力分野に向いた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ベースの上にアプリケーションを置くもの</li> </ul> <p>ここでは後者をターゲットにする場合を解説します。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>選択肢</h3> <p>いまどきのオープンハードウェア向きな選択肢は以下の7シリーズ</p> <ul> <li>AVRシリーズ <ul> <li>オープンハードウェアの火付け役<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>で採用</li> <li>素直な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>と当時の価格帯の割に大きめのメモリ</li> <li>なので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ー方式が実装しやすかった</li> <li>ESPが出てしまってからは性能、コストともに負けてる</li> <li>古参だけに拡張ボードの豊富さはダントツ</li> </ul> </li> <li>ATSAMDシリーズ <ul> <li>USB-CDCやUSB-MSD機能をもっている点が良い</li> <li>USB-MSDの無いボードに書き込み機として載せられたり</li> <li>adafruitがこのシリーズの製品を多く出してる</li> </ul> </li> <li>STMicroシリーズ <ul> <li>ほとんどのラインナップで単コア無線無し</li> <li>コストパフォーマンスの高さで評判</li> </ul> </li> <li>nRF5xシリーズ <ul> <li>BLE機能内包タイプの定番、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>の品質を含め<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%C3%A5%D7%A5%E9%A5%F3%A5%CA%A1%BC">トップランナー</a></li> <li>nRF52840はUSB-CDCやUSB-MSD機能があります(なのでadafruitが採用製品をいくつか出してる)</li> </ul> </li> <li>ESPシリーズ <ul> <li>WiーFi機能付きで最安のシリーズ。</li> <li>USBフィーチャーを持っていない</li> <li>チップ単価が安いので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>のないボードにモデムとして載せられるパターンが増えた</li> </ul> </li> <li>u-<a class="keyword" href="http://d.hatena.ne.jp/keyword/blox">blox</a>シリーズ <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>機能付き、BLE機能付きなどがある</li> <li>ESPに比べ省電力</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>付きにしては価格がESPよりは高いが他社のよりは安い</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>-V<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a> <ul> <li>製品はまだ少ないがARM一色に傾倒しそうな世に対するカウンター</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/BSD%A5%E9%A5%A4%A5%BB%A5%F3%A5%B9">BSDライセンス</a>でライセンス料が不要な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a></li> <li>ESPのように低コストでSoCを提供するところがチラホラ</li> </ul> </li> </ul> <p>AVR、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>-Vなどは独自の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>、特にESPはXtensaという名前の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>です、それ以外はARMのCortex M0/M3/M4です。ARM派生プロセッサは他にもたくさんのメーカーが出してる。特にnRF5xシリーズは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>をNordicが提供するんだけどモジュール化する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%C9%A5%D1%A1%BC%A5%C6%A5%A3">サードパーティ</a>がたくさんある。そのためBLE内包タイプではNordicが世界シェアの50%を抑えてる。</p> <h3>ターゲットデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の選択</h3> <p>開発時のサイクルをどう回すかに関して以下のいずれかの機能が必要になります。</p> <ol> <li>インサーキットプログラミング機能の有無</li> <li>USBシリアル変換チップまたはUSB-CDC機能の有無</li> <li>USB-MSD機能の有無</li> </ol> <p>1.に関しては今どきの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>は必ず内包していますが、概ね高価な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>が必要になります。量産する場合を除き、開発段階では2.か3.の機能がほしいところ。2.か3.があれば対応する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーを予め<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>として入れておくことで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>を必要とせずにアプリケーションの更新ができます。 また、2.の機能はアプリケーション実行時のログ出力に使えるので3.のUSB-MSDによる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>アップデートは便利なんだけど、できれば2.もあったほうが良いでしょう。</p> <p>あとは必要な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>スペック。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%E9%A5%C3%A5%B7%A5%E5%A5%E1%A5%E2%A5%EA">フラッシュメモリ</a>容量</li> <li>RAM容量</li> <li>CPU性能(クロック、コア数)</li> <li>必要なファンクションがカバーされているか</li> </ul> <p>開発時のみ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%E9%A5%C3%A5%B7%A5%E5%A5%E1%A5%E2%A5%EA">フラッシュメモリ</a>の大きいものを使うといったことが有効な場合もあります。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>シンボルなどは容量がかさむので)</p> <p>あと、IoTデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を実現するのであればネットワークインフラをどのように確保するか。</p> <ul> <li>不要</li> <li>シリアル通信またはBLE経由シリアル通信</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>機能+動作現場に無線AP+インターネット回線</li> <li>X+X<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a>+インターネット回線 <ul> <li>6LowPAN/Thread</li> <li>LoRa</li> <li>BLE Mesh</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Zigbee">Zigbee</a></li> <li>ANT+</li> </ul> </li> </ul> <h4>実際の選択肢</h4> <ul> <li>ATSAMD21/51 <ul> <li>USBサポート内蔵のため開発しやすいCPUの始祖</li> <li>CPU性能の引き上げ版を最近リリース</li> </ul> </li> <li>STM32 <ul> <li>STM32は異常に価格が安く性能控えめという位置づけだった</li> <li>F4は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cortex-M4">Cortex-M4</a>相当で動作クロックを大幅に引き上げたが割高</li> </ul> </li> <li>nRF52系の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIP">SIP</a>またはモジュール <ul> <li>USBサポート内蔵のため開発しやすい</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/NFC">NFC</a>/Bluetooth5/CryptoProcessorなどてんこもり</li> <li>最新の後継ラインナップにLoRa対応、<a class="keyword" href="http://d.hatena.ne.jp/keyword/LTE">LTE</a>-M対応がある</li> <li>ISP1807 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SIP">SIP</a></li> <li>アンテナ内蔵で最もコンパクト</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>あり</li> </ul> </li> <li>MDBT50Q <ul> <li>モジュールパッケージ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>あり</li> </ul> </li> <li>BL654 <ul> <li>smartBASIC</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>あり</li> </ul> </li> </ul> </li> <li>ESP8266 <ul> <li>破格の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>内蔵チップ(@2ドル)</li> <li>IoT製品がたくさん生まれることになった火付け役</li> </ul> </li> <li>ESP32 <ul> <li>8266から複数コア化+<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>機能を追加</li> <li>M5Stackに採用されて爆売れ</li> <li>最近単コア版がリリース</li> </ul> </li> </ul> <h3>処理系の選択</h3> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>型</h4> <ul> <li>C</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a></li> <li>Rust</li> <li>TinyGo</li> </ul> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%D7%A5%EA%A5%BF">インタープリタ</a>型</h4> <ul> <li>smartBASIC</li> <li>MicroPython</li> <li>CircuitPython</li> <li>Node.js</li> <li>mruby</li> </ul> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a>書き変え戦略</h3> <ul> <li><p>フル書き換え方式</p> <ul> <li>先頭から必要なバイナリをすべて書き込む</li> <li>SWD/<a class="keyword" href="http://d.hatena.ne.jp/keyword/JTAG">JTAG</a>-USB-CDCの中継機(デバッガ)を使う</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%DD%B8%EE%CE%CE">保護領</a>域や電源管理領域などあらゆる領域を上書きできる</li> <li>おおむね高価なデバッガが必須</li> </ul> </li> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ー方式</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%E9%A5%C3%A5%B7%A5%E5%A5%E1%A5%E2%A5%EA">フラッシュメモリ</a>の後方に居座らせる</li> <li>シリアルやUSB-CDCまたはUSB-MSD経由で書き換え可能</li> <li>通常のアプリケーションの書き込みでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ー本体を書き換えできないようにしている</li> </ul> </li> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ー+<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>ランタイム方式</p> <ul> <li>疑似<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>領域に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を書き込む</li> <li>USB-MSD経由で書き換え可能</li> </ul> </li> </ul> <p>後者であるほどアプリケーションの更新が容易です。 フル書き換え方式も固定領域を予め書き込んでおいて部分的書き換えでアプリケーションの更新を行うこともできます。</p> <p>組み込み開発に慣れた人がフル書き換え方式を使ってターゲットに適合する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーをビルド。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーを予め書き込んだ状態のターゲットをチーム内で共有してアプリケーションの開発をするという二段構<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%A8%A4%AC%A4%AA">えがお</a>すすめです。</p> <h4>実際の選択肢</h4> <p>フル書き換え方式</p> <ul> <li>J-Link(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BC%CE%AE">下流</a>:SWD/<a class="keyword" href="http://d.hatena.ne.jp/keyword/JTAG">JTAG</a>,上流:USB-CDC) &lt;- お高いが高速&高機能</li> <li>ST-Link(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BC%CE%AE">下流</a>:SWD/<a class="keyword" href="http://d.hatena.ne.jp/keyword/JTAG">JTAG</a>,上流:USB-CDC)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/DAP">DAP</a>-Link(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BC%CE%AE">下流</a>:SWD/<a class="keyword" href="http://d.hatena.ne.jp/keyword/JTAG">JTAG</a>,上流:USB-MSD)</li> <li>Blackmagic/Bumpy(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BC%CE%AE">下流</a>:SWD,上流:USB-CDC)</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ー方式</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a></li> <li>nRF-Connect(USB-CDC, Nordic only)</li> <li>Adafruit-nRF52-Bootloader(USB-MSD)</li> <li>U-Boot</li> <li>mcuboot(zephyrなどが利用)</li> <li>nRF-<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>のdfu<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーサンプル</li> </ul> <h3>開発環境</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>言語むけ環境</p> <ul> <li>ArduinoIDE</li> <li>Kail(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> only)</li> <li>SEGGER Embedded Studio</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/GNU">GNU</a>-C+<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>+<a class="keyword" href="http://d.hatena.ne.jp/keyword/Makefile">Makefile</a></li> <li>TinyGo+<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>+<a class="keyword" href="http://d.hatena.ne.jp/keyword/Makefile">Makefile</a></li> </ul> <p>OSの選択</p> <ul> <li>OSなしで<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>のみで開発</li> <li>Zephyr</li> <li>NuttX</li> <li>FreeRTOS</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>言語環境</p> <ul> <li>CircuitPython</li> <li>mruby</li> <li>nodejs</li> </ul> <p>開発の容易さは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>系>>OSあり>>OSなし」で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>リソース消費も同じく「<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>系>>OSあり>>OSなし」です。</p> <p>ただし、最近のチップベンダ提供の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>は軽量なOSライク機能も提供していてそれで十分であればOSなしでもあまり困らないでしょう。他社の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>との移植性を確保したい時や複数アプリケーションの同居などが必要な場合にOSの採用を検討すると良いと思います。</p> <p>あと、日本に限ってですが、ZephyrがNordicが提供するsoftdeviceを利用せずに独自のBLEスタック(bluez)をもってNordicチップから電波を吹くことについては<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>の適用範囲を超える可能性があるので注意が必要です。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a>書き変え戦略のおすすめ</h3> <ol> <li>シリアル経由でDFUを可能にする</li> <li>BLE経由でDFUを可能にする</li> <li>USBデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>経由でDFUを可能にする</li> </ol> <p>ファーム開発する人や出荷する人などの全員に高価なプローブが必要な状況は避けたいので最低でも1.を確保したいところ。あとは2.や3.があるとよりファーム開発者の環境構築が容易になって助かるでしょう。</p> <h3>開発環境のおすすめ</h3> <ol> <li><p>SEGGER Embedded Studio</p> <ul> <li>裏方は<a class="keyword" href="http://d.hatena.ne.jp/keyword/GNU">GNU</a>-C+nRF-<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a></li> <li>nRF-<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>利用のためある機能はほぼ使える</li> <li>軽快</li> <li>安定動作</li> <li>ターゲット選択に制約が少ない</li> <li>nRF51、nRF52シリーズに限り無料で商用利用可能</li> <li>J-Link連携が強力</li> </ul> </li> <li><p>CircuitPython</p> <ul> <li>準高機能</li> <li>コードがシンプルで入門しやすい</li> <li>依存解決が楽で開発速度が早い</li> <li>メモリがしっかりあるターゲットに限定</li> <li>用意されていないことをやるときにハードルが上がる</li> <li>割り込みや省電力サポートが弱い</li> <li>あくまで動作実証用</li> </ul> </li> <li><p>ArduinoIDE</p> <ul> <li>1.と2.の間くらい</li> <li>本当は複雑な依存解決を簡単にしてくれる</li> <li>裏方は結構複雑</li> <li>豊富なライブラリ</li> <li>ちょっと深いことをするときは<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>に踏み込む必要が出てくる</li> </ul> </li> </ol> <h3>まとめ</h3> <p>今後触れることになるであろうデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の条件は</p> <ul> <li>BLE対応かLoRa、更に将来的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/LTE">LTE</a>-Mを使いたい</li> <li>PoCはCircuitPythonで</li> <li>本格運用ではBLE-DFU対応<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーで</li> <li>上記条件からnRF52シリーズやその後継シリーズが望ましい</li> <li>だとするとSEGGER Embedded Studioが適してるっぽい</li> <li>同シリーズがターゲットなら特にOSは不要</li> </ul> <p>なのでSEGGER Embedded Studioをガッツリ使うときの奮闘記事を 今後順次書いていく予定です。</p> irieda State of Arduino (Maker Faire Bay Area 2019) hatenablog://entry/17680117127174118368 2019-05-31T14:10:38+09:00 2019-05-31T15:57:02+09:00 こんにちは。144Labの菊地です。 5月17日から20日まで、サンフランシスコ・ベイエリアでMaker Faire Bay Area 2019が開催されました。このうち、Arduinoの共同創業者の1人であるMassimo Banzi氏による講演「State of Arduino」の内容をレポートします。 Arduino共同創業者 Massimo Banzi氏 時間のない方はこちらのビデオをどうぞ。 Maker Faire Bay Area2019 - Arduinoの新製品発表リポート IDEは30万DL、多様な開発ボードをカバーする最大勢力へ オープンソース・プロジェクトに$50,000… <p>こんにちは。144Labの菊地です。</p> <p>5月17日から<a class="keyword" href="http://d.hatena.ne.jp/keyword/20%C6%FC">20日</a>まで、サンフランシスコ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%A4%A5%A8%A5%EA%A5%A2">ベイエリア</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a> Bay Area 2019が開催されました。このうち、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の共同創業者の1人であるMassimo Banzi氏による講演「State of <a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>」の内容をレポートします。 <figure class="figure-image figure-image-fotolife" title="Arduino共同創業者 Massimo Banzi氏"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183514.jpg" alt="f:id:kiku_144:20190530183514j:plain" title="f:id:kiku_144:20190530183514j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>共同創業者 Massimo Banzi氏</figcaption></figure></p> <p>時間のない方はこちらのビデオをどうぞ。</p> <iframe width="560" height="315" frameborder="0" allowfullscreen="" src="//www.youtube.com/embed/kwruqGVHEkU"></iframe> <p><a href="https://youtube.com/watch?v=kwruqGVHEkU">Maker Faire Bay Area2019 - Arduinoの新製品発表リポート</a></p> <ul class="table-of-contents"> <li><a href="#IDEは30万DL多様な開発ボードをカバーする最大勢力へ">IDEは30万DL、多様な開発ボードをカバーする最大勢力へ</a></li> <li><a href="#オープンソースプロジェクトに50000を寄付">オープンソース・プロジェクトに$50,000を寄付</a></li> <li><a href="#Arduino-Nanoファミリーの新ラインナップ-4種">Arduino Nanoファミリーの新ラインナップ 4種</a></li> <li><a href="#新サービスArduino-SIMとArduino-IoT-Cloud">新サービス:Arduino SIMとArduino IoT Cloud</a></li> <li><a href="#STEMSTEAM-に向けた取組み">STEM(STEAM) に向けた取組み</a></li> <li><a href="#FPGAのサポート強化">FPGAのサポート強化</a></li> <li><a href="#One-more-thing--新しいArduino-IDE">One more thing .... 新しいArduino IDE</a></li> </ul> <h4 id="IDEは30万DL多様な開発ボードをカバーする最大勢力へ"><a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>は30万DL、多様な開発ボードをカバーする最大勢力へ</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>・ハードウェアとしては世界最大のエコシステムになりました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>ブランドの製品群だけではなく、STM32、ESP32、Nordic nRF、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mediatek">Mediatek</a>、Spresenseなど多種多様なボードをサポートし、2018年1年間でオフライン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B9%E7%B3%AB%C8%AF%B4%C4%B6%AD">統合開発環境</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>版 <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>)のダウンロード数は30万を超えます。 <figure class="figure-image figure-image-fotolife" title="多様なArduino Coreをサポート"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530170908.png" alt="f:id:kiku_144:20190530170908p:plain" title="f:id:kiku_144:20190530170908p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>多様な<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Coreをサポート</figcaption></figure></p> <h4 id="オープンソースプロジェクトに50000を寄付"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>・プロジェクトに$50,000を寄付</h4> <p>この動きを更に加速するため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>は Head of Open Source and Communitiesを新たに採用し、他の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>・プロジェクトやコミュニティとのコラボレーションを促進、さらなるエコシステムの強化を行っていくとのこと。今年は$50,000の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%F0%B6%E2">基金</a>を用意、このうち$25,000を5つの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>・プロジェクトに寄付すると発表しました。</p> <p>寄付先は<a href="https://www.fsf.org/">Free Software Foundation</a>, <a href="https://www.linuxfoundation.org/">Linux Foundation</a>, <a href="https://creativecommons.org/">Creative Commons</a>, <a href="https://processingfoundation.org/">Processing Foundation</a>, <a href="https://riscv.org/">RISC-V Foundation</a>の5つです。残りの$25,000の寄付先は、10月の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a> Romeで発表するとのことです。 個人的には<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>-Vは意外でした。</p> <h4 id="Arduino-Nanoファミリーの新ラインナップ-4種"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoファミリーの新ラインナップ 4種</h4> <p>最近<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>はMKRシリーズのラインナップを強化していたので、今年もその関連の発表が中心だろうと予想していたのですが、今回の開発ボード関連の新発表は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> NANOファミリーの強化でした。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183526.jpg" alt="f:id:kiku_144:20190530183526j:plain" title="f:id:kiku_144:20190530183526j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ATMega4809 AVRプロセッサ搭載の<a href="https://store.arduino.cc/usa/nano-every">Arduino Nano Every</a>は、米国価格税抜 $9.9と従来のNanoに比べて戦略的な価格付けがされています。また、u-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Blox">Blox</a>社 NINA <a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>/BLEモジュールを搭載した<a href="https://store.arduino.cc/usa/nano-33-iot-with-headers">Arduino Nano 33 IoT</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>初のArm Cortex-M4Fコア搭載 nRF52840を実装した<a href="https://store.arduino.cc/nano-33-ble-with-headers">Arduino Nano 33 BLE</a>と<a href="https://store.arduino.cc/nano-33-ble-sense-with-headers">Arduino Nano 33 BLE SENSE</a>も合わせ、Nanoシリーズをぐっと身近にすべく、強化した印象です。</p> <p>詳細スペックについては、スイッチサイエンスマガジンも合わせてご覧ください。 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmag.switch-science.com%2F2019%2F05%2F21%2Fa-new-nano-family%2F" title="Arduinoの新しいプロダクト A New Nano Family" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://mag.switch-science.com/2019/05/21/a-new-nano-family/">mag.switch-science.com</a></cite></p> <h4 id="新サービスArduino-SIMとArduino-IoT-Cloud">新サービス:<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> SIMと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> IoT Cloud</h4> <p>これはMKRシリーズ向けの新サービスになるのですが、<a href="https://store.arduino.cc/usa/mkr-gsm-1400">Arduino MKR GSM 1400</a>などの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EB%A5%E9%A1%BC">セルラー</a>搭載開発ボード向けの<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%AB%A1%BC%A5%C9">SIMカード</a>をリリースします。Arm社の提供するSIM管理サービス <a href="https://www.arm.com/products/iot/pelion-iot-platform/connectivity-management">Pelion Connectivity Manegement</a>を利用し、グローバル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%DF%A5%F3%A5%B0">ローミング</a>対応の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SIM%A5%AB%A1%BC%A5%C9">SIMカード</a>を発行。最初は米国から、追って欧州向けに提供します。当初は<a class="keyword" href="http://d.hatena.ne.jp/keyword/GSM">GSM</a>から開始しますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/LTE">LTE</a>-M、NB-IoTなどの新しい通信規格にも対応していく模様です。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183642.jpg" alt="f:id:kiku_144:20190530183642j:plain" title="f:id:kiku_144:20190530183642j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nano 33 IoTなどの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%EB%A5%E9%A1%BC">セルラー</a>搭載ボード<a href="#f-8c63fefe" name="fn-8c63fefe" title="対応機種はMKR 1000, MKR WiFi 1010, MKR GSM 1400, Nano 33 IoT。いずれも技適が取れていないため日本では発売されていません。">*1</a>向けに<a href="https://www.arduino.cc/en/IoT/HomePage">Arduino IoT Cloud</a>がリリースされました。ブースでは実際のベータ版デモを見ることができたのですが、簡単なセンサーデータの可視化やマップとの連携程度であれば、わざわざサーバを構築しなくてもデモができるレベルまで作り込まれている印象です。  <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183629.jpg" alt="f:id:kiku_144:20190530183629j:plain" title="f:id:kiku_144:20190530183629j:plain" class="hatena-fotolife" itemprop="image"></span></p> <h4 id="STEMSTEAM-に向けた取組み">STEM(STEAM) に向けた取組み</h4> <p>昨年の展示から、STEM(STEAM)分野への注力が表明されていたのですが、今年は<a class="keyword" href="http://d.hatena.ne.jp/keyword/High%20School">High School</a>向けパッケージ<a href="https://store.arduino.cc/usa/ctc-go-core">Arduino CTC Go</a>と、<a href="https://sciencejournal.withgoogle.com/">Google Science Journal</a>と共同開発した <a href="Arduino%20Science%20Kit%20Physics%20Lab">Arduino Science Kit Physics Lab</a>(Middle School向け科学キット)を1月にリリースしました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183537.jpg" alt="f:id:kiku_144:20190530183537j:plain" title="f:id:kiku_144:20190530183537j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>同時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Certification Program(認定プログラム)という<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>検定試験を米国で始めると発表しました。これは、米国版のThe <a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Starter Kitと連動する形で開始するようです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fssci.to%2F2628" title="The Arduino Starter Kit(日本語版) - スイッチサイエンス" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://ssci.to/2628">ssci.to</a></cite></p> <h4 id="FPGAのサポート強化"><a class="keyword" href="http://d.hatena.ne.jp/keyword/FPGA">FPGA</a>のサポート強化</h4> <p>昨年の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a> Bay Areaで発表された<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>初の<a class="keyword" href="http://d.hatena.ne.jp/keyword/FPGA">FPGA</a>開発ボード、<a href="https://store.arduino.cc/usa/mkr-vidor-4000">MKR Vidor 4000</a>。 この<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>の最新バージョンについても紹介されました。ドラッグ&ドロップで複雑な<a class="keyword" href="http://d.hatena.ne.jp/keyword/FPGA">FPGA</a>プロジェクトをシンプルに構築できる、パワフルな<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>とのことです。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183616.jpg" alt="f:id:kiku_144:20190530183616j:plain" title="f:id:kiku_144:20190530183616j:plain" class="hatena-fotolife" itemprop="image"></span></p> <h4 id="One-more-thing--新しいArduino-IDE">One more thing .... 新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a></h4> <p>そして、最後に発表されたのは・・・・・ <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183602.jpg" alt="f:id:kiku_144:20190530183602j:plain" title="f:id:kiku_144:20190530183602j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>新しいデスクトップ版<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>を開発中とのことで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a> v2.0のプロトタイプを公開しました。</p> <p>これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>を一新し、バックグラウンドで走る<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>・インタフェース(<a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>)を用意。ダウンロードや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>、アップロードを<a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>経由で動かすことができます。一方で、洗練されたユーザ・インタフェースも用意され、フル・ファンクションで機能するデバッガを含めて、初心者からプロフェッショナルまで幅広い層にとって使いやすいものを目指すとのことです。これから数週間でアルファ版が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>として公開され、以後一般リリースに向けて作業が進んでいくものと思われます。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kiku_144/20190530/20190530183548.jpg" alt="f:id:kiku_144:20190530183548j:plain" title="f:id:kiku_144:20190530183548j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>以上、盛りだくさんの発表でしたが、今後の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の目指す方向性を示唆する講演となったのではないでしょうか。 新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>については、進展があり次第、ここでも触れていきたいと思います。</p> <div class="footnote"> <p class="footnote"><a href="#fn-8c63fefe" name="f-8c63fefe" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">対応機種はMKR 1000, MKR <a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a> 1010, MKR <a class="keyword" href="http://d.hatena.ne.jp/keyword/GSM">GSM</a> 1400, Nano 33 IoT。いずれも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>が取れていないため日本では発売されていません。</span></p> </div> kiku_144 SEGGER Embedded Studioの紹介 hatenablog://entry/17680117127138359458 2019-05-17T18:41:07+09:00 2019-05-17T18:50:53+09:00 144Labのメカトロソフト屋の入江田です。 ドイツの組み込み向け統合開発環境 を紹介します。 サイト: https://www.segger.com/products/development-tools/embedded-studio/ 外観 特徴 非常に親切&高機能&軽快な動作 パッケージマネージャにて必要な依存を容易に管理可能 動作環境はWindows/Linux/macOS対応 本来有償のIDEだけど、nordicのチップを扱う限り無償で利用可能 シミュレーションモードもあってPC上でロジックを追うことができます セットアップ https://www.segger.com/downlo… <p>144Labのメカトロソフト屋の入江田です。</p> <p>ドイツの組み込み向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%FD%B9%E7%B3%AB%C8%AF%B4%C4%B6%AD">統合開発環境</a> を紹介します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190517/20190517183542.png" alt="f:id:irieda:20190517183542p:plain" title="f:id:irieda:20190517183542p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>サイト: <a href="https://www.segger.com/products/development-tools/embedded-studio/">https://www.segger.com/products/development-tools/embedded-studio/</a></p> <h2>外観</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190517/20190517183558.png" alt="f:id:irieda:20190517183558p:plain" title="f:id:irieda:20190517183558p:plain" class="hatena-fotolife" itemprop="image"></span></p> <h2>特徴</h2> <ul> <li>非常に親切&高機能&軽快な動作</li> <li>パッケージマネージャにて必要な依存を容易に管理可能</li> <li>動作環境は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>対応</li> <li>本来有償の<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>だけど、nordicのチップを扱う限り無償で利用可能</li> <li>シミュレーションモードもあってPC上でロジックを追うことができます</li> </ul> <h2>セットアップ</h2> <p><a href="https://www.segger.com/downloads/embedded-studio/">https://www.segger.com/downloads/embedded-studio/</a> ここから使っている環境にあったものをダウンロードして入れます。 ちなみに<a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>のHomebrew経由なら以下のコマンドでインストールできます。</p> <pre class="code shell" data-lang="shell" data-unlink>brew cask install segger-embedded-studio-for-arm</pre> <p>その後パッケージマネージャから必要なターゲット用のパッケージを選んでインストールするだけです。</p> <h2>nordicのドキュメント</h2> <p><a href="http://infocenter.nordicsemi.com/pdf/getting_started_ses.pdf">http://infocenter.nordicsemi.com/pdf/getting_started_ses.pdf</a></p> <h2>nRF-Connect-Desktopによる環境構築</h2> <p><a href="https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Connect-for-desktop">https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Connect-for-desktop</a></p> <p>これを対応ホストを選んでダウンロード&インストールすると、</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190517/20190517183539.png" alt="f:id:irieda:20190517183539p:plain:w80" title="f:id:irieda:20190517183539p:plain:w80" class="hatena-fotolife" style="width:80px" itemprop="image"></span> このようなアイコンのアプリを起動しましょう。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190517/20190517183551.png" alt="f:id:irieda:20190517183551p:plain" title="f:id:irieda:20190517183551p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>「Add/remove apps」を選び、以下の2つのアプリをinstallします。</p> <ul> <li>Programmer</li> <li>Getting Started Assistant</li> </ul> <p>一般にはJ-Link(SMD/<a class="keyword" href="http://d.hatena.ne.jp/keyword/JTAG">JTAG</a>)経由で<a class="keyword" href="http://d.hatena.ne.jp/keyword/FLASH">FLASH</a>書き換えや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>を可能にする方法を使いますが、外部機器の不要なUSBSDFU方式(nRF52840が内蔵してるUSBシリアル)で書き換えたい場合に「Programmer」を使います。</p> <p>「Launch app」から「Getting Started Assistant」をLaunchします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190517/20190517183554.png" alt="f:id:irieda:20190517183554p:plain" title="f:id:irieda:20190517183554p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>右サイドのVariablesを埋めます。ncs_tagは現時点でmasterである必要がありました。 (ドキュメントにはv0.3.0と書いてたんですが) 1〜4の条件をそれぞれ埋めていきます。 (3に該当する部分は「セットアップ」に書いた内容でOK)</p> <h2>Programmerについて</h2> <p>「Launch app」から「Programmer」をLaunchします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190517/20190517183547.png" alt="f:id:irieda:20190517183547p:plain" title="f:id:irieda:20190517183547p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>上部のボタンから接続デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を選択できます。 接続すると左のチャートに色分けメモリマップが表示されます。</p> <ul> <li>オレンジ: <a class="keyword" href="http://d.hatena.ne.jp/keyword/MBR">MBR</a>(ブートレコード)</li> <li>赤: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ー</li> <li>青: softdevice</li> <li>緑: アプリケーション</li> </ul> <p>右のチャートはhexファイルを読んだ結果が表示されます。 基本はhexファイルを読み込んでwriteで書き込み、resetでブートです。</p> <h2>J-Linkについて</h2> <p>J-Linkと呼ばれる規格対応の<a class="keyword" href="http://d.hatena.ne.jp/keyword/JTAG">JTAG</a>/SMD接続プローブがあればEmbedded-Studioが連携可能になります。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/FLASH">FLASH</a>の書き換えはもちろん、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>ステップでの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>も可能になり、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>ログも出ます。 開発時はJ-Linkプローブが乗った評価ボードで行うことをお勧めします。 量産モデルのターゲットであってもJ-Linkプローブが接続可能にしておくと良いでしょう。</p> <h2>感想</h2> <p>これまで構築した開発環境の中ではもっともスムーズにセットアップできました。 失敗しそうな条件などは徹底的にうまく隠蔽できてそう。 ArduinoIDEとは違い、ビルドコマンドログ等もみれてあとあと<a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>による開発もスムーズに移行できそう。 nordic系の開発をするのならこれが良さそう?</p> <p>Getting Started Assistantを実施後、nRF-Connect-<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>のサンプルをビルド、書き込んで実行可能なところまで動作確認できました(ble_app_blinky)。</p> irieda M5StickCの小ネタ hatenablog://entry/17680117127122430828 2019-05-06T21:24:06+09:00 2019-05-09T18:01:26+09:00 みなさんこんにちは。スイッチサイエンスの大木です。 Maker Faire Kyotoが終わってほっとしています。出展された方も来場された方もおつかれさまでした。 さて、今回のMaker Faire Kyotoで突発的に少しだけ販売した、M5Stackの新製品M5StickCのスケッチを書いていてちょっと調べないとわからなかった小ネタを書いておきます。 転送レートについて 開発時にコンパイルしたスケッチを転送する速度がM5Stackより上がっており、最高1.5Mbpsで転送できます。1.5Mbpsの転送は大変快適です。ただそのためにはArduino IDEの設定ファイルboards.txtを修… <p>みなさんこんにちは。スイッチサイエンスの大木です。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a> Kyotoが終わってほっとしています。出展された方も来場された方もおつかれさまでした。</p> <p>さて、今回の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Maker%20Faire">Maker Faire</a> Kyotoで突発的に少しだけ販売した、M5Stackの新製品<a href="https://docs.m5stack.com/#/en/core/m5stickc">M5StickC</a>のスケッチを書いていてちょっと調べないとわからなかった小ネタを書いておきます。</p> <h4>転送レートについて</h4> <p>開発時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>したスケッチを転送する速度がM5Stackより上がっており、最高1.5Mbpsで転送できます。1.5Mbpsの転送は大変快適です。ただそのためには<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>の設定ファイルboards.txtを修正する必要があります。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>では ~/Library/Arduino15/packages/esp32/hardware/esp32/1.0.2/ にありました。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>では C:\Users\ (ユーザー名) \AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.2\ にありました。</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>を終了して、boards.txtに</p> <p>pico32.menu.UploadSpeed.921600=921600<br />pico32.menu.UploadSpeed.921600.upload.speed=921600</p> <p>という2行があるので、この4ヶ所の921600を1500000に書き換えます。</p> <p>pico32.menu.UploadSpeed.1500000=1500000<br />pico32.menu.UploadSpeed.1500000.upload.speed=1500000</p> <p>これで転送速度1.5Mbpsが選択できるようになります。</p> <p><img class="hatena-fotolife" title="f:id:ohki_s:20190508112332p:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20190508/20190508112332.png" alt="f:id:ohki_s:20190508112332p:plain" /></p> <h4>6軸センサについて</h4> <p>6軸センサは<a href="http://senodia.com/Uploads/Product/5b2b6ef1216e8.pdf">SH200Q</a>というICを使っています(リンク先はpdfです)。データシートの38ページにチップから見た各軸の向きが書いてありますが、M5StickCから見るとボタンのM5ロゴを正面に見て上がY軸+、右がX軸+、手前がZ軸+方向です。</p> <p> <img class="hatena-fotolife" title="f:id:ohki_s:20190508114105p:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/o/ohki_s/20190508/20190508114105.png" alt="f:id:ohki_s:20190508114105p:plain" width="180" /></p> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/LCD">LCD</a>について</h4> <p>解像度は80×160ドットです。 画面のバックライト輝度は電源IC <a href="http://www.x-powers.com/en.php/Info/product_detail/article_id/29">AXP192</a>によって制御されていて、スケッチではAxp.ScreenBreathを使います。設定できるのは7から15までの9段階です。7にしてもかすかに表示は見えます。</p> <h4>CPUクロックについて</h4> <p>消費電力を下げるためにCPUクロックを落とすことができます。CPUクロックを変えるにはsetCpuFrequencyMhz()を使います。このクラスはM5Stackが提供しているライブラリではなく<a class="keyword" href="http://d.hatena.ne.jp/keyword/arduino">arduino</a>-esp32内の<a href="https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-cpu.h">esp32-hal-cpu.h</a> 内で宣言されています。</p> <p>esp32-hal-cpu.hによると搭載しているクリスタルの周波数で動作周波数の下限が決まります。M5StickCが搭載している<a href="https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf">ESP32-PICO-D4</a>(リンク先はpdfです)はデータシート3.3章によると40MHzのクリスタルを搭載していますので、10MHzが下限です。</p> <p>ですので、setCpuFrequencyMhz(10) で一番遅い10MHz動作にできます。</p> ohki_s NFC機器と高周波利用設備の型式指定申請 hatenablog://entry/17680117127076524737 2019-04-24T09:29:45+09:00 2019-04-24T09:32:06+09:00 144Labの入江田です。 先日の「papyr」にNFCアンテナついてるけれど電波法的に問題ないのかという点ですが、 結論からいうと問題はありません。 総務省の高周波利用設備について https://www.tele.soumu.go.jp/j/sys/others/highfre/ 電線路に10kHz以上の高周波電流を通ずる電信、電話、その他の通信設備及び10kHz以上の高周波電流を使用する工業用加熱設備、医療用設備、各種設備については、原則として個別に設置許可を受けるよう定めています。 そのように書かれていて、「papyr」に該当しそうな「NFC機能」があります。 tech.144lab.… <p>144Labの入江田です。</p> <p>先日の「papyr」に<a class="keyword" href="http://d.hatena.ne.jp/keyword/NFC">NFC</a>アンテナついてるけれど電波法的に問題ないのかという点ですが、 <strong>結論からいうと問題はありません。</strong> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/irieda/20190418/20190418185921.jpg" alt="f:id:irieda:20190418185921j:plain" title="f:id:irieda:20190418185921j:plain" class="hatena-fotolife" itemprop="image"></span></p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>の高周波利用設備について</h2> <p><a href="https://www.tele.soumu.go.jp/j/sys/others/highfre/">https://www.tele.soumu.go.jp/j/sys/others/highfre/</a></p> <blockquote><p>電線路に10kHz以上の高周波電流を通ずる電信、電話、その他の通信設備及び10kHz以上の高周波電流を使用する工業用加熱設備、医療用設備、各種設備については、原則として個別に設置許可を受けるよう定めています。</p></blockquote> <p>そのように書かれていて、「papyr」に該当しそうな「<a class="keyword" href="http://d.hatena.ne.jp/keyword/NFC">NFC</a>機能」があります。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftech.144lab.com%2Fentry%2Fpapyr" title="「Electronut LABS」のBLE開発ボード「papyr」の紹介 - 144Labグループ開発者ブログ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://tech.144lab.com/entry/papyr">tech.144lab.com</a></cite></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/NFC">NFC</a>関連は「誘導式読み書き通信設備」に該当します。</p> <blockquote><p>13.56MHzの周波数の誘導電波を使用して記録媒体の情報を読み書きする設備をいう。</p></blockquote> <p>実際に申請している型式指定のリストが<a href="http://www.soumu.go.jp/menu_seisaku/ictseisaku/dempa_rikatsuyo/high_frequency/index.html">ここ</a>から参照できます。</p> <p>登録ずみの機器をみていくと、主に<a class="keyword" href="http://d.hatena.ne.jp/keyword/IC%A5%BF%A5%B0">ICタグ</a>に対し読み書きを行う電力供給を伴う機器ばかりでした。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/NFC">NFC</a>タグ製品はもちろん、<a class="keyword" href="http://d.hatena.ne.jp/keyword/NFC">NFC</a>ペアリング可能なBTヘッドフォンや、 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/NFC">NFC</a>経由でラベルプリントできるプリンタなどは登録されていません。</p> <p>ということは<a class="keyword" href="http://d.hatena.ne.jp/keyword/IC%A5%BF%A5%B0">ICタグ</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/IC%A5%BF%A5%B0">ICタグ</a>相当の機能しか持たない機器であれば申請は不要という解釈ができるわけですが、一応確認してみました。</p> <h2>確認</h2> <p>念の為に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%ED%CC%B3%BE%CA">総務省</a>管轄の「近畿合同通信局」に問い合わせてみたところ、 <strong>上記の考え方でまちがいないとの回答をいただきました。</strong> というわけで 「papyr」は日本で利用するにあたって何も問題はありません。</p> <h2>まとめ</h2> <p>TELEC(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>)だけでなく他にもいろんな決まりがあるのでよくよく確認しましょう。</p> irieda