SONY sPresenseっておもしろそうか?

GPSモジュールのことを調べていて、SONYのマイコンボードがおもしろそうではないか?という気がしてきた。値段は5千円程度。単体では通信機能を持たないが、拡張基板を接続するといろいろと通信機能が追加できるようだ。

sPresense
という製品。今年の夏に発売された物のようだ。Arduino環境で開発できる。

5千円位なのだが、CPUは6コアなんだとさ。プログラムサイズが700KBていどで、ESP32とかと比べるとかなり小さいのだが、それがどの程度問題になるかは作ってみないとわからないよな、というのが経験の無い私の感覚だ。

ところがこれ、私がいつも使っている開発環境である
PlatformIO
には対応していないが、
対応させる方法
を書いてくれている人がいたのでそのうちやってみたい。

それにしても、マイコンがたくさん集まってきたな。なにかしら作品作らないとな。

M5Stack(esp32)で音声合成してみる

最近ESP32のネタばかりだな。それにしても、こんな高機能なマイコンが20年前の暇な時期にあったなら、おいらの人生もうちょっと変わったかもしれないなとか、無駄な妄想をしている。まっ、今このマイコンで遊んでいるんだから、それで良いことにしよう。

ものすごく音質が良いわけではないけれど、小さなシステムで音声合成ができるというのがおもしろい。そう言えば、それこそ20年以上前にリコーが作っていたのだと思うVC2とかいうMS-DOS用の音声合成システムがあった。テキストファイルを指定すると男性の声でしゃべっていた。MS-DOSの時代だからそんなに潤沢にメモリーがあったわけではない。CPU速度だって今の1/100位かもしれない。

さて、前書きが長くなったので、そろそろ本題に入ろう。

AquesTalk

超軽量の音声合成ライブラリである。
AquesTalk
をM5Stackで使ってみよう。作業は以下のようなステップになる。

  1. 上記サイトからライブラリをダウンロード
  2. 各開発環境に合わせてファイルを配置
  3. ビルドとマイコンへの書き込み
  4. 動かして遊んでみる。

ダウンロード

上記ファイルをダウンロードする。このファイルはライセンスキーを指定しないと評価版となる。

ファイルの配置

platformioでの開発

$ platformio init -b m5stack-core-esp32

これでプロジェクトのビルド準備ができた。lib, includeというディレクトリができていることだろう。それぞれに先ほど取ってきた.zipファイルに含まれているヘッダとスタティックライブラリを置く。

続いて、platformio.iniを編集する。

m5stack-core-esp32セクションに以下を追加する。

build_flags =
  -laquestalk
  -Llib/

これで準備は整った。適当にプログラミングしてビルドしてみよう。

サンプルコード

ありがたいことにアクエストのサイトにサンプルプログラムがある。一発でビルドが通るので試して見るには良い。

ところが、このスケッチだと音声が倍速再生になってしまう。原因をちゃんと追っていないのだが、モノラル→ステレオ変換の問題か、サンプリングレートの問題かどっちかだろうな。

これを踏まえて、

.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,

とかにしてやるとちゃんと再生できる。

最後に

駅の自動券売機で、テンキーを入力しても鳴り出した音声が止まらずにいらいらすることってないだろうか?「設計者は誰だ!」と思わず叫びたくなるわけだ。

実際にプログラミングしてみるとわかるが、音声を出しながらテンキーから入力されているかを監視して処理をしたり、割り込みという手法を使って音声を停止させたりと、設計段階からちゃんと考慮していないと忘れられることなんだなって思う。自分も「とりあえずいっかな?」とか思ってキー入力による音声の中断は実装しなかったりする。

まあ、ちゃんとしたインフラに入っている物なんだからそのくらいは作っといてほしいなとも思うのだが。

ESP32-DevKitC買ってみた

さてさて、マイコンをいろいろと物色しているわけだが、私のように本来ソフトウェア屋さんの場合、それなりにリソースが豊富なコンピュータの方が扱いやすいという事情がある。先日書いたPro Microみたいなものは、ちょっと複雑な処理をさせようとすると、軟弱な私としては途端にめんどくさくなってしまう。それこそスレッドとか使いたいし、C++11にある便利機能も使いたい。ということで、もう少し規模の大きなマイコンを買ってみた。

買ったものは

これは既にピンヘッダが実装してあるので大変気楽である。買ってきて適当にブレッドボードに置いて、適当にいろいろ接続して使える。

例によってピン配置

USBコネクタを左、チップ面を上に下状態で書く。ピンは向こう側と手前側にそれぞれ19ある。

5V CMD SD3 SD2 IO13 GND IO12 IO14 IO27 IO26 IO25 IO33 IO32 IO35 IO34 SVN SVP EN 3V3
CLK SD0 SD1 IO15 IO2 IO0 IO4 IO16 IO17 IO5 IO18 IO19 GND IO21 RXD0 TXD0 IO22 IO23 GND

PlatformIOでのボード指定

ドンピシャのものはないように思われる。私はesp32devを設定しているが、これで問題なく書き込みできる。

超音波測距センサーSRF02を使ってみる

世の中、いろんな超音波測距センサーはあるものでして。簡単に使えそうなものをってことで、SRF02なんてどうでしょう。

例によってピン配置

基板にある固定用のネジがある方から記す。右からになる。

  • GND
  • MODE
  • SCL
  • SDA
  • 5V

結線

今回は、
Sparkfun Pro Micro 16MHz版
を使った。USBで給電している場合にはVCCピンに5Vが出てくるので、これをSRF02の5Vと接続すれば動く。

c

Pro Micro SRF02
VCC 5V
2 SDA
3 SCL
Mode
GND GND

MODEピンにはなにも接続しない、これでI2C通信ができるはず。

今回私は9番ピンに圧電ブザーを接続してみた。

適当にスケッチを書く

いろんな参考サイトがあるからそちらを見てね。

感想

思いのほか使うのは楽である。このセンサー、検出できる指向性はそれなりに鋭い。複数組み合わせて使用するような使い方も紹介されているので、どの辺りに物があるのかを感知するような作り方ができるかもしれない。

Arduino Leonardoでブザーを鳴らす

前書き

Arduinoの入門スクリプトとしてLEDを点滅させるスケッチはよく見かける。C言語で言うところの”Hello World”みたいなものだろうか。

さて、LEDの代わりに、ブザーを鳴らすことを考えてみよう。

ブザーには2種類ある

ブザーには、ただ電流を流してやれば一定の音がするいわゆるブザーと、スピーカーのように振る舞う圧電ブザーという2種類がある。前者であればLEDの点滅スケッチがそのまま使えるだろう。LEDの代わりにブザーを接続すれば音が出るはずだ。

では、後者の場合は?残念ながら音は出ない。点滅の瞬間にちっちゃなノイズが出るかもしれないが、これでは実用にはならない。

サンプルコード

#define SW 9
#define BZ 8
#define TONE_FREQ 700

void setup()
{
    pinMode(SW, INPUT_PULLUP);
    pinMode(BZ, OUTPUT);
}

void loop()
{
    if (digitalRead(SW) == LOW) {
        tone(BZ, TONE_FREQ);
        while (digitalRead(SW) == LOW); // 離されるのを待つ
        delay(10); // チャタリング除去
    }
    else if (digitalRead(SW) == HIGH) {
        noTone(BZ);
        while (digitalRead(SW) == HIGH); // 押されるのを待つ
    }
    return;
}

動作

スイッチを押している間だけ音が鳴る。ピンはどれでも良いのだけれど、私がこの実験に使ったマイコンのピン配置から考えてちょっと楽だっただけだ。

後書き

小学生の頃、電子工作が好きだった担任の先生が、モールス符号を練習するというキットを作って見せてくれた。完全なアナログ発振回路。ここでやっていることは、その練習機と同等のことだ。スイッチの代わりにキー(電鍵)を接続すれば、モールス練習機になる。

時代は移り変わったとは言え、全く違う考え方や手法を使って同じことを実現しているんだな、と感慨にふけってみた瞬間であった。

HiLetgo Atmega32u4 pro micro

なにものか?

Sparkfun Arduino Pro Microの互換品である。本物を持っていないので、ピン配置とかが完全に同じなのかは知らない。とりあえずピン配置などのメモ。

接続

買ってきた状態でUSB端子に接続すると、Arduino Leonardoとして認識される。それはそれで良いのだろうな。

ピン配置

USB端子を左側にして、チップがある面を表にして置く。ピンは上下2段。左から記す。

RAW GND RST VCC A3 A2 A1 A0 D15 D14 D16 D10
TXO AXI GND GND D2 D3 D1 D5 D6 D7 D8 D9