RISC-VマイコンK210搭載『Sipeed MAix』『M5StickV』
今、話題のRISC-Vコア、AIアクセラレータKPU内蔵マイコンK210搭載
Sipeed MAix、M5StickVの話題を扱います
64bit 400MHz RV64GCのRISC-Vコアを2コア搭載
RV64GCなので単精度、倍精度浮動小数点演算もOK
AIアクセラレータのKPU内蔵
MicroPython環境のMaixPyやArduino IDEでの開発が可能です M5StickVはMaixPy専用のようです
PlatformIOのリストには出てきません PlatformIOではこれらのリストが出てきます
どれもArduino、Kendryte-standalone-sdk、Kendryte-freertos-sdkの3種類が選択できます
Sipeed MAIX BIT
Sipeed MAIX GO
Sipeed MAIXDUINO
Sipeed MAIX ONE DOC
Sipeed MF1 MF1
Arduino IDEでも使えます
製品を持ってなくてもライブラリを確認したりコンパイルはできるので
どの程度のことが可能か、確かめてから買うこともできます ネットで検索するとArduino IDEの最新バージョンでMAixシリーズで不具合があるというのがあるね
Arduino IDEは1.8.9を使うのをオススメ
1.8.9はここからダウンロードできる
https://www.arduino.cc/en/Main/OldSoftwareReleases#previous
追加のボードマネージャのURLはこれ
http://dl.sipeed.com/MAIX/Maixduino/package_Maixduino_k210_index.json
また、ボードマネージャは0.3.11だとカメラのライブラリを読み込んでくれなかったので
0.3.10のインストールをオススメ
インストールするとボードに
Sipeed Maix One Dock Board
Sipeed Maix Bit Board
Sipeed Maix Bit-Mic Board
Sipeed Maix Go Board
Sipeed Maixduino Board
これらを選択できるようになる Maixduinoはピン数は少ないし、
wifiはMaixPyからだと簡単に使えるがArduinoから使う方法がわからない
Arduinoからwifi使いたい場合、自分で外付けでESP32つないだ方が簡単そうだ Maix BitにESP8266つないでる人ならいるみたいだね
Maix Go用のライブラリがそのまま使えそう MaixduinoにESP32をつないで
ArduinoのMaixGo用のWiFiのライブラリを改変してESP32で使えるようにできました
WiFiのライブラリはutilityディレクトリのEspDrv.cppの中のESP8266用のコマンドを
ESP32用に変えるだけ
ESP32ではESP8266と少しコマンド名が違うだけなのでそれを修正するだけで動いた
ESP32ではなくESP8266をつなぐ場合おそらく修正は不要だと思われます WiFiのデモサンプルを実行する場合は
ESP32をつないだピンを
Serial1.begin(115200, 6, 7); // bitrate, rx, tx
WiFi.init(&Serial1);
のようにESP32につないだピンソケット番号を指定する必要があります。
ピン番号はMaixduinoの場合はピンソケットのピン番号になります。
Maix Bitの場合は実際のMaix Bitのピン番号とK210のピン番号が一致してます。
ESP32のシリアルスピードはデフォルトで115200です。
余談ですが
MaixduinoでArduinoのGPIOやSerialのライブラリで指定できるピン番号は
ピンソケットの番号のみでピンソケットにつながってないピンは指定できません。
(ピンソケットにつながってないピンを指定したい場合は、ライブラリを改変する必要があります) ここのサイトを参考にMaixduinoのLCDに日本語表示することができました
ttp://nopnop2002.webcrow.jp/HSES-LCD24/HSES-LCD24-3.html
ttps://github.com/h-nari/Fontx
ttps://github.com/h-nari/Humblesoft_GFX
MaixBitでもいけると思います
RomFontxを試したのですが
当初はフォントの配列からデータを正常に読み込めませんでした
Fontx.hのIMPORT_BINのマクロを定義してるところで
".section \".irom.text\"\n"
のところを
".section \".rodata\"\n"
に修正したらフォントの配列からデータを正常に読み込めるようになりました
uni2sjis.hの
#include <pgmspace.h>
のところを
#include <avr/pgmspace.h>
に変更
LCDドライバのSipeed_ST7789.hとSipeed_ST7789.cppを名前を変えてコピーして
Adafruit_GFXからの継承ではなく、Humblesoft_GFXからの継承に改変
Humblesoft_GFX.hのprotected:のところに
uint8_t textsize_x;
uint8_t textsize_y;
uint8_t textsize;
を追加
public:のところに
void setTextSize(uint8_t _textsize);
void setTextSize(uint8_t _textsize_x, uint8_t _textsize_y);
を追加
Humblesoft_GFX.cppに
void Humblesoft_GFX::setTextSize(uint8_t _textsize) {
textsize_x = _textsize;
textsize_y = _textsize;
textsize = _textsize;
Adafruit_GFX::setTextSize(_textsize);
}
void Humblesoft_GFX::setTextSize(uint8_t _textsize_x, uint8_t _textsize_y){
textsize_x = _textsize_x;
textsize_y = _textsize_y;
textsize = (_textsize_x >= _textsize_y ? _textsize_x : _textsize_y);
Adafruit_GFX::setTextSize(textsize);
}
を追加
こんな感じでRomfontxで日本語表示ができました
FsFontxは試してません エロい人おしえてください
aruduino ideで開発環境整えたんですが
プログラムの教本みたいHPは
どこがお奨めですか?
リファレンスマニュアルみたいのが
あれば助かります。
パイソンのリファレンスマニュアル
そのままって事無いですよね?
ハードウェアの絡みもあるし ちなみに私はPlatformIOのArduinoで試しました
テストスケッチはこんな感じです
#include <Arduino.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
// Sipeed_ST7789.hとSipeed_ST7789.cppをAdafruit_GFXではなく、Humblesoft_GFXから継承するようにしたもの
#include "Humblesoft_Sipeed_ST7789.h"
#include "Fontx.h" // https://github.com/h-nari/Fontx
// FONTファイルはプロジェクトのディレクトリのルートに
// fontxというディレクトリを作成し、その中に入れてます。
IMPORT_BIN("/fontx/ILGH16XB.FNT", ILGH16XB); //16ドット半角ゴシックフォント
IMPORT_BIN("/fontx/ILGZ16XB.FNT", ILGZ16XB); //16ドット全角ゴシックフォント
IMPORT_BIN("/fontx/ILMH16XB.FNT", ILMH16XB); //16ドット半角明朝フォント
IMPORT_BIN("/fontx/ILMZ16XB.FNT", ILMZ16XB); //16ドット全角明朝フォント
extern const uint8_t ILGH16XB[], ILGZ16XB[], ILMH16XB[], ILMZ16XB[];
// FONTのデータからFontxのフォントを生成
RomFontx font_gothic(ILGH16XB,ILGZ16XB);
RomFontx font_mincyo(ILMH16XB,ILMZ16XB);
SPIClass spi_(SPI0); // MUST be SPI0 for Maix series on board LCD
Sipeed_ST7789 lcd(320, 240, spi_);
void setup() {
lcd.begin(15000000, COLOR_RED);
lcd.setRotation(3);
lcd.fillScreen(COLOR_RED);
lcd.setCursor(0, 10);
// Fontxのフォントを表示
lcd.setTextSize(1);
lcd.setFont(&font_gothic);
lcd.print("16ドットゴシック\n");
lcd.print("日本語表示\n");
lcd.setFont(&font_mincyo);
lcd.print("16ドット明朝\n");
lcd.print("日本語表示\n\n");
lcd.setTextSize(2);
lcd.setFont(&font_gothic);
lcd.print("16ドットゴシック\n");
lcd.print("日本語表示\n");
lcd.setFont(&font_mincyo);
lcd.print("16ドット明朝\n");
lcd.print("日本語表示\n\n");
}
void loop() {
} >>39
私は一般的なArduinoの情報以外は
ライブラリのサンプルスケッチと直接ライブラリのヘッダーファイルやソースコードを見て参考にしてます
PlatformIOだと
c:\Users\ユーザ名\.platformio\packages\framework-maixduino
の下にMaixのArduino coreとそのライブラリのファイルがあります
ツールチェインのヘッダーファイルを見ることもあります。
c:\Users\ユーザ名\.platformio\packages\toolchain-kendryte210\riscv64-unknown-elf\include
ArduinoIDEのディレクトリ構成はよくわからないですがおそらく
c:\Users\ユーザ名\AppData\Local\Arduino15\packages\Maixduino\hardware\k210\0.3.10
この下にArduino coreとMaix用のライブラリがあると思います
あとは公式のDocumentですがあまり詳しくないです
https://maixduino.sipeed.com/en/
公式BBS
https://bbs.sipeed.com/ あとはM5sticVでMaixPyを実機で調べてる人がいるようです
ttps://qiita.com/Lathe/items/0f0c9b75928d52a7d502 39です。
色々リンクありがとう
参考になりました。
結局はパイソンライクなコードみたいですが、ちょっとCと違うので
戸惑ってました。
研究してみます。
ついでに、ハードウェアもいじってる
エロい人教えて下さい。
GPIOの取り出しは純正のI/O使ってますか?
値段とデリバリーが悪そうなので、代替があれば教えて下さい。 Arduinoのシールドを使わなくてもGPIOやI2C、SPIなどは使えますよ
デジタルI/Oポートを増やしたいのでしょうか?
デジタルI/Oポートを増やしたいならI2C接続のこんなのありますよ
価格は120円ですw
https://www.petitmonte.com/robot/howto_io_expander.html
16bit I2C I/Oエキスパンダー MCP23017
http://akizukidenshi.com/catalog/g/gI-09486/ >>44
Maxiduinoでは3つの開発環境がある
1.Maix用のMicroPythonであるMaixPyを使った開発環境
2.Arduinoを使った開発環境
3.Maixが使ってるチップのK210のメーカーが出してるSDKによる開発環境
Pythonライクに見えるのは、MaixPyのソースコードだと思わます
MicroPythonなのでPythonそのものです Maixduinoのアナログピンは特殊です
MaixduinoはマイコンとしてK210が使われていますが
K210にADCの機能はないためオンボードのESP32のADCがアナログピンに割り当てられてます
そしてオンボードのESP32は特殊なFirmwareが組み込まれてるようで
MicroPythonのMaixPyのv0.4.0からはWiFiやADCの機能は使えるのですが
(v0.3.2はMaixduinoのWiFiやADC機能は対応してないようです)
今のところArduinoから使う方法が全くわかりません
今後、Arduinoから使うためのライブラリが公開されるかもしれませんが
現状ではMaixduinoのオンボードのESP32を使ったWiFi機能とADC機能は
MaixPy専用だと思った方がいいです
WiFi機能はESP-WROOM-02を新たに購入して外付けでSerialでつなげば
ArduinoのMaixGo用のWiFiライブラリは使えるようです
MaixPyのADC機能を使ったサンプルプログラムは
networkのカテゴリの中にあります。(ESP32のADCを使ってるためだと思われます)
https://github.com/sipeed/MaixPy_scripts/blob/master/network/demo_esp32_read_adc.py
このサンプルプログラムを走らせると19行目の
adc = nic.adc( (0,1,2) )
でエラーになります。(まだ引数を指定した機能は実装されてない)
まだMaixPyのv0.4.0はPreReleseなので全機能が実装されてないのかもしれません
ここをコメントアウトすればとりあえず動作します
MaixPyのv0.4.0はここにあります
https://github.com/sipeed/MaixPy/releases
このページのv0.4.0の中の
maixpy_v0.4.0_50_gcafae9d.bin
これがMaix用のMaixPyのファイルです。
https://github.com/sipeed/kflash_gui/releases/tag/v1.3.2
ここのkflash_guiを使ってMaixduinoなどのMaixシリーズに書き込みます 皆さんありがと
M5stackは、displayやSPが付いていて
デバッグやちょっと弄るのに楽でいいですねw
aruduinoIDE上だと、コンパイルが遅いね。プレファレンス書き換えると
早くなると書いてありましたが、効果が実感できません。
どこが悪いんだろう? >>49
Maixduinoだと思ってたのですが違うのか
お持ちのものは何なのでしょうか?
M5StickV?、それともS5Stack?
M5StickVなら搭載マイコンがK210なのでこのスレでいいですが
M5StackならESP32というマイコンを搭載してますので下記のスレになります
格安wifiモジュール「esp8266」「esp32」 4個目
http://rio2016.5ch.net/test/read.cgi/denki/1574506387/ >>45のI/OエキスパンダーのMCP23017はMaixシリーズでは
ArduinoでAdafruitのMCP23017のライブラリがそのまま使えるようです。
https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library
Adafruit_MCP23017.cppの14行目からの
#ifdef __AVR
#include <avr/pgmspace.h>
#elif defined(ESP8266)
#include <pgmspace.h>
#endif
を
//#ifdef __AVR
#include <avr/pgmspace.h>
//#elif defined(ESP8266)
// #include <pgmspace.h>
//#endif
のように15行目を残してコメントアウトして
avr/pgmspace.hをインクルードするようにするだけで使えます。 使用するときは開始アドレスとして
MCP23017のピンのA2,A1,A0のアドレス値を0から7までの数値で入れます
>>46に載ってる回路図だとA0がHIGHになってるのでこの場合は
mcp.begin(1);
A2,A1,A0を全部グラウンドに接地した場合は
mcp.begin();
となります。
mcp.pinMode(0, INPUT);
mcp.pullUp(0, HIGH); // これはMCP23017の内部プルアップをする指定です。
mcp.pinMode(1, OUTPUT);
mcp.digitalWrite(1, HIGH);
uint8_t read_pin = mcp.digitalRead(0);
こんな感じで使えます。
この時、MCP23017のGPA0がピン番号0でGPA7がピン番号7
GPB0がピン番号8でGPB7がピン番号15になります。
I2Cの信号ピンを変えたい場合は
Adafruit_MCP23017.cppの111行目のvoid Adafruit_MCP23017::begin(uint8_t addr) {の中の
Wire.begin();
を
Wire.begin((uint8_t)21, (uint8_t)22, 400000);
のようにピン番号と周波数を指定すれば変更できます。
第1引数がSDAで第2引数がSCLのピン番号、第3引数が周波数です。
(周波数は省略可能です)
この時に指定するピン番号はK210のピン番号になるので要注意です。 追記:
Adafruit_MCP23017 mcp;
と宣言するのを忘れずに M5StickVならGPIOのプログラムだとこのあたりが参考になると思います
M5StickVのGroveコネクタを使う
ttps://hrkz.tokyo/m5stickv-grove/
Grove用ケーブル
https://www.switch-science.com/catalog/list/435/
【M5stickV】ランダムな10色に光らせる方法 ~ライト編~
ttps://hellobreak.net/m5stickv-led-9-30/
M5StickVのGroveポートではI2Cも使えるようです。
ttps://twitter.com/robo8080/status/1169133576912347136
ttps://twitter.com/robo8080/status/1169237144742744064
ttps://twitter.com/robo8080/status/1169238906367172608
ttps://twitter.com/robo8080/status/1170225725888069632
ttps://twitter.com/robo8080/status/1170296297271652352
ttps://twitter.com/robo8080/status/1170299180876582914
M5StickVは持ってないのですが
M5StickVでArduinoが使えるのなら
Maixシリーズと同様にI2Cの初期化でI2Cが使うピンを変更できると思われます。
MaixPyだけでなくArduinoでI2Cが使えるかもしれません
(M5StickVを持ってなくて試してないのでできないかもしれませんが。)
I2Cの初期化で使用するピンと周波数を指定できます
(M5StickVのGlobeコネクタは34ピンと35ピンが割り当てられてるそうです)
#define SDA1 34
#define SCL1 35
Wire.begin((uint8_t)SDA1, (uint8_t)SCL1, 400000);
こんな感じです
M5StickVはGPIOが少ないようなのでI2CでGPIOを増やせたらいいですね
https://twitter.com/5chan_nel (5ch newer account) これ安いですね
HiLetgo PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール Arduinoに対応 ロボット
https://www.アマゾン.co.jp/dp/B01D1D0CX2/
AmazonのURLは5chに直接貼れないのでwww.アマゾン.co.jpにしてます >>56
一時期URLエンコードして貼ってた時期ありましたが
フィッシング詐欺と間違われる可能性もあるのでやめました mcp01 = mcp.MCP23017(address=0x21, gpioScl=30, gpioSda=31)
のアドレスは0x21になってますが、デフォルトは0x20です
ボードに合わせてMCP23017のアドレスを設定してください
Scl、SdaはMaixシリーズではSCLが30、SDAが31がデフォルトです
M5StickVの場合は34、35になるかと思います
(M5StickVは持ってないのでSCLが34でSDAが35なのかSCLが35でSDAが34なのかわかりません) MaixduinoをMaixPyで使ったときのSPIの使い方がやっとわかりました
ネットを探しても、あまり情報が無かったので苦労しました
試しに、SPI接続の温度センサーのADT7310を動作させてみたので紹介します
Maixduinoの
2番ピンにCS
3番ピンにMISO
4番ピンにSCK
5番ピンにMOSI
を接続してみました
Maix Bitでは
21番ピンにCS
22番ピンにMISO
23番ピンにSCK
24番ピンにMOSI
になると思います
ピンの役割はfm.registerで変更できるので任意のピンに変更することが可能です
この部分です
SPI1_D0がSPI1のMOSI、SPI1_D1がSPI1のMISOです。
CSは自分で制御したい場合はGPIOで制御します。
fm.register(21,fm.fpioa.GPIOHS0)#cs
#fm.register(21,fm.fpioa.SPI1_SS0)#cs
fm.register(24,fm.fpioa.SPI1_D0)#mosi
fm.register(22,fm.fpioa.SPI1_D1)#miso
fm.register(23,fm.fpioa.SPI1_SCLK)#sclk
spi01=SPI(SPI.SPI1,mode=SPI.MODE_MASTER,baudrate=125000,polarity=1,phase=1,bits=8,firstbit=SPI.MSB,mosi=fm.fpioa.SPI1_D0,miso=fm.fpioa.SPI1_D1,sck=fm.fpioa.SPI1_SCLK,cs0=-1)
#spi01=SPI(SPI.SPI1,mode=SPI.MODE_MASTER,baudrate=125000,polarity=1,phase=1,bits=8,firstbit=SPI.MSB,mosi=fm.fpioa.SPI1_D0,miso=fm.fpioa.SPI1_D1,sck=fm.fpioa.SPI1_SCLK,cs0=fm.fpioa.SPI1_SS0)
ソースコードはこちらです
https://pastebin.com/4ayBSq7F MaixPyでGPIOエキスパンダのMCP23017を使うその2
>>60のライブラリはGPLv3なので使いにくいと思い
Adafruitの下記ライブラリをMaixPyで動くように移植してみました
CircuitPython driver for MCP230xx GPIO Expanders
https://github.com/adafruit/Adafruit_CircuitPython_MCP230xx
とりあえず、exampleのmcp230xx_simpletest.pyを動くようにしてみました
ファイルは4つです
digital_inout.py
https://pastebin.com/c2VuPWUE
mcp230xx.py
https://pastebin.com/FXfFmNw9
mcp23008.py
https://pastebin.com/MxTVrK0K
mcp23017.py
https://pastebin.com/pMrGpujQ
これら、4つのファイルを
uPyLoaderでMaixシリーズ、M5StickVなどにアップロードしておきます
https://github.com/BetaRavener/uPyLoader/releases
サンプルプログラムはこれ(mcp230xx_simpletest.pyを改変しただけです)
https://pastebin.com/keqgBPRm
Maixシリーズはsclが30、sdaが31がデフォルトです
他のピンに変更したい場合はscl、sdaの値を変更してください
(Maixduinoを使っている場合、指定するピン番号はK210のピン番号ですので要注意です)
M5StickVでもscl、sdaを34、35ピンに設定すれば動作すると思います
(sclが34ピン、sdaが35ピンなのかsclが35ピン、sdaが34ピンなのかはわかりません) 追記
サンプルのaddressが0x21になってますが>>46の回路図に合わせてるだけです
mcp = MCP23017(i2c, address=0x21) # MCP23017 w/ A0 set
MCP23017のデフォルトのaddressは0x20です
自分の使用してるものに合わせて変更してください 新しいMaixPyのビルドでヒープサイズを設定できるようになったようです
http://dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.5.0_12_g284ce83
import Maix
Maix.utils.gc_heap_size()
これでヒープサイズが確認できるのと
import Maix
Maix.utils.gc_heap_size(400000)
のようにヒープサイズが設定できるらしいですね
ためしに
import Maix
Maix.utils.gc_heap_size(1000000)
を実行したらヒープサイズが1000000になりました
あまり大きな値を設定するとMaixPyが起動しなくなるので要注意です Maix.utils.gc_heap_sizeで大きな値を設定してMaixPyが起動しなくなったら
下記の作業をする必要があります。
(LinuxやMacなどの環境が必要なようです。私はWindowsのCygwin上で実行しました
gccやg++、makeなどが必要なようです)
git clone https://github.com/sipeed/MaixPy
cd tools/spiffs
mkdir fs
python gen_spiffs_image.py ../../projects/maixpy_k210/config_defaults.mk
これを実行するとtools/spiffs/fs_imageに空のmaixpy_spiffs.imgができます
この作成されたmaixpy_spiffs.imgをkflash_guiで
0xD00000のアドレスに書き込めば起動できるようになります
ただし、今までにMaixやM5StickVにアップロードしたファイルの内容は消えます
ファイルをダウンロードしたい場合は、古いMaixPyのイメージを書き込んで起動し
(maixpy_v0.4.0_50_gcafae9d.binで起動できました)
uPyloderでバックアップを取ってから
kflash_guiでmaixpy_spiffs.imgをkflash_guiで0xD00000に書き込めばいいはずです
古いMaixPyはここにあります
http://dl.sipeed.com/MAIX/MaixPy/release/master/ 追記
import Maix
Maix.utils.gc_heap_size(600000)
とヒープサイズを設定後、反映されるのはハードリセットした後です
ソフトリセットでは反映されません import Maix
Maix.utils.gc_heap_size(3000000)
までは成功しました
import Maix
Maix.utils.gc_heap_size(4000000)
ではMaixPyが起動しなくなりました
失敗するとMaixPyが起動しなくなるので
空のmaixpy_spiffs.imgが作成できない人は真似しないでください gen_spiffs_image.pyはもともとはflash上のファイルイメージを作成するためのもののようです
tools/spiffsにfsディレクトリを作成してその中にファイルを入れるとfsディレクトリ以下のファイルの
flash書き込み用のイメージが作成されるようです
紹介動画(アニメーションGIF画像)
https://cdn.sipeed.com/pack_spiffs_ops.gif Sipeed Longan Nano、やっと中華USB Blasterでuploadとdebugができるようになったけど、
あんまり早くない・・・
> ** Programming Started **
> auto erase enabled
> wrote 87040 bytes from file .pio\build\sipeed-longan-nano\firmware.elf in 103.054993s (0.825 KiB/s)
> ** Programming Finished **
> ** Verify Started **
> verified 86224 bytes in 73.658226s (1.143 KiB/s)
> ** Verified OK ** Sipeed Longan NanoはメーカーがSipeedというだけでMaixシリーズとは全然別物だからね
Arduinoの環境も整備されてるとはいいがたいしMaixPyも使えないし Maixduinoで>>55のPCA9685モジュールのPWMでLチカをしてみました
SCL、SDAを3.3KΩでプルアップしてモジュールにつなぎます
VCCにMaixduinoの3.3V、GNDにMaixduinoのGNDをつなぎます
LEDはシンク接続で16個つないでみました
(抵抗は1KΩを使いました)
今回はMaixPyから使ってみます
MicroPython用のPCA9685モジュール用のドライバーソフトが
adafruitから出てるようですのでそれをそのまま使います
https://github.com/adafruit/micropython-adafruit-pca9685
adafruitのドライバソフトの中のpca9685.pyを
uPyLoaderでMaixシリーズやM5StickVに転送してください
uPyLoader
https://github.com/BetaRavener/uPyLoader/releases
テストサンプルはこんな感じです
(このサンプルではLEDはシンク接続を想定してます)
https://pastebin.com/7XqWVcXn
M5StickVでは
i2c = I2C(I2C.I2C0, freq=400000, scl=30, sda=31)
pca9685_01 = PCA9685(i2c, 0x40)
のscl=30、sda=31の部分をscl=34、sda=35もしくはscl=35、sda=34に変更してください
PCA9685のI2Cアドレスは自分ものにあわせて適宜変えてください
(デフォルトでは0x40です) SPI接続の温度センサーADT7310用の>>63のプログラムを改良してみました
https://pastebin.com/YFgCeRUJ MaixduinoでMaixPyで気温、気圧、湿度センサーのBME280を使ってみました
BME280モジュールはスイッチサイエンスや秋月で売ってます
https://www.switch-science.com/catalog/2236/
https://akizukidenshi.com/catalog/g/gK-09421/
BME280はSPIとI2Cを選べるのですがI2Cで接続での使用です
https://github.com/SWITCHSCIENCE/BME280
今回はここにあるスイッチサイエンスのPython用のサンプルコードを改変して
MaixPyで使えるようにしてみました
気温、気圧、湿度をSerialに表示するだけのプログラムです
改変したコードはこちらです
https://pastebin.com/QyV9qssY
i2c_addressにはBME280のアドレスを入れます(デフォルトは0x76)
M5StickVでもSCL=34 SDA=35もしくはSCL=35 SDA=34にすればおそらく使えると思います MaixduinoでMaixPyでATD7410の温度センサーモジュールを使ってみました
秋月で税込み500円で売ってます
http://akizukidenshi.com/catalog/g/gM-06675/
気温を5秒おきにシリアルに表示するだけのプログラムです
https://pastebin.com/ButCuNtx
M5StickVの人は74行目のscl=30, sda=31のところを
scl=34, sda=35もしくはscl=35, sda=34に変更すれば使えると思われます
気温を5秒おきにLCDにも表示するバージョンです
https://pastebin.com/QbbdwtU6
LCD表示バージョンはMaixシリーズでしか使えないと思われます 新しい仲間ができたようです
UnitV AI Camera
https://www.switch-science.com/catalog/6212/
税込単価 2,145 円
> M5StickVとの大きな違いは液晶やバッテリー、ジャイロセンサが非搭載になり、
> 小型軽量になった点です。
> M5StickCと組み合わせることで、そのあたりを補完してお使いいただくことが可能です。
>
> Sipeed社の協力により、K210用のMicroPython環境であるMaixPyで開発が可能です。
> カメラには高感度なOmniVision社製OV2640イメージセンサ(2メガピクセル)を搭載しています。 WiF使いたい場合はMAixduinoが一番安く上がるのかな? BME280はGroveタイプのもあるんですね
GROVE - 温湿度・気圧センサ(BME280)
https://www.switch-science.com/catalog/3374/ >>78
MaixPyからWiFi使うならMaixduinoがいいですね
SPI接続ですし、安定して使えます
ただし、ArduinoからはオンボードのWiFiは使えないです
Arduinoから使う場合は外付けでESP8266をUARTでつなげば使えます
Maixduinoで注意が必要なのはJTAG用のピンが出てない点です
MaixBitならJTAG用のピンが出てるのでFT2232H MINI MODULEをつなぐことで
PlatformIOでCやC++でデバッグができるようになります
まあ、デバッグ機能は必要ない人も多いでしょうが あと、Maixduinoにアナログ入力ピンがありますが、これもArduinoからは使えません
MaixPyでnetworkの中にアナログ入力ピンを使う機能があります
networkの中にあるのはこのアナログ入力ピンはオンボードのESP32の機能だからだと思われます
https://github.com/sipeed/MaixPy_scripts/blob/master/network/demo_esp32_read_adc.py >>80
ありがとう。
MaixPy使用予定だからMaixduinoにしておきます。 あと、MaixPyでWiFiの関数はこれだけです
サーバの機能はありません
version -- <function>
adc -- <function>
scan -- <function>
connect -- <function>
disconnect -- <function>
isconnected -- <function>
ifconfig -- <function>
ping -- <function>
サンプルはここです
https://github.com/sipeed/MaixPy_scripts/tree/master/network
demo_esp32と書かれてるのがMaixduino用のWiFiのサンプルプログラムです >>77のUnitV AI CameraのカメラはOV2640か
Maixduinoと同じやつだね
M5StickVみたいにMaixPyのみでArduinoは使えないのかな? Googleで検索するともう手に入れて使ってる人いるのね K210搭載のモジュールはRAMが6MBもあるので
MicroPythonやるなら最適だと思うけどね
MicroPythonのMaixPyが使えるんだから >>83
ありがとう。
そこは見つけてた。
MAix Dockやbitのモジュールセットは技適の関係でおおっぴらに売れないだろうけど、もしかしたらってのがありました。
M5StackV+が出てくれば手っ取り早くて良いんですけどね。 MaixGo用のデモプログラムも少し改変すればMaixduinoで動きます
例えば、httpでjpgファイルをダウンロードするデモプログラム
https://github.com/sipeed/MaixPy_scripts/blob/master/network/demo_http.py
これは
https://pastebin.com/EW33HAq2
こんな感じに改変すればMaixduinoでも動きます >>75でBME280でのLCD表示版を作ってなかったので作りました
おそらくMaixシリーズ専用になると思われます
https://pastebin.com/6LDpPAPa これって在庫あるのかな?
Sipeed Maixduino
https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5JE6
【数量1個〜】単価 \4000
秋葉原が近いなら千石やマルツの2Fやラジオデパート3Fのshigezoneあたりに行ってみるとか?
千石とshigezone19時、マルツは20時に閉まっちゃうけど M5StackはK210ではなく、ESP32というマイコンを使用してます
なのでこっちで扱ってるようです
格安wifiモジュール「esp8266」「esp32」 4個目
http://rio2016.5ch.net/test/read.cgi/denki/1574506387/l50 m5stack stickvはK210だからいいんじゃね Maixduinoなら東京ラジオデパート3FのShigezoneで3300円で売ってたよ
Maix Goは売り切れってなってた sipeedは製造は深センでやってるのかな?
だと品薄になりそう。
とりあえずMaix bitとMaixduinoは1台ずつ入手済みだから暫くは問題無いけど。 スイッチサイエンスでSipeed RISC-Vデバッガ売ってたんだね
安かったので買ってしまった
やっぱりJTAGピンが外に出てないMaixduinoでは使えない模様
ESP32で使う方法を見つけたからいいけど
使ってるチップはFT2232Dで秋月のFT2232Dモジュールより安いね ESP32をいじってたらミスしてMaixduinoに載ってるESP32に書き込んでしまった
Maixduino用のESP32のfirmware公開されてたんだね
自分でビルドしてesptool.pyで書き込んで復活しました
firmwareはここ
https://github.com/sipeed/Maixduino_esp32_fimware MaixduinoのArduinoのI2CのライブラリのWire.endTransmission()だけど
Wire.endTransmission(false);
とsendStopにfalseを指定してもきちんと働いてないようです
温度センサーモジュールのADT7410で、0x00以外のレジスタの値を読み出せない
ESP32とArduino Pro miniの互換機で試したところ正常に読み出せました
ライブラリのWire.cppを見てみたところ
TwoWire::endTransmission(bool sendStop)から
TwoWire::writeTransmission()とTwoWire::readTransmission()を呼び出してるようですが
この2つの関数でsendStopが無視されてる模様 自己レスです
kendryte-standalone-sdkのi2c_recv_dataを直接呼び出すことで解決しました
インクルードファイルは
#include <kendryte-standalone-sdk/lib/drivers/include/i2c.h>
int i2c_recv_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf,
size_t receive_buf_len)
i2c_numがI2CのBus番号
WireがI2C_DEVICE_0、Wire1がI2C_DEVICE_1、Wire2がI2C_DEVICE_2で
i2c_device_number_tでキャストしてあげないとエラーが出る
send_bufにi2cデバイスの読み取りたいレジスタのアドレスを格納
send_buf_lenがsend_bufのデータの大きさ
receive_bufで読み込むバッファを指定
receive_buf_lenでreceive_bufの大きさを指定
ATD7410のステータスレジスタを読み込む例はこんな感じ
uint8_t status_reg;
uint8_t reg_addr = 0x02;
i2c_recv_data((i2c_device_number_t)I2C_DEVICE_0, ®_addr, 1, &status_reg, 1); Arduinoからi2c_recv_data()を使うときは特に初期は必要ないようです
(おそらく、Wireのライブラリの方で初期化してる)
レジスタの内容を読み込みたい時だけ直接i2c_recv_data()を呼び出せばいいようです 上の例ではプログラムの先の方で
同じI2Cデバイス宛てにWire.endTransmission()を呼んでたので
初期化しなくてもよかったようです
I2Cデバイスへの初めての読み込みでi2c_recv_dataを使う場合や
アドレスの違うI2Cデバイスへの読み込みでi2c_recv_dataを使う場合は
初期化をしてI2Cデバイスのアドレスを設定する必要があるようです
初期化は下記関数を使います
i2c_init(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width,
uint32_t i2c_clk);
ここで
i2c_numがI2CのBus番号
WireがI2C_DEVICE_0、Wire1がI2C_DEVICE_1、Wire2がI2C_DEVICE_2で
i2c_device_number_tでキャストしてあげないとエラーが出る
slave_addressがI2Cデバイスのアドレス
address_widthがI2Cデバイスのアドレス幅で7bitもしくは10bitどちらかを指定するようです
i2c_clkがI2Cのクロック周波数です
ADT7410のI2Cアドレスが0x48だとすると初期化設定例は
i2c_init((i2c_device_number_t)I2C_DEVICE_0, 0x48, 7, Wire.getClock()); 中国の新型コロナ検出AIってK210かな?
学習はクラウド使ってそうだけど。 M5StickVとUNIT V
Groveポートが2つあればよかったのに
K210はFPIOAでピンの機能を自由に変更できるのがいいね MaixPyはSSLを使えないことを除けばかなり高機能なMicroPython実装だね
大容量のRAMを活かした仮想フレームバッファで画像を楽に扱えるのがかなりいい MicroPythonでグラフィックス扱うならMaixシリーズが一番いいみたい
本家MicroPythonやCircuitPythonのLCDライブラリはPythonで描画するので遅い
MicroPython lobo版はMicroPython自体がLCDに対応してるので対応するLCDを使うと速いが
MicroPython lobo版は直接LCDに描画するので仮想フレームバッファでイメージを扱えないし
ESP32と比べてMaixシリーズはMicroPythonでは6倍くらい速い M5StickV手にいれたがセンサーのリセットでエラーが出る…ファーム書き換えたけど駄目だな
MaixPyでLCD、LEDを制御することはできたから単にカメラの不良かな。
最初にレンズが転がってたのが関係あんのかなあ この手の製品は初期不良交換のみなので
初期不良ならすぐに購入したお店に連絡取った方がいいよ >>38の部分で抜けてたのがあったので追記します
Humblesoft_GFX.cppの
元ファイルの41行目を変更
textsize_x, textsize_y);
の部分を下のように変更
textsize);
元ファイルの68行目を変更
textsize_x, textsize_y);
の部分を下のように変更
textsize); 追記
41行目、68行目というのは>>38の最後の部分を追記する前の行番号です
追記後の行番号は55行目、82行目になります あとは、MaixduinoのライブラリのSipeed_ST7789.hとSipeed_ST7789.cppを
platformioのプロジェクトのsrcフォルダにコピーして名前を変更
>>38の
>LCDドライバのSipeed_ST7789.hとSipeed_ST7789.cppを名前を変えてコピーして
>Adafruit_GFXからの継承ではなく、Humblesoft_GFXからの継承に改変
この部分は具体的に書くと下記のようになります
Sipeed_ST7789.hをHumblesoft_Sipeed_ST7789.hへ
Sipeed_ST7789.cppをHumblesoft_Sipeed_ST7789.cppへ
Humblesoft_Sipeed_ST7789.hの下記部分を変更
6行目の
#include <Adafruit_GFX.h>
この部分を下記のように変更
#include <Humblesoft_GFX.h>
48行目の
class Sipeed_ST7789 : public Adafruit_GFX{
この部分を下記のように変更
class Sipeed_ST7789 : public Humblesoft_GFX{ Humblesoft_Sipeed_ST7789.cppの下記部分を変更
この部分を
#include "Sipeed_ST7789.h"
#include "lcd.h"
#include "sysctl.h"
#include "utils.h"
下記のように変更
#include "Humblesoft_Sipeed_ST7789.h"
#include <lcd.h>
#include <sysctl.h>
#include <utils.h>
8行目の
:Adafruit_GFX(w,h),
の部分を下記のように変更
:Humblesoft_GFX(w,h), 使用するファイルは下記のようになります
全部、PlatformIOのプロジェクトのsrcに置きます
Bitmap.cpp
Bitmap.h
Humblesoft_GFX.h
Humblesoft_GFX.cpp
Fontx.h
Fontx.cpp
result.h
uni2sjis.h
uni2sjis.c
uni2sjis_tbl.c
Utf8Decoder.h
Utf8Decoder.cpp
Humblesoft_Sipeed_ST7789.h
Humblesoft_Sipeed_ST7789.cpp
main.cpp ピンが6本出てるからM5StickVより拡張性はあるっぽいね
I2CとSPI
SPIとUART
I2CとUART
なんて組み合わせが出来るんじゃない? Groveポートもあるのか
I2C、UART、SPIの組み合わせも出来るね
SPI-MODポートのIO6、IO7、IO8はESP8266と接続すること考えてそう
(IO6がRX、IO7がTX、IO8がESP8266のEN接続用)
Arduinoも使えればかなりいいね $24.9だから日本だと4000円くらいになっちゃうかもね
Shigezoneで扱いがあれば安く買えるかも
まだプレオーダーの段階なのでまだ先になるだろうけどね TTGO T-Watch K210 / K210 AIOT Watches Perform Face Detection with Kendryte K210 RISC-V Processor, ESP32 WiSoC
https://www.cnx-software.com/2020/06/03/ttgo-t-watch-k210-k210-aiot-watches-perform-face-detection-with-kendryte-k210-risc-v-processor-esp32-wisoc/
https://www.cnx-software.com/wp-content/uploads/2020/06/T-Watch-K210-AIOT-Pinout.jpg
AI Processor Kendryte K210 RISC-V Dualcore 64bit with FPU with 8MB SRAM
Storage 16MB QSPI flash, MicroSD card socket
Display I/F FPC connect for external display (not included)
Camera 2MP OV2640 sensor
Audio MAX98357A Audio codec; CVSD & SBC audio encoding
Connectivity 2.4 GHz 802.11b/g/n WiFi 4 up to 150 Mbps, Bluetooth 4.2 BR/EDR and BLE
Debugging USB-C port via CP2104
Expansion
UART, SPI, I2C, PWM, I2S
I2C grove connector
I/O Voltage 3.3V / 1.8V operation
Misc Power and boot buttons; RTC
Power Supply -5V DC/1A DC input; AXP202 PMIC
Dimensions & Weight TBD MaixduinoでオンボードのESP32をArduinoから使えたので報告します
ライブラリはこれです
https://github.com/arduino-libraries/WiFiNINA
上記ライブラリと、Maixduinoのframework-maixduinoを一部改変します
framework-maixduinoの方は
PlatformIOの方は
C:\Users\ユーザ名\.platformio\packages\framework-maixduino\variants\sipeed_maixduino
Arduino IDEの方は
C:\Users\ユーザ名\AppData\Local\Arduino15\packages\Maixduino\hardware\k210\0.3.11\variants\sipeed_maixduino
ここのpins_arduino.hを一部改変します
74行目の
#define MD_PIN_MAP(fpio) (((fpio) < 17) ? _maixduino_pin_map[(fpio)] : (fpio))
static const uint8_t _maixduino_pin_map[17] = {4, 5, 21, 22, 23, 24, 32, 15, 14, 13, 12, 11, 10, 3, 31, 30, 16};
の部分を
#define MD_PIN_MAP(fpio) (((fpio) < 22) ? _maixduino_pin_map[(fpio)] : (fpio))
static const uint8_t _maixduino_pin_map[22] = {4, 5, 21, 22, 23, 24, 32, 15, 14, 13, 12, 11, 10, 3, 31, 30, 16, 8, 9, 25, 6, 7};
に改変