Arduinoで音声合成2014年11月17日

音声合成LSI - AquesTalk pico LSI

AquesTalk pico LSIはATmega328を使用した音声合成エンジンLSIです。外部との接続インターフェースが柔軟で、UART(シリアル)、I2C、SPI接続に対応しています。Arduino Leonardo互換ボードで使用するとするとUARTまたはSPIになります。Felicaリーダーに残高を発声させようとすると残っているインターフェースはSPI接続になります。

  • コントローラ
    ATmega32U2 Arduino Leonardoクローン
     Caterina-Minimus.hex
  • AquesTalk pico LSI
    AquesTalk pico LSIは秋月で購入しました。28pin DIPパッケージのかわいい系の女声(ATP3011F4-PU)を選択しました。Arduino標準のSPIライブラリーを使用します。サンプルプログラムはここを参考にしました。

コントローラ基盤 Vol.32014年11月09日

Arduinoで7セグLEDコントローラを作成

7segduinoなるページを見つけました。これなら部品があるじゃないですか。というわけで早速作成しました。クリスタルは使用せずに8MHz内蔵CR発信で部品数を減らしています。実はこの7segduinoクローンの作成がここのところいろいろやっている光りものコントローラシリーズを始めるきっかけになりました。

外部との接続インターフェースはシリアル(左側)とI2C(右側)を引き出してあります。ファームウエアにはHT16K33に似たプロトコルを採用しました。16バイトまでのデータを受け取り、表示コマンドで表示します。4バイト以上の場合は右からスクロールします。

7segduinoのデモスケッチにI2C スレーブ機能を追加しました。I2Cマスターからの書き込み要求(R/W=0)を受け取り、7セグ表示データ(数値や文字ではありません。)をバッファーに格納します。Loop関数内ではバッファーを7セグLEDに表示させています。改良の余地だらけないい加減なプログラムです。特にスクロール表示中にデータが書き換わってもそのまま表示しています。

7segduino I2C Slave Firmware
// ---------------------------
// 7segduino I2C Slave Firmware
// ---------------------------
#include <Sseg.h>
#include <Wire.h>

Sseg mySseg = Sseg(4, 8, 11, 13, 14, 2, 10, 12, 3, 6, 7, 9);

// Initial data
uint8_t strbuf[] = {
       0b00000000,
       0b00000000,
       0b00000000,
       0b00000000,
       // Buffer MAX 16 character
       0b01101110, // H
       0b10011110, // E
       0b00011100, // L
       0b00011100, // L
       0b00111010, // o
       0b00000000, //
       NUM_PAT_7,  // 7
       0b10110110, // S
       NUM_PAT_E,  // E
       0b11110110, // G
       0b00000001, // .
       0b11111111,
       0b11111111,
       0b11111111,
       0b11111111,
       0b11111111
};

int buflen = 15;  // Initial buffer length.
int cntstr = 4;    // Initial buffer position.

int p = 0;        // Display position.

// I2C data Protocol
//  1   2   3   4   5   6   7   8   9  10  11  12  13
// "H" "e" "l" "l" "o" "W" "o" "r" "l" "d" "!" "!" 0xFF
// MAX 16 characters
void hreceive(int numBytes) {
  for(int i = 0; i < numBytes; i++){
    strbuf[cntstr] = Wire.read();
    if(cntstr == 4) buflen = 4;
    if(strbuf[cntstr] != 0xFF) ++buflen;
    if(cntstr > 18 || strbuf[cntstr] == 0xFF) {
      cntstr = 4;    // Return to home position.
    } else {
      ++cntstr;
    }
  }
}

void setup() {
  mySseg.begin();
  mySseg.setBrightness(20);

  Wire.begin(8);
  Wire.onReceive(hreceive);
}

#define OVERWRAP(a, x) (((x) < buflen) ? (a[(x)]) : a[((x) - buflen)])

void loop() {
  if ((++p) > buflen) {
    if(buflen > 8) {
      p = 0;                 // scroll
    }
  }

  if(buflen > 8) {
    mySseg.writeRawData(
     OVERWRAP(strbuf, p),
     OVERWRAP(strbuf, p+1),
     OVERWRAP(strbuf, p+2),
     OVERWRAP(strbuf, p+3));
    mySseg.updateWithDelay(300);
  } else {
    p = 4 - (8 - buflen);  // Not scroll
    mySseg.writeRawData(
     strbuf[ p],
     strbuf[p+1],
     strbuf[p+2],
     strbuf[p+3]);
    mySseg.updateWithDelay(50);
  }
}

使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。

コントローラ基盤 Vol.2-12014年11月01日

HT16K33と8x8matrix LED 2個

aitendoで見つけたI2C接続のLEDコントローラドライバ[HT16K33-28W] を使って8x8matrix LED 2個の表示モジュールを作製しました。

  • コントローラ
    aitendo I2C接続LEDコントローラドライバ[HT16K33-28W] と専用基板
  • 8x8 matrix LED
    TOM-15888H-B ちょと前のBタイプマトリックスLEDです。

コントローラ基盤 Vol.22014年11月01日

ちょっと、光もので遊んでいます。

aitendoで見つけたI2C接続のLEDコントローラドライバ[HT16K33-28W] を使ったモジュールを作成するためのICと基板の2点セットです。
アノード側(ROW0~ROW15)16ビット、カソード側(COM0~COM7)8ビットのLEDコントローラーです。8x8matrixLEDなら2個までコントロールできます。7セグLEDや14セグLEDもコントロール可能(カソードコモン)です。使用しているコントローラーICはHOLTEK社のHT16K33というICです。このコントローラは16x8ビットRAMデータストレージを持っていますのでI2Cへはアドレスデータ(通常00H)、16ビット表示データ(通常8行分)、表示コマンドの順にデータを送信することで表示を行います。adafruitからはHT16K33を使用した8x8 matrix LEDや7セグLED、Dual Alphanumeric Displayを表示させる基板がいくつか発売されています。国内ではスイッチサイエンスで取り扱いがあります。コントローラー基板は秋月でも扱っいます。


MPUとはI2C接続です。ArduinoやRaspberry PiとI2Cバス接続して使用することができます。Arduinoライブラリーも公開されています。
  Adafruit-LED-Backpack-Library
  Adafruit-GFX-Library

コントローラ基盤 Vol.12014年10月29日

ちょっと、光もので遊んでいます。

e-bayで1個 $1.03で見つけた16桁2行、20桁4行表示のキャラクターLCDをI2C接続するためのコントローラーモジュールで遊んでみました。使用しているコントローラーICは汎用IO拡張ICのPCF8574、またはPCF8574Aです。このコントローラはI2Cバスから受け取ったデータをそのままP0~P7データピンに出力します。I2CバスにLCDのコマンドやデータを順次送ることで表示させます。今回購入したものはさすが中国製、5個注文して内2個はPCF8574で残りはPCF8574Aを使用したものが届きました。I2Cアドレスの割り振りが異なる以外に違いはないのでOKです。国内ではaitendoで同種のコントローラー基板を販売しています。


ArduinoにキャラクターLCDを接続するとデジタルピンを最低6個消費してしまします。I2C接続ならアナログピンを2個使用するだけで接続できます。ArduinoのLCDライブラリーと同じ機能を提供するI2C接続LCDライブラリーがあります。


aitendoにはPCF8574を使用したGPIOエキスパンダという汎用のGPIO拡張基板もあります。こちらはすべてのピンが引き出されています。PCF8574ライブラリーが利用できます。


【ツール】
I2Cバスに接続されている機器を検索しIDを表示してくれるスキャナーがあると便利です。

  • Raspberry Pi (Linux)ではコマンドが用意されていますから叩くだけです。ツールのインストールは、apt-get install i2c-tools で行います。
    $ sudo i2cdetect 0
    WARNING! This program can confuse your I2C bus, cause data loss and worse!
    I will probe file /dev/i2c-0.
    I will probe address range 0x03-0x77.
    Continue? [Y/n] y
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: 70 -- -- -- -- -- -- --

  • Arduinoでは簡単なスケッチを書き込むことでI2Cバスに接続されている機器のアドレスをシリアルに出力してくれます。Arduino Playgroundを参照してください。

Arduinoクローン2014年10月28日

Arduinoクローン(ATmega32U2)

ATmega32U2でAVRISP MkII互換のAVRライターがうまく動作したので今度はArduino Leonardo、Arduino Microもどきが作れないかと思うのは欲張りでしょうか。
Arduino LeonardoやArduino microはATmega32U4を使用しています。理由はATmega32U2にはアナログポートとI2Cインターフェースがないためでしょう。 デジタルポートのみでもUSBインターフェースを内蔵していることの魅力にはかないません。

参照したサイトです。
  ATMEL ATmega8U2-32U2データシード(日本語版)

  ATmega32U2でArduinoモドキを作る
  ATmega32U2 USB Development Board, Arduino compatible
  ATmega32U2 USB Atmel AVR Arduino compatible development board DIL32 bootloader

  Minimus board with Arduino
    プロジェクトサイトはprojects/minimusです。

今回のテストではMinimus board with ArduinoのCaterina-Minimus.hexをAVRISP MkIIで書き込んで使用しました。スケッチの作成には同じサイトにあるArduino IDE 1.0.2も一緒にダウンロードして使用します。これは普通のArduino IDEはATmega32U2をサポートしていないためです。

【追記】

Arduino Leonardo、micro、Minius boardなどATmega U系のスケッチはATmega系のスケッチと異なり多少修正する必要があります。一例がSerialクラスです。ATmega32U2のUART(8ピンRXD、9ピンTXD)に出力しようと思ったらSerial1を指定する必要があります。詳細はこのページを参照してください。
また、ATmega系にはないKeyboardクラスとMouseクラスががあります。このクラスを使用するとArduinoボードがPCからはキーボード、マウスになります。サンプルプログラムはけっこうおもしろいです。これは使えるかもしれません。

AVRライター2014年10月26日

AVRISP MkII クローン(プロトタイプ)

UNO R3がうまく動作したのであらためて今までのArduinoとの違いを調べてみました。
大して違いはないのですが、USBインターフェースのICが違います。今まではFTDI社のFT232RというUSBシリアル専用のICが使用されていました。 UNO R2からArduino本体のICと同じAtmel社のATmega8U2、UNO R3ではATmega16U2といったUSB内蔵タイプの汎用マイクロプロセッサーを使用しています。 Arduino leonardoやmicroはATmega32U4を使用し、USBインターフェースまで本体のマイクロプロセッサーで賄っています。

ATmega8U2、ATmega16U2はATmega32U4同様にまだどこでも扱っていないようです。ATmega32U2なら秋月電子で取り扱っています。ATmega32U4は44ピン TQFPパッケージでが、ATmega8U2、ATmega16U2、ATmega32U2は32ピンTQFPパッケージです。秋月のTQFP変換基板が使えます。0.8mmピッチならハンダ付けは OKというわけで使い道も考えずに早速購入しました。ネットリサーチの結果、AVRISP MkII互換のAVRライターを作製してる方がいました。私もという ことで作製してみました。

参照したサイトです。
  AVRISP mkII クローン製作   AVRISP mkII clone の製作
  FRISK USBTiny MkII

AVRライターのファームウエアはATMEL社からダウンロードしてきたFlipというツールを使用してAVRISP-MKII-avrdude.hexを書き込みます。このAVRISP MkII クローンを使用してArduino IDEからbootloaderの書き込みができることを確認しました。
AVR Studio 6.2を使用する場合はAVRISP-MKII-studio.hexを書き込みます。

ArduinoとMIDI vol.12014年10月25日

ArduinoでMIDI【リサーチ】

ArduinoにはMIDIシールドなどMIDIに関連したシールドが販売されています。また、ArduinoクローンメーカーでMIDIに 特化したMIDUINOもあります。ArduinoはMIDIを使用したフィジカルコントローラーを作成するのに大変都合が良く出来ています。 Arduinoを使用した楽器を作ったり、MIDIコントローラ、MIDIシーケンサーやMIDIデータのアナライザーとして作成したり、コネクターや変換器として利用したりとArduinoは結構活躍しています。 最近のMIDI機器はPCでの利用が前提のせいでしょうかUSB MIDIになっています。Arduino UNO R2、R3でもUSBコントローラーに使用されているATmega8U2やATmega16U2はファームウエアを書き換えることで特別な ハードウエアなしでUSB MIDIに変身できます。

MIDIに関するメッセージ仕様はこちらを参照ください。

MIDI KITSではキット販売と一緒にサンプル回路とスケッチが掲載されています。大変参考になります。
その他にSDカードの保存したMIDIファイルを再生するMr. MIDI2プレーヤーがあります。 このプレーヤーはArduinoと同じAVRマイコンを使用しています。このプレーヤーの出力はMIDIですので音源に接続して音を出します。YAMAHAのピアノプレーヤーなどにも出力できます。