Neural Network Libraries (Nnabla) で作った AI を SPRESENSE で動かす! [AI]
SPRESENSEに動かすのはここで紹介したコードに次のコードを追記します。
■ Import に nnabla.util.save を追加
ネットワークをメディアに出力するためのユーティリティです。コードの冒頭に追加してください。
import nnabla.utils.save as Save
■ ネットワークをメディアに出力する
NNP というファイルを一旦出力します。フォーマットの詳細はよくわかりませんが、このチュートリアルを参考にしました。次のコードをPythonコードの最後に追加してください。
## save the model contents = { 'networks' : [ {'name': 'sindet' ,'batch_size': batch_size ,'outputs': {'result': result} ,'names' : {'input': input_data} } ] , 'executors' : [ {'name': 'runtime' ,'network': 'sindet' ,'data': ['input'] ,'output': ['result'] } ] } Save.save('sindet.nnp', contents)
次にSPRESENSE が読み込めるようにここで保存したNNPデータを変換します。
■ NNPファイルをNNBに変換する
SPRESENSE で読み込めるようにするには "NNB" という形式に変換しなければなりません。コマンドラインアプリを使って変換することができます。詳しくはこちらを参照してください。
$ nnabla_cli convert -b 1 sindet.nnp sindet.nnb [nnabla][INFO]: Initializing CPU extension... NNabla command line interface (Version:1.7.0, Build:200401213820) Importing sindet.nnp Expanding sindet.
■ "sindet.nnb" を SDカードにコピーして SPRESENSE に差し込む
"sindet.nnb" というファイルが生成されるので、それをSDカードにコピーして、SPRESENSEの拡張ボードのSDカードスロットに差し込みましょう。
■ テスト用の Arduino スケッチを SPRESENSE に書き込みを動作確認をする
Arduino IDE を使って、テスト用の Arduino スケッチを書き込みます。SPRESENSE のコードも Python で書けると楽だなと思いましたが、 CircuitPython では まだ DNNRT ライブラリはサポートされていないみたいですね…。もう少し待ちましょう。
#include <SDHCI.h> #include <DNNRT.h> #include <math.h> DNNRT dnnrt; SDClass SD; float input_data[64]; float output_data[64]; void setup() { int ret; Serial.begin(115200); SD.begin(); File nnbfile = SD.open("sindet.nnb"); if (!nnbfile) { Serial.println("nnb not found"); return; } ret = dnnrt.begin(nnbfile); if (ret < 0) { Serial.println("DNNRT initialization failure: " + String(ret)); return; } DNNVariable input(64); float *d = input.data(); for (int i = 0; i < 64; ++i) { d[i] = input_data[i] = sin(i/10.0) + float(random(-3, 4))/10.0; } dnnrt.inputVariable(input, 0); dnnrt.forward(); DNNVariable output = dnnrt.outputVariable(0); Serial.print("sin,"); Serial.print("input,"); Serial.println("output"); for (int i = 0; i < 64; ++i) { Serial.print(String(sin(i/10.0)) + ","); Serial.print(String(input_data[i]) + ","); Serial.println(String(output[i])); } dnnrt.end(); } void loop() { // put your main code here, to run repeatedly: }
結果を見てみましょう!
おお、いい感じに出ました!うまくいきましたね。これで、Neural Network Libraries で作った AI も SPRESENSE で動かすことができるようになりました!😆
(^^)/~
ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング
- 出版社/メーカー: リックテレコム
- 発売日: 2018/11/14
- メディア: 単行本(ソフトカバー)
SONY SPRESENSE メインボード CXD5602PWBMAIN1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
SONY SPRESENSE 拡張ボード CXD5602PWBEXT1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
Neural Network Libraries (Nnabla) を使って「Auto Encoder」を実装してみた! [AI]
Auto Encoder は Deep Learning の中では比較的簡単なものですので、入門にはちょうど良い例題だと思います。(もうちょっと簡単にできるとよかったのですが…)
今回、学習させるデータはSin波です。トレーニングデータは、Sin派に±0.3のノイズを加えて生成しました。まずは Python のコードの全体を貼っておきます。(そのうち github に上げます)
# neural network libraries import nnabla as nn import nnabla.functions as F import nnabla.parametric_functions as PF import nnabla.solvers as S # other libraries import random import numpy as np import matplotlib.pyplot as plt # define the neural network def network(y): h = PF.affine(y, 256, name = "a1") h = F.relu(h) h = PF.affine(y, 128, name = "a2") h = F.relu(h) h = PF.affine(h, 32, name = "a3") h = F.relu(h) h = PF.affine(y, 128, name = "a4") h = F.relu(h) h = PF.affine(h, 256, name = "a5") h = F.relu(h) h = PF.affine(h, 64, name = 'a6') return h ## setup neuralnetwork nn.clear_parameters() batch_size = 1 input_teacher_data = nn.Variable((batch_size, 64)) input_training_data = nn.Variable((batch_size, 64)) output_data = network(input_test_data) ## setup loss function #loss = F.mean(F.squared_error(output_data, input_teacher_data)) loss = F.mean(F.squared_error(output_data, input_training_data)) solver = S.Adam() solver.set_parameters(nn.get_parameters()) ## generate teacher data x = [n for n in np.arange(0.0, 6.4, 0.1)] teacher_data = [np.sin(n) for n in x] ## for graph plot loss_list = [] step = [] y_list = [] ## do training epoch = 1000 for i in range(epoch): # generate training data training_data = [np.sin(n) + random.uniform(-0.3, 0.3) for n in x] y_list.append(training_data) #input_teacher_data.d = teacher_data input_training_data.d = training_data # do deep learning loss.forward() solver.zero_grad() loss.backward() solver.update() loss_list.append(loss.d.copy()) step.append(i) ## display test data for i in range(epoch): plt.plot(x, y_list[i]) plt.title("Training Data") plt.grid(True) plt.show() ## display training progress plt.plot(step, loss_list) plt.title("Training Error") plt.xlabel("step") plt.ylabel("loss") plt.grid(True) plt.show() ## generate validation data val_data = [np.sin(n) + random.uniform(-0.3, 0.3) for n in x] ## do inference batch_size = 1 input_data = nn.Variable((batch_size, 64)) result = network(input_data) input_data.d = val_data result.forward() output = result.d.copy().reshape(64,).tolist() ## display the result sin = [np.sin(n) for n in x] plt.plot(x, val_data, label="input data") plt.plot(x, output, label="result data", linewidth=3.0) plt.plot(x, sin, label="sin data", color="red", linestyle="dashed") plt.legend() plt.title("Input and Result") plt.grid(True) plt.show()
ここから細かくコードを解説していきます。(トーシローなんで間違っているかも知れません。もし間違っていたら指摘いただけると助かります)
■ Import する各種ライブラリ
nnabla の各種ライブラリと、numpyとグラフを表示のための matplot をインポートします。
# neural network libraries import nnabla as nn import nnabla.functions as F import nnabla.parametric_functions as PF import nnabla.solvers as S # other libraries import random import numpy as np import matplotlib.pyplot as plt
■ AutoEncoder のニューラルネットワークを構築する
Auto Encoder は Affine と Relu で構成してみました。層やノードの数は適当に決めています。適当に値を変えてみたり、活性化関数を変えてみて様子を見てみると面白いかもしれません。
# define the neural network def network(y): h = PF.affine(y, 256, name = "a1") h = F.relu(h) h = PF.affine(y, 128, name = "a2") h = F.relu(h) h = PF.affine(h, 32, name = "a3") h = F.relu(h) h = PF.affine(y, 128, name = "a4") h = F.relu(h) h = PF.affine(h, 256, name = "a5") h = F.relu(h) h = PF.affine(h, 64, name = 'a6') return h
■ ニューラルネットワークをセットアップする
・Nnabla のパラメータの消去
nnabla が保持しているパラメータをnn.clear_parameters()で消去しておきます。これがないと、ニューラルネットの構成を変えるとエラーが出ます。
・バッチサイズの指定
batch_size は1にしてみました。都度データを生成して学習させるので、複数のデータを一度に与えるのが面倒だったからというのが真相です。
・コンテナの定義
nn.Variableは、ニューラルネットにデータを渡すためのコンテナです。学習や推論を行うときはデータをこのコンテナに格納して渡します。
## setup neuralnetwork nn.clear_parameters() batch_size = 1 input_teacher_data = nn.Variable((batch_size, 64)) input_training_data = nn.Variable((batch_size, 64)) output_data = network(input_test_data)
■ 損失関数をセットアップする
ここでは損失関数と学習を進めるための Solver を設定します。Solver は平たく言えば最小二乗法のような損失を小さくするための数学的な道具です。
・損失関数:F.mean(F.squared_error(output_data, input_training_data))
ここでは出力値と入力値の二乗平均誤差を出しています。いわゆる教師なし学習です。コメントアウトしているコードは、入力データに誤差のない純粋な Sin波を教師データとして与えています。教師ありと教師無しデータでどのように結果が違うかぜひ試してみてください。
・ソルバー:S.Adam()
正直よく知りません。与えるパラメータが少なく便利なので使ってみました。他のソルバーで試してみて結果がどう変わるか観察してみると面白いかもしれません。詳しくはこちらを参照してください。
## setup loss function #loss = F.mean(F.squared_error(output_data, input_teacher_data)) loss = F.mean(F.squared_error(output_data, input_training_data)) solver = S.Adam() solver.set_parameters(nn.get_parameters())
■ 教師データならびにグラフ描画用の変数の設定
教師データを使った学習を行う場合は、teacher_data を使ってください。他はグラフプロット用の変数宣言です。
## generate teacher data x = [n for n in np.arange(0.0, 6.4, 0.1)] #teacher_data = [np.sin(n) for n in x] ## for graph plot loss_list = [] step = [] y_list = []
■ 学習(ディープラーニング)用のループ処理
学習回数(Epoch)は1000回としました。
・学習用データを生成
training_data = [np.sin(n) + random.uniform(-0.3, 0.3) for n in x] がそれにあたります。少しトリッキーなコードですが、0.0~6.3 までのサインデータに±0.3 のランダムデータを加えて学習用データとしています。
・コンテナの学習用データを格納
input_training_data.d = training_data で、コンテナに学習用データを設定しています。こうすることで、ニューラルネットワークにデータを渡すことができます。
・学習を実施
loss.forward() / solver.zero_grad() / loss.backward() / solver.update() が学習の基本ルーチンと思ってください。損失関数で値を出して、前回との差分を勾配降下法で逆伝搬させパラメータを調整して差を縮めていくという処理です。使う側にとっては、この程度の理解で十分かと。
## do training epoch = 1000 for i in range(epoch): # generate training data training_data = [np.sin(n) + random.uniform(-0.3, 0.3) for n in x] y_list.append(training_data) #input_teacher_data.d = teacher_data input_training_data.d = training_data # do deep learning loss.forward() solver.zero_grad() loss.backward() solver.update() loss_list.append(loss.d.copy()) step.append(i)
■ 推論を実行する
学習が終わったので、推論を実行します。
・テスト用データの生成
val_data = [np.sin(n) + random.uniform(-0.3, 0.3) for n in x] で学習用データと同じ要領でデータ生成します。
・ニューラルネットワークの設定
input_data = nn.Variable((batch_size, 64)) , result = network(input_data) で、コンテナの準備とニューラルネットワークの設定を行います。
・推論を実行
input_data.d = val_data でテスト用データをコンテナに格納し、 result.forward() で推論が実行されます。
・出力データを取得
出力したデータの次元は (1, 64) になっているので、output = result.d.copy().reshape(64,).tolist() で出力を 64要素を持つリストにして出力します。グラフに描画するための処理です。
## generate validation data val_data = [np.sin(n) + random.uniform(-0.3, 0.3) for n in x] ## do inference batch_size = 1 input_data = nn.Variable((batch_size, 64)) result = network(input_data) input_data.d = val_data result.forward() output = result.d.copy().reshape(64,).tolist()
■ 出力結果をみてみる
学習用データをすべてグラフにマップしたものです。このデータを使って学習しました。
学習の過程を示したグラフです。うまく収束しているみたいですね。
これが結果です。青がテスト用データ。オレンジが AutoEncoder の出力。点線が純粋な Sin波です。
結果はまぁまぁかな。教師ありでの学習もぜひ試してみてください。もっと良い結果が出ると思います。🙂
(^^)/~
ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング
- 出版社/メーカー: リックテレコム
- 発売日: 2018/11/14
- メディア: 単行本(ソフトカバー)
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤 康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
Neural Network Libraries (Nnabla) を WSL にインストールしてみた [AI]
https://nnabla.org/ja/
公式は Docker を使うことを推奨しています。GPUを使えるのは大きな利点ですが、やはり少し使いにくい。WSL で使えるとかなり楽なので、次のサイトを参考に Nnabla をインストールしてみることにしました。WSLのインストールが必要な場合はこちらを参照してください。
Windows(WSL)にNeural Network Librariesをインストールする
https://cpp-learning.com/sony_nnabla_nnl/
とはいうものの、私の場合はこの手順では途中でエラーになってしまったので、備忘録を兼ねて手順を記録していきます。
■ STEP1 pip3 をインストールする
WSL の Ubuntu アプリははデフォルトでは Python3 は入っているのですが、なぜか pip3 が入っていないので、インストールしましょう。
$ sudo apt update $ sudo apt install python3-pip
■ STEP2 Nnabla をインストールする
次にご本尊の Neural Network Libraries (Nnabla) をインストールします。インストールが終わったら、which nnabla_cli とコマンドを打って正しくパスが通っているか確認してください。
$ pip3 install nnabla $ echo 'export PATH=~/.local/bin:$PATH' >> ~/.profile $ source ~/.profile $ which nnabla_cli /home/ystaro/.local/bin/nnabla_cli
■ STEP3 各種ツールをインストール
Python と Neural Network Libraries だけがあっても何もできないので、よく使うツールをインストールします。
$ pip3 install scikit-learn $ pip3 install matplotlib $ pip3 install opencv-python $ pip3 iPython $ pip3 install jupyter
それぞれのライブラリの詳細は次を参照ください。
■ Scikit-learnとは?5分で分かるScikit-learnのメリットや機能まとめ
https://ai-kenkyujo.com/2020/02/28/scikit-learn/
■ すぐわかる!matplotlibライブラリの使い方
https://www.sejuku.net/blog/54285
■ OpenCVとPythonで始める画像処理
https://postd.cc/image-processing-101/
■ IPythonの使い方
https://qiita.com/5t111111/items/7852e13ace6de288042f
■ Jupyter notebook を使ってみた
https://makers-with-myson.blog.ss-blog.jp/2020-05-22
次から Jupiter notebook で Neural Network Libraries (Nnabla) を使ってみたいと思います!(ほとんどサンプルがないので結構きっついですけど😕)
(´・ω・`;)
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤 康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション- (Machine Learning)
- 作者: 我妻 幸長
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/08/28
- メディア: 単行本
いよいよ緊急事態宣言解除が間近!社会復帰の準備は大丈夫? [4コマ漫画]
会社に行くのは実に2ヶ月ぶり。さらにテレワークを開始してから3ヶ月経過しています。この間に受験生だった息子は大学生になるというイベントもあり、テレワークを開始したのがもう半年前に感じます。
そのせいか、久しぶりの通勤が…
いやー通勤ヤバいです。足腰が想像以上に弱ってます。毎日スクワットをしていたのですが、それだけでは足りないみたいです。通勤って良いエクササイズになってたんですねー。
そろそろランニングを復活させないと、これから再開する会社生活もたないかも…😟
(´・ω・`)
コロナショック・サバイバル 日本経済復興計画 (文春e-book)
- 作者: 冨山 和彦
- 出版社/メーカー: 文藝春秋
- 発売日: 2020/04/30
- メディア: Kindle版
Jupyter notebook を使ってみた [徒然日記]
■ Jupyter Notebook をインストールする
jyuputar notebook はWSLや Linux で使うことになります。インストールは pip コマンドで簡単に行えます。python や pip はあらかじめインストールしておいてください。
$ pip3 install numpy scipy matplotlib Pillow ipython $ pip3 install jupyter
■ Jupyter Notebook の拡張機能をインストールする
私は、VIM使いなので、編集画面はVIMを使いたいので拡張機能を入れてみました。
$ pip3 install jupyter-contrib-nbextensions
拡張モジュールの詳細はこちらを参照ください。
Pythonのツール『Jupyter Notebook』に導入するオススメの拡張機能の5選!
https://ametoame.com/jupyter-nbextensions/
しかし、拡張機能を入れても "Nbextensions" のタブが出てきません。いろいろと探して試しみて、次のコマンドでようやく解決しました。
$ python .local/lib/python3.6/site-packages/jupyter_contrib_core/application.py nbextension install --user
解決方法はこちらのサイトを参考にさせてもらいました。
JupyterNotebookでnbextensionsのエラーとの戦い
https://murabitoleg.com/mac-nbextensions/
■ VIM拡張機能をインストールする
これで、ようやくVIM拡張をインストールできます。VIM拡張は github からソースコードをクローンしてきます。ホームのディレクトリは適当に変えてコマンドを打ってください。
$ $ git clone https://github.com/lambdalisue/jupyter-vim-binding /home/ystaro/.local/share/jupyter/nbextensions/vim_binding
これで、Python の編集をVIMのキーストロークを使えます。その他、Jupyter のテーマを変更できるものもあります。VIM のインストールの仕方も含めて、次のサイトが参考になりますので興味ある方はご覧ください!
JupyterNotebookにVimの力を加えると、光と闇が両方そなわり最強に見える https://qiita.com/_snow_narcissus/items/80f81926707807ee9bf1
それでは楽しいPythonプログラミングを! 😄
(^^)/~
東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~
- 出版社/メーカー: マイナビ出版
- 発売日: 2019/03/14
- メディア: 単行本(ソフトカバー)
Adafruit Twinket M0 を CircuitPython で動かしてみた! [徒然日記]
基板が小さい!大きさはおおよそ 15mm x 27mm です。これSPRESENSEのアドオンボードにできるレベルですね。電源を入れるといきなり、CIRCUITPY:ドライブが見えました。CircuitPython がプリインストールされていました。
しかも NeoPixel がオンボードで光り方が変わって綺麗!!SPRESENSE でこの NeoPixel のライブラリ使えるかなぁ。使えねぇだろうなぁ。
ご参考までにこんなコードが書かれていました。思ったよりも複雑…
# Trinket IO demo # Welcome to CircuitPython 3.1.1 :) import board from digitalio import DigitalInOut, Direction, Pull from analogio import AnalogOut, AnalogIn import touchio from adafruit_hid.keyboard import Keyboard from adafruit_hid.keycode import Keycode import adafruit_dotstar as dotstar import time import neopixel # One pixel connected internally! dot = dotstar.DotStar(board.APA102_SCK, board.APA102_MOSI, 1, brightness=0.2) # Built in red LED led = DigitalInOut(board.D13) led.direction = Direction.OUTPUT # Analog input on D0 analog1in = AnalogIn(board.D0) # Analog output on D1 aout = AnalogOut(board.D1) # Digital input with pullup on D2 button = DigitalInOut(board.D2) button.direction = Direction.INPUT button.pull = Pull.UP # Capacitive touch on D3 touch = touchio.TouchIn(board.D3) # NeoPixel strip (of 16 LEDs) connected on D4 NUMPIXELS = 16 neopixels = neopixel.NeoPixel(board.D4, NUMPIXELS, brightness=0.2, auto_write=False) # Used if we do HID output, see below kbd = Keyboard() ######################### HELPERS ############################## # Helper to convert analog input to voltage def getVoltage(pin): return (pin.value * 3.3) / 65536 # Helper to give us a nice color swirl def wheel(pos): # Input a value 0 to 255 to get a color value. # The colours are a transition r - g - b - back to r. if (pos < 0): return (0, 0, 0) if (pos > 255): return (0, 0, 0) if (pos < 85): return (int(pos * 3), int(255 - (pos*3)), 0) elif (pos < 170): pos -= 85 return (int(255 - pos*3), 0, int(pos*3)) else: pos -= 170 return (0, int(pos*3), int(255 - pos*3)) ######################### MAIN LOOP ############################## i = 0 while True: # spin internal LED around! autoshow is on dot[0] = wheel(i & 255) # also make the neopixels swirl around for p in range(NUMPIXELS): idx = int ((p * 256 / NUMPIXELS) + i) neopixels[p] = wheel(idx & 255) neopixels.show() # set analog output to 0-3.3V (0-65535 in increments) aout.value = i * 256 # Read analog voltage on D0 print("D0: %0.2f" % getVoltage(analog1in)) # use D3 as capacitive touch to turn on internal LED if touch.value: print("D3 touched!") led.value = touch.value if not button.value: print("Button on D2 pressed!") # optional! uncomment below & save to have it sent a keypress #kbd.press(Keycode.A) #kbd.release_all() i = (i+1) % 256 # run from 0 to 255 #time.sleep(0.01) # make bigger to slow down
動いている様子を見たい方はこちらの動画をどうぞ!😃
(^^)/~
CircuitPython が動く Adafruit Trinket M0 を買って動かしてみた。ちっさ!CircuitPython がプリインストールされていて、USB挿したらいきなり動いた。 なんとNeopixel がオンボード!SPRESENSEと連携したら何か面白いことできるかな。#CircuitPython #Adafurit #TrinketM0 pic.twitter.com/yb3sPqjhpq
— よしのたろう (@Taro_Yoshino) May 20, 2020
Adafruit Trinket M0(CircuitPython/Arduino IDE用)
- 出版社/メーカー: スイッチサイエンス
- メディア:
Adafruit Circuit Playground Express - Microsoft MakeCode 対応
- 出版社/メーカー: Adafruit
- メディア: エレクトロニクス
SPRESENSE用 CircuitPython で 9軸センサー (LSM9DS1) を動かしてみた [SPRESENSE]
動かすには、adafruit のライブラリバンドルのZIPをダウンロードしてくると便利です。最新の VERSION 5.x 版を持ってきましょう。
https://circuitpython.org/libraries
ダウンロードして展開すると様々なライブラリがありますが、今回重要なのは次の3つです。
adafruit-circuitpython-bundle-5.x-mpy-20200516 │ ├── README.txt ├── VERSIONS.txt ├── examples │ ├── lsm9ds1_simpletest.py │ └── lib ├── adafruit_bus_device │ ├── __init__.py │ ├── i2c_device.mpy │ └── spi_device.mpy ├── adafruit_lsm9ds1.mpy
CircuitPython はあらかじめ SPRESENSE に書き込んでおきましょう。書き込み方は次のブログに記載されています。
SPRESENSE で "CircuitPython" を動かしてみた!
https://makers-with-myson.blog.ss-blog.jp/2020-05-08
SPRESENSEの拡張ボード側のUSBコネクタに接続すると、"CIRCUITPY:"ドライブが見えます。
"adafruit_lsm9ds1.mpy" と "adafruit_bus_device" はフォルダごと、"CIRCUITPY:" ドライブの ”lib” フォルダーにコピーしちゃいます。
次に、example のコード "lsm9ds1_simpletest.py" を”CIRCUITPY:”ドライブのルートに "code.py" として保存します。
"code.py" は次のように非常にシンプルです。RTOS で Python でセンサー処理って新鮮ですね。
# Simple demo of the LSM9DS1 accelerometer, magnetometer, gyroscope. # Will print the acceleration, magnetometer, and gyroscope values every second. import time import board import busio import adafruit_lsm9ds1 # I2C connection: i2c = busio.I2C(board.SCL, board.SDA) sensor = adafruit_lsm9ds1.LSM9DS1_I2C(i2c) # SPI connection: # from digitalio import DigitalInOut, Direction # spi = busio.SPI(board.SCK, board.MOSI, board.MISO) # csag = DigitalInOut(board.D5) # csag.direction = Direction.OUTPUT # csag.value = True # csm = DigitalInOut(board.D6) # csm.direction = Direction.OUTPUT # csm.value = True # sensor = adafruit_lsm9ds1.LSM9DS1_SPI(spi, csag, csm) # Main loop will read the acceleration, magnetometer, gyroscope, Temperature # values every second and print them out. while True: # Read acceleration, magnetometer, gyroscope, temperature. accel_x, accel_y, accel_z = sensor.acceleration mag_x, mag_y, mag_z = sensor.magnetic gyro_x, gyro_y, gyro_z = sensor.gyro temp = sensor.temperature # Print values. print( "Acceleration (m/s^2): ({0:0.3f},{1:0.3f},{2:0.3f})".format( accel_x, accel_y, accel_z ) ) print( "Magnetometer (gauss): ({0:0.3f},{1:0.3f},{2:0.3f})".format( mag_x, mag_y, mag_z) ) print( "Gyroscope (degrees/sec): ({0:0.3f},{1:0.3f},{2:0.3f})".format( gyro_x, gyro_y, gyro_z ) ) print("Temperature: {0:0.3f}C".format(temp)) # Delay for a second. time.sleep(1.0)
Pythonコードを保存すると、Teraterm 等のターミナルにセンサー出力がプリントされます。これは、お手軽ですねー。
".mpy" はPythonコードなのかなと思ったのですが、開いてみるとバイナリーコードでした。そのうちどうやって作るのか探ってみたいと思います。😃
(^^)/~
SONY SPRESENSE メインボード CXD5602PWBMAIN1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
Adafruit Trinket M0(CircuitPython/Arduino IDE用)
- 出版社/メーカー: スイッチサイエンス
- メディア:
【痛風おじさん】痛風発作再び??? [4コマ漫画]
昔、水を溜めたことのある膝なのですが、特に運動をしたわけでもなく、どこかに当てた覚えもありません。でも、立てないくらいの痛さだったので、カミさんに病院に連れて行ってもらいました。
病院はコロナに備えて看護婦さんも含め厳重装備。でもガラガラだったので感染の心配はなさそうです。よかった。で、かかりつけの先生に見てもらったところ…。
尿酸値は低いものの痛風だったようです。運動不足も祟って、溜まった尿酸が吐き出されていなくて発症したみたいです。薬飲んでるからって、調子に乗って晩酌をしてしまった私の自業自得ですが、コロナが終息するまでお酒はおあずけになってしまいました。トホホ…😪
(´・ω・`)
スーパー図解 痛風・高尿酸血症 : 確実に尿酸をコントロールして激痛発作を防ぐ (トップ専門医の「家庭の医学」シリーズ)
- 出版社/メーカー: 法研
- 発売日: 2015/03/13
- メディア: Kindle版
SPRESENSE用”CircuitPython”のビルド環境を作ろう!(CircuitPythonビルド編) [SPRESENSE]
【STEP1】 MicroPython のビルド
最初に”CircuitPython”のベースとなっているクロスプラットフォーム向け "MicroPython" のビルドを行います。環境の設定を失敗していなければ何事もなく終わるはずです。
$ cd circuitpython $ make -C mpy-cross
【STEP2】 CircuitPython のビルド
次にいよいよ SPRESENSE用の CircuitPython のビルドを行います。ここが少しハマるポイントですね。SPRESENSE用のコードはなんと、cxd56 ディレクトリ配下にあります。(grep すればすぐに見つけられますが)
... @circuitpython directory から ... $ cd ports/cxd56 $ make BOARD=spresense
SPRESENSEのプロセッサの名前は cxd5602 なので cxd56 ディレクトリにあるみたいです。これは普通分からないですよねぇ。
【STEP3】ブートローダのダウンロード(必要なひとのみ)
新たに購入した人や久しぶりにSPRESENSEを引っ張り出してきた人は、ブートローダーの更新を行う必要があります。すでに、Arduino Library や SDK で最新のブートローダーの書き込みを行っている人は必要ありません。
現在の最新のブートローダー V1.5.1 は次のURLにありますので、そこから "spresense-binaries-v1.5.1.zip" がダウンロードできます。(バージョンによってURLは異なります)
https://developer.sony.com/file/download/download-spresense-firmware-v1-5-001
ここでは仮に "C:\Users\Default\Downloads"にダウンロードしたと仮定します。
書き込みを行うために、ダウンロードしたブートローダのZIPファイルを "circuitpython/spresense-exported-sdk/firmware" に展開します。
... @circuitpython/ports/cxd56 directory から ... $ cd spresense-exported-sdk $ mkdir firmware $ cd firmware $ cp /mnt/c/Users/Default/Downloads/spresense-binaries-v1.5.1.zip . $ sudo apt install unzip $ unzip spresense-binaries-v1.5.1.zip $ cd ../..
【STEP4】SPRESENSEへイメージの書込み
ここで、PCに接続したUSBケーブルをSPRESENSEをメインボード側に挿します。
この時、COMの何番にSPRESENSEが接続されているか確認してください。ここでは、仮に"COM7"に接続されたとします。次のコマンドで、必要な人はブートローダーの書き込みと、CircuitPython イメージの書き込みが行えます。
... @circuitpython directory にて ... SPRESENSEが「COM7」に接続されている前提 $ make BOARD=spresense SERIAL=/dev/ttyS7 flash-bootloader (必要な人のみ) $ make BOARD=spresense SERIAL=/dev/ttyS7 flash
Linuxですので、"COMxx"という名称ではハードウェアにアクセスできません。"/dev/ttySxx" と読み替えます。今回は "COM7" ですので "/dev/ttyS7" になります。これで CircuitPython の書き込みが完了しました。
【STEP5】PythonコードをSPRESENSEで動かす
USBケーブルを今度は拡張ボード側に挿しましょう。
すると、PCに新しく "CIRCUITPY:" というドライブが見えます。
そのドライブの中に code.py というものがありますので、次のようにコードを編集し保存します。
import board import digitalio import time led = digitalio.DigitalInOut(board.LED0) led.direction = digitalio.Direction.OUTPUT while True: led.value = True time.sleep(0.5) led.value = False time.sleep(0.5)
すると、あら不思議!コードを保存したとたんにLEDが光りだします。これはお手軽ですね!
おっ、SPRESENSE で CircuitPython 動いた!Lチカ成功!
— よしのたろう (@Taro_Yoshino) May 7, 2020
CircuitPython on Spresense is working!! Blinking the LED0 is successful.
思ったよりも簡単だったな。拡張ボード必須というのがイマイチだけど。LTE-M拡張ボードで試してみたいな。#Spresense #CircuitPython #Adafruit pic.twitter.com/VKQcTOsqcU
ぜひ試してみてください!😉
(^^)/~
SONY SPRESENSE メインボード CXD5602PWBMAIN1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
SONY SPRESENSE 拡張ボード CXD5602PWBEXT1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
SPRESENSE用”CircuitPython”のビルド環境を作ろう!(ビルドツリー準備編) [SPRESENSE]
例によってコマンドの羅列だけで、コマンドが出力するメッセージは省略します。最初にビルドに必要なツールやライブラリをインストールします。
$ sudo apt update $ sudo apt install git $ sudo apt install gettext $ sudo apt install python3-pip $ pip3 install huffman
これが終わったら ARM用のGCCクロスコンパイラをダウンロードしてくる必要があります。昔は apt-get で入手できたのですが、そのサービスは終了したようです。次のURLから直接ダウンロードしてきてください。
GCC ARM 9-2019-q4-major version.
https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/RC2.1/gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2
ここでは仮に "C:\Users\Default\Downloads" にダウンロードしたとします。ダウンロードしたファイルを WSL の Ubuntu からコピーして展開します。ここでは bin ディレクトリを作ってそこにコピーしています。
$ mkdir bin $ cp /mnt/c/Users/Default/Downloads/gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2 ./bin $ cd bin $ tar xvf gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2 $ cd ..
WSLからWindowsの各ドライブには、 "/mnt/c", "/mnt/d" という具合にアクセスできます。
これで、~/bin ディレクトリにクロスコンパイラが展開できましたので、利用できるようにパスを設定してあげます。
$ echo 'export PATH=~/bin/gcc-arm-none-eabi-9-2019-q4-major/bin:$PATH' >> ~/.profile $ source ~/.profile $ which arm-none-eabi-gcc /home/ystaro/bin/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-gcc $
最後に"which"コマンドでパスが通じているか確認をします。これでビルドする環境はすべて整いました。いよいよ "CircuitPython" のビルドツリーを持ってきます。
$ git clone https://github.com/adafruit/circuitpython.git $ cd circuitpython/ $ git submodule sync $ git submodule update --init --recursive
お疲れ様でした。これで環境面の設定はすべて完了です!😁
次はいよいよ SPRESENSE用の CircuitPython をビルドして動かしてみたいと思います!
(^^)/~
WSL構築と利用―Windows10で利用するLinux環境
- 作者: 川口 直也
- 出版社/メーカー: カットシステム
- 発売日: 2020/01/01
- メディア: 単行本
SONY SPRESENSE メインボード CXD5602PWBMAIN1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware