SSブログ

Neural Network Libraries (Nnabla) で作った AI を SPRESENSE で動かす! [AI]

今回は、前回 Neural Network Libraries (Nnabla) で作った AI (Auto Encoder) を SPRESENSE で動かしてみたいと思います!そもそも Nnabla を使ったのは、これが目的ですからね。


DSC_0991.JPG


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カードスロットに差し込みましょう。

2020-05-31 (1).png


■ テスト用の 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:

}


結果を見てみましょう!


2020-05-31.png


おお、いい感じに出ました!うまくいきましたね。これで、Neural Network Libraries で作った AI も SPRESENSE で動かすことができるようになりました!😆
(^^)/~





ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

  • 出版社/メーカー: リックテレコム
  • 発売日: 2018/11/14
  • メディア: 単行本(ソフトカバー)



SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware




nice!(23)  コメント(0) 
共通テーマ:趣味・カルチャー

Neural Network Libraries (Nnabla) を使って「Auto Encoder」を実装してみた! [AI]

ディープラーニング・トーシローの私が、Neural Network Libraries を使って簡単な「Auto Encoder」を実装してみました!Auto Encoder は、たくさんのデータを使って、おおまかな形を覚えさせ、ノイズの入ったデータもそれらしく出力するというものです。


AutoEncoder.png


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()



■ 出力結果をみてみる
学習用データをすべてグラフにマップしたものです。このデータを使って学習しました。

2020-05-30.png


学習の過程を示したグラフです。うまく収束しているみたいですね。

2020-05-30 (1).png


これが結果です。青がテスト用データ。オレンジが AutoEncoder の出力。点線が純粋な Sin波です。

2020-05-30 (1).png


結果はまぁまぁかな。教師ありでの学習もぜひ試してみてください。もっと良い結果が出ると思います。🙂
(^^)/~




ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

  • 出版社/メーカー: リックテレコム
  • 発売日: 2018/11/14
  • メディア: 単行本(ソフトカバー)



はじめての「SonyNNC」 (I・O BOOKS)

はじめての「SonyNNC」 (I・O BOOKS)

  • 作者: 良一, 柴田
  • 出版社/メーカー: 工学社
  • 発売日: 2019/08/01
  • メディア: 単行本



ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)




nice!(24)  コメント(0) 
共通テーマ:趣味・カルチャー

Neural Network Libraries (Nnabla) を WSL にインストールしてみた [AI]

ソニーの Neural Network Console は便利なAIツールですが、便利なだけに少し柔軟性に欠けるところがあります。その Neural Network Console のエンジンとなるのが Neural Network Libraries (Nnabla) です。 Python や C++ で AI を記述できるのがウリです。


2020-05-26.png
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で学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



最短コースでわかる ディープラーニングの数学

最短コースでわかる ディープラーニングの数学

  • 作者: 赤石 雅典
  • 出版社/メーカー: 日経BP
  • 発売日: 2019/04/11
  • メディア: 単行本



はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション- (Machine Learning)

はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション- (Machine Learning)

  • 作者: 我妻 幸長
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/08/28
  • メディア: 単行本




nice!(23)  コメント(0) 
共通テーマ:趣味・カルチャー

いよいよ緊急事態宣言解除が間近!社会復帰の準備は大丈夫? [4コマ漫画]

いよいよ首都圏の緊急事態宣言解除が間近に迫ってきましたね!社会が動きはじめた兆候なのか、会社あてに私宛の荷物が届きました。だいぶ前に発注したものだったのですが、ようやく届きました。会社から引り取りに来てほしいという連絡があったので、その日のうちに向かいました。

会社に行くのは実に2ヶ月ぶり。さらにテレワークを開始してから3ヶ月経過しています。この間に受験生だった息子は大学生になるというイベントもあり、テレワークを開始したのがもう半年前に感じます。

そのせいか、久しぶりの通勤が…


社会復帰1.png


いやー通勤ヤバいです。足腰が想像以上に弱ってます。毎日スクワットをしていたのですが、それだけでは足りないみたいです。通勤って良いエクササイズになってたんですねー。

そろそろランニングを復活させないと、これから再開する会社生活もたないかも…😟
(´・ω・`)





アフターコロナ 見えてきた7つのメガトレンド

アフターコロナ 見えてきた7つのメガトレンド

  • 出版社/メーカー: 日経BP
  • 発売日: 2020/06/02
  • メディア: ムック



「新型コロナ恐慌」後の世界

「新型コロナ恐慌」後の世界

  • 作者: 渡邉哲也
  • 出版社/メーカー: 徳間書店
  • 発売日: 2020/03/27
  • メディア: 単行本(ソフトカバー)



コロナショック・サバイバル 日本経済復興計画 (文春e-book)

コロナショック・サバイバル 日本経済復興計画 (文春e-book)

  • 作者: 冨山 和彦
  • 出版社/メーカー: 文藝春秋
  • 発売日: 2020/04/30
  • メディア: Kindle版




nice!(22)  コメント(2) 
共通テーマ:趣味・カルチャー

Jupyter notebook を使ってみた [徒然日記]

Python ビギナーの私は最近になって「Jupyter notebook」の存在を知りました。それ何のノートパソコンって感じですが、実は Python の開発環境です。Web インターフェースで、図表の表示やらを簡単にできてとっても便利です。

jupyternotebook.png


■ 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で手を動かして学ぶデ―タ分析~

東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~

  • 出版社/メーカー: マイナビ出版
  • 発売日: 2019/03/14
  • メディア: 単行本(ソフトカバー)



PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/09/09
  • メディア: 大型本



データ分析ツールJupyter入門

データ分析ツールJupyter入門

  • 作者: 掌田津耶乃
  • 出版社/メーカー: 秀和システム
  • 発売日: 2018/05/31
  • メディア: 単行本




nice!(21)  コメント(0) 
共通テーマ:趣味・カルチャー

Adafruit Twinket M0 を CircuitPython で動かしてみた! [徒然日記]

SPRESENSE で CircuitPython を動かしてみましたが、他のボードではどんなだろうと思って、Adafruit 純正の "Trinket M0" を試してみました!


DSC_0994.JPG


基板が小さい!大きさはおおよそ 15mm x 27mm です。これSPRESENSEのアドオンボードにできるレベルですね。電源を入れるといきなり、CIRCUITPY:ドライブが見えました。CircuitPython がプリインストールされていました。


2020-05-20.png


しかも NeoPixel がオンボードで光り方が変わって綺麗!!SPRESENSE でこの NeoPixel のライブラリ使えるかなぁ。使えねぇだろうなぁ。


TrinketM0.jpg


ご参考までにこんなコードが書かれていました。思ったよりも複雑…

# 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



動いている様子を見たい方はこちらの動画をどうぞ!😃
(^^)/~









Adafruit Trinket M0(CircuitPython/Arduino IDE用)

Adafruit Trinket M0(CircuitPython/Arduino IDE用)

  • 出版社/メーカー: スイッチサイエンス
  • メディア:



Adafruit Circuit Playground Express - Microsoft MakeCode 対応

Adafruit Circuit Playground Express - Microsoft MakeCode 対応

  • 出版社/メーカー: Adafruit
  • メディア: エレクトロニクス







nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE用 CircuitPython で 9軸センサー (LSM9DS1) を動かしてみた [SPRESENSE]

CircuitPython のライブラリを探していたところ、9軸センサー(LSM9DS1)用のライブラリがあることを発見しました。LSM9DS1は、昔自作アドオンボードを作ったので試すことができます。


DSC_0996s.jpg


動かすには、adafruit のライブラリバンドルのZIPをダウンロードしてくると便利です。最新の VERSION 5.x 版を持ってきましょう。


2020-05-19.png
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:"ドライブが見えます。


DSC_0994.JPG

2020-05-19 (4).png


"adafruit_lsm9ds1.mpy" "adafruit_bus_device" はフォルダごと、"CIRCUITPY:" ドライブの ”lib” フォルダーにコピーしちゃいます。


2020-05-19 (2).png


次に、example のコード "lsm9ds1_simpletest.py" を”CIRCUITPY:”ドライブのルートに "code.py" として保存します。


2020-05-19 (6).png


"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 等のターミナルにセンサー出力がプリントされます。これは、お手軽ですねー。


2020-05-19 (7).png


".mpy" はPythonコードなのかなと思ったのですが、開いてみるとバイナリーコードでした。そのうちどうやって作るのか探ってみたいと思います。😃
(^^)/~





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



Adafruit Trinket M0(CircuitPython/Arduino IDE用)

Adafruit Trinket M0(CircuitPython/Arduino IDE用)

  • 出版社/メーカー: スイッチサイエンス
  • メディア:







nice!(22)  コメント(0) 
共通テーマ:趣味・カルチャー

【痛風おじさん】痛風発作再び??? [4コマ漫画]

コロナ禍でテレワークが続いている上、ランニングも危ないというので最近は運動もせず、本当に家に籠もりっきり。まさにニートって感じの生活を続けていたわけですが、ある日起きると膝が猛烈にイタイ!!

昔、水を溜めたことのある膝なのですが、特に運動をしたわけでもなく、どこかに当てた覚えもありません。でも、立てないくらいの痛さだったので、カミさんに病院に連れて行ってもらいました。

病院はコロナに備えて看護婦さんも含め厳重装備。でもガラガラだったので感染の心配はなさそうです。よかった。で、かかりつけの先生に見てもらったところ…。


痛風再び?.png


尿酸値は低いものの痛風だったようです。運動不足も祟って、溜まった尿酸が吐き出されていなくて発症したみたいです。薬飲んでるからって、調子に乗って晩酌をしてしまった私の自業自得ですが、コロナが終息するまでお酒はおあずけになってしまいました。トホホ…😪
(´・ω・`)





マンガでわかる痛風の治し方

マンガでわかる痛風の治し方

  • 出版社/メーカー: 主婦の友社
  • 発売日: 2017/12/20
  • メディア: Kindle版






よくわかる痛風・高尿酸血症を治すおいしい食事

よくわかる痛風・高尿酸血症を治すおいしい食事

  • 作者: 金澤 良枝
  • 出版社/メーカー: 主婦の友社
  • 発売日: 2016/01/29
  • メディア: Kindle版




タグ:日常 痛風
nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE用”CircuitPython”のビルド環境を作ろう!(CircuitPythonビルド編) [SPRESENSE]

いよいよ SPRESENSE向け "CircuitPython" のビルドを行います!このシリーズの完結編になります。ここでは、CircuitPython のイメージをビルドし、SPRESENSEに書き込み、PythonコードによるSPRESENSE のLチカまで行います。


python-spresense.png


【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は異なります)


2020-05-14 (7).png
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をメインボード側に挿します。


DSC_0991.JPG


この時、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ケーブルを今度は拡張ボード側に挿しましょう。


2020-05-09.png


すると、PCに新しく "CIRCUITPY:" というドライブが見えます。


2020-05-08 (3).png


そのドライブの中に 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が光りだします。これはお手軽ですね!





ぜひ試してみてください!😉
(^^)/~





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware







nice!(22)  コメント(1) 
共通テーマ:趣味・カルチャー

SPRESENSE用”CircuitPython”のビルド環境を作ろう!(ビルドツリー準備編) [SPRESENSE]

WSLの環境に、”Linuxbrew” の環境が整ったので、次はいよいよ”CircuitPython"のビルドツリーを用意したいと思います。


python-spresense.png


例によってコマンドの羅列だけで、コマンドが出力するメッセージは省略します。最初にビルドに必要なツールやライブラリをインストールします。



$ 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環境

WSL構築と利用―Windows10で利用するLinux環境

  • 作者: 川口 直也
  • 出版社/メーカー: カットシステム
  • 発売日: 2020/01/01
  • メディア: 単行本






SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware




nice!(21)  コメント(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。