So-net無料ブログ作成

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) 

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)  コメント(0) 

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




お疲れ様でした。これで環境面の設定はすべて完了です!😁
次はいよいよ SPRESENSE用の CircuitPython をビルドして動かしてみたいと思います!
(^^)/~





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

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

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






SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

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




nice!(21)  コメント(0) 

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

SPRESENSE用"CircuitPython"のビルド環境の続きです。WSLのUbuntuのインストールが終わったら、次は開発環境を設定します。


image-3.png


今回は少し時間がかかりますので、コーヒーでも飲みながら気長にやっていきましょう。開発環境の設定は次のサイトを参考にさせていただきました。(ありがとうございます)


WSLでWindowsの中にLinuxの開発環境を作ろう
https://qiita.com/h-yoshikawa/items/15653d08f917ad6e39f8


最初に日本語化と日本時間の設定を行います。次の順番でコマンドを入力してください。(各コマンドを打った際に表示されるメッセージは省略しています)


$ sudo apt update
$ sudo apt install -y language-pack-ja
$ sudo apt install -y manpages-ja manpages-ja-dev
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo dpkg-reconfigure tzdata



ここでコンフィギュレーションの画面が出てきますので[Asia][Tokyo]に設定します。


2020-05-12.png

[Tab]キーでOKに移動できます。ちなみに日本の都市名はTokyo以外はありません…。

2020-05-12 (1).png


次からいよいよ"Linuxbrew"をインストールします。次の順番にコマンドを打ってください。
ここからは、一つ一つのコマンドにかなり時間がかかります。


$ sudo apt install build-essential curl file git

   .... 時間かかります ....

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

   .... さらに時間かかります....

$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >>~/.profile
$ source ~/.profile
$



これで、"Linuxbrew" が使えるようになります。ここで一点注意があります。二つ目のコマンドが "Linuxbrew"のインストールになるのですが、次のようにインストールの途中で続けるかどうか聞いてきます。


$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)" [sudo] Enter password for xxxx to install Ruby: ==> Installing Ruby to /home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/vendor ... 省略 ... /home/linuxbrew/.linuxbrew/Caskroom /home/linuxbrew/.linuxbrew/Frameworks Press RETURN to continue or any other key to abort


ここで放って置くと、そのまま "abort" してしまいますので、時々コンソールを覗いてキー待ちになっているか見ておきましょう。

次にGCCをインストールします。


$ brew install gcc

   ... ここも時間かかります ...

$ echo 'export LDFLAGS="-L/home/linuxbrew/.linuxbrew/opt/isl@0.18/lib"' >> ~/.profile
$ echo 'export CPPFLAGS="-I/home/linuxbrew/.linuxbrew/opt/isl@0.18/include"' >> ~/.profile
$ echo 'umask 002' >> ~/.profile
$ source ~/.profile
$




これで設定完了です。最後に正しく設定されているか確認をします。


$ brew doctor
Your system is ready to brew.
$



このメッセージが出てきたら設定完了です!お疲れ様でした。😄

次はいよいよ "CircuitPython" の開発環境の設定です。
(^^)/~





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

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

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



Ubuntuスタートアップバイブル

Ubuntuスタートアップバイブル

  • 作者: 小林 準
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2018/07/30
  • メディア: 大型本



ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門

ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門

  • 作者: 中島能和
  • 出版社/メーカー: 秀和システム
  • 発売日: 2017/03/30
  • メディア: Kindle版




nice!(19)  コメント(0) 

SPRESENSE用”CircuitPython”のビルド環境を作ろう!(WSLインストール編) [SPRESENSE]

SPRESENSE用のCircuitPythonのビルド環境にはLINUXの環境が必要です。Windows10の場合はWSL(Windows Subsystem for Linux )を使うことができます。


image-3.png


WSLはお使いの Windows10 に内蔵されており設定で機能を有効にするだけです。コントロールパネルの”プログラム”メニューの中の”Windowsの機能の有効化また無効化”を選択します。


2020-05-10.png


すると、ダイアログウィンドウが現れますのでその中から ” Windows Subsystem for Linux”の項目をチェックします。


2020-05-10 (1).png


ダイアログを閉じると再起動が促されますので再起動します。

これでまだ終わりではありません。次に”Microsoft Store”を開いて、"Ubuntu" と検索します。いくつか異なるバージョンのものが引っかかりますが、ここは迷わず "Ubuntu" を選択しましょう。 (最新版がインストールされるようです)


2020-05-11 (1).png


インストールしたのちにアイコンをクリックするとコンソールが現れユーザー名・パスワードを設定するよう促されるので、自分の好みのユーザー名・パスワードを設定すれば完了です!


2020-05-11 (2).png


しかし、Windowsでこんなに簡単にLinux(Unix)が使えるとは時代は変わりましたねぇ。
次はWSLに開発環境をセットアップしたいと思います。🙂
(^^)/~






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

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

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



Ubuntuスタートアップバイブル

Ubuntuスタートアップバイブル

  • 作者: 小林 準
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2018/07/30
  • メディア: 大型本



新しいLinuxの教科書

新しいLinuxの教科書

  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2017/06/08
  • メディア: Kindle版




タグ:ubuntu Spresense WSL
nice!(21)  コメント(0) 

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

前回、SPRESENSEのプリビルドで CircuitPython を動かしましたが、せっかくなのでSPRESENSE 用の "CircuitPython" のビルド環境を整備することにしました。


python-spresense.png
https://github.com/adafruit/circuitpython


SPRESENSEには、"CircuitPython" にはない機能が沢山あるので、コントリビューションするなら今がチャンスですよ!!😀

ビルド環境は、AdaFruit の CircuitPython の GitHub に記載されていますが、かなり大雑把なので、備忘録を兼ねて記録していきたいと思います。大まかには次の4ステップになります。



【STEP1】WSL (Windows Subsystem for Linux) を準備する
【STEP2】WSL(Ubuntu)に開発環境を設定する
【STEP3】CircuitPython のビルドツリーを用意する
【STEP4】CircuitPython をビルドしてSPRESENSEで動かす




STEP3以降が、やや込み入っているので後日アップしていきたいと思います!このページはそれぞれの手順へのリンクを貼っていきますので、目次として使ってください。
(^^)/~





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

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










nice!(23)  コメント(0) 

SPRESENSE で "CircuitPython" を動かしてみた! [SPRESENSE]

SPRESENSE で CircuitPython が動くのは知っていたのですが、試したことはありませんでした。最近、Python を使うことが増えてきているので、気分転換に試してみることにしました。


2020-05-08 (2).png
https://learn.adafruit.com/welcome-to-circuitpython/overview


試してみるのはとっても簡単でした。細かい手順は上のURLにあるのですが、手っ取り早く動かしたい方は次の3ステップでOK。


STEP1:SPRESENSE の CircuitPython イメージをダウンロードする


Adafruit の公式ページから、SPRESENSEの CircuitPython イメージをダウンロードしましょう。 "adafruit-circuitpython-spresense-en_US-5.3.0.spk" という ".spk" という拡張子がついたファイルが取得できます。


2020-05-09 (1).png
https://circuitpython.org/board/spresense/


STEP2:ダウンロードしたイメージを SPRESENSE に焼きこむ


ここは少し面倒。すでに Arduino の環境が整っている方が前提です。 SPRESENSE の Arduino 環境の設定の仕方は次のURLを参照してください。

Spresense Arduino スタートガイド
https://developer.sony.com/develop/spresense/docs/arduino_set_up_ja.html


このライブラリの中に flash_writer が同梱されています。(Windows前提ですが)次の場所にあります。

%USERPROFILE%\AppData\Local\Arduino15\packages\SPRESENSE\tools\spresense-tools\1.5.0\flash_writer\windows\flash_writer.exe



コマンドラインやCygwin等で次のように打ち込めばイメージを焼きこめます。SPRESENSE が接続されているシリアル (COMxx) は、コントロールパネル等で確認してください。

# ./flash_writer.exe -c COMxx adafruit-circuitpython-spresense-en_US-5.3.0.spk
Please press RESET button on target board
>>> Install files ...
install
Install build-spresense/firmware.spk
|0%-----------------------------50%------------------------------100%|
######################################################################

404096 bytes loaded.
Package validation is OK.
Saving package to "nuttx"
updater# >>> Save Configuration to FlashROM ...
set bootable M0P
M0P is not valid bootable. config not changed.
updater# sync
updater# Restarting the board ...
reboot



STEP3:Pythonコード "code.py" を CIRCUITPYドライブにコピー


このときに拡張ボードが必要です。USBケーブルを拡張ボード側に付け替えます。


2020-05-09.png


すると、CIRCUITPYというドライブが見えます。(SDカードは不要です)


2020-05-08 (3).png


次のPythonコードを"code.py"という名前で保存して、CIRCUITPYにコピーしたらLED0が光ります!

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)



とっても簡単ですね!組み込みでPythonを試してみたいという方はやってみてはどうでしょう?
(^^)/~





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

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



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

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







nice!(28)  コメント(0) 

SPRESENSE とホール素子でモーターの回転数を計ってみる(2) [SPRESENSE]

SPRESENSEで回転数を測るための環境は整ったので、今回は実際に測定をしてみたいと思います。


0_DSC_0998.JPG


まずはスケッチから。モーターを analogWrite で駆動して、ホール素子の電圧の立ち上がりを割り込みでキャッチして回転数をカウントしています。なるべく誤差が出ないように回転数の測定は10秒間と長めに行っていました。

モーターは供給電圧が低い状態では、ギアの駆動抵抗が高くて動かせないので、5msec フル電圧で動かすという小技を使っています。


#define AIN01 20
#define AIN02 21
#define AIN11 18
#define AIN12 19
#define DASH 5

#define DET_PIN_1 14
#define DET_PIN_2 15
#define MEASURE_TIME 10

static uint16_t cnt_1 = 0;
static uint16_t cnt_2 = 0;
static uint8_t level = 5;
static boolean accel = true;
static boolean finish = false;

void count_1() {
  ++cnt_1;
}

void count_2() {
  ++cnt_2;
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(DET_PIN_1, INPUT_PULLDOWN);
  pinMode(DET_PIN_2, INPUT_PULLDOWN);

#ifdef INA219
  ina219.begin();
#endif

  attachInterrupt(digitalPinToInterrupt(DET_PIN_1), count_1, RISING);
  attachInterrupt(digitalPinToInterrupt(DET_PIN_2), count_2, RISING);
}


void motor_drive(uint8_t n, bool cw) {

  if (n > 255) n = 255;
  if (n <   0) n =   0;

#ifdef DASH
  if (n < 200) {
    if (cw) analogWrite(AIN01, 255);
    else    analogWrite(AIN02, 255);
    if (cw) analogWrite(AIN11, 255);
    else    analogWrite(AIN12, 255);
    delay(DASH);
  }
#endif

  if (cw) {
    analogWrite(AIN01, n);
    analogWrite(AIN02, 0);
    analogWrite(AIN11, n);
    analogWrite(AIN12, 0);

  } else {
    analogWrite(AIN01, 0);
    analogWrite(AIN02, n);
    analogWrite(AIN11, 0);
    analogWrite(AIN12, n);
  }
}

void countingRot(int n) {
    static unsigned long mtime;
    interrupts();
    mtime = millis();
    sleep(MEASURE_TIME);
    mtime = millis() - mtime;
    noInterrupts();
    Serial.print(String(n) + ",");
    Serial.print(String(mtime) + ",");
    Serial.print(String(cnt_1) + ",");
    Serial.println(String(cnt_2));
    cnt_1 = 0;
    cnt_2 = 0;
}

void loop() {
  int i = 0;
  unsigned long mtime;

  do {
    motor_drive(i, true);
    countingRot(i);
    i += 5;
  } while (i <= 250);

  i = 255;
  do {
    motor_drive(i, true);
    countingRot(i);
    i -= 5;
  } while (i >= 0);

  i = 0;
  do {
    motor_drive(i, false);
    countingRot(i);
    i += 5;
  } while (i <= 250);

  i = 255;
  do {
    motor_drive(i, false);
    countingRot(i);
    i -= 5;
  } while (i > 0);

  while(1);

}



測定時のログ出力の様子です。左から、PWM出力値、測定時間(ms)、左モーター回転数、右モーター回転数です。


2020-04-26.png


気になる実際の測定値はこちら。まず時計方向、反時計方向の測定値です。


2020-04-27.png


2020-04-27 (1).png


左右のモーター間の回転数のばらつきは想定したよりもありませんでしたが、時計方向と反時計方向の違いが顕著です。これは恐らく電気系の問題ではなく、ギヤなどメカ的な問題かも知れません。いずれにしても制御のときは考慮する必要がありそうですね。

あと長時間測定をしていたので、バッテリーの供給電力の問題が出るかなと思ったのですが思いの外、違いはなさそうです。(バッテリーにもよるとは思いますが…)

次はセンサー処理について検討をしていきたいと思います。
( ・ิω・ิ)





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

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



Arduino電子工作: 2輪自立ロボットカーの製作

Arduino電子工作: 2輪自立ロボットカーの製作

  • 作者: 大西 和則
  • 出版社/メーカー:
  • 発売日: 2019/08/21
  • メディア: Kindle版



最新版 モータ技術のすべてがわかる本 (史上最強カラー図解)

最新版 モータ技術のすべてがわかる本 (史上最強カラー図解)

  • 作者: 赤津 観
  • 出版社/メーカー: ナツメ社
  • 発売日: 2012/09/04
  • メディア: 単行本




nice!(24)  コメント(2) 

SPRESENSE とホール素子でモーターの回転数を計ってみる(1) [SPRESENSE]

SPRESENSEでモーターの続きです。前回、ホール素子でモーターの回転数を計るための回路を検討してみました。今回はいよいよそれを倒立振り子のメカに組み込んでみました。


0_DSC_0998.JPG


ホール素子のホルダーは3Dプリンタで作成しました。アームとパーツの二つの部品で構成されています。格安のオンボロ3Dプリンタですが、ちょっとした工作をするには便利です。


1_DSC_0986.JPG


ホルダーにホール素子を両面テープで貼り付けます。


2_DSC_0979.JPG


これを倒立振り子のメカに組み付けます。車輪に 1cm x 1cm のテープ磁石をつけます。あまり幅が大きいと間違ってカウントしてしまうので磁石の大きさは重要です。


3_DSC_0989.JPG


NJM2115Dは、オペアンプを2回路内蔵していますので、ホール素子のアンプ回路を次のようにくみ上げました。


スライド4.PNG


一生懸命書いたのですが、分かりにくくなってしまったので回路図も示します。^^;


スライド5.PNG


ブレッドボードに実際に組み上げたのがこちらです。図よりも見やすいかも…


4_DSC_0992.JPG


SPRESENSE側の接続は次のようになっています。


5_DSC_0993.JPG


実際に動かしてみたところ、順調にカウントしてくれてました。


6_DSC_0991.JPG


次は、計測用のスケッチを書いて回転数を計測をしてみたいと思います!
( ー`дー´)





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

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






JRC(新日本無線) 2回路 低雑音 オペアンプ NJM5532DD (5個セット)

JRC(新日本無線) 2回路 低雑音 オペアンプ NJM5532DD (5個セット)

  • 出版社/メーカー: JRC(新日本無線)
  • メディア:








nice!(29)  コメント(0) 

【備忘録】SPRESENSE でホール素子「THS119」を使う場合の注意点 [SPRESENSE]

SPRESENSEに限った話ではないのですが、ホール素子「THS119」を使う場合に少しはまったので、その注意点を備忘録として残しておきます。

THS119をSPRESENSEで扱うための回路は前回紹介しましたが、SPRESENSEには、次のように接続しました。


スライド2.PNG


スケッチは次のような極めて簡単なものです。

#define DET_PIN 21

void setup() {
  Serial.begin(115200);
  pinMode(DET_PIN, INPUT_PULLDOWN);

  sleep(1);
}

unsigned long n = 0;
void loop() {
  int val = digitalRead(DET_PIN);
  if (val == HIGH) {
    Serial.println(String(n));
  }
  ++n;
}



当初なるべく車輪の中心から遠いところでカウントしたいと思い(測定間隔が稼げるので)、テープ磁石の端でカウントしようと思ったのですが、まったくセンスしません。


DSC_0982s.jpg


ありゃ?回路失敗したか?と思ったのですが、いろいろ試行錯誤をしたところ、テープ磁石の真ん中近くだとうまくセンスしてくれることがわかりました。


DSC_098s3.jpg


どうも、素子に対して垂直に磁束が入らないとカウントしないみたいです。


スライド3.PNG


測定用のメカを3Dプリンタで試作したのですが、作り直しとなってしまいました。
トホホ (´・ω・`)





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

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










nice!(23)  コメント(0)